자바 개발자를 위한 코틀린 입문 - 9. 코틀린에서 클래스를 다루는 방법


자바 개발자를 위한 코틀린 입문 에 강의 내용을 정리한 내용이다.
코틀린에서 클래스를 다루는 방법에 대해서 설명한다.

클래스와 프로퍼티

프로퍼티 = 필드 + 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
// 주생성자(primary constructor)
class Person(
val name: String,
var age: Int,
) {

init {
if (this.age <= 0) {
throw IllegalArgumentException("나이는 ${this.age}일 수 없습니다.")
}
}

// 부생성자(secondary constructor)
constructor(name: String): this(name, 1)

}

// main 함수
fun main() {
val person2 = Person("재현", 100)
val person3 = Person("재현")
}
  • 부생성자 사용보다는 정적 팩토리 메소드를 사용하는것이 좋음.

부생성자보다는 default parameter를 권장

1
2
3
4
5
6
7
8
9
10
11
12
13
// 주생성자(primary constructor)
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 와 같은 함수를 이용해서 호출하는 방법이 좋다.

소스코드

참조