(Kotlin) 제네릭 - 변성(variance), 타입 프로젝션(type projection)
변성 (variance) List는 클래스(기저 클래스)이고, List<Int>는 타입이다. 타입 A의 값이 필요한 모든 장소에 타입 B의 값을 넣어도 아무 문제가 없다면 B는 A의 하위 타입(subtype)이다. 하위 클래스와 하위 타입은 미묘한 차이가 있다. A?와 A는 같은 클래스에 속하지만, A는 A?의 하위 타입이고 그 역은 성립...
변성 (variance) List는 클래스(기저 클래스)이고, List<Int>는 타입이다. 타입 A의 값이 필요한 모든 장소에 타입 B의 값을 넣어도 아무 문제가 없다면 B는 A의 하위 타입(subtype)이다. 하위 클래스와 하위 타입은 미묘한 차이가 있다. A?와 A는 같은 클래스에 속하지만, A는 A?의 하위 타입이고 그 역은 성립...
타입 파라미터 소거 [Kotlin] as와 타입 캐스팅. 런타임 에러. 타입 파라미터 소거(erasure) 런타임 타입 검사 : inline + reified (실체화한 타입 파라미터) inline fun <reified T> isA(value: Any) = value is T >>> isA<String>("...
filterNotNull() : 널이 아닌 값만 추리고 싶은 경우 >>> val l = listOf(1, 2, null, 4, 5) >>> println(l.filterNotNull()) [1, 2, 4, 5] Note ) 걸러내고 난 결과 컬렉션의 타입은 null이 제거되었으므로 List<Int> 타입...
코틀린에서는 원시 타입과 참조 타입(래퍼 타입, 포인터 변수)을 별도 타입으로 따로 구분하지 않는다. 예를 들어 java의 int와 Integer 같이 구분하지 않고, Int 하나로 쓴다. 널이 될 수 없는 타입 은 컴파일 시 알아서 원시 타입으로 표현할 수 있는건 원시 타입으로 표현해주고, 메소드를 호출하는 등 래퍼 타입이어야 하는 경우 ...
최근 null에 대한 접근 방법은 런타임에 발생하는 NPE를, 컴파일 타임으로 옮기는 것이다. 널이 될 수 있음과 없음에 대한 모든 검사는 컴파일 타임에 수행되기 때문에, 실행 시점에는 널이 될 수 있는 타입과 널이 될 수 없는 타입의 객체가 같아진다. 단, @NotNull 애너테이션이나 Intrinsics.ch...
수신 객체 지정 람다 with : prefix없이 접근하고 싶을 때 with는 원래 파라미터가 2개인 함수다. 그러나 두 번째 인자인 람다를 밖으로 빼서 원래 언어가 지원하는 구문인 것 처럼 사용할 수 있다. 보기 깔끔해진다. with의 람다 내에서는 전달된 객체에 prefix없이 접근할 수 있다. fun alphabet(): String { ...
주로 리스너 계열이 SAM으로 되어 있기 때문에, 리스너에 많이 사용한다. 자바 8 이전에는 무명 객체를 사용했다. button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { . . . } }); 코틀린(또는 자바8)에서는 SAM에 람다를 사용할...
기본 filter, map 등은 인라인 함수로 정의되어 있어 알아서 인라이닝되므로 성능 신경쓰지말고 그냥 사용하면 된다. 연쇄해서 사용하는 경우 연산의 순서가 성능에 영향을 줄 수 있기 때문에 고려해야 한다. 보통 filter()를 먼저 적용해 추리는게 도움이 되고, 메서드 체이닝 시 앞쪽에서 부터 적용되기 때문에 filter()를 먼저 ...
lambda { x: Int, y: Int -> x + y } 코틀린 람다는 자바 람다와 달리 항상 중괄호 사이에 위치한다. 반면 메서드 참조는 중괄호 없이 써야 한다. 코틀린 람다 호출은 실행 시점에 아무런 부가 비용이 들지 않으며 기본 구성 요소와 비슷한 성능을 내기 때문에 적절하게 사용하는 것이 권장된다. 코틀린은 파이썬...
클래스를 정의하면서 동시에 인스턴스를 생성한다. 코틀린에는 static이 없고, 대신 이를 최상위 함수로 처리한다. 그러나 최상위 함수는 말 그대로 최상위에 존재하는 함수이기 때문에 어떤 클래스의 private에는 당연히 접근할 수 없어 클래스 내부에 선언된 static이 클래스의 다른 멤버와 상호 작용하는 경우를 커버할 수 없다. 이렇게, stat...