참고 출처: https://opentutorials.org/course/1223/6090



1. 오버라이딩이란

오버라이딩은 부모 클래스 기능을 자식 클래스에게 물려주는 기능인 상속과 연관이 깊다.

오버라이딩이란, 부모 클래스의 메서드를 물려 받긴 했지만 부모가 갖고 있는 메서드를 쓰지 않고

자식 클래스의 필요에 따라 그 메서드를 다시 정의해서 기능을 변경하는 것을 말한다.


2. 재정의

자식 클래스 입장에서 부모 클래스는 기본적인 동작 방법을 정의한 것이라면, 

자식 클래스에서 메소드를 재정의하는 것은 부모 클래스로부터 물려 받은 기본 동작 방법을 변경하는 것이라 할 수 있다. 

예를 들어 계산기라는 클래스가 sum() 이라는 1+2를 해주는 메서드라 할 때 

sum() 메서드를 오버라이딩을 하여 1+2를 더하고 출력까지 해주는 메서드로 변경해 줄 수 있다. 



3. 조건

오버라이딩을 하기 위한 메서드 정의는 

메서드의 이름, 매개변수의 숫자와 데이터 타입과 순서, 리턴타입이 모두 부모클래스의 메서드의 정의와 같아야 한다.



4. 예제

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// 부모 메서드
class Calculator {
    int left, right;
 
    public void setOprands(int left, int right) {
        this.left = left;
        this.right = right;
    }
 
    public void sum() {
        System.out.println(this.left + this.right);
    }
 
    public int avg() {
        return ((this.left + this.right) / 2);
    }
}
 
 
// 자식 메서드
class SubstractionableCalculator extends Calculator {
     
    // Overriding
    public void sum() {
        System.out.println("실행 결과는 " +(this.left + this.right)+"입니다.");
    }
     
    // Overriding
    public int avg() {
        // 상위 클래스의 메서드 호출
        return super.avg();
    }
     
    public void substract() {
        System.out.println(this.left - this.right);
    }
}
 
 
public class CalculatorDemo {
    public static void main(String[] args) {
        SubstractionableCalculator c1 = new SubstractionableCalculator();
        c1.setOprands(1020);
        c1.sum();
        System.out.println("실행 결과는 " + c1.avg());
        c1.substract();
    }
}
 
// 실행 결과는 30입니다.
// 실행 결과는 15
// -10
cs


유의할 점은, 위의 실행결과는 c1.sum이 부모 클래스의 메소드가 아니라 자식 클래스의 메소드 sum을 실행하고 있다.

오버라이딩한 메서드 호출 시, 부모 클래스가 갖고 있는 메서드는 무시가 되고 자식 클래스의 메서드가 실행된다.



5. 사전적 의미

즉, Overriding이란 "riding(올라탄다)"의 의미로 부모 클래스의 메소드의 동작방법을 변경하며,

"overriding(최우선의)"의 의미로 부모 클래스와 자식 클래스의 메서드 명칭이 같을 시에는 우선순위가 자식 클래스에 있다는 뜻으로 이해할 수 있겠다.


'Java' 카테고리의 다른 글

직렬화 (Serialization)  (0) 2018.08.04
Overloading (오버로딩)  (0) 2018.07.28
String, StringBuffer, StringBuilder  (0) 2018.07.17
Scanner와 BufferedReader  (0) 2018.07.17
객체(Object), 클래스(Class), 인스턴스(Instance)  (0) 2018.07.16

+ Recent posts