[Kotlin] 확장 함수와 프로퍼티
코틀린 확장 함수
코틀린은 기존 클래스에 메소드를 추가할 수 있습니다.
이를 확장 함수라고 합니다.
하지만 기존 클래스에 대해 메소드를 확장적으로 선언을 할 수 있을 뿐,
해당 클래스의 구현부를 바꿀 수는 없습니다.
기존 클래스는 그대로 두고 클래스 주변에 새로운 함수를 추가하여 클래스의 크기를 확장한다.
라고 생각하면 좋을 것 같습니다.

String 클래스의 메소드인것 처럼 사용할 수 있는 lastChar 메소드를 확장해보겠습니다.
확장 함수의 선언 방법은 아래와 같습니다.
fun String.lastChar():Char = this.get(this.length - 1)
// this 생략 가능
fun String.lastChar():Char = get(length - 1)
// 사용시
println("Charming".lastChar()) // "g"
- String.lastChar() 중 String을 수신 객체 타입(receiver type)이라고 합니다.
- lastChar()은 확장 함수의 이름이고, Char는 반환 타입입니다.
- 구현부인 this.get(this.length - 1) 중 this를 수신 객체(receiver object)라고 합니다.
- 확장 함수의 블럭 안에서는 this.get() 처럼 원래 가지고 있는 메소드를 호출할 수 있으며
this는 생략할 수 있습니다. - 단, private, protected 접근 제어자로 선언되어 있는 메소드는 확장 함수에서 호출할 수 없습니다.
제네릭을 이용하면 더 유연하고 안정적인 확장 함수를 만들 수 있습니다.
// String 제네릭
fun Collection<String>.join(
separator: String = ",",
prefix: String = "(",
postfix: String = ")"
): String {
// ...
}
fun main() {
val stringList = listof("1", "2", "3", "4")
println(stringList.join()) // (1,2,3,4)
val intList = listOf(1, 2, 3, 4)
println(intlist.join()) // Int 타입은 불가능
}
확장 함수 오버라이드
확장 함수는 static 메소드이고 클래스 밖에 선언되기 때문에 오버라이드 할 수 없습니다.
open class Animal(age: Int)
fun Animal.eat() {
println("Animal Eat")
}
class Dog(age: Int, name: String) : Animal(age)
fun Dog.eat() {
println("Dog Eat")
}
fun main() {
val choco: Animal = Dog(3, "choco")
choco.eat() // Animal Eat
}
위와 같이 Animal을 상속받은 Dog가 있습니다.
Animal과 Dog 클래스는 eat()이라는 확장 함수를 가지고 있습니다.
하지만 확장 함수는 static 메소드이기 때문에 Dog 클래스임에도 불구하고 Animal의 확장 함수가 실행되었습니다.
중복된 확장 함수
확장 함수의 이름이 중복될 경우 import 할 때 이름을 변경할 수 있습니다.
// StringJoin.kt
package com.charming.learn.kotlin.function.other
fun String.lastChar():Char = this.get(this.length - 1)
// ExtendFunction.kt
package com.charming.learn.kotlin.function.extend
fun String.lastChar():Char = this.get(this.length - 1)
위 처럼 StringJoin.kt 와 ExtendFunction.kt에서 같은 이름으로 선언되어 있는 확장 함수인 lastChar() 를 사용할때
"... cannot be invoked as a function."라는 에러가 발생합니다.
이럴 경우 import 할 때 as 키워드를 이용하여 해결할 수 있습니다.
import com.charming.learn.kotlin.function.other.lastChar
import com.charming.learn.kotlin.function.extend.lastChar as last // last 로 이름을 변경
//확장 함수 사용
"charming".lastChar() // other 패키지에 있는 lastChar() 사용
"charming".last() // extend 패키지에 있는 lastChar() 사용
확장 프로퍼티
클래스의 프로퍼티도 확장할 수 있습니다.
다만, 확장 프로퍼티는 상태를 저장할 수 없기 때문에 초기화할 수 없고 get()을 구현해야합니다.
그리고 가변적으로 변할 수 있는 클래스의 프로퍼티의 경우 get()과 set()을 추가할 수 있습니다.
(var로 선언해야 함)
// 확장 프로퍼티 선언
val String.lastChar: Char
get() = get(length - 1)
// 가변적인 확장 프로퍼티의 경우 var로 선언
var StringBuilder.lastChar: Char
get() = get(length - 1)
set(value: Char) {
this.setCharAt(length - 1, value)
}
fun main() {
println("Charming".lastChar) // g
val sb = StringBuilder("Charming?")
sb.lastChar = '!'
println(sb) // charming!
}
'Kotlin' 카테고리의 다른 글
Javascript Promise로 배우는 Kotlin Coroutine (2) | 2022.10.09 |
---|---|
Kotlin 리플렉션(Reflection) (2) | 2022.09.06 |
[Kotlin] companion object, Java static 차이점 (0) | 2022.05.15 |
[Kotlin] coroutine, suspend 함수 정리 및 예제 (0) | 2022.04.19 |
[Kotlin] Scope 함수 (let, run, with, apply, also) (0) | 2022.03.27 |
댓글
이 글 공유하기
다른 글
-
Kotlin 리플렉션(Reflection)
Kotlin 리플렉션(Reflection)
2022.09.06리플렉션(Reflection)이란? 리플렉션은 말 그대로 '반사', '반영'의 의미를 가지고있습니다. 구체적인 클래스 타입을 알지 못하더라도 바이트코드를 이용해 해당 클래스의 메소드, 타입, 변수들을 참조하여 값을 찾을 수 있는 JAVA API입니다. 즉 컴파일 시점이 아닌 런타임에 동적으로 특정 클래스의 정보를 추출할 수 있고 변수를 변경하거나 메소드를 호출할 수 있는 프로그래밍 기법입니다. 코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를 가져와서 실행해야 하는 경우 사용됩니다. intelliJ의 자동완성 기능, Lombok, Spring Container, Spring annotation 등에서 사용됩니다. 리플렉션은 아래와 같은 정보들을 가… -
[Kotlin] companion object, Java static 차이점
[Kotlin] companion object, Java static 차이점
2022.05.15이 글은 코틀린의 companion object와 Java의 static 키워드의 차이점에 대해 학습한 것을 정리하였습니다. object class 코틀린은 자바에 없는 독특한 싱글톤(Singleton) 선언 방법이 있습니다. 아래처럼 class 키워드 대신 object 키워드를 사용하면 됩니다. object Singleton { val name = "singleton" fun print() = println("hello") } fun main() { println(Singleton.name) // "singleton" Singleton.print() // "hello" val singleton = Singleton() // 에러! } object 키워드로 선언한 속성과 메소드는 static 키워드로 선… -
[Kotlin] coroutine, suspend 함수 정리 및 예제
[Kotlin] coroutine, suspend 함수 정리 및 예제
2022.04.19Coroutine 코루틴이란. 실행의 지연과 재개를 허용함으로서, 비선점 멀티테스킹을 위한 서브루틴을 일반화한 구성요소입니다. 자세히 이해하기 위해 서브루틴과 비선점 멀티테스킹 두가지 개념을 알아야 합니다. 루틴과 서브루틴 루틴은 컴퓨터 프로그램에서 하나의 정리된 일(job)입니다. 프로그램은 보통 크고 작은 여러가지 루틴을 조합시킴으로써 만들어집니다. 루틴은 다시 메인루틴과 서브루틴으로 나뉩니다. 메인루틴은 프로그램 전체의 개괄적인 동작 절차를 표시하도록 만들어 집니다. 서브루틴은 반복되는 특정 기능을 모아 별도로 묶어 이름을 붙여 놓은 것입니다. 그리고 별도의 메모리에 해당 기능을 모아놓고 서브루틴이 호출될 때마다 저장된 메모리로 이동했다가 return 을 통해 원래 호출자의 위치로 돌아오게 됩니다…. -
[Kotlin] Scope 함수 (let, run, with, apply, also)
[Kotlin] Scope 함수 (let, run, with, apply, also)
2022.03.27
댓글을 사용할 수 없습니다.