본문 바로가기
안드로이드/Kotlin

[Kotlin] 변수 선언(val, var, const val)

by jinwo_o 2024. 12. 5.

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 In Action 2장

함수, 변수, 클래스, enum, 프로퍼티를 선언하는 방법, 제어 구조, 스마트 캐스트, 예외 던지기와 예외 잡기. 함수를 선언할 때 fun 키워드를 사용한다. 실제로도 코틀린 프로그래밍은 수많은 fun을

velog.io

 

[Kotlin]변수선언 val, var, const/val과 const val의 차이

val(value의 약자) : 선언할 데이터의 값이 변경되지 않을 경우 사용java의 final특성, 선언 이후에 변수의 값을 바꿀 수 없다.var(variable의 약자) : 선언할 데이터의 값이 변경될 수 있을 경우 사용 java

velog.io

 

[Kotlin] const val vs val - 둘의 차이점은 무엇일까?

최근 우아한테크코스에서 코틀린에 대해 공부하면서 상수를 관리할 때 companion object(동반 객체) 내에 필요한 상수를 선언하는 일이 자주 있었습니다. 단순히 상수이기 때문에 val 키워드를 사용

itstory1592.tistory.com