JAVA

[Java.3-3] 메소드 오버라이딩

식빵민 2022. 4. 16. 18:44

메소드 오버라이딩 : 슈퍼 클래스의 메소드를 서브 클래스에서 재정의(덮어쓰기)

  • 슈퍼 클래스 메소드의 이름, 매개변수 타입 및 개수, 리턴 타입 등 모두 똑같이 작성 (*하나라도 다른 경우 오버로딩이라고 함)
  • 동적 바인딩 발생 : 무조건 서브 클래스에 오버라이딩된 메소드 실행
    • 실행 시간(컴파일 타임) 다형성 실현
  • 슈퍼 클래스에 선언된 메소드를  서브 클래스들이 자신만의 내용으로 새로 구현
  • 객체 지향의 다형성 실현
    class Animal{
    	public void bark(){System.out.println(" ");}
    }
    class Dog extends Animal{
    	public void bark(){System.out.println("멍멍");}//오버라이딩
    }
    class Cat extends Animal{
    	public void bark(){System.out.println("야옹");}//오버라이딩
    }
    public class OverRidingEx{
    	static void sound(Animal a){ a.bark; )//오버라이딩된 bark 호출
    	public void main(String[] args){
        	Dog d = new Dog();//서브 클래스 레퍼런스로 오버라이딩된 메소드 호출
            Animal c = new Cat();
            //업캐스팅에 의해 슈퍼클래스 레퍼런스로 오버라이딩된 메소드 호출(동적 바인딩)
            d.bark();//"멍멍" 출력
            c.bark();//"야옹" 출력
            sound(new Dog()); //"멍멍" 출력
    	}
    }
  • 동적 바인딩
    • 실행할 메소드를 실행 시(run time)에 결정
    • 항상 오버라이딩 메소드 호출
      class Animal{
          public void shout(){ bark(); }//2.bark()함수 호출
          public void bark(){ System.out.println(" "); }
      }
      public class Dog extends Animal{
          @Override//오버라이딩시 실수를 줄여주기 위한 수단
          public void bark(){ System.out.println("멍멍"); }//3.무조건 오버라이딩된 메소드 호출
          public static void main(String[] args){
              Animal bud = new Dog();
              bud.shout();//1.Animal클래스의 shout()함수 호출
          }
      }
멍멍
  • 오버라이딩과 super 키워드
    • super 키워드는 슈퍼 클래스의 멤버 접근할 때 사용
      • 서브 클래스에서만 사용
      • 슈퍼 클래스의 메소드 호출
      • 컴파일러는 super의 접근을 정적 바인딩으로 처리
class Animal{
    public void shout(){ bark(); }//2.bark()함수 호출
    public void bark(){ System.out.println("뿡"); }
}
public class Dog extends Animal{
    @Override//오버라이딩시 실수를 줄여주기 위한 수단
    public void bark(){ 
        super.bark();//3.슈퍼클래스 Animal클래스의 bark()함수 호출
        System.out.println("멍멍"); 
    }
    public static void main(String[] args){
        Animal bud = new Dog();
        bud.shout();//1.Animal클래스의 shout()함수 호출
    }
}

멍멍
  • 오버라이딩 vs 오버로딩
비교 요소 메소드 오버로딩 메소드 오버라이딩
선언 같은 클래스나 상속 관계에서 동일한 이름의 메소드 중복 작성 서브 클래스에서 슈퍼 클래스에 있는 메소드와 동일한 이름의 메소드 재작성
관계 동일한 클래스 내부 혹은 상속 관계 상속관계
목적 이름이 같은 여러 메소드를 중복 작성하여 사용의 편리성 향상, 다형성 실현 슈퍼 클래스에 구현된 메소드를 무시하고 서브 클래스에서 새로운 기능의 메소드를 재정의하고자 함. 다형성 실현
조건 메소드 이름은 반드시 동일해야하고, 매개변수의 타입이나 개수가 달라야함. 메소드의 이름. 매개변수 타입과 개수. 리턴 타입이 모두 동일하여야 함
바인딩 정적 바인딩. 호출될 메소드는 컴파일 시 결정 동적 바인딩. 실행 시간에 오버라이딩된 메소드 찾아 호출