확장 함수 정의 방법
String
클래스에lastChar
라는 확장 함수를 추가하려면?
package strings
fun String.lastChar(): Char = this.get(this.length - 1)
- this
- 수신 객체를 의미합니다
- String 클래스의 인스턴스에 대해 호출가능
fun main() {
println("Kotlin".lastChar())
}
//n
"Kotlin"
- 이 수신 객체가 되며
lastChar
확장함수는
String
의 일부처럼 호출이 가능하다.
- 이 수신 객체가 되며
특징
캡슐화
- 확장함수는 캡슐화를 깨지 않는다
- private 와 protected 는 접근할 수 없다.
- 호환성면
- 자바나 코틀린 등의 언어와 관계없이 JVM 언어로 작성된 클래스에 적용이 가능하다.
- 유연성
- 기존 클래스의 코드 변경 없이 새로운 메서드를 추가가능하다.
확장함수 응용
fun <T> Collection<T>.joinToString(
separator: String = ", ",
prefix: String = "",
postfix: String = ""
): String {
val result = StringBuilder(prefix)
for ((index, element) in this.withIndex()) {
if (index > 0) result.append(separator)
result.append(element)
}
result.append(postfix)
return result.toString()
}
- Collection<T> 에 확장 함수를 정의하는 방법?
this
를 통해 확장 함수가 호출되는 수신 객체Collection<T>
인스턴스를 가리킨다.
println(list.joinToString(separator = "; ", prefix = "(", postfix = ")"))
joinToString = (one two eight)
확장 함수의 한계점
- 오버라이딩 불가
- 오버라이딩 불가능
- 하위 클래스에서 확장 함수를 재정의하는 것은 불가능
- 정적 메서드로 취급
- 내부적으로 확장 함수는 해당 클래스의 정적 메서드로 컴파일됨.
- 확장 함수가 수신 객체의 private protected 등의 멤버가 접근할 수 없음
Uploaded by N2T
'코틀린 > 코틀린인액션' 카테고리의 다른 글
[코틀린인액션] 코틀린에서 컬렉션 만들기 (0) | 2023.11.29 |
---|---|
[코틀린인액션] 코틀린에서의 디폴트 파라미터 자바에서도 사용해보기 (0) | 2023.11.29 |
[코틀린인액션]`in` 의 사용 (0) | 2023.11.29 |
[코틀린인액션] 맵 과 리스트 이터레이션 (0) | 2023.11.26 |
[코틀린인액션] 함수 (0) | 2023.11.23 |