๐ญ Chapter 7: ์ค๋ฅ ์ฒ๋ฆฌ
์ค๋ฅ ์ฒ๋ฆฌ๋ ํ๋ก๊ทธ๋จ์ ๋ฐ๋์ ํ์ํ ์์ ์ค ํ๋์ผ ๋ฟ์ด๋ค. ์ ๋ ฅ์ด ์ด์ํ๊ฑฐ๋ ๋๋ฐ์ด์ค๊ฐ ์คํจํ ์ง๋ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฐ๋จํ ๋งํด, ๋ญ๊ฐ ์๋ชป๋ ๊ฐ๋ฅ์ฑ์ ๋ ์กด์ฌํ๋ค. ๋ญ๊ฐ ์๋ชป๋๋ฉด ๋ฐ๋ก ์ก์ ์ฑ ์์ ๋ฐ๋ก ์ฐ๋ฆฌ ํ๋ก๊ทธ๋๋จธ์๊ฒ ์๋ค.
๊นจ๊ฟํ ์ฝ๋์ ์ค๋ฅ ์ฒ๋ฆฌ๋ ํ์คํ ์ฐ๊ด์ฑ์ด ์๋ค. ์๋น์ ์ฝ๋ ๊ธฐ๋ฐ์ ์ ์ ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋์ ์ข์ฐํ๋ค. ์ฌ๊ธฐ์ ์ข์ฐ๋๋ค๋ ํํ์ ์ฝ๋ ๊ธฐ๋ฐ์ด ์ค๋ฅ๋ง ์ฒ๋ฆฌํ๋ค๋ ์๋ฏธ๊ฐ ์๋๋ค. ์ฌ๊ธฐ์ ๊ธฐ ํฉ์ด์ง ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋ ๋๋ฌธ์ ์ค์ ๋ก ์ฝ๋๊ฐ ํ๋ ์ผ์ ํ์ ํ๊ธฐ๊ฐ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ค์ํ๋ค. ํ์ง๋ง ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋๋ก ์ธํด ํ๋ก๊ทธ๋จ ๋ ผ๋ฆฌ๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์์ง๋ค๋ฉด ๊นจ๋ํ ์ฝ๋๋ผ ๋ถ๋ฅด๊ธฐ ์ด๋ ต๋ค.
๐ ์ค๋ฅ ์ฝ๋๋ณด๋ค ์์ธ๋ฅผ ์ฌ์ฉํ๋ผโ
์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์์ธ๋ฅผ ๋์ง๋ ํธ์ด ๋ซ๋ค. ๊ทธ๋ฌ๋ฉด ํธ์ถ์ ์ฝ๋๊ฐ ๋ ๊น๋ํด์ง๋ค. ๋ ผ๋ฆฌ๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋์ ๋ค์์ด์ง ์์ผ๋๊น.
public class DeviceController {
// ...
public void sendShutDown() {
try {
tryToShutDown();
} catch (DeviceShutDownError e) {
logger.log(e);
}
}
private void tryToShutDown() throws DeviceShutDownError {
DeviceHandle handle = getHandle(DEV1);
DeviceRecord record = retrieveDeviceRecord(handle);
pauseDevice(handle);
clearDeviceWorkQueue(handle);
closeDevice(handle);
}
private DeviceHandle getHandle(DeviceID id) {
// ...
throw new DeviceShutDownError("Invalid handle for: " + id.toString());
// ...
}
// ...
}
๋๋ฐ์ด์ค๋ฅผ ์ข ๋ฃํ๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ถ๋ฆฌํ๋ค. ๊ฐ ๊ฐ๋ ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ดํด๋ณด๊ณ ์ดํดํ ์ ์๋ค.
๐ Try-Catch-Finally ๋ฌธ๋ถํฐ ์์ฑํ๋ผโ
์์ธ์์ ํ๋ก๊ทธ๋จ ์์๋ค ๋ฒ์๋ฅผ ์ ์ํ๋ค๋ ์ฌ์ค์ ๋งค์ฐ ํฅ๋ฏธ๋กญ๋ค. try-catch-finally
๋ฌธ์์ try
๋ธ๋ก์ ๋ค์ด๊ฐ๋ ์ฝ๋๋ฅผ ์คํํ๋ฉด ์ด๋ ์์ ์์๋ ์คํ์ด ์ค๋จ๋ ํ catch
๋ธ๋ก์ผ๋ก ๋์ด๊ฐ ์ ์๋ค.
์ด๋ค ๋ฉด์์ try
๋ธ๋ก์ ํธ๋์ญ์
๊ณผ ๋น์ทํ๋ค. try
๋ธ๋ก์์ ๋ฌด์จ ์ผ์ด ์๊ธฐ๋ ์ง catch
๋ธ๋ก์ ํ๋ก๊ทธ๋จ ์ํ๋ฅผ ์ผ๊ด์ฑ ์๊ฒ ์ ์งํด์ผ ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์์ธ๊ฐ ๋ฐ์ํ๋ ์ฝ๋๋ฅผ ์งค ๋๋ try-catch-finally
๋ฌธ์ผ๋ก ์์ํ๋ ํธ์ด ๋ซ๋ค. ๊ทธ๋ฌ๋ฉด try
๋ธ๋ก์์ ๋ฌด์จ ์ผ์ด ์๊ธฐ๋ ์ง ํธ์ถ์๊ฐ ๊ธฐ๋ํ๋ ์ํ๋ฅผ ์ ์ํ๊ธฐ ์ฌ์์ง๋ค.
๋ค์์ ํ์ผ์ด ์์ผ๋ฉด ์์ธ๋ฅผ ๋์ง๋์ง ์์๋ณด๋ ๋จ์ ํ ์คํธ๋ค.
@Test(expected = StorageException.class)
public void retrieveSectionShouldThrowOnInvalidFileName() {
sectionStore.retrieveSection("invalid - file");
}
๋จ์ ํ ์คํธ์ ๋ง์ถฐ ๋ค์ ์ฝ๋๋ฅผ ๊ตฌํํ๋ค.
public List<RecordedGrip> retrieveSection(String sectionName) {
// ์ค์ ๋ก ๊ตฌํํ ๋๊น์ง ๋น์ด ์๋ ๋๋ฏธ๋ฅผ ๋ฐํํ๋ค.
return new ArrayList<RecordedGrip>();
}
๊ทธ๋ฐ๋ฐ ์ฝ๋๊ฐ ์์ธ๋ฅผ ๋์ง์ง ์์ผ๋ฏ๋ก ๋จ์ ํ ์คํธ๋ ์คํจํ๋ค. ์๋ชป๋ ํ์ผ ์ ๊ทผ์ ์๋ํ๊ฒ ๊ตฌํ์ ๋ณ๊ฒฝํ์. ์๋ ์ฝ๋๋ ์์ธ๋ฅผ ๋์ง๋ค.
public List<RecordedGrip> retrieveSection(String sectionName) {
try {
FileInputStream stream = new FileInputStream(sectionName);
} catch (Exception e) {
throw new StorageException("retrieval error", e);
}
return new ArrayList<RecordedGrip>();
}
์ฝ๋๊ฐ ์์ธ๋ฅผ ๋์ง๋ฏ๋ก ์ด์ ๋ ํ
์คํธ๊ฐ ์ฑ๊ณตํ๋ค. ์ด ์์ ์์ ๋ฆฌํฉํฐ๋ง์ด ๊ฐ๋ฅํ๋ค. catch
๋ธ๋ก์์ ์์ธ ์ ํ์ ์ขํ ์ค์ ๋ก FileInputStream
์์ฑ์๊ฐ ๋์ง๋ FileNotFoundException
์ ์ก์๋ธ๋ค.
public List<RecordedGrip> retrieveSection(String sectionName) {
try {
FileInputStream stream = new FileInputStream(sectionName);
stream.close();
} catch (FileNotFoundException e) {
throw new StorageException("retrieval error", e);
}
return new ArrayList<RecordedGrip>();
}
try-catch
๊ตฌ์กฐ๋ก ๋ฒ์๋ฅผ ์ ํ์ผ๋ฏ๋ก TDD๋ฅผ ์ฌ์ฉํด ํ์ํ ๋๋จธ์ง ๋
ผ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ค.
๋จผ์ ๊ฐ์ ๋ก ์์ธ๋ฅผ ์ผ์ผํค๋ ํ
์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ ํ ํ
์คํธ๋ฅผ ํต๊ณผํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๊ถ์ฅํ๋ค. ๊ทธ๋ฌ๋ฉด ์์ฐ์ค๋ฝ๊ฒ try
๋ธ๋ก์ ํธ๋์ ์
๋ฒ์๋ถํฐ ๊ตฌํํ๊ฒ ๋๋ฏ๋ก ๋ฒ์ ๋ด์์ ํธ๋์ญ์
๋ณธ์ง์ ์ ์งํ๊ธฐ ์ฌ์์ง๋ค.
๐ ๋ฏธํ์ธ(unchecked) ์์ธ๋ฅผ ์ฌ์ฉํ๋ผโ
ํ์ธ๋ ์์ธ๋ OCP(Open Closed Principle)๋ฅผ ์๋ฐํ๋ค. ๋ฉ์๋์์ ํ์ธ๋ ์์ธ๋ฅผ ๋์ก๋๋ฐ catch
๋ธ๋ก์ด ์ธ ๋จ๊ณ ์์ ์๋ค๋ฉด ๊ทธ ์ฌ์ด ๋ฉ์๋ ๋ชจ๋๊ฐ ์ ์ธ๋ถ์ ํด๋น ์์ธ๋ฅผ ์ ์ํด์ผ ํ๋ค. ์ฆ, ํ์ ๋จ๊ณ์์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์์ ๋จ๊ณ ๋ฉ์๋ ์ ์ธ๋ถ๋ฅผ ์ ๋ถ ๊ณ ์ณ์ผ ํ๋ค๋ ๋ง์ด๋ค. ๋ชจ๋๊ณผ ๊ด๋ จ๋ ์ฝ๋๊ฐ ์ ํ ๋ฐ๋์ง ์๋๋ผ๋ (์ ์ธ๋ถ๊ฐ ๋ฐ๋์์ผ๋ฏ๋ก) ๋ชจ๋์ ๋ค์ ๋น๋ํ ๋ค์ ๋ฐฐํฌํด์ผ ํ๋ค๋ ๋ง์ด๋ค.
throws
๊ฒฝ๋ก์ ์์นํ ๋ชจ๋ ํจ์๊ฐ ์ตํ์ ํจ์์์ ๋์ง๋ ์์ธ๋ฅผ ์์์ผ ํ๋ฏ๋ก ์บก์ํ๊ฐ ๊นจ์ง๋ค. ๋๋ก๋ ํ์ธ๋ ์์ธ๋ ์ ์ฉํ๋ค. ์์ฃผ ์ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ๋ค๋ฉด ๋ชจ๋ ์์ธ๋ฅผ ์ก์์ผ ํ๋ค. ํ์ง๋ง ์ผ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
์ ์์กด์ฑ์ด๋ผ๋ ๋น์ฉ์ด ์ด์ต๋ณด๋ค ํฌ๋ค.
๐ ์์ธ์ ์๋ฏธ๋ฅผ ์ ๊ณตํ๋ผโ
์์ธ๋ฅผ ๋์ง ๋๋ ์ ํ ์ํฉ์ ์ถฉ๋ถํ ๋ง๋ถ์ธ๋ค. ๊ทธ๋ฌ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์์ธ๊ณผ ์์น๋ฅผ ์ฐพ๊ธฐ๊ฐ ์ฌ์์ง๋ค. ์๋ฐ๋ ๋ชจ๋ ์์ธ์ ํธ์ถ ์คํ์ ์ ๊ณตํ๋ค. ํ์ง๋ง ์คํจํ ์ฝ๋์ ์๋๋ฅผ ํ์ ํ๋ ค๋ฉด ํธ์ถ ์คํ๋ง์ผ๋ก ๋ถ์กฑํ๋ค.
์ค๋ฅ ๋ฉ์์ง์ ์ ๋ณด๋ฅผ ๋ด์ ์์ธ์ ํจ๊ป ๋์ง๋ค. ์คํจํ ์ฐ์ฐ ์ด๋ฆ๊ณผ ์คํจ ์ ํ๋ ์ธ๊ธํ๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ก๊น
๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค๋ฉด catch
๋ธ๋ก์์ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ๋๋ก ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ๋๊ฒจ์ค๋ค.
๐ ํธ์ถ์๋ฅผ ๊ณ ๋ คํด ์์ธ ํด๋์ค๋ฅผ ์ ์ํ๋ผโ
์ค๋ฅ๊ฐ ๋ฐ์ํ ์์น๋ก ๋ถ๋ฅ๊ฐ ๊ฐ๋ฅํ๋ค. ์๋ฅผ ๋ค์ด, ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฅํ๋ค. ์๋๋ฉด ์ ํ์ผ๋ก๋ ๋ถ๋ฅ๊ฐ ๊ฐ๋ฅํ๋ค. ์๋ฅผ ๋ค์ด ๋๋ฐ์ด์ค ์คํจ, ๋คํธ์ํฌ ์คํจ, ํ๋ก๊ทธ๋๋ฐ ์ค๋ฅ ๋ฑ์ผ๋ก ๋ถ๋ฅํ๋ค. ํ์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค๋ฅ๋ฅผ ์ ์ํ ๋ ํ๋ก๊ทธ๋๋จธ์๊ฒ ๊ฐ์ฅ ์ค์ํ ๊ด์ฌ์ฌ๋ ์ค๋ฅ๋ฅผ ์ก์๋ด๋ ๋ฐฉ๋ฒ์ด ๋์ด์ผ ํ๋ค.
ํํ ์์ธ ํด๋์ค๊ฐ ํ๋๋ง ์์ด๋ ์ถฉ๋ถํ ์ฝ๋๊ฐ ๋ง๋ค. ์์ธ ํด๋์ค์ ํฌํจ๋ ์ ๋ณด๋ฅผ ์ค๋ฅ๋ฅผ ๊ตฌ๋ถํด๋ ๊ด์ฐฎ์ ๊ฒฝ์ฐ๊ฐ ๊ทธ๋ ๋ค. ํ ์์ธ๋ ์ก์๋ด๊ณ ๋ค๋ฅธ ์์ธ๋ ๋ฌด์ํด๋ ๊ด์ฐฎ์ ๊ฒฝ์ฐ๋ผ๋ฉด ์ฌ๋ฌ ์์ธ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค.
๐ ์ ์ ํ๋ฆ์ ์ ์ํ๋ผโ
์ธ๋ถ 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();
์์ฒ๋ผ ๊ฐ๊ฒฐํ ์ฝ๋๊ฐ ๊ฐ๋ฅํ ๊น? ๊ฐ๋ฅํ๋ค. ExpenseReportDAO
๋ฅผ ๊ณ ์ณ ์ธ์ ๋ MealExpense
๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ์ฒญ๊ตฌํ ์๋น๊ฐ ์๋ค๋ฉด ์ผ์ผ ๊ธฐ๋ณธ ์๋น๋ฅผ ๋ฐํํ๋ MealExpense
๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
public class PerDiemMealExpenses implements MealExpenses {
public int getTotal() {
// ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ผ์ผ ๊ธฐ๋ณธ ์๋น๋ฅผ ๋ฐํํ๋ค.
}
}
์ด๋ฅผ ํน์ ์ฌ๋ก ํจํด(SPECIAL CASE PATTERN)์ด๋ผ ๋ถ๋ฅธ๋ค. ํด๋์ค๋ฅผ ๋ง๋ค๊ฑฐ๋ ๊ฐ์ฒด๋ฅผ ์กฐ์ํด ํน์ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค. ๊ทธ๋ฌ๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ์์ธ์ ์ธ ์ํฉ์ ์ฒ๋ฆฌํ ํ์๊ฐ ์์ด์ง๋ค. ํด๋์ค๋ ๊ฐ์ฒด๊ฐ ์์ธ์ ์ธ ์ํฉ์ ์บก์ํํด์ ์ฒ๋ฆฌํ๋ฏ๋ก.
๐ null์ ๋ฐํํ์ง ๋ง๋ผโ
์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋
ผํ๋ ์ฅ์ด๋ผ๋ฉด ์ฐ๋ฆฌ๊ฐ ํํ ์ ์ง๋ฅด๋ ๋ฐ๋์ ์ค๋ฅ๋ฅผ ์ ๋ฐํ๋๋ฐ ํ์๋ ์ธ๊ธํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ ์ค ์ฒซ์งธ๊ฐ null
์ ๋ฐํํ๋ ์ต๊ด์ด๋ค. ํ ์ค ๊ฑด๋ ํ๋์ฉ null
์ ํ์ธํ๋ ์ฝ๋๋ก ๊ฐ๋ํ ์ ํ๋ฆฌ์ผ์ด์
์ ์ง๊ธ๊น์ง ์๋ ์์ด ๋ดค๋ค. ๋ค์์ด ํ ์๋ค.
public void registerItem(Item item) {
if (item != null) {
ItemRegistry registry = peristentStore.getItemRegistry();
if (registry != null) {
Item existing = registry.getItem(item.getID());
if (existing.getBillingPeriod().hasRetailOwner()) {
existing.register(item);
}
}
}
}
null
์ ๋ฐํํ๋ ์ฝ๋๋ ์ผ๊ฑฐ๋ฆฌ๋ฅผ ๋๋ฆด ๋ฟ๋ง ์๋๋ผ ํธ์ถ์์๊ฒ ๋ฌธ์ ๋ฅผ ๋ ๋๊ธด๋ค. ๋๊ตฌ ํ๋๋ผ๋ null
ํ์ธ์ ๋นผ๋จน๋๋ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ด ํต์ ๋ถ๋ฅ์ ๋น ์ง์ง๋ ๋ชจ๋ฅธ๋ค.
์ ์ฝ๋๋ null
ํ์ธ์ด ๋๋ฝ๋ ๋ฌธ์ ๋ผ ๋งํ๊ธฐ ์ฝ๋ค. ํ์ง๋ง ์ค์์ null
ํ์ธ์ด ๋๋ฌด ๋ง์ ๋ฌธ์ ๋ค. ๋ฉ์๋์์ null
์ ๋ฐํํ๊ณ ํ ์ ํน์ด ๋ ๋ค๋ฉด ๊ทธ ๋์ ์ ์์ธ๋ฅผ ๋์ง๊ฑฐ๋ ํน์ ์ฌ๋ก ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ์ฌ์ฉํ๋ ค๋ ์ธ๋ถ API๊ฐ null
์ ๋ฐํํ๋ค๋ฉด ๊ฐ์ธ๊ธฐ ๋ฉ์๋๋ฅผ ๊ตฌํํด ์์ธ๋ฅผ ๋์ง๊ฑฐ๋ ํน์ ์ฌ๋ก ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๋ฐฉ์์ ๊ณ ๋ คํ๋ค.
๋ง์ ๊ฒฝ์ฐ์ ํน์ ์ฌ๋ก ๊ฐ์ฒด๊ฐ ์์ฌ์ด ํด๊ฒฐ์ฑ ์ด๋ค. ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์๊ฐํด๋ณด์.
List<Employee> employees = getEmployees();
if (employees != null) {
for (Employee e : employees) {
totalPay += e.getPay();
}
}
์ ์์ ์์ ๋ฐ๋์ null
์ ๋ฐํํ ํ์๊ฐ ์์๊น? getEmployees
๋ฅผ ๋ณ๊ฒฝํด ๋น ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ค๋ฉด ์ฝ๋๊ฐ ํจ์ฌ ๊น๋ํด์ง๋ค.
List<Employee> employees = getEmployees();
for(Employee e : employees) {
totalPay += e.getPay();
}
๋คํ์ค๋ฝ๊ฒ ์๋ฐ์๋ Collections.emptyList()
๊ฐ ์์ด ๋ฏธ๋ฆฌ ์ ์๋ ์ฝ๊ธฐ ์ ์ฉ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ค. ์ฐ๋ฆฌ ๋ชฉ์ ์ ์ ํฉํ ๋ฆฌ์คํธ๋ค.
public List<Employee> getEmployees() {
if (/* ์ง์์ด ์๋ค๋ฉด */)
return Collections.emptyList();
}
์ด๋ ๊ฒ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ฝ๋๋ ๊น๋ํด์ง๋ฟ๋๋ฌ NullPointerException
์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ๋ ์ค์ด๋ ๋ค.
๐ null์ ์ ๋ฌํ์ง ๋ง๋ผโ
๋ฉ์๋์์ null
์ ๋ฐํํ๋ ๋ฐฉ์๋ ๋์์ง๋ง ๋ฉ์๋๋ก null
์ ์ ๋ฌํ๋ ๋ฐฉ์์ ๋ ๋์๋ค. ์ ์์ ์ธ ์ธ์๋ก null
์ ๊ธฐ๋ํ๋ API๊ฐ ์๋๋ผ๋ฉด ๋ฉ์๋๋ก null
์ ์ ๋ฌํ๋ ์ฝ๋๋ ์ต๋ํ ํผํ๋ค.
๋๋ค์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ํธ์ถ์๊ฐ ์ค์๋ก ๋๊ธฐ๋ null
์ ์ ์ ํ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ์ด์ null
์ ๋๊ธฐ์ง ๋ชปํ๋๋ก ๊ธ์งํ๋ ์ ์ฑ
์ด ํฉ๋ฆฌ์ ์ด๋ค. ์ฆ, ์ธ์๋ก null
์ด ๋์ด์ค๋ฉด ์ฝ๋์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๋ง์ด๋ค. ์ด๋ฐ ์ ์ฑ
์ ๋ฐ๋ฅด๋ฉด ๊ทธ๋งํผ ๋ถ์ฃผ์ํ ์ค์๋ฅผ ์ ์ง๋ฅผ ํ๋ฅ ๋ ์์์ง๋ค.