[Kotlin] 코틀린, 변수(Variables) val, var 선언

    코틀린(kotlin)에서는 변수를 선언할 때 val과 var 중 한가지의 타입을 지정을 한 후 변수를 입력해야 한다. 

     

    코틀린 변수 선언

    var(or val) 변수명 datatype(option)

     

    확실히 변수 선언만큼은 자바보다 복잡해보일 수 있는데 알고보면 별거 없고, data type부분도 option이기 때문에 굳이 지정하지 않아도 코드가 작동하는데 전혀 문제가 없다.

     

    [Kotlin] 코틀린, 변수(Variables) val, var 선언


    val (Read-only)

    val의 역할은 변수가 read-only가 되게 만든다. 

    fun main() {
        // read-only
        val helloWorld : String = "Hello, World!"
    	println("$helloWorld?")
    }

    실행 결과

     

    Hello, World!?

     

    위와같이 정상적으로 헬로월드가 출력되는 코드에 다음과 같이 값을 추가하게 된다면

    fun main() {
        // read-only
        val helloWorld : String = "Hello, World!"
    	println("$helloWorld?")
    
        helloWorld = "Hi, World!"
    	println("$helloWorld?")
    }
    e: C:\kotlin\src\main\kotlin\Main.kt: (6, 5): Val cannot be reassigned

    다음과 같이 "Val cannot be reasigned" 에러가 발생하게 된다.

     

    위와 같이 변수값이 변경이 되어야 하는 경우, 다음과 같이 val을 var로 변경하면 된다.

     

    var (Mutable)

    fun main() {
        // mutable
        var helloWorld : String = "Hello, World!"
        println("$helloWorld?")
    
        helloWorld = "Hi, World!"
        println("$helloWorld?") 
    }

     

    실행 결과

    Hello, World!?
    Hi, World!?

    이와같이 var는 변경이 가능한(mutable) 속성을 가지고 있기에 일반적으로 변경을 해야 하는 변수는 var를 사용해서 선언한다.

     

     

    유형 추론(Local type inference)

    코틀린은 기본적으로는 변수에 타입을 지정하는 것을 권장하지만, 타입을 작성하지 않아도 변수의 값을 추론하여 타입을 생성해낸다. python같은 경우 굳이 추론을 하지 않고 물 흐르듯 변수의 값들을 받아내지만 코틀린은 자바 기반이기 때문에 이러한 부분은 불가능하다.

     

    fun main() {
        var helloWorld = "Hello, World!"
    	println("$helloWorld")
    }

    위와 같이 코딩을해도 에러가 나지 않는다. 내부적으로 helloWorld를 String 형으로 인식을 했기 때문이다. 하지만 변수값의 유형과 다른 유형의 값을 넣으면 에러가 발생한다.

     

    fun main() {
        var helloWorld = "Hello, World!"
    	println("$helloWorld")
    
        helloWorld = 10
    	println("$helloWorld")
    }

    에러 발생

    e: C:\kotlin\src\main\kotlin\Main.kt: (5, 18): The integer literal does not conform to the expected type String

     

    여기까지 내용을 읽었다면, 이해가 안되는 말이 있을 것이다. 변수의 유형이 val과 var이라고 해놓고 val 값이 변경이 되지 않는다면 변수(변하는 수)라는 말이 애초에 성립이 안되는 것이 아닌가? 하고 말이다. 

     

    여기서 우리가 알아야 될 것은 val의 값이 아예 변경이 안되는 것은 아니다. 일반적인 상황에서나 값이 변경이 안될 뿐 값이 변경 될 수 있다. 정확히 말하자면, val은 참조하는 객체가 달라지면 에러가 발생하지만 이미 참조하고 있는 개체의 내용이 바뀐다면 값이 바뀔 수 있다.

     

    val이 변경 가능한 케이스

    fun main() {
        var list = mutableListOf("삼성전자")
        list.add("펄어비스")
    
        println(list)
    }

    출력 결과

    [삼성전자, 펄어비스]

     

    val로 선언한 리스트라 하더라도 리스트 자체를 바꾸지 않는다면, 값을 변경할 수 있는 것을 알 수 있다. 다만 리스트라 하더라도 read-only로 선언한 리스트는 당연히 변경할 수 없다.

     

    fun main() {
        var list = listOf("삼성전자")
        list.add("펄어비스")
    
        println(list)
    }

    mutableListOf가 아니라 listOf로 선언하면 리스트가 read-only 형으로 변환되어 값을 변경할 수 없게 된다.

    e: C:\kotlin\src\main\kotlin\Main.kt: (3, 10): Unresolved reference: add

     

     

    반응형

    댓글

    Designed by JB FACTORY