생성자(Constructor)는 class가 생성될때 호출되는 특별한 함수입니다. 생성자를 보통 정의해서 사용하지만 대부분의 경우 정의가 안되어 있는 경우 기본(Default)을 컴파일러가 자동으로 생성합니다. 그리고 생성할때 호출되는 성질을 이용해서 이 함수를 통해 데이터를 초기화 하거나 class가 생성할때 필요한 작업을 수행합니다.
class Account constructor( _email: String, _password: String) { // constructor
val email: String
val password: String
init { // initialize command
email = _email
password = _password
}
}
다음과 같은 코드를 보면 낯선 키워드 2가지를 찾을 수 있습니다. 하나는 constructor 입니다. constructor키워드는 생략을 해도 똑같은 기능을 수행합니다. 이렇게 class 이름 다음에 오는 constructor[생략가능](코드) 형태의 코드를 주 생성자(Primary Constructor) 라고 부릅니다. 주 생성자는 파라미터 형태의 변수를 지정합니다.
그 다음 키워드는 init입니다. init은 생성자의 정의 부분 코드 블록입니다. 해당 부분에는 개체가 생성될 때 실행하는 코드입니다. 예시처럼 주 생성자의 로직은 init 키워드로 정의된 코드 블록입니다.
class Employee(val id: Int, val name: String, val isAdmin: Boolean = false)
>>> val newEmployee = Employee(1, "Hodongman")
>>> val manager = Employee(2, "Manager", true)
다음과 같이 생성자 코드에 임시(Default)값을 지정해서 사용할 수도 있습니다. 그러면 isAdmin값을 설정하지 않으면 자동으로 디폴트 값이 설정이 될 것입니다. 해당 값을 수정하려면 명시적으로 넣어줘야 합니다. 그리고 코틀린에서는 모든 생성자 변수에 디폴트 값을 넣으면 컴파일러가 자동으로 파라미터가 아무것도 없는 생성자를 생성합니다. 물론 생성자 파라미터가 아무것도 없어도 마찬가지로 컴파일러가 생성합니다.
주 생성자와 반대되는 개념으로 보조 생성자(Secondary Constructor)가 있습니다. 이것은 생성자가 하나 이상인 경우를 말합니다. 주 생성자와 달리 class 코드 안에 코드를 작성합니다.
class Employee{
constructor(val id: Int, val name: String, val isAdmin: Boolean = false) {
var id: Int = id
var name: String = name
var isAdmin: Boolean = isAdmin
}
constructor(val id: Int, val name: String, val isAdmin: Boolean = false, val salary: Int) {
var id: Int = id
var name: String = name
var isAdmin: Boolean = isAdmin
var salary: Int = salary
}
}
하지만 이렇게 생성자가 여럿인 경우 코드를 확인하기가 힘들다는 것이 저의 의견입니다. 디폴트 값을 잘 사용하면 쉽게 문제를 해결할 수 있는 것처럼 보이네요. 따라서 꼭 필요한 경우가 아니라면 사용하지 않는 것이 좋을 것 같아요.