Cannot check for instance of erased type: T 오류는 왜 발생할까? JVM은 제네릭 타입을 실행 시점에 지원하지 않기 때문에, 자바의 제네릭과 마찬가지로 코틀린의 제네릭 또한 컴파일 타입에 타입 지워짐(Type Erasure)이 발생한다. 이 때문에 제네릭을 사용하는 일반 함수에서는 함수 본문에서 제네릭 타입을 이용해 연산을 할 수 없다. 예를 들어 다음과 isType 함수를 살펴 보자. fun isType(value: Any): Boolean { return value is T } 이 함수는 겉보기에는 문제가 없어 보인다. 하지만, T라는 타입은 컴파일 시점에 지워지고, 실행 시점에는 T가 무슨 타입인지 알 수 없기 때문에 다음과 같은 오류가 발생한다. Cannot ch..
Kotlin/Variable and Function
함수의 매개 변수로 람다식을 받을 경우의 문제 일반적으로 함수를 호출하면 해당 함수가 서브루틴으로써 실행된다. 반면 inline fun으로 선언된 함수를 호출하면, 함수 호출을 실행하는 것이 아니라 해당 함수가 호출된 위치에 함수 내부의 코드가 삽입돼 실행된다. 예를 들어 다음과 같은 코드가 있다고 해보자. fun main(args: Array) { printWorldAfterFunction { println("Hello") } } fun printWorldAfterFunction(function: () -> Unit) { function() println("World") } 이 코드에서 printlnWorldAfterFunction 함수를 () -> Unit 타입의 람다식과 함께 실행하면, () -> ..
operator fun이란 코틀린은 특정한 부호의 연산을 함수로 정의할 수 있는 연산자 오버로딩 기능을 제공한다. 예를 들어 plus 라는 함수를 operator fun으로 선언하면 + 연산과 같은 효과를 낸다. 예를 들어 다음 Vector 클래스를 살펴보자. data class Vector(val x: Float, val y: Float) { operator fun plus(vector: Vector): Vector { return Vector(this.x + vector.x, this.y + vector.y) } } 이 Vector 클래스는 operator fun plus을 선언하고 있으며, 이 함수는 두 Vector를 더할 때 x 값은 x 값끼리, y 값은 y 값끼리 더해 Vector 객체의 x 값..
lateinit 이란 무엇이며 언제 사용해야 하는가? 다음과 같은 NonNullableValueStateHolder 클래스를 살펴보자. *실제 코틀린에서는 아래와 같이 getter와 setter을 직접 설정하는 경우가 거의 없다. class NonNullableValueStateHolder() { private var nonNullableValue: String = "testValue" fun set(value: String) { nonNullableValue = value } fun get(): String { return nonNullableValue } } 이 클래스에는 nonNullableValue 라 불리는 String 타입의 non-nullable한 값이 있고, 이 변수에는 "testValue..
변수란 무엇인가? 변수는 값(데이터)을 저장하는 메모리 공간에 붙은 이름이다. 이름처럼 고전적인 변수는 값을 읽고 쓰는 것을 모두 지원한다. 실제로 다른 프로그래밍 언어인 Java나 Python등에서는 변수를 만들면 값을 쓰고 읽을 수 있다. 하지만 변수의 값이 바뀔 수 있는 부분이 많아진다는 것은 프로그램에 오류가 일어날 수 있는 부분이 많아진다는 것을 뜻한다. 때문에 최근 함수형 프로그래밍 패러다임에서는 값의 불변성을 중요하게 다룬다. 이에 대해 코틀린은 값이 변할 수 있는 가변 변수인 변수(var)와 값이 변할 수 없는 불변 변수(val) 두가지의 변수를 지원한다. 코틀린에서 지원하는 변수의 종류 : var, val 코틀린에서 지원하는 변수의 종류는 다음과 같다. val: 불변(Immutable) ..