[깡샘의 코틀린 프로그래밍] 정리 16 - Extension
본 글은 [깡샘의 코틀린 프로그래밍 - 루비페이퍼] 의 내용을 발췌한 것입니다.
좀더 자세한 내용은 책을 통해 확인해 주세요.
16장. 클래스 Extension
16.1.1. 확장이란?
클래스 내에 함수와 프로퍼티를 선언합니다. 그런데 때로는 클래스의 확장(Extension)이 필요합니다. 확장이라는 것은 클래스 내부에 선언한 함수와 프로퍼티 이외에 다른 함수나 프로퍼티를 추가해서 이용하는 것입니다. 객체지향 프로그래밍에서 일반적으로 클래스 확장을 위해 사용하는 방법은 상속 기법입니다. 그러나 이 책에서는 용어의 혼동을 피하고자 확장이라는 단어는 상속을 통하지 않고 기능을 추가하는 방법에만 사용하겠습니다.
상속은 객체지향 프로그래밍의 핵심입니다. 상위 클래스를 정의하고 그 클래스를 상속받아 하위 클래스를 정의합니다. 그러면 하위 클래스에서는 상위 클래스에 정의된 함수와 프로퍼티를 그대로 상속받아 자신의 것처럼 이용할 수 있습니다. 또한, 하위 클래스에서 자신만을 위한 함수와 프로퍼티를 더 추가할 수도 있습니다. 그러면 상위 클래스의 함수와 프로퍼티에 자신이 추가한 함수와 프로퍼티를 포함하는 클래스가 되는 것이지요. 상위 클래스에 있는 구성요소에 무언가를 더 추가해서 이용한다는 개념입니다. 여기까지는 객체지향 프로그래밍의 일반적인 상속의 개념입니다.
01 package sixteen_one_one
02
03 open class Super {
04 val superData: Int = 10
05 fun superFun() {
06 println("superFun....")
07 }
08 }
09
10 class Sub: Super() {
11 val subData: Int = 20
12 fun subFun() {
13 println("subFun....")
14 }
15 }
16
17 fun main(args: Array<String>) {
18 val obj: Sub = Sub()
19 println("superData : ${obj.superData}, subData : ${obj.subData}")
20 obj.superFun()
21 obj.subFun()
22 }
【 실행결과 】
superData : 10, subData : 20
superFun....
subFun....
위 소스에서 Super 클래스가 있고 이 Super를 상속받아 Sub 클래스를 만들었습니다. 상속을 통해 Sub 클래스에서는 Super 클래스에 정의된 함수와 프로퍼티를 그대로 이용할 수 있습니다. 그리고 Sub 클래스에 함수와 프로퍼티를 더 추가했습니다. 결국, Sub은 Super 클래스의 내용에 무언가를 더 추가한 클래스가 됩니다.
그런데 상속 방법을 사용하지 않고 쉽게 클래스의 함수나 프로퍼티를 추가할 수 있는 방법이 있습니다. 상속받지 않고 이미 선언된 클래스에 함수나 프로퍼티를 추가해서 이용하는 방법입니다. 이것이 코틀린에서 제공하는 확장이라는 개념입니다. 위에 작성했던 소스를 그대로 상속을 통하지 않고 확장으로 작성해 보겠습니다. 위 소스와 비교가 목적이므로 클래스명과 프로퍼티, 함수명을 똑같이 작성하겠습니다
01 package sixteen_one_one_one
02
03 class Super {
04 val superData: Int = 10
05 fun superFun() {
06 println("superFun....")
07 }
08 }
09
10 val Super.subData: Int
11 get() = 20
12
13 fun Super.subFun() {
14 println("subFun.....")
15 }
16
17 fun main(args: Array<String>) {
18 val obj: Super = Super()
19 println("superData : ${obj.superData}, subData : ${obj.subData}")
20 obj.superFun()
21 obj.subFun()
22 }
【 실행결과 】
superData : 10, subData : 20
superFun....
subFun....
03번 줄에 Super라는 이름의 클래스가 정의되어 있습니다. 이 클래스에는 superData라는 프로퍼티와 superFun( )이라는 함수만 정의되어 있습니다. 그리고 10번 줄에서 확장 기법으로 Super 클래스에 subData라는 프로퍼티를 추가했고, 13번 줄에 subFun( )이라는 함수를 추가했습니다. 이렇게 하면 Super라는 클래스는 superData, subData라는 두 프로퍼티와 superFun( ), subFun( )이라는 두 함수를 포함하는 클래스가 됩니다. 분명히 기존 클래스에 함수와 프로퍼티가 추가되기는 했지만, 상속을이용하지는 않았습니다. 이렇게 상속을 통하지 않고 함수와 프로퍼티를 클래스에 추가해서 사용하는 것을 확장이라고 부릅니다.
기존 클래스에 함수를 추가하려면 다음의 형식에 따릅니다. 여기서 리시버 타입(Receiver Type)은 확장 대상이 되는 클래스입니다.
확장 대상 클래스에 점( . )으로 확장 함수를 명시하는 방법입니다. 예를 들어 Super라는 클래스에 subFun( )이라는 함수를 추가하겠다면 fun Super.subFun() { }으로 작성합니다