본문 바로가기
Study/JAVA

[Java] 6-4. 오버로딩(overloading)

by jeongwle 2022. 9. 2.
728x90
반응형

 

오버로딩(overloading)

1. 오버로딩이란?

메서드도 변수처럼 같은 클래스 내에서 구별될 수 있도록 각기 다른 이름을 가져야 한다. 그러나 자바에서는 같은 클래스 내에서 같은 이름을 가진 메서드가 있어도 매개변수의 개수 또는 타입이 다르면 같은 이름으로 메서드를 정의할 수 있다. 이렇게 한 클래스 내에서 같은 이름의 메서드를 여러개 정의하는 것을 오버로딩이라 한다.

 

2. 오버로딩의 조건

오버로딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 한다.
1. 메서드의 이름이 같아야 한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.​

메서드의 이름이 같아도 매개변수의 개수나 타입이 다르면 구별할 수 있기 때문에 오버로딩이 가능하다. 오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다는 것을 주의하자

 

3. 오버로딩의 예

지금까지 출력을 위해 사용했던 println()메서드가 대표적인 오버로딩의 예시이다.
void println()
void println(boolean x)
void println(char x)
void println(char[] x)
void println(double x)
void println(float x)
void println(int x)
void println(Object x)
...​

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

 

4. 오버로딩의 장점

만일 오버로딩이 없다면 위에서 예시를 들은 println은 함수의 이름이 모두 달라져야 한다. 이름일 일일이 지어야하고 구분해서 기억해야 사용할 수 있다. 하지만 오버로딩을 이용하면 하나의 이름으로 정의할 수 있고 이름이 같으니 같은 기능을 하겠구나 예측할 수 있다. 또한 메서드의 이름을 절약할 수 있다. 

 

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

기존에는 메서드의 매개변수 개수가 고정적이었다. JDK1.5부터는 매개변수의 개수를 동적으로 지정해 줄 수 있게 되었고 이 기능을 가변인자(variable arguments)라고 한다. 가변인자는 '타입... 변수명'과 같은 형식으로 선언한다. PrintStream클래스의 printf()가 대표적인 예이다.
public PrintStream printf(String format, Object... args) {...}​

위와 같이 가변인자 외에도 매개변수가 더 있다면 가변인자를 매개변수 중 제일 마지막에 선언해야 한다. 그렇지 않을 경우 컴파일 에러가 발생한다.

// 가변인자를 사용하지 않을 경우
String concatenate(String s1, String s2) {...}
String concatenate(String s1, String s2, String s3) {...}
String concatenate(String s1, String s2, String s3, String s4) {...}

// 가변인자를 사용할 경우
String concatenate(String... str) {...}​

가변인자는 내부적으로 살펴보면 배열을 이용하는 것ㅇ시다. 그래서 가변인자가 선언된 메서드를 호출할 때마다 배열이 새로 생성된다. 가변인자가 편리하지만 이러한 비효율이 숨어있으니 꼭 필요한 경우에만 가변인자를 사용하자.

* 가변인자를 사용하지 않고 매개변수를 배열로 할 경우 반드시 인자를 지정해줘야 하기 때문에 null이나 길이가 0인 배열을 인자로 지정해줘야 하는 불편함이 있다. 반면에 가변인자는 concatenate() 이렇게 사용할 수 있다.

가변인자를 사용한 메서드를 오버로딩하면 오버로딩된 두 메서드가 구분되지 않아 컴파일 에러가 발생할 수 있다. 이런 경우가 발생하기 쉽기 때문에 가변인자를 사용한 메서드는 가급적 오버로딩하지 않는 것이 좋다.
728x90
반응형

'Study > JAVA' 카테고리의 다른 글

[Java] 7-1. 상속(inheritance)  (0) 2022.09.03
[Java] 6-5, 6. 생성자 & 변수의 초기화  (0) 2022.09.02
[Java] 6-3. 변수와 메서드  (0) 2022.09.02
[Java] 6-1, 2 객체지향언어, 클래스와 객체  (0) 2022.09.01
[Java] 5. 배열(Array)  (0) 2022.09.01

댓글