Kotlin_open, Final, Abstract

상속

부모 클래스/메소드/변수의 자원을 자식이 사용하는 행위를 ‘상속’이라고 한다.

Java에서는 final modifier을 통해 클래스/메소드/변수의 상속을 제한 할 수 있다.

하지만 Kotlin에서는 상속을 따로 허용하지 않으면 기본적으로 Java의 final과 같이 정의된다.

이에, Kotlin에서 함수를 상속 할 수 있도록 허용하기 위해서 open modifier를 사용한다.

Classes

final public class UninheritableClass { ... } // in Java
class UninheritableClass { ... } // in Kotlin

위 두 클래스는 모두 상속 불가능한 클래스이다.

public class InheritableClass { ... } // in Java
open class InheritableClass { ... } // in Kotlin

위 두 클래스는 모두 상속 가능한 클래스이다.

public class Parent { ... }
public class Child extends parent { ... } // in Java
open class Parent { ... }
class Child: Parent() { ... } // in Kotlin

위 두 코드는 동일하게, Child가 Parent라는 Class를 상속한다.

Methods

public final boolean UninheritableMethod() { ... } // in Java
fun UninheritableMethod(): Boolean { ... } // in Kotlin

두 메소드는 모두 상속 불가능하다.

public boolean InheritableMethod() { ... } // in Java
open fun InheritableMethod(): Boolean { ... } // in Kotlin

위 두 메소드는 모두 상속 가능한 메소드이다.

public class Parent { 
	public boolean InheritableFun() { ... }
}
public class Child extends parent { 
    @Override
	public boolean InheritableFun() {
    	super.InheritableFun()
        ...
    }
} // in Java
open class Parent {
    open fun InheritableMethod(): Boolean { ... } 
}
class Child: Parent() { 
	override fun InheritableMethod(): Boolean { 
    	super.InheritableMethod()
    	...
    } 
} // in Kotlin

위 두 코드는 동일하게, Child가 Parent Class의 Method를 Override하여 사용한다.

Java에서는 @Override 어노테이션이 선택이지만, (물론 작성을 권장한다.)

Kotlin에서는 override modifier가 없으면 빌드 시 오류가 발생한다.

이례적으로, Kotlin에서도 overridefun은 상속에 대해 열려있다.

Variables

public final int UninheritableVeriable = 0;
val UninheritableVeriable: Int = 0

두 변수는 모두 상속 불가능하다.

public int UninheritableVeriable = 0;
open val UninheritableVeriable: Int = 0

위 두 변수는 모두 상속 가능한 변수다.

Examples

Kotlin

open class Parent {
    		fun fun1() { ... }
    open	fun fun2() { ... }
    override fun fun3() { ... }
}
class Child: Parent() {
    overrride fun fun1() { ... }	// cannot override
    overrride fun fun2() { ... }	// overridable
    overrride fun fun3() { ... }	// overridable
}

fun1은 Java의 Final과 동일하기 때문에, override 할 수 없다.

참고 사이트

  • https://androidtest.tistory.com/102
  • https://zerogdev.blogspot.com/2019/06/kotlin-open-final-abstract.html

댓글남기기