[Java] ... 이란? (가변인자)

박원종·2021년 5월 7일
0

Today I Learn

목록 보기
3/5

다른 언어보다 자바에 익숙하다고 생각했었는데 매개변수에 "..." 이라는 알 수 없는 기호와 마주했다.(아직 멀었다...ㅠ)

public DiscountPolicy(DiscountCondition ... conditions){}
//오브젝트(조영호) P.51

책에서 수도코드와 같이 간략적으로 표현하려고 한 건줄 알았으나,
반복적으로 사용된다는 것에 의문을 품고 구글링을 해보았다.

가변인자란?
jdk 1.5부터 동적으로 매개변수를 지정 할 수 있도록 지원해주는 방법이다.

일단, 이 개념은 자바의 오버로딩의 배경에서 도입되어졌다.
오버로딩이란, 같은 기능을 하는 메소드의 매개변수만 달리해서 사용할 수 있게 하는 개념이다. 따라서 메소드의 이름은 같고 매개변수의 타입이나 갯수만 달라지는 것이다.

같은 타입의 매개변수 개수만 달라진다고 가정해 보자.

String printname(String name1);
String printname(String name1, String name2);
String printname(String name1, String name2, String name3);

코드 중복을 극도로 싫어하시는 선대 프로그래머들께서는 이것을 해결하지 않으실리가 없을 것이다.

String printname(String ... names);

아 물론, 이 문제를 컬렉션과 배열을 사용해서 해결할 수도 있다.

String printname(Vector<String> names); //컬렉션
String printname(String[] names); //배열

그리고 가변인자도 결국 내부적으로 배열을 만들어서 전달하는 것이기 때문에 이 해결방법에서 크게 벗어난 방법은 아니다.

주의 사항

가변인자를 사용할 때 두가지 주의 사항이 있다.
1) 여러개의 가변인자를 사용할 때, 가변인자는 가장 마지막으로 매개변수로 넣어준다.

String printname(String work, String ... names); 

2) 가변인자를 사용한 메소드를 오버로딩 할 때, 구분이 어려울 수 있음.

String printname(String ... names); //1
String printname(String work, String ... names); //2 

// 함수 호출시
printname("조세호", "유재석"); //1 호출 시도
printname("유퀴즈", "조세호", "유재석"); //2 호출 시도

2 호출 시도 한 코드에서 work("유퀴즈")도 String 이기 때문에 둘을 구분하기가 힘들다.
따라서 예기치 못한 결과를 얻을 수 있기 때문에, 가변인자를 사용한 메소드는 오버로딩을 가급적 하지 않는 것이 좋다.

profile
잡코딩

0개의 댓글