본문 바로가기
Android 개발/Kotlin

Kotlin 확장 함수 및 Property 에 대한 정리 # Extension Functions

by Developer88 2022. 10. 4.
반응형

Kotlin을 이용하면 기존 Class와 Interface의 확장이 매우 용이합니다.

오늘은 이러한 확장을 가능하게 하는 중요한 개념인 Extension Functions 와 Extension Property에 대해서 정리해 보겠습니다.

 

1. Extension Functions 와  Extension Properties

1-1. Extension Functions 와  Extension Properties  

여기서 사용된 Extention의 뜻은 확장 또는 연장인데요.

Kotlin에서는 Class나 Interface를,

다른 Class나 Interface에서 상속받지 않고도,

함수를 추가하거나 Property를 추가함으로서 확장할 수 있는 능력을 제공해주고 있습니다.

 

예를 들어서, 만약 Retrofit이나 Glide같은 외부라이브러리의 Class를 변형할 수는 없을 텐데요.

여기에 함수나 프로퍼티를 확장하여서 추가함으로서, 기존 메소드처럼 쉽게 사용할 수 있습니다.

 

무엇보다도 상속받거나 특별한 디자인 패턴을 쓰지 않으면서,

기존 Class에 안전하게 추가시킬 수 있다는 것이 큰 장점인데요.

동시에 코드도 매우 간결해져서 읽기도 매우 쉬워지구요.

 

2. Extension Functions 구현

Extension Function의 구현은,

기존 클래스에 "."(닷)으로 연결한 다음,

Extension(확장)할 함수명과 return타입을 적어주고 구현체를 "{ }"안에 넣어주면 되는데요.

여러가지 예를 보면서 정리해 보겠습니다.

 

아래에서는, String 함수에 testWorld()라는 함수를 추가한 다음,

String에 바로 사용해 주었습니다.

 

 

Genric 타입에도 이것을 적용할 수 있는데요.

대신 함수앞에도 아래와 같이 Generic 타입을 선언해 주어야 합니다.

 

 

 

다른 예도 보도록 하겠습니다.

첫번째는, Realm클래스에 studentDao()라는 메소드를 추가해서 StudentDao클래스의 객체를 호출하도록 하는 것 이구요.

두번째 코드는 RealmResults의 Generic타입에 asLiveData()라는 메소드를 추가하였습니다.

이것은 LiveRealmData라는 Wrapper클래스의 객체를 만들어주는 메소드 입니다.

 

 

조금 더 복잡한 케이스도 보도록 하겠습니다.

아래 코드는 고차함수와 inline키워드를 같이 사용하였는데요.

먼저 extentionFunction을 이용해 showMeHash함수를 추가하였습니다.

mapper를 이용해서 함수의 사용자가 Lambda식에서  hashcode에 접근할 수 있도록 하였습니다.

(혹시 고차함수나 inline에 대해서는 아래 링크된 글의 4-2. Higher-order functions(고차 함수) 및 inline함수를 참조해 주시면 됩니다.)
>> Kotlin을 배워보자 part1(Basic Types, Function, Null, 타입 변환, Lambda)

 

 

익스텐션은 Nullable로  receiver 타입을 할수도 있는데요.

아래와 같이 Nullable한 타입을 받아서, null체크를 할 수도 있습니다.

 

 

Kotlin의 Coroutine에는 CoroutineScope의 확장함수로서 launch가 들어가 있는데요.

이것은 coroutine이 설계된 디자인에 따라 멤버함수가 아닌 확장함수로 들어간 케이스입니다.

기존 Class를 가져다 쓸데만이 아니라, 설계상의 이유로 확장함수를 쓰는 경우도 있다는 것 입니다.

 

 

3. Extension properties

3-1. Extension properties 

확장 프로퍼티도 학장함수와 크게 다르지 않습니다.

아래와 같이 쉽게 정의할 수 있습니다.

 

 

아래와 같이 쉽게 프로퍼티에 접근할 수 있습니다.

 

 

 

결과는 원하는데로 마지막 인덱스인 2가 나왔습니다.

 

 

kotlin의 Coroutine의 isActive도 확장 property 로 들어가 있습니다.

참고로 공식문서에 따르면, 확장 property에서는 init{ } 은 사용할 수 없다고 나와있습니다.

 

 

4. Extension Scope

일반적으로 확장함수나 확장프로퍼티는 package아래 top레벨에 정의합니다.

 

package test.example.scope

val <T> MutableList<T>.lastIndex: Int
    get() = size - 1

 

물론 package 외부에서 사용하기 위해서는 import를 해 주어야 하겠지요.

 

package test.example.usage

import test.example.scope.lastIndex

fun main() {
    val list = listOf("red", "green", "blue")
    val lastIndex = list.lastIndex
}

 

 

5. 주의할 점

5-1. 확장함수 이름이 기존 함수와 같을 경우

만약 Class의 기존 함수와 똑같은 이름과 인자의 함수를 추가해서 사용하려고 하면 어떻게 될까요?

에러는 나지 않습니다.

하지만, 기존 함수가 우선이 되어 실행되므로 멤버함수의 이름에 있어서는 주의가 필요합니다.

 

 

실행해보면 다음과 같은 결과가 나옵니다.

확장함수는 실행되지 않고, 기존 Class의 함수가 실행된 것을 볼 수 있습니다.

 

 

이상으로 Kotlin Extention Functions에 대해서 알아보았는데요.

이와 관련해서 더 좋은 방법등이 있다면 이 글을 통해서 업데이트 하도록 하겠습니다.

728x90

댓글