PengTory

[Java] 오버라이딩(Overriding)이란? 본문

Java

[Java] 오버라이딩(Overriding)이란?

펭토리 2022. 12. 9. 02:07

오버라이딩이란?

오버라이딩이란 상속 관계에 있느 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것을 말한다.

자바에서 자식 클래스는 부모 클래스의 private을 제외하고는 모든 메소드를 상속받는다.

상속받은 메소드는 그대로 사용할 수 도 있지만 필요에 의해 재정의해 사용할 수 있다.

따라서 메소드 오버라이딩이란 상속받은 부모 클래스의 메소드를 재정의해 사용하는 것을 말한다.

 

오버라이딩의 조건

오버라이딩은 메소드의 내용만 새로 작성하는 것이기 때문에 메서드의 선언부는 부모의 것과 완전히 일치해야 한다.

따라서 오버라이딩 성립을 위해서는 아래 조건이 만족되어야한다.

 

1) 메소드의 선언부는 기존 메소드와 완전히 같아야한다.

2) 메소드의 반환 타입은 부모 클래스의 반환 타입으로 타입 변환할 수 있는 타입이라면 변경할 수 있다.

3) 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없다.

- 만일 부모 클래스에 정의된 메소드의 접근 제어자가 protected라면, 이를 오버라이딩 하는 자식 클래스의 메서드는 접근 제어자가 protected이거나 public이어야 한다.

4) 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없다.

 

예시

자바에서는 메소드 오버라이딩을 통해 상속받은 부모 클래스의 메소드를 자식 클래스에서 직접 정의할 수 있다.

부모 클래스인 Parent 클래스의 display() 메소드를 자식 클래스인 Child 클래스에서 오버라이딩 하는 예제

class Parent {
    void display() { System.out.println("부모 클래스의 display() 메소드입니다."); }
}

class Child extends Parent {
    void display() { System.out.println("자식 클래스의 display() 메소드입니다."); }
}

public class Inheritance05 {
    public static void main(String[] args) {
        Parent pa = new Parent();
        pa.display();
        Child ch = new Child();
        ch.display();
        Parent pc = new Child();
        pc.display(); // Child cp = new Parent();
    }
}

실행결과는 다음과 같다.

 

부모 클래스의 display() 메소드입니다.

자식 클래스의 display() 메소드입니다.

자식 클래스의 display() 메소드입니다.

 

오버라이딩과 오버로딩

오버라이딩과 오버로딩은 이름이 비슷하지만 다르다. 간단하게만 정리해보자.

* 오버로딩은 자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다.

 

- 오버라이딩 (overriding) : 상속받은 메소드의 내용을 변경하는 것

- 오버로딩 (overloading) : 기존에 없는 새로운 메소드를 정의하는 것

 

예시

아래 예제는 부모 클래스인 Parent 클래스의 display() 메소드를 자식 클래스인 Child 클래스에서 오버라이딩과 오버로딩을 둘 다 수행하는 예제이다.

class Parent {
    void display() { System.out.println("부모 클래스의 display() 메소드입니다."); }
}

class Child extends Parent {
    // 오버라이딩된 display() 메소드
    void display() { System.out.println("자식 클래스의 display() 메소드입니다."); }
    // 오버로딩된 display() 메소드
    void display(String str) { System.out.println(str); } 
}

public class Inheritance06 {
    public static void main(String[] args) {
        Child ch = new Child();
        ch.display();
        ch.display("오버로딩된 display() 메소드입니다.");
    }
}

실행결과는 다음과 같다.

 

자식 클래스의 display() 메소드입니다.

오버로딩된 display() 메소드입니다.