코틀린 54

[Kotlin] 리플렉션(Reflection) -1 (KClass, KCallable, KFunction, KProperty)

리플렉션(reflection)을 사용하면 런타임에 컴파일러 내부 구조를 분석할 수 있다. 이전 글과 마찬가지로, 이번 글에서는 JKid 에서 리플렉션 API 를 사용하는 방법을 직렬화, JSON 파싱, 역직렬화 순으로 살펴본다. 이전 글: 애노테이션-1(적용과 사용 지점 대상) , 애노테이션-2(JKid 라이브러리를 통해 알아보기) 리플렉션 소개 간단히 말해 리플렉션은 런타임에(동적으로) 객체의 프로퍼티와 메서드에 접근할 수 있게 해주는 방법이다. 보통 객체의 메서드나 프로퍼티에 접근할 때는 소스 코드 안에 구체적인 선언이 있는 메서드나 프로퍼티 이름을 사용한다. 그리고 컴파일러는 그런 이름이 실제로 가리키는 선언을 컴파일 타임에(정적으로) 찾아내서 해당하는 선언이 실제 존재함을 보장한다. 만약 정적으로..

Kotlin 2024.04.11

[Kotlin] 애노테이션 -2 (JKid 라이브러리를 통해 알아보기)

이전 글([Kotlin] 애노테이션 - 1 (적용과 사용 지점 대상))에서 이어집니다. 애노테이션을 활용한 JSON 직렬화 제어 직렬화(serialization)는 객체를 저장장치에 저장하거나 네트워크를 통해 전송하기 위해 텍스트나 이진 형식으로 변환하는 것이다. 반대로 역직렬화(deserialization)는 텍스트나 이진 형식으로 저장된 데이터로부터 원래의 객체를 만들어낸다. (직렬화/역직렬화 설명이 포함된 글 을 참고) 직렬화에는 JSON 형식이 자주 쓰인다. 자바와 JSON 을 변환할 때 Jackson(잭슨)라이브러리와 GSON(지슨) 라이브러리가 자주 쓰인다. 이들도 코틀린과 완전히 호환된다. JSON 직렬화를 위한 JKid 라는 순수 코틀린 라이브러리를 통해 공부해보자. (https://git..

Kotlin 2024.04.10

[Kotlin] 애노테이션 - 1 (적용과 사용 지점 대상)

오랜만에 Kotlin in Action 책을 다시 부수기로 했다. 우테코 첫 방학이기 때문! 이제 kotlin in action 의 10장 애노테이션과 리플렉션, 11장 DSL 만들기를 보면, Kotlin in Action 의 1, 2부를 모두 보게 된다. 애노테이션을 사용하면 라이브러리가 요구하는 의미를 클래스에게 부여할 수 있다. 코틀린에서 애노테이션을 사용하는 문법은 자바와 똑같지만, 애노테이션을 선언할 때 사용하는 문법은 자바와 약간 다르다. 애노테이션 선언 & 적용 메타데이터를 선언에 추가하면 애노테이션 프로세서가 컴파일 타임/ 런타임에 적절한 처리를 해준다. 메타데이터가 뭔데? 메타데이터(metadata)는 데이터에 대한 데이터라는 의미를 가지며, 특정 정보의 구조, 내용, 관계 등을 설명하는..

Kotlin 2024.04.10

디자인 패턴 - 전략 패턴(Strategy pattern)과 디자인 패턴에 대한 고찰_feat(우테코 - 자동차 경주)

우테코 1단계 level 1 의 자동차 경주 미션 리팩토링을 진행하고, 미션 리뷰어에게 전략 패턴에 대한 이야기를 들었다. 나는 사실 전략 패턴에 대해 잘 알지 못했다. 그런데 전략 패턴을 이미 구현했다는 피드백을 보고 신기함을 느꼈다. 어떻게 제대로 모르는 것을 구현할 수 있지? 이 궁금증을 시작으로 전략 패턴을 더 자세히 공부하기로 했다. 전략 패턴(Strategy Pattern)? '알렉산더 슈베츠' 저자의 '디자인 패턴에 뛰어들기' 라는 책에서는 이렇게 설명하고 있다. (이 글은 위 링크 글을 보고 공부하여 정리한 내용으로 원문을 참조하시는 것을 추천한다.) 전략 패턴은 알고리즘들의 패밀리를 정의하고, 각 패밀리를 별도의 클래스에 넣은 후 그들의 객체들을 상호교환할 수 있도록 하는 행동 디자인 패..

코드의 네이밍과 코딩 컨벤션은 왜 중요한가?

우테코 수업을 듣다가 코드에서 효과적인 네이밍이 왜 중요한가? 라는 질문을 들었다. 효과적인 네이밍은 왜 중요한가? 모두들 흔히 좋은 네이밍으로써 코드의 가독성과 이해도를 향상시키고 유지보수성을 높이는데 도움이 된다고 말한다. 하지만 이것에 대해 다시 왜? 냐고 물으면 쉽게 입이 떼어지지 않았다. 좋은 네이밍이 중요한 이유 Eddy 님의 글에서는 아래처럼 말한다. 프로그래밍은 문제 해결이 전부가 아니다. 프로그래밍은 다른 사람과의 커뮤니케이션이고 협업이다. 내가 만든 코드를 읽는 것은 컴퓨터 뿐만이 아니라 '다른 프로그래머들'이, 그들과 다를 바 없는 '미래의 나' 이다. 그래서 코드는 그 사람들에게 이 프로그램이 어떤 동작을 하는지(어떤 책임을 갖는지)를 명료하게 전달해야 한다. 또 우테코 코치 제이슨..

[Kotlin] 런타임 시 제네릭의 동작: 타입 소거(Type erasure), reified 타입 파라미터

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 런타임의 제네릭: 타입 소거(type erasure) 자바와 마찬가지로 코틀린 제네릭 타입 인자 정보는 런타임에 지워진다. 제네릭 인스턴스가 생성될 때 쓰인 타입 인자에 대한 정보를 유지하지 않는다. 예를 들어 `List` 객체를 만들더라도, 런타임에는 그 객체를 오직 `List` 로만 볼 수 있다. 즉, 그 `List` 객체가 어떤 타입의 원소를 저장하는지 런타임에는 알 수 없다. 이를 타입 소거 (type erasure) 라고 한다. 런타임에 둘은 완전히 같은 타입의 객체이다. 하지만 컴파일러가 타입 인자를 알고 올바른 타입의 값만 각 리스트에 넣도록 보장해주기 때문에 `List` 에..

Kotlin 2024.01.31

[Kotlin] 제네릭 타입 파라미터(Generic Type Parameter)

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 제네릭 타입 파라미터 제네릭스를 사용하면 타입 파라미터(type parameter)를 받는 타입을 정의할 수 있다. 제네릭 타입의 인스턴스를 만드려면 타입 파라미터를 구체적인 타입 인자(type argument)로 치환해야 한다. 예를 들어 코틀린의 `List` 는 `List` 로 되어 있다. 이에 대한 인스턴스를 만들 때는 `List` 의 모습으로 구체적인 타입 인자를 지정하여 사용한다. 타입 파라미터는 여러 개가 될 수도 있다. 예를 들어 코틀린의 `Map` 은 `Map` 이다. 이런 제네릭 클래스는 `Map` 처럼 구체적인 타입 인자를 지정하여 인스턴스화한다. 코틀린 컴파일러는 보통 ..

Kotlin 2024.01.31

[Kotlin] 인라인(inline) 함수

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 인라인 함수를 사용하여 람다를 사용함에 따라 발생할 수 있는 성능상 부가 비용을 없앨 수 있다. 아래는 이전 글(자바 함수형(SAM) 인터페이스 활용)에서 설명한 것들이다. 코틀린은 보통 람다를 익명 클래스로 컴파일하지만, 람다 식을 사용할 때마다 새로운 클래스가 만들어지지는 않는다. 또한 람다가 변수를 캡처(포획)하면 람다가 생성되는 시점마다 새로운 익명 클래스 객체가 생긴다. 이런 경우 런타임에 익명 클래스 생성에 따른 부가 비용이 든다. 따라서 람다를 사용하는 구현은 똑같은 작업을 수행하는 일반 함수를 사용한 구현보다 덜 효율적이다. 하지만 `inline` 변경자를 어떤 함수에 붙이면..

Kotlin 2024.01.26

[Kotlin] 고차함수

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 고차함수(high order function): 람다를 인자로 받거나 리턴하는 함수 고차함수로 코드를 더 간단히 하고, 중복을 없애고 더 나은 추상화 구축 가능 함수형 프로그래밍 먼저 함수형 프로그래밍의 정의를 찾아보자. 함수형 프로그래밍(functional programming): 자료 처리를 수학적 함수의 계산으로 취급하고, 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임 중 하나이다. - 위키백과 부수 효과가 없는 순수 함수를 1급 객체(시민)로 간주하여 패러미터로 넘기거나 리턴값으로 사용할 수 있다. 또 참조 투명성을 지킬 수 있다. 1급 객체는 아래 특징을 가진다. 일급 객체는 ..

Kotlin 2024.01.26

[Kotlin] 프로퍼티 접근자 로직 재활용: 위임 프로퍼티

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 위임 프로퍼티(delegated property)는 코틀린이 제공하는 convention(관례)에 의존하는 독특하면서 강력한 기능이다. 이를 사용하면 값을 backing property 에 단순히 저장하는 것보다 더 복잡한 방식으로 작동하는 프로퍼티를 쉽게 구현할 수 있다. 또 그 과정에서 접근자(getter/setter)로직을 매번 재구현할 필요도 없다. 예를 들어 자신의 값을 필드가 아닌, DB TABLE 이나 브라우저 세션, 맵 등에 저장할 수 있다. 위임은 객체가 직접 작업을 수행하지 않고 다른 도우미 객체가 그 작업을 처리하게 맡기는 디자인 패턴이다. 이 때 도우미 객체를 위임 객..

Kotlin 2024.01.25