Java Stack/Kotlin
[Kotlin] as와 타입 캐스팅. 런타임 에러. 타입 파라미터 소거(erasure)
[Kotlin] as와 타입 캐스팅. 런타임 에러. 타입 파라미터 소거(erasure)
2023.08.13@Test fun typeCastTest() { val stringMap = mapOf( "a" to "0", "b" to "10.01" ) val bigDecimalMap = stringMap as Map println(bigDecimalMap) /* 문제 없이 실행된다. */ bigDecimalMap.forEach { val bigDecimal: BigDecimal = it.value println(bigDecimal) /* 컴파일은 잘 되지만.. */ /* 런타임에 class java.lang.String cannot be cast to class java.math.BigDecimal 에러 발생한다 */ } } 즉, bigDecimal는 BigDecimal 타입이고 it.value는 String 타..
지연 평가 Sequence의 원리
지연 평가 Sequence의 원리
2023.02.10fun main() { val primes: Sequence = sequence { var numbers = generateSequence(2) { it + 1 } //
[Kotlin] Kotlin Coroutines (with Spring WebFlux)
[Kotlin] Kotlin Coroutines (with Spring WebFlux)
2021.08.29Kotlin Coroutines 기본적인 개념과 docs kotlinlang.org/docs/coroutines-guide.html#table-of-contents 참고 ) Kotlin Coroutine은 어떻게 동작하는가 - CPS 관련 설명, 자주 하는 질문까지 포함한 좋은 발표 자료 참고 ) 어떠한 코루틴이 발동될 때 마다 해당 코루틴은 이전에 자신의 실행이 마지막으로 중단되었던 지점 다음의 장소에서 실행을 재개한다. Kotlin의 Coroutine은 suspend 키워드로 마킹된 함수를 CPS(Continuation Passing Style)로 변환하고, 이를 Coroutine Builder를 통해 적절한 스레드 상에서 시나리오에 따라 동작하도록 구성됩니다. 주의해야 할 점은 suspend fun..
[Kotlin] java의 static final 변수에 대응되는 것은?
[Kotlin] java의 static final 변수에 대응되는 것은?
2021.02.11```kt class KakaoAuthHelper { companion object { const val REDIRECT_URI = "http://webpage-observer" val AUTHZ_CODE_URL = "https://kauth.kakao.com/oauth/authorize?client_id=${KakaoConfig.app_rest_api_key}&redirect_uri=${REDIRECT_URI}&response_type=code" } } ``` AUTHZ_CODE_URL은 변수가 들어가야 해서 const를 안붙였지만... Byte Code -> Java Decompile 해보면 ```java public static final String REDIRECT_URI = "http://web..
[Kotlin] Serialization: Gson, Jackson
[Kotlin] Serialization: Gson, Jackson
2020.03.19[Java] Jackson ObjectMapper Serialization Jackson 역직렬화 시 발생할 수 있는 에러 ( jacksonObjectMapper() ) ```javastacktrace InvalidDefinitionException: Cannot construct instance of `com.test.example.data.Coffee` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator) ``` redis에서 받아와서 kotlin data 클래스인 Coffee에 넣으려고 하는데 발생 Jackson이 Deserializ..
[Kotlin] thread
[Kotlin] thread
2017.12.31usage```ktthread { // do something/* runOnUiThread { // update UI }*/}``` definition```kt/** * Creates a thread that runs the specified [block] of code. * * @param start if `true`, the thread is immediately started. * @param isDaemon if `true`, the thread is created as a daemon thread. The Java Virtual Machine exits when * the only threads running are all daemon threads. * @param contextClassLoa..
[Kotlin] 제네릭 : 변성(variance), 타입 프로젝션(type projection)
[Kotlin] 제네릭 : 변성(variance), 타입 프로젝션(type projection)
2017.12.08``kt List``는 클래스(기저 클래스)이고, ``kt List``는 타입이다. 타입 ``kt A``의 값이 필요한 모든 장소에 타입 ``kt B``의 값을 넣어도 아무 문제가 없다면 ``kt B``는 ``kt A``의 하위 타입(subtype)이다. 하위 클래스와 하위 타입은 미묘한 차이가 있다. ``kt A?``와 ``kt A``는 같은 클래스에 속하지만, ``kt A``는 ``kt A?``의 하위 타입이고 그 역은 성립하지 않는다 무공변성, 불변성(invariance) 제네릭 타입을 인스턴스화할 때 서로 다른 타입 인자가 들어가는 경우 인스턴스 타입 사이의 하위 타입 관계가 성립하지 않으면 그 제네릭 타입을 무공변이라 한다. e.g., ``kt MutableList``에서 ``kt T``가 서로..
[Kotlin] 제네릭 : 타입 파라미터 소거(erasure), inline 실체화(reified)
[Kotlin] 제네릭 : 타입 파라미터 소거(erasure), inline 실체화(reified)
2017.12.08타입 파라미터 소거 [Kotlin] as와 타입 캐스팅. 런타임 에러. 타입 파라미터 소거(erasure) 런타임 타입 검사 : inline + reified (실체화한 타입 파라미터) ```kt inline fun isA(value: Any) = value is T >>> isA("a") true ``` 이게 가능한 이유는 인라인 함수는 함수 바디 코드가 함수 호출부에 삽입되기 때문에, 타입 인자가 아니라 구체적인 타입을 사용할 수 있기 때문이다. 자바에서는 ``kt reified``를 사용하는 ``kt inline`` 함수를 호출할 수 없다. 자바에서는 코틀린 인라인 함수를 다른 보통 함수처럼 호출해버려서 타입 정보가 사라지기 때문이다. inline reified 함수 내에서 위 예제처럼 실제 타입간..
[Kotlin] 컬렉션과 배열
[Kotlin] 컬렉션과 배열
2017.12.07filterNotNull() : 널이 아닌 값만 추리고 싶은 경우```kt>>> val l = listOf(1, 2, null, 4, 5)>>> println(l.filterNotNull())[1, 2, 4, 5]```Note ) 걸러내고 난 결과 컬렉션의 타입은 ``kt null``이 제거되었으므로 ``kt List`` 타입이 된다. filterIsInstance() : 특정 타입만 추리고 싶은 경우```kt>>> val li = listOf(1, "b", 3)>>> li.filterIsInstance()[1, 3]``` toTypedArray() : 배열을 넘겨야 하는데 데이터가 컬렉션에 들어있다면 배열로 변환```kt>>> val strings = listOf("a", "b", "c")>>> pri..
[Kotlin] 타입 시스템 (Any, Unit, Nothing)
[Kotlin] 타입 시스템 (Any, Unit, Nothing)
2017.12.06코틀린에서는 원시 타입과 참조 타입(래퍼 타입, 포인터 변수)을 별도 타입으로 따로 구분하지 않는다. 예를 들어 java의 int와 Integer 같이 구분하지 않고, Int 하나로 쓴다. 널이 될 수 없는 타입은 컴파일 시 알아서 원시 타입으로 표현할 수 있는건 원시 타입으로 표현해주고, 메소드를 호출하는 등 래퍼 타입이어야 하는 경우 래퍼 타입으로 변환해준다. 널이 될 수 있는 타입의 경우 ``kt null``은 원시 타입에는 들어갈 수 없고, 참조 타입에만 들어갈 수 있으므로 무조건 래퍼 타입으로 컴파일된다. 타입 상한 : 제네릭의 타입 파라미터 T는 T?가 아니어도 널이 될 수 있는 타입이다. 제네릭 클래스(T)의 경우 T에 원시 타입을 지정하더라도 내부적으로는 항상 그에 대한 박스 타입을 사용한..
[Kotlin] Nullability 관련 연산자
[Kotlin] Nullability 관련 연산자
2017.12.06최근 null에 대한 접근 방법은 런타임에 발생하는 NPE를, 컴파일 타임으로 옮기는 것이다. 널이 될 수 있음과 없음에 대한 모든 검사는 컴파일 타임에 수행되기 때문에, 실행 시점에는 널이 될 수 있는 타입과 널이 될 수 없는 타입의 객체가 같아진다. 단, ``kt @NotNull`` 애너테이션이나 ``java Intrinsics.checkExpressionValueIsNotNull()`` ``java Intrinsics.checkParameterIsNotNull()``같은 체크가 추가된다. 런타임에 ``kt null``을 가져와 non-null type에 집어 넣거나, ``kt !!``를 잘못 사용하는 경우 프로그램 실행 도중 다음 예외가 발생한다. ``java java.lang.IllegalStat..
[Kotlin] 수신 객체 지정 람다 : with / apply / let / run / takeif / also
[Kotlin] 수신 객체 지정 람다 : with / apply / let / run / takeif / also
2017.12.05수신 객체 지정 람다 with : prefix없이 접근하고 싶을 때 ``kt with``는 원래 파라미터가 2개인 함수다. 그러나 두 번째 인자인 람다를 밖으로 빼서 원래 언어가 지원하는 구문인 것 처럼 사용할 수 있다. 보기 깔끔해진다. ``kt with``의 람다 내에서는 전달된 객체에 prefix없이 접근할 수 있다. ```kt fun alphabet(): String { val stringBuilder = StringBuilder() return with(stringBuilder) { for (letter in 'A'..'Z') { this.append(letter) append("!") // this 생략 가능 } this@OuterClass.somFunc() // 바깥쪽 클래스 멤버 접근 th..