์ค๋ฅ ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ ผ๋ฆฌ๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋์ ์์ด๊ฒ ๋์ด ์ฝ๋๊ฐ ๋ณต์กํด์ง๋ค. ์ฐจ๋ผ๋ฆฌ ์์ธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฎ๋ค.
try ๋ธ๋ก์์ ๋ฌด์จ ์ผ์ด ์๊ธฐ๋ ์ง catch ๋ธ๋ก์ ํ๋ก๊ทธ๋จ ์ํ๋ฅผ ์ผ๊ด์ฑ ์๊ฒ ์ ์งํด์ผ ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์์ธ๊ฐ ๋ฐ์ํ ์ฝ๋๋ฅผ ์งค ๋๋ try-catch-finally ๋ฌธ์ผ๋ก ์์ํ๋ ํธ์ด ์ข๋ค. ๊ทธ๋ฌ๋ฉด try ๋ธ๋ก์์ ๋ฌด์จ ์ผ์ด ์๊ธฐ๋ ์ง ํธ์ถ์๊ฐ ๊ธฐ๋ํ๋ ์ํ๋ฅผ ์ ์ํ๊ธฐ ์ฌ์์ง๋ค.
๋จผ์ ๊ฐ์ ๋ก ์์ธ๋ฅผ ์ผ์ผํค๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ ํ ํ ์คํธ๋ฅผ ํต๊ณผํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด ์ข๋ค. ๊ทธ๋ฌ๋ฉด ์์ฐ์ค๋ฝ๊ฒ try ๋ธ๋ก์ ํธ๋์ญ์ ๋ฒ์ ๋ถํฐ ๊ตฌํํ๊ฒ ๋๋ฏ๋ก ๋ฒ์ ๋ด์์ ํธ๋์ญ์ ๋ณธ์ง์ ์ ์งํ๊ธฐ ์ฌ์์ง๋ค.
ํ์ธ๋ ์์ธ๋ Open Closed Principle(OCP)๋ฅผ ์๋ฐํ๋ค. ๋ฉ์๋์์ ํ์ธ๋ ์์ธ๋ฅผ ๋์ก๋๋ฐ catch ๋ธ๋ก์ด ์ธ ๋จ๊ณ ์์ ์๋ค๋ฉด ๊ทธ ์ฌ์ด ๋ฉ์๋ ๋ชจ๋๊ฐ ์ ์ธ๋ถ์ ํด๋น ์์ธ๋ฅผ ์ ์ํด์ผํ๋ค. ์ฆ ํ์ ๋จ๊ณ์์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์์ ๋จ๊ณ ๋ฉ์๋ ์ ์ธ๋ถ๋ฅผ ์ ๋ถ ๊ณ ์ฒ์ผ๋๋ค. ํ์ธ๋ ์์ธ๋ ์บก์ํ๋ฅผ ๊นจ๋ฒ๋ฆฐ๋ค.
์ค๋ฅ ๋ฉ์์ง์ ์ ๋ณด๋ฅผ ๋ด์ ์์ธ์ ํจ๊ป ๋์ง๋ค. ์คํจํ ์ฐ์ฐ ์ด๋ฆ๊ณผ ์คํจ ์ ํ๋ ์ธ๊ธํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ก๊น ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค๋ฉด catch ๋ธ๋ก์์ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ๋๋ก ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ๋๊ฒจ์ค๋ค.
๋จ์ํ ์์ธ๋ฅผ ์ก์ ๋ณํํ๋ ๊ฐ์ธ๊ธฐ ํด๋์ค
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);
}
}
}
์ ํด๋์ค๋ innerPort ํด๋์ค์ open ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ์ธ๊ธฐ ํด๋์ค์ด๋ค. ๊ฐ์ธ๊ธฐ ํด๋์ค๋ฅผ ์ฌ์ฉํด์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋จํ๊ฒ ํด๊ฒฐํ๊ณ ์ธ๋ถ api๋ฅผ ํธ์ถํ ๋ ํ ์คํธํ๊ธฐ ์ฝ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ๋๋ค.
์๋์ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
try {
MealExpenses expenses = expenseReportDAO.getMeals(employee.getID());
m_total += expenses.getTotal();
} catch(MealExpensesNotFound e) {
m_total += getMealPerDiem();
}
์ ์ฝ๋๋ ์๋น๋ฅผ ๋น์ฉ์ผ๋ก ์ฒญ๊ตฌํ๋ค๋ฉด ์ง์์ด ์ฒญ๊ตฌํ ์๋น๋ฅผ ์ด๊ณ์ ๋ํ๊ณ ์ฒญ๊ตฌํ์ง ์์๋ค๋ฉด ์ผ์ผ ๊ธฐ๋ณธ ์๋น๋ฅผ ์ด๊ณ์ ๋ํ๋ค. ์ ์ฝ๋๋ ์์ธ ์ฒ๋ฆฌ๊ฐ ์ฝ๋์ ์ดํด๋ฅผ ์ด๋ ต๊ฒ ๋ง๋ค๊ณ ์๋ค. ์ด๋ฅผ ์๋์ ๊ฐ์ด ๊ฐ์ ํ ์ ์๋ค.
MealExpenses expenses = expenseReportDAO.getMeals(employee.getID());
m_total += expenses.getTotal();
expenses.getTotal() ๋ฉ์๋๋ฅผ ํญ์ ์ง์์ด ์ฒญ๊ตฌํ ์๋น๋ฅผ ์ด๊ณ์ ๋ํ๊ฒ ํ๊ณ ๋ง์ฝ ์๋ค๋ฉด ๊ธฐ๋ณธ ์๋น๋ฅผ ์ด๊ณ์ ๋ํ๋๋ก ๋ฐ๊ฟ์ผ๋ก ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
์ด๋ฅผ ํน์ ์ฌ๋ก ํจํด์ด๋ผ ๋ถ๋ฅธ๋ค. ํด๋์ค๋ฅผ ๋ง๋ค๊ฑฐ๋ ๊ฐ์ฒด๋ฅผ ์กฐ์ํด ํน์ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค. ๊ทธ๋ฌ๋ฉด ํด๋ผ์ด์ธํธ์ ์ฝ๋๊ฐ ์์ธ์ ์ธ ์ํฉ์ ์ฒ๋ฆฌํ ํ์๊ฐ ์์ด์ง๋ค.
null์ ๋ฐํํ๋ ์ฝ๋๋ ์ผ๊ฑฐ๋ฆฌ๋ฅผ ๋๋ฆฌ๊ณ ํธ์ถ์์๊ฒ ๋ฌธ์ ๋ฅผ ๋๊ธด๋ค. ์ด๋์ null ํ์ธ์ ๋นผ๋จน๋๋ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ด ํต์ ๋ถ๋ฅ์ ๋น ์ง ์ ์๋ค.
null์ ๋ฐํํจ์ผ๋ก์จ ์ด๋์ ๊ฐ nullPointerException์ด ๋ฐ์ํ ํ์จ๋ ๋์์ง๋ค.
์ธ๋ถ API๊ฐ null์ ๋ฐํํ๋ค๋ฉด ๊ฐ์ธ๊ธฐ ํด๋์ค๋ฅผ ํ์ฉํด์ null ์๋ํ ์์ธ๋ฅผ ๋์ง๊ฑฐ๋ ํน์ ์ฌ๋ก ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๋ฐฉ์์ ๊ณ ๋ คํด์ผ ํ๋ค.
null์ ์ ๋ฌํ๋ฉด ์ด๋์ ๊ฐ nullPointerException์ด ๋ฐ์ํ๊ฒ ๋ ์ ์๊ณ ํ๋น ์ค๋ฅ๊ฐ ์ด๋์ ๋ฐ์ํ๋์ง ์ถ์ ํ๊ธฐ ๋ฒ๊ฑฐ๋ก์์ง๋ค. ํด๋น ๋ฐฉ๋ฒ์ ํด๊ฒฐํ๊ธฐ ์ํด์๋ null์ ์ ๋ฌํ์ง ๋ง๊ณ ์์ธ๋ฅผ ๋ฐ์์ํค๋๊ฒ ๋ ๋์ ์ ์๋ค.
๋๋ค์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ํธ์ถ๊ฐ๊ฐ ์ค์๋ก ๋๊ธฐ๋ null์ ์ ์ ํ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ์ด์ null์ ๋๊ธฐ์ง ๋ชปํ๋๋ก ๊ธ์งํ๋ ์ ์ฑ ์ด ํฉ๋ฆฌ์ ์ด๋ค. ์ฆ, ์ธ์๋ก null์ด ๋์ด์ค๋ฉด ์ฝ๋์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๋ง์ด๋ค. ์ด๋ฐ ์ ์ฑ ์ ๋ฐ๋ฅด๋ฉด ๊ทธ๋งํผ ๋ถ์ฃผ์ํ ์ค์๋ฅผ ์ ์ง๋ฅผ ํ๋ฅ ๋ ์์์ง๋ค.
์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํ๋ก๊ทธ๋จ ๋ ผ๋ฆฌ์ ๋ถ๋ฆฌํ๋ฉด ๋ ๋ฆฝ์ ์ธ ์ถ๋ก ์ด ๊ฐ๋ฅํด์ง๋ฉฐ ์ฝ๋ ์ ์ง๋ณด์์ฑ๋ ํฌ๊ฒ ๋์์ง๋ค.