본문 바로가기

FP - 다양한 함수

@silver-w2025. 10. 9. 11:30
  1. 확장함수
  2. infix 함수
  3. inline 함수
  4. 지역함수
  - 확장함수/확장 프로퍼티 : 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


출처 : https://inf.run/sMPv5

 

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)| 최태현 - 인프런 강의

현재 평점 5.0점 수강생 3,556명인 강의를 만나보세요. 이 강의를 통해 Kotlin 언어의 특성과 배경, 문법과 동작 원리, 사용 용례, Java와 Kotlin을 함께 사용할 때에 주의할 점 등을 배울 수 있습니다. Ko

www.inflearn.com

 

 

silver-w
@silver-w :: silver-w 님의 블로그

silver-w 님의 블로그 입니다.

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차