CS/Java & Kotlin

[Kotlin] 2. 상속

bonggang 2020. 10. 4. 10:24

상속(Inheritance)


상속은 자식(클래스)이 상속받고 싶은 부모(클래스)를 선택해서 상속받는다.

이 때 상속받는 클래스는 자식클래스, 하위클래스 또는 서브클래스라고 부르며 상속을 해주는 클래스를 부모클래스, 상위클래스 또는 슈퍼클래스라고 부른다.

자식 클래스가 부모 클래스로부터 상속을 받게 되면 부모 클래스의 프로퍼티와 메서드를 물려받게 된다.

 

 

상속 방법


코틀린에서의 최상위 클래스는 Any다. class 상속타입을 선언하지 않으면 암시적으로 Any가 상속되는 것이다.

명시적으로 상속관계를 표현하기 위해서는 class의 헤더부분에 콜론(:)과 상속받고자 하는 클래스를 적어주면 된다.

상속관계에 사용되는 키워드는 "open"이다.

 

open class A
class B: A() {}

 

코틀린에서 class는 기본적으로 final로 되어있기 때문에 상속이 금지된 상태다. 이를 해결하기 위해 접근제어자 open을 사용하는 것이다. 메서드나 프로퍼티를 오버라이딩 하기 위해서도 각 메소드와 프로퍼티 앞에 open을 붙여줘야 한다.

 

만약 open 상태의 메서드나 프로퍼티를 오버라이딩 할 땐 각 멤버 앞에 "override" 키워드를 사용해야한다.

프로퍼티나 메서드를 오버라이딩 하는 경우 해당 멤버는 자동으로 open되며, 만일 다음 세대에서의 오버라이딩을 금지하고 싶다면 "final"을 명시적으로 사용하면 된다.

즉, 오버라이딩 될 메서드나 프로퍼티에는 open을 오버라이딩 된 메서드에는 override를 사용!

 

open class A{
	open val nick:String = "Bonggang"
	open fun add(){
    	println("A class - add")
    }
}
class B:A(){
	override var nick:String = "Bonggang"
	override fun add(){
    	println("")
    }
}

 

 

인터페이스 상속


인터페이스는 생성자를 가질 수 없고, 선언된 멤버들의 기본 값이 open이다.

인터페이스 또한 상속을 받을 수 있고 클래스 상속과 똑같이 :를 사용한다.

 

만일 클래스와 인터페이스를 동시에 상속받았을 때 상속받은 클래스와 인터페이스에 같은 이름의 메서드가 존재하는 경우가 발생할 수 있다. 이럴 땐 "super" 키워드를 이용해서 super<클래스이름 or 인터페이스이름>.멤버로 호출하면 된다.

 

open class A{
	open val nick:String = "Bonggang"
	open fun add(){
    	println("A class - add")
    }
}

interface B{
	fun add(){
    println("B Interface - add")
    }
}

class C:A(), B{
	override var nick:String = "Bonggang"
	super<A>.add()
    super<B>.add()
}

 

 

추상 클래스(abstract)


추상 클래스나 멤버들은 open 키워드가 필요 없다. 하지만 상속받는 쪽에서는 override 키워드를 사용해야한다.

abstract class A{
	abstract fun add()
}

class B:A(){
	override fun add(){
    	println("class B")
    }
}

 

 

 

참고 자료


zzdd1558.tistory.com/238

blog.naver.com/yuyyulee/221214765484

altongmon.tistory.com/585