인프런에서 제공하고 있는 강의를 보고 정리한 글입니다.
클래스와 프로퍼티
class Person constructor(name:String, age:Int) { // public 도 생략이 가능하다.
val name = name
var age: = age
}
getter
와 setter
를 만들지 않아도 된다. 자동으로 만들어준다. constructor
역시 생략이 가능하다. 그래서 다음과 같이 쓸 수 있다.
class Person(name:String, age:Int) { // public 도 생략이 가능하다.
val name = name
var age: = age
}
코틀린에서는 생성자에서 프로퍼티를 만들 수 있으므로, 다음과 같이 선언할 수 있다.
class Person (
val name: String,
var age: Int)
그리고 .
을 통해서 바로 값을 받아올 수 있다. 그리고, Java 로 만들어진 Person 을 받아오더라도, .
을 이용해서 바로 사용이 가능하다.
fun main() {
val person = Person("Gyeol", 80)
println(person.name)
person.age = 10
println(person.age)
}
class Person (
val name: String,
var age: Int)
생성자와 init
값에 대한 검증이 필요할 때 어떻게 해야할까? 예외처리를 어떻게 해주어야할까? init
블록을 사용한다. init
블록은 초기화 되는 시점에 한 번만 호출이 되는 블록이므로, 값을 적절히 만들어주거나, validation 로직을 넣거나 하는 용도로 사용된다.
class Person (
val name: String,
var age: Int
) {
// 초기화 되는 시점에 한 번만 호출이 되는 블록
init {
if (age < 0) {
trhow IllegalArgumentException("Invalid Age")
}
}
}
두 번째, 세 번째 생성자는 아랫부분에 constructor
이라는 키워드와 함께 만들어진다.
class Person (
val name: String,
var age: Int
) {
// 초기화 되는 시점에 한 번만 호출이 되는 블록
init {
if (age < 0) {
trhow IllegalArgumentException("Invalid Age")
}
}
constructor(name: String): this(name, 1)
}
this(name,1)
이 상단에 있는 생성자를 부른다.
위에 있는 생성자를 primary constructor 라고 부른다. 반드시 존재해야한다. 단, 주 생성자에 파라미터가 단 하나라도 없다면 생략은 가능하다. secondary constructor (부생성자) 는 있을 수도 있고, 없을 수도 있다. 최종적으로 주생성자를 this
로 호출해야 한다. 부생성자는 body 를 가질 수 있다. 다음과 같이 말이다.
class Person (
val name: String,
var age: Int
) {
// 초기화 되는 시점에 한 번만 호출이 되는 블록
init {
if (age < 0) {
trhow IllegalArgumentException("Invalid Age")
}
println("초기화 블록")
}
constructor(name: String): this(name, 1) {
println("1st secondary constructor")
}
constructor(): this("홍길동") {
println("2nd secondary constructor")
}
}
실행 순서는? → 초기화 블록, 첫 번째 부생성자, 두 번쨰 부생성자 순서대로 불린다.
코틀린은 부생성자보다는 default parameter 를 권장한다. 정적 팩토리 메소드를 추천하는 편이다.
커스텀 getter, setter
해당 클래스에서 성인인증 메서드를 추가하고자 한다.
class Person (
val name: String,
var age: Int
) {
// 초기화 되는 시점에 한 번만 호출이 되는 블록
init {
if (age < 0) {
trhow IllegalArgumentException("Invalid Age")
}
println("초기화 블록")
}
// 1. custom getter
val isAdult: Boolean
get() = this.age >= 20
// 2. custom getter
val isAdult: Boolean
get() {
return this.age >= 20
}
}
전통적인 함수 말고도, 프로퍼티처럼 만들 수 있다. 1, 2 번 처럼 두 가지 방식으로 선언할 수 있다는 점.
객체의 속성을 나타내는 거라면 custom getter 을 쓰고, 그게 아니라면 함수처럼 쓴다.
현재와 같이 성인인지를 확인하는, 객체의 속성을 확인하는 것이라면 custom getter를 쓰는 것이 낫다.
Person 의 name 이 밖에서 호출될 때, 자동으로 대문자로 바꿔주는 방법은?
class Person (
name: String, // 자동으로 만들어주지 않도록 하기 위해 val 을 빼준다.
var age: Int
) {
val name = name
get() = field.uppdercase() // field 라는 키워드가 들어가야한다. 무한루프가 발생하기 때문.
// 무한 루프를 막기 위한 예약어. 자기 자신을 가리키는 field 라는 예약어이다.
// 자기자신을 가리키는 보이지 않는 field
// 초기화 되는 시점에 한 번만 호출이 되는 블록
init {
if (age < 0) {
trhow IllegalArgumentException("Invalid Age")
}
println("초기화 블록")
}
// 1. custom getter
val isAdult: Boolean
get() = this.age >= 20
// 2. custom getter
val isAdult: Boolean
get() {
return this.age >= 20
}
}
다음과 같이 처리도 가능하다.
class Person (
name: String, // 자동으로 만들어주지 않도록 하기 위해 val 을 빼준다.
var age: Int
) {
val uppdercaseName: String
get() = this.name.uppdercase()
// 초기화 되는 시점에 한 번만 호출이 되는 블록
init {
if (age < 0) {
trhow IllegalArgumentException("Invalid Age")
}
println("초기화 블록")
}
// 1. custom getter
val isAdult: Boolean
get() = this.age >= 20
// 2. custom getter
val isAdult: Boolean
get() {
return this.age >= 20
}
}
정리
- 코틀린에서는 필드를 만들면 getter 와 setter 가 자동으로 생긴다. 때문에 이를 프로퍼티라고 부른다.
- 코틀린에서는 주생성자가 필수이다.
- 코틀린에서는 constructor 키워드를 사용해 부생성자를 추가로 만들 수 있다. 단 default parameter 나 정적 팩토리 메소드를 추천한다.
- 실제 메모리에 존재하는 것과 무관하게 custom getter, custom setter 을 만들 수 있다.
- custom getter, custom setter 에서 무한 루프를 막기 위해 field 키워드를 사용하고, 이것을 backing field 라고 부른다.
'[ Kotlin ]' 카테고리의 다른 글
코틀린에서 접근 제어를 다루는 방법 - 11강 (2) | 2024.08.28 |
---|---|
코틀린에서 상속을 다루는 방법 - 10강 (1) | 2024.08.28 |
코틀린에서 함수를 제어하는 방법 - 8강 (0) | 2024.08.23 |
코틀린에서 코드를 제어하는 방법 - 6강, 7강 (0) | 2024.08.23 |
코틀린에서 코드를 제어하는 방법 - 5강 (0) | 2024.08.22 |