[Java] 메소드 오버라이딩
2021. 11. 24. 16:53ㆍLanguage`/Java
메소드 오버라이딩 (Method Overriding)
- 슈퍼 클래스에 선언된 메소드와 같은 이름/리턴 타입/매개 변수 리스트를 갖는 메소드를 서브 클래스에서 재작성
- 슈퍼 클래스의 메소드를 '무시하기/덮어쓰기'
- 슈퍼 클래스 메소드의 접근 지정자보다 무조건 접근 범위가 같거나 넓어야 한다
- static/private/final로 선언된 메소드는 오버라이딩 X
※ 동적 바인딩
- 실행할 메소드를 컴파일 시(Compile time)에 결정하지 않고, 실행 시(Run time)에 결정
- 슈퍼 클래스의 메소드를 무시하고, 서브 클래스에서 오버라이딩한 메소드가 무조건 실행
※ Example
class Shape{
public void draw(){
System.out.println("Shape");
}
}
class Line extends Shape{
@Override
public void draw(){
System.out.println("Line");
}
}
class Rect extends Shape{
@Override
public void draw(){
System.out.println("Rect");
}
}
class Circle extends Shape{
@Override
public void draw(){
System.out.println("Circle");
}
}
public class test {
static void paint(Shape p){
p.draw();
}
public static void main(String[] args) {
Shape p = new Shape();
paint(p);
paint(new Line());
paint(new Rect());
paint(new Circle());
}
}
-------------------------
Shape
Line
Rect
Circle
메소드 오버로딩 / 메소드 오버라이딩
메소드 오버로딩 | 메소드 오버라이딩 | |
선언 | 같은 클래스나 상속 관계에서 동일한 이름의 메소드를 중복 작성 |
서브 클래스에서 슈퍼 클래스에 있는 메소드와 동일한 이름의 메소드 재작성 |
관계 | 동일 클래스 / 상속 관계 | 상속 관계 |
목적 | 이름이 같은 여러 개의 메소드를 중복 작성해서 편리성 향상 -> 다형성 실현 |
슈퍼 클래스에 구현된 메소드를 무시하고, 서브 클래스에서 새로운 기능의 메소드를 재정의 -> 다형성 실현 |
조건 | 메소드 이름 반드시 동일 매개변수 타입/개수가 달라야 한다 |
메소드 이름/매개변수 타입,개수/리턴 타입 모두 동일 |
바인딩 | 정적 바인딩 - 호출될 메소드는 컴파일 시에 결정 |
동적 바인딩 - 실행 시간에 오버라이딩된 메소드를 찾아서 호출 |