아이템 53. 가변인수는 신중히 사용하라 #124
-
📝구성 Table of contents generated with markdown-toc 0. 들어가기에 앞서 🤔가변인수?
자바 5버전 이전에는 가변 인수 처리를 위해서
// Java 5 이전 버전에서는 가변인수를 지원하지 않으므로 배열을 이용하여 여러 개의 인수를 전달했다.
public void printStrings(String[] strings) {
for (int i = 0; i < strings.length; i++) {
System.out.print(strings[i]);
}
}
// Java 5 이전 버전에서는 가변인수를 지원하지 않으므로 메서드 오버로딩을 이용하여 여러 버전의 메서드를 구현했다.
public void printStrings(String s1) {
System.out.print(s1);
}
public void printStrings(String s1, String s2) {
System.out.print(s1);
System.out.print(s2);
}
public void printStrings(String s1, String s2, String s3) {
System.out.print(s1);
System.out.print(s2);
System.out.print(s3);
}
// ... More Method Java 5 버전 이후 가변인수가 도입된 이후에도 여전히 위의 방법을 사용할 수 있지만, 가변인수를 사용하면 배열이나 메서드 오버로딩을 이용한 구현보다 간결하고 가독성이 높은 코드를 작성할 수 있게 되었다. // 가변인수를 이용하여 구현한 printStrings 메서드
public void printStrings(String... strings) {
for (int i = 0; i < strings.length; i++) {
System.out.print(strings[i]);
}
} 근데 쓰라고 만들어 놓은 메서드를 왜 1. 가변인수를 신중히 사용해야 하는 이유 ✨위에서 만든
public void printStrings(String... strings) {
if (strings.length < 1) {
throw new IllegalArgumentException("인수 1개 이상 필요.");
}
for (int i = 0; i < strings.length; i++) {
System.out.print(strings[i]);
}
}
printStrings("foo", "bar", "barz");
pirntStrings("foo", "bar");
pirntStrings(); // 에러 발생 해당 코드는 원하는 결과를 도출하는데 문제점이 있다. 바로 컴파일 단계를 넘어서 이를 해결하기 위한 비책은 기본 파라미터와 가변인자 파라미터를 중복으로 두는 방법이다. public void printStrings(String firstString, String... strings) {
for (int i = 0; i < strings.length; i++) {
System.out.print(strings[i]);
}
}
printStrings("foo", "bar", "barz");
pirntStrings("foo", "bar");
pirntStrings(); // 컴파일 에러 발생 런타임 시점에 에러를 던져 처리하는 것보다 코드가 더 명확해졌다. 그리고 코드를 작성하는 시점에서 빠르게 에러 사항을 감지할 수 있다. 하지만 이는 성능에 민감한 사항에서 걸림돌이 될 수 있다. 이말을 다시 풀어보자면 가변인수의 호출없이 코드를 사용하게 된다면 필요없는 배열의 할당과 초기화가 일어나는 것이다. 위의 코드를 개발하던 개발자는 메서드의 호출 횟수를 체크하게 되었다. 리팩토링을 감행하고자보니 public void printStrings(String firstString) { }
public void printStrings(String firstString, String secondString) { }
public void printStrings(String firstString, String secondString, String thirdString) { }
public void printStrings(String firstString, String secondString, String thirdString, String... strings) { } 실제로 자바 코드에서는 public static <E extends Enum<E>> EnumSet<E> of(E e) {
EnumSet<E> result = noneOf(e.getDeclaringClass());
result.add(e);
return result;
}
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2) {
EnumSet<E> result = noneOf(e1.getDeclaringClass());
result.add(e1);
result.add(e2);
return result;
}
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3) {
EnumSet<E> result = noneOf(e1.getDeclaringClass());
result.add(e1);
result.add(e2);
result.add(e3);
return result;
}
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4) {
EnumSet<E> result = noneOf(e1.getDeclaringClass());
result.add(e1);
result.add(e2);
result.add(e3);
result.add(e4);
return result;
}
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4,
E e5) {
EnumSet<E> result = noneOf(e1.getDeclaringClass());
result.add(e1);
result.add(e2);
result.add(e3);
result.add(e4);
result.add(e5);
return result;
}
@SafeVarargs
public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest) {
EnumSet<E> result = noneOf(first.getDeclaringClass());
result.add(first);
for (E e : rest)
result.add(e);
return result;
} 2. 핵심 정리 📚
3. 회고 🧹2022.02.18
|
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 3 replies
-
설명해주신것과 마찬가지로 List.of 메서드도 성능을 위해 일정 개수 이하를 받는 of 메서드가 구현되어있더라구요. |
Beta Was this translation helpful? Give feedback.
-
#128 참고 |
Beta Was this translation helpful? Give feedback.
#128 참고
가변인수(varargs)를 사용하는 메서드라면 다중정의를 아예 하지 말아야 함!!!!