본문 바로가기

# 02/코틀린

[Kotlin] 자료형 변환

반응형

코틀린의 자료형 변환


기본형을 사용하지 않고 참조형만 사용

서로 다른 자료형은 변환 과정을 거친 후 비교


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