이동식 저장소

상수에 관한 오해 본문

Primary

상수에 관한 오해

해스끼 2020. 7. 12. 16:38

거의 대부분의 프로그래밍 언어에는 흔히 상수라고도 불리는 불변값을 선언하는 키워드가 있다. 예를 들어 C의 const, Java의 final 말이다. 이 글에서는 그러한 키워드를 const로 통칭하겠다.

// Kotlin
val a = 3
a = 4         // Compile error

그런데 이렇게 선언된 변수를 간혹 절대로 변하지 않는다고 오해하는 경우가 있다. 나조차도 가끔 그럴 때가 있다. 주로 C나 Java의 primitive type(int, double 등)을 많이 사용하는 경우 이런 생각을 하기 쉽다. 왜냐면 저런 값들은 실제로 값이 변하지 않기 때문이다.

 

그런데 객체지향 언어에서는 조금 다르다. 예를 들어 이런 코틀린 코드가 있다.

data class Person(var name: String, var skills: String)
var person = Person("HSK", "Kotlin")

var b = person.also {
    it.skills = "Android"
}

간단한 클래스 Person을 정의하였고, Person의 객체 person을 선언하였다. 코드를 다 이해할 필요는 없다.

 

4번째 줄에서 it는 person의 val 타입이다. val은 C나 C++의 const와 같은 역할을 한다. 그런데 const인 it의 내부 변수에 값을 재할당하고 있다. 컴파일 오류도 아니다. 분명 const는 값을 바꿀 수 없다고 그랬는데?

 

일단 it는 바뀔 수 없다. 그런데 여기서 바뀔 수 없다는 것은 재할당될 수 없다는 뜻이다. 대신 객체의 멤버 변수는 재할당될 수 있기 때문에, 변수 하나씩 재할당하는 방식으로 재할당 금지를 우회할 수 있다. 물론 멤버 변수가 const라면 불가능하다.

 

정리하면 다음과 같다.

1. primitive type의 const 변수는 값이 변하지 않는다.

2. const 객체는 재할당될 수 없지만, 내부 변수는 재할당될 수 있다.

 

코틀린 공부 하다가 문득 떠올라서 정리해 봤다.

Comments