[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item07 ์™„๋ฒฝ๊ณต๋žต.NullPointerException

2023. 1. 21. 19:54ใ†JAVA/Effective JAVA

728x90

 

item07. ๋‹ค ์“ด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜๋ผ. 

" p37 NullPointerException."

 

 

๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ์ œ์ผ ๋งŽ์ด ์ ‘ํ•˜๊ฒŒ ๋˜๋Š” ์—๋Ÿฌ ์ค‘ ํ•˜๋‚˜๊ฐ€ NPE, NullPointerException ์ด๋‹ค. 

๊ทผ๋ฐ ์ƒ๊ฐ์„ ํ•ด๋ณด๋ฉด NPE๋Š” ์—๋Ÿฌ ์„ค๋ช…๋งŒ ๋ด๋„ ์ถฉ๋ถ„ํžˆ ์–ด๋””์„œ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋Š”์ง€ ํ™•์ธ๋„ ์‰ฝ๊ณ , ์™œ ๋‚ฌ๋Š”์ง€๋„ ๊ธˆ๋ฐฉ ์•Œ ์ˆ˜ ์žˆ์–ด์„œ ๊ทธ๋‚˜๋งˆ(?) ์†์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์—๋Ÿฌ์ด๋‹ค. 

 

NPE๋ฅผ ๋งŒ๋‚˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ java 8์—์„œ๋Š” Optional์ด๋ผ๋Š” ๊ฒƒ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ด๊ฑธ ํ™œ์šฉํ•˜๋ฉด NPE๋Š” ์ตœ๋Œ€ํ•œ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

NullPointerException์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ 

: ์šฐ์„  NPE ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•˜๊ธฐ ์ „์— ๊ฐ„๋‹จํ•˜๊ฒŒ๋ผ๋„ NPE ๋ฐœ์ƒ ์ด์œ ๋ฅผ ์ž‘์„ฑํ•ด๋ณธ๋‹ค. 

๋จผ์ € NPE ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” ๋ฉ”์„œ๋“œ์—์„œ null๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ  ์žˆ๊ณ , ๊ทธ๋ฆฌ๊ณ  ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ null ์ฒดํฌ๋ฅผ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. 

 

public class Channel {
    private int numOfSubscribers;

    public MemberShip defaultMemberShip() {
        if (this.numOfSubscribers < 2000) {
            return null;
        }else {
            return new MemberShip();
        }
    }
 }

์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด ๊ตฌ๋…์ž ์ˆ˜๊ฐ€ 2000๋ช…์ด ๋„˜์ง€ ์•Š์œผ๋ฉด null์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค. 

 

class ChannelTest {

    @Test
    void npe() {
        Channel channel = new Channel();
        MemberShip memberShip = channel.defaultMemberShip();
        memberShip.equals(new MemberShip()); // npe ๋ฐœ์ƒ ์‹œ์ 

    }

}

๊ทธ๋ฆฌ๊ณ  ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹น์—ฐํžˆ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. 

 

 

๋งŒ์•ฝ ์œ„์— ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๊ตฌ๋…์ž ์ˆ˜๊ฐ€ 2000๋ช…์ด ๋„˜์ง€ ์•Š์„ ๋•Œ ์ ์ ˆํ•œ ๊ฐ’์„ ๋ฆฌํ„ฐ๋‚  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์— ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์•ˆ์ด 

1) ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค. (throw new XXXException) 

2) null ์„ ๋ฆฌํ„ดํ•œ๋‹ค. 

null์„ ๋ฆฌํ„ดํ•  ๋•Œ๋Š” ๊ทธ๋Ÿผ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ null ์ฒดํฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. 

@Test
void npe() {
    Channel channel = new Channel();
    MemberShip memberShip = channel.defaultMemberShip();
    if (memberShip != null) {
        memberShip.equals(new MemberShip()); // npe ๋ฐœ์ƒ ์‹œ์ 
    }
 }

3) Optional์„ ๋ฆฌํ„ดํ•œ๋‹ค. 

public Optional<MemberShip> optionalMemberShip() {
    if (this.numOfSubscribers < 2000) {
        return Optional.empty();
    }else {
        return Optional.of(new MemberShip());
    }
}

๋งˆ์ง€๋ง‰ ๋ฐฉ๋ฒ•์€ Optional์„ ํ†ตํ•ด์„œ MemberShip์„ ํ•œ๋ฒˆ ๊ฐ์‹ธ์„œ ๋ฆฌํ„ดํ•˜๋Š”๊ฒƒ์ด๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๊ตฌ๋…์ž์ˆ˜๊ฐ€ 2000๋ช…์ด ๋„˜์ง€ ์•Š๋Š”๋‹ค๋ฉด Optional.empty()๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๋ฉด null ๋กœ ๋ฆฌํ„ดํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. 

 

Optional<MemberShip> optionalMemberShip = channel.optionalMemberShip();
optionalMemberShip.ifPresent(MemberShip::hello);

๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ด๋ ‡๊ฒŒ IfPresent()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์žˆ๋‹ค๋ฉด hello ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ–ˆ๋‹ค. 

 

Optional์€ ๋ฆฌํ„ด ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, Optional์„ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฑด ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ( ํŠนํžˆ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ™์€๋ฐ์— ์‚ฌ์šฉํ•˜๋Š”๊ฑด ๋”๋” ์ฝ”๋“œ๋ฅผ ์ง€์ €๋ถ„ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ๊ท€์ฐฎ๊ฒŒ ๋งŒ๋“ ๋‹ค. ์–ด์ฐจํ”ผ null ์ฒดํฌ๋Š” ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—) 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90