라이브러리에 멤버 함수를 추가하고 싶다면?
우리에게 거의 완벽한 라이브러리가 있다면? 이 라이브러리를 활용하는 것이 좋을 것이다.
하지만, 이 라이브러리의 주인이 아니기 때문에 소스 코드에 접근하거나 변경 및 제어가 불가능하다.
또한, 수정한 내용을 새로운 버전이 나올때마다 반복 적용하는 것도 힘들기 때문에 우리는 코틀린에서 확장 함수에 대해서 학습해야 한다.
[ Extenstion funciton; 확장 함수 ]
확장 함수
: 기존 클래스에 멤버 함수를 추가하는 것과 같은 효과
: static 메서드로 오버라이드 불가능
: fun 수신객체타입.확장함수명():반환타임 {...} 으로 정의
: 클래스의 멤버 함수와 동일한 이름일 경우 우선순위에서 밀려남
: this는 멤버 함수나 다른 확장에 접근이 가능하며, 생략 가능
: 정의되지 않은 다른 패키지에서 사용 시 import 해야 사용이 가능하며, 동일한 확장 함수 이름이 있는 경우 as를 통해 이름 변경 필요
: 확장 대상 타입(수신 객체 타임)의 public 원소에만 접근이 가능하며, private/protected 메서드는 호출 불가능
import atomictest.eq
// 확장 함수 정의 : this는 멤버 함수나 다른 확장에 접근, 수신 객체를 가리킴
fun String.singleQuote() = "'$this'"
fun String.doubleQuote() = "\"$this\""
fun String.strangeQuote() = this.singleQuote().singleQuote
fun String.tooManyQuotes() = doubleQuote().doubleQuote() // this 생략
class Book(val title:String)
// 수신객체타입으로 클래스도 가능
fun Book.categorize(category:String) = """title: "$title", "category : $category"""
fun main(){
"Hi".singleQuote() eq "'Hi'"
"Hi".doubleQuote() eq "\"Hi\""
"Hi".strangeQuote() eq "''Hi''"
"Hi".tooManyQuotes() eq "\"\"Hi\"\""
Book("Dracula").categorize("Vampire") eq """title: "Dracula", category: Vampire"""
}
[ 오늘의 학습 소감 ]
오늘은 확장 함수라는 것을 배웠는데 지금까지의 아톰 중에 비교적 짧은 아톰이었지만 내용은 알찬 아톰이었다. 확장 함수가 무엇인지부터 어떻게 사용하는지 등에 대한 설명을 주로 다룬 아톰이었지만, 구글에 조금 검색을 해 보았을 때 내용이 굉장이 많고 중요해 보이는 느낌을 받았다. 아직은 기초 단계이지만 이를 활용했을 때 어떻게까지 활용할 수 있을지 조금 기대되는 아톰이었다.
'공부 자료 > 코틀린[Kotlin]' 카테고리의 다른 글
[Atomic 32] 오버로딩 (feat. overloading) (1) | 2024.02.05 |
---|---|
[Atomic 31] 이름 붙은 인자와 디폴트 인자 (0) | 2024.02.05 |
[Atomic 28] 프로퍼티 접근자(feat. getter / setter) (0) | 2024.01.30 |
[Atomic 27] 맵 (feat. Map) (1) | 2024.01.28 |
[Atomic 26] 집합 (feat. Set) (0) | 2024.01.27 |