Override

hyejin·2022년 4월 14일
0

Kotlin vs Java

목록 보기
1/2

Override

자바의 @Override 애노테이션과 비슷한 override 변경자는 상위 클래스나 상위 인터페이스 안에 있는 프로퍼티나 메소드를 오버라이드한다는 표시다. 하지만 자바와 달리 코틀린에서는 override 변경자를 꼭 사용해야 한다. override 변경자는 실수로 상위 클래스의 메소드를 오버라이드하는 경우를 방지해준다.

kotlin

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과 비슷하다.

Java

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장

0개의 댓글