본문 바로가기
개발새발/코틀린

[코틀린/Kotlin] 확장함수

by 조희우 2025. 8. 19.

확장 함수

  • 기존 클래스에서 새 함수를 추가하는 기능
  • 기존 클래스의 코드를 수정하지 않고 기능 확장
  • 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()
}