본문 바로가기

Kotlin

by lazy vs lateinit 1. by lazy public actual fun lazy(initializer: () -> T): Lazy = SynchronizedLazyImpl(initializer) public actual fun lazy(mode: LazyThreadSafetyMode, initializer: () -> T): Lazy = when (mode) { LazyThreadSafetyMode.SYNCHRONIZED -> SynchronizedLazyImpl(initializer) LazyThreadSafetyMode.PUBLICATION -> SafePublicationLazyImpl(initializer) LazyThreadSafetyMode.NONE -> UnsafeLazyImpl(initializer) } pu.. 더보기
JVM 언어 의 공변 1. 공변이란? 제네릭에서는 3가지 공변 성질을 제공한다. 공변(Variance) : A가 B의 하위 타입일 때, T 가 T의 하위 타입이면 T가 공변의 성질을 가지고 있다고 말한다. 반공변(Contravariance) : A가 B의 하위 타입일 떄, T가 T 의 하위 타입이면 T가 반공변의 성질을 가지고 있다고 말한다. 무공변(Invariance) A가 B의 하위 타입일 때, T와 T간의 아무 관계도 없다면 무공변이라고 말한다. 이러한 공변, 반공변, 무공변으로 메소드의 인자로 들어오는 파라미터의 타입에 제한을 걸수 있다. 공변의 경우 Java에서는 extends, Kotlin에서는 out이라는 키워드를 사용한다.(Producer패턴 : 해당 타입을 생산하는 패턴에 사용) 반공변의 경우 Java에서는 .. 더보기
코틀린 제네릭스 JVM 의 제네릭스는 보통 타입 소거를 사용해 구현한다. -> 타입 소거란 실행 시점(Run Time)에 타입 관련 정보가 소거되는 것을 의미한다. -> 이는 JAVA에서 처음부터 제네릭스를 지원하지 않았기 때문이다. (참고로 제네릭스는 2003년 발표된 JDK 1.5 버전부터 포함된 내용이다.) 하위호환성을 중요시 하는 자바인 만큼 JDK 1.5 전버전과의 호환성때문에 이렇게 만들것으로 추측된다. -> 런타임에 타입관련 정보가 없기 때문에 ClassCastException 등 타입으로 발생하는 비검사 예외가 발생할 여지가 있다. 코틀린에서는 실체화를 통해 타입 인자가 지워지지 않도록 하여 이러한 비검사 예외를 컴파일 시점에 체크할수 있도록 하는 장치가 있다. var intList = ArrayList .. 더보기