Overloading, Overriding

de_sj_awa·2021년 4월 22일
0
post-custom-banner

1. Overloading

  • 메소드의 이름은 같고 매개 변수를 다르게 하여 만들 수 있다.
  • 개수가 같아도 타입의 순서가 다르면 다른 메소드처럼 인식된다.
  • 매개 변수의 타입이 다르면 다른 메소드로 생각하지만, 타입이 같고 변수 이름이 다르면 같은 메소드로 인식한다.

이와 같이 메소드의 이름은 같도록 하고, 매개 변수만을 다르게 하는 것을 바로 오버로딩(Overloading)이라고 한다.

예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ReferenceOverloading {
    public static void main(String[] args){
        ReferenceOverloading reference = new ReferenceOverloading();
    }
    
    public void print(int data){
        
    }
    public void print(String data){
        
    }
    public void print(int intData, String stringData){
        
    }
    public void print(String stringData, int intData){
        
    }
}
 
cs

2. Overriding

자식 클래스에서 부모 클래스에 있는 메소드와 동일하게 선언하는 것을 메소드 Overriding이라고 한다. 접근 제어자, 리턴 타입, 메소드 이름, 매개 변수 타입 및 개수가 모두 동일해야만 메소드 Overriding이라고 한다. Overriding이라는 단어의 사전적 의미는 "다른 무엇보다 더 중요한, 최우선시 되는" 이라는 뜻이다.

예제 코드

ParentOverriding 클래스

1
2
3
4
5
6
7
8
9
10
11
package Overriding;
 
public class ParentOverriding {
    public ParentOverriding(){
        System.out.println("ParentOverriding Constructor");
    }
    
    public void printName(){
        System.out.println("printName() - ParentOverriding()");
    }
}
cs

ChildOverriding 클래스

1
2
3
4
5
6
7
8
9
10
11
12
package Overriding;
 
public class ChildOverriding extends ParentOverriding{
    public ChildOverriding(){
        System.out.println("ChildOverriding Constructor");
    }
 
    public void printName(){
        System.out.println("printName() - ChildOverriding()");
    }
}
 
cs

InheritanceOverriding 클래스

1
2
3
4
5
6
7
8
9
package Overriding;
 
public class InheritanceOverriding {
    public static void main(String[] args){
        ChildOverriding child = new ChildOverriding();
        child.printName();
    }
}
 
cs

결과는 다음과 같이 출력된다.

ParentOverriding 클래스에 선언된 printName() 메소드가 수행된 것이 아니라, ChildOverriding 클래스에 선언된 printName() 메소드가 호출된 것을 볼 수 있다. 다시 말해서 부모 클래스에 선언되어 있는 메소드와 동일하게 선언되어 있는 메소드를 자식 클래스에 선언하면 자식 클래스의 메소드만 실행된다. 생성자의 경우 자동으로 부모 클래스에 있는 생성자를 호출하는 super()가 추가되지만, 메소드는 그렇지 않다. 이게 바로 메소드 Overriding이다.

그리고 동일하게 선언되어 있다는 말은 동일한 시그니처를 가지고 있다는 말과 동일하다. 여기서 시그니처는 메소드 이름과 매개 변수의 타입 및 개수를 의미한다. 또한 부모 클래스를 Overriding한 메소드의 리턴 타입을 다르게 리턴하면 안 된다. 또한 접근 제어자가 더 확대되는 것은 문제가 안 되지만, 축소되는 것은 문제가 발생한다. 즉, public > package-private > private(오른쪽으로 갈수록 접근 권한이 좁아짐)의 순인데, 예를 들어 부모 클래스에서 public으로 선언한 것을 자식 클래스에서 private으로 선언할 수 없다. 부모가 만약 private으로 선언했으면 자식은 어떤 것으로 선언하든지 상관 없다.

Overriding에 대해 정리하면 다음과 같다.

  • 메소드 Overriding은 부모 클래스의 메소드와 동일한 시그니처를 갖는 자식 클래스의 메소드가 존재할 때 성립된다.
  • Overriding된 메소드는 부모 클래스와 동일한 리턴 타입을 가져야 한다.
  • Overriding된 메소드의 접근 제어자는 부모 클래스에 있는 메소드와 달라도 되지만, 접근 권한이 확장되는 경우에만 허용된다. 접근 권한이 축소될 경우에는 컴파일 에러가 발생한다.

3. Overloading과 Overriding

  • Overloading : 확장 (메소드의 매개 변수들을 확장하기 때문에, 확장)
  • Overriding : 덮어 씀(부모 클래스의 메소드 시그니처를 복제해서 자식 클래스에서 새로운 것을 만들어 내어 부모 클래스의 기능은 무시하고, 자식 클래스에서 덮어 씀)

참고

  • 자바의 신
profile
이것저것 관심많은 개발자.
post-custom-banner

0개의 댓글