본문 바로가기

안드로이드/[Kotlin]

[Kotlin] 클래스와 생성자(constructor)

코틀린에서 클래스를 선언 할 때는 class 키워드를 사용한다

class Person { /*...*/}

 

Constructors (생성자)

코틀린에서 클래스는 하나의 주(primary) 생성자와 여러개의 부(secondary) 생성자를 가진다. 

   주 생성자(Primary Constructor)

주 생성자는 클래스의 헤더에서 클래스의 이름 뒤쪽에 정의할 수 있다.

class Person (var firstName: String, var brithYear: Int) { /*...*/}

위의 방식은 클래스의 속성들을 선언함과 동시에 생성자를 선언하는 방법이다.

메인함수에서  var a = Person("권석준", 1999) 라는 코드로 생성자를 호출하면 클래스의 인스턴스를 만들어서 반환한다. 

 

생성자는

  1. 인스턴스의 속성을 초기화
  2. 인스턴스 생성시 구문을 수행

위의 두가지 역할을 하는데, 위의 주 생성자를 선언하는 형태로는 인스턴스 생성시 구문을 수행하는 기능과 같은 별도의 코드를 넣을 수가 없다. 이를 위해서는 parameter나 반환형이 없는 init 함수를 사용할 수 있다. init 함수생성자를 통해 인스턴스가 만들어 질 때 호출되는 함수이다. 이를 통해 초기화 로직을 추가할 수 있다.

fun main() {
    var a = Person("박보영", 1990)
    var b = Person("전정국", 1997)
    var c = Person("장원영", 2004)
	
    a.introduce()
}


class Person(var name: String, val birthYear: Int) {
    init { //생성자를 통해 인스턴스가 만들어질때 호출되는 함수
        println("생성완료")
    }
    fun introduce() {
        println("안녕하세요, ${birthYear}년생 ${name}입니다")
    }
}

주 생성자를 통해 a, b, c라는 인스턴스가 만들어질 때 마다 init함수가 호출된다.

추가적으로 클래스 안에 introduce() 라는 함수를 추가했다. 이를 main에서 호출하려면 a.introduce() 를 사용한다.

 

 

   부 생성자(Secondary Constructor)

또한 constructor 라는 키워드를 사용해서 부 생성자를 선언할 수 있다.

fun main() {
    var a = Person("박보영", 1990)
    var b = Person("전정국")
}

class Person(var name: String, val birthYear: Int) {
    constructor(name: String) : this(name, 1997) { //부 생성자를 통해서 인스턴스 생성
        println("부 생성자~")
    }
}

a라는 인스턴스는 주 생성자를 통해 인스턴스가 생성되었지만, b라는 인스턴스는 부 생성자를 통해서 인스턴스가 생성되었다.

부 생성자를 사용하면 항상 모든 속성을 수동으로 초기화 할 필요 없이 특정 속성만을 초기화함을 통해서 인스턴스를 생성할 수 있다. 위의 경우에서는 name이라는 속성만 초기화 해주면 부 생성자를 통해 Person클래스의 인스턴스가 생성된다. 태어난 년도인 1997이라는 속성은 기본값이 되는것이다.

 

부 생성자를 만들때는 반드시 주 생성자를 통해 속성을 초기화 해 줘야 한다. this라는 키워드를 사용해서 부 생성자가 주 생성자를 호출하도록 해야 한다. this 안에 주 생성자가 필요로 하는 parameter를 넣어주면 된다. 위의 경우에서 name은 부 생성자에서 받은 그대로 주 생성자로 넘겨주는 것이고, birthYear은 1997년이라는 기본값으로 고정하여 초기화 한다.