References: Do it! 코틀린 프로그래밍

코틀린에서의 생성자에 대해 알아봅니다.

 

 

1. 생성자

 

생성자란 클래스를 통해 객체가 만들어 질 떄 기본적으로 호출되는 함수를 말합니다.

생성자를 선언하는 위치는 다음과 같습니다.

 

class 클래스이름 constructor(매개변수){ //주 생성자
    ...
    constructor(매개변수){ ... } //부 생성자
    [constructor(매개변수){ ... }] //추가 부 생성자
    ... 
}

 

코틀린에서는 위의 예시와 같이 여러 생성자를 선언할 수 있습니다.

이에 대해 좀 더 자세히 알아봅시다.

 

 

2. 부 생성자

 

부 생성자는 클래스 본문에 함수처럼 선언하는 생성자를 말합니다.

Bird 클래스를 예시로 부 생성자에 대해 알아보겠습니다.

 

class Bird{
    var name: String
    var wing: Int
    var beak: String
    var color: String
    constructor(name: String, wing: Int, beak: String, color: String){
        this.name = name
        this.wing = wing
        this.beak = beak
        this.color = color
    }
    fun fly() = println("Fly wing: $wing")
    fun sing(vol: Int) = println("Sing vol: $vol")
}
fun main() {
    val coco = Bird("myBird", 2, "short", "blue")
    coco.color = "yellow"
    println("coco.color: ${coco.color}")
    coco.fly()
    coco.sing(3)
}

 

Bird 클래스를 선언하고 내부에 부 생성자를 통해 프로퍼티를 초기화 해주었습니다.

fly와 sing는 메서드입니다.

 

위의 예시를 실행하면 결과는 다음과 같습니다.

입력 인자값을 달리한 채 부 생성자를 여러개 추가할 수 있습니다.

다음 예시를 통해 여러 부 생성자를 선언한 코드를 확인할 수 있습니다.

 

class Bird{
    var name: String
    var wing: Int
    var beak: String
    var color: String
    constructor(name: String, wing: Int, beak: String, color: String){
        this.name = name
        this.wing = wing
        this.beak = beak
        this.color = color
    }
    constructor(name: String, color: String){
        this.name = name
        this.wing = 2
        this.beak = "short"
        this.color = color

    }
    fun fly() = println("Fly wing: $wing")
    fun sing(vol: Int) = println("Sing vol: $vol")
}

 

주의할 점은 선언한 프로퍼티를 모두를 초기화 시켜줘야 한다는 것 입니다.

 

 

 

3. 주 생성자.

 

주 생성자는 클래스 이름과 함께 생성자 정의를 사용하는 방법입니다.

주 생성자는 클래스 이름과 본문 블록 사이에 선언합니다. 다음 예시를 통해 알아보도록 합시다.

 

class Bird constructor(_name: String, _wing:Int, _beak: String, _color: String){
    var name: String = _name
    var wing: Int = _wing
    var beak: String = _beak
    var color: String = _color
    fun fly() = println("Fly wing: $wing")
    fun sing(vol: Int) = println("Sing vol: $vol")
}

 

위와 같이 주 생성자를 정의할 수 있습니다. 이 경우 constructor 키워드는 생략할 수 도 있습니다.

** 단 가시성 지시자 혹은 어노테이션이 있다면 constructor 키워드를 생략할 수 없습니다.

 

 

내부의 프로퍼티를 주 생성자에서 선언 및 초기화를 실행하면 클래스 내부의 내용을 좀 더 간단하게 만들 수 있습니다.

다음 예시를 통해 프로퍼티 선언을 주 생성자 내부에서 진행하도록 하겠습니다.

 

class Bird(var name: String, var wing: Int, var beak: String, var color: String){
    fun fly() = println("Fly wing: $wing")
    fun sing(vol: Int) = println("Sing vol: $vol")
}

 

클래스 본문 내에 메서드만 존재해 더 간략한 클래스를 선언할 수 있습니다.

 

클래스를 생성할 때 필요한 초기화 작업을 클래스 내에 정의해 사용할 수도 있습니다.

다음 예시코드를 통해 클래스가 생성되며 수행되는 초기화 작업에 대해 알아봅시다.

 

class Bird(var name: String, var wing: Int, var beak: String, var color: String){
    init{
        println("###Start init block.###")
        println("Name: $name, Beak: $beak")
        this.sing(3)
        println("###End init block.###")
    }
    fun fly() = println("Fly wing: $wing")
    fun sing(vol: Int) = println("Sing vol: $vol")
}

fun main() {
    val coco = Bird("myBird", 2, "short", "blue")
}

 

클래스 내의 init을 통해 초기화 블럭을 선언할 수 있습니다.

실행 결과는 다음과 같습니다.

객채를 생성하면 초기화 블록 내의 코드가 자동으로 실행되는 것을 확인할 수 있습니다.

 

 

 

 

 

 

반응형

'Programming' 카테고리의 다른 글

[Kotlin] 23. 다형성(Polymorphism)  (0) 2019.08.24
[Kotlin] 22. 상속(Inheritance)  (0) 2019.08.24
[Kotlin] 20. 예외 처리  (0) 2019.08.24
[Kotlin] 19. 라벨  (0) 2019.08.23
[Kotlin] 18. 반복문  (0) 2019.08.23

+ Recent posts