생성자(Constructor)란
- 클래스를 통해 객체가 만들어질 때 기본적으로 호출되는 함수
- 객체 생성 시 필요한 값을 인자로 설정할 수 있게 한다.
- 생성자를 위해 특별한 함수인 constructor()를 정의
class 클래스명 constructor(필요한 매개변수들..) { // 주 생성자의 위치
...
constructor(필요한 매개변수들..) { // 부 생성자의 위치
// 프로퍼티의 초기화
}
[constructor(필요한 매개변수들..) {...}] // 추가 부 생성자
...
}
주 생성자(Primary Constructor)
- 클래스명과 함께 기술되며 보통의 경우 constructor 키워드를 생략할 수 있다.
부 생성자(Secondary Constructor)
- 클래스 본문에 기술되며 하나 이상의 부 생성자를 정의할 수 있다.
BirdSecondaryConstructor.kt
class Bird {
// 1. 프로퍼티들 - 선언만 함
var name : String
var wing : Int
var beak : String
var color : String
// 2. 부 생성자 - 매개변수를 통해 초기화할 프로퍼티에 지정
constructor(name : String, wing : Int, beak : String, color : String) {
this.name = name // 3. this.wing는 선언된 현재 클래스의 프로퍼티를 나타냄
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") // 4. 생성자의 인자로 객체 생성과 동시에 초기화
...
}
this 키워드를 생략하고 하는 경우
- 생성자의 매개변수와 프로퍼티의 이름을 다르게 구성
constructor (_name : String, _wing : Int, _beak : String, _color : String) {
name = _name // _를 매개변수에 사용하고 프로퍼티에 this를 생략할 수 있음
wing = _wing
beak = _beak
color = _color
}
부 생성자를 여러 개 포함한 클래스
- 클래스에 부 생성자를 하나 혹은 그 이상 포함할 수 있다.
class 클래스명 {
constructor(매개변수[,매개변수...]) {
// 코드
}
constructor(매개변수[,매개변수...]) {
// 코드
}
...
}
- 매개변수는 서로 달라야 함
여러 개의 부 생성자 지정의 예
// 주 생성자가 없고 여러 개의 보조 생성자를 가진 클래스
class Bird {
// 프로퍼티들
var name : String
var wing : Int
var beak : String
var color : String
// 첫 번째 부 생성자
constructor (_name : String, _wing : Int, _beak : String, _color : String) {
name = _name
wing = _wing
beak = _beak
color = _color
}
// 두 번째 부 생성자
constructor (_name : String, _beak : String) {
name = _name
wing = 2
beak = _beak
color = "grey"
}
...
}
주 생성자
- 클래스명과 함께 생성자 정의
// 주 생성자 선언
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" )
}
- 가시성지시자나 애노테이션 표기가 없을 경우 생략 가능
- 클래스명과 함께 생성자 정의 - 프로퍼티가 포함된 주 생성자
// 주 생성자 선언
class Bird (var name : String, var wing : Int, var beak : String, var color : String) {
// 프로퍼티 - 위에 var 혹은 val로 선언하므로서 프로퍼티가 이미 포함됨
// 메서드
fun fly() = println("Fly wing : $wing")
fun sing( vol : Int ) = println( "Sing vol : $vol" )
}
주 생성자의 초기화 블록
- 초기화 블록이 포함된 주 생성자 - BirdPrimaryInit.kt
// 주 생성자 선언
class Bird( var name : String, var wing : Int, var beak : String, var color : String) {
// 1. 초기화 블록
init {
println( "-----------초기화 블록 시작-------------")
println("이름은 $name, 부리는 $beak")
this.sing(3)
println("------------초기화 블록 끝-------------")
}
// 메서드
fun fly() = println( "Fly wing : $wing" )
fun sing( vol : Int ) = println( "Sing vol : $vol" )
}
- 초기화 블록에는 간단한 코드가 허용된다.
프로퍼티의 기본값 지정
- 생성시 필요한 기본값을 지정할 수 있다.
// 프로퍼티의 기본값 지정
class Bird( var name : String = "NONAME", var wing : Int = 2, var beak : String, var color : String) {
...
}
fun main() {
val coco = Bird( beak = "long", color = "red" ) // 기본값이 있는 것은 생략하고 없는 것만 전달 가능
println( "coco.name : ${coco.name}, coco.wing ${coco.wing}" )
println( "coco.color : ${coco.color}, coco.beak ${coco.beak}" )
}
'# 02 > 코틀린' 카테고리의 다른 글
[Kotlin] super와 this의 참조 (0) | 2019.08.08 |
---|---|
[Kotlin] 상속과 다형성 (0) | 2019.08.07 |
[Kotlin] 클래스와 객체의 정의 (0) | 2019.08.06 |
[Kotlin] 흐름의 중단과 반환 (0) | 2019.08.06 |
[Kotlin] 반복문 (0) | 2019.07.18 |