250x250
Notice
Recent Posts
Recent Comments
관리 메뉴

탁월함은 어떻게 나오는가?

[JAVA] 오버로딩(overloading) 본문

[Snow-ball]프로그래밍(컴퓨터)/java

[JAVA] 오버로딩(overloading)

Snow-ball 2021. 3. 6. 22:01
반응형

오버로딩(overloading)이란?

한 클래스(class) 내에 같은 이름의 메서드(method)를 여러 개 정의하는 것을 '메서드 오버로딩' 또는 간단히 '오버로' 이라 한다. 

 

같은 이름의 메서드를 정의한다고 해서 무조건 오버로딩인 것은 아니다. 오버로딩이 성립되기 위해서는 3가지의 조건을 만족해야한다.

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

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

3. 반환 타입은 관계 없다.

 

메서드의 이름이 같다 하더라도 매개변수가 다르면 서로 구별될 수 있기 때문에 오버로딩이 가능한 것이다. 위의 3가지 조건을 만족하지 못하면 컴파일시에 에러가 발생한다.

 

오버로딩의 가장 대표적인 예가 자주 사용하는 println메서드이다. 지금까지 println메서드의 괄호 안에 값만 지정해주면 홤녀에 출력하는데 아무런 어려움이 없었다. 하지만, 실제로는 println메서드를 호출할 때 매개변수로 지정하는 값의 타입에 따라서 호출되는 println메서드가 달라진다.

 

PrintStream클래스에서는 어떤 종류의 매개변수(밑에 코드에서 "( ) 괄호" 를 뜻함)를 지정해도 출력할 수 있도록 아래와 같이 10개의 오버로딩 된 println 메서드를정의해놓고 있다.

1
2
3
4
5
6
7
8
9
10
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);
cs

 

 

간단한 예시)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 1번. 이것은 오버로딩이 아니다. 메소드 중복정의이다.
// 두 메서드는 매개변수의 이름만 다를 뿐 매개변수의 타입이 같기 때문에
// 오버로딩이 성립하지 않는다. 매개변수의 이름이 다르면 메서드 내에서 사용되는
// 변수의 이름이 달라질 뿐, 아무런 의미가 없다.
int add(int a, int b) { return a + b; }
int add(int x, int y) { return x + y; }
 
// 2번. 이것은 오버로딩이 아니다. 메소드 중복정의이다.
// 리턴타입만 다르고 매개변수의 타입과 개수가 일치하기 때문에 add(3,3)과
// 같이 호출하였을 때 어떤 메소드가 호출된 것인지 결정할 수 없기 때문에 
// 오버로딩으로 간주되지 않는다.
int add(int a, int b) { return a + b; }
long add(int a, int b) { return (long)(a + b); }
 
// 3번. 이것은 오버로딩이다.
// 두 메서드 모두 int형과 long형 매개변수가 하나씩 선언되어 있지만, 서로 순서가
// 다른경우이다. 이 경우에는 호출 시 매개변수의 값에 의해 호출될 메서드가 구분될 수
// 있으므로 중복된 메서드 정의가 아닌 오버로딩으로 간주한다.
long add(int a, long b){ return a + b; } 
long add(long a, int b){ retirn a + b; }
cs

 

 

 

 

 

 

 

 

코드 사용 예시)

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
package JavaJungsuck.six;
 
class MyMath3 {
    // overloadding의 올바른 예: 매개변수는 다르지만 같은 의미의 기능을 수행
    // 보통은 오버로딩이라 칭하지만, 정확하게는 메소드 오버로딩(method overloading)이다.
    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

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package JavaJungsuck.six;
 
public class Ex6_10 {
    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, 3) 결과:" + mm.add(3,3L));
        System.out.println("mm.add(3, 3) 결과:" + mm.add(3L,3L));
 
        int[] a = { 100200300 };
        System.out.println("mm.add(a) 결과: " + mm.add(a));
    }
}
 
cs

 

 

 

 

 

베타존 : 네이버쇼핑 스마트스토어

나를 꾸미다 - 인테리어소품 베타존

smartstore.naver.com

 

반응형
Comments