Java

[자바/Java] 오버라이딩과 오버로딩(OverRiding and OverLoading)

F12:) 2023. 7. 4. 18:11

오늘은 오버라이딩과 오버로딩에 대한 설명 및 차이점에 대해 소개한다.

 

오버라이딩(OverRiding)이란?

오버라이딩은 상속 관계에 있는 부모 클래스에서 정의된 메소드를 자식 클래스에서 재정의하여 사용하는 것을 의미한다.

 

하지만 이 오버라이딩을 하기 위해서는 몇가지 규칙을 지켜야한다.

 

1. 부모 메서드의 이름, 파라미터, return 타입이 같아야 한다.

 

2. 부모 메서드의 접근제어자의 범위보다 더 좁아질 수 없다.

     접근제어자에 대해서는 다음 포스팅에서 소개하겠지만, public > protected > (default) > private 순서로 범위가 작아진다는 것만

     우선 알아두자.

 

3. 부모 메서드가 가지고 있는 예외의 개수보다 자식 클래스의 메서드의 예외 개수가 더 많아질 수 없다.

     부모 클래스 : void parent_method(...) throws IOException, NullPointerException {...}

     자식 클래스 : void children_method(...) throws Exception{...}

 

     그러면 다음과 같은 경우는 부모 클래스의 예외가 2개이고, 자식 클래스의 예외가 1개이니 가능할까?? 불가능하다. 

     왜냐하면 자식 메서드에서 사용되는 Exception은 모든 예외를 다루고 있으므로 2개보다 많다. 이러한 경우를 제외하고는 개수를 통해

     서 오버라이딩의 조건을 확인할 수 있을 것이다.

 

4. 인스턴스 메서드에서 static 메서드로, static 메서드에서 인스턴스 메서드로 변경할 수 없다.

     

아래에는 기본적인 오버라이딩에 대한 예제 코드를 첨부한다.

public class GenesisCar extends Car{
    GenesisCar() {
        super(150, true, 'A');
    }
    
    @Override
    void run(){
        System.out.println("제네시스");
        super.run();
    }
    
    public static void main(String[] args) {
        GenesisCar genesisCar = new GenesisCar();
        genesisCar.run();
    }
}

class Car {
    int speed;
    boolean operable;
    char grade;
    
    Car(int speed, boolean operable, char grade) {
        this.speed = speed;
        this.operable = operable;
        this.grade = grade;
    }
    
    void run() {System.out.println("차가 달립니다.");}
}

GenesisCar 클래스가 Car의 run 메소드를 Override한 것을 알 수 있다. 또한 위에서 제시한 조건 4가지 또한 만족한다.

 

그렇다면 GenesisCar 클래스 내에 run 메소드에서 위에 적힌 @Override는 무엇일까? 바로 어노테이션이라고 한다. 애노테이션(Annotation)이라고도 불리는 이 용어는 말그대로 '주석'을 의미한다. 별다른 기능은 없지만 컴파일 과정에서 좀 더 유용하다 정도만 알아두고 넘어가자.

 


오버로딩이란?

오버로딩은 이름이 같은 메서드이지만 파라미터의 타입과 개수를 다르게 작성하여 선언하는 것이다.

 

오버로딩 또한 사용하기 위해 규칙을 지켜야한다.

1. 파라미터의 개수와 파라미터의 타입이 다를 때 사용할 수 있다.

2. 파라미터의 개수와 타입의 변화가 없지만 return 타입이 다를 때는 사용할 수 없다.

 

이 규칙을 지켜 선언하면 된다. 오버로딩은 별다른 어노테이션이 존재하지 않는다.

아래에는 예제 코드를 첨부한다.

public class Car {
    void run() {}
    
    void run(int a){}

    void run(int a, boolean b){}
    
    boolean run(String a) {return false;}
}

위와 같은 run 함수들이 오버로딩된 상태라고 할 수 있다.


이름은 비슷해서 혼동되기 쉽지만, 엄연히 다른 오버라이딩과 오버로딩의 개념에 대해서 알아봤다. 이제는 헷갈리지 말고 잘 구분해야겠다.