기존 자바의 경우는 클래스를 만들고, 내부에 같은 이름을 가진 클래스를 하나 더 만들어야 생성자의 임의선언이 가능했다. 그러나 코틀린은 간결함을 요구하는 언어이므로 그렇게 거추장스러운 방법을 쓰지 않는다.. 굳이 클래스 이름을 다 적을 필요 없이 init 명령어 하나면 모든게 끝난다 쩔지.
다음 코드는 클래스를 호출할 때 받아온 매개변수로 동시에 초기화 시키는 코드이다.
init으로 생성자를 선언한 후에.. 그냥 그 매개변수를 등치시켜 초기화 하면 된다. 진짜 간편하지 않은가(!)
fun main(args: Array<String>): Unit {
val person = Person("홍길동", 30)
println("이름 : ${person.name}")
println("나이 : ${person.age}")
}
class Person constructor(name: String, age: Int) {
val name : String
val age : Int
init {
this.name = name
this.age = age
}
}
결과 :
이름 : 홍길동
나이 : 30
또, init을 나눌수도 있다. (자바 개발자 대박 신기해함)
import `object`.Person
fun main(args: Array<String>): Unit {
val person = Person("홍길동", 30)
println("이름 : ${person.name}")
println("나이 : ${person.age}")
}
class Person constructor(name: String, age: Int) {
val name : String
val age : Int
init {
this.name = name
}
init {
this.age = age
}
}
이 때, 초기화는 위에서부터 아래로 초기화 되므로, 초기화된 변수를 이용한 결과값으로 특정 초기화해야한다면
초기화된 변수를 먼저 선언하고, 그 결과값을 초기화하는 변수를 다음에 선언해야한다.
val single : Int
val double : Int
init {
this.single = single
}
init {
this.double = single*2
}
근데 이거보다 더 간단하게 선언할 수 있는 방법이 있는데,
class Person(val name : String, val age : Int)
이 한 줄로도 간단하게 생성자를 만들어 초기화 할 수 있다.
또, 보조생성자를 여러개 만들어 여러개의 인수를 받을 수도 있다.
fun main(args: Array<String>): Unit {
println("${Time(5).second} 초")
println("${Time(15,6).second} 초")
println("${Time(6,3,17).second} 초")
}
class Time(val second: Int) {
init {
println("주 생성자 동작")
}
//보조생성자1
constructor(minute: Int, second: Int) : this(minute * 60 + second) {
println("보조 생성자 1동작")
}
//보조생성자2
constructor(hour: Int, minute: Int, second: Int) : this(hour + 60 + minute, second) {
println("보조 생성자 2동작")
}
}
먼저 결과부터 본다.
결과 :
주 생성자 동작
5 초
주 생성자 동작
보조 생성자 1동작
906 초
주 생성자 동작
보조 생성자 1동작
보조 생성자 2동작
4157 초
Process finished with exit code 0
아까, 생성자를 여러개로 만들면 위에서 아래로 순차적으로 움직인다고 했다.
여기서도 보다시피, 아래를 타고 내려온다.
즉, 주생성자 내부 값이 있고, 그 이후에 보조생성자에서 this를 호출하면 주생성자가 있는 생성자를 먼저 호출하고, 다음 그 생성자에 추가로 보조생성자를 붙이는 형태로 보조생성자가 동작한다.
'Android > 안드로이드 스터디(Kotlin)' 카테고리의 다른 글
Kotlin] 11. 연산자 오버로딩 (0) | 2020.12.07 |
---|---|
Kotlin] 10. getter, setter (0) | 2020.12.07 |
Kotlin] 8. 객체 (0) | 2020.12.04 |
Kotlin] 7. 가변인수 (0) | 2020.12.04 |
Kotlin] 6. 디폴트 인수 (0) | 2020.12.04 |