오버로딩의  조건

1. 메소드 이름이 같아야하고

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


자바는 오버로딩이라는 기능이 구현되어 있어

매개변수의 개수타입이 달라도 같은 이름의 메소드명으로 동일 기능을 구현 할 수 있다.


그래서 매개변수의 타입이 달라도 하나의 메소드명으로 오버로딩 할 수 있고

또 매개변수의 개수가 달라도 역시 오버로딩 가능하다.


여기서 드는 생각이 만약 매개변수의 개수가 사용자의 쓰임에 따라 달라진다면? 또 그 수가 무한이 늘어난다면?? (말이 좀 이상..)

일일이 매개변수 하나하나 오버로딩 해주어야 할 것인가? 라는 의문이 생긴다


1
2
3
4
String divide(String s1, String s2){...}
String divide(String s1, String s2, String s3){...}
String divide(String s1, String s2, String s3, String s4){...}
String divide(String s1, String s2, String s3, String s4, String s5){...}
cs

이렇게...?????



하지만 JDK1.5부터 매개변수의 개수를 동적으로 지정해 줄 수 있게 되었는데 이 기능을 가변인자(variable argument)라고 한다.


가변인자가 없었던 전 버전에서는 매개변수로 컬렉션이나 배열을 사용 했었다.


1
2
3
4
void sum(Vector<String> v) {
        for(Object a: v)
            System.out.println(a);
    }
cs
1
2
3
4
void sum(String [] str) {
        for(String a:str)
            System.out.println(a);
    }
cs
 

사용하려면

1
2
3
4
5
6
7
public static void main(String args[]) {
        Varargs v = new Varargs();
        Vector<String> ve = new Vector<String>();
        ve.add("a");
        ve.add("b");
        v.sum(ve);
}
cs
1
2
3
4
5
public static void main(String args[]) {
        Varargs v = new Varargs();
        String [] s = {"a""b""c"};
        v.sum(s);
}
cs


이 같은 경우 따로 백터 객체를 만드는 등 조금 복잡? 하고

v.sum()과  같이 인자를 생략해 줄 수 없다.




가변인자 사용법


 키워드 ... 을 사용한다


1
2
3
4
void sum(String...str) {
        for(String a:str)
            System.out.println(a);
}
cs

다음과 같이 타입...변수명 으로 사용한다.


1
2
3
4
5
6
public static void main(String args[]) {
    Varargs v = new Varargs();
    v.sum("a","b","c");
    v.sum();
    v.sum(new String [2]);
}
cs

빈 인자값이나 같은 타입에 배열도 인자값으로 줄 수 있다.

위 코드들을 보고 눈치 챌 수도 있는데

가변인자는 내부적으로 배열을 생성해서 사용한다! (향상된 for문 str, 인자값으로 배열 넣어짐)

그래서 가변인자를 마구 난발하지는 말도록 하자.



만약 가변인자 외에도 다른 매개변수가 더 있다면 가변인자는 마지막에 선언해야 한다.


1
2
3
4
void sum(String s, String...str) {
        for(String a:str)
            System.out.print(a+s);
}
cs
1
2
3
4
public static void main(String args[]) {
        Varargs v = new Varargs();
        v.sum("-","a","b","c");
    }
cs

 위와 같은 코드로 여러 문자열을 구분자를주어 나누어 줄 수 있다.

a-b-c-




가변인자 메소드 오버로딩 주의점


만약 오버로딩 된 두 메소드가 있다면


1
2
3
4
5
6
7
8
void sum(String s, String...str) {
        for(String a:str)
            System.out.print(a+s);
    }
    void sum(String...str) {
        for(String a:str)
            System.out.print(a);
    }
cs
1
2
3
4
public static void main(String args[]) {
        Varargs v = new Varargs();
        v.sum("-","a","b","c");
    }
cs

이 메인 메소드를 돌려 본다 생각해보자.

컴파일러는 어떤 메소드를 사용 해야하는지 구분을 못한다. 그러므로 컴파일 에러가 난다.


가능하면 가변인자를 사용한 메소드는 오버로딩을하지 않는 것이 좋다.




가변인자를 사용한 대표적인 예


printf() 메소드가 있다.



앞의 문자열에 지시자 ex} %d, %s 로 뒤의 값을 형식화 해주는 메소드 인데

뒤의 값을 사용자가 마음대로 수를 정할 수있다.


가변인자를 사용한 메소드이기 때문에 가능했던 것이다.




참고

http://gyrfalcon.tistory.com/entry/Java-Varargs



+ Recent posts