본문 바로가기

코틀린

[Kotlin] 생성자

 코틀린의 클래스는 3가지 구성 요소가 있다.

  1. class name : 클래스 이름
  2. class header : type parameter, primary constructor
  3. class body : 클래스의 프로퍼티나 함수 등을 정의하는 몸체

 3가지 구성요소 중 클래스 이름만 있어도 선언이 가능하다. 이때 몸체의 경우 { } 로 감싸진 부분을 의미하므로 클래스의 몸체가 없으면 괄호도 필요 없다는 것이 특징적이다. 대략 이런게 가능하다.

class Something // 몸체 없이 클래스 생성 가능

Constructor

 생성자는 2가지가 존재한다.

  1. Primary Constructor : 클래스 헤더에 위치하는 생성자. init 함수를 통해 값을 초기화한다.
  2. Secondary Constructor : 클래스 바디 안에 위치하는 생성자. 다른 언어의 생성자는 보통 이렇게 생겼다.

Primary Constructor

 클래스 헤더에서 선언할 수 있는 생성자로, 클래스 당 하나만 가질 수 있다.

class Animal constructor(name: String, type: String)

// constructor은 특별한 지시자가 없으면 생략 가능
class Animal(name: String, type: String)
{
    val name : String
    val type : String
    var age : Int = -1
// 프로퍼티 초기화는 클래스 몸체의 init 블럭에서 수행
    init {
        this.name = name
        this.type = type
    }
}
  • constructor 키워드는 가시성 수정자 ( public , private 등 ) 를 붙일 필요가 없으면 생략 가능하다.
  • init 블럭 내에서는 프로퍼티의 초기화(initialization)를 진행한다.
    값을 "변경" 하는 것으로 취급하지 않으므로, 여기 안에서만 상수 프로퍼티의 값을 지정할 수 있다.

init 함수를 따로 두지 않고 파라미터 선에서 바로 프로퍼티를 초기화하는 기능도 있다.

class Animal(val name: String, val type: String) // 여기서 바로 초기화해서 사용
{
    var age : Int = -1
}

Secondary Constructor

 클래스 바디 안에 위치하는 생성자. 순서 상 각종 초기화 및 primary constructor이 실행된 이후에야 실행될 수 있다.

open class Animal constructor(name: String, type: String) {
    val name : String
    val type : String
    var age : Int = -1

    init {
        this.name = name
        this.type = type
    }

    constructor(name:String, type:String, age: Int) : this(name, type) {
        this.age = age
        println("2. age is ${this.age}")
        // secondary constructor 이전에 반드시 primary constructor 이 실행된다.
        // 여기서 변경되는 값은 상수 불가.
	}
}
  • primary constructor 및 이니셜라이저에 의한 초기화가 발생한 이후 실행된다.
  • this 키워드를 통해 다른 생성자에게 위임(delagation) 하는 방식으로 작동한다.
  • 상수의 초기화는 안되는 것으로 보이며, 초기화 자체는 이니셜라이저 또는 init 블럭 내부에서 처리되어야 한다.

 

'코틀린' 카테고리의 다른 글

[코틀린] 자바&코틀린 라이브러리 검색  (0) 2022.11.05
[Kotlin] 상속  (0) 2022.10.10
[Kotlin] control flow  (0) 2022.09.06
[Kotlin] 기본 타입  (0) 2022.09.03
[Kotlin] 기본 타입과 내부 처리  (0) 2022.09.01