본문 바로가기

Java/Basic

[Java] 오버로딩(overloading)

오버로딩이란?

- 오버로딩(overloading)의 사전적 의미는 '과적하다'. 즉, 많이 싣는 것을 뜻한다. 

 

- 메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져아 한다.

- 자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.

- 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩(method overloading)' 또는 간단히 '오버로딩(overloading)'이라고 한다.

- 보통 하나의 메서드 이름에 하나의 기능만을 구현해야하는데, 하나의 메서드 이름으로 여러 기능을 구현하기 때문에 붙여진 이름이라 생각할 수 있다.

 


오버로딩의 조건

- 같은 이름의 메서드를 정의한다고 해서 무조건 오버로딩인 것은 아니다.

- 비록 메서드의 이름이 같다 하더라도 매개변수가 다르면 서로 구별될 수 있기 때문에 오버로딩이 가능한 것이다. 

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

- 오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.

 


오버로딩의 예

- 오버로딩의 예로 가장 대표적인 것은 println 메서드이다.

- pirntln 메서드를 호출할 때 매개변수로 지정하는 값의 타입에 따라서 호출되는 println메서드가 달라진다.

- PrintStream 클래스에는 어떤 종류의 매개변술르 지정해도 출력할 수 있도록 10개의 오버로딩된 println 메서드를 정의하고 있다.

- println 메서드를 호출할 때 매개변수로 넘겨주는값의 타입에 따라서 위의 오버로딩된 메서드들 중의 하나가 선택되어 실행되는 것이다.


오버로딩의 장점

- 오버로딩을 통해 여러 메서드들이 하나의 공통된 이름으로 정의될 수 있다면, 이름만 기억하면 되므로 기억하기도 쉽고 이름도 짧게 할 수 있어서 오류의 가능성을 많이 줄일 수 있다. 

- 메서드의 이름만 보고도 '이 메서드들은 이름이 같으니, 같은 기능을 하겠구나'라고 쉽게 예측할 수 있게 된다.

- 하나의 이름으로 여러 개의 메서드를 정의할 수 있으니, 메서드의 이름을 절약할 수 있다.

 


가변인자(varargs)와 오버로딩

- 기존에는 메서드의 매개변수 개수가 고정적이었으나 JDK1.5부터 동적으로 지정해 줄 수 있게 되었으며, 이 기능을 '가변인자(variable arguments)'라고 한다.

- 가변인자는 '타입... 변수명'과 같은 형식으로 선언하며, PrintStream클래스의 printf()가 대표적인 예이다.

- 위와 같이 가변인자 외에도 매개변수가 더 있다면, 가변인자를 매개변수 중에서 제일 마지막에 선언해야 한다.

  그렇지 않으면, 컴파일 에러가 발생한다.  가변인자인지 아닌지 구별할 방법이 없기 때문에 허용하지 않는 것이다.