Kotlin 변수 선언

변수 선언

기본적으로 변수는 아래와 같이 선언한다.

val(또는 var) 변수명: 타입 = 값

변수 선언에는 변변 변수와 가변 변수 두 가지 유형이 있다.

불변 변수 (var)

var로 선언되면 변수에 재대입 가능하다. 즉, 가변(Mutable, 변경할 수 있는) 변수된다. var는 variable를 의미한다.

var a: Int = 1
var b = 2
var c: Int
c = 3

선언하면서 초깃값을 지정하였다면 변수의 타입을 할 생략할 수 있는 타입 추론(type inference) 기능도 제공한다.

가변 변수 (val)

val로 선언되면 변수에 재대입할 수 없다. 즉, 불변(Immutable, 변경할 수 없는) 변수된다. val는 value를 의미한다.

val MAX_COUNT: Int = 1024
val MAX_SIZE = 1024

val 키워드를 사용한 변수는 문맥상 한번만 초기화를 할 수 있다. 자바의 final과 비슷하다.

var, val 컴파일

var는 언제 어디서나 대입할 수 있지만, val로 선언하면 재대입시 컴파일 에러가 발생한다.

var foo = "a"
hoge = "b"  // OK
val foo = "a"
fuga = "b"  // 컴파일 에러

대입을 여러번 반복적으로 대입하는 것은 좋지 않기에, 기본적으로 val을 사용하도록 한다.

물론, var를 사용해야만 하는 경우도 있다.

상수 선언 (const)

const 으로 선언되면 더 효율적인 상수를 선언 할 수 있다.

const val FOO = "Foo"

변수 데이터 타입

VariableTutorial.kt

fun main(args: Array<String>) {
    val a: Int
    var b: String
    val c = 3;
    var d = "dString"
    a = 34
    b = "bString"
    println("a = $a is Int? ${a is Int}")
    println("b = $b is String? ${b is String}")
    println("c = $c is Int? ${c is Int}")
    println("d = $d is String ${d is String}")
}
a = 34 is Int? true
b = bString is String? true
c = 3 is Int? true
d = dString is String true

자바와 다르게 int, String 이런 데이터 타입이 없이 var 또는 val만 명시해도 된다.

주의해야 할 점은 변수 선언만 하는 경우에는 var a: Int, val b: String와 같이 데이터 타입을 반듯이 명시해줘야 하지만, 변수를 선언하고 값을 정의한다면 var a = 34 데이터 타입이 자동으로 지정되어 생략 가능하다. 이를 타입 추론(type inference)이라고 한다.

Null 제한 변수, Null 허용 변수

null 값이 존재하지 않는 것을 의미한다. 보통의 변수에는 null을 할당 할 수 없다. 타입 명에 물음표(?)를 붙이면 null 허용되는 변수(Nullable 매개 변수)를 정의 할 수 있다.

var a: String = null		 // null은 대입 할 수 없다
var b: String? = null		 // null을 대입 할 수 있다

Nullable 변수는 그대로는 속성과 함수를 호출 할 수 없다.

fun main() {
    var a: String? = "ABC"
    var b: String? = "ABC"
    var c: String? = "ABC"
    var d: String? = "ABC"

    // null이 아닌지를 확인하는 if 문장 속에서 Non-nullable로 취급 (스마트 캐스트)
    if (a != null) { println(a.length) }
    
    // ?.를 이용하면 b가 null의 경우 전체식이 null가되는 (안전 콜) 
    println(b?.length)

    // !!를 이용하면 강제적으로 사용할 수 있다 (실행시 에러가 발생할 수 있으므로 위험) 
    println(c!!.length)
    
    // 엘비스 연산자 (?:)를 사용하여 null는되지 않도록 한다.
    d = d ?: "(Unknown)"
    println(d.length)
}