영보의 SystemOut.log

[JAVA] overloading 오버로딩이란? 본문

Language/JAVA

[JAVA] overloading 오버로딩이란?

영보로그 2020. 12. 28. 23:09
반응형

 오버로딩(overloading)

 

 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을

'메서드 오버로딩(method overloading)' 또는 '오버로딩(overloading)'이라고 한다.

보통 하나의 메서드 이름에 하나의 기능만을 구현해야하는데,

하나의 메서드 이름으로 여러 기능을 구현하기 때문에 붙여진 이름이라 생각할 수 있다.

 

 

 

 

 오버로딩의 조건

 

 같은 이름의 메서드를 정의한다고 해서 무조건 오버로딩인 것은 아니다.

오버로딩이 성립하기 위해서는 다음과 같은 조건을 만족해야한다.

1. 메서드 이름이 같아야 한다.

2. 매개변수의 개수 또는 타입이 달라야 한다.

비록 메서드의 이름이 같다 하더라도 매개변수가 다르면 서로 구별될 수 있기 때문에 오버로딩이 가능한 것이다.

위의 조건을 만족시키지 못하는 메서드는 중복 정의로 간주되어 컴파일 시에 에러가 발생한다.

그리고 오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로,

반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다는 것에 주의하자.

 

 

 

 

 오버로딩의 예

 

오버로딩의 예로 가장 대표적인 것은 println메서드이다.

지금까지 println메서드 괄호 안에 값만 지정해주면 출력시 어려움이 없었지만,

실제로는 println메소드를 호출할 때 매개변수로 지정하는 값의 타입에 따라서 호출되는 println 메서드가 달라진다.

 

 

Class A
    {
        public void add(int a, int b) { return a+b;}
        public void add(double a, double b) {return a+b;}
        public void add(long a, long b) {return a+b;}
    }

 

위 메서드 모두 int형과 long형 매개변수가 하나씩 선언되어 있지만, 서로 순서가 다른 경우이다.

이 경우에는 호출 시 매개변수의 값에 의해 호출될 메서드가 구분될 수 있으므로

중복된 메서드 정의가 아닌 오버로딩으로 간주한다.

 

이처럼 단지 매개변수의 순서만을 다르게 하여 오버로딩을 구현하면,

사용자가 매개변수의 순서를 외우지 않아도 되는 장점이 있지만,

오히려 단점이 될 수도 있기 때문에 주의해야한다.

 

 

 

 

 

 오버로딩의 장점

 

만일, 메서드도 변수처럼 단지 이름만으로 구별된다면, 한 클래스내의 모든 메서드들은 이름이 달라야한다. 

예를 들면, 아래와 같은 방식으로 메소드 이름이 변경되어야 할 것이다.

void println()
void printlnBoolean(bloolean x)
void printlnChar(char x)
void printlnDouble(double x)
void printlnString(String x)

모두 근본적으로는 같은 기능을 하는 메서드 들이지만, 서로 다른 이름을 가져야 하기 때문에 메서드를 작성하는 쪽에서는 이름을 짓기도 어렵고, 메서드를 사용하는 쪽에서는 이름을 일일이 구분해서 기억해야 하기 때문에 서로 부담이 된다.

 

 하지만 오버로딩을 통해 여러 메서드들이 println이라는 하나의 이름으로 정의될 수 있다면 println이라는 이름만 기억하면 되므로 기억하기도 쉽고 이름도 짧게 할 수 있어서 오류의 가능성을 많이 줄일 수 있다. 또한 메서드의 이름만 보고도 '이 메서드들은 이름이 같으니, 같은 기능을 하겠구나.'라고 쉽게 예측할 수 있게 된다.

 

 두번째 장점은 메소드의 이름을 절약할 수 있다는 것이다. 하나의 이름으로 여러개의 메서드를 정의할 수 있으니, 메서드의 이름을 짓는데 고민을 덜 수 있는 동시에 사용되었어야 할 메서드 이름을 다른 메서드의 이름으로 사용할 수 있기 때문이다.

 

 

예제) ch6/OverloadingTest.java

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

 

반응형