[교재 EffectiveJava] 아이템 53. 가변인수는 신중히 사용하라
- Book/Effective Java
- 2021. 11. 24.
반응형
728x90
반응형
가변인수 메서드
가변인수(varags) 메서드는 명시한 타입의 인수를 0개 이상 받을 수 있다.
* 가변 인수 메서드 호출 과정
1) 먼저 인수의 개수와 길이가 같은 배열을 만든다.
2) 만들어진 인수들을 이 배열에 저장한다.
3) 배열을 가변 인수 메서드에 건네준다.
가변인수 예제코드
package com.java.effective.item53;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
System.out.println(sum(1, 2, 3));
}
static int sum(int... args) {
return Arrays.stream(args).sum();
}
}
인수가 1개 이상이어야 할 경우도 있다. 인수 개수는 런타임에 자동 생성된 배열의 길이로 알 수 있다. 인수 개수가 0개일 경우 에러를 발생시켜보자.
잘못된 예시
package com.java.effective.item53;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
System.out.println(sum(1, 2, 3));
}
/**
* 인수가 0 개이면 컴파일 타임이 아닌 런타임에 알 수 있다.
* @param args
* @return
*/
static int min(int... args) {
if (args.length == 0) {
throw new IllegalArgumentException("인수가 1개 이상 필요합니다.");
}
int min = args[0];
for (int i = 1; i < args.length; i++) {
if (args[i] < min) {
min = args[i];
}
}
return min;
}
}
args로 모두 받으려하지말고, 매개변수를 나눠보자. 첫번째로는 평범한 매개변수를 받고, 두번째에 가변인수를 받자.
해결코드
package com.java.effective.item53;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
System.out.println(sum(1, 2, 3));
}
static int min(int firstArg, int... remainingArgs) {
int min = firstArg;
for (int arg : remainingArgs) {
if (arg < min) {
min = arg;
}
}
return min;
}
}
가변인수의 유연성
가변인수는 인수 개수가 정해지지 않았을대 아주 유용하다. 그런데 성능에 민감한 상황이라면, 가변인수가 걸림돌이 될 수 있다. 호출 될때마다 배열 하나를 새로 할당하고 초기화하기 때문이다.
이 비용을 감당할 수는 없지만 가변 인수의 유연성이 필요할때 선택할 수 있는 패턴이 존재한다. 예를 들어 해당 메서드 호출의 95%가 인수를 3개 이하로 사용한다고 해보자. 그렇다면 다음 처럼 인수가 0개인 것부터 4개인 것까지 총 5개의 메서드를 다중정의한다.
다중정의
public void foo() {}
public void foo(int a1) {}
public void foo(int a1, int a2) {}
public void foo(int a1, int a2, int a3) {}
public void foo(int a1, int a2, int a3, int... rest) {}
반응형
'Book > Effective Java' 카테고리의 다른 글
[교재 EffectiveJava] 아이템 55. 옵셔널 반환은 신중히 하라 (0) | 2021.11.26 |
---|---|
[교재 EffectiveJava] 아이템 54. null이 아닌 빈 컬렉션이나 배열을 반환하라 (0) | 2021.11.25 |
[교재 EffectiveJava] 아이템 52. 다중정의는 신중히 사용하라 (0) | 2021.11.23 |
[교재 EffectiveJava] 아이템 51. 메서드 시그니처를 신중히 설계하라 (0) | 2021.11.22 |
[교재 EffectiveJava] 아이템 50. 적시에 방어적 복사본을 만들라 (0) | 2021.11.21 |