코틀린에서 클래스를 선언 할 때는 class 키워드를 사용한다
class Person { /*...*/}
Constructors (생성자)
코틀린에서 클래스는 하나의 주(primary) 생성자와 여러개의 부(secondary) 생성자를 가진다.
주 생성자(Primary Constructor)
주 생성자는 클래스의 헤더에서 클래스의 이름 뒤쪽에 정의할 수 있다.
class Person (var firstName: String, var brithYear: Int) { /*...*/}
위의 방식은 클래스의 속성들을 선언함과 동시에 생성자를 선언하는 방법이다.
메인함수에서 var a = Person("권석준", 1999) 라는 코드로 생성자를 호출하면 클래스의 인스턴스를 만들어서 반환한다.
생성자는
- 인스턴스의 속성을 초기화
- 인스턴스 생성시 구문을 수행
위의 두가지 역할을 하는데, 위의 주 생성자를 선언하는 형태로는 인스턴스 생성시 구문을 수행하는 기능과 같은 별도의 코드를 넣을 수가 없다. 이를 위해서는 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년이라는 기본값으로 고정하여 초기화 한다.
'안드로이드 > [Kotlin]' 카테고리의 다른 글
[Kotlin] 상단의 Status Bar를 투명하게 만들어 보자. (0) | 2021.10.04 |
---|---|
[Kotlin] ListView 생성. Custom Adapter 사용하기 (0) | 2021.08.20 |
[Kotlin] Activity 전환 & 데이터 전달 (Intent, putExtra...) (0) | 2021.08.07 |
[Kotlin] View Binding (뷰 바인딩) (0) | 2021.08.06 |
[Kotlin] 클래스의 상속(Inheritance)과 오버라이딩(Overriding) (0) | 2021.05.08 |