๐ ๋ชฉ์ฐจ.
7. ์ค๋ฅ ์ฒ๋ฆฌ
.์ค๋ฅ ์ฝ๋๋ณด๋ค ์์ธ๋ฅผ ์ฌ์ฉํ๋ผ
.Try-Catch-Finally ๋ฌธ๋ถํฐ ์์ฑํ๋ผ
.๋ฏธํ์ธ(unchecked) ์์ธ๋ฅผ ์ฌ์ฉํ๋ผ
.์์ธ์ ์๋ฏธ๋ฅผ ์ ๊ณตํ๋ผ
.ํธ์ถ์๋ฅผ ๊ณ ๋ คํด ์์ธ ํด๋์ค๋ฅผ ์ ์ํ๋ผ
.Null์ ๋ฐํํ์ง ๋ง๋ผ
.Null์ ์ ๋ฌํ์ง ๋ง๋ผ
.๊ฒฐ๋ก
โ๏ธ ๋ด์ฉ.
7. ์ค๋ฅ ์ฒ๋ฆฌ
๊นจ๋ํ ์ฝ๋์ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ฐ๊ด์ฑ์ด ์๋ค. ์๋น์ ์ฝ๋ ๊ธฐ๋ฐ์ ์ ์ ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋์ ์ข์ฐ๋๋ค.
์ฌ๊ธฐ์ ๊ธฐ ํฉ์ด์ง ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋ ๋๋ฌธ์ ์ค์ ์ฝ๋๊ฐ ํ๋ ์ผ์ ํ์ ํ๊ธฐ ์ด๋ ต๋ค๋ ์๋ฏธ์ด๋ค.
์ค๋ฅ ์ฒ๋ฆฌ๋ ์ค์ํ๋ค.
ํ์ง๋ง ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋๋ก ์ธํด ํ๋ก๊ทธ๋จ ๋ ผ๋ฆฌ๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์์ง๋ค๋ฉด ๊นจ๋ํ ์ฝ๋๋ผ ๋ถ๋ฅด๊ธฐ ์ด๋ ต๋ค.
.์ค๋ฅ ์ฝ๋๋ณด๋ค ์์ธ๋ฅผ ์ฌ์ฉํ๋ผ
if/else๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์๋ฌ ๋ฐ์ ์ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ๋ณด๋ค๋ try/catch๋ฅผ ์ฌ์ฉํ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ๋๋ก ํ์.
.Try-Catch-Finally ๋ฌธ๋ถํฐ ์์ฑํ๋ผ
try ๋ธ๋ก์ ํธ๋์ญ์ ๊ณผ ๋น์ทํ๋ค. try์์ ๋ฌด์จ ์ผ์ด ์๊ธฐ๋ catch๋ ํ๋ก๊ทธ๋จ ์ํ๋ฅผ ์ผ๊ด์ฑ ์๊ฒ ์ ์งํด์ผ ํ๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์์ธ๊ฐ ๋ฐ์ํ ์ฝ๋๋ฅผ ์งค ๋๋ try-catch-finally ๋ฌธ์ผ๋ก ์์ํ๋ ํธ์ด ๋ซ๋ค.
๋จผ์ ๊ฐ์ ๋ก ์์ธ๋ฅผ ์ผ์ผํค๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ ํ ํ ์คํธ๋ฅผ ํต๊ณผํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๊ถ์ฅํ๋ค.
๊ทธ๋ฌ๋ฉด ์์ฐ์ค๋ฝ๊ฒ try ๋ธ๋ก์ ํธ๋์ญ์ ๋ฒ์๋ถํฐ ๊ตฌํํ๊ฒ ๋๋ฏ๋ก ๋ฒ์ ๋ด์์ ํธ๋์ญ์ ๋ณธ์ง์ ์ ์งํ๊ธฐ ์ฌ์์ง๋ค.
.๋ฏธํ์ธ(unchecked) ์์ธ๋ฅผ ์ฌ์ฉํ๋ผ
๋ง์ ์๊ฐ ๋์ ์๋ฐ ํ๋ก๊ทธ๋๋จธ๋ค์ ํ์ธ๋(checked) ์์ธ์ ์ฅ๋จ์ ์ ๋๊ณ ๋ ผ์์ ๋ฒ์ฌ์๋ค.
ํ์ธ๋ ์์ธ๋ OCP(Open Closed Principle)๋ฅผ ์๋ฐํ๋ค.
๋ฉ์๋์์ ํ์ธ๋ ์์ธ๋ฅผ ๋์ก๋๋ฐ catch ๋ธ๋ก์ด ์ธ ๋จ๊ณ ์์ ์๋ค๋ฉด ๊ทธ ์ฌ์ด ๋ฉ์๋ ๋ชจ๋๊ฐ ์ ์ธ๋ถ์ ํด๋น ์์ธ๋ฅผ ์ ์ํด์ผ ํ๋ค. ์ฆ, ํ์ ๋จ๊ณ์์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์์ ๋จ ๊ฒ ๋ฉ์๋ ์ ์ธ๋ถ๋ฅผ ์ ๋ถ ๊ณ ์ณ์ผ ํ๋ค๋ ๋ง์ด๋ค.
ํ์ธ๋ ์์ธ๋ ์บก์ํ๋ฅผ ๊นจํธ๋ฆฐ๋ค.
๋๊ท๋ชจ ์์คํ ์์ ํธ์ถ ๊ณผ์ ์. ์ต์์ ํจ์๊ฐ ์๋ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ๋จ๊ณ๊ฐ ๋ด๋ ค๊ฐ์๋ก ํธ์ถํ๋ ํจ์ ์๋ ๋์ด๋๋ค. ์ด์ ์ตํ์ ํจ์์์ ์๋ก์ด ์ค๋ฅ๋ฅผ ๋์ง๋ค๋ฉด? ํจ์ ์ ์ธ๋ถ์ throws ์ ์ ์ถ๊ฐํด์ผ ํ๋ค. ๊ทธ๋ฌ๋ฉด ๋ณ๊ฒฝํ ํจ์๋ฅผ ํธ์ถํ๋ ๋ชจ๋๊ฐ 1. catch ๋ธ๋ก์์ ์๋ก์ด ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋, 2. ์ ์ธ๋ถ์ trhow ์ ์ ์ถ๊ฐํด์ผ ํ๋ ์ฐ์์์ฉ์ด ์ตํ์ ๋จ๊ณ์์ ์ต์์ ๋จ๊ณ๊น์ง ์ผ์ด ๋๋ค. throw ๊ฒฝ๋ก์ ์์นํ๋ ๋ชจ๋ ํจ์๊ฐ ์ตํ์ ํจ์์์ ๋์ง๋ ์์ธ๋ฅผ ์์์ผ ํ๋ฏ๋ก ์บก์ํ๊ฐ ๊นจ์ง๋ค.
๋๋ก๋ ํ์ธ๋ ์์ธ๋ ์ ์ฉํ๋ค. ์์ฃผ ์ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ๋ค๋ฉด ๋ชจ๋ ์์ธ๋ฅผ ์ก์์ผ ํ๋ค.
ํ์ง๋ง ์ผ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์กด์ฑ์ด๋ผ๋ ๋น์ฉ์ด ์ด์ต๋ณด๋ค ํฌ๋ค.
.์์ธ์ ์๋ฏธ๋ฅผ ์ ๊ณตํ๋ผ
์์ธ๋ฅผ ๋์ง ๋๋ ์ ํ ์ํฉ์ ์ถฉ๋ถํ ๋ง๋ถ์ธ๋ค.
๊ทธ๋ฌ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์์ธ๊ณผ ์์น๋ฅผ ์ฐพ๊ธฐ ์ฌ์์ง๋ค. ์๋ฐ๋ ๋ชจ๋ ์์ธ์ ํธ์ถ ์คํ์ ์ ๊ณตํ๋ค. ํ์ง๋ง ์คํจ ์ฝ๋์ ์๋๋ฅผ ๋ช ํํ ํ์ ํ๊ธฐ ์ํด์๋ ํธ์ถ ์คํ๋ง์ผ๋ก ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ์ค๋ฅ ๋ฉ์์ง์ ์ ๋ณด๋ฅผ ๋ด์ ์์ธ์ ํจ๊ป ๋์ง๋ค. ์คํจํ ์ฐ์ฐ ์ด๋ฆ, ์คํจ ์ ํ ๋ฑ์ ๋ด์์ค๋ค. ๋ก๊น ๊ธฐ๋ฅ์ ์ฌ์ฉํด catch ๋ธ๋ก์์ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ๋๋ก ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ๋๊ฒจ์ค๋ค.
.ํธ์ถ์๋ฅผ ๊ณ ๋ คํด ์์ธ ํด๋์ค๋ฅผ ์ ์ํ๋ผ
์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค๋ฅ๋ฅผ ์ ์ํ ๋ ํ๋ก๊ทธ๋๋จธ์๊ฒ ๊ฐ์ฅ ์ค์ํ ๊ด์ฌ์ฌ๋ ์ค๋ฅ๋ฅผ ์ก์๋ด๋ ๋ฐฉ๋ฒ์ด ๋์ด์ผ ํ๋ค.
๋ค์์ ์ค๋ฅ๋ฅผ ํํธ์์ด ๋ถ๋ฅํ ์ฌ๋ก์ด๋ค. ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ์ถํ๋ try-catch-finally ๋ฌธ์ ํฌํจํ ์ฝ๋๋ก, ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋์ง ์์ธ๋ฅผ ๋ชจ๋ ์ก์๋ธ๋ค.
ACMEPort port = new ACMEPort(12);
try{
port.open();
} catch (DeviceResponseException e){
reportPortError(e);
logger.log("Device response exception", e);
} catch (ATM1212UnlockedException e){
reportPortError(e);
logger.log("Unlock exception", e);
} catch (GMXError e){
reportPortError(e);
logger.log("Device response exception", e);
} finally {
...
}
์ ๊ฒฝ์ฐ ์์ธ์ ๋์ํ๋ ๋ฐฉ์์ด ์์ธ ์ ํ๊ณผ ๋ฌด๊ดํ๊ฒ ๊ฑฐ์ ๋์ผํ๋ค. ๊ทธ๋์ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ๊ณ ์น๊ธฐ ์ฝ๋ค.
ํธ์ถํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ API๋ฅผ ๊ฐ์ธ๋ฉด์ ์์ธ ์ ํ ํ๋๋ฅผ ๋ณํํ๋ฉด ๋๋ค.
LocalPort port = new LocalPort(12);
try{
port.open();
} catch (PortDeviceFailure e){
reportPortError(e);
logger.log("e.getMessage()" e);
} finally {
...
}
์ฌ๊ธฐ์ LocalPort ํด๋์ค๋ ๋จ์ํ ACMEPort ํด๋์ค๊ฐ ๋์ง๋ ์์ธ๋ฅผ ์ก์ ๋ณํํ๋ ๊ฐ์ธ๊ธฐ(Wrapper) ํด๋์ค์ผ ๋ฟ์ด๋ค.
public class LocalPort {
private ACMEPort innerPort;
public LocalPort(int portNumber){
innerPort = new ACMEPort(portNumber);
}
public void open(){
try {
innerPort.open();
} catch (DeviceResponseException e){
throw new PortDeviceFailure(e);
} catch (ATM1212UnlockedException e){
throw new PortDeviceFailure(e);
} catch (GMXError e) {
throw new PortDeviceFailure(e);
}
...
}
}
LocalPort ํด๋์ค์ฒ๋ผ ์ธ๋ถ API(ACMEPort)๋ฅผ ๊ฐ์ธ๋ ํด๋์ค๋ ๋งค์ฐ ์ ์ฉํ๋ค. ์ค์ ๋ก ์ธ๋ถ API๋ฅผ ์ฌ์ฉํ ๋๋ ๊ฐ์ธ๊ธฐ ๊ธฐ๋ฒ์ด ์ต์ ์ด๋ค. ์ธ๋ถ API๋ฅผ ๊ฐ์ธ๋ฉด ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ก๊ทธ๋จ ์ฌ์ด์์ ์์กด์ฑ์ด ํฌ๊ฒ ์ค์ด๋ ๋ค. ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ต์ฒดํ ๋ ๋น์ฉ์ด ์ ๊ฒ ๋ ๋ค. ๋ํ ๊ฐ์ธ๊ธฐ(Wrapper) ํด๋์ค์์ ์ธ๋ถ API๋ฅผ ํธ์ถํ๋ ๋์ ํ ์คํธ ์ฝ๋๋ฅผ ๋ฃ์ด์ฃผ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ก๊ทธ๋จ์ ํ ์คํธํ๊ธฐ๋ ์ฌ์์ง๋ค.
.Null์ ๋ฐํํ์ง ๋ง๋ผ
๋ฉ์๋์์ null์ ๋ฐํํ๊ณ ํ ์ ํน์ด ๋ ๋ค๋ฉด ์์ธ๋ฅผ ๋์ง๊ฑฐ๋ ํน์ ์ฌ๋ก ๊ฐ์ฒด(ex. Collections.emptyList())๋ฅผ ๋ณํํ๋ค.
๋๋ ์ธ๋ถ API์ ๊ฒฝ์ฐ ๊ฐ์ธ๊ธฐ(Wrapper)์ ๊ตฌํํด ์์ธ๋ฅผ ๋์ง๊ฑฐ๋ ํน์ ์ฌ๋ก ๊ฐ์ฒด๋ฅผ ๋ณํํ๋๋ก ํ๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ํด๊ฒฐ์ฑ ์ผ๋ก๋ ํน์ ์ฌ๋ก ๊ฐ์ฒด๊ฐ ์์ฌ์ด ํด๊ฒฐ์ฑ ์ด๋ค
.Null์ ์ ๋ฌํ์ง ๋ง๋ผ
๋ฉ์๋์์ null์ ๋ฐํํ๋ ๋ฐฉ์๋ ๋์์ง๋ง ์ ๋ฌํ๋ ๊ฑด ๋ ๋์๋ค.
์ ์์ ์ธ ์ธ์๋ก null์ ๊ธฐ๋ํ๋ API๊ฐ ์๋๋ผ๋ฉด ๋ฉ์๋๋ก null์ ์ ๋ฌํ๋ ์ฝ๋๋ ์ต๋ํ ํผํ๋ค.
๋๋ค์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ํธ์ถ์๊ฐ ์ค์๋ก ๋๊ธฐ๋ null์ ์ ์ ํ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ์ด์ null์ ๋๊ธฐ์ง ๋ชปํ๋๋ก ๊ธ์งํ๋ ์ ์ฑ ์ด ํฉ๋ฆฌ์ ์ด๋ค. ์ฆ, ์ธ์๋ก null์ด ๋์ด์ค๋ฉด ์ฝ๋์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๋ง์ด๋ค. ์ด๋ฐ ์ ์ฑ ์ ๋ฐ๋ฅด๋ฉด ๊ทธ๋งํผ ๋ถ์ฃผ์ํ ์ค์๋ฅผ ์ ์ง๋ฅผ ํ๋ฅ ๋ ์์์ง๋ค.
. ๊ฒฐ๋ก
๊นจ๋ํ ์ฝ๋๋ ์ฝ๊ธฐ๋ ์ข์์ผ ํ์ง๋ง ์์ ์ฑ๋ ๋์์ผ ํ๋ค.
์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํ๋ก๊ทธ๋จ ๋ ผ๋ฆฌ์ ๋ถ๋ฆฌํด ๋ ์์ ์ธ ์ฌ์์ผ๋ก ๊ณ ๋ คํ๋ฉด ํผํผํ๊ณ ๊นจ๋ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ ผ๋ฆฌ์ ๋ถ๋ฆฌํ๋ฉด ๋ ๋ฆฝ์ ์ธ ์ถ๋ก ์ด ๊ฐ๋ฅํด ์ฝ๋ ์ ์ง๋ณด์์ฑ๋ ํฌ๊ฒ ๋์์ง๋ค.
๐ ๋๋ ์ .
- OCP์ ์บก์ํ๋ฅผ ๊นจํธ๋ฆฌ๋ Checked ์์ธ๋ณด๋ค๋ Unchecked ์์ธ๋ฅผ ์ฌ์ฉํ์!
- Exception์ ์ค๋ฅ์ ๋ํ ๋ช ํํ ์ ๋ณด๋ฅผ ๋ด์ ๋ณด๋ด์
- ๋น์ฆ๋์ค์ ์ค๋ฅ์ฒ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ๋๋ก ํ๋ค! (Wrapper ์ฌ์ฉ)
- Null์ ๋ฐํ/์ ๋ฌํ์ง ๋ง์
- ๊นจ๋ํ ์ฝ๋๋ ์์ ์ฑ ๋ํ ๋์์ผ ํ๋ค!
'Study > CleanCode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Study][CleanCode - 2] 9. ๋จ์ ํ ์คํธ (0) | 2022.07.17 |
---|---|
[Study][CleanCode - 2] 8. ๊ฒฝ๊ณ (0) | 2022.07.16 |
[Study][CleanCode - 2] 6. ๊ฐ์ฒด์ ์๋ฃ๊ตฌ์กฐ (0) | 2022.07.14 |
[Study][CleanCode - 2] 5. ํ์ ๋ง์ถ๊ธฐ (0) | 2022.07.13 |
[Study][CleanCode - 1] 4. ์ฃผ์ (0) | 2022.07.11 |