남궁성님의 Java의 정석(3rd Edition)을 보고 정리한 글입니다.
1. 오버로딩(Overloading)
- 기존에 없는 새로운 메서드를 정의하는 것
- 메서드 명은 같지만 매개변수 타입, 개수, 순서가 다른 것
- 같은 클래스 내에서 적용된다.
int add(int a, int b) { return a + b; }
int add(int a, int b, int c) { return a + b + c; }
int add(int x, int y) { return x + y; } // 매개변수의 식별자만 다른 경우 => 오버로딩 x
short add(int a, int b) {return a + b; } // 반환 타입이 다른 경우 => 오버로딩
a. 가변인자 오버로딩
기존에는 메서드의 매개변수가 고정적이었으나, JDK1.5부터 동적으로 지정해줄 수 있게 되었다.
가변인자는 아래와 같은 형식으로 선언한다.
Type methodName(Type... variableName) {
//...
}
가변인자 외에 매개변수가 있다면, 가변인자는 가장 마지막에 선언해야 한다.
// 가변인자는 항상 마지막에 선언, 그렇지 않으면 컴파일 에러 발생
public PrintStream printf(String format, Object... args) {
// ...
}
public class Main {
public static void main(String[] args) {
String[] strArr = {"100", "200", "300"};
System.out.println(concatenate("", "100", "200", "300"));
System.out.println(concatenate("-", strArr));
System.out.println(concatenate(",", new String[]{"1", "2", "3"}));
System.out.println("["+concatenate(",", new String[0])+ "]");
System.out.println("["+concatenate(",")+ "]");
}
private static String concatenate(String delim, String... args) {
String result = "";
for (String str : args) {
result += str + delim;
}
return result;
}
}
실행결과
100200300
100-200-300-
1,2,3,
[]
[]
b. 오버로딩의 장점
- 오버로딩을 지원하지 않을 경우에 같은 기능을 하는 메서드의 이름이 각기 달라야한다.
- 이럴 경우 메서드를 관리하기 힘들어지고, 메서드 이름을 짖는데 엄청난 고민과 비슷한 뜻을 가진 메서드가 무수히 많이 존재할 것이다.
- 오버로딩을 지원하면 같은 기능을 하는 메서드를 쉽게 예측할 수 있다.
2. 오버라이딩(Overriding)
- 부모 클래스나 인터페이스로부터 상속받은 메서드의 내용을 재정의해서 사용하는 것
- 오버라이딩하고자하는메서드의 이름, 매개변수, 리턴타입이 모두 같아야 한다.
- 상속관계에서 적용된다.
class Parent {
void parentMethod() {}
}
class Child extends Parent{
@Override
void parentMethod() {}
}
3. 오버로딩 vs. 오버라이딩
구분 | 오버로딩 | 오버라이딩 |
리턴형 | 달라도 된다 | 동일해야 한다. |
메서드명 | 동일해야 한다 | 동일해야 한다. |
매개변수 | 달라야만 한다 | 동일해야 한다. |
적용범위 | 같은 클래스 | 상속관계 |
'Programming > Java' 카테고리의 다른 글
[Java] 상속관계와 포함관계 (0) | 2023.10.13 |
---|---|
[Java] 생성자와 this / super (0) | 2023.10.13 |
[Java] 매개변수를 전달하는 방법(기본타입, 참조타입) (0) | 2023.10.13 |
[Java] JVM 구조 (0) | 2023.10.13 |
[Java] 배열(Array) (0) | 2023.10.09 |