일을 하다가 메소드 전달인자 수가 가변적인 부분이 생겼다. ArrayList를 사용하자니 전달인자 수가 너무 작다. 그렇다고 배열을 사용하자니 미리 그 수가 몇 개인지 예측하기가 힘들다. 어떻게 할까 생각하던 중 오랜만에 머리를 스치고 지나가는 가변인자(varargs : Variable Argument List)라는 것이 있었다.
가변인자(사실, 이 개념을 뭐라고 불러야 하는지 정확하게 모르겠다. 약간의 검색을 하긴 했지만 이 이름이 정확하지 않을 수 있다.)는 C언어에서 아주 자주 보던 printf의 전달인자 같은 것이다. printf의 전달인자는 다음 예제의 num과 같이 콤마(',')를 이용하여 얼마든지 줄 수 있지 않은가?? 이 개념이 아주 오래전.. 3년전인가?? JDK 5.0버전부터 Java에도 추가되었다.
그럼 Java에서는 이 개념을 어떻게 사용할 수 있을까?? 간단하다. 다음 예제를 보자.
위의 예제와 같이 main 메소드에서는 C언어와 동일하게 가변적으로 전달인자를 줄 수 있다. 호출받는 함수에서는 전달인자의 자료형과 변수명 사이에 점 3개를 찍으면 된다.
그리고 그 변수는 배열과 동일하게 사용하면 된다. 배열이기 때문에 전달인자의 최대개수는 배열의 최대 사이즈와 동일하다. 역시 JDK 5.0에서 추가된 enhanced for loop에서 배열이기 때문에 쉽게 사용될 수 있다. enhanced for문은 다른 언어에 있는 foreach와 비슷하다. 위의 for문은 다음과 같은 내용이다.
생각해 보면 쉽다. 그냥 배열이나 List, Set 등과 같은 객체의 요소를 처음부터 끝까지 순회해 주는 것이다. 사실 Iterator 객체를 안 좋아해서 for문으로 get(i)를 해서 많이 썼는데 덕분에 편해졌다. ㅋ 단, 디버깅할 때 인덱스가 없기 때문에 몇 번째 요소인지 알아보기가 힘들다는 점이 =ㅅ=;; 머.. Iterator도 인덱스가 없는건 마찬가지다.
+ enhanced for문은 코드가 간결해 지는 것 같아 자주 애용하는데.. 자꾸 윗분께서 이런 새로운(이라고 쓰고 3년이나 지났다고 읽는다) 기술, 개념은 되도록 쓰지 말라고 한다. TㅅT 복잡해지고, 검증이 안됐으며, 남들이 못 알아본다나..-ㅅ-;;
- 참고자료
Java 5.0의 varags와 enhanced for loop
Using Variable Argument Lists and Some Things You Should Know About Floating-Point Arithmetic from Technical Articles and Tips
가변 arity 메소드 (아랫 참고자료를 번역기로 돌린 것으로 보임)
Variable arity methods
가변인자(사실, 이 개념을 뭐라고 불러야 하는지 정확하게 모르겠다. 약간의 검색을 하긴 했지만 이 이름이 정확하지 않을 수 있다.)는 C언어에서 아주 자주 보던 printf의 전달인자 같은 것이다. printf의 전달인자는 다음 예제의 num과 같이 콤마(',')를 이용하여 얼마든지 줄 수 있지 않은가?? 이 개념이 아주 오래전.. 3년전인가?? JDK 5.0버전부터 Java에도 추가되었다.
#include <stdio.h>
int main( int argc, String *args[] )
{
int num = 123;
printf("The number is %d\n", num);
return 0;
}
int main( int argc, String *args[] )
{
int num = 123;
printf("The number is %d\n", num);
return 0;
}
그럼 Java에서는 이 개념을 어떻게 사용할 수 있을까?? 간단하다. 다음 예제를 보자.
public static void main(String [] args
{
foo(1, 2, 3);
foo(1, 2, 3, 4, 5);
}
public static void foo(int ... nums)
{
for(int num : nums)
{
System.out.print(num);
}
System.out.println();
System.out.printf("The last number of list is %d\n", nums[nums.length - 1]);
}
{
foo(1, 2, 3);
foo(1, 2, 3, 4, 5);
}
public static void foo(int ... nums)
{
for(int num : nums)
{
System.out.print(num);
}
System.out.println();
System.out.printf("The last number of list is %d\n", nums[nums.length - 1]);
}
위의 예제와 같이 main 메소드에서는 C언어와 동일하게 가변적으로 전달인자를 줄 수 있다. 호출받는 함수에서는 전달인자의 자료형과 변수명 사이에 점 3개를 찍으면 된다.
void foo(int ... nums)
그리고 그 변수는 배열과 동일하게 사용하면 된다. 배열이기 때문에 전달인자의 최대개수는 배열의 최대 사이즈와 동일하다. 역시 JDK 5.0에서 추가된 enhanced for loop에서 배열이기 때문에 쉽게 사용될 수 있다. enhanced for문은 다른 언어에 있는 foreach와 비슷하다. 위의 for문은 다음과 같은 내용이다.
int num = 0;
for(int i=0; i {
num = nums[i]
System.out.print(num);
}
for(int i=0; i
num = nums[i]
System.out.print(num);
}
생각해 보면 쉽다. 그냥 배열이나 List, Set 등과 같은 객체의 요소를 처음부터 끝까지 순회해 주는 것이다. 사실 Iterator 객체를 안 좋아해서 for문으로 get(i)를 해서 많이 썼는데 덕분에 편해졌다. ㅋ 단, 디버깅할 때 인덱스가 없기 때문에 몇 번째 요소인지 알아보기가 힘들다는 점이 =ㅅ=;; 머.. Iterator도 인덱스가 없는건 마찬가지다.
+ enhanced for문은 코드가 간결해 지는 것 같아 자주 애용하는데.. 자꾸 윗분께서 이런 새로운
- 참고자료






덧글