오버라이딩(overriding)


오버라이딩(overriding)은 부모(혹은 조상) 클래스로부터 상속받은 메서드를 재정의하는 것을 의미합니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class TwoAdd {
    int a;
    int b;
    
    int Add() {
        return a + b;
    }
}
 
class ThreeAdd extends TwoAdd {
    int c;
    
    int Add() {
        return a + b + c;
    }
}
 
public class OverridingExam {
 
    public static void main(String[] args) {
        
        ThreeAdd A1 = new ThreeAdd();
        A1.a = 5;
        A1.b = 10;
        A1.c = 15;
        
        System.out.println(A1.Add2());
 
    }
}
cs

 

위 예제 코드를 살펴보시면 TwoAdd 클래스에서는 두 가지 변수 값을 더해주는 Add() 메서드가 있습니다. 그런데 우리는 두 가지 변수가 

 

아닌 세 가지 변수 값을 더해주는 방식으로 사용하고 싶어 상속받은 ThreeAdd 클래스에서 Add() 메서드를 재정의 하였습니다.

 

따라서 22행부터 27행까지를 보시면 상속받았기 때문에 변수 a와 변수 b를 사용할 수 있었고, 중요한 것은 재정의 한 Add() 메서드를 통해

 

세 값을 더한 결과를 정상적으로 출력할 수 있다는 것입니다.


오버라이딩(overriding) 조건


첫 번째, 재정의 할 메서드 선언부가 상속 받은 클래스(부모 혹은 조상 클래스)메서드 즉 기존의 메서드 선언부와 같아야 합니다.

 

앞서 우리가 다루었던 메서드 선언부는 다음과 같이 구성된다고 하였습니다.

 

반환타입 메서드명 (경우에 따라 매개변수 목록 나열)

 

이 선언부는 기존의 메서드와 다르게 지정해서는 안된다는 것이 조건입니다. (위 코드에서 5행과 13행을 봐주세요!)

 

 

 

** 두 번째와 세 번째 조건은 이후 나올 접근 제어자 및 예외 개념이 필요하기 때문에, 지금은 조건만 확인하고 진행해주세요! **

 

두 번째, 재정의 할 자식 클래스 내 메서드의 접근 제어자 범위가 상속을 해준 클래스(부모 클래스)의 범위보다 좁으면 안 됩니다.

 

세 번째, 재정의 할 자식 클래스 내 메서드의 예외 처리할 개수가 상속을 해준 클래스(부모 클래스) 보다 적거나 같아야 한다.

 


오버로딩(Overloading) vs 오버라이딩(Overriding) ??


앞에 오버(Over)가 둘다 붙어서 상당히 연관이 있는 것처럼 생각이 드실 수 있지만, 편하게 이 둘을 그저 다르게 받아들이시면 됩니다.

 

오버로딩은 이전에 다루었지만 간략히 요약해보자면 매개 변수를 기준으로 같은 메서드 이름으로 통일된 다양한 메서드들을 기능에 따라

 

호출하고 싶을 때 사용한다고 하였습니다. ex) println을 떠올리시면 이해가 쉽습니다! "출력"이라는 역할은 똑같이 수행하게 하고 싶은데,

 

타입만 구분해서 출력해주고 싶다면 매개 변수만 다르게 해주면 되겠죠?

 

(기억이 안 나시거나 이해가 안되시면 오버로딩(https://developer-vanilla.tistory.com/16) 글 참고를 부탁드립니다!)

 

오버라이딩은 "상속받은" 메서드를 편의에 따라 재정의하고 싶을 때 사용한다고 하였습니다.

 

좀 더 쉽게 정리해보자면~

 

오버로딩은 같은 이름으로 여러 메서드들을 "정의" 하는 것이 되겠고

 

오버라이딩은 특정 메서드를 "변경(혹은 재정의)" 하는 것이라고 할 수 있겠습니다.

 

 

 

마지막으로 오버로딩과 오버라이딩을 잘 이해하셨는지 아래 코드로 한번 테스트해보세요! 정답은 밑에 더보기 클릭!

 

(8행부터 21행까지 보시고 각 메서드에 대해서 오버로딩을 사용했는지, 오버라이딩을 사용했는지 구분해보세요!)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Parent1 {
    void Method1() {
        // 중략
    }
{
 
class Child1 extends Parent1 {
    void Method1() {
        // 중략
    }
    void Method1(int a, int b) {
        // 중략
    } 
 
    void Method2() {
        // 중략
    }
 
    void Method2(int a, int b, int c) {
        // 중략
    }
 
}
cs

 

정답

더보기

8행 메서드~ : 오버라이딩 (상속 받은 메서드를 재정의)

 

11행 메서드~ : 오버로딩 (선언부가 다르기 때문에 우선 오버라이딩x, 매개변수 구분을 통한 같은 이름의

메서드 정의

 

15행 메서드~ : 단순 메서드 정의

 

19행 메서드~ : 오버로딩 (매개변수 구분을 통한 같은 이름의 메서드 정의)

+ Recent posts