POST

JAVA 상속 - 재정의(Overriding)와 주해(Annotation)

메소드 재정의(Overriding Method)

상속받은 메소드가 변경이 필요하다면 해당 메소드의 헤더는 그대로 두고 메소드의 몸체만 바꾸는 것이다.

집으로 치자면 상속받은 집내부의 벽지나 창문이 마음에 들지않아 리모델링하는 것과 같다.


서브클래스에서 오버라이딩(Overriding)을 할 경우 반드시 슈퍼클래스의 메소드의 반환형, 이름, 매개변수의 갯수와 데이터 타입이 일치 하여야 한다.


아래의 코드를 작성하여 실행하여 보면 이해가 빠를 것이다.


public static void main(String[] args) { // 메인 메소드

// TODO Auto-generated method stub

Dog d = new Dog();

Animal a = new Animal();

a.sound(); // 슈퍼클래스 메소드 오버라이딩전 호출

d.sound(); // 서브클래스 메소드 오버라이딩후 호출

}

}

class Animal { // 슈퍼클래스

public void sound() {

System.out.println("슈퍼클래스 : ..... !");

}

}

class Dog extends Animal { // 서브클래스

public void sound() {

System.out.println("서브클래스 : 멍멍 !"); // 오버라이딩

}

}



자, 여기서 만약 메소드 재정의 중 메소드 이름에 오타가나면 어떻게 실행이 될까?

물론 아무런 오류도 나지 않는다 . 그 이유는 당연히 컴파일러가 자동으로 오타를 잡아주기 때문은 아니다.

단지 컴파일러가 새로운 메소드가 작성된 것으로 인식 하기 때문이다. 이러한 오타들은 코딩을 하다보면 놓치기 일수 이며 자주 발생되는 실수이다.


그렇다면 이오타를 확인할 방법은 없는 걸까? 아니다 분명히 존재한다.

@Override 라는 주해(Annotation)을 사용하면 된다. 슈퍼클래스에 해당 메소드가 없다면 오류를 발생 시킨다.

사용시 이것을 오버라이딩할 메소드 위에 추가하여 오타를 방지할 수 있다.


추가로 오버라이딩 할 메소드가 두개 이상일 때 각각의 메소드에 추가 시켜야한다.


아래의 코드를 작성 하자.


public static void main(String[] args) {

// TODO Auto-generated method stub

DognCat dnc = new DognCat();

Animal ani = new Animal();

ani.dogSound(); // 슈퍼클래스

ani.catSound(); // 슈퍼클래스

dnc.dogSound(); // 서브클래스

dnc.catSound(); // 서브클래스

}

}

class Animal { // 슈퍼클래스

public void dogSound() {

System.out.println("슈퍼클래스 dog: ..... !");

}

public void catSound(){

System.out.println("슈퍼클래스 cat: ..... !");

}

}

class DognCat extends Animal { // 서브클래스

@Override // 첫 문자는 대문자로

public void dogSound() {

System.out.println("서브클래스 dog: 멍멍 !"); // 오버라이딩

}

@Override

public void catSound(){

System.out.println("서브클래스 cat: 야아오오옹~");

}

}





상속의 개념 - 바로가기