오버로딩의 조건
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
'java' 카테고리의 다른 글
[JAVA] java.net 패키지와 TCP소켓 프로그래밍 (1) | 2018.10.24 |
---|---|
[JAVA] 날짜와 시간 Date, Calendar클래스와 java.time패키지 (0) | 2018.10.01 |
자바[JAVA] 자바 변수 정리 (6) | 2018.09.09 |
자바[JAVA] 객체지향언어 클래스와 객체 (0) | 2018.09.09 |
자바[JAVA] JVM heap영역의 구조와 Garbage Collection (0) | 2018.08.28 |