전체 글250 [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. [Kotlin in Action] 9.2 실행 시 제네릭스의 동작: 소거된 타입 파라미터와 실체화된 타입 파라미터 JVM의 제네릭스는 보통 타입 소거(type erasure)를 사용해 구현된다. 이는 실행 시점에 제네릭 클래스의 인스턴스에 타입 인자 정보가 들어있지 않다는 뜻이다. 이번 절에서는 코틀린 타입 소거가 실용적인 면에서 어떤 영향을 끼치는지 살펴보고 함수를 inline으로 선언함으로써 이런 제약을 어떻게 우회할 수 있는지 살펴본다. 함수를 inline으로 만들면 타입 인자가 지워지지 않게 할 수 있다(코틀린에서는 이를 실체화reify라고 부른다). 실체화한 타입 파라미터에 대해 자세히 다루고 실체화한 타입 파라미터가 유용한 이유를 예제를 통해 알아보자. 9.2.1 실행 시점의 제네릭: 타입 검사와 캐스트자바와 마찬가지로 코틀린 제네릭 타입 인자 정보는 런타임에 지워진다. 이는 제네릭 클래스 인스턴스가 그 .. 2025. 4. 2. [Kotlin in Action] 9.1 제네릭 타입 파라미터 9.1 제네릭 타입 파라미터제네릭스를 사용하면 타입 파라미터(type parameter)를 받는 타입을 정의할 수 있다. 제네릭 타입의 인스턴스를 만들려면 타입 파라미터를 구체적인 타입 인자(type argument)로 치환해야 한다. 예를 들어 List라는 타입이 있다면 그 안에 들어가는 원소의 타입을 안다면 쓸모가 있을 것이다. 타입 파라미터를 사용하면 "이 변수는 리스트다"라고 말하는 대신 정확하게 "이 변수는 문자열을 담는 리스트다"라고 말할 수 있다. 코틀린에서 '문자열을 담는 리스트'를 표현하는 구문은 자바와 마찬가지로 List이다. 클래스에 타입 파라미터가 여럿 있을 수도 있다. 예를 들어 Map 클래스는 키 타입과 값 타입을 타입 파라미터로 받으므로 Map가 된다. 이런 제네릭 클래스에 M.. 2025. 4. 2. 이전 1 2 3 4 ··· 50 다음 반응형