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)
}