생성자 (주 생성자, 부 생성자) - swkim0128/PARA GitHub Wiki

1. 주 생성자 (Primary Constructor)

  • 클래스 이름 옆에 괄호 안에 정의되며, 클래스 초기화 시 기본적으로 실행됩니다.
  • 간결하고 효율적으로 속성을 초기화할 수 있습니다.

문법

class 클래스이름(val 속성1: 타입, var 속성2: 타입) {
    // 클래스 본문
}

1. 간단한 주 생성자

class Person(val name: String, var age: Int)

fun main() {
    val person = Person("Alice", 25)
    println("이름: ${person.name}, 나이: ${person.age}")
}

출력:

이름: Alice, 나이: 25

2. 초기화 블록 (init)

  • init 블록은 주 생성자가 호출될 때 실행됩니다.
  • 여러 개의 init 블록을 사용할 수 있으며, 정의된 순서대로 실행됩니다.
class Person(val name: String, var age: Int) {
    init {
        println("초기화 블록 실행: 이름은 $name, 나이는 $age")
    }
}

fun main() {
    val person = Person("Bob", 30)
}

출력:

초기화 블록 실행: 이름은 Bob, 나이는 30

3. 디폴트 값이 있는 주 생성자

  • 매개변수에 기본값을 지정할 수 있습니다.
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

2. 부 생성자 (Secondary Constructor)

  • constructor 키워드를 사용하여 정의됩니다.
  • 클래스에 여러 개의 부 생성자를 정의할 수 있습니다.
  • 부 생성자는 반드시 주 생성자를 호출해야 하며, 이를 위해 this 키워드를 사용합니다.

문법

class 클래스이름(val 속성1: 타입, var 속성2: 타입) {
    constructor(매개변수: 타입) : this(기본값1, 기본값2) {
        // 부 생성자 본문
    }
}

1. 부 생성자 사용

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

2. 여러 부 생성자 정의

  • 클래스에 여러 개의 부 생성자를 정의하고 필요한 초기화를 수행할 수 있습니다.
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

3. 주 생성자와 부 생성자의 비교

항목 주 생성자 (Primary Constructor) 부 생성자 (Secondary Constructor)
정의 위치 클래스 헤더 클래스 본문
매개변수 기본값 지원 지원하지 않음
초기화 코드 init 블록에서 수행 생성자 본문에서 수행
호출 관계 독립적으로 사용 가능 반드시 주 생성자를 호출해야 함

4. 생성자 간의 호출

  • 부 생성자는 항상 주 생성자를 호출해야 하며, 생성자 간의 호출 관계를 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}")
}

요약

1. 주 생성자:

  • 클래스 헤더에 정의.
  • 속성을 간결하게 초기화.
  • init 블록과 함께 사용 가능.

2. 부 생성자:

  • constructor 키워드로 정의.
  • 클래스에 여러 개 정의 가능.
  • 반드시 주 생성자를 호출해야 함.

주 생성자는 간결하고 효율적이며 대부분의 경우 적합합니다. 부 생성자는 추가 초기화가 필요한 경우나 다양한 생성 패턴을 지원해야 할 때 사용됩니다.

⚠️ **GitHub.com Fallback** ⚠️