본문 바로가기
쿤즈 Dev/Kotlin

[Kotlin] 변수에 저장된 값 비교하는 방법

by :)Koon 2022. 5. 9.

앞선 포스팅에서 코틀린의 변수의 사용과 자료형의 종류, 그리고 사용하는 방법까지 알아보았습니다. Java와는 다르게 Kotlin은 변수의 선언부터 자료형의 사용까지 시작부터 다른 점들이 많은 것 같습니다.

이번 포스팅에서는 변수에 저장된 값을 비교하는 방법에 대해서 알아보겠습니다.


정적변수와 참조형 변수

앞선 포스팅에서 변수를 선언하고 자료형을 사용해서 저장할 때 물음표(?)를 사용하는 경우가 있었습니다. 최초에 이 값이 무엇인지 모를 때, 혹은 최초에 null 값을 대입할 경우 NPE 문제로 세이프 콜이 필요할 때 사용합니다. 그래서 물음표(?)가 붙은 변수는 붙지 않는 변수와는 다른 자료형을 가지게 됩니다.

 

아래 예를 통해서 다시 한 번 알아보겠습니다.

package `02`

fun main(args: Array<String>) {
    val temp1: Int = 200 // Int 자료형 명시. 정적 변수
    val temp2 = temp1 

    val temp3: Int? = temp1 // 물음표(?)를 사용한 참조형 변수
    val temp4: Int? = temp1
    val temp5: Int? = temp3

    println(temp1 === temp2)
    println(temp3 == temp4)
    println(temp3 === temp4)
    println(temp3 === temp5)
}

위 프로그래밍을 실행하면 어떠한 결과가 나타날까요? 답은 이렇습니다.

true
true
false
true

왜 이러한 결과가 나타나는지 알아볼게요.

 

우선 코틀린은 무조건 참조형 자료형을 이용해서 변수를 선언합니다. 그리고 컴파일 단계에서 이를 정적 변수로 변환해줍니다. 하지만 자료형에 물음표(?)를 사용하는 경우는 다릅니다. 즉, Int와 Int? 는 다른 자료형입니다.

 

다시 예제로 돌아와서 temp1은 Int인 정수로 선언하였고 값을 대입하였습니다. 이 값은 컴파일 단계에서 정적변수로 변경됩니다. 그리고 그 값은 메모리의 스택에 저장됩니다. Java로 생각하면 int로 선언한 것과 같습니다.

 

반대로 Int?로 선언한 temp3는 참조형 변수로 선언됩니다. 그래서 이 값은 메모리의 힙 영역에 저장됩니다. 즉, temp3는 스택에 주소값을 가지고 이 주소는 힙 영역의 주소입니다. 그리고 그 주소에는 우리가 원하는 값이 저장되어 있습니다.

 

이번에는 등호에 대해서 잠시 알아볼게요.

등호는 총 3가지가 있습니다. 등호(=), 이중 등호(==), 삼중 등호(===)입니다. 각 등호는 역할이 모두 다릅니다. 먼저 등호(=)는 대입을 의미합니다. 그래서 우리가 변수를 선언할 때 등호(=)를 이용해서 오른쪽의 값을 왼쪽에 대입하는 것입니다.

 

이중 등호(==)는 값이 같은지 비교하는 연산자입니다. 예제에서 temp1과 temp2의 값은 모두 200으로 같습니다. 따라서 결과가 true가 나오게 되는 것입니다.

 

삼중 등호(===)는 참조 주소가 같은지를 비교하는 연산자입니다. 예제에서 temp3과 temp4는 참조형 변수로 선언되었습니다. 그리고 선언할 때 동일한 값을 넣어주었어요. 즉, temp3은 힙의 특정 영역의 주소가 들어있고 여기에 저장된 값은 200이 됩니다. 마찬가지로 temp4 역시 특정 영역의 주소가 들어있고 여기에 저장된 값은 200입니다. temp3과 temp4가 가리키는 영역에 저장된 값은 모두 200으로 같지만 각각이 가리키는 주소의 값은 다르죠. 그래서 결과는 false가 나온 것입니다.

 

여기서 잠깐!
만약 선언시 저장하는 값이 -128 ~ 127 사이의 값이라면 이 값은 스택이 아닌 캐시에 저장됩니다. 따라서 참조형 변수로 이 값을 대입한다 하더라도 캐시에 저장된 값을 가리키기 때문에 모두 true가 되니 주의해야 합니다.

​이번 포스팅에서는 정적 변수와 참조형 변수 선언과 이 값을 비교하는 방법에 대해서 알아보았습니다. 자바와 같이 int, Integer를 따로 사용하지 않고 모두 참조형 자료형을 사용하고 있으니 편리함이 있습니다. 다만 값을 비교하기 위해서 이 값이 어디에 저장된 값이고 누구를 가리키니는 값인지 정확하게 파악해야 할 필요가 있습니다. 도움이 되셨으면 합니다. 이상입니다.

 

2022.05.01 - [쿤즈 Dev/Kotlin] - [Kotlin] 코틀린 변수의 종류와 사용방법

 

[Kotlin] 코틀린 변수의 종류와 사용방법

지난 포스팅에서 intelliJ를 이용해서 코틀린 프로젝트를 생성하는 방법을 알아보았습니다. 2022.04.30 - [쿤즈 Dev/Kotlin] - [Kotlin] 프로젝트 만들기 (feat. Hello Kotlin) [Kotlin] 프로젝트 만들기 (feat. H..

koonsland.tistory.com

2022.05.03 - [쿤즈 Dev/Kotlin] - [Kotlin] 코틀린 자료형 알아보기

 

[Kotlin] 코틀린 자료형 알아보기

지난 포스팅에서 코틀린의 변수에 대해서 알아보았습니다. 2022.05.01 - [쿤즈 Dev/Kotlin] - [Kotlin] 코틀린 변수의 종류와 사용방법 [Kotlin] 코틀린 변수의 종류와 사용방법 지난 포스팅에서 intelliJ를 이

koonsland.tistory.com

2022.05.08 - [쿤즈 Dev/Kotlin] - [Kotlin] 자료형 검사하기 (Null Point Exception)

 

[Kotlin] 자료형 검사하기 (Null Point Exception)

지난 포스팅에서 변수와 자료형에 대해서 알아보았습니다. 특히 자료형은 여러가지 자료형을 알아보고 사용하는 방법, 그리고 자동 추론됨과 명시적으로 선언하는 방법까지 알아보았습니다. 20

koonsland.tistory.com

 

댓글