자바의 @Override 애노테이션과 비슷한 override 변경자는 상위 클래스나 상위 인터페이스 안에 있는 프로퍼티나 메소드를 오버라이드한다는 표시다. 하지만 자바와 달리 코틀린에서는 override 변경자를 꼭 사용해야 한다. override 변경자는 실수로 상위 클래스의 메소드를 오버라이드하는 경우를 방지해준다.
internal open class Animal {
open fun getType(animal: Animal?): String {
return "animal"
}
}
internal class Person(private val name: String, private val age: Int) : Animal() {
fun getType(animal: Animal?): String { // 에러 발생
return if (animal is Person) {
"person"
} else {
"NA"
}
}
}
internal object TestOverride {
@JvmStatic
fun main(args: Array<String>) {
val animal: Animal = Person("lily", 26)
println(animal.getType(animal))
}
}
컴파일시 아래와 같은 에러가 발생한다.
Kotlin: 'getType' hides member of supertype 'Animal' and needs 'override' modifier
override 키워드 명시한 후 빌드한 결과
person
*참고 java에서 class 기본 접근제어자는 default이고 kotlin의 internal과 비슷하다.
class Animal {
public String getType(Animal animal) {
return "animal";
}
}
class Person extends Animal {
private String name;
private int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
//@Override
public String getType(Animal animal) {
if (animal instanceof Person) {
return "person";
} else {
return "NA";
}
}
}
class TestOverride {
public static void main(String[] args) {
Animal animal = new Person("lily", 26);
System.out.println(animal.getType(animal));
}
}
person
자바에서 오버라이드 키워드는 일종의 개발자를 위한 명시일뿐 시그니처(매개변수 Type&개수, 반환Type, 함수이름)이 같은 메소드에대해 실제로 오버라이드를 하지만 @Override 애노테이션이 없어도 컴파일 에러를 발생하지 않는다.
코틀린 인 액션 4장