Backend/Kotlin

[Kotlin] 생성자 매개변수 선언시 val, var

findmypiece 2022. 9. 2. 14:15
728x90

Kotlin에서 var, val 키워드는 각각 변수, 상수를 의미한다는 것은 매우 기본적인 사실이다. 그런데 이러한 키워드를 함수나 메소드의 매개변수에 사용하진 않는다.

 

Java 에서도 private, public 같이 변수 앞에 선언할 수 있는 키워드가 있지만 매개변수 선언시에는 이를 사용하지 않고 오히려 컴파일 오류를 일으킨다. Kotlin 에서도 마찬가지이고 var, val 도 마찬가지다.

 

그런데 Kotlin 에서는 var, val 는 물론이고 private, public 같은 키워드도 포함할 수 있는 매개변수가 존재한다.

 

바로 생성자의 매개변수인데 private, public 은 우리가 익히 알고 있듯이 해당 변수를 외부에 해당 변수를 공개하느냐 마느냐 하는 것이라는 것을 쉽게 알 수 있지만 var, val 을 쓰고 안쓰고는 무슨 차이가 있는지 단박에 이해가 되지 않았다. 

 

그렇다고 무조건 var, val 를 선언하기에는 intellij 해당 키워드 딤드 처리와 함께 아래와 같이 필요없다는 메시지를 보여주기 때문에 뭔가 껄끄럽다.

Constructor parameter is never used as a property

 

결론만 간단하게 말하면 var, val 키워드를 사용해서 선언한 매개변수만 클래스 맴버변수로 선언되고 그 외에는 생성자 지역변수로만 선언된다.

 

우선 Java 의 생성자를 생각해보자.

class TestService1{
    String str;
    TestService1(String str){
        this.str = str;
    }
}

위와 같이 선언하는 이유는 생성자로 받은 매개변수는 단순히 생성자의 지역변수일 뿐인데 이 값을 클래스 내 메소드에서 활용하기 위해서는 클래스의 맴버변수에 할당되어야 하기 때문이다.

 

Kotlin 에서도 이를 위해 아래와 같이 할 수 있긴하지만 생성자의 매개변수로 받은 값은 거의 대부분 클래스 내 메소드에서 활용되기 때문에 이는 보일러플레이트 코드의 일종이다.

class TestService1(
    str: String
) {

    val str = str
    
    fun test(){
        println(str)
    }
    
}

 

이러한 보일러플레이트 코드를 줄이기 위해 Kotlin 에서는 생성자의 매개변수를 자동으로 클래스 맴버변수로 추가하는 기능을 지원하는데 그게 바로 생성자 매개변수 선언시 var, val 를 선언하는 것이다. 즉, 아래와 같이 사용할 수 있게 된다.

class TestService2(
    val str: String
) {
    fun test(){
        println(str)
    }
}

 

728x90