[Kotlin] 확장 함수

mi-fasol·2023년 1월 26일
0

Kotlin

목록 보기
2/5

해당 게시물은 과거에 작성한 블로그 내용을 옮겨 온 것으로, 가독성이 떨어지고 내용이 부정확할 수 있습니다.

확장 함수

  • 확장: 클래스에 상속하거나 디자인 패턴을 따로 사용하지 않아도 새로운 기능으로 클래스를 확장할 수 있는 기능
  • 확장 함수: 확장이 일어날 때 추가적으로 구현하게 되는 메소드
  • 외부 라이브러리의 함수를 추가하고 싶을 때 유용
    • 코틀린은 기본적으로 클래스가 final
    • open 키워드를 추가하지 않는 이상 외부 상속 불가
  • 어떤 클래스의 멤버 함수인 것처럼 호출 가능하나, 해당 클래스의 밖에 선언된 함수
  • 따로 상속을 받지 않고 한 클래스에 추가적인 메소드를 구현할 때 사용하는 함수
  • 새로운 클래스를 생성하는 불편함 감소

확장 함수 생성

  • receiver type: 확장의 대상이 되는 클래스
  • receiver object: 확장 함수 내부 구현 시 this 키워드를 통하여 receiver type이 가지고 있는 public 인스턴스에 접근하는 객체
  • receiver type.확장함수명{ ...}: 확장 함수 생성
fun mutableList<Int>.swap(idx1 : Int, idx2 : Int){     // 인덱스의 위치를 바꾸는 swap 함수를 확장 함수로 생성
    val tmp = this[idx1]
    this[idx1] = this[idx2]
    this[idx2] = tmp
}

fun main(){
    val idxList = mutableListOf(1, 2, 3, 4, 5)
    idxList.swap(0, 3)     // 확장 함수인 swap 사용
    print(idxList)
}
  • mutableList: receive type
  • swap: 확장함수명
  • 출력값: [4, 2, 3, 1, 5]

확장 함수의 특징

  • 상속 및 디자인 패턴 없이도 확장 기능 생성
  • 보일러플레이트 코드 감소
    • 보일러플레이트 코드: 최소한의 변경으로 여러 코드에서 재사용되고 반복적으로 비슷한 형태를 보이는 함수
  • 정적 바인딩
    • 정적 바인딩: 함수 호출 시 메모리 주소 값을 저장하는 작업이 컴파일링 되는 시간에 작동하는 것
    • 컴파일 이후의 값이 변경되지 않음
  • receive type의 멤버 함수로 변수나 매개변수 타입, 개수가 같은 함수를 생성하면 그 함수는 무시
class User{
    fun name(name : String){
        println("mifasol")
    }

    fun grade(grade : Int){
        println("3")
    }
}

// 함수명, 매개변수의 타입, 개수가 같으므로 무시
fun User.name(userName : String){   
    println("haribo")
    }
    
// 함수명은 동일하나 매개변수의 타입이 다르므로 오버로딩
fun User.grade(newGrade : String){    
    println("4")
}

fun main(){
    User.name("IE")
    User.grade(2)
    User.grade("4")
}
  • 출력값
    mifasol
    3
    4
profile
정위블

0개의 댓글