1. 오버로딩(overloading)이란?
하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것.
2. 오버로딩이 성립하기 위한 조건
1. 메서드의 이름이 같아야한다.
2. 매개변수의 개수 또는 타입이 달라야한다.
3. 반환 타입은 영향 없다.
3. 오버로딩의 예
대표적인 예) println
println메서드를 호출할 때 매개변수로 지정하는 값의 타입에 따라서 호출되는 println 메서드가 달라진다.
컴파일러가 매개변수 타입을 확인해서 거기에 맞는 메소드를 연결한다.
예)
▶ 매개변수의 이름이 다른 것은 오버로딩이 아니다. (메서드 중복 정의)
▶ 리턴타입은 오버로딩의 성립조건이 아니다. (중복 정의)
▶ 매개변수의 타입이 다르므로 오버로딩이 성립한다.
만약 add(3,3)을 호출하면 둘 중 어느 것이 호출될지 모호하다(ambiguous)
▶ 오버로딩의 올바른 예 – 매개변수는 다르지만 같은 의미의 기능수행
오버로딩의 장점
메서드도 변수처럼 단지 이름만으로 구별되면, 한 클래스 내의 모든 메서드들은 이름이 달라져야한다.
만약 println도
void println()
void printBoolean(boolean x)
void printChar(char x)
void printlnDouble(double x)
void printlnString(String x)
이런 식으로 다 달라져야한다.
오버로딩을 통해 같은 기능을 하는 메서드는 같은 이름으로 하면 오류의 가능성이 줄어든다. 이름도 절약할 수 있다.
예21)
public class OverLoadingTest {
public static void main(String[] args) {
// 인스턴스 객체 생성
MyMath4 mm = new MyMath4();
System.out.println("mm.add(3, 3) 결과:" + mm.add(3, 3));
System.out.println("mm.add(3, 3L) 결과:" + mm.add(3L, 3));
System.out.println("mm.add(3, 3L) 결과:" + mm.add(3, 3L));
System.out.println("mm.add(3L,3) 결과:" + mm.add(3L, 3L));
int[] a = { 100, 200, 300 };
System.out.println("mm.add(a) 결과:" + mm.add(a));
}
}
class MyMath4 {
int add(int a, int b) {
System.out.print("int add(int a, int b)-");
return a + b;
}
long add(int a, long b) {
System.out.print("long add(int a, long b)-");
return a + b;
}
long add(long a, int b) {
System.out.print("long add(long a, int b)-");
return a + b;
}
long add(long a, long b) {
System.out.print("long add(long a, long b)-");
return a + b;
}
int add(int[] a) {
System.out.print("int add(int[] a)-");
int result = 0;
for (int i = 0; i < a.length; i++) {
result += a[i];
}
return result;
}
}
println의 메서드보다 add메서드의 계산이 먼저 수행되어야한다.
'JAVA > 객체지향프로그래밍1' 카테고리의 다른 글
[JAVA] 기본 생성자(default constructor) (0) | 2021.06.21 |
---|---|
[JAVA] 가변인자(varargs)와 오버로딩 (0) | 2021.06.21 |
[JAVA] 클래스 메서드(static 메서드 )와 인스턴스 메서드 (0) | 2021.06.20 |
[JAVA] 참조형 반환타입 (0) | 2021.06.20 |
[JAVA]기본형 매개변수와 참조형 매개변수 (0) | 2021.06.20 |