Java 메소드 오버로딩

오버로딩은 다음 요구사항이 있을 때 유용하게 사용할 수 있다.

  • 메소드 add 이름으로 두 수를 더하기
  • 메소드 add 이름으로 세 수를 더하기
  • 메소드 add 이름으로 int형으로 반환되어야 한다.

오버로딩

메소드 add 이름으로 여러 개 정의한 다음,
파라미터를 다르게 하는 것을 메소드 Overloading이라 한다.

public static int add(int x, int y) { return x + y; }
public static int add(double x, double y) { return x + y; }
public static int add(int x, int y, int z) { return x + y + z; }
  • 같은 이름이라도 여러 개 메소드를 정의할 수 있다.

규칙

  • 메소드의 이름이 같아야한다.
  • 파라미터의 갯수가 다른 경우에도 오버로딩을 사용할 수 있다.
  • 파라미터의 타입이 다른 경우에도 오버로딩을 사용할 수 있다.

단, 파라미터의 갯수와 타입이 같고, 반환타입만 다르게 주어진 경우 오버로딩 되지 않는다.

오버로딩 실패 케이스

public static void add(int x, int y) {}
public static int add(int x, int y) {return 0;}
java: method add(int,int) is already defined in class core.Add
  • 반환 타입만 다르게 주어진 경우 동일한 이름, 파라미터가 있다는 이유로 컴파일 오류가 발생한다.

메소드 시그니쳐

메소드 시그니쳐는 메소드를 정의한 경우 메소드만의 고유한 시그니쳐를 부여한다. 시그니쳐를 생성하는 규칙은 다음과 같다

  • 메소드 이름 + 파라미터(타입 또는 개수)

앞에서 설명한 오버로딩 실패 코드 또한,
메소드 시그니쳐가 같기 때문에 (동일한 이름 + 파라미터) 오류가 발생한 것이다.

메소드 코드 작성하기

public class Logical1 {
    public static void main(String[] args) {
        int num1 = add(10,20);
        int num2 = add(10,20, 30);
        int num3 = add(10.6,20.3);

        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);
        System.out.println("num3 = " + num3);

    }

    public static int add(int x, int y) {
        System.out.println("1번 int, int 호출");
        return x + y;
    }

    public static int add(int x, int y, int z) {
        System.out.println("2번 int, int, int 호출");
        return x + y + z;
    }

    public static int add(double x, double y) {
        System.out.println("3번 double, double 호출");
        return (int) (x + y);
    }
}

Java 출력

1번 int, int 호출
2번 int, int, int 호출
3번 double, double 호출
num1 = 30
num2 = 60
num3 = 30
  • 인수 타입에 따라 정의한 메소드 찾아주는 것을 확인할 수 있다.
  • 리터럴 값 int형 (10, 20) 주어진 경우, 1번 메소드를 호출하였다
  • 리터럴 값 int형 (10, 20, 30) 주어진 경우, 2번 메소드를 호출하였다
  • 리터럴 값 double형 (10.6, 20.3) 주어진 경우, 3번 메소드를 호출하였다