메소드 오버라이딩

Heidi·2023년 6월 14일
0

메소드 오버라이딩이란?

자식 클래스는 부모 클래스의 메소드를 상속 받아서 사용할 수 있다. 하지만 그대로가 아니고 변경해서 사용하고 싶은 메소드가 있을 수 있다. 메소드 오버라이딩이란 자식 클래스가 부모 클래스의 메소드를 자신의 필요에 맞추어서 재정의하는 것이다. 이때 메소드 이름이나 매개 변수, 반환형은 동일하여야 한다. 오버라이딩은 부모 클래스의 메소드를 무시하고 덮어씌운다는 의미이다. 자식 객체에서 해당 메소드를 실행하면 오버라이딩된 메소드가 실행된다.

class Shape {
public void draw() {
System.out.println("shape");
}

}

class Circle extends Shape {

@Override
public void draw() {
    System.out.println("Circle을 그립니다.");
}

}

class Rectangle extends Shape {

@Override
public void draw() {
    System.out.println("Rectangle을 그립니다.");
}

}

public class ShapeTest {
public static void main(String[] args) {
Rectangle s = new Rectangle();
s.draw();
}
}

메인을 보자. Rectangle 클래스의 객체에 대해 draw()가 호출되면 Rectangle 클래스 안에서 오버라이딩 된 draw()가 호출된다. Shape의 draw()가 호출되는 게 아니다.

부모 클래스와 자식 클래스의 메소드가 완벽하게 일치하여야 오버라이딩으로 처리된다. 만약 그렇지 않으면 메소드 오버로딩으로 처리된다.

*메소드 오버로딩 : 같은 이름의 메소드를 인수만 달리해서 여러 번 정의하는 것.

키워드 super를 사용하여 부모 클래스 멤버 접근

키워드 super는 상속 관계에서 부모 클래스의 메소드나 필드를 명시적으로 참조하기 위해 사요ㅗㅇ된다. 만약 부모 클래스의 메소드를 오버라이딩한 경우, super를 사용하면 부모클래스의 메소드를 호출할 수 있다.

보통 메소드를 오버라이딩 할 때, 부모 클래스의 메소드를 완전히 대치하는 경우보다 내용을 추가하는 경우가 많다. 이런 경우에는 super 키워드를 이용하여 부모 클래스의 메소드를 호출해준 후에 자신이 필요한 부분을 추가해주는 것이 좋다.

오버라이딩 vs 오버로딩

오버로딩이란 같은 메소드를 가진 여러 개의 메소드를 작성하는 것이다.

 class Shape {
 	public void draw() { A }
    public void draw(int x, int y) {...}
 }

오버라이딩부모 클래스의 메소드를 자식 클래스가 다시 정의하는 것을 의미한다.

class Circle extends Shape {
	public void draw() { A-1 }
}

이름을 재사용하는 것은 같다.

정적 메소드를 오버라이드 하면 어떻게 될까?

동일한 시그니처(이름, 매개변수의 번호 및 유형 포함) 자식 클래스의 인스턴스 메소드는 부모 클래스의 메소드를 재정의(오버라이드, 무효화)한다. 그런데 만약 동일한 시그니처를 가지는 정적 메소드(여러 객체끼리 공유하는 메소드)가 있다면 어떻게 될까?

오버라이드된 인스턴스 메소드가 호출되면 항상 자식 클래스의 메소드가 호출된다. 하지만 정적 메소드의 경우에는 어떤 참조 변수를 호출하는지에 따라 달라진다.

class Animal {
	public static void A(){
	System.out.println("static method in Animal");
}
}

Public class Dog extends Animal {
	public static void A() {
    System.out.println("static method in Dog");
    }
}

main {
	Dog dog = new Dog();
    Animal a = dog;
    a.A();
    dog.A();
}

Dog dog = new Dog();
dog.A();
=> Dog 참조변수를 통하여 정적 메소드를 호출하면 자식 클래스의 정적 메소드가 호출된다.

Animal a = dog;
a.A();
=> Animal 참조 변수를 통하여 정적 메소드를 호출하면 부모 클래스의 정적 메소드가 호출된다.

만약 정적 메소드가 아니었다면 a.A(); 도 자식 클래스의 A()가 호출되었을 것이다. 오버라이드를 통해 부모의 메소드가 무효화되기 때문임.

0개의 댓글

관련 채용 정보