해당 게시물은 과거에 작성한 블로그 내용을 옮겨 온 것으로, 가독성이 떨어지고 내용이 부정확할 수 있습니다.
- 확장: 클래스에 상속하거나 디자인 패턴을 따로 사용하지 않아도 새로운 기능으로 클래스를 확장할 수 있는 기능
- 확장 함수: 확장이 일어날 때 추가적으로 구현하게 되는 메소드
- 외부 라이브러리의 함수를 추가하고 싶을 때 유용
- 코틀린은 기본적으로 클래스가 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