본문 바로가기

# 02/코틀린

[Kotlin] 생성자

반응형

생성자(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