본문 바로가기

프로그래밍 언어/코틀린_쌩초보를 위한 기초

쌩초보를 위한 기초_24_Inheritance_상속

Inheritance 상속

 

Inheritance(상속)는 그녀(her)의 안에(in) 넣어서 전달하는 것이다. 그것은 유전자이다.

자신의 유전자를 부모에게서 받아 자식에게 전달하는 것이 상속이다.

 

 

마찬가지로 프로그래밍에서의 상속도 같은 역할을 한다.

자식 클래스를 만들 때 부모 클래스의 property(속성)과 기능을 물려받는다.

정확히 말하면 그 속성과 기능을 이용할 수 있다는 뜻이다.

상속은 객체지향 프로그래밍(Object Oriented Programming)의 가장 큰 장점 중의 하나이다.

 

모든 클래스의 시조(최초) 클래스를 superclass(슈퍼클래스)라 하고 그 이름은 Any 이다.

any의 뜻이 '어떤' 이므로 정확한 이름도 없는것 같다.

하여튼 '어떤 클래스(Any Class)'가 클래스의 최초 조상이다.

프로젝트를 만들면 Any Class는 스스로 존재한다.

 

그래서 첫번째 클래스를 만들면 Any클래스에게 상속 받아 만들어진다.

Any Class는 3개의 h-e-t 능력을 가지고 있다.

 

hashCode() 메써드

equals() 메써드

toString() 메써드

 

이 능력은 다른 클래스가 만들어지면 자동으로 상속되어 사용할 수 있다.

상속을 받는 클래스는 상속하는(부모: parent) 클래스의 subclass(하위클래스)라고 부른다.

 

기본적으로는 클래스가 만들어져도 상속은 안된다.

상속을 하겠다고 선언하고 금고 문을 열어야 비로소 상속을 할 수 있다.

이때 사용하는 keyword(키워드)는 open 이다.

 

open class FirstClass

 

클래스가 만들어지면 똑같은 타입(type, 유형)이 만들어진다.

그래서 위의 FirstClass는 클래스이며 동시에 타입(type)이 된다.

 

클래스를 만들 때 부모클래스의 타입(supertype)을 명확하게 표시하려면

클래스명이 있는 줄에서 콜론 다음에 적는다.

 

open class FirstClass (p: Int)

 

class SecondClass(p: Int) : FirstClass(p)

 

부모클래스가 보조생성자를 사용하고 있다면 다음과 같이 상속을 선언한다.

 

class SecondClass : FirstClass { ... constructor() ... }

 

다형성(Polymorphism)

오버로딩(overloading)과 오버라이딩(overriding)

하위클래스(subclass)가 상속으로 메써드(함수)나 속성을 가져오면 같은 메써드 이름과 속성을 가지게 된다.

하지만 하위클래스에서 상속받은 메써드나 속성을 다양하게 변형할 수 있는데 이것을 다형성이라고 부른다.

 

다음과 같이 메써드 이름은 같지만 매개변수 타입을 다르게 하여 사용하는 경우를 overloading(오버로딩)이라고 한다.

over는 '초과, 과잉'이라는 뜻이고 load는 '짐, 짐을 싣다' 라는 뜻이다.

즉, overload는 '짐을 더 많이 싣다'라는 뜻이다.

그러므로 여기서는 overload를 '매개변수 인자를 더 만든다'로 이해하면 될 것 같다.

 

fun overloadExample(x: Int, y: Int): Int { }

fun overloadExample(x: String, y: String): String { }

fun overloadExample(x: Double, y: Double, z: Double): Double

 

 

또한 다음과 같이 메써드나 속성의 이름은 같지만 다른 동작(기능)으로 바꾸는 것을 overriding(오버라이딩)이라고 한다.

over는 '초과, 과잉'의 뜻이고 ride는 '타다'라는 뜻이다.

즉, override는 '더 많이 올라타다'라는 뜻이다.

그러므로 override는 '메써드의 기능을 더 많이 추가한다' 라고 이해하면 될 것 같다.

 

위 그림은 Cookie라는 클래스 안에 다른 클래스 Candy를 만든 예이다.

 

상위 부모 클래스인 Cookie는 open 키워드를 붙여서 상속을 허락한다.

하위 자식 클래스인 Candy는 Cookie클래스를 상속한다고 선언한다.

 

쿠키클래스 안에 있는 메써드(함수) bake()는 open을 붙이지 않았기 때문에 캔디클래스에서 상속받을 수 없다.

클래스가 상속을 허용해도 그 안에 있는 메써드(함수)를 상속하려면 마찬가지로 open을 붙여야 한다.

캔디클래스의 메써드 eat()함수는 상속 받았지만 override를 붙이면 { } 중괄호 안에 넣는 기능을 다르게 바꿀 수 있다.

또한 기능을 다르게 바꾼 override fun clean()함수를 다른 클래스가 overriding하는 것을 막으려면 final(최종적)을 붙인다.

 

여기서는 상속에 대한 기본 개념만 정확히 이해하자.

실제 적용은 다른 글에서 게임을 만들면서 알아보기로 한다.

끝.