Kotlin(9)
-
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