From 48db2a2ddb49c64e0d34e74ee0107c4d0514557f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8F=84=EB=AA=A8?= Date: Sun, 3 Sep 2023 10:07:36 +0900 Subject: [PATCH] =?UTF-8?q?[Item54]:=20null=EC=9D=B4=20=EC=95=84=EB=8B=8C,?= =?UTF-8?q?=20=EB=B9=88=20=EC=BB=AC=EB=A0=89=EC=85=98=EC=9D=B4=EB=82=98=20?= =?UTF-8?q?=EB=B0=B0=EC=97=B4=EC=9D=84=20=EB=B0=98=ED=99=98=ED=95=98?= =?UTF-8?q?=EB=9D=BC=20(#126)(=EB=8F=84=EB=AA=A8)=20(#131)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30\355\231\230\355\225\230\353\235\274.md" | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 "Ch08/item54/null\354\235\264_\354\225\204\353\213\214,_\353\271\210_\354\273\254\353\240\211\354\205\230\354\235\264\353\202\230_\353\260\260\354\227\264\354\235\204_\353\260\230\355\231\230\355\225\230\353\235\274.md" diff --git "a/Ch08/item54/null\354\235\264_\354\225\204\353\213\214,_\353\271\210_\354\273\254\353\240\211\354\205\230\354\235\264\353\202\230_\353\260\260\354\227\264\354\235\204_\353\260\230\355\231\230\355\225\230\353\235\274.md" "b/Ch08/item54/null\354\235\264_\354\225\204\353\213\214,_\353\271\210_\354\273\254\353\240\211\354\205\230\354\235\264\353\202\230_\353\260\260\354\227\264\354\235\204_\353\260\230\355\231\230\355\225\230\353\235\274.md" new file mode 100644 index 0000000..2faae5e --- /dev/null +++ "b/Ch08/item54/null\354\235\264_\354\225\204\353\213\214,_\353\271\210_\354\273\254\353\240\211\354\205\230\354\235\264\353\202\230_\353\260\260\354\227\264\354\235\204_\353\260\230\355\231\230\355\225\230\353\235\274.md" @@ -0,0 +1,64 @@ +# item54. null이 아닌, 빈 컬렉션이나 배열을 반환하라 + +아래 코드는 흔히 볼 수 있는 코드이다. (따라하지 말 것!) +```java +private final List cheesesInStock = ...; + +/** + * @return 매장 안의 모든 치즈 목록을 반환한다. + * 단, 재고가 하나도 없다면 null을 반환한다. + */ +public List getCheeses() { + return cheesesInStock.isEmpty() ? null + : new ArrayList<>(cheesesInStock); +} +``` +이 코드는 재고가 없을 때 null을 반환한다.
+이렇게 null을 반환하는 메서드를 사용하는 클라이언트는 항상 null 상황을 처리하는 코드를 추가로 작성해야 한다.
+이는 코드를 어지럽히고 오류를 유발할 가능성이 높다. + +```java +List cheeses = shop.getCheeses(); +if (cheeses != null && cheeses.contains(Cheese.STILTON)) { + System.out.println("Jolly good, just the thing."); +} +``` + +이러한 문제를 해결하기 위해 null 대신 빈 컬렉션을 반환하면 된다. +```java +public List getCheeses() { + return new ArrayList<>(cheesesInStock); +} +``` + +가능성은 적지만, 사용패턴에 따라 빈 컬렉션을 할당하는 데서 성능이 저하될 수 있다.
+이런 경우 아래와 같이 매번 똑같은 빈 '불변' 컬렉션을 반환하면 된다. +```java +public List getCheeses() { + return cheesesInStock.isEmpty() ? Collections.emptyList() + : new ArrayList<>(cheesesInStock); +} +``` + +배열을 쓸대도 마찬가지이다.
+null을 반환하는 대신 길이가 0인 배열을 반환하면 된다. +```java +public Cheese[] getCheeses() { + return cheesesInStock.toArray(new Cheese[0]); +} +``` + +배열도 마찬가지로 성능이 떨어질것이 우려된다면 길이가 0인 배열을 미리 선언해두고 매번 그 배열을 반환하면 된다. +```java +private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0]; + +public Cheese[] getCheeses() { + return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY); +} +``` + +### 핵심 정리 +null이 아닌 빈 배열이나 컬렉션을 반환하라.
+null을 반환하는 API는 사용하기 어렵고 오류 처리 코드도 늘어난다.
+그렇다고 성능이 좋은 것도 아니다. +