<클래스의 생성자>
class Person(var name: String, val birthYear: Int)
클래스의 이름 옆에 있는 소괄호 안에 쓰인 속성들을 생성자 라고 할 수 있는데요,
위 방법은 클래스의 '속성'들을 선언함과 동시에 '생성자' 역시 선언하는 방법입니다
그럼 생성자란 무엇일까요?
<생성자 constructor>
: 생성자란 새로운 인스턴스를 만들기 위해 호출하는 특수한 함수입니다
생성자를 호출하면 클래스의 인스턴스를 만들어 반환받을 수 있습니다
생성자의 기능
1. 인스턴스의 속성을 초기화
2. 인스턴스 생성시 필요한 구문을 수행
하지만 위에서 선언한 형태에서는 인스턴스 생성시 구문을 수행하는 기능은 넣을 수 없습니다
이는 init이라는 함수를 통해 수행이 가능합니다
init 함수
init 함수는 파라미터나 반환형이 없는 특수한 함수인데요
생성자를 통해 인스턴스가 만들어질 때 호출되는 함수입니다
init 함수가 호출되는지 확인하기 위한 예제를 하나 보겠습니다
fun main() {
var a = Person("정해인", 1988)
var b = Person("윤두준", 1989)
var c = Person("장원영", 2004)
}
class Person(var name: String, val birthYear: Int) {
init {
println("${this.birthYear}년생 ${this.name}님이 생성되었습니다.")
}
}
/* 출력
1988년생 정해인님이 생성되었습니다.
1989년생 윤두준님이 생성되었습니다.
2004년생 장원영님이 생성되었습니다.
*/
Person 클래스 안에 init을 쓴 후 중괄호를 친 후 init이 호출되는지 여부를 확인하기 위해 속성들을 출력하는 println 구문을 넣었습니다
이때 this는 인스턴스 자신의 속성이나 함수를 호출하기 위해 클래스 내부에서 사용되는 키워드입니다
main 함수에서 Person 인스턴스를 세개 만들고 실행해보면
인스턴스 생성을 통해 init이 호출되어 세개의 인스턴스에 넣은 속성들이 출력되는 것을 확인할 수 있습니다
그런데 이러한 생성자를 사용할 때 항상 모든 속성을 수동으로 초기화를 하는 것이 비효율적인 경우도 있습니다
예를 들어 Person 클래스를 사용하여 100명의 사람이 가진 이름과 출생년도를 인스턴스로 만드는데
그 중 90명정도가 1989년생이라면..?
그런 경우라면 1989년을 '기본값'으로 만들 수 있는 방법이 있다면 좋겠죠!
이럴 때엔 클래스를 만들 때 기본으로 선언하는 기본 생성자 외에
필요에 따라 추가적으로 선언하는 보조 생성자를 만들 수 있는데요
<보조 생성자 secondary constructor>
: 기본 생성자와 다른 형태의 생성자를 제공하여 인스턴스 생성시 편의를 제공하거나 추가적인 구문을 수행하는 기능을 제공
그럼 보조 생성자를 만들어보겠습니다
fun main() {
var a = Person("정해인", 1988)
var b = Person("윤두준", 1989)
var c = Person("장원영", 2004)
var d = Person("태연")
var e = Person("김우빈")
}
class Person(var name: String, val birthYear: Int) {
init {
println("${this.birthYear}년생 ${this.name}님이 생성되었습니다.")
}
constructor(name: String) : this(name, 1989) {
println("보조 생성자가 사용되었습니다.")
}
}
/* 출력
1988년생 정해인님이 생성되었습니다.
1989년생 윤두준님이 생성되었습니다.
2004년생 장원영님이 생성되었습니다.
1989년생 태연님이 생성되었습니다.
보조 생성자가 사용되었습니다.
1989년생 김우빈님이 생성되었습니다.
보조 생성자가 사용되었습니다.
*/
보조 생성자는 constructor라는 키워드를 사용합니다
init 처럼 constructor라는 이름의 함수를 만들고 괄호 안에 필요한 파라미터를 추가해줍니다 -> constructor(name: String)
위 예제에선 이름만 받는 생성자를 만들었습니다
그리고 중요한 점은 *보조 생성자를 만들 때는 반드시 기본 생성자를 통해 속성을 초기화* 해주어야 합니다
보조 생성자가 기본 생성자를 호출하도록 하려면 콜론(:)을 붙인 후 this 라는 키워드를 사용하고
기본 생성자가 필요로 하는 파라미터를 괄호 안에 넣어주면 됩니다 -> this(name, 1989)
여기서는 이름은 받은 그대로 넘겨주고 출생년도는 1989년으로 고정하여 초기화하도록 만들었습니다
그 다음 중괄호 안에 보조 생성자가 수행되는지를 확인하기 위해 println을 넣어두었습니다
이제 main함수에서 년도없이 이름만 넣어 새로운 인스턴스를 생성해 실행시켜보면
년도를 작성하지 않은 인스턴스는 출생년도가 1989년으로 고정되어 출력되는 것을 확인할 수 있습니다
기본 생성자와 보조 생성자는 클래스를 사용하는 사람에게 다양한 방법으로 인스턴스를 생성하는 법을 제시함으로써
편의를 제공하는 기능입니다!
그럼 <클래스의 생성자>는 여기서 마치도록 하겠습니다
*위 글은 유튜브 테크과학! DeMo님의 강좌를 참고하여 작성하였습니다
'Kotlin' 카테고리의 다른 글
[Kotlin] 10. 오버라이딩과 추상화 (0) | 2023.07.20 |
---|---|
[Kotlin] 09. 클래스의 상속 (0) | 2023.07.19 |
[Kotlin] 07. 클래스의 기본 구조 (0) | 2023.07.18 |
[Kotlin] 06. 흐름제어와 논리연산자 (0) | 2023.07.17 |
[Kotlin] 05. 반복문과 증감연산자 (0) | 2023.07.16 |