본문 바로가기
Kotlin Language/Kotlin 기본 문법

Kotlin(코틀린) - 확장함수(Extension functions)

by Classic Master 2023. 12. 7.
728x90

확장함수(Extension Functions)?

  • 이미 존재하는 클래스에 새로운 함수를 추가하는 메커니즘을 제공합니다. 이는 기존 클래스를 수정하지 않고도 해당 클래스에 새로운 기능을 추가할 수 있는 강력한 기능입니다. 확장 함수는 클래스의 멤버 함수처럼 호출될 수 있으며, 새로운 기능을 제공하기 위해 클래스 외부에서 정의됩니다.

확장함수는 언제 사용할 수 있을까?

  • 확장 함수는 주로 기존 클래스나 라이브러리를 수정할 수 없는 상황에서 새로운 기능을 추가하거나 사용성을 향상시킬 때 유용하게 사용됩니다. 외부 라이브러리를 확장하여 해당 라이브러리가 제공하지 않는 기능을 쉽게 추가하거나, 코드의 가독성을 높이기 위해 유틸리티 함수를 만들 때 확장 함수를 활용할 수 있습니다.
  • 확장 함수는 이미 존재하는 클래스에 새로운 멤버 함수를 추가하는 형태이므로, 해당 클래스의 수정이 불가능한 경우나 여러 프로젝트에서 일관된 인터페이스를 유지하고 싶을 때 활용됩니다. 특히 안드로이드 개발에서는 안드로이드 프레임워크나 서드파티 라이브러리를 확장하여 앱의 요구에 맞는 기능을 간편하게 추가할 때 효과적으로 사용됩니다.
  • 요약하면, 확장 함수는 기존 클래스나 라이브러리에 손쉽게 새로운 기능을 추가하거나 유틸리티 함수를 제공할 때 활용되며, 특히 외부 라이브러리와의 통합이 필요한 상황에서 강력한 도구로 사용됩니다.

확장함수의 특징?

간편한 확장 기능 추가

  • 확장 함수를 사용하면 기존 클래스에 간편하게 새로운 함수를 추가할 수 있습니다. 이는 기존 클래스의 소스 코드를 수정할 필요가 없이 새로운 기능을 제공할 수 있게 해줍니다.

보일러플레이트 코드 감소

  • 확장 함수를 통해 반복되는 코드를 줄일 수 있습니다. 특히 유틸리티 함수나 자주 사용되는 기능을 확장 함수로 작성하면 코드의 가독성을 향상시키고 유지보수를 용이하게 만듭니다.

정적 바인딩

  • 확장 함수는 정적 바인딩(Static Binding)됩니다. 이는 컴파일 시간에 호출 대상이 정해지며 실행 시간에 동적으로 바뀌지 않는다는 것을 의미합니다. 정적 바인딩은 호출되는 함수가 컴파일 시점에서 이미 결정되므로, 성능 측면에서 이점을 가집니다.

클래스 외부에서 함수 추가 

  • 이미 정의된 클래스에 속하지 않은 함수를 추가할 수 있습니다. 이는 클래스를 열지 않고도 외부에서 해당 클래스에 새로운 기능을 제공할 수 있는 유연성을 제공합니다.

Nullable 타입과 함께 사용 가능

  • 확장 함수는 nullable 타입에도 사용할 수 있습니다. 즉, 기존 클래스나 타입이 nullable일 때에도 해당 기능을 추가할 수 있습니다.

확장함수 사용법

멤버 접근 

fun String.customExtensionFunction(): Int {
    return this.length // String 클래스의 length 멤버에 접근
}

fun String.customExtensionFunction(): Int {
    return length // this 생략 가능
}

 

수신 객체 조작

fun StringBuilder.appendExclamation(): StringBuilder {
    this.append("!")
    return this
}

fun String.customExtensionFunction(): Int {
    return this.length // this 명시적 사용
}

 

this 생략 가능

val text = "Hello, Kotlin!"
val length = text.customExtensionFunction() // this 생략하여 호출
  • text 문자열에 대해 customExtensionFunction 확장 함수를 호출할 때 this를 사용하지 않습니다. 호출 시에는 이미 확장 함수가 적용되는 대상인 text가 명시되어 있습니다.
  • 이처럼 this를 사용하여 확장 함수 본문에서 수신 객체에 접근할 수 있고, 호출 시에는 이미 수신 객체가 명시되어 있어 this를 사용하지 않습니다.

확장함수 예제

// 수신 객체 타입(String)과 함께 함수를 정의
fun String.customExtensionFunction(): String {
    return this.toUpperCase()
}

// 사용 예제
val originalString = "hello"
val result = originalString.customExtensionFunction()
println(result) // 출력: "HELLO"
  • 위의 예제에서 customExtensionFunction은 String 클래스에 추가된 확장 함수입니다. 이 함수는 호출된 문자열을 대문자로 변환하여 반환합니다.

 

String 확장 함수
fun String.countWords(): Int {
    return this.split("\\s+".toRegex()).size
}
fun main() {
    val sentence = "Hello, MyName Is elise."
    val wordCount = sentence.countWords()
    println("단어 개수: $wordCount")
}

 

  • 문자열(String)에 대한 확장 함수인 countWords를 정의합니다. 이 함수는 정규식을 사용하여 문자열을 공백을 기준으로 나눈 후 단어의 개수를 세어 반환합니다. main 함수에서는 이 확장 함수를 활용하여 문장의 단어 개수를 출력합니다.

 

List 확장 함수 - 짝수만 필터링
fun List<Int>.filterEvenNumbers(): List<Int> {
    return this.filter { it % 2 == 0 }
}
fun main() {
    val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    val evenNumbers = numbers.filterEvenNumbers()
    println("짝수만 필터링된 리스트: $evenNumbers")
}
  • 정수 리스트(List<Int>)에 대한 확장 함수인 filterEvenNumbers를 정의합니다. 이 함수는 주어진 리스트에서 짝수만 필터링하여 새로운 리스트로 반환합니다. main 함수에서는 이 확장 함수를 사용하여 주어진 리스트에서 짝수만을 출력합니다.
728x90
반응형