1. 확장 함수
https://kotlinlang.org/docs/extensions.html
확장 함수는 클래스 상속이나 Decorator와 같은 디자인 패턴을 사용하지 않고도 기존 클래스나 인터페이스의 기능을 확장할 수 있는 함수이다.
쉽게 예를 들어보기 위해 Animal 클래스를 만들어 보았다.
class Animal {
fun makeSound() {
print("동물이 소리를 냅니다.")
}
}
Animal 클래스에 소리를 내는 기능을 가진 makeSound 메서드가 있지만, 여기에 걸을 수 있는 walk 기능을 추가하고 싶다.
그러면 Animal 클래스 안에 walk 메서드를 추가한다던지, 상속받는 방법이 있을 것이다.
class Animal {
fun makeSound() {
print("동물이 소리를 냅니다.")
}
fun walk() {
print("동물이 걸어갑니다.")
}
}
물론, 위 Animal 클래스에 walk 메서드를 추가하여 기능을 확장할 수 있지만,
외부 라이브러리의 클래스나 인터페이스에 대해 기능을 추가할 때는 위 방법이 어려울 것이다.
(기능 확장을 기능 추가라고 봐도 무방하다)
안드로이드 개발을 할 때, 필요한 기능을 추가하고 싶어도 Retrofit같은 외부 라이브러리 클래스는 수정하기 어려운 것과 같은 말이다.
이때 기능을 확장하고 싶지만, 클래스를 수정하기 어려울 때 사용하는 것이 확장 함수이다.
즉, 확장함수는 클래스를 수정(재작성)하지 않고도 기능을 추가(확장)할 수 있는 역할을 한다.
이제 확장함수를 사용하여 Animal 클래스에서 walk 기능을 확장해 보자.
class Animal {
fun makeSound() {
print("동물이 소리를 냅니다.")
}
}
// 확장 함수
fun Animal.walk() {
println("동물이 걸어갑니다.")
}
fun main() {
val animal = Animal()
animal.walk() // 출력: "동물이 걸어갑니다."
}
확장 함수를 만들기 위해서는 어떤 클래스에서 기능을 추가할 것인지 확인하고, .을 붙인 후, 메서드를 작성하면 된다.
여기서 어떤 클래스의 멤버처럼 동작할 것인지를 결정하는 부분이 수신 객체 타입이다.
위 코드에서 Animal이 수신 객체 타입이 된다.
이때, 우리가 알아야 할 점은 확장 함수는 클래스를 수정하지 않는다는 사실이다.
클래스에 새로운 메서드를 추가하는 것처럼 보이지만,
실제로는 컴파일러가 확장 함수의 호출을 마치 클래스의 메서드를 호출한 것처럼 변환한다.
따라서 확장 함수는 기존 클래스의 코드를 전혀 변경하지 않으면서도 추가적인 기능을 제공할 수 있으며,
특히 외부 라이브러리나 수정할 수 업슨 클래스에 대한 기능을 추가하고자 할 때 매우 유용하다.
이제 기존 클래스의 기능을 확장 함수를 사용하여 확장해 보자.
// String 클래스를 확장하여 문자열을 반복해서 출력하는 함수 추가
fun String.repeatPrint(count: Int) {
repeat(count) {
println(this)
// this : 호출된 객체(message)
}
}
fun main() {
val message = "Hello, Kotlin!"
message.repeatPrint(3)
}
2. 확장 프로퍼티 (Extension Property)
프로퍼티는 클래스나 객체에 속한 데이터를 나타내며, 코틀린에서는 이 프로퍼티에도 확장 기능을 지원한다.
val <T> List<T>.lastIndex: Int
get() = size - 1
T는 제네릭 타입 매개변수를 나타내며, List를 수신 객체 타입으로 지정했다.
lastIndex는 확장 프로퍼티의 이름이며, getter 함수를 통해 List의 크기에서 1을 뺀 값을 반환한다.
확장 프로퍼티는 함수와 마찬가지로 특정 클래스에 속한 것처럼 보이지만,
실제로 클래스에 멤버를 추가하지는 않는다.
일반적으로 클래스 내의 프로퍼티는 그 클래스의 일부로 컴파일되어 해당 클래스의 인스턴스와 함께 메모리에 저장될 수 있다.
하지만 확장 프로퍼티는 클래스에 속하지 않으므로 이러한 방식으로 값을 저장할 수 없다.
즉, 확장 프로퍼티는 실제 클래스의 일부가 아니기 때문에 해당 클래스의 인스턴스에 대한 직접적인 메모리 공간을 가지지 않는다.
따라서, 확장 프로퍼티는 명시적인 getter와 setter를 제공하여 값을 계산하거나 다른 속성에 의존하여 값을 설정한다.
getter와 setter에 대해 알고 싶다면 더 보기 클릭!
1. Getter(게터):
- Getter는 프로퍼티의 값을 반환하는 메서드이다.
- 프로퍼티를 읽을 때 호출된다.
- Kotlin에서는 일반적으로 프로퍼티를 선언할 때 getter가 자동으로 생성된다.
- 직접 getter를 정의할 수도 있으며, 이 경우에는 get() 키워드를 사용한다.
2. Setter(세터):
- Setter는 프로퍼티에 값을 할당하는 메서드이다.
- 프로퍼티에 값을 할당할 때 호출된다.
- Kotlin에서는 var로 선언된 프로퍼티에 대해서만 setter가 자동으로 생성된다.
- 직접 setter를 정의할 수도 있으며, 이 경우에는 set() 키워드를 사용한다.
'Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린 컬렉션 (Collection) (0) | 2023.05.17 |
---|---|
[Kotlin] 코틀린 배열 arrayOf(), intArrayOf(), Array (0) | 2023.05.15 |
[Kotlin] 코틀린 반복문 for, while, do while 반복문 활용 (0) | 2023.05.08 |
[Kotlin] 코틀린 조건문 if-else 와 when 사용법 파헤치기 (0) | 2023.05.03 |
[Kotlin] 코틀린 메소드 (Method) 선언하기 : 메소드 정의, 함수의 타입, 매개변수, 반환값 정의 방법 (0) | 2023.05.02 |