코틀린의 자료형 변환
기본형을 사용하지 않고 참조형만 사용
서로 다른 자료형은 변환 과정을 거친 후 비교
val a : Int = 1 // 정수형 변수 a를 선언하고 1을 할당
val b : Double = a // 자료형 불일치 오류 발생
val c : Int = 1.1 // 자료형 불일치 오류 발생
변환 메서드의 이용
val b : Double = a.toDouble // 변환 메서드 사용 (자바는 자동으로 변환되는데 코틀린은 변환 메서드 사용해줘야됨!!)
표현식에서 자료형의 자동 변환
val result = 1L + 3 // Long + Int -> result는 Long
변환 메서드의 종류
toByte : Byte
toLong : Long
toShort : Short
toFloat : Float
toInt : Int
toDouble : Double
toChar : Char
이중 등호(==)와 삼중 등호(===)의 사용
== 값만 비교하는 경우
=== 값과 참조 주소를 비교할 때
val a : Int = 128
val b : Int = 128
println(a == b) // true
println(a === b) // true
a와 b는 Int로 선언되어 있으므로 Int는 컴파일 후 기본형(int)으로 바뀌며 실행 할 때는 결국 스택에 들어가므로 스택에 주소가 아닌 값(128)이 동일해 주소가 동일한 것과 같은 true가 반환된다. (따라서 Int와 같은 기본형으로 바뀌는 자료형은 === 와 같은 연산은 제 역할을 하지 않는다.)
참조 주소가 달라지는 경우
val a : Int = 128
val b : Int? = 128
println(a == b) // true
println(a === b) // false
fun main() {
val a : Int = 128
val b = a
println( a === b ) // 자료형이 기본형이 int가 되어 값이 동일 true
val c : Int? = a
val d : Int? = a
val e : Int? = c
println( c == d ) // 값의 내용만 비교하는 경우 동일하므로 true
println( c === d ) // 값의 내용은 같지만 참조를 비교해 다른 객체(주소 다름)이므로 false
println( c === e ) // 값의 내용도 같고 참조된 객체도 동일(주소 동일)하므로 true
}
a, b는 기본형으로 스택에 주소가 아닌 값 128이 저장된다.
null을 허용한 변수 c, d, e는 참조형으로 저장된다. 그래서 c 와 d에는 a에 들어있는 값인 128이 저장되는 것이 아니라 서로 다른 128(힙 메모리 저장)을 가리키고 있는 주소1과 주소2가 저장(스택 메모리)된다. 두 변수가 가리키는 값은 같으니 이중 등호로 비교하면 true가 나온다. 하지만 삼중 등호로 비교하면 두 변수의 참조 주소가 달라 false가 나온다.
null 을 허용한 e는 참조형으로 만들어져 c의 참조 주소인 주소1이 저장(스택 메모리)된다. 그래서 c와 e를 이중 등호와 삼중 등호로 비교한 값은 모두 true이다.
코틀린에서는 참조형으로 선언한 변수의 값이 -128~127 범위에 있으면 캐시에 그 값을 저장한다.
따라서 캐시에 저장하면 모두 true 선언됨
fun main() {
val a : Int = 127
val b = a
println( a === b ) // true
val c : Int? = a
val d : Int? = a
val e : Int? = c
println( c == d ) // true
println( c === d ) // true
println( c === e ) // true
}
스마트 캐스트
구체적으로 명시되지 않은 자료형을 자동 변환
값에 따라 자료형을 결정
Number형은 숫자를 저장하기 위한 특수한 자료형으로 스마트 캐스트됨
fun main() {
var test : Number = 12.2 // 12.2에 의해 test는 Float형으로 스마트 캐스트 12.2
println("$test")
test = 12 // Int 형으로 스마트 캐스트 12
println("$test")
test = 120L // Long 형으로 스마트 캐스트 120
println("$test")
test += 12.0f // Float 형으로 스마트 캐스트 132.0
println("$test")
}
자료형의 검사 - is 키워드를 사용한 검사
fun main() {
val num = 256
if(num is Int) { // num이 Int형일 때
print(num)
} else if (num !is Int) { // num이 Int 형이 아닐 때, !(num is Int) 와 동일
print("Not a Int")
}
}
묵시적 변환 - Any
자료형이 정해지지 않은 경우
모든 클래스의 뿌리 - Int나 String은 Any형의 자식 클래스이다.
Any는 언제든 필요한 자료형으로 자동 변환 (스마트 캐스트)
fun main() {
val a : Any = 1 // Any형 a는 1로 초기화될 때 Int형이 됨
a = 20L // Int형이였던 a는 변경된 값 20L에 의해 Long이 됨
println("a: $a type: ${a.javaClass}") // a의 자바 기본형을 출력하면 long이 나옴
}
fun main() {
checkArg("Hello") // 문자열을 인자로 넣음
checkArg(5) // 숫자를 인자로 넣음
}
fun checkArg(x: Any) { // 인자를 Any형으로 받음
if ( x is String) {
println("x is String : $x")
}
if ( x is Int) {
println("x is Int : $x")
}
}
'# 02 > 코틀린' 카테고리의 다른 글
[Kotlin] 함수형 프로그래밍 (0) | 2019.07.04 |
---|---|
[Kotlin] 함수 선언하고 호출하기 (0) | 2019.07.03 |
[Kotlin] 변수의 null (0) | 2019.07.03 |
[Kotlin] 기본 연산자 (0) | 2019.07.03 |
[Kotlin] 패키지 (0) | 2019.07.03 |