오버라이딩(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행 메서드~ : 오버로딩 (매개변수 구분을 통한 같은 이름의 메서드 정의)
'java > 객체지향' 카테고리의 다른 글
14. 패키지(package)와 클래스패스(classpath) (2) | 2023.01.17 |
---|---|
13. 생성자 super()와 참조변수 super (0) | 2023.01.17 |
11-1. (보충) 상속 (0) | 2023.01.16 |
11. 상속(Inheritance)과 포함(Composite) (0) | 2023.01.16 |
10. 멤버 변수 초기화 및 순서 (2) | 2023.01.16 |