1. 확장함수
자바로 만들어진 라이브러리를 유지보수, 확장할 때 코틀린을 붙이고 싶을 때,
함수의 코드 자체는 밖에 있는데, 안에 있는 것처럼 쓰고 싶을 때 사용한다.
예시)
fun String.lastChar() : Char {
return this[this.length-1]
}
fun main(){
val str = "ABC"
println(str.lastChar())
}
String.lastChar() 함수가 확장함수이다.
String클래스를 확장하기 때문에 String.을 붙여주고, this를 통해 인스턴스에 접근이 가능하다.
this를 수신객체, String클래스를 수신객체타입이라고 부른다.
이렇게 한다면 main에서 멤버함수인 것처럼 사용할 수 있다.
위의 예시처럼 원래 String에 있는 멤버함수처럼 사용할 수 있다는 것이 확장함수의 특징이다.
하지만 멤버함수와 확장함수의 시그니처가 동일하다면 어떤 함수를 호출하게 될까? 다음 예시를 살펴보자.
이렇게 위의 코드처럼 Person클래스에 있는 함수를 멤버함수로 사용하기 위해 오른쪽처럼 가져와서 사용한다면
멤버함수가 우선적으로 호출된다!! 이 점을 주의해야한다.
또한, 확장함수가 오버라이드 된다면 어떤 함수가 실행이 될까? 이 경우는 3가지로 나눠볼 수 있다.
Train클래스에 있는 isExpensive()를 Srt클래스에서 똑같이 확장함수로 오버라이드 했다고 가정해보자.
val train : Train = Train()
train.isExpensive() -> 이는 Train의 확장함수가 실행됨
val srt1 : Train = Srt()
srt1.isExpensive() -> 이는 Train의 확장함수가 실행됨
val srt2 : Srt = Srt()
srt2.isExpensive() -> 이는 Srt의 확장함수가 실행됨
Train의 타입으로 선언하면 실제 어떤 인스턴스를 참조하든 Train의 확장함수가 실행되며,
Srt의 타입으로 선언했는데 Srt인스턴스를 참조하고 있으면 Srt의 확장함수가 실행된다!!
2. infix 함수
중위함수, 함수를 호출하는 새로운 방법이다.
기존에 사용했던 downTo, step도 중위함수이다.
변수.함수이름() 대신 변수 함수이름 argument 이렇게 호출한다. 다음 예시를 살펴보자.
infix fun Int.add2(other : Int) : Int{
return this + other
}
위의 예시는 Int클래스에 있는 멤버함수처럼 사용할 수 있게 확장함수를 만들었다.
infix라는 키워드를 붙여 함수를 만들었을 때 어떻게 사용할 수 있는지 살펴보면
3.add2(4)
기존의 함수처럼 이렇게 사용할 수도 있지만 for문에서 사용했던 것처럼
3 add2 4
이렇게 변수 함수이름 argument이렇게 사용할 수 있다!!
3. 지역함수
다음 예시를 살펴보자.
이렇게 위와 같이 함수 안에 겹쳐있는 코드가 있을 때 다음과 같이 함수 안에 함수를 만들어 사용할 수 있다.
위의 코드처럼 함수 안에 함수를 만들어 중복되는 코드를 줄일 수 있다.
하지만 depth가 깊어지기도 하고, 코드가 깔끔해지지 않는다.
따라서 보통 이럴 때에는 Person내에서 예외처리를 추가해주는 방법 또한 생각해볼 수 있다.
'Kotlin > Basic' 카테고리의 다른 글
[Kotlin/Basic] 코틀린에서의 배열과 컬렉션 (0) | 2022.09.06 |
---|---|
[Kotlin/Basic] 코틀린에서의 중첩클래스 (0) | 2022.09.01 |
[Kotlin/Basic] 코틀린에서의 object 키워드 (0) | 2022.08.31 |
[Kotlin/Basic] 코틀린에서의 접근제어 (0) | 2022.08.23 |
[Kotlin/Basic] 코틀린에서의 상속 (0) | 2022.08.22 |