Programming/Java

[Java] 오버로딩과 오버라이딩

kmindev 2023. 10. 13. 17:57

 

남궁성님의 Java의 정석(3rd Edition)을 보고 정리한 글입니다.

 

1. 오버로딩(Overloading)

  • 기존에 없는 새로운 메서드를 정의하는 것
  • 메서드 명은 같지만 매개변수 타입, 개수, 순서가 다른 것
  • 같은 클래스 내에서 적용된다.
int add(int a, int b) { return a + b; }

int add(int a, int b, int c) { return a + b + c; } 

int add(int x, int y) { return x + y; }  // 매개변수의 식별자만 다른 경우 => 오버로딩 x

short add(int a, int b) {return a + b; } // 반환 타입이 다른 경우 => 오버로딩

 

a. 가변인자 오버로딩

기존에는 메서드의 매개변수가 고정적이었으나, JDK1.5부터 동적으로 지정해줄 수 있게 되었다.

가변인자는 아래와 같은 형식으로 선언한다.

Type methodName(Type... variableName) {
  //...
}

가변인자 외에 매개변수가 있다면, 가변인자는 가장 마지막에 선언해야 한다.

// 가변인자는 항상 마지막에 선언, 그렇지 않으면 컴파일 에러 발생
public PrintStream printf(String format, Object... args) {
  // ...
}
public class Main {
    public static void main(String[] args) {
        String[] strArr = {"100", "200", "300"};
        System.out.println(concatenate("", "100", "200", "300"));
        System.out.println(concatenate("-", strArr));
        System.out.println(concatenate(",", new String[]{"1", "2", "3"}));
        System.out.println("["+concatenate(",", new String[0])+ "]");
        System.out.println("["+concatenate(",")+ "]");
    }

    private static String concatenate(String delim, String... args) {
        String result = "";
        for (String str : args) {
            result += str + delim;
        }

        return result;
    }
}

실행결과
100200300
100-200-300-
1,2,3,
[]
[]

 

b. 오버로딩의 장점

  • 오버로딩을 지원하지 않을 경우에 같은 기능을 하는 메서드의 이름이 각기 달라야한다.
  • 이럴 경우 메서드를 관리하기 힘들어지고, 메서드 이름을 짖는데 엄청난 고민과 비슷한 뜻을 가진 메서드가 무수히 많이 존재할 것이다.
  • 오버로딩을 지원하면 같은 기능을 하는 메서드를 쉽게 예측할 수 있다.

 

 

2. 오버라이딩(Overriding)

  • 부모 클래스나 인터페이스로부터 상속받은 메서드의 내용을 재정의해서 사용하는 것
  • 오버라이딩하고자하는메서드의 이름, 매개변수, 리턴타입이 모두 같아야 한다. 
  • 상속관계에서 적용된다.
class Parent {
    void parentMethod() {}
}

class Child extends Parent{
    @Override
    void parentMethod() {}
}

 

 

3. 오버로딩 vs. 오버라이딩

구분 오버로딩 오버라이딩
리턴형 달라도 된다 동일해야 한다.
메서드명 동일해야 한다 동일해야 한다.
매개변수 달라야만 한다 동일해야 한다.
적용범위 같은 클래스 상속관계