[ 가변 길이 인수란? ]
- 메소드 파라미터를 길이가 정해져 있지 않은 배열로 받을 수 있도록 함
- 정확히 정해져있지 않은 갯수의 매개변수를 받아야할 때 사용
가변 길이 인수를 사용한 메소드 parameter 정의는 C언어에 없는 편리한 기능 중 하나 입니다. 물론 아주 복잡한 방법으로 구현은 할 수 있습니다. Java도 내부적으로는 분명 복잡하게 설계돼 있을 것 같긴 하지만 일단 사용은 매우 편리합니다.
두 가지 방법이 있습니다. 우리가 항상 이클립스에서 자동 생성해주는 main함수에서 볼 수 있듯이 그냥 parameter를 배열로 지정하는 것입니다. 하지만 메모리 구조에서 봤듯이, 배열(참조변수)을 함수의 인자값으로 넣어서 전달하면 결국 힙 영역에 있는 메모리 주소의 주소값만 전달해줍니다. 즉, 객체를 생성해서 건네줘야 한다는 의미입니다.
만약 이미 생성된 배열이 있다면 넘겨주면 되지만 없다면 배열 객체를 생성하면서 넘겨줘야 합니다. 아래와 같이 사용 가능합니다.
package study.first;
public class Main {
public static void main(String[] args) {
print(1, new String[] {"arg1", "arg2", "arg3"});
}
static void print(int a, String[] arg) {
System.out.println(a);
for (String num : arg)
System.out.print(num + " ");
}
}
위의 방식은 꽤 불편합니다. 일단 배열값이 있을 때와 마찬가지로 하나거나 없어도 무조건 배열을 생성해서 전달해줘야 합니다. new String[0]으로 만들어서라도 어떻게든 전달을 해줘야 하는 것이죠. 그래서 좀 더 편리한 방식이 존재합니다. 아래와 같은 방식입니다. 배열을 전달해주면 가져다 쓰고, 넣지 않으면 없는대로 사용합니다. 그리고 객체 생성 코드를 따로 사용하지 않아도 됩니다.
대신 단점이 하나 있습니다. 일단 매개변수(parameter)의 가장 마지막에 넣어줘야만 하고 한 메소드에서 두 번 동시에 사용할 수 없습니다. 위의 첫 번째 방식은 매개변수에서 위치가 관계없고, 여러개를 사용해도 무방합니다. 그래서 이 방법이 편리하긴 하지만 상황에 따라서는 위의 방법을 사용해야 합니다.
package study.first;
public class Study {
public static void main(String[] args) {
print(1, "arg1", "arg2", "arg3");
System.out.println("\n");
print(1);
}
static void print(int a, String... arg) {
System.out.println(a);
for (String num : arg)
System.out.print(num + " ");
}
}
'▸JAVA > 기본 문법' 카테고리의 다른 글
익명 클래스 (Anonymous Class) (2) | 2019.12.10 |
---|---|
내부 클래스 (Inner Class) (2) | 2019.12.10 |
2차원배열_생성/초기화/사이즈변경/출력 [2/2] (2) | 2019.12.10 |
1차원배열_생성/초기화/사이즈변경/출력 [1/2] (2) | 2019.12.10 |
객체 값 출력_toString 메소드 오버라이딩 (2) | 2019.12.10 |
댓글