자바 문법
자바 메소드 오버라이딩
Nickman
2024. 4. 9. 20:20
메소드 오버라이딩은 슈퍼 클래스와 서브 클래스의 메소드 사이에 발생하는 관계로서, 슈퍼 클래스에 선언된 메소드와 같은 이름, 같은 리턴 타입, 같은 매개 변수 리스트를 갖는 메소드를 서브 클래스에 재작성하는 것이다. 서브 클래스의 개발자는 슈퍼 클래스에 있는 메소드로 목적하는 바를 이룰 수 없을 때 동일한 이름의 메소드를 서브 클래스에 다시 작성할 수 있다.
메소드 오버라이딩은 '슈퍼 클래스 메소드 무시하기 혹은 덮어쓰기' 로 표현할 수 있다. 이는 슈퍼클래스의 메소드를 무시하고 서브 클래스에서 오버라이딩된 메소드가 무조건 실행되도록 한다는 것인데, 이런 처리를 동적 바인딩이라고 부르며, 메소드 오버라이딩은 동적 바인딩을 유발시킨다.
오버라이딩의 목적, 다형성 실현
오버라이딩은 수퍼 클래스에 선언된 메소드를, 각 서브 클래스들이 자신만의 내용으로 새로 구현하는 기능이다.
다음의 예시로 연습해보자.
package MethodOverrdingEx;
class Shape{ //슈퍼 클래스
public Shape next;
public Shape() {next=null;}
public void draw() {
System.out.println("Shape");
}
}
class Line extends Shape{
public void draw() {
System.out.println("Line");
}
}
class Rect extends Shape{
public void draw() {
System.out.println("Rect");
}
}
class Circle extends Shape{
public void draw() {
System.out.println("Circle");
}
}
public class MethodoverridingEx {
static void paint(Shape p) {
p.draw(); // p가 가리키는 객체 내에 오버라이딩된 drawn()호출. 동적 바인딩
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Line line=new Line();
//다음 호출들은 모두 paint()메소드 내에서 Shape에 대한 레퍼런스 p로 업캐스팅됨
paint(line);
paint(new Shape());
paint(new Line());
paint(new Rect());
paint(new Circle());
}
}
메소드 오버라이딩의 제약 사항
- 슈퍼 클래스의 메소드와 동일한 원형으로 작성한다.
- 슈퍼 클래스 메소드의 접근 지정자보다 접근의 범위를 좁여 오버라이딩 할 수 없다.
메소드 오버라이딩 활용
메소드 오버라이딩은 서브 클래스 개발자가 슈퍼 클래스의 특정 메소드를 자신의 특성에 맞게 새로 만들어 사용하고자 하는 경우에 활용된다.
오버라이딩과 super 키워드
메소드가 오버라이딩되어 있는 경우, 동적 바인딩에 의해 항상 서브 클래스에 오버라이딩한 메소드가 호출됨을 설명하였다. 그러면 슈퍼 클래스의 메소드는 이제 더 이상 쓸모없게 된 것인가? 실행하는 방법은 없는가? 아니다. 다음과 같이 서브클래스에서 super 키워드를 이용하면 정적 바인딩을 통해 슈퍼클래스의 멤버에 접근할 수 있다.
super.슈퍼클래스의멤버
name="Circle"; //Circle 클래스의 name에 "Circle" 기록
super.name="Shape"; // Shape 클래스의 name에 "Shape"기록
super.draw(); // Shape 클래스의 draw() 호출. 정적 바인딩