취뽀몽

[Java] 오버로딩과 오버라이딩(Overloading And Overriding) 본문

java

[Java] 오버로딩과 오버라이딩(Overloading And Overriding)

허몽구 2023. 3. 6. 19:38

오버로딩과 오버라이딩의 개념이 헷갈릴 때가 있는 것 같아서 정리하고자 한다.

 

1. 오버로딩(Overloading)

오버로딩을 네이버 사전에서 검색해보면,

라는 뜻으로 검색된다.

 

자바의 관점에서의 오버로딩은 한 클래스 내에서 같은 메소드의 명칭을 가지더라도,

매개변수의 개수나 타입이 다르면 같은 이름으로 정의할 수 있다는 의미이다.

 

오버로딩은 메소드의 명칭은 동일해도 되지만, 반드시 매개변수의 개수나 타입이 달라야한다.

리턴값만 다르거나, 접근제어자만 다른 것은 오버로딩 할 수 없다.

 

예시를 통해 알아보자.

public class OverloadingEx {
    private void printEx() {
        System.out.println("1번 오버로딩");
    }

    private void printEx(int a) {
        System.out.println("2번 오버로딩 : " + a);
    }

    private void printEx(int a, String b) {
        System.out.println("3번 오버로딩 : " + a + " " + b);
    }

    public static void main(String[] args) {
        OverloadingEx overloadingEx = new OverloadingEx();
        overloadingEx.printEx();
        overloadingEx.printEx(1);
        overloadingEx.printEx(2, "입니다.");
    }
}

 

 

위의 코드를 실행하면 아래와 같은 결과가 출력된다.

 

 

같은 메소드 명칭을 가지더라도 매개변수의 개수와 타입이 다르기 때문에 오버로딩이 가능하다.

 

오버로딩은 메소드의 이름을 절약할 수 있다는 점과, 같은 기능을 하는 메소드를 하나의 메소드명으로 사용 가능하다는 장점이 있다.

 

2. 오버라이딩

오버라이딩은 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 정의하는 것을 뜻한다.

자식 클래스를 변경해야 하는 경우(상황에 맞게), 오버라이딩을 할 수 있다. 물론 상속받은 그대로 사용 가능하다.

 

부모 클래스로부터 '상속' 받아서 사용하기 때문에, 자식 클래스에서는 해당 메소드의 이름과 매개변수, 리턴값이 모두 같아야 한다.

 

아래는 오버라이딩의 예시이다.

class ParentEx{
    void print() {
        System.out.println("===부모 print===");
    }
}

class ChildEx extends ParentEx{
    @Override
    void print(){
        System.out.println("===자식 print===");
    }
}

public class OverloadingEx {
    public static void main(String[] args) {
        ParentEx parentEx = new ParentEx();
        ChildEx childEx = new ChildEx();

        parentEx.print();
        childEx.print();
    }
}

 

위 코드의 실행 결과는 다음과 같다.

 

 

자식 클래스에 작성한 @Override는 어노테이션으로, 오버라이딩을 검증하는 기능을 한다.

오버로딩과 달리 선언부가 부모 클래스와 동일한 것을 확인할 수 있다.

부모 클래스의 메소드 명칭을 빌려와 자식 클래스에서 상황에 맞게 '재정의' 했다고 할 수 있다.

 

주의할 점은, 오버라이딩에서는 접근 제어자를 설정하는 규칙이 존재한다.

 

1) 부모 클래스의 접근 제어자보다 자식 클래스의 접근 제어자를 더 넓게 설정할 수 없다.

2) 자식 클래스는 부모 클래스의 메소드보다 더 큰 범위의 Exception을 선언할 수 없다.

 

위 내용에 주의하며 오버라이딩을 해야한다.

 

정리하자면

오버로딩은 기존에 없던 새로운 메소드를 추가하는 것이고,

(동일한 메소드 명칭이지만 내부 기능이 다름)

 

오버라이딩은 상속받은 메소드를 상황에 맞게 재정의하는 것이다.

 


 

둘이 명칭이 비슷해서 헷갈릴 때가 있었는데, 이번에 정리하면서 둘의 차이점에 대해 확실히 알게된 것 같다.