val (value 의 약자)
- 변경 불가능한 참조를 저장하는 변수
- 일단 초기화하고 나면 재대입이 불가능하다. 자바로 말하자면 final 변수에 해당한다.
- val 변수는 블록을 실행할 때 정확히 한 번만 초기화돼야 한다.
- 하지만, 어떤 블록이 실행될 때 오직 한 초기화 문장만 실행됨을 컴파일러가 확인할 수 있다면 조건에 따라 val 값을 다른 여러 값으로 초기화할 수도 있다.
- val 참조 자체는 불변일지라도 그 참조가 가리키는 객체의 내부 값은 변경될 수 있다.
var (variable 의 약자)
- 변경 가능한 참조
- 변수의 값이 바뀔 수 있다. 자바의 일반 변수에 해당한다.
const
- java 의 static final 특성
- 읽기 전용 변수인 val 앞에 const 키워드를 붙여서 만든다.
- 초기화 이후 내부의 값을 사용할 수 있지만, 바꿀 수는 없다.
- val 과 같은 특성이지만 불변성의 차이가 존재한다.
- val 과 읽기 전용인 것은 동일하지만 컴파일 시 값이 결정되기 때문에 String 을 포함한 원시 타입으로만 선언이 가능하다.
- val 은 함수 및 객체 등 여러가지 타입으로 초기화 가능하다.
val 과 const val 의 차이
val
- 불완전한 불변성 : 값이 *런타임 시에 결정되는 상수
- 독립적인 프로그램 수행 중에 프로그램 수행에 따라 값이 바뀔 수 있다.
- 런타임(Run Time) : 컴파일 과정을 마친 프로그램이 실행되고 있는 동안의 시간
object Constants {
val NAME = "BuNa"
}
fun testValWithoutConst() {
val name = Constants.NAME
}
// Decompiled Java
public final void testValWithoutConst(){
String name = Constants.INSTANCE.getNAME();
}
- Kotlin 을 Java 로 디컴파일한 결과, "BuNa"라는 값을 가지고 있는 NAME 상수에 접근하는 모습을 확인할 수 있다.
const val
- 불변성 : 값이 *컴파일 시에 결정되는 상수
- 컴파일(Compile Time) : 사람이 읽을 수 있는 형태의 소스 코드를 컴퓨터가 읽을 수 있는 형태의 기계어로 변환해 주는 과정
- 클래스의 생성자에 할당될 수 없으며, String 을 포함한 원시 타입으로만 선언이 가능하다.
- 함수 내의 지역 변수나, 클래스의 속성으로 사용할 수 없다.
- 따라서 함수나 클래스 내에서 사용하려면 companion object 안에 선언해야 한다.
- 클래스의 상태와 관계없이 언제나 동일한 값을 가진다.
- 이름을 결정할 때에는 일반적인 변수와 달리 대문자와 _사용한다.
- 컴파일 시에 데이터가 메모리에 존재하기 때문에, 사용 시 객체 생성해서 이에 접근하는 것이 아니라 클래스명.상수명의 형태를 사용해서 직접 접근한다.
- 클래스의 객체를 생성한 뒤 사용해야 하는 클래스의 속성의 소요시간을 줄임으로 성능이 향상된다.
object Constants {
const val NAME = "BuNa"
}
fun testVal WithoutConst() {
val name = Constants.NAME
}
// Decompiled Java
public final void testValWithoutConst(){
String name = "BuNa"
}
- Kotlin 을 Java 로 디컴파일한 결과, 참조하는 쪽에서 NAME 상수에 직접 접근하지 않고, "BuNa"라는 문자열을 직접 가지고 있음을 확인할 수 있다.
- 컴파일러는 컴파일 시점에 이미 NAME 상수가 어떤 값을 가지고 있는지 알 수 있기 때문에, 값으로 대체가 가능하다.
- NAME 이 "BuNa"로 인라인 되면서, 값을 참조할 때마다 상수에 접근하면서 발생하는 오버헤드를 줄일 수 있다.
'안드로이드 > Kotlin' 카테고리의 다른 글
[Java] 읽기 전용 컬렉션(List, Set, Map), ArrayList, LinkedList, Array (0) | 2024.12.05 |
---|---|
[Kotlin] 자료형(기본형, 참조형), Call by Value, Call by Reference (0) | 2024.12.05 |
[Kotlin] 객체 지향 원칙(SRP, OCP, LSP, ISP, DIP) (0) | 2024.08.05 |