생성자 (주 생성자, 부 생성자) - swkim0128/PARA GitHub Wiki
- 클래스 이름 옆에 괄호 안에 정의되며, 클래스 초기화 시 기본적으로 실행됩니다.
- 간결하고 효율적으로 속성을 초기화할 수 있습니다.
class 클래스이름(val 속성1: 타입, var 속성2: 타입) {
// 클래스 본문
}
class Person(val name: String, var age: Int)
fun main() {
val person = Person("Alice", 25)
println("이름: ${person.name}, 나이: ${person.age}")
}
출력:
이름: Alice, 나이: 25
- init 블록은 주 생성자가 호출될 때 실행됩니다.
- 여러 개의 init 블록을 사용할 수 있으며, 정의된 순서대로 실행됩니다.
class Person(val name: String, var age: Int) {
init {
println("초기화 블록 실행: 이름은 $name, 나이는 $age")
}
}
fun main() {
val person = Person("Bob", 30)
}
출력:
초기화 블록 실행: 이름은 Bob, 나이는 30
- 매개변수에 기본값을 지정할 수 있습니다.
class Person(val name: String = "Unknown", var age: Int = 0)
fun main() {
val person1 = Person() // 기본값 사용
val person2 = Person("Alice", 25) // 값을 전달
println("person1: 이름=${person1.name}, 나이=${person1.age}")
println("person2: 이름=${person2.name}, 나이=${person2.age}")
}
출력:
person1: 이름=Unknown, 나이=0
person2: 이름=Alice, 나이=25
- constructor 키워드를 사용하여 정의됩니다.
- 클래스에 여러 개의 부 생성자를 정의할 수 있습니다.
- 부 생성자는 반드시 주 생성자를 호출해야 하며, 이를 위해 this 키워드를 사용합니다.
class 클래스이름(val 속성1: 타입, var 속성2: 타입) {
constructor(매개변수: 타입) : this(기본값1, 기본값2) {
// 부 생성자 본문
}
}
class Person(val name: String, var age: Int) {
constructor(name: String) : this(name, 0) {
println("부 생성자가 호출되었습니다.")
}
}
fun main() {
val person = Person("Charlie")
println("이름: ${person.name}, 나이: ${person.age}")
}
출력:
부 생성자가 호출되었습니다.
이름: Charlie, 나이: 0
- 클래스에 여러 개의 부 생성자를 정의하고 필요한 초기화를 수행할 수 있습니다.
class Person(val name: String, var age: Int) {
constructor() : this("Unknown", 0)
constructor(age: Int) : this("Unknown", age)
}
fun main() {
val person1 = Person()
val person2 = Person(25)
val person3 = Person("Alice", 30)
println("person1: 이름=${person1.name}, 나이=${person1.age}")
println("person2: 이름=${person2.name}, 나이=${person2.age}")
println("person3: 이름=${person3.name}, 나이=${person3.age}")
}
출력:
person1: 이름=Unknown, 나이=0
person2: 이름=Unknown, 나이=25
person3: 이름=Alice, 나이=30
항목 | 주 생성자 (Primary Constructor) | 부 생성자 (Secondary Constructor) |
---|---|---|
정의 위치 | 클래스 헤더 | 클래스 본문 |
매개변수 | 기본값 지원 | 지원하지 않음 |
초기화 코드 | init 블록에서 수행 | 생성자 본문에서 수행 |
호출 관계 | 독립적으로 사용 가능 | 반드시 주 생성자를 호출해야 함 |
- 부 생성자는 항상 주 생성자를 호출해야 하며, 생성자 간의 호출 관계를 this로 표현합니다.
예제
class Person(val name: String, var age: Int) {
constructor() : this("Unknown", 0) // 기본값 호출
constructor(name: String) : this(name, 0) // 나이를 기본값으로 설정
}
fun main() {
val person = Person("Bob")
println("이름: ${person.name}, 나이: ${person.age}")
}
- 클래스 헤더에 정의.
- 속성을 간결하게 초기화.
- init 블록과 함께 사용 가능.
- constructor 키워드로 정의.
- 클래스에 여러 개 정의 가능.
- 반드시 주 생성자를 호출해야 함.
주 생성자는 간결하고 효율적이며 대부분의 경우 적합합니다. 부 생성자는 추가 초기화가 필요한 경우나 다양한 생성 패턴을 지원해야 할 때 사용됩니다.