디폴트 인자를 흉내 내기 위한 오버로딩 활용?
오늘의 아톰은 오버로딩에 대한 아톰이다.
오버로딩에 대해서는 자바에서 학습했기 때문에 알고 있지만 '디폴트 인자를 흉내내기 위한 오버로딩 활용'이라는 말이
매우 궁금해지는 아톰이기에 어떤 내용일지 궁금해지는 시작이다.
[ 오버로딩 ]
오버로딩
: 파라미터 목록이 여러 다른 함수에 같은 이름을 사용하는 것
: 함수 시그니처를 비교해 함수를 구분하며, 함수 시그니처 중 반환 타입은 오버로딩 대상이 아님
: 어떤 클래스 안에 확장 함수와 시그니처가 똑같은 멤버 함수가 들어 있으면 코틀린은 멤버 함수를 우선 함
: 확장 함수를 가지고 멤버 함수를 오버로딩 할 수 있음
: '같은 주제를 다르게 변경한다'는 개념을 더 명확히 표현 가능
* 함수 시그니처
: 함수 이름, 파라미터 목록 (파라미터 타입 및 개수), 반환 타입을 의미
: 함수를 둘러싸고 있는 클래스(확장 함수의 경우 수신 객체 타입)도 포함
[ 기본 오버로딩 ]
import atomictest.eq
class Overloading{
fun f() = 0
fun f(n: Int) = n+2
}
fun addInt(i:Int, j:Int) i+j
fun addDouble(i:Double, j:Double) = i+j
fun add(i:Int, j:Int) i+j
fun add(i:Double, j:Double) = i+j
fun main(){
val o = Overloading()
o.f() eq 0
o.f(11) eq 13
addInt(5, 6) eq add(5, 6)
addDouble(1.1, 2.2) add(1.1, 2.2)
}
- 오버로딩 사용 시 함수 자체에 대해 설명하는 이름을 써 추상화 수준을 높일 수 있음
[ 함수 시그니처 중복 여부에 따른 오버로딩 ]
import atomictest.eq
class My{
fun foo() = 0
}
fun My.foo() = 1 // (1)
fun My.foo(i:Int) = i+2 // (2)
fun main(){
My().foo() eq 0
My().foo(1) eq 3
}
- (1) 멤버와 시그니처가 중복되는 확장 함수를 호출해도 의미가 없으며, 위와 같은 확장 함수는 호출이 불가능함
- (2) 다른 파라미터 목록을 제공하기 때문에 멤버 함수를 확장 함수로서 오버로딩 가능함
[ 디폴트 인자 흉내를 위한 확장 함수 사용 불가 ]
import atomictest.eq
fun f(n:Int) = n+373
fun f() = f(0) // X
fun f(n:Int = 0) = n+373 // 위 두 함수를 이와 같이 변경 가능
- 디폴트 인자를 흉내내기 위해 확장 함수를 사용할 수 없으며, 파라미터가 없는 첫 번째 함수만 호출하기 때문에 디폴트 인자를 사용해서 두 함수를 한 함수로 변경하는 것이 나음
[ 함수 오버로딩과 디폴트 인자 사용 ]
import atomictest.*
fun foo(n:Int = 99) = trace("foo-1-$n") // 1)
fun foo(){ // 2)
trace("foo-2")
foo(14) // 1)foo() 호출
}
fun main(){
foo() // 2)foo() 호출
trace eq """
foo-2
foo-1-14
"""
}
- 함수 오버로딩과 디폴트 인자를 함께 사용하는 경우, 오버로딩한 함수 호출 시 함수 시그니처와 함수 호출이 '가장 가깝게' 일치되는 함수 호출( 즉, 디폴트 인자가 99이지만 foo(99)가 아닌 foo()를 호출)
[ 오늘의 학습 소감 ]
오늘은 코틀린에서의 오버로딩을 학습했다. 기존의 자바에서 학습했던 오버로딩과 크게 다르지 않은 개념이지만 코틀린에서 배웠던 개념들(디폴트 인자, 확장 함수 등)과 함쳐지면서 새로운 예제들을 접한 아톰이었다. 특히 오늘 가장 기억에 남는 것은 가장 마지막 부부인 '가장 가깝게' 일치되는 함수를 호출한다는 부분이 아닐까 싶다.
'공부 자료 > 코틀린[Kotlin]' 카테고리의 다른 글
| [Atomic 34] 이넘(feat. Enum) (0) | 2024.02.06 |
|---|---|
| [Atomic 33] When 식 (1) | 2024.02.06 |
| [Atomic 31] 이름 붙은 인자와 디폴트 인자 (0) | 2024.02.05 |
| [Atomic 30] Extension function (feat. 확장 함수) (7) | 2024.02.01 |
| [Atomic 28] 프로퍼티 접근자(feat. getter / setter) (0) | 2024.01.30 |