hyeals study
[코틀린] 확장함수 & 확장 프로퍼티 본문
* 확장함수(extension function): 어떤 클래스의 멤버 메소드인 것처럼 호출할 수 있지만 그 클래스 밖에 선언된 함수.
[확장함수 만드는 방법]
: 추가하려는 함수 이름 앞에 그 함수가 확장할 클래스의 이름을 붙이면 됨.
예를 들어, 아래의 함수는 어떤 문자열의 마지막 문자를 알려주는 기능을 하는 함수임.
- 수신 객체 타입(receiver type): 확장 함수가 호출되는 대상이 되는 값(객체)의 타입(여기서는 String이 해당됨), 확장이 정의될 클래스 타입임.
- 수신 객체(receiver object): 확장함수가 호출되는 대상이 되는 값(객체). (여기서는 this가 해당됨)
위 코드는 아래와 같이 사용할 수 있음
☞ 함수를 호출하는 방법이 일반 클래스 멤버를 호출하는 방법과 같음
- 여기서는 String이 수신 객체 타입이며, "Kotlin"이 수신 객체임.
어떻게 보면 String 클래스에 새로운 메소드를 추가한 것과 같은 모습임.
우리가 직접 String 클래서의 코드를 작성한 것은 아니지만 이렇듯 String 클래스에 원하는 메소드를 추가할 수 있음.
또한 여기서 this는 생략이 가능함. 따라서 아래와 같이 코드를 간결하게 작성할 수 있음.
☞ 수신 객체 멤버에 this 없이 접근할 수 있다는 뜻과 같음.
* 확장 함수의 내부에서도 다른 인스턴스의 메소드의 내부에서처럼 수신 객체의 메소드나 프로퍼티를 바로 사용할 수 있음.
* 메소드를 호출하는 쪽에서는 확장 함수인지 클래스의 멤버 메소드인지 구분할 수 없음.
[joinToString 함수 최종 개선]
- 위의 코드를 통해 joinToString을 클래스의 멤버인 것 처럼 호출 할 수 있게되어 편리해짐.
- Collection<T>: 수신 객체 타입
- this: 수신 객체
* 확장 함수는 오버라이드할 수 없음.
☞ 확장 함수는 클래스의 일부가 아니기 때문. (확장 함수는 클래스 밖에서 선언되기 때문에)
* 확장 프로퍼티: 기존 클래스 객체에 대한 프로퍼티 형식으로 사용할 수 있는 API를 추가할 수 있게 해줌.
☞ 코드를 더 간결하게 작성할 수 있게 해줌
예를 들어, 앞서 정의한 lastChar 함수를 프로퍼티로 바꾸면
위와 같은 코드로 작성할 수 있음.
- 일반 프로퍼티에서 수신 객체 클래스만이 추가됨.
- 기본 게터를 반드시 정의해야 함.
StringBuilder는 가변적이기 때문에 세터(setter)도 만들 수 있음, 또한 프로퍼티를 var로 만들어야 함.
* 확장 프로퍼티를 사용하는 방법은 일반 멤버 프로퍼티를 사용하는 방법과 동일함
따라서
위와 같이 사용하면 됨.
본 게시물은 "Kotlin IN ACTION"을 참고함.
'코틀린' 카테고리의 다른 글
[코틀린] 로컬 함수 (0) | 2020.02.07 |
---|---|
[코틀린] 컬렉션 처리 (0) | 2020.02.06 |
[코틀린] 함수를 호출하기 쉽게 만들기 (0) | 2020.02.05 |
[코틀린] 컬렉션(Collection) 만들기 (0) | 2020.02.05 |
코틀린 기초(11) - 예외 처리 (0) | 2020.02.04 |