Uknow's Lab.
article thumbnail

 

코파기 3부는 기초편에서 다루지 않는 코틀린의 요소들을 다룰 생각입니다.

딱히 별 마무리 짓지 않고 생각나는 대로 계속 추가할 것 같네요.

 

 

코틀린과 확장함수 (Extension Functions)

확장함수(Extension Functions)이란, 클래스에 새 매소드를 추가하는 기능입니다.

 

엥? 그거 걍 클래스 안에 새 메소드 넣으면 되는거 아니에요?

맞습니다.

 

본인이 만든 클래스라면 굳이 확장함수를 쓸 이유 없이 클래스 내 메소드를 정의하면 됩니다.

하지만, 코틀린 표준 라이브러리라면? 서드 파티 라이브러리라면?

클래스 내 새 메소드를 추가하는 건 그닥 쉬운 일이 아닙니다.

 

 

코틀린의 표준 라이브러리중 하나인 String은 많은 메소드를 지원합니다.

그리고, 저는 여기에 String 내 대문자가 몇개인지 세는 getUpperCaseCount() 메소드를 넣고 싶습니다.

 

fun getUpperCaseCount(str: String): Int {
    var cnt = 0
    for (c in str) {
        if (c.isUpperCase()) cnt++
    }
    return cnt
}

fun main() {
    val str: String = "Hello World"
    val upperCnt = getUpperCaseCount(str) // 이와 같이 사용하는 방법이 있지만,
		// val upperCnt = str.getUpperCaseCount() // 처럼 쓰고싶어

 

 

하지만 표준 라이브러리는 대게 read-only 이므로 추가 메소드를 넣는게 힘듭니다.

서드 파티 라이브러리 역시 클래스 구조를 까서 새 메소드를 넣는 것도 그닥 쉽지만은 않고요.

 

이럴때 쓸 수 있는 것이 바로 확장함수 입니다.

 

 

확장함수의 사용

fun String.getUpperCaseCount(): Int {
    var cnt = 0
    for (c in this) {
        if (c.isUpperCase()) cnt++
    }
    return cnt
}

fun main() {
    val str: String = "Hello World"
    println(str.getUpperCaseCount())
}

// 출력
>> 2

 

 

확장함수는 위와 같은 구조로 이루어져 있습니다.

클래스명 뒤에 메소드명이 온다는 점 외에는 기본적인 함수 구조랑 같으며,

this 키워드를 사용해 객체 자신을 호출할 수 있습니다.

 

“Hello World”.getUpperCaseCount() 와 같이 사용한다면,

getUpperCaseCount()에서 this를 통해 “Hello World”를 받을 수 있는 것이죠.

 

 

부록. 자바의 표준 라이브러리를 가지고 오면서, 확장시킨 코틀린

// 자바
ArrayList<Integer> arrayList = new ArrayList<>();

arrayList.first(); // 그런거 없어요
arrayList.get(0); // 이렇게 써야함

arrayList.last(); // 이런것도 없어요
arrayList.get(arrayList.size() - 1); // 이렇게 써야함



// 코틀린
val arrayList = ArrayList<Int>()

arrayList.first()
arrayList.last() // 편하게 마지막 원소 구하세요

 

코틀린에는 자바에서는 없는 Array, ArrayList, List 등에 first() last()를 제공합니다.

이는 자바의 컬렉션 프레임워크를 갖고오면서,

확장함수를 통해 부가 기능을 추가한 것입니다.

 

이제 확장함수를 배웠으니,

저희도 저희가 필요한 기능을 확장시켜 사용할 수 있겠죠?

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.