굥뷰를 햡시댜

[Kotlin] Inheritance 본문

언어/Kotlin

[Kotlin] Inheritance

GodZ 2019. 4. 24. 22:01

1. 상속

  • Kotlin에서 최상위 클래스는 Any 입니다.
  • 클래스에 상위타입을 선언하지 않으면 Any가 자동으로 상속됩니다.
class Example1	// Any 자동 상속
class Example2 : Any() // Any라는 클래스를 상속 -> Any자리에 클래스 이름이 들어오면 ok
  • Any는 java.lang.Object와는 다른 클래스 입니다. -> (equals(), hashCode(), toString()만 있음)
package kotlin

public open class Any {
    public open operator fun equals(other: Any?): Boolean
    public open fun hashCode(): Int
    public open fun toString(): String
}
  • 명시적으로 상위 타입을 선언하려면 클래스 헤더의 콜론(:) 뒤에 상위타입을 선언하면 됨
open class Base(p: Int)

class Derived(p: Int) : Base(p)
  • 파생클래스에 기본생성자가 있으면 파생클래스의 기본생성자에서 상위타입의 생성자를 호출해서 초기화할 수 있음
  • 파생클래스에 기본 생성자가 없으면 각각의 보조생성자에서 상위타입을 super 키워드를 이용해서 초기화 해줘야함
  • or 다른 생성자에게 상위타입을 초기화할 수 있게 위임해줘야함
class MyView: View {
    constructor(): super(1)
    constructor(ctx: Int): this()
    constructor(ctx: Int, attrs: Int): super(ctx, attrs)
}
  • Kotlin에서는 부모 클래스에 open을 사용해야 상속을 할 수 있음
  • open 어노테이션은 Java의 final과 반대임
  • open class는 다른 클래스가 상속할 수 있음
  • 기본적으로 Kotlin의 모든 class는 final임

2. 메소드 오버라이딩

  • 오버라이딩 될 메소드 -> open 어노테이션이 요구됨
  • 오버라이딩 된 메소드 -> override 어노테이션이 요구됨
open class Base {
    open fun v() {}
    fun nv() {}
}

class Derived() : Base() {
    override fun v() {}
}

 

3. Property 오버라이딩

  • 메소드 오버라이딩과 유사한 방식으로 오버라이딩 가능
open class Foo {
    open val x: Int get{...}
}

class Bar1: Foo() {
    override val x: Int = ...
}

 

4. 오버라이딩 규칙

  • 같은 멤버에 대한 중복된 구현을 상속받은 경우, 상속받은 클래스는 해당 멤버를 오버라이딩하고 자체 구현을 제공해야함
  • super + <클래스명>을 통해서 상위 클래스를 호출할 수 있음
open class A {
    open fun f() { print("A") }
    fun a() { print("a") }
}

interface B {
    fun f() { print("B") }	//인터페이스는 open을 사용하지 않아도 됩니다!
    fun b() { print("b") }
}

class C(): A(), B {	//A라는 클래스 상속, B라는 인터페이스를 C라는 클래스에서 구현!(인터페이스는 여러개 구현 가능!)
    override fun f() {
        super<A>.f()
        super<B>.f()
    }
}

 

5. 추상클래스

  • abstract 멤버는 구현이 없음
  • abstract 클래스나 멤버는 open이 필요 없음!
abstract class AbsClass {
    abstract fun f()
}

class MyClass(): AbsClass() {
    override fun f() { /*구현*/ }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'언어 > Kotlin' 카테고리의 다른 글

[Kotlin] Properties and Fields  (0) 2019.04.25
[Kotlin] Class  (0) 2019.04.24
[Kotlin] Packages, Return and Jumps  (0) 2019.04.24
[Kotlin] Control Flow  (0) 2019.04.24
[Kotlin] Basic Types  (0) 2019.04.23
Comments