[Kotlin] 코틀린의 생성자
최근 코틀린을 처음으로 사용해보고 있다.
처음 언어를 배울때 일단 부딪혀가며 습득하자는 생각이라 주먹구구식으로 일단은 개발했던것 같다.
그 과정에서 정리가 필요한 부분들을 느꼈고 간단하게나마 적어보려한다.
1. 기본생성자
코틀린 클래스는 다음과 같이 생성한다.
class TestClass {
}
이 클래스는 생성자도 프로퍼티(얘도 상당히 중요한 개념인것 같다. 다음 글에서 정리해봐야겠다)도 없는 클래스다
여기에 기본생성자를 추가해보자면,
class TestClass(name: String, age: Int){
}
이런 모양이 된다. 이름과 나이를 초기화할 수 있는 기본생성자를 추가해보았다.
만약, 자바였다면 다음과 같았을 것이다.
class TestClass {
String name;
int age;
// 생성자
public TestClass(String n1, int n2) {
this.name = n1;
this.age = n2;
}
}
코틀린이 훨씬 간결하다.
2. init
바로 위의 코드처럼 자바에서는 생성자에서 바로 멤버변수들을 초기화 해줄 수 있다.
하지만 코틀린에서는 그러지 못하고 다음과 같은 방법을 사용할 수 있다.
class TestClass(name: String, age: Int){
val name: String = "kim"
var age: Int = 0
init {
this.age = age
}
}
init은 기본생성자 호출이후 바로 다음에 호출되는 키워드이다.
하지만 우린 굳이 init 안쓰고 받아온 매개변수를 사용할 수 있다.
class TestClass(var name: String, val age: Int){
fun introduce() {
println("Hi! I'm $name and I'm $age years old")
}
}
기본생성자의 매개변수 옆에 var과 val가 슬쩍 생긴것을 볼 수 있다.
얘네들을 붙혀주면 생성자의 매개변수를 클래스 내부에서 사용할 수 있다.
3. 보조생성자 constructor()
클래스 이름 옆에서만 생성자를 만들 수 있는걸까?
생성자를 여러개 만들고 싶을때는 어떻게 하면될까..
우리는 constructor 키워드를 사용할 수 있다.
class TestClass{
var name = ""
var age = 0
constructor(name: String, age: Int){
this.name = name
this.age = age
}
}
참고로 var name = ""에서 자동으로 String으로 타입추론이 되기에 :String이라고 명시해주지 않아도 된다.
하지만 이렇게 constructor로 생성자를 선언해주면 똑똑한 인텔리제이에서는 이러지 말라고 권유한다.
"Convert to primary constructor"를 누르면
이렇게 다시 정리가 된다.
아무튼 constructor 키워드로 생성자를 여러개 선언해 줄 수 있다.
class TestClass{
var name = ""
var age = 0
constructor(name: String, age: Int){
this.name = name
this.age = age
}
constructor(age: Int){
this.age = age
}
constructor(name: String){
this.name = name
}
}
하지만,
constructor 키워드를 사용할 때 한가지 주의할 것이 있다.
기본 생성자를 선언하고 constructor를 사용하면 다음과 같이 에러가 발생한다.
인텔리제이가 하라는 대로 this()를 추가해주면 에러는 사라진다.
왜 이럴까?
constructor로부터 생성된 생성자는 기본 생성자를 상속받아야 한다.
그렇기 때문에 기본 생성자를 상속받고 난 이후에는 에러가 사라진 것이다.
물론 기본 생성자를 상속 받는 것이니 constructor로 만든 생성자들은 반드시 기본 생성자가 갖고 있는 인자들을 갖고 있어야 한다.
이 경우에는 기본생성자에 name이 있지만 보조생성자에는 없다.
this()에 name을 넣어주도록 하자
에러 해결
기본생성자에는 존재하는 name이 보조생성자에는 없기에 에러가 발생한 모습이다.
생성자들의 호출 흐름을 보자면 다음과 같다.
참고: