본문 바로가기
Java/Java 기초문법

[JAVA 기초] 자바 오버라이딩(Overriding)

by dev수니 2021. 3. 11.
반응형

 

 1  오버라이딩(Overriding)

 

 

오버라이딩(Overriding)은 자손클래스에서 부모 클래스로부터 물려받은 메서드를 다시 작성하는 것을 말한다.

 

다시 작성하는 이유는 부모로부터 메서드를 상속받았지만 자손 클래스에서는 부모와는 다르게 동작해야 할 때도 있기 때문이다. 오버라이딩을 할 때는 부모 클래스의 메서드와 선언부가 일치하는 메서드를 작성해야 한다.

 

class Parents{
    void method1(){
         // 부모 클래스의 메서드
    }
}
class Child extends Parents{
    void method1(){
        // 자손 클래스에서 메서드 내용을 재정의
    }
}

 

자손 인스턴스에서 오버라이딩을 한 메서드를 호출할 경우 이름이 같은 메서드가 부모 클래스에 있더라도 자손 클래스에서 다시 작성한 메서드가 호출된다.

 

 

즉 부모로부터 물려받은 클래스가 마음에 들지 않을 때, 자식 클래스는 언제든지 부모 클래스의 메서드를 재정의해서 사용한다.

 

 

 

 

 

 

 

※ 재정의할 메서드를 자동으로 선택해서 추가하는 방법

 

1. 추가할 자손 클래스에 키보드 입력을 활성화시켜둔 상태에서 이클립스 메뉴 source -> Override/Implement Methods 를 클릭한다.

 

2. Overriding할 메서드를 선택하고 OK를 눌러준다.

 

3. 다음과 같이 재 정의할 메서드가 자동으로 추가된다.

 

 

 

 

 


 

 

Ex 예제1 .

 

재정의 하고자 하는 메서드 m3()에 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
package java_practice;
 
class ParentC {
    void m1() {
        System.out.println("부모클래스의 m1() 실행됨.");
    }
    void m2() {
        System.out.println("부모클래스의 m2() 실행됨.");
    }
    void m3() {
        System.out.println("부모클래스의 m3() 실행됨.");
    }
}
class ChildC extends ParentC {
    void m3() {        // 재정의하고 싶은 메서드만 다시 언급함.(오버라이딩)
        System.out.println("자식 - m3() 실행됨.");
    }
}
 
public class Day18e {
    public static void main(String[] args) {
        ChildC obj = new ChildC();
        obj.m1();
        obj.m2();
        obj.m3();   // 자식클래스 단계에서 재정의("메서드 오버라이드")된 내용이 실행됨.
    }
}
cs

출력결과

부모클래스의 m1() 실행됨.
부모클래스의 m2() 실행됨.
자식 - m3() 실행됨.

 

 

 

 

 

 

Ex 예제 2 .

 

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
package java_practice;
 
class ParentDemo {
    void method1() {
        System.out.println("method1이 출력 ******");
    }
    void method2() {
        System.out.println("method2이 출력 ******");
    }
}
 
class ChildDemo extends ParentDemo {
    void method1() {
        // TODO Auto-generated method stub
        super.method1();      // ParentDemo 의 method1이 실행
        System.out.println("method1이 출력 -------");
    }
}
 
public class Overriding {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ChildDemo c1 = new ChildDemo();
        c1.method1();
        c1.method2();
    }
}
cs

 

줄13에서 부모클래스의 메서드 method1()을 자식클래스에서 오버로딩하였다.

 

따라서 줄25에서 자식 인스턴스 메서드 c1.method1()를 호출했을 때 줄13으로 가서 메소드method1()을 호출하게 된다. 그리고 줄15로 내려가면 super.method1();을 만나게 되는데 이것은 부모클래스(super)의 메소드(method1())을 의미하기 때문에 줄5의 메소드를 실행하게 되고, 그후 줄17의 내용을 실행하게 되는 것이다.

 

그리고 c1.method2()을 호출하게 되는데 c1객체(자손 인스턴스)는 부모 클래스(ParentDemo)로부터 상속받은 것이기 때문에 줄7의 내용이 실행되는 것이다.

 

따라서 출력결과는 다음과 같다.

method1이 출력 ******
method1이 출력 ------
method2이 출력 ******

 

반응형

댓글