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