확장 함수
- 기존 클래스에서 새 함수를 추가하는 기능
- 기존 클래스의 코드를 수정하지 않고 기능 확장
- kotlin의 클래스는 기본적으로 final이므로 open이 없으면 상속이 어려움
- Extension, 확장을 사용하여 기능 추가
- 사용 방법
- fun 클래스명.확장함수명() {...}
기본 문법 예시
// String 클래스에 확장 함수 추가
fun String.addExclamation(): String {
return this + "!"
}
fun main() {
val greeting = "Hello"
println(greeting.addExclamation()) // 출력: Hello!
}
- this는 호출한 객체(String)을 가리킴
- 확장 함수는 마치 해당 클래스의 멤버 함수처럼 호출 가능
주의
- 확장 함수는 실제 멤버 함수가 아님
- 멤버 함수와 이름이 동일할 경우 멤버 함수가 우선 호출됨
- null 안정성 확장 함수도 만들 수 있음
확장 프로퍼티
- 멤버 변수도 확장 가능
- 확장함수와 같이 클래스나 프로퍼티가 추가되는 것은 아님
- get/set 설정 가능
- 확장 프로퍼티 사용 시에는 getter을 필수로 정의
예시
val String.lastChar: Char
get() = get(length - 1) // 초기화
fun main() {
println("Gold".lastChar) // d 출력
}
var StringBuilder.lastChar: Char
get() = get(length - 1)
set(value: Char) {
this.setCharAt(length - 1, value)
}
fun main() {
val sb = StringBuilder("Gold")
sb.lastChar = 'f'
println(sb) // golf
}
문제
1. Int 클래스에 isEven()이라는 확장 함수를 만들어서 짝수면 true, 아니면 false를 반환하는 함수를 구현하기.
답:
fun Int.isEven(): Boolean{
return this % 2 == 0
}
2. List<Int> 클래스에 averageOrZero() 확장 함수를 만들어서 리스트가 비어있으면 0.0을 반환하고, 아니면 평균값을 반환하는 함수를 구현하기.
답:
fun List<Int>.averageOrZero(): Double{
return if this.isEmpty() 0.0 else this.average()
}
'개발새발 > 코틀린' 카테고리의 다른 글
[코틀린/Kotlin] 스코프 함수 (0) | 2025.08.21 |
---|---|
[코틀린/Kotlin] null처리와 스마트캐스트 (0) | 2025.08.20 |
[코틀린/Kotlin] 람다와 고차함수 (3) | 2025.08.18 |
[코틀린/Kotlin] 컬렉션 (3) | 2025.08.16 |
[코틀린/Kotlin] 상속과 인터페이스/추상클래스 (2) | 2025.08.13 |