1. 접근 지정자
코틀린에서 선언 가능한 요소(함수, 전역변수, 클래스, 프로퍼티, 멤버함수 등) 중, 일부 요소에는 접근 권한이라는 것을 지정할 수 있다. 이를 접근 지정자 또는 가시성 지정자라고 한다.
코틀린에서 접근 지정자는 총 4개가 있다.
class Rectangle(private val width: Int, private val height: Int) {
val area: Int
get() = width * height
}
fun main() {
val rect = Rectangle(5, 7)
// println(rect.width) // 에러 발생
println(rect.area)
}
다음과 같은 곳에 접근 지정자를 붙일 수 있다.
접근 지정자 class 식별자 접근 지정자 constructor() {
접근 지정자 val[var] 식별자
접근 지정자 get() =
접근 지정자 set(value) =
접근 지정자 constructor(): this()
접근 지정자 fun 식별자
}
// 전역 변수에만 접근 지정자 지정 가능
접근 지정자 val[var]
접근 지정자 fun 식별자()
2. 접근 지정자 오버라이딩
오버라이딩을 통해 protected인 프로퍼티나 멤버 함수의 접근 지정자를 public으로 변경할 수 있다.
private 접근 지정자는 open 키워드 자체를 사용할 수 없으며, 당연히 오버라이딩도 불가능하다.
open class AAA(protected open val number: Int) {
protected open fun hello() {
println("hello")
}
}
class BBB(number: Int): AAA(number) {
public override val number: Int
get() = super.number
public override fun hello() = super.hello()
}
fun main() {
val b = BBB(2)
val a: AAA = b
//println(a.number) // 에러 Kotlin: Cannot access 'number': it is protected in 'AAA'
//a.hello() // 에러
println(b.number)
b.hello()
}
위의 코드를 요약하여 설명하자면..
protected 프로퍼티 number를 갖는 AAA 클래스를 선언.
오버라이딩이 가능하도록 number 프로퍼티에는 open 키워드를 붙임.
protected 멤버 함수 hello 선언. 오버라이딩 가능하도록 open 키워드를 붙임
number 프로퍼티를 오버라이딩하면서 접근 지정자를 public으로 바꿈.
hello 멤버 함수를 오버라이딩하면서 접근 지정자를 public으로 바꿈.
동일한 BBB의 인스턴스를 AAA타입과 BBB타입으로 가리키고 있음.
a는 AAA 타입이므로 protected인 number 프로퍼티와 hello 멤버 함수에 에 접근하면 오류 발생.
b는 BBB 타입이므로 public으로 오버라이딩된 number 프로퍼티와 hello 멤버 함수에 접근 가능
3. 확장 함수
String은 코틀린에 내장된 클래스이기 때문에 마음대로 멤버 함수를 추가할 수 없다.
String 클래스를 상속하려해도 open 키워드가 없어 불가능하다.
확장 함수라는 문법을 이용하면 상속 없이 클래스 외부에서 멤버 함수를 추가할 수 있다.
확장 함수를 선언하는 방법은 함수 이름 앞에 '함수를 주입할 클래스.' 를 붙여주면 된다.
여기서 함수를 주입할 클래스는 리시버(Receiver) 타입이다.
this를 사용하면 리시버 타입의 프로퍼티나 멤버 함수에 접근할 수 있다.
단, private 이거나 protected인 멤버에는 접근할 수 없다.
만약, 클래스에 이미 존재하는 멤버 함수와 동일한 시그니처의 확장 함수가 있다면 오류는 나지 않지만, 확장 함수가 가려져 멤버 함수만 항상 호출한다.
// 문자열이 숫자로만 이루어져있는지 판단하는 확장 함수
fun String.isNumber(): Boolean {
var i = 0
while(i < this.length) {
// 숫자가 아닌 문자가 하나라도 들어있으면 false 반환
if(!('0' <= this[i] && this[i] <= '9'))
return false
i += 1
}
// 모든 조건을 통과하면 true 반환
return true
}
fun main() {
println("1234567890".isNumber())
println("500 원".isNumber())
}
4. 확장 프로퍼티
확장 프로퍼티도 확장 함수처럼 프로퍼티 이름 앞에 리시버 타입을 적는다.
확장 프로퍼티에는 Field가 존재하지 않아 field 식별자는 사용할 수 없다.
// 문자열이 큰지 판단하는 확장 프로퍼티
val String.isLarge: Boolean
get() = this.length >= 10
fun main() {
println("1234567890".isLarge) // true
println("500 원".isLarge) // false
}
'TIL > Kotlin' 카테고리의 다른 글
[TIL/Kotlin] 코틀린 고급문법_inline 함수, const, lateinit (0) | 2023.05.17 |
---|---|
[TIL/Kotlin] 코틀린 고급문법_객체 선언과 동반자 객체 (0) | 2023.05.17 |
[TIL/Kotlin] 코틀린 중급문법_스마트 캐스팅, is 연산자, as 연산자와 다운캐스팅 (0) | 2023.05.14 |
[TIL/Kotlin] 코틀린 중급문법_Nothing타입, Nullable, ?. 연산자, !! 연산자, ?: 연산자 (0) | 2023.05.14 |
[TIL/Kotlin] 코틀린 중급문법_예외 처리, 예외 던지기 (0) | 2023.05.14 |