CS/Kotlin
[Kotlin] 생성자 종류
lovelyunsh
2023. 12. 5. 20:39
생성자
주 생성자와 부 생성자 2가지 종류가 있음.
아무 생성자도 생성하지 않으면 기본 생성자가 만들어짐.
주 생성자
class Developer(_id: Int) {
var id: Int = _id
}
주 생성자는 클래스명 옆에 이름을 붙여서 사용가능.
여기서 프로퍼티에 타입은 추론이 가능하므로 생략 할 수 있다.
// 추론 가능하니깐 프로퍼티에 타입 제거 가능
class Developer(_id: Int) {
var id = _id
}
단순히 프로퍼티만 있다면 프로퍼티도 생략 해도 된다.
// 아예 프로퍼티까지 생략 할 수 있음.
class Developer(var id: Int) {
}
실제로 생성되는 코드는 아래와 같다.
// 실제 내부적으로 생성되는 코드
class Developer constructor(id:Int){
var id: Int
init {
this.id = id
}
}
init 메서드는 클래스가 인스턴스화가 완료된 후 바로 실행되는 특수 블록이다.
디폴트 값도 지정 할 수 있음.
// 디폴트 값 생성도 가능.
class Developer(var id: Int, val x: Int = 0, val y: Int = 0)
fun main(args: Array<String>) {
val developer1 = Developer(100)
val developer2 = Developer(101, 10, 10)
println("developer1 : ${developer1.id} (${developer1.x}, ${developer1.y})")
//developer1 : 100 (0, 0)
println("developer2 : ${developer2.id} (${developer2.x}, ${developer2.y})")
//developer2 : 101 (10, 10)
}
부 생성자
부 생성자는 constructor 키워드를 이용해 만들 수 있다. (자바의 생성자와 비슷함)
// constructor 키워드 사용
class Developer {
var id: Int = 0
var text: String = ""
constructor(id: Int) {
this.id = id
}
constructor(id: Int, text: String) {
this.id = id
this.text = text
}
}
주 생성자와 부 생성자를 함께 사용할 경우
부 생성자에서 주 생성자를 반드시 호출 해야 한다.
// 주생성자와 부생성자를 함께 쓸 경우
// 부생성자에서 주생성자를 호출해야만 함
class Developer(var id: Int) {
var text: String = ""
constructor(id: Int, text: String): this(id) { //this(id) 가 주생성자 호출
this.text = text
}
}
부 생성자에서 부 생성자를 호출하는 방식도 가능하지만, 마지막으로 호출되는 부 생성자에는 주 생성자를 호출 해야한다.