Java-참조변수다형성(Polymorphism)과 메소드오버라이딩

김동규·2022년 11월 10일
0

JAVA

목록 보기
32/38

앞에서 참조변수의 다형성에 대해 알아보았다 그렇다면 이런 다형성을 가지고 사용할수있는 기능에는 무엇이있을까? 이부분은 메소드의 오버라이딩과 관계가깊으므로 메소드 오버라이딩을 알아보도록하자.

메소드 오버라이딩?

메소드 오버라이딩이란 상속받은 부모 클래스의 메소드를 재정의하여 사용
즉,부모메소드를 자식메소드가 대신호출되어 사용된다는 것
잠깐!🤚
🤔덮어씌우는것아닌가? 슈퍼로 부모메소드에 접근이 가능한것으로보아 자식메소드가 덮어서 부모메소드가 사라지는것은 아닌걸 알수있다. 대신호출된다고 생각하자

  1. 오버라이딩이란 메소드의 동작만을 재정의하는 것이므로, 메소드의 선언부는 기존 메소드와 완전히 같아야 한다,하지만 메소드의 반환 타입은 부모 클래스의 반환 타입으로 타입 변환할 수 있는 타입이라면 변경할 수 있다.

  2. 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없다.

  3. 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없다.

예시 코드로 알아보자.

Main.class

public static void main(String[] args) {
        CheeseCake ca1 = new CheeseCake();
        Cake ca2 = new CheeseCake();
        Cake ca3 = new Cake();

        ca1.yummy();//자식=자식
        ca2.yummy();//부모=자식->부모는 자식이 재정의한 yummy 메소드를 가지고 데이터 에 올림
        ca3.yummy();//부모=부모

        ca2.sweet();
        //ca2.milky(); 당연불가능 부모타입에 아예없는 milky
        ca1.milky();
        ca1.sweet();
    }
Cake.class
 	public void sweet(){
        System.out.println("sweet");
    }
    public void yummy(){
        System.out.println("야미 CAKE");
    }

CheeseCake.class
      public void milky(){
          System.out.println("Milky");
      }
      public void yummy(){
          System.out.println("야미 CHEESE CAKE");
      }

위에 코드에서 보면 알수있듯이 Cake(부모)타입에 CheeseCake(자식)객체를 집어넣어도 메소드 오버라이딩이 적용되는것을 알수있다.

@Override ?

@ -> 어노테이션

어노테이션이란?
어노테이션은 JDK5 부터 등장하였으며, 클래스나 메서드, 변수에 @을 사용하는 것을 말한다.

어노테이션은 사전적 의미로 주석을 뜻한다. 주석과는 역할이 다르지만, 주석처럼 달아 특수한 의미 부여가 가능하며, 기능 주입이 가능하다. 어노테이션을 사용하는 가장 큰 이유는 프로그램에게 추가 정보를 제공하는 메타 데이터를 위해서 사용한다.

@Override 어노테이션의 기능
자식 클래스에 여러 개의 메서드가 정의가 되어 있을 경우

해당 메소드가 부모 클래스에 있는 메서드를 Override 했다는 것을 명시적으로 선언한다. 가령 어노테이션을 사용하지 않으면 자식 클래스에 여러 개의 메서드가 있을 경우, 어떤 메서드가 Override 되었는지 쉽게 알기 어렵다. 이 때, 오버라이드 메서드를 사용하여 명시적으로 선언하게 되면 많은 메서드 중에서 어떠한 메서드가 부모 클래스로부터 오버라이딩이 되었는지 쉽게 파악할 수 있다. 실제로 본인이 작성한 코드는 쉽게 파악이 가능하겠지만, 다른 사람이 작성한 코드일 경우에는 알아보기가 어려울 수밖에 없다.

컴파일러에게 문법 체크를 하도록 알린다

오버라이딩을 하기 위해서는 부모 클래스의 있는 메서드명과 매개변수를 동일하게 가져가야 한다. 그런데 제대로 오버라이딩을 했다고 생각했는데, 매개변수를 잘못 지정했을 수도 있다. 따라서 해당 어노테이션을 사용하면 "이 메서드는 Override 된 거야!"라고 컴파일러에게 알려 컴파일시 체크를 할 수 있다.

profile
HigasiHosi

0개의 댓글