가변인자와 오버로딩

mingseok·2022년 5월 14일
0

객체 지향 2

목록 보기
6/10

가변인자는 ‘타입...변수명’ => (String...str) 과 같은 형식으로 선언 하는 방식이다.

가변인자는 내부적으로 배열을 생성해서 사용한다!


가변인자를 매개변수 중에서 제일 마지막에 선언해야 한다.

그렇지 않으면 에러 발생 !!


이유는, 가변인자인지 아닌지를 구별할 방법이 없기 때문에 허용하지 않는 것이다.


가변인자란?

여러 문자열을 하나로 결합하여 반환하는 메서드를 말하는 것이다.

이럴 때, 가변인자를 사용하면 메서드 하나로 간단히 대체할 수 있다.

String concatenate(String s1, String s2) { ... }
String concatenate(String s1, String s2, String s3) { ... }
String concatenate(String s1, String s2, String s3, String s4) { ... }


이렇게 사용하는 것이다.

String concatenate(String...str) {...}


심지어는 인자가 아예 없어도 되고 배열도 인자가 될 수 있다.

System.out.println(concatenate()); // 인자가 없는 것도 가능
System.out.println(concatenate("a")); // 인자가 하나 인것도 가능
System.out.println(concatenate("a", "b")); // 인자가 둘 인것도 가능
System.out.println(concatenate(new String[] {"A", "B"})); // 배열도 가능

메서드를 호출할 때마다 배열이 새로 생성 되는 것이다.


코드 줄이기.

String[] strArr = new String[] { "100", "200", "300" };
System.out.println(concatenate("-", strArr));

위에 코드를 합치면 

// 이렇게 되는 것이다.
System.out.println(concatenate("-", new String[] { "100", "200", "300" }));

예제 1.

void sum(String s, String...str) {
        for(String a:str)
            System.out.print(a+s);
}

public static void main(String args[]) {
        Varargs v = new Varargs();
        v.sum("-","a","b","c");
    }

출력값.
a-b-c-


예제 2.

package test;

class aaa {

	public static void main(String[] args) {

		String[] strArr = { "100", "200", "300" };

		System.out.println(concatenate("", "100", "200", "300"));
		System.out.println(concatenate("-", strArr));
		System.out.println(concatenate(",", new String[] { "1", "2", "3" }));
		System.out.println("[" + concatenate(",", new String[0]) + "]");
		System.out.println("[" + concatenate(",") + "]");
	}


	static String concatenate(String delim, String... args) { 
					
		String result = "";

		for (String str : args) {
			result += str + delim;
		}
		return result;
	}

}

// 출력값.
100200300
100-200-300-
1,2,3,
[]
[]

가변인자를 선언한 메서드를 오버로딩하면,
메서드를 호출했을 때 이와 같이 구별되지 못하는 경우가 발생하기 쉽기 때문에 주의해야 한다.
가능하면 가변인자를 사용한 메서드는 오버로딩하지 않는 것이 좋다.


Reference
남궁 성 지음, 『자바의 정석』, 도우출판.
코딩벌레 - https://dpdpwl.tistory.com/137

profile
블로그 이사 했습니다.

0개의 댓글