메서드 오버라이딩 (재정의)

#JAVA #오버라이딩 #재정의
Jan 04, 2024
메서드 오버라이딩 (재정의)

메서드 오버라이딩이란?

자식 클래스가 부모 클래스의 메서드를 자신의 필요에 맞춰 재정의 하는 것이다. 즉, 부모 클래스의 메서드를 무시하고 덮어 씌운다는 의미이다.
이때 메서드의 이름, 매개변수, 반환형은 동일해야한다.
 
예제코드
package test01; class Shape{ public void draw(){ System.out.println("Shap"); } } class Circle extends Shape{ @Override public void draw() { System.out.println("Circle을 그립니다."); } } class Rectangle extends Shape{ @Override public void draw() { System.out.println("Rectangle을 그립니다."); } } class Triangle extends Shape{ @Override public void draw() { System.out.println("Triangle을 그립니다."); } } public class ShapTest { public static void main(String[] args) { Rectangle s = new Rectangle(); s.draw(); } }
Rectangle 클래스의 객체에 대해 draw()가 호출 되면
Rectangle 안에서 오버라이딩 한 draw()가 호출 된다.
 
을 호출했을 때 부모 클래스의 메서드를 가려 버리고
 
// 실행 값 Rectangle을 그립니다.
 
super 키워드 사용하여 부모 클래스에 접근
부모 클래스의 메서드를 오버라이딩 한 경우,
부모 클래스의 메서드를 대치하는 것 보다 내용을 추가하는 경우가 많다.
이런 경우 super 키워드를 이용하여 부모 클래스의 메서드를 호출한 뒤
자신이 필요한 부분을 추가 해준다.
package test01; class Shape{ public void draw(){ System.out.println("Shap 중의 하나를그릴 예정입니다."); } }
 
class Circle extends Shape{ @Override public void draw() { super.draw(); // 부모 클래스 draw() 호출 System.out.println("Circle을 그립니다."); } } class Rectangle extends Shape{ @Override public void draw() { super.draw(); // 부모 클래스 draw() 호출 System.out.println("Rectangle을 그립니다."); } } class Triangle extends Shape{ @Override public void draw() { super.draw(); // 부모 클래스 draw() 호출 System.out.println("Triangle을 그립니다."); } }
super 키워드를 이용하여 부모 클래스의 메서드를 호출
 
public class ShapTest { public static void main(String[] args) { Rectangle s = new Rectangle(); s.draw(); } }
Rectangle() 호출
 
// 실행 값 Shap 중의 하나를그릴 예정입니다. Rectangle을 그립니다.
 

오버라이딩 VS 오버로딩

💡
혼동하지 말자!
 

정적 메서드 오버라이드

정적 메서드를 오버라이드 하려면 메서드의 선언이 부모 클래스와 자식 클래스에서 완전히 동일해야 하지만, 실제로는 오버라이드 되지 않고 각 클래스에서 독립적으로 정의된다.
 
예제코드
package coding; class Animal{ public static void A(){ System.out.println("Anmal"); } } class Dog extends Animal{ // 자식 클래스의 정적 메서드가 호출 된다. public static void A(){ System.out.println("Dog"); } } public class AnimalEx01 { public static void main(String[] args) { Dog dog = new Dog(); // Dog 참조 변수를 통해 정적 메서드를 호출하면 Animal a = dog; a.A(); dog.A(); } }
 
// 실행 값 Anmal Dog
Dog 참조 변수를 통해 정적 메서드를 호출하면 자식 클래스의 정적 메서드가 호출 된다.
Animal 참조 변수를 통해 정적 메서드를 호출하면 부모 클래스의 정적 메서드가 호출된다.
만약 정적 메서드가 아니었다면 a를 통하여 호출해도 메서드 오버라이딩 때문에 A()가 호출 되었을 것이다.
 
정적 메서드 오버라이딩 경우
정적 메서드 아니였을때
notion image
실행 값
notion image
실행 값
notion image
 
notion image
 
실제로는 오버라이드 되지 않고 각 클래스에서 독립적으로 정의 되어서 실행 되는 걸 알 수 있다.
아닌 경우에는 독립적으로 정의 되지 않고 자식 클래스에서 재정의 해서 실행 되는 걸 알 수 있다.
 
 
 
 
Share article

Coding_study