확장 함수, 확장 프로퍼티

이 글은 Kotlin in Action 서적을 참고했습니다!

확장 함수

말 그대로 클래스를 확장 시킬 수 있는 기능이다! 클래스의 메소드인 것처럼 호출 할 수 있지만, 해당 클래스 안이 아닌 밖에 선언된 함수이다. String 클래스에 .length(), .toString()등 호출할 수 있는 메소드가 있는데 이처럼 사용자가 직접 함수를 추가 할 수 있다.

확장 함수 선언 방법

추가하려는 함수 이름 앞에 확장할 클래스의 이름을 붙이면 된다!
ex) String.lastChar() 여기서 String이 클래스의 이름이 되고, lastChar()는 함수의 이름이다.

fun String.lastChar() : Char = this.get(this.length-1)
// this 생략 가능

위 코드에서 String이 수신 객체 타입이고, this는 수신 객체이다!

var str = "android"
Log.d("log", "str.lastChar().toString()")
log : d

lastChar() 함수가 호출되면서 android는 수신객체가 된다.
즉, android.length-1이 되는셈이다.

확장 함수 정리

  1. 확장 함수는 해당 클래스의 일부가 아니다! 즉 위 코드의 lastChar()는 String 클래스의 일부가 아님.
  2. 수신 객체 타입에 의해 확장함수는 호출된다!


확장 프로퍼티

기존 클래스 객체에 대한 프로퍼티 형식의 구문으로 사용 할 수 있는 API를 추가할 수 있고, 프로퍼티 문법으로 더 짧게 코드를 작성이 가능하여 편한 경우가 있다.

확장 프로퍼티 선언 방법

val String.lastChar : Char
	get() = get(length-1)

확장 함수의 경우와 마찬가지로 확장 프로퍼티도 일반적인 프로퍼티와 같지만, 단지 수신 객체 클래스(String)만 추가됐을 뿐이다! 필드(멤버변수)가 없어서, 최소한의 게터는 꼭 정의를 해야한다.

변경 가능한 확장 프로퍼티 선언 방법

var StringBuilder.lastChar : Char
	get() = get(length-1) // getter
    set(value : Char){
    	this.setCharAt(length-1, value) // setter
    }

확장 프로퍼티 사용 방법은, 기존 프로피터 사용과 동일하다!

val sb = StringBuilder("Kotlin?")
sb.lastChar = '!'

위 코드의 실행 결과는 Kotlin!이 나온다!

좋은 웹페이지 즐겨찾기