코틀린에서 확장 함수(Extension Function)는 기존 클래스에 새로운 함수를 추가할 수 있는 기능입니다. 이를 통해 코틀린은 자바와 같은 언어에서 볼 수 있는 보일러플레이트 코드를 줄이고, 코드를 더 간결하게 만들 수 있습니다. 확장 함수는 수신 객체(receiver object)에 새로운 함수를 추가하는 것으로, 수신 객체의 멤버 함수처럼 호출할 수 있습니다. 이를 통해 기존 클래스에 메소드를 추가하거나 변경할 수 있습니다.
1. 기본 형식
// String 클래스에 확장 함수 추가
fun String.addExclamation(): String {
return "$this!"
}
- String 클래스에 addExclamation이라는 확장 함수를 추가하였습니다.
- this는 수신 객체를 나타냅니다.
2. 사용 예제
val greeting = "Hello"
val excitedGreeting = greeting.addExclamation()
println(excitedGreeting) // 출력: Hello!
기존의 String 클래스에는 addExclamation 함수가 없었지만, 확장 함수를 통해 이를 사용할 수 있게 되었습니다.
3. 확장 함수의 매개변수
fun String.repeat(n: Int): String {
return this.repeat(n)
}
확장 함수에 매개변수를 추가할 수 있습니다.
4. Nullable 수신 객체
fun String?.isNullOrEmpty(): Boolean {
return this == null || this.isEmpty()
}
수신 객체가 nullable일 수 있습니다.
5. 확장 함수로 컬렉션 조작
fun List<Int>.customSum(): Int {
var sum = 0
for (element in this) {
sum += element
}
return sum
}
컬렉션에 대한 확장 함수를 추가하여 사용할 수 있습니다.
6. 확장 함수로 DSL 구현
class Person {
var name: String = ""
var age: Int = 0
}
fun person(init: Person.() -> Unit): Person {
val person = Person()
person.init()
return person
}
DSL(Domain-Specific Language)을 만들기 위해 확장 함수를 사용하는 예시입니다.
7. 컴패니언 객체에 확장 함수 추가
class MyClass {
companion object {
fun sayHello() {
println("Hello from companion object!")
}
}
}
fun MyClass.Companion.sayHi() {
println("Hi from extension function!")
}
컴패니언 객체에도 확장 함수를 추가할 수 있습니다.
확장 함수는 해당 클래스의 내부에 직접적인 변경이 일어나지 않으며, 새로운 함수를 추가하는 것이므로 기존 코드를 수정하지 않고도 확장 함수를 통해 기능을 확장할 수 있습니다. 하지만 남용하면 코드의 가독성이 떨어질 수 있으므로 적절하게 사용해야 합니다.
With ChatGPT