본문 바로가기
Language/Kotlin

Kotlin 확장 함수 (Extension Functions)

by 시니성 2023. 8. 28.

코틀린에서는 기존 클래스에 새로운 메서드를 추가하는 것처럼 확장 함수(extension function)를 사용하여 해당 클래스의 메서드처럼 동작하게 만들 수 있습니다. 이는 실제로 해당 클래스를 변경하거나 상속하지 않고도 가능합니다.

확장 함수의 장점

  1. 모듈성: 기존 코드를 수정하지 않고도 새로운 기능을 추가할 수 있습니다.
  2. 유연성: 라이브러리나 API 등 외부 소스코드를 수정하지 않고도 확장 함수를 사용해 기능을 추가할 수 있습니다.
  3. 읽기 쉬운 코드: 확장 함수를 통해 더 직관적이고 읽기 쉬운 코드를 작성할 수 있습니다.

물론이죠. 다른 예시를 들어보겠습니다.

예시 시나리오

Int 클래스에는 해당 정수가 홀수인지를 확인하는 함수가 내장되어 있지 않습니다. 이를 확인하기 위해서는 주로 % 연산자를 사용하여 2로 나눈 나머지를 확인합니다. 하지만 확장 함수를 이용하면 Int 클래스에 이러한 기능을 "추가"할 수 있습니다.

예시 코드

// 1. Int 클래스에 "isOdd"라는 확장 함수를 정의합니다.
fun Int.isOdd(): Boolean {
    // this는 확장 함수 내부에서 수신 객체(receiver object)를 참조하기 위해 사용됩니다.
    // 여기서 수신 객체는 확장 함수를 호출하는 Int 인스턴스를 말합니다.
    return this % 2 == 1
}

fun main() {
    val number = 5

    // 2. 정의한 확장 함수를 Int 객체에 대해 호출합니다.
    if (number.isOdd()) {
        println("$number is an odd number")  // 출력: "5 is an odd number"
    } else {
        println("$number is an even number")
    }
}

상세 설명

  • fun Int.isOdd(): Int 클래스에 isOdd라는 이름의 확장 함수를 정의합니다.
  • return this % 2 == 1: 여기서 this는 확장 함수가 호출되는 Int 객체를 참조합니다. % 연산자를 사용하여 2로 나눈 나머지가 1인지 확인하여 홀수 여부를 반환합니다.
  • val number = 5: number이라는 변수에 5라는 정수 값을 할당합니다.
  • if (number.isOdd()): isOdd 확장 함수를 number에 대해 호출하여 홀수인지 확인합니다.
  • println("$number is an odd number"): 홀수일 경우 해당 메시지를 출력합니다.

이러한 방식으로 확장 함수는 기존 클래스에 새로운 기능을 추가하는 것처럼 사용할 수 있으며, 특히 외부 라이브러리나 API의 클래스에 추가적인 기능을 부여할 때 유용하게 사용됩니다.