아이템 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 MethodJava 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)를 사용하는 메서드라면 다중정의를 아예 하지 말아야 함!!!!