2023. 1. 21. 19:54ใJAVA/Effective JAVA
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 ์ฒดํฌ๋ ํด์ผํ๊ธฐ ๋๋ฌธ์)
'JAVA > Effective JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ดํํฐ๋ธ ์๋ฐ] Item07 ์๋ฒฝ๊ณต๋ต. Executor (0) | 2023.01.21 |
---|---|
[์ดํํฐ๋ธ ์๋ฐ] Item07 ์๋ฒฝ๊ณต๋ต. WeakHashMap (0) | 2023.01.21 |
[์ดํํฐ๋ธ ์๋ฐ] Item7. ๋ค ์ด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํด์ ํ๋ผ. (1) | 2023.01.21 |
[์ดํํฐ๋ธ ์๋ฐ] Item06 ์๋ฒฝ๊ณต๋ต. ๊ฐ๋น์ง ์ปฌ๋ ์ Garbage Collection GC (0) | 2023.01.19 |
[์ดํํฐ๋ธ ์๋ฐ] Item06 ์๋ฒฝ๊ณต๋ต. ์ ๊ท ํํ์ (0) | 2023.01.19 |