1. 클래스와 프로퍼티
class Person constructor(name : String, age : Int){
val name = name
var age = age
}
자바에서는 클래스를 생성해주고 안에 Person( ) 하고 생성자를 만들어 주었는데,
코틀린에서는 클래스를 생성한 뒤 constructor를 통해 생성자를 적어준다.
이 때 자동으로 getter, setter가 만들어지고, 이 constructor는 생략이 가능하다!!
val person = Person("ssongsik", 25)
println(person.name)
또한, person.getName을 통해 데이터를 불러왔어야 했는데 위와 같이 person.name으로 이름을 불러올 수 있고,
setter 또한, person.setAge(10)가 아닌 person.age = 10를 통해 변경할 수 있다.
2. 생성자와 init
만일 위와 같은 생성자가 있는데, age에 0 이하의 값이 들어온다고 하면 나이가 될 수 없으니 예외처리를 해야만 한다.
그럴 때 우리는 init 블록을 사용할 수 있다.
init{ //클래스가 초기화되는 시점에서 한 번 실행되는 지점, 생성자가 실행되는 시점
if(age <= 0){
throw IllegalArgumentException("나이는 ${age}일 수 없습니다.")
}
println("초기화") //이는 역순으로 실행됨. = 초기화 블록부터 차례로 호출된다.
}
init은 클래스가 초기화 되는 시점에서 한 번 실행되는 지점으로서 생성자가 실행되는 시점이다!
따라서 이 때 age <= 0 일 때 예외처리를 하여 age의 값을 올바르게 받아낼 수 있다.
또한, 예를 들어, 새로 태어난 사람은 나이가 1살이기 때문에 이에 해당하는 생성자를 하나 더 만드려고한다면
자바에서는 Person(String name) { this(name, 1) } 이렇게 하나 더 만들어주었다.
하지만 코틀린에서 생성자를 추가하고 싶은 경우에는 위의 생성자를 그대로 두고 아래 생성자를 새로 적어준다.
constructor(name : String): this(name, 1){
println("첫 번째 부 생성자")
}
위에 있는 생성자를 주 생성자로 부르고, 반드시 존재해야한다.
반면, 아래 있는 생성자(새로운 생성자)는 부 생성자로 부르고, 없을 수도 있다.
또한, 부 생성자를 사용할 때에는 주 생성자를 this로 반드시 호출해야한다!!!
->하지만 부 생성자 보다는 default파라미터를 넣어서 하는 것을 권장하고 있다!
3. 커스텀 getter, setter
위의 클래스에서 만일 age가 20이상일 때 성인인지 아닌지 판단하는 함수를 만든다고 가정해보자.
fun isAdult() : Boolean{
return this.age >= 20
}
이렇게 만들 수도 있지만 다음과 같이 getter를 커스텀해서 만들 수 있다!!
val isAdult1 : Boolean
get() {
return this.age >= 20
}
val isAdult2 : Boolean
get() = this.age >= 20
이렇게 함수로 표현하는 것이 아니라 하나의 프로퍼티로 만들어 사용가능하다!!
또한, 다음과 같이 자기 자신을 변형하는 것을 커스텀해서 사용할 수도 있다!
4. backing field
생성자에서 val 로 선언하면 자동적으로 getter가 만들어지기 때문에 다음과 같이 지우고 생성한다.
class Person1 (
name : String, var age : Int
){
이제 이 name을 커스텀해서 자동적으로 대문자로 바꿔서 출력하는 getter를 만들어보자!
val name = name
get() = name.uppercase()
이름을 받아서 name.uppercase()를 사용하는 것이 상식적으로 맞는데, 이렇게 사용하면 에러가 발생한다.
왜냐하면 위에서 person.name을 하면 자동적으로 getter가 호출된다고 설명했는데
name.uppercase()의 name에서 get을 호출하게 되고, 왼쪽 get()에서는 또 다시 name을 불러오기 때문에
무한루프가 발생한다.
따라서 우린 field를 사용할 수 있다.
val name = name
get() = field.uppercase()
무한루프를 막기위한 예약어, 자기 자신을 가리킨다!
'Kotlin > Basic' 카테고리의 다른 글
[Kotlin/Basic] 코틀린에서의 접근제어 (0) | 2022.08.23 |
---|---|
[Kotlin/Basic] 코틀린에서의 상속 (0) | 2022.08.22 |
[Kotlin/Basic] 코틀린에서의 함수 (0) | 2022.08.14 |
[Kotlin/Basic] 코틀린에서의 예외처리 (0) | 2022.08.13 |
[Kotlin/Basic] 코틀린에서의 반복문 (0) | 2022.07.27 |