자바 개발자를 위한 코틀린 입문 에 강의 내용을 정리한 내용이다.
코틀린에서 클래스를 다루는 방법에 대해서 설명한다.
클래스와 프로퍼티
프로퍼티 = 필드 + getter + setter
kotlin엥서는 필드만 만들면 getter, setter를 자동으로 생성
1 2 3 4 5 6
| class Person(name: String, age: Int) {
val name = name var age = age
}
|
생성자에서 프로퍼티와 생성자를 생성할 경우
1 2 3 4 5
| class Person( val name: String, var age: Int ) { }
|
생성한 클래스 호출 후 데이터 입력
1 2 3 4 5 6
| fun main() { val person = Person("재현", 100) println(person.name) person.age = 10 println(person.age) }
|
생성자와 init
init
클래스가 초기화되는 시점에서 한번 호출하고 싶을때는 init
블록 생성하여 사용
1 2 3 4 5 6 7 8 9 10 11 12
| class Person( val name: String, var age: Int, ) { init { if (this.age <= 0) { throw IllegalArgumentException("나이는 ${this.age}일 수 없습니다.") } } }
|
argument에 값을 넣고 인스턴스화 할 경우
- 주생성자(primary constructor)
- 부생성자(secondary constructor) 는 최종적으로 주생성자 this를 호출해야 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Person( val name: String, var age: Int, ) {
init { if (this.age <= 0) { throw IllegalArgumentException("나이는 ${this.age}일 수 없습니다.") } } constructor(name: String): this(name, 1)
}
fun main() { val person2 = Person("재현", 100) val person3 = Person("재현") }
|
- 부생성자 사용보다는 정적 팩토리 메소드를 사용하는것이 좋음.
부생성자보다는 default parameter를 권장
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Person( val name: String = "재현", var age: Int = 100, ) {
init { if (this.age <= 0) { throw IllegalArgumentException("나이는 ${this.age}일 수 없습니다.") } }
}
|
커스텀 getter, setter
프로퍼티의 속성을 나타내면 커스텀으로 생성하여 호출 해주는것이 좋음
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Person( val name: String = "재현", var age: Int = 1, ) {
init { if (this.age <= 0) { throw IllegalArgumentException("나이는 ${this.age}일 수 없습니다.") } }
fun idAdult(): Boolean { return this.age > 20 }
val isAdult: Boolean get() = this.age > 20
}
|
getter
예약어 field
(자신을 가리키는) 를 사용하는 이유는 name.uppercase()
를 사용 할 경우에 name -> get() -> name -> get()
을 호출 하여 무한 루프가 발생한다.
1 2 3 4 5 6 7 8 9
| class Person( name: String = "재현", var age: Int = 1, ) {
val name = name get() = field.uppercase()
}
|
backing field를 사용안하고 하는 경우 this.name
을 이용
1 2 3 4 5 6 7
| class Person( val name: String = "재현", var age: Int = 1, ) {
val getUpperCaseName: String get() = this.name.uppercase()
|
setter
setter 도 getter 와 동일하나 var를 이용해서 생성하면된다. 하지만 setter를 무분별하게 이용하는걸 지양하기때문에 update 와 같은 함수를 이용해서 호출하는 방법이 좋다.
소스코드
참조