IT/Kotlin(4)
-
Kotlin - Java, Extensions, Destructuring declaration, etc
자바 파일에서 코틀린 함수를 호출할 때 @JvmOverloads 어노테이션을 추가하면, 코틀린 컴파일러가 자동으로 맨 마지막 파라미터로부터 파라미터를 하나씩 생략한 자바 메서드를 추가해 준다. 이렇게 오버로딩된 함수들은 생략된 파라미터에 대해 원래 코틀린 함수의 디폴트 파라미터 값을 사용하게 된다. 자바는 클래스 외부에 선언되는 함수가 존재하지 않기 때문에 자바 파일에서 코틀린의 최상위 함수를 호출하면 컴파일러는 코틀린 최상위 함수가 포함된 소스파일과 확장자를 결합한 이름의 클래스를 생성한다. 예를 들어 코틀린 최상위 함수의 소스 파일 이름이 Hello.kt라면 HelloKt라는 클래스가 생성된다는 뜻이다. 이렇게 생성된 클래스를 이용하여 코틀린의 최상위 함수를 자바에서 정적 메서드로 호출할 수 있게 된..
2024.04.22 -
Kotlin - Smart cast, Backing field, etc
값을 반환하면 식(expression), 반환하지 않으면 문(statement). fun main() { var number: Int = if (condition1) { //if문이 값을 반환하므로 식. 10 } else { 20 } if (condition2) { //if문이 값을 반환하지 않으므로 문. number = 10 } else { number = 20 } println("결과: $number") } 대입 연산자는 자바에서는 식이었으나 코틀린에서는 문이다. 즉, 자바에서의 대입 연산자는 변수에 값을 할당하면서 동시에 할당된 값을 반환하지만 코틀린에서는 변수에 값을 할당만 하고 값을 반환하지 않는다. fun main() { var num1: Int = 1 var num2: Int = 2 num1..
2024.04.19 -
람다의 무명 클래스 객체 생성
코틀린에서 작성된 고차 함수, 특히 라이브러리의 인자로 람다를 전달하면 모두가 신경 쓸 것 없이 행복하다. 하지만 코틀린은 자바를 개선한 언어.. 심지어 JVM(자바 가상 머신) 위에서 돌아간다. 따라서 프로그램을 짜다보면 자바의 메서드를 쓰지 않을 수가 없다. 근데 이게 정말 귀찮게 하는 요소가 많다. //자바 메서드 정의. Runnable은 함수형 인터페이스. void postponeComputation(int delay, Runnable computation); //코틀린에서 인자로 람다를 전달하여 호출. fun handleComputation(id: String) { postponeComputation(1000) { println(id) } } 다행히 자바 메서드의 함수형 인터페이스 타입 파라미터..
2023.10.26 -
변경 가능한 외부 로컬 변수를 포획한 람다, 클로저
코틀린 람다 안에서는 파이널 변수가 아닌 변수에 접근할 수 있다. fun createClosure(): () -> Unit { var x = 10 return { println(x++) } } fun main() { val myClosure = createClosure() myClosure() myClosure() myClosure() } 사실이다. 그러나 내부 구현에는 약간의 속임수가 존재한다. 변경 가능한(var) 외부 로컬 변수를 포획한 람다를 저장할 때, 람다 내부에서는 래퍼 클래스 객체 하나를 생성하고 이 객체를 변경 불가능한(val) 변수로 받는다. 이렇게 생성된 래퍼 클래스 객체의 프로퍼티를 var로 선언하여 포획된 로컬 변수의 주솟값을 저장한다. 따라서 함수가 반환되어 로컬 변수가 소멸되어..
2023.10.25