모든 변수를 참조형으로 사용하지만, 컴파일 과정에서 기본형으로 대체한다. 따라서, 코틀린의 경우 자료형을 고려하는 최적화를 신경쓰지 않아도 된다.
val bool = true // 컴파일러가 알아서 boolean 형으로 추론
val char1 = 'C' // 컴파일러가 알아서 char 형으로 추론
val a = 123 // Int형으로 추론
val b = 123L // 접미사 L을 이용하여 long형으로 추론
val c = 0x1F // 접두사 0x 를 사용해 16진법 표기가 사용된 int 형으로 추론
val d = 0b00101010 // 접두사 0b 를 이용하여 2진 표기가 사용된 int 형으로 추론
val float1 = 1.23e-2F // 접미사 F를 이용하여 float형 으로 추론
fun main(){
val str = "Hello"
val str2 = "World"
val str3 = "Hello"
println(str === str2) // false
println(str === str3) // true
}
String 자료형은 변수에 Heap 영역에 존재하는 인스턴스의 주소를 가지고 있다. 참조 연산자(===) 를 통해 str 과 str3 를 계산해보면 true 를 반환한다. 이 의미는 두 변수가 같은 인스턴스의 주소를 가지는 것을 알 수 있다.
val로 지정된 불변 타입 변수는 초기에 값을 할당되면 나중에 값을 변경할 수 없으며 값을 변경하게 되면 컴파일 에러가 발생한다.
val은 한번만 초기화 되며 값을 변경할 수 없지만 컴파일러가 코드 문맥을 확인시 val 변수가 한번만 초기화 되는것이 맞다면 개발자가 상황에 따라 val를 여러 값으로 초기화(할당) 할 수 있습니다.
var로 지정된 가변 타입 변수는 초기화 후 값을 변경이 가능하다.
다른 타입의 값을 넣을 수는 없다.
이미 정의된 타입을 변경하려면 자바와 같이 형변환을 해야한다.
//변수 선언
val num1 = 2
var num2 = 3
//값 변경
num1 = 3 //error
num2 = 4
// var num1:Int = 1
// var 변수이름:자료형(생략가능) = 값
// 값을 특정 자료형을 저장할 수 있는 변수이름에 대입한다
var num1 = 1
println("내 첫변수 num1 변수에는 ${num1}이 들어있다.")
num1 = 5
println("변경한 변수 num1 변수에는 ${num1}이 들어있다.")
// var one1:Char = '김'
// var 변수이름:타입(생략가능) = 값
var one1 = '김'
println("내 첫변수 one1 변수에는 ${one1}이 들어있다.")
one1 = '나' // one1변수에 들어있던 '김' 대신에 '나'를 대입
println("변경한 변수 one1 변수에는 ${one1}가 들어있다.")
// var name:String = "참새"
var name = "참새"
println("새의 이름을 저장하는 name 변수에는 ${name}가 들어있다.")
name = "조롱박이" // name변수에 들어있던 "참새" 대신에 "조롱박이"를 대입
println("변경한 변수 name에는 ${name}가 들어있다.")