최상위 함수 & 최상위 프로퍼티
- 최상위 프로퍼티에 val, var 모두 사용가능.
- 상수를 선언할 때에는 const val AGE = "24"
확장 함수
- 기존에 만들어져 있는 클래스의 함수를 외부에서 추가하여 확장시킴.
fun String.lastChar(): Char = this[this.length - 1]
커스텀 접근자의 Backing field
- 프로퍼티는 값을 직접 저장하는 프로퍼티와 커스텀 접근자를 활용해 매번 새로운 값을 계산하는 프로퍼티가 존재
class User(val name: String) {
var address: String = "unselected"
set(value: String) {
// backing field는 `field`로 접근가능 (get에서는 field를 참조할 수 있지만 읽기만 가능하다.)
print("백킹 필드값(이전값): $field, 새로운 값: $value")
field = value
}
}
fun main() {
val aUser = User("name")
aUser.address = "서울시" // setter 호출
aUser.address = "부산시" // setter 호출
// ## 출력 ##
// 백킹 필드값(이전값): unselected, 새로운 값: 서울시
// 백킹 필드값(이전값): 서울시, 새로운 값: 부산시
}
Object 키워드
- 클래스 선언과 동시에 인스턴스를 생성하여 싱글톤을 보장해준다.
object StringComparator : Comparator<String> {
override fun compare(o1: String?, o2: String?): Int {
TODO("Not yet implemented")
}
}
data class Person(val name: String) {
// 중접 객체로도 사용하며 외부에서 정적 메서드를 호출하는 거처럼 접근이 가능해진다.
object NameComparator : Comparator<String> {
override fun compare(o1: String?, o2: String?): Int {
TODO("Not yet implemented")
}
}
}