코틀린53 [Kotlin] reified 키워드 reified 키워드는 코틀린에서 인라인 함수의 타입 파라미터에 붙여서, 해당 타입 정보를 런타임에도 유지하도록 하는 키워드다. 기본적으로 코틀린의 제네릭은 타입 소거(type erasure) 때문에 런타임에 구체적인 타입 정보를 알 수 없지만, reified를 사용하면 인라인 함수 내부에서 타입 파라미터를 실제 타입처럼 사용할 수 있게 된다. 예를 들어, 일반 함수에서는 아래와 같이 제네릭 타입 파라미터를 사용할 때, 타입 정보를 알 수 없으므로 is 연산자나 ::class 등을 사용할 수 없다.// 일반적인 제네릭 함수 (타입 소거 때문에 T의 구체적 타입을 알 수 없음)fun isInstance(value: Any): Boolean { // 컴파일 에러: 'T'의 구체적인 타입 정보를 알 수.. 2025. 4. 3. [Kotlin in Action] 10.1 annotation 선언과 적용 10.1.1 annotation 적용자바와 코틀린에서 @Deprecated annotation의 의미는 똑같다. 하지만 코틀린에서는 replaceWith 파라미터를 통해 옛 버전을 대신할 수 있는 패턴을 제시할 수 있고, API 사용자는 그 패턴을 보고 지원이 종료 될 API 기능을 더 쉽게 새 버전으로 포팅할 수 있다. 다음 예제는 @Deprecated annotation에 어떻게 인자를 지정하는지에 대한 코드다.// 사용 금지를 설명하는 메시지와 대체할 패턴을 지정@Deprecated("Use removeAt(index) instead.", ReplaceWith("removet(index)"))fun remove(index: Int) { ... }annotation에 인자를 넘길 때는 일반 함수와 마.. 2025. 4. 3. [Kotlin] 스타 프로젝션(*)과 Any의 차이 스타 프로젝션(List) 예제fun printList(list: MutableList) { // 리스트의 요소를 안전하게 읽을 수 있다. 하지만 쓰기는 불가능하다. (반환 타입은 Any?로 추론) for (item in list) { println(item) }}fun main() { val stringList: MutableList = mutableListOf("A", "B", "C") printList(stringList) val intList: MutableList = mutableListOf(1, 2, 3) printList(intList)}MutableList는 "모든 타입의 리스트"를 받겠다는 의미지만, 구체적인 타입 정보가 없으므로 읽.. 2025. 4. 3. [Kotlin] 코틀린 선언 지점 변성과 자바 와일드카드 비교 변성: 제네릭을 다룰 때 “타입 안전성”을 확보하기 위해 하위 타입 관계를 어떻게 적용할지를 결정하는 개념예를 들어, Integer는 Number의 하위 타입인데, 이를 List와 List 사이에 어떻게 적용할지 결정하는 것입니다.변성 변경자: 코틀린에서 클래스나 인터페이스 선언 시, 타입 파라미터에 out(공변성) 또는 in (반공변성) 키워드로 변성 명시공변성(out):interface Producer { fun produce(): T}반공변성(in):interface Consumer { fun consume(item: T)} 선언 지점 변성을 사용하면 변성 변경자를 단 한 번만 표시하고 클래스를 쓰는 쪽에서는 변성에 대해 신경을 쓸 필요가 없으므로 코드가 더 간결해진다. 자바에서 사용.. 2025. 4. 3. [Kotlin in Action] 9.3 변성: 제네릭과 하위 타입 변성(variance) 개념은 List와 List와 같이 기저 타입이 같고 타입 인자가 다른 여러 타입이 서로 어떤 관계가 있는지 설명하는 개념이다. 일반적으로 이런 관계가 왜 중요한지 먼저 설명한 다음에 코틀린에서 변성을 어떻게 표시하는지 살펴본다. 직접 제네릭 클래스나 함수를 정의하는 경우 변성을 꼭 이해해야한다. 변성을 잘 활용하면 사용에 불편하지 않으면서 타입 안정성을 보장하는 API를 만들 수 있다. 9.3.1 변성이 있는 이유: 인자를 함수에 넘기기List 타입의 파라미터를 받는 함수에 List을 넘기면 안전할까? String 클래스는 Any를 확장하므로 Any 타입 값을 파라미터로 받는 함수에 String 값을 넘겨도 절대로 안전하다. 하지만 Any와 String이 List 인터페이스의 타입.. 2025. 4. 2. 이전 1 2 3 4 ··· 11 다음