본문 바로가기

프로그래밍언어/JAVA

[JAVA] 오버로딩 (Overloading)

반응형

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(long x)
void println(Object x)
void println(String x)

 

 

4. 오버로딩의 장점

 

만일 메서드가 이름만으로 구별된다면  클래스 내의 모든 메서드는 다른 이름을 가져야 한다. 그렇다면 비슷한 기능을 하는 메서드들을 구분하기 위한 부연설명이 추가되어 메서드 이름들이  길어지고 복잡해질 것이다. 오버로딩을 적용하면 이러한 문제를 해결할  있다.

 

 

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

 

JDK1.5 부터는 함수의 매개변수 개수를 동적으로 지정해   있게 되었다.  기능을 '가변인자 (variable arguments)' 라고 한다.

가변인자는 '타입...변수명' 같은 형식으로 선언하며, PrintStraem printf() 대표적인 예이다.

 

public PrintStraem printf(String format, Object... args) { ... }

 

만약 메서드의 매개변수  가변인자가 아닌 매개변수가 있다면, 가변인자를 제일 마지막에 선언해야 한다. 그렇지 않으면 사용자가 입력한 인자가 가변인자인지 아닌지를 구분할  없기 때문에 컴파일 에러가 발생한다.

 

public method(Object... args, int num) { ... }
// Compile error 발생

 

가변인자로 선언된 매개변수는 메서드 안에서 배열로 사용이 가능하다. 그렇기 때문에 가변인자를 포함한 메서드를 호출하는 경우 매번 배열이 생성되어 가변인자의 값들을 저장한다.

이러한 가변인자와 배열 매개변수의 차이점은 가변인자는 생략이 가능하다는 것이다.

 

가변인자가 포함된 메서드를 오버로딩 하는 경우에는 매개변수 선언 시에 배치를 주의해야 한다. 잘못 선언하는경우에는 가변인자와 다른 매개변수를 구분하지 못해서 오버로딩을 실패할  있기 때문이다.

 

void method(String param1, String... args) { ... }
void method(String... args) { ... }
// String param1, String... args 와 String... args가 모두 String 타입이기 떄문에
// 매개변수의 타입으로 구분할 수 없어서 컴파일 에러가 발생한다.
반응형

'프로그래밍언어 > JAVA' 카테고리의 다른 글

[JAVA] 변수의 초기화  (0) 2021.09.04
[JAVA] 생성자 (Constructor)  (1) 2021.09.02
[JAVA] 변수와 메서드  (0) 2021.08.31
[JAVA] 클래스와 객체  (0) 2021.08.30
[JAVA] 다차원 배열  (0) 2021.08.25