코틀린은 자바와 달리 primitive와 wrapper 타입의 구분이 없다.
자바에서 primitive 타입의 변수 에는 값이 대입되지만, 참조 타입의 변수에는 메모리상에 객체 위치가 들어간다.
참조 타입이 필요한 경우 wrapper 타입으로 primitive타입 값을 감싸서 사용한다.
예를 들면 아래와 같을 것이다.
String sNum = 123456789;
int iNum = Integer.parseInt(sNum);
Boolean isCheck = null; //객체이므로 null이 허용된다.
코틀린은 primitive 타입과 wrapper 타입을 구분하지 않으므로 항상 같은 타입을 사용한다.
아래는 코틀린에서 정수를 표현하는 Int를 사용하는 예제이다.
val num: Int = 123
val list: List<Int> = listOf(1, 2, 3)
fun showNum(num: Int) {
println(num)
}
fun showList(list: List<Int>) {
for(i in list) {
println(i)
}
}
primitive타입과 wrapper 타입이 같다고 항상 객체로 표현하지 않는다. 숫자 타입은 실행 시점에 대부분 int 타입으로 컴파일 된다.
int 타입으로 컴파일이 불가능한 경우에만 Int 타입으로 컴파일된다. 이러한 경우는 제너릭 클래스를 사용하는 Collection을 사용하는 경우뿐이다.
코틀린 Int는 null 참조가 들어갈 수 없기 때문에 자바 primitive 타입으로 컴파일 할 수 있다.
자바 primivite 타입은 결코 null이 될 수 없으므로 자바 primitive 타입을 코틀린에서 사용할 때도 null이 없는 타입으로 취급할 수 있다.
null 참조는 자바의 참조 타입 변수에만 대입할 수 있을 것이다. 만약 null이 될 수 있다면 그 타입은 자바의 wrapper 타입으로 컴파일된다.
아래 예제를 더 살펴보자.
data class Member(
val name: String,
val isMarried: Boolean? = null,
val age: Int? = null
) {
fun isAllMarried(member: Member): Boolean? {
if (genger == null || member.gender == null) {
return null
}
return isMarried && member.isMarried
}
fun sumAge(member: Member): Int? {
if (age == null || age.gender == null) {
return null
}
return age + other.age
}
}
isMarried와 age는 null을 허용하는 프로퍼티이므로 null체크를 한 뒤 두 값을 일반적인 값처럼 다루게 허용한다.
각각 java.lang.Boolean, java.lang.Integer로 저장될 것이다. 하지만 이는 자바에서 가져온 클래스를 다룰 때만 문제가 된다.
코틀린에서 사용할 때는 변수나 프로퍼티에 null을 허용할 것인지만 고민을 하면된다.
위에서 언급했듯이 코틀린에서 wrapper타입을 사용하는 경우는 단 한경우이다. 제너릭 클래스의 경우 wrapper 타입을 사용한다.
아래 코드를 살펴보자.
val list: List<Int> = listOf(1, 2, 3) //제너릭 Int 타입
val list = listOf(1, 2, 3) //타입 추론으로 제너릭을 생략하였지만 제너릭 Int 타입
위의 코드에서 만들어지는 Int는 primivite 타입이 아니라 wrapper 타입이다. 이렇게 컴파일하는 이유는 JVM은 제너릭에서 primitive 타입을 허용하지 않는다. 코틀린이든 자바든 모두 제너릭 클래스는 wrapper 타입을 사용해야 된다.
자바든 코틀린이든 제너릭 타입에 primivite 타입을 사용하면 빨간표시가 될 것이다.
//Kotlin
val list: List<int> = listOf(1, 2, 3) //int 사용 불가
//Java
ArrayList arraylist = new ArrayList<int>(); //int 사용 불가
'Android > Kotlin' 카테고리의 다른 글
Kotlin 뒤로 버튼을 한번 더 누르면 종료됩니다. (0) | 2022.11.02 |
---|---|
코틀린 널에 대해서 (0) | 2022.10.26 |
코틀린 object (0) | 2022.10.26 |
코틀린 클래스, 코틀린 프로퍼티 (0) | 2022.10.26 |
코틀린은 무엇인가? (0) | 2022.10.25 |