오버로딩의 예 : 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)
PrintStream 클래스에는 어떤 종류의 매개변수를 지정해도 출력할 수 있도록
위와 같이 10개의 오버로딩된 메서드를 정의해놓았다.
매개변수에 따라 호출되는 println메서드가 다르지만
각각 하는 일은 '출력'하는 것으로 같다.
오버로딩의 조건과 특징
1. 메서드 이름이 같아야 한다. 2. 매개변수의 개수 또는 타입이 달라야 한다. 3. 메서드의 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다(매개변수에 의해서만 구별됨). |
int add(int a, int b) {return a+b;}
int add(int c, int d) {return c+d;}
위의 두 메서드는 매개변수 이름만 다를 뿐 타입이 같기 때문에 "똑같은" 메서드이다.
comfile하면 'add(int, int) is already defined'라는 메시지가 뜬다.
같은 메서드가 정의되었다는 의미이다.
즉, 매개변수의 이름만 다르면 오버로딩이 성립하지 않는다.
int add(int a, int b) {return a+b;}
long add(int a, int b) {return (long)(a+b);}
위의 메서드들도 반환 타입만 다르다.
오버로딩을 구현하는데 아무런 영향이 없다.
역시 컴파일러는 둘 다 똑같은 메서드로 인식한다('add(int, int) is already defined').
long add(int a, long b) {return a+b;}
long add(long a, int b) {return a+b;}
여기선 매개변수의 타입이 순서대로 다르기 때문에 오버로딩의 조건에 부합한다.
add로 메서드의 이름도 같으므로
'오버로딩'된 메서드이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
class OverloadingTest {
public static void main(String args[]) {
MyMath3 mm = new MyMath3();
System.out.println("mm.add(3, 3) 결과:" + mm.add(3,3));
System.out.println("mm.add(3L, 3) 결과: " + mm.add(3L,3));
System.out.println("mm.add(3, 3L) 결과: " + mm.add(3,3L));
System.out.println("mm.add(3L, 3L) 결과: " + mm.add(3L,3L));
int[] a = {100, 200, 300};
System.out.println("mm.add(a) 결과: " + mm.add(a));
//같은 일을 하지만 매개변수를 다르게 할 때,
//이름은 같고 매개변수를 달리해주는 오버로딩을 사용하자.
}
}
class MyMath3 {
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;
}
}
|
cs |
오버로딩의 장점은
하나의 이름으로 같은 기능을 할 것이란 예상과 함께
같은 기능일 때 (매개변수의 종류나 개수에 따라) 메서드 이름을 다르게 할 필요가 없어서
기억하기도 사용하기도 편하다는 것?
'코딩 > JAVA' 카테고리의 다른 글
생성자(Constructor)_자바의정석 (0) | 2021.07.22 |
---|---|
가변인자란? 가변인자와 오버로딩?_자바의정석 (0) | 2021.07.22 |
JVM의 메모리 구조_자바의 정석 (0) | 2021.07.21 |
클래스 멤버와 인스턴스 멤버간의 참조와 호출_자바의 정석 (0) | 2021.07.21 |
메서드_재귀호출(recursive call)_자바의정석 (0) | 2021.07.20 |