[Java] null ์ฐธ์กฐ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์
Java์์ null์ ์ฐธ์กฐ ํ์ ๋ณ์๊ฐ ์๋ฌด ๊ฐ์ฒด๋ ๊ฐ๋ฆฌํค์ง ์์์ ๋ํ๋ด๋ ํน์ํ ๋ฆฌํฐ๋ด์ด๋ค. null์ ๊ฐ์ฒด๊ฐ ์๋๋ฉฐ, ๋ชจ๋ ์ฐธ์กฐ ํ์ ์ ํ ๋น ๊ฐ๋ฅํ์ง๋ง ์ฃผ์๊ฐ์ด 0x0์ผ๋ก ๊ณ ์ ๋์ด ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ด ์ฐจ๋จ๋๋ค.
null์ ๋ณธ์ง์ ํน์ฑ
- ๋ฆฌํฐ๋ด ํ์ : null์ ํค์๋๊ฐ ์๋ ๋ฆฌํฐ๋ด๋ก ๋ถ๋ฅ๋๋ฉฐ, instanceof ์ฐ์ฐ์๋ก ํ์ธ ์ ํญ์ false ๋ฐํ(null์ Object๊ฐ ์๋๊ธฐ ๋๋ฌธ)
- ํ์ ์์คํ : ๋ชจ๋ ์ฐธ์กฐ ํ์ (ํด๋์ค, ์ธํฐํ์ด์ค, ๋ฐฐ์ด)์ ํ ๋น ๊ฐ๋ฅํ์ง๋ง ๊ธฐ๋ณธํ(int ๋ฑ)์๋ ์ง์ ํ ๋น ๋ถ๊ฐ
ํน์ฑ | ์ค๋ช |
์ฃผ์๊ฐ | 0x0์ผ๋ก ๊ณ ์ ๋์ด ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์ฐจ๋จ |
๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์ | ๊ฐ์ฒด ํค๋ ์์ด ๋จ์ 0๊ฐ ์ ์ฅ |
ํ์ ์บ์คํ | ์ด๋ค ์ฐธ์กฐ ํ์ ์ผ๋ก๋ ์บ์คํ ๊ฐ๋ฅ |
์ด๊ธฐํ ๊ธฐ๋ณธ๊ฐ | ํด๋์ค ๋ฉค๋ฒ ๋ณ์์ ๊ฒฝ์ฐ ์๋์ผ๋ก null ์ด๊ธฐํ |
null ์ฐธ์กฐ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์
1. ์๋ฌ์ ๊ทผ์: NullPointerException (NPE)
Java ์ ํ๋ฆฌ์ผ์ด์ ํฌ๋์์ 70% ์ด์์ด NPE์ ์ง์ ์ฐ๊ด๋์ด ์๋ค๋ ์ฐ๊ตฌ ๊ฒฐ๊ณผ๊ฐ ์์ ์ ๋๋ก ํํ ๋ฌธ์ ์ด๋ค.
String street = user.getAddress().getStreet(); // ์ด๋ ๋จ๊ณ์์ null์ด ๋ฐ์ํ ์ง ์์ธก ๋ถ๊ฐ
- ๋ฌธ์ ๋ฐ์ ํจํด
- ๋ฉ์๋ ์ฒด์ด๋ ์ฌ์ฉ ์ ํน์ ๋จ๊ณ์์ null ๋ฐํ
- ์ธ๋ถ ์์คํ (DB/API) ์๋ต์ด ์์์น ๋ชปํ๊ฒ null์ธ ๊ฒฝ์ฐ
2. ์ฝ๋ ๊ฐ๋ ์ฑ ์ ํ: "๊น์ ์์ฌ(Deep Doubt)"
null ์ฒดํฌ ๋ก์ง์ด ์ฝ๋ ๋ณต์ก๋(๋ค์ฌ์ฐ๊ธฐ ์์ค)๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
// ์ ํ์ ์ธ null ์ฒดํฌ ์ค์ฒฉ
if (user != null) {
Address addr = user.getAddress();
if (addr != null) {
City city = addr.getCity();
if (city != null) {
// ์ค์ ๋ก์ง
}
}
}
- ์ ์ง๋ณด์ ๋ฌธ์ ์
- ๋น์ฆ๋์ค ๋ก์ง์ด null ์ฒดํฌ์ ๊ฐ๋ ค์ง
- ์๋ก์ด ํ๋ ์ถ๊ฐ ์ ๋ชจ๋ ๊ด๋ จ ์ฝ๋ ์์ ํ์
- ๋์: Java 8 Optional ํ์ฉ
Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.ifPresent(city -> { /* ๋ก์ง */ });
3. null์ ์๋ฏธ์ ๋ชจํธ์ฑ(์๋ฌด ์๋ฏธ๊ฐ ์์)
null์"๊ฐ ์์"์ ํํํ๋ ํ์คํ๋ ๋ฐฉ๋ฒ์ด ์์ด ๋ค์ํ ํด์์ด ๊ฐ๋ฅํ๋ค.
์ํฉ | null์ ํด์ | ์ ์ ํ ๋์ |
์ฌ์ฉ์ ์ ํ๋ฒํธ ์กฐํ | ์ ๋ณด ๋ฏธ์ ๊ณต vs ๊ถํ ์์ | Optional.empty()+ ์์ธ ์ฒ๋ฆฌ |
API ์๋ต | ์คํจ vs ์ ํจํ ๋น ๊ฒฐ๊ณผ | HTTP 404 vs ๋น JSON ๋ฐฐ์ด |
์บ์ ์์คํ | ์บ์ฑ x vs ์บ์ ๋ง๋ฃ | ๋ณ๋ ์ํ ๊ฐ(EXISTS/NOT_FOUND) |
- ์ฝํ๋ฆฐ ์ธ์ด๋ ๊ธฐ๋ณธ null ์์ ์ฑ(null safety) ์ฑํ
4. ์๋ฐ ์ฒ ํ ์๋ฐ
Java์ ํต์ฌ ์ค๊ณ ์์น ์ค ํ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ์ง์ ์ ๊ทผ ๋ฐฉ์ง์ด์ง๋ง, null์ ์ด๋ฅผ ํผ์ํ๋ค.
Object obj = null;
obj.toString(); // ํฌ์ธํฐ ์ญ์ฐธ์กฐ์ ์ ์ฌํ ๋์
5. ํ์ ์์คํ ๋ถ๊ดด: ํ์ ์์ ์ฑ ์นจ์
null์ ๋ชจ๋ ์ฐธ์กฐ ํ์ ์ ํ ๋น ๊ฐ๋ฅํ ์๋ฌต์ ํ์ ์ ๋ง๋ ๋ค.
List<String> names = Arrays.asList("A", null, "B");
names.forEach(s -> System.out.println(s.length())); // ๋ฐํ์ NPE
- null์ด ์ ํ๋๋ฉฐ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ
- API ๊ฒฝ๊ณ์์ null ์ ์
- ๊ณ์ธต ๊ฐ ์ ํ (DB → DAO → Service → Controller)
- ์ปฌ๋ ์ ๋ด ์์๋ก ์ ์ฅ๋ ๋ ์ํ์ฑ ์ฆ๋
๋ฌธ์ ์ ํ | ์ ํต์ ์ ๊ทผ | ํด๊ฒฐ์ฑ |
๊ฐ ์์ ํํ | return null; | Optional<T> |
๋งค๊ฐ๋ณ์ ๊ฒ์ฆ | ์๋if (param == null) | @NonNull์ด๋ ธํ ์ด์ |
API ์ค๊ณ | ์๋ฌต์ null ํ์ฉ | Null-safe ํ์ ์์คํ (์ฝํ๋ฆฐ) |
์ปฌ๋ ์ ์์์ null ๊ด๋ฆฌ
์ ๋ต | ๊ตฌํ ์์ | ์ฅ์ |
์ด๊ธฐํ ๊ฐ์ | List<String> list = new ArrayList<>() | NullPointerException ๋ฐฉ์ง |
Optional ๋ํ | List<Optional<String>> | ๋ช ์์ ๋๋ฝ ๊ฐ ํํ |
ํํฐ๋ง | list.removeIf(Objects::isNull) | ๋ถํ์ํ null ์ ๊ฑฐ |
์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ
- ๊ฐ์ฒด ์์ฑ ์ค๋ฒํค๋: Optional์ ์ฌ์ฉํ๋ฉด ๊ฐ ์์๋ง๋ค ๋ณ๋์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฏ๋ก, ๋น๋ฒํ ์ฐ์ฐ์์๋ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ: ๋จ์ํ null ์ฐธ์กฐ๋ 32๋นํธ JVM์์ 4๋ฐ์ดํธ, 64๋นํธ JVM์์ 8๋ฐ์ดํธ๋ฅผ ์ฐจ์งํ๋ ๋ฐ๋ฉด, Optional ๊ฐ์ฒด๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
- ์ต์ ํ ์ ํ: JIT ์ปดํ์ผ๋ฌ๊ฐ null ์ฒดํฌ ์ฝ๋๋ Optional ๊ด๋ จ ์ฝ๋๋ฅผ ์ต์ ํํ๋ ๋ฐ ์ ์ฝ์ด ์์ ์ ์์ผ๋ฏ๋ก, ์ฑ๋ฅ ๋ฏผ๊ฐํ ํ๊ฒฝ์์๋ ์ด๋ฌํ ๋น์ฉ์ ๊ณ ๋ คํด์ผ ํ๋ค.
์ฐธ๊ณ ์๋ฃ:
๋ชจ๋ ์๋ฐ ์ธ ์ก์
https://www.upwork.com/resources/what-is-null-in-java
https://javanexus.com/blog/avoiding-null-in-java-collections-best-practices
Avoiding Null in Java Collections: Best Practices
Discover essential strategies to minimize null values in Java collections, ensuring robust and error-free code. Boost code reliability now!
javanexus.com
https://javarush.com/ko/groups/posts/ko.470.null-java-