자바에서 오버로딩이란 동일한 기능을 수행하는 메서드를 추가로 작성하는 것을 뜻한다.
예를 들자면, PrintStream 클래스의 println 메서드가 있다.
| println 메서드 정의 | 실제 사용 예시 |
| void println(int x) | System.out.println(2); |
| void println(char x) | System.out.println('A'); |
| void println(String x) | System.out.println("Hello"); |
| ... | ... |
println 메소드 호출 시, 매개변수로 넘겨주는 값의 타입에 따라 위의 오버로딩된 메소드들 중 하나가 선택되어 실행된다.
오버로딩의 조건
- 메서드 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야한다. 반환타입, 매개변수 이름은 상관없다.
오버로딩의 장점
- 메서드를 기억하기 더 쉽다.
- 메서드의 이름을 절약하고, 메서드의 이름만 보고도 용도를 예측할 수 있게 된다.
오버로딩할 때 주의할 점
1. 매개변수명이 달라도 메서드명과 매개변수 타입이 같다면 동일 메서드이다.
int add(int a, int b) { return a + b;}
int add(int x, int y) { return x + y;}
// Duplicate method add(int, int) in type OverloadingTest
2. 반환 타입이 달라도 메서드명과 매개변수 타입이 같다면 동일 메서드이다.
int add(int a, int b) { return a + b;}
long add(int a, int b) { return a + b;}
// Duplicate method add(int, int) in type OverloadingTest
3. 오버로딩 시, 매개변수 타입이 다르더라도 묵시적 형변환으로 어떤 메서드를 호출할지 애매해진다면 오류가 발생한다.
long add(long a, int b) { return a + b;}
long add(int a, long b) { return a + b;}
add(3L, 3); // OK
add(3, 3L); // OK
add(3, 3); // Error! The method add(long, int) is ambiguous for the type [class]
가변인자(varargs)와 오버로딩
가변인자는 다음과 같이 [type]... [variable name] 형식으로, 메서드의 매개변수 개수를 동적으로 지정해주는 것을 말한다.
public PrintStream printf(String format, Object... args) { ... }
가변인자의 장점
1. 같은 타입의 매개변수를 여러 개 쓰지 않고 한 개의 가변인자로 대체할 수 있다.
2. 매개변수로 배열을 쓴다면 인자가 없더라도 크기 0의 배열이나 null 등으로 반드시 인자를 지정해줘야 하지만, 가변인자를 사용하면 매개변수가 없는 경우도 쉽게 사용할 수 있다.
String concatenate(String[] str) { ... }
String result = concatenate(new String[0]); // OK
String result = concatenate(null); // OK
String result = concatenate(); // Error! Method not applicable for the arguments ()
가변인자 사용할 때 주의할 점
가변인자를 호출할 때 내부적으로 배열을 새로 생성해 사용하게 되는데, 이것 때문에 주의할 점이 생긴다.
다음과 같은 메서드가 있다고 할 때,
String concatenate(String... str) { ... }
아래 코드는 다 같은 concatenate 메서드를 호출하게 된다.
System.out.println(concatenate());
System.out.println(concatenate("a", "b"));
System.out.println(concatenate(new String[]{"A", "B"}));
가변인자와 동일한 타입의 매개변수를 선언한다면, 구별하지 못하는 경우가 발생하지 않도록 주의해야 한다. 아래처럼 2개의 메서드를 선언하면 구별할 수가 없다.
String concatenate (String delim, String... args) { ... }
String concatenate (String... args) { ... }
참고 자료
- JAVA의 정석 3판, Chapter 06 객체지향 프로그래밍 1
'Java > 자바의 정석' 카테고리의 다른 글
| [JAVA] 변수와 메서드 (0) | 2023.07.14 |
|---|---|
| [JAVA] 클래스와 객체(인스턴스) (0) | 2023.07.07 |
| [JAVA] 객체지향 프로그래밍이란 (0) | 2023.07.06 |