[Kotlin] 생성자 매개변수 선언시 val, var
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)
}
}