IT 개발노트
오버로딩이란? 본문
1. 오버로딩
1.1 오버로딩이란?
: 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩' 또는 간단히 '오버로딩'이라 한다.
1.2 오버로딩의 조건
- 메서드 이름이 같아야한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
* 오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다는 것에 주의해야한다.
예시 1
int add(int a, int b) { return a+b; }
int add(int x, int y) { return x+y; }
* 매개변수의 이름만 다른 경우 매개변수의 타입이 같기 때문에 오버로딩이 성립하지 않는다.
예시 2
int add(int a, int b) { return a+b; }
long add(int a, int b) { return a+b; }
* 리턴타입만 다른 경우 매개변수의 타입과 개수가 일치하기 때문에 add(3.3)과 같이 호출하였을 때 어떤 메서드가 호출된 것인지 결정할 수 없기 때문에 오버로딩이 성립하지 않는다.
예시 3
long add(int a, long b) { return a+b; }
long add(long a, int b) { return a+b; }
* 두 메서드 모두 int형과 long형 매개변수가 하나씩 선언되어 있지만, 매개변수의 순서가 다른 경우이다. 이 경우에는 호출 시 매개변수의 값에 의해 호출될 메서드가 구분될 수 있으므로 오버로딩이 성립한다.
-> 매개변수의 순서만을 다르게 하여 오버로딩을 구현하면, 사용자가 매개변수의 순서를 외우지 않아도 되는 장점이 있지만, add(3,3L)과 같이 호출되면 첫 번째 메서드가, add(3L,3)과 같이 호출되면 두 번째 메서드가 호출된다.
단, add(3,3)과 같이 호출되면 두 메서드 중 어느 메서드가 호출된 것인지 알 수 없기 때문에 메서드를 호출하는 곳에서 컴파일 에러가 발생한다.
예시 4
int add(int a, int b) { return a+b; }
long add(long a, long b) { return a+b; }
long add(int[ ] a) {
long result = 0;
for(int i=0; i<a.length; i++) {
result = result + a[i];
}
return result;
}
* 위 메서드들은 모두 오버로딩이 성립한다.
정의된 매개변수가 서로 다르긴 해도, 세 메서드 모두 매개변수로 넘겨받은 값을 더해서 그 결과를 돌려주는 일을 한다.
-> 같은 일을 하지만 매개변수를 달리해야하는 경우에, 이와 같이 이름은 같고 매개변수를 다르게 하여 오버로딩을 구현한다.
예제 1
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 | package sungju.java.OverloadingTest; public class OverloadingTest { public static void main(String[] args) { MyMath mm = new MyMath(); 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 MyMath { 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 = result + a[i]; } return result; } } |
* add(3L, 3), add(3, 3L), add(3L, 3L)의 결과는 모두 6L이지만 System.out.println(6L);을 수행하면 6이 출력된다.
-> 리터럴의 접미사는 출력되지 않는다.
* 예제 1의 실행결과의 출력순서를 보면 add메서드가 println메서드보다 먼저 출력되어 있는것을 볼수있다.
이는 println메서드가 결과를 출력하려면, add메서드의 결과가 먼저 계산되어야 하기 때문이다.
'기초튼튼 > JAVA' 카테고리의 다른 글
변수의 초기화 (0) | 2019.01.22 |
---|---|
생성자란? (0) | 2019.01.21 |
변수의 종류와 특징 (0) | 2019.01.18 |
객체지향의 등장 배경과 이해 (0) | 2019.01.18 |
배열이란? (1) | 2019.01.17 |