- 확장함수
- infix 함수
- inline 함수
- 지역함수
| - 확장함수/확장 프로퍼티 : Java 코드를 Kotlin에서 확장할 수 있음 - 확장함수는 원본 클래스의 private, protected 멤버 접근이 안된다. - 멤버함수, 확장함수 중 멤버함수에 우선권이 있으며, (왼쪽)타입과 대입된 객체의 타입이 다르면 (왼쪽)타입의 확장함수로 호출된다. - 자바에서 확장함수를 사용할때는 마치 static 함수인 것처럼 사용한다. - 중위함수의 키워드는 infix - 함수의 코드를 복붙 함수 키워드는 inline - kotlin에서는 지역함수가 있다. |
1 . 확장함수
- 자바로 만들어진 라이브러리를 유지보수, 확장을 위해
(어떤 클래스안에 있는 메서드처럼 호출할 수 있지만, 함수는 밖에 : 마치 멤버함수처럼 사용할 수 있게 ) 사용
fun 확장하려는 클래스.함수이름(parameter): return {
this를 이용해 실제 클래스 안의 값에 접근
}
fun String.lastChar(): Char { // String. : String 클래스 확장
return this[this.length - 1] // this를 통해 인스턴스 접근
}
fun main() {
val str = "ABC"
println(str.lastChar()) // C - 마치 String 클래스의 메서드를 쓰듯이 호출
}
this : 수신객체 타입
※ 확장함수는 private, protected 멤버를 가져올 수 없다.
멤버함수와 확장함수의 시그니처가 같다면?
- 위 lastChar()이 실제로 String 클래스에 있다면 확장함수와 String내의 멤버함수 중 어떤게 호출되냐면
▶ 멤버함수가 출력된다
▶ 이에 확장함수를 만든 뒤 JDK 등에서 업데이트되어 확장함수와 시그니처가 같은 멤버함수가 생긴다면 예기치 않은 오류가 발생할 수 있다.
확장함수가 오버라이드 된다면?
open class A(
val name: String = "aaa",
val price: Int = 100
)
fun A.isExpensive(): Boolean {
println("A의 확장함수")
return this.price > 100
}
class B : A("bbb", 200)
fun B.isExpensive(): Boolean {
println("A -> B의 확장함수")
return this.price > 50
}
fun main() {
val aa: A = A()
aa.isExpensive() // A의 확장 함수
val ab: A = B()
aa.isExpensive() // A의 확장 함수
val bb: B = B()
bb.isExpensive() // B의 확장 함수
}
→ 확장함수가 호출되는 클래스도 "타입"에 따라 호출된다!
1. 확장함수는 원본 클래스의 private, protected 멤버 접근이 안된다.
2. 멤버함수, 확장함수 중 멤버함수에 우선권이 있다
3. 확장함수는 현재 타입을 기준으로 호출된다.
자바에서 코틀린의 확장함수 / 확장프로퍼티를 가져오는 법 ▶ 정적 메서드 가져오듯이 호출할 수 있다.

2 . infix 함수
- 중위함수 : 함수를 호출하는 새로운 방법
- 중위함수 예시 : downTo, step
- 호출 : 『변수 함수이름 argument』
infix fun Int.add2(other: Int): Int {
return this + other
}
fun main() {
3 add2 4
}
- infix 키워드를 사용하면 함수 호출하는 형식이 바뀐다.
- 확장함수 뿐만 아니라 멤버함수에도 붙일 수 있다.
3 . inline 함수
- 함수가 호출되는 대신, 함수를 호출한 지점에 함수 본문을 그대로 복붙
inline fun Int.add2(other: Int): Int {
return this + other
}
fun main() {
3.add2(4)
}
→ Byte Code
public static final void main() {
int $this$add2$iv = 3;
int other$iv = 4;
int $i$f$add2 = 0;
$this$add2$iv += other$iv;
System.out.print($this$add2$iv);
}
▶ 덧셈하는 로직 자체가 그 함수를 부르는 쪽에 복사 붙여넣기가 된다.
- 사용하는 이유?
: call chain의 overhead를 확인하기 위함
: 함수를 파라미터로 전달할 때 오버헤드를 줄여준다
: inline 함수의 사용은 성능 측정과 함께 신중하게 사용되어야 한다.
4 . 지역함수
- 함수 안에 함수를 선언할 수 있는 함수
fun innerMethod(first: String, second: String): String {
fun ckValidation(first: String, all: String) {
if (first.isEmpty()) {
throw IllegalArgumentException("$all - First string must not be empty")
}
}
ckValidation(first, "firstAbc")
ckValidation(second, "secondAbc")
return first + second
}
▶ 유효성 검사 함수 같은 경우 중복되기 때문에 함수 내 함수로 선언할 수 있다.
- 함수로 만들면 좋을 것 같은데 해당 함수 내에서만 사용할 때 이용
- 다만, depth가 너무 깊어질 수 있어 코드가 깔끔하지 않다.
- 그러므로 객체의 멤버함수로 사용하는게 좋을지 판단할 것
※ (intellij) 코틀린 코드 자바로 변환
tool > Kotlin > Show Kotlin Bytecode
자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)| 최태현 - 인프런 강의
현재 평점 5.0점 수강생 3,556명인 강의를 만나보세요. 이 강의를 통해 Kotlin 언어의 특성과 배경, 문법과 동작 원리, 사용 용례, Java와 Kotlin을 함께 사용할 때에 주의할 점 등을 배울 수 있습니다. Ko
www.inflearn.com
'Kotlin > Java to Kotlin Guide' 카테고리의 다른 글
| FP - 컬렉션을 함수형으로 다루는 방법 (0) | 2025.10.09 |
|---|---|
| FP - 람다 (0) | 2025.10.09 |
| FP - 배열과 컬렉션 (0) | 2025.10.08 |
| 코틀린에서의 OOP - 6. 다양한 클래스를 다루는 방법 (0) | 2025.10.07 |
| 코틀린에서의 OOP - 5. 중첩 클래스 (0) | 2025.10.07 |