Java

[Java] null ์ฐธ์กฐ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

9taetae9 2025. 2. 14. 11:12
728x90

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์ด ์ „ํŒŒ๋˜๋ฉฐ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
    1. API ๊ฒฝ๊ณ„์—์„œ null ์œ ์ž…
    2. ๊ณ„์ธต ๊ฐ„ ์ „ํŒŒ (DB → DAO → Service → Controller)
    3. ์ปฌ๋ ‰์…˜ ๋‚ด ์š”์†Œ๋กœ ์ €์žฅ๋  ๋•Œ ์œ„ํ—˜์„ฑ ์ฆ๋Œ€
๋ฌธ์ œ ์œ ํ˜• ์ „ํ†ต์  ์ ‘๊ทผ ํ•ด๊ฒฐ์ฑ…
๊ฐ’ ์—†์Œ ํ‘œํ˜„ 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-

 

728x90