1. 메소드 Overriding이란?

 

자식 클래스에서 부모 클래스에 있는 메소드와 동일하게 선언하는 것을 "메소드 Overriding" 이라고 합니다. 접근 제어자, 리턴 타입, 메소드 이름, 매개 변수 타입 및 개수가 모두 동일해야만 "메소드 Overriding"이라고 부릅니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
package c.inheritance;
    
public class Parent {
        
    public Parent(String name) {
        System.out.println("Parent(String) Constructor");
    }
        
    public void printName() {
        System.out.println("printName() - Parent");
    }    
}

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package c.inheritance;
 
public class Child extends Parent{
    
    public Child() {
        super(null);
        System.out.println("Child Constructor");
    }
    
    public Child(String name) {
        super(name);
        System.out.println("Child(String) Constructor");
    }
    
    public void printAge() {
        System.out.println("printAge() - 18 month");
    }
    
    public void printName() {
        System.out.println("printName() - Child");
    }
}

 

 

1
2
3
4
5
6
7
8
9
10
11
package c.inheritance;
 
public class Inheritance {
 
    public static void main(String[] args) {
        Child child = new Child();
        child.printName();
    }
    
}
 

 

 

Parent의 printName() 메소드를 Child 클래스에서 오버라이딩 후 실행해 봅시다. 아래의 결과를 얻을 수 있을 것입니다. 부모 클래스에 선언되어 있는 메소드와 동일하게 선언되어 있는 메소드를 자식 클래스에 선언하면 자식 클래스의 메소드만 실행됩니다.

 

1
2
printName() - Child

 

 

생성자의 경우 자동으로 부모 클래스에 있는 생성자를 호출하는 super()가 추가되지만, 메소드는 그렇지 않습니다. 이게 바로 "메소드 Overriding"입니다. 

 

그렇다면 접근 제어자를 변경하는 것은 어떨까요? 부모 클래스의 printName() 메소드는 public으로 되어 있고, 자식 클래스에서는 private로 선언했습니다.이렇게 하고 Child 클래스를 컴파일 해봅시다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
package c.inheritance;
    
public class Parent {
        
    public Parent(String name) {
        System.out.println("Parent(String) Constructor");
    }
        
    public void printName() {
        System.out.println("printName() - Parent");
    }    
}

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package c.inheritance;
 
public class Child extends Parent{
    
    public Child() {
        super(null);
        System.out.println("Child Constructor");
    }
    
    public Child(String name) {
        super(name);
        System.out.println("Child(String) Constructor");
    }
    
    public void printAge() {
        System.out.println("printAge() - 18 month");
    }
    
    private void printName() {
        System.out.println("printName() - Child");
    }
}

 

 

 

printName() 메소드를 override하려는데 접근 제어자가 더 확대되는 것은 문제가 안되지만, 축소되는 것은 문제가 된다는 것입니다. 즉, public > protected > package-private > private의 순으로 오른쪽으로 갈수록 접근 권한이 좁아집니다. 정리를 하겠습니다.

 

● 메소드 Overriding은 부모 클래스의 메소드와 동일한 시그네쳐를 갖는 자식 클래스의 메소드가 존재할 때 성립된다

● Overriding 된 메소드는 부모 클래스와 동일한 리턴 타입을 가져야만 한다.

● Overriding 된 메소드의 접근 제어자는 부모 클래스에 있는 메소드와 달라도 되지만, 접근 권한이 확장되는 경우에만 허용된다. 

 

 

'Java' 카테고리의 다른 글

[Java] 14. 다형성(Polymorphism)  (0) 2019.03.26
[Java] 13. 참조 자료형의 형 변환  (0) 2019.03.23
[Java] 11. 상속  (0) 2019.03.21
[Java] 10. 접근 제어자  (0) 2019.03.19
[Java] 9.패키지  (0) 2019.03.10
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기