IT 개발노트

오버로딩이란? 본문

기초튼튼/JAVA

오버로딩이란?

limsungju 2019. 1. 19. 19:56

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(33));
        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 = {100200300};
        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