Kotlin 다중 상속 - Kotlin dajung sangsog

Kotlin 다중 상속 - Kotlin dajung sangsog
안드로이드를 대표하는 언어 코틀린입니다!

Powerful Functional and OOP in Kotlin

제가 저번 시간에 설명드린 클래스와 생성자 개념은 모두 읽고 오신지 모르겠습니다! 만약 읽지 못하셨다면, 아래 링크를 타고 들어가서 쭉 한번 훑고 오시는 것을 추천드립니다. 

hazarddev.tistory.com/51

[Kotlin#4] Kotlin(코틀린) 클래스 및 객체(class & object)

Practical object in Kotlin 저번 글에서는 코틀린의 제어문과 반복문에 대해서 간략하게 알아보았습니다. 그렇다면, 당연히 자바를 기반으로 하는 언어, 코틀린의 다음 챕터는 객체 개념이 됩니다! 간

hazarddev.tistory.com

Kotlin 다중 상속 - Kotlin dajung sangsog

본 장에서는 상속의 개념을 알아보고자 합니다. 우선 상속이라하면, 어떤 게 떠오르시나요. 대부분 재산을 상속받다? 이런 것을 떠올릴 것 같습니다. 뭐 마찬가지죠. 그러니까 부모 클래스로부터 "어떤 것"을 상속받는다는 개념입니다. 다른 객체지향 개념의 언어와 마찬가지로 ":"라는 기호 하나로 상속 기능을 제공받습니다.

코틀린의 클래스 객체는 최소한 모두 상속받을 수 있다 입니다. 물론 앞에 "open"이라는 키워드를 사용해야 상속 클래스로서 읽어 들여져라는 의미이긴 합니다. 아래 코드를 보게 되면!

1

2

3

4

5

6

7

8

9

10

11

12

13

14

open class Foo{

fun doEval(){

println("Hello world");

}

}

class Bar:Foo(){

}

fun main(){

var foo = Bar()

foo.doEval()

}

cs

open 키워드를 사용해서 선언된 클래스 Foo는 상속 가능한 객체의 개념으로 사용될 예정입니다. 그리고 Bar클래스는 Foo클래스를 선언받았기 때문에 아래 main함수에서 Foo내부에 선언된 멤버 함수를 사용할 수 있는 것입니다. 물론 결과는 위의 doEval()과 동일하게 나오지만, 모두 컴파일해보시기 바랍니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

open class Foo{

open fun doEval(){

println("Hello world");

}

}

class Bar:Foo(){

override fun doEval(){

println("Welcome to another World");

}

}

fun main(){

var foo = Bar()

foo.doEval()

}

cs

함수에 open키워드를 사용하면 어떤 결과를 초래할까요? 함수 자체를 상속하는 것뿐만이 아닌, 함수를 재정의할 수 있습니다. doEval() 함수를 재정의했기 때문에 Bar 클래스의 객체라면 "Welcome to another World"가 출력됨을 알 수 있습니다!

그리고 코틀린의 경우에는 자바와 마찬가지로 다중 상속을 허용하지 않는다는 점을 유의해서 코드를 작성하시면 될 것 같습니다!!

Powerful Interface in Kotlin

코틀린에서의 인터페이스에 대해서 알아봅시다. 자바에서 인터페이스를 알고 계신 분이라면 본 글을 따로 읽지 않아도 무방할 것 같습니다. 그 이유로는 자바와 아주 유사하게 동작하기 때문입니다. 그리고 함수 선언과 추상 함수 등을 선언할 수 있습니다. 물론 인터페이스는 정의된 기능을 사용하기 위해 클래스에 의해 구현될 수 있겠죠? 어떤 개념일까요?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

interface ClassBorn{

fun Hello()

fun World()

var myNum:Int

}

class Foo:ClassBorn{

override fun Hello(){

println("Foo Hello");

}

override var myNum:Int = 25;

fun newFun(){

myNum++;

println("${myNum} is + 1")

}

override fun World(){

println("Foo World")

}

}

fun main(){

var foo = Foo()

foo.Hello()

foo.newFun()

}

cs

클래스를 위한 추상적인 개념을 제공해주는 객체 지향 개념에서는 없어서 안될 알짜배기 개념입니다. 물론 클래스로 인터페이스와 같이 추상 클래스를 선언해도 문제 될 건 없습니다. 다만, 인터페이스는 좀 더 간편하게 구현될 수 있다는 점이 장점이라고 볼 수 있습니다. 

앞서 말씀드렸지만 코틀린은 자바와 같이 다중 상속을 지원하지 않습니다. 다만 인터페이스의 다중 상속은 가능합니다. 다만 특이하게 구현됩니다. 그러니까 추상 개념으로 선언된 함수나 변수가 아닌 인터페이스 레벨에서 초기화가 이루어진 코드에 대해서 다중 상속이 이루어지며 이 둘을 상속받는 클래스는 사실상 두 개의 인터페이스를 묶어주는 역할이라고 보면 됩니다. 그러니까 기능을 편하게 사용하기 위해 아래와 같은 방법을 사용하는 것이죠!

728x90

interface Bird {
	val wings : Int
	fun fly()
	fun jump() { // 구현된 일반 메소드
		println("Bird jump")
	}
}

interface Horse {
	val maxSpeed : Int
	fun run()
	fun jump() { // 구현된 일반 메소드
		println("jump!, max speed : $maxSpeed")
	}
}

class Pegasus : Bird, Horse {
	override val wings : Int = 2
	override val maxSpeed : Int = 100
	override fun fly() {
		println("The Pegasus Fly!")
	}
	override fun run() {
		println("The Pegasus Run!")
	}
	override fun jump() {
		super<Horse>.jump() {
			println("The Pegasus jump")
		}
	}
}

https://velog.io/@k906506/Kotlin-%EC%B6%94%EC%83%81-%ED%81%B4%EB%9E%98%EC%8A%A4-VS-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4

[코틀린 완전정복] 추상 클래스와 인터페이스

추상 클래스? 인터페이스? 뭐가 다르지? 🤔

velog.io

Kotlin 다중 상속 - Kotlin dajung sangsog

728x90

저작자표시비영리

'공부' 카테고리의 다른 글

[Spring] spring-cloud-gateway, netflix-eureka-client, netflix-eureka-server  (0) 2022.04.22
[k8s] DNS, RFC 1123, RFC 1035  (0) 2022.04.22
Lucene query (루씬 쿼리)  (0) 2022.04.22
ADsP 데이터 분석 준전문가 (시험 자료)  (0) 2022.04.22
[k8s] 초기화 컨테이너(Init Containers)  (0) 2022.04.22