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 |