본문 바로가기

Java의 정석

객체 지향 개념 - 10 오버로딩(overloading)

오버로딩(overloading)

메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야 함. 그러나 자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다. 이처럼 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩 또는 간단히 오버로딩이라 한다.

 

같은 이름의 메서드를 정의한다고 해서 무조건 오버로딩인 것은 아니고 아래와 같은 조건을 만족해야 한다.

  • 메서드 이름이 같아야 한다.
  • 매개변수의 개수 또는 타입이 달라야 한다. - 매개변수가 다르면 서로 구별될 수 있기 때문에 가능
  • 반환 타입은 관계없다. - 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 아무런 영향을 주지 못함

위의 조건을 만족시키지 못하는 메서드는 중복 정의로 간주되어 컴파일 시에 에러가 발생한다.

 

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

위의 두 메서드는 매개변수의 이름만 다르고 타입은 같기 때문에 오버로딩이 성립하지 않는다.

컴파일 시 중복 정의로 간주되어 'already defined'를 출력한다.

 

int add(int a, int b) { return a + b; }
long add(int x, int y) { return x + y; }

위의 성립 조건에서와 같이 매개변수에 의해서만 구별될 수 있으므로 오버로딩으로 간주되지 않는다.

 

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

매개변수에 int와 long이 하나씩 선언되어 있지만, 순서가 다른 경우 호출 시 매개변수의 값에 의해 호출될 메서드가 구분될 수 있으므로 중복된 메서드 정의가 아닌, 오버로딩으로 간주한다.