티스토리 뷰
(Effective Java) 규칙53. null 대신 빈 배열이나 컬렉션을 사용하라
null 반환의 문제..
-
Collection을 다루는 코드를 쓰다 보면 아래와 같은 경우는 어렵지 않게 만날 수 있다.
private final List<Ball> ballList = ...; public Ball[] getBalls() { if (ballList.size() == 0) return null; ....
-
문제는 위 코드를 사용하는 클라이언트측에서 발생 할 수 있다.
-
null이 반환될 때의 처리를 추가해줘야 하는데 만약 이를 잊은 경우 오류를 유발한다. 이런 문제는 드러나지 않은 채로 몇년씩이나 잠복해있을 수 있다는 점에서 아주 위험하다.
빈 배열, 컬렉션을 반환하라
- 문제 해결을 위해서는 빈 배열, 컬렉션을 만들어 반환해야 한다.
But..
-
배열 할당은 피할 수 있으니 null을 반환해야 하지 않나?
- 해당 메서드가 성능 저하의 주범이라는 것이 밝혀지지 않는 한 성능 걱정을 하는 것은 바람직 하지 않음
- 길이가 0인 배열은 변경이 불가능하기 때문에 아무 문제 없이 재사용 가능함
-
빈 배열을 반환하는 표준적인 방법은 아래와 같다.
- 컬렉션에서 배열을 만들어 반환하는 올바른 방법
private final List<Ball> ballList = ...; private static final Ball[] EMPTY_BALL_ARRAY = new Ball[0]; public Ball[] getBalls() { return ballList.toArray(EMPTY_BALL_ARRAY); }
-
보통 toArray는 반환되는 원소가 담길 배열을 스스로 할당하는데, 컬렉션이 비어 있는 경우 인자로 주어진 빈 배열을 사용한다.
-
Collection.toArray(T[])의 명세를 보면, 인자로 주어진 배열이 컬렉션의 모든 원소를 담을 정도로 큰 경우에는 해당 배열을 반환값으로 사용한다고 되어 있음
public <T> T[] toArray(T[] a) { if (a.length < size) // Make a new array of a's runtime type, but my contents: return (T[]) Arrays.copyOf(elementData, size, a.getClass()); System.arraycopy(elementData, 0, a, 0, size); if (a.length > size) a[size] = null; return a; }
- List의 size는 0이므로 System.arraycopy를 사용할 것임
- Array.copyOf는 배열을 새로 할당하여 값을 복사하는 것임
- System.arraycopy 는 이미 존재하는 배열에 값을 복사하는 것임
- List의 size는 0이므로 System.arraycopy를 사용할 것임
-
마찬가지로, 컬렉션을 반환하는 경우에도 Collections.emptySet, emptyList, emptyMap 등 빈 컬렉션 객체를 반환 하도록 구현이 가능하다.
결론
null 대신에 빈 배열이나, 빈 컬렉션을 사용하자.
C에서는 ..
- C에서는 배열의 길이와 배열이 따로 반환된다.
- 그렇기 때문에 길이0인 배열을 할당해서 반환하더라도 아무 이득이 없다.
끝으로
이 글이 도움이 되었다면, Google 광고 한번씩 클릭 부탁 드립니다. 🙏🙏🙏
광고 클릭은 많은 힘이 됩니다!
반응형
'프로그래밍 > EffectiveJava' 카테고리의 다른 글
(이펙티브 자바) 규칙18. 상속보다는 컴포지션을 사용하라 (0) | 2020.02.13 |
---|---|
(이펙티브 자바) 규칙 1. 생성자 대신 정적 팩터리 메서드를 고려하라 (0) | 2020.02.11 |
(이펙티브 자바) 규칙6. 불필요한 객체 생성을 피하라 (0) | 2020.02.10 |
(이펙티브 자바) 규칙4. 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2020.02.06 |
(이펙티브 자바) 규칙3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2020.02.06 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- JavaFX
- JavaFX 종료
- 인텔리제이
- JavaFX 테이블뷰
- 일본 배낭여행
- 스프링부트
- 일본 여행
- effectivejava
- 이펙티브자바
- effective java
- java
- 자바
- TableView
- JavaFX Table View
- 일본 자전거 여행
- 이펙티브
- 배낭 여행
- windows
- 방통대 과제물
- 텐트
- git
- 자전거 여행
- intelij
- JavaFX Window Close
- 배낭여행
- 일본여행
- 이펙티브 자바
- springboot
- Java UI
- 자전거
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함