7์ฅ ์ค๋ฅ ์ฒ๋ฆฌ
๋ญ๊ฐ ์๋ชป๋ ๊ฐ๋ฅ์ฑ์ ๋ ์กด์ฌํ๋ค.
๋ญ๊ฐ ์๋ชป๋๋ฉด ๋ฐ๋ก ์ก์ ์ฑ ์์ ๋ฐ๋ก ํ๋ก๊ทธ๋๋จธ์๊ฒ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ๊นจ๋ํ ์ฝ๋์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ๊ด๋ จ์ด ์์๊น? ํ์คํ ์ฐ๊ด์ฑ์ด ์๋ค.
์๋น์ ์ฝ๋ ๊ธฐ๋ฐ์ ์ ์ ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋์ ์ข์ฐ๋๋ค. ์ฌ๊ธฐ์ ์ข์ฐ๋๋ค๋ ํํ์ ์ฝ๋ ๊ธฐ๋ฐ์ด ์ค๋ฅ๋ง ์ฒ๋ฆฌํ๋ค๋ ์๋ฏธ๊ฐ ์๋ ์ฌ๊ธฐ์ ๊ธฐ ํฉ์ด์ง ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋ ๋๋ฌธ์ ์ค์ ์ฝ๋๊ฐ ํ๋ ์ผ์ ํ์ ํ๊ธฐ๊ฐ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ์ด๋ค.
์ค๋ฅ ์ฒ๋ฆฌ๋ ์ค์ํ์ง๋ง ์ด ์ฝ๋๋ก ์ธํด ํ๋ก๊ทธ๋จ ๋ ผ๋ฆฌ๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์์ง๋ค๋ฉด ๊นจ๋ํ ์ฝ๋๋ผ ๋ถ๋ฅด๊ธฐ ์ด๋ ต๋ค.
1. ์ค๋ฅ ์ฝ๋๋ณด๋ค ์์ธ๋ฅผ ์ฌ์ฉํ๋ผ
์์ธ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ์ง ์๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํ ๋,
์ค๋ฅ ํ๋๊ทธ๋ฅผ ์ค์ ํ๊ฑฐ๋ ํธ์ถ์์๊ฒ ์ค๋ฅ ์ฝ๋๋ฅผ ๋ฐํํ๋ ๋ฐฉ๋ฒ์ด ์ ๋ถ์๋ค.
public void sendShutDown() {
DeviceHandle handle = getHandle(DEV1);
// Check the state of the device
if (handle != DeviceHandle.INVALID) {
// Save the device status to the record field
retrieveDeviceRecord(handle);
// If not suspended, shut down
if (record.getStatus() != DEVICE_SUSPENDED) {
pauseDevice(handle);
clearDeviceWorkQueue(handle);
closeDevice(handle);
}
else {
logger.log("Device suspended. Unable to shut down");
}
}
else {
logger.log("Invalid handle for: " + DEV1.toString());
}
}
๊ทธ๋ฌ๋ ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ ํธ์ถ์ ์ฝ๋๊ฐ ๋ณต์กํด์ง๊ณ ์์ด๋ฒ๋ฆฌ๊ธฐ ์ฝ๋ค.
๊ทธ๋์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์์ธ๋ฅผ ๋์ง๋ ํธ์ด ๋ซ๋ค.
public void sendShutDown() {
try {
tryToShutDown();
} catch (DeviceShutDownError e) {
logger.log(e);
}
}
๋๋ฐ์ด์ค๋ฅผ ์ข ๋ฃํ๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ถ๋ฆฌํ์ฌ ์ฝ๋ ํ์ง์ด ์ข์์ก๋ค!
์ด์ ๋ ๊ฐ ๊ฐ๋ ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ดํด๋ณด๊ณ ์ดํดํ ์ ์๋ค.
2. Try-Catch-Finally ๋ฌธ๋ถํฐ ์์ฑํ๋ผ
try-catch-finally ๋ฌธ์์ try ๋ธ๋ก์ ๋ค์ด๊ฐ๋ ์ฝ๋๋ฅผ ์คํํ๋ฉด ์ด๋ ์์ ์์๋ ์คํ์ด ์ค๋จ๋ ํ catch ๋ธ๋ก์ผ๋ก ๋์ด๊ฐ ์ ์๋ค. try ๋ธ๋ก์์ ๋ฌด์จ ์ผ์ด ์๊ธฐ๋ catch ๋ธ๋ก์ ํ๋ก๊ทธ๋จ ์ํ๋ฅผ ์ผ๊ด์ฑ ์๊ฒ ์ ์งํด์ผ ํ๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์์ธ๊ฐ ๋ฐ์ํ ์ฝ๋๋ฅผ ์งค ๋๋ try-catch-finally ๋ฌธ์ผ๋ก ์์ํ๋ ํธ์ด ๋ซ๋ค.
3. ๋ฏธํ์ธ(Unchecked) ์์ธ๋ฅผ ์ฌ์ฉํ๋ผ
์์ ์๋ ๋ฉ์๋๋ฅผ ์ ์ธํ ๋ ๋ฉ์๋๊ฐ ๋ฐํํ ์์ธ๋ฅผ ๋ชจ๋ ์ด๊ฑฐํ๋ค.
๊ทธ๋ฌ๋ ๋น์ฉ์ด ์์ํ๋ ์ด์ต์ ์ ๊ณตํ์ง ๋ชปํ๊ณ ํ์ธ๋ ์์ธ๋ OCP๋ฅผ ์๋ฐํ๋ค.
4. ์์ธ์ ์๋ฏธ๋ฅผ ์ ๊ณตํ๋ผ
์์ธ๋ฅผ ๋์ง ๋๋ ์ ํ ์ํฉ์ ์ถฉ๋ถํ ๋ง๋ถ์ธ๋ค. ๊ทธ๋ฌ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์์ธ๊ณผ ์์น๋ฅผ ์ฐพ๊ธฐ๊ฐ ์ฌ์์ง๋ค.
์ค๋ฅ ๋ฉ์์ง์ ์ ๋ณด๋ฅผ ๋ด์ ์์ธ์ ํจ๊ป ๋์ง๋ค. ์คํจํ ์ฐ์ฐ ์ด๋ฆ๊ณผ ์คํจ ์ ํ๋ ์ธ๊ธํ๋ค.
5. ํธ์ถ์๋ฅผ ๊ณ ๋ คํด ์์ธ ํด๋์ค๋ฅผ ์ ์ํ๋ผ
์ค๋ฅ๋ฅผ ๋ถ๋ฅํ๋ ๋ฐฉ๋ฒ์ ์์์ด ๋ง๊ณ ๊ทธ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ ์์น, ์ ํ ๋ฑ์ด ์๋ค.
ํ์ง๋ง ์ค๋ฅ๋ฅผ ์ ์ํ ๋ ํ๋ก๊ทธ๋๋จธ์๊ฒ ๊ฐ์ฅ ์ค์ํ ๊ด์ฌ์ฌ๋ ์ค๋ฅ๋ฅผ ์ก์๋ด๋ ๋ฐฉ๋ฒ์ด ๋์ด์ผ ํ๋ค.
์๋ ๋ฐฉ๋ฒ์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋์ง ์์ธ๋ฅผ ๋ชจ๋ ์ก์๋ธ๋ค.
๊ทธ๋ฌ๋ ์ฝ๋ ์ค๋ณต์ด ์ฌํ๊ณ ๋ณ๊ฒฝํ๊ธฐ ์ด๋ ต๋ค.
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");
}
finally {
...
}
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ํธ์ถํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ API๋ฅผ ๊ฐ์ธ๋ฉด์ ์์ธ ์ ํ ํ๋๋ฅผ ๋ฐํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
LocalPort ํด๋์ค๋ฅผ ๋จ์ํ ACMEPort ํด๋์ค๊ฐ ๋์ง๋ ์์ธ๋ฅผ ์ก์ ๋ณํํ๋ ๊ฐ์ธ๊ธฐ(Wrapper) ํด๋์ค์ด๋ค.
Wrapper ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์์กด์ฑ์ด ํฌ๊ฒ ์ค์ด๋ค๊ณ ๋์ค์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ฐ์ํ๋ ๋น์ฉ์ด ์ ๋ค.
LocalPort port = new LocalPort(12);
try {
port.open();
}
catch (PortDeviceFailure e) {
reportError(e);
logger.log(e.getMessage(), e);
}
finally {
...
}
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);
}
}
}
6. null์ ๋ฐํํ์ง ๋ง๋ผ
nulll์ ๋ฐํํ๋ ์ฝ๋๋ ์ผ๊ฑฐ๋ฆฌ๋ฅผ ๋๋ฆด ๋ฟ๋ง ์๋๋ผ ํธ์ถ์์๊ฒ ๋ฌธ์ ๋ฅผ ๋ ๋๊ธด๋ค.
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);
}
}
}
}
7. null์ ์ ๋ฌํ์ง ๋ง๋ผ
๋ฉ์๋์์ null์ ๋ฐํํ๋ ๋ฐฉ์๋ ๋์์ง๋ง ์ ๋ฌํ๋ ๋ฐฉ์์ ๋ ๋์๋ค.
// Parameter์ null๊ฐ์ด ๋ค์ด์ค๋ฉด NullPointerException ๋ฐ์
public class MetricsCalculator {
public double xProjection(Point p1, Point p2) {
return (p2.x – p1.x) * 1.5;
}
}
// InvalidArgumentException ์ฌ์ฉ: ์ ๋ฐฉ๋ฒ๋ณด๋จ ๋ซ๋ค.. ํ์ง๋ง ์ข์ ๋ฐฉ๋ฒ์ ์๋
public class MetricsCalculator {
public double xProjection(Point p1, Point p2) {
if (p1 == null || p2 == null) {
throw InvalidArgumentException("Invalid argument for MetricsCalculator.xProjection");
}
return (p2.x – p1.x) * 1.5;
}
}
๋๋ค์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ํธ์ถ์๊ฐ ์ค์๋ก ๋๊ธฐ๋ null์ ์ ์ ํ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
์ ์ด์ null์ ๋๊ธฐ์ง ์๋ ๊ฒ์ด ๊ฐ์ฅ ์ข๋ค.