English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Kotlin 생성자(Constructor)

이 문서에서는 예제를 통해 Kotlin의 생성자(메인 생성자와 부 생성자)와 초기화 블록을 이해하게 됩니다。

생성자는 클래스 속성을 초기화하는 간결한 방법입니다。

이는 객체를 인스턴스화(생성)할 때 호출되는 특별한 멤버 함수입니다. 하지만, Kotlin에서는 그들이 작동하는 방식이 약간 다릅니다。

Kotlin에서는 두 개의 생성자가 있습니다:

  • 메인 생성자 - 클래스 초기화의 간결한 방법

  • 부 생성자 - 다른 초기화 로직을 배치할 수 있습니다

메인 생성자

메인 생성자는 클래스 헤더의 일부입니다. 예를 들어:

class Person(val firstName: String, var age: Int) {
    // class body
}

괄호로 둘러싸인 코드 블록은 메인 생성자입니다:(val firstName: String, var age: Int)。

생성자는 두 개의 속성을 선언합니다:firstName(키워드 val로 선언된 읽기 전용 속성)과 age(키워드 var로 선언된 읽기 쓰기 속성)。

예제:메인 생성자

fun main(args: Array<String>) {
    val person1 = Person("Joe", 25)
    println("First Name = ${person1.firstName}")
    println("Age = ${person1.age}")
}
class Person(val firstName: String, var age: Int) {
}

프로그램을 실행할 때, 출력은 다음과 같습니다:

First Name = Joe
Age = 25

Person 클래스의 객체를 생성할 때, "Joe"와 값을 전달합니다。 25Person이 함수처럼 보입니다。

이렇게 person1 객체의 firstName와 age 속성은 각각 "Joe"와 초기화됩니다。 25.

메인 생성자를 사용하는 다른 방법도 있습니다。

메인 생성자와 초기화 문장 블록

메인 생성자의 문법은 제약이 있으며, 어떤 코드도 포함할 수 없습니다。

초기화 코드(초기화 속성 코드뿐만 아니라)를 배치하기 위해 초기화 프로그램 블록을 사용했습니다. init 키워드로 시작합니다. 초기화 문장 블록으로 위의 예제를 수정해 보겠습니다:

fun main(args: Array<String>) {
    val person1 = Person("joe", 25)
}
class Person(fName: String, personAge: Int) {
    val firstName: String
    var age: Int
    //초기화 블록
    init {
        firstName = fName.capitalize()
        age = personAge
        println("First Name = $firstName")
        println("Age = $age")
    }
}

프로그램을 실행할 때, 출력은 다음과 같습니다:

First Name = Joe
Age = 25

여기서, person을 생성할 때,1객체를 생성할 때, 괄호 내의 매개변수 fName과 personAge는 "Joe"와 25하지만, fName과 personAge를 사용할 때 var 또는 val을 사용하지 않으며, 이들은 Person 클래스의 속성이 아닙니다.

Person 클래스는 firstName와 age 두 개의 속성을 선언했습니다.

when person1객체가 생성되고, 초기화 블록 내 코드가 실행됩니다. 초기화 블록은 속성을 초기화뿐만 아니라, 그들을 출력합니다.

이 작업을 수행하는 또 다른 방법은 다음과 같습니다:

fun main(args: Array<String>) {
    val person1 = Person("joe", 25)
}
class Person(fName: String, personAge: Int) {
    val firstName = fName.capitalize()
    var age = personAge
    //초기화 블록
    init {
        println("First Name = $firstName")
        println("Age = $age")
    }
}

생성자 매개변수와 속성을 구분하기 위해 다른 이름(fName과 FirstName, 그리고 Personage와 age)을 사용했습니다. 생성자 매개변수는 일반적으로 _firstName와 _age와 같은 이름을 사용하며, 완전히 다른 이름을 사용하지 않습니다. 예를 들어:

class Person(_firstName: String, _age: Int) {
    val firstName = _firstName.capitalize()
    var age = _age
    // 초기화 블록
    init {
        ... .. ...
    }
}

주 생성자의 기본 값

생성자 매개변수에 기본 값을 제공할 수 있습니다. (함수에 기본 값 제공과 유사)기본 매개변수)。예:

fun main(args: Array<String>) {
    println("person"1 이 객체가 인스턴스화되었습니다")
    val person1 = Person("joe", 25)
    println("person"2 이 객체가 인스턴스화되었습니다")
    val person2 = Person("Jack")
    println("person"3 이 객체가 인스턴스화되었습니다")
    val person3 = Person()
}
class Person(_firstName: String = "UNKNOWN", _age: Int = 0) {
    val firstName = _firstName.capitalize()
    var age = _age
    //초기화 블록
    init {
        println("First Name = $firstName")
        println("Age = $age\n")
    }
}

프로그램을 실행할 때, 출력은 다음과 같습니다:

First Name = Joe
Age = 25
person2 인스턴스화됨
First Name = Jack
Age = 0
person3 인스턴스화됨
First Name = UNKNOWN
Age = 0

Kotlin 부가 생성자

Kotlin에서는 클래스가 하나나 여러 개의 부가 생성자를 포함할 수 있습니다. 이들은 constructor 키워드를 사용하여 생성됩니다.

Kotlin에서 부가 생성자는 널리 사용되지 않습니다. 다른 방식으로 클래스를 초기화하려는 경우, 부가 생성자의 가장 일반적인 사용법이 나타납니다. 학습하기 전에 이미 이해해야 할 것은Kotlin 상속.

Kotlin에서 부가 생성자를 생성하는 방법은 다음과 같습니다:

class Log {
    constructor(data: String) {
        // 일부 코드
    }
    constructor(data: String, numberOfData: Int) {
        // 일부 코드
    }
}

이곳에서 Log 클래스는 두 개의 부가 생성자를 가지고 있지만 주 생성자는 없습니다.

클래스를 확장할 수 있습니다:

class Log {
    constructor(data: String) {
        // 코드
    }
    constructor(data: String, numberOfData: Int) {
        // 코드
    }
}
class AuthLog: Log {
    constructor(data: String): super(data) {
        // 코드
    }
    constructor(data: String, numberOfData: Int): super(data, numberOfData) {
        // 코드
    }
}

이곳에서는 AuthLog의 생성자가 부모 클래스 Log의 해당 생성자를 호출합니다. 이를 위해 super()를 사용합니다.

Kotlin에서는 또한 this()를 사용하여 같은 클래스의 다른 생성자(예: Java에서)를 호출할 수 있습니다.

class AuthLog: Log {
    constructor(data: String): this(data, 10) {
        // 코드
    }
    constructor(data: String, numberOfData: Int): super(data, numberOfData) {
        // 코드
    }
}

예제: Kotlin의 다른 생성자

fun main(args: Array<String>) {
    val p1 = AuthLog("Bad Password")
}
open class Log {
    var data: String = ""
    var numberOfData = 0
    constructor(_data: String) {
    }
    constructor(_data: String, _numberOfData: Int) {
        data = _data
        numberOfData = _numberOfData
        println("$data: $numberOfData 	回数")
    }
}
class AuthLog: Log {
    constructor(_data: String): this("From AuthLog -> " + _data, 10) {
    }
    constructor(_data: String, _numberOfData: Int): super(_data, _numberOfData) {
    }
}

프로그램을 실행할 때, 출력은 다음과 같습니다:

From AuthLog -> Bad Password: 10 times

주의:클래스에 메인 생성자가 없으면, 다음 생성자는 기본 클래스나 위임을 다른 생성자로 초기화해야 합니다(위 예제와 같이).