๊ฒฝ๊ณ
์ด๋ค ์์ผ๋ก๋ ์ธ๋ถ ์ฝ๋๋ฅผ ์ฐ๋ฆฌ ์ฝ๋์ ๊น๋ํ๊ฒ ํตํฉํด์ผ๋ง ํ๋ค.
์ธ๋ถ ์ฝ๋ ์ฌ์ฉํ๊ธฐ
- ํจํค์ง ์ ๊ณต์๋ ํ๋ ์์ํฌ ์ ๊ณต์๋ ์ ์ฉ์ฑ์ ์ต๋ํ ๋ํ๋ ค ์ ์ด๋ค.(๋ ๋ง์ ํ๊ฒฝ/ ๋ ๋ง์ ๊ณ ๊ฐ โ $)
- ์ฌ์ฉ์๋ ์์ ์ ์๊ตฌ์ ์ง์คํ๋ ์ธํฐํ์ด์ค๋ง ๋ฐ๋๋ค.
java.util.Map
- ๋ค์ํ ๊ธฐ๋ฅ๊ณผ ์ ์ฐ์ฑ์ ์ ์ฉํ์ง๋ง ๊ทธ๋งํผ ์ํํ๋ค.
Figure 8-1. The methods of Map |
---|
clear() void โ Map |
containsKey(Object key) boolean โ Map |
containsValue(Object value) boolean โ Map |
clear() void โ Map |
containsKey(Object key) boolean โ Map |
containsValue(Object value) boolean โ Map |
entrySet() Set โ Map |
equals(Object o) boolean โ Map |
get(Object key) Object โ Map |
getClass() Class<? extends Object> โ Object |
hashCode() int โ Map |
isEmpty() boolean โ Map |
keySet() Set โ Map |
notify() void โ Object |
notifyAll() void โ Object |
put(Object key, Object value) Object โ Map |
putAll(Map t) void โ Map |
remove(Object key) Object โ Map |
size() int โ Map |
toString() String โ Object |
values() Collection โ Map |
wait() void โ Object |
wait(long timeout) void โ Object |
wait(long timeout, int nanos) void โ Object |
๋ง์ฝ ์ฐ๋ฆฌ๊ฐ Sensorํด๋์ค๋ฅผ ์ ์ฅํ๋ Map๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ํํ์ผ ๊ฒ์ด๋ค.
Map sensors = new HashMap();
Sensor s = (Sensor) sensors.get(sensorId);
- ์ด์ ๊ฐ์ ๋ฐฉ์์ Sensorํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋ ์ ๋ฐ์ ๊ฑธ์ณ ๋น๋ฒํ ์ฌ์ฉ๋๋ค.
- ํ์ง๋ง ์ด๋ ์ฌ์ฉ๋๋ ๊ณณ์์
์บ์คํ ์ ๋ถ๋ด
์ ์๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ ํ ๋ฌธ๋งฅ์กฐ์ฐจ ์ค ์ ์๋ค.
์ด๋ ์๋์ ๊ฐ์ด generic์ ์ฌ์ฉํจ์ผ๋ก์จ ํด๊ฒฐํ ์ ์๋ค.
Map<String, Sensor> sensors = new HashMap<String, Sensor>();
Sensor s = sensors.get(sensorId);
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ ๋ํ Map๊ฐ์ฒด๊ฐ ํ์ ์ด์์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ง์ง ๋ชปํ๋ค.
Map์ ์ธํฐํ์ด์ค๊ฐ ๋ฐ๋๊ฑฐ๋ ํ ๊ฒฝ์ฐ ๋ํ ์ฐ๋ฆฌ ์ฝ๋์ ๋ง์ ๋ถ๋ถ๋ค์ด ๋ฐ๋์ด์ผ ํ๋ค. ์ธํฐํ์ด์ค๊ฐ ๋ฐ๋ ์ผ์ด ๋ณ๋ก ์์ ๊ฒ์ด๋ผ ์๊ฐํ ์ง๋ ๋ชจ๋ฅด์ง๋ง, ์ค์ ๋ก Java 5๋ฒ์ ์์ generic์ด ์ถ๊ฐ๋์์ ๋ Map์ ์ธํฐํ์ด์ค๊ฐ ๋ฐ๋ ์ฌ๋ก๊ฐ ์๋ค.
๊ฒฐ๊ตญ ์ ์ผ ์ข์ ๋ฐฉ๋ฒ์ Wrapping์ด๋ค.
๋ชจ๋ Map์ ์ด๋ฐ ์์ผ๋ก Wrappingํ๋ผ๋ ๋ง์ ์๋๋ค. ๋ค๋ง Map๊ณผ ๊ฐ์ โ๊ฒฝ๊ณ์ ์๋ ์ธํฐํ์ด์คโ๋ฅผ ์์คํ ์ ๋ฐ์ ๊ฑธ์ณ ๋๋ ค๊ฐ๋ฉฐ ์ฌ์ฉํ์ง ๋ง๊ณ
- ํด๋น ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ํด๋์ค ๋ด๋ถ์ ๋ฃ๋์ง ๊ฐ๊น์ด ๊ณ์ด์ ํด๋์ค์ ๋ฃ์ด๋ผ.
- ๊ณต๊ฐ๋ api์์ ์ธ์๋ก ๋ฐ๊ฑฐ๋ ๋ฆฌํดํ์ง ๋ง๋ผ.
public class Sensors {
// ๊ฒฝ๊ณ์ ์ธํฐํ์ด์ค(์ด ๊ฒฝ์ฐ์๋ Map์ ๋ฉ์๋)๋ ์จ๊ฒจ์ง๋ค.
// Map์ ์ธํฐํ์ด์ค๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์ฌํ๋ฅผ ์ต์ํํ ์ ์๋ค. ์๋ฅผ ๋ค์ด Generic์ ์ฌ์ฉํ๋ ์ง์ ์บ์คํ
ํ๋ ๊ทธ๊ฑด ๊ตฌํ ๋ํ
์ผ์ด๋ฉฐ Sensorํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ธก์์๋ ์ ๊ฒฝ์ธ ํ์๊ฐ ์๋ค.
// ์ด๋ ๋ํ ์ฌ์ฉ์์ ๋ชฉ์ ์ ๋ฑ ๋ง๊ฒ ๋์์ธ๋์ด ์์ผ๋ฏ๋ก ์ดํดํ๊ธฐ ์ฝ๊ณ ์๋ชป ์ฌ์ฉํ๊ธฐ ์ด๋ ต๊ฒ ๋๋ค.
private Map sensors = new HashMap();
public Sensor getById(String id) {
return (Sensor)sensors.get(id);
}
}
๊ฒฝ๊ณ ์ดํผ๊ณ ์ตํ๊ธฐ
- ์๋ํํฐ๋ฅผ ์ตํ๊ธฐ๋ ์ด๋ ต๊ณ . ํตํฉํ๊ธฐ๋ ์ด๋ ต๋ค. ์ด ๋ ๊ฐ์ง๋ฅผ ๋์์ ํ๊ธฐ๋ ๋ ๋ฐฐ๋ ์ด๋ ต๋ค.
- ์๋ํํฐ ์ฝ๋๋ฅผ ์ฌ์ฉํ ๋, ๊ณง๋ฐ๋ก ์๋ํํฐ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง ๋ง๊ณ , ๊ทธ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ํด ํ
์คํธ๋ฅผ ์์ฑํ ์ ์๋ค.(์ง ๋ด์ปคํฌ๋ ์ด๋ฅผ
ํ์ตํ ์คํธ
๋ผ๊ณ ๋ถ๋ฅธ๋ค.)
log4j ์ตํ๊ธฐ
// 1.
// ์ฐ์ log4j ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ด๋ฐ์.
// ๊ณ ๋ฏผ ๋ง์ด ํ์ง ๋ง๊ณ ๋ณธ๋ฅ์ ๋ฐ๋ผ "hello"๊ฐ ์ถ๋ ฅ๋๊ธธ ๋ฐ๋ผ๋ฉด์ ์๋์ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์.
@Test
public void testLogCreate() {
Logger logger = Logger.getLogger("MyLogger");
logger.info("hello");
}
// 2.
// ์ ํ
์คํธ๋ "Appender๋ผ๋๊ฒ ํ์ํ๋ค"๋ ์๋ฌ๋ฅผ ๋ฑ๋๋ค.
// ์กฐ๊ธ ๋ ์ฝ์ด๋ณด๋ ConsoleAppender๋ผ๋๊ฒ ์๋๊ฑธ ์์๋๋ค.
// ๊ทธ๋์ ConsoleAppender๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ฃ์ด์ค๋ดค๋ค.
@Test
public void testLogAddAppender() {
Logger logger = Logger.getLogger("MyLogger");
ConsoleAppender appender = new ConsoleAppender();
logger.addAppender(appender);
logger.info("hello");
}
// 3.
// ์์ ๊ฐ์ด ํ๋ฉด "Appender์ ์ถ๋ ฅ ์คํธ๋ฆผ์ด ์๋ค"๊ณ ํ๋ค.
// ์ด์ํ๋ค. ๊ฐ์ง๊ณ ์๋๊ฒ ์ด์ฑ์ ์ผ๊ฒ ๊ฐ์๋ฐ...
// ๊ตฌ๊ธ์ ๋์์ ๋น๋ ค, ๋ค์๊ณผ ๊ฐ์ด ํด๋ณด์๋ค.
@Test
public void testLogAddAppender() {
Logger logger = Logger.getLogger("MyLogger");
logger.removeAllAppenders();
logger.addAppender(new ConsoleAppender(
new PatternLayout("%p %t %m%n"),
ConsoleAppender.SYSTEM_OUT));
logger.info("hello");
}
// ์ฑ๊ณตํ๋ค. ํ์ง๋ง ConsoleAppender๋ฅผ ๋ง๋ค์ด๋๊ณ ConsoleAppender.SYSTEM_OUT์ ๋ฐ๋๊ฑด ์ด์ํ๋ค.
// ๊ทธ๋์ ๋นผ๋ดค๋๋ ์ ๋์๊ฐ๋ค.
// ํ์ง๋ง PatternLayout์ ์ ๊ฑฐํ๋ ๋์๊ฐ์ง ์๋๋ค.
// ๊ทธ๋์ ๋ฌธ์๋ฅผ ์ดํด๋ดค๋๋ "ConsoleAppender์ ๊ธฐ๋ณธ ์์ฑ์๋ unconfigured์ํ"๋๋ค.
// ๋ช
๋ฐฑํ์ง๋ ์๊ณ ์ค์ฉ์ ์ด์ง๋ ์๋ค... ๋ฒ๊ทธ์ด๊ฑฐ๋, ์ ์ด๋ "์ผ๊ด์ ์ด์ง ์๋ค"๊ณ ๋๊ปด์ง๋ค.
// ์กฐ๊ธ ๋ ๊ตฌ๊ธ๋ง, ๋ฌธ์ ์ฝ๊ธฐ, ํ
์คํธ๋ฅผ ๊ฑฐ์ณ log4j์ ๋์๋ฒ์ ์์๋๊ณ ๊ทธ๊ฒ์ ๊ฐ๋จํ ์ ๋ํ
์คํธ๋ก ๊ธฐ๋กํ๋ค.
// ์ด์ ์ด ์ง์์ ๊ธฐ๋ฐ์ผ๋ก log4j๋ฅผ ๋ํํ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ ์๋ค.
// ๋๋จธ์ง ์ฝ๋์์๋ log4j์ ๋์์๋ฆฌ์ ๋ํด ์ ํ์๊ฐ ์๊ฒ ๋๋ค.
public class LogTest {
private Logger logger;
@Before
public void initialize() {
logger = Logger.getLogger("logger");
logger.removeAllAppenders();
Logger.getRootLogger().removeAllAppenders();
}
@Test
public void basicLogger() {
BasicConfigurator.configure();
logger.info("basicLogger");
}
@Test
public void addAppenderWithStream() {
logger.addAppender(new ConsoleAppender(
new PatternLayout("%p %t %m%n"),
ConsoleAppender.SYSTEM_OUT));
logger.info("addAppenderWithStream");
}
@Test
public void addAppenderWithoutStream() {
logger.addAppender(new ConsoleAppender(
new PatternLayout("%p %t %m%n")));
logger.info("addAppenderWithoutStream");
}
}
โํ์ต ํ ์คํธ(Learning test)โ๋ ๊ณต์ง ์ด์์ด๋ค.
- ๋ฉ์ธ ๋ก์ง์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉฐ ์๋ํํฐ ์ฝ๋๋ฅผ ์ดํดํ ์ ์๋ค.
- ์๋ํํฐ ์ฝ๋๊ฐ ๋ฐ๋ ๊ฒฝ์ฐ Learning test๋ฅผ ๋๋ ค โ์์ง ์ฐ๋ฆฌ๊ฐ ํ์ํ ๊ธฐ๋ฅ์ด ์ ๋์ํ๋์งโ ํ ์คํธํ ์ ์๋ค.
- Learning test๋ฅผ ํ๋ ๋ง๋, ๊ฒฝ๊ณ ํ
์คํธ๋
์ ๋ฒ์ ์ผ๋ก์ ์ด์
์ ๋์์ ์ค๋ค.
์์ง ์กด์ฌํ์ง ์๋ ์ฝ๋ ์ฌ์ฉํ๊ธฐ
์์ง ๊ฐ๋ฐ๋์ง ์์ ๋ชจ๋์ด ํ์ํ๋ฐ, ๊ธฐ๋ฅ์ ์ปค๋ ์ธํฐํ์ด์ค์กฐ์ฐจ ๊ตฌํ๋์ง ์์ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ ์ฝ๋๋ฌธ์ ์ฐ๋ฆฌ์ ๊ตฌํ์ด ๋ฆ์ด์ง๋๊ฑธ ํํ์น ์๊ฒ ์ฌ๊ธด๋ค.
์์
- ์ ์๋ ๋ฌด์ ํต์ ์์คํ ์ ๊ตฌ์ถํ๋ ํ๋ก์ ํธ๋ฅผ ํ๊ณ ์์๋ค.
- ๊ทธ ํ ์์ ํ๋ถ ํ์ผ๋ก โ์ก์ ๊ธฐโ๋ฅผ ๋ด๋นํ๋ ํ์ด ์์๋๋ฐ ๋๋จธ์ง ํ์๋ค์ ์ก์ ๊ธฐ์ ๋ํ ์ง์์ด ๊ฑฐ์ ์์๋ค.
- โ์ก์ ๊ธฐโํ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ง ์์๋ค. ํ์ง๋ง ์ ์๋ โ์ก์ ๊ธฐโํ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ โ์ํ๋โ ๊ธฐ๋ฅ์ ์ ์ํ๊ณ
์ธํฐํ์ด์ค
๋ก ๋ง๋ค์๋ค. [์ง์ ํ ์ฃผํ์๋ฅผ ์ด์ฉํด ์ด ์คํธ๋ฆผ์์ ๋ค์ด์ค๋ ์๋ฃ๋ฅผ ์๋ ๋ก๊ทธ ์ ํธ๋ก ์ ์กํ๋ผ] - ์ด๋ ๊ฒ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํจ์ผ๋ก์จ ๋ฉ์ธ ๋ก์ง์ ๋ ๊น๋ํ๊ฒ ์งค ์ ์์๊ณ ๋ชฉํ๋ฅผ ๋ช ํํ๊ฒ ๋ํ๋ผ ์ ์์๋ค.(์ฐธ์กฐ 1)
public interface Transimitter {
public void transmit(SomeType frequency, OtherType stream);
}
public class FakeTransmitter implements Transimitter {
public void transmit(SomeType frequency, OtherType stream) {
// ์ค์ ๊ตฌํ์ด ๋๊ธฐ ์ ๊น์ง ๋๋ฏธ ๋ก์ง์ผ๋ก ๋์ฒด
}
}
// ๊ฒฝ๊ณ ๋ฐ์ API
public class RealTransimitter {
// ์บก์ํ๋ ๊ตฌํ
...
}
public class TransmitterAdapter extends RealTransimitter implements Transimitter {
public void transmit(SomeType frequency, OtherType stream) {
// RealTransimitter(์ธ๋ถ API)๋ฅผ ์ฌ์ฉํด ์ค์ ๋ก์ง์ ์ฌ๊ธฐ์ ๊ตฌํ.
// Transmitter์ ๋ณ๊ฒฝ์ด ๋ฏธ์น๋ ์ํฅ์ ์ด ๋ถ๋ถ์ ํ์ ๋๋ค.
}
}
public class CommunicationController {
// Transmitterํ์ API๊ฐ ์ ๊ณต๋๊ธฐ ์ ์๋ ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ค.
public void someMethod() {
Transmitter transmitter = new FakeTransmitter();
transmitter.transmit(someFrequency, someStream);
}
// Transmitterํ์ API๊ฐ ์ ๊ณต๋๋ฉด ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ค.
public void someMethod() {
Transmitter transmitter = new TransmitterAdapter();
transmitter.transmit(someFrequency, someStream);
}
}
- Adapter Pattern์ผ๋ก API ์ฌ์ฉ์ ์บก์ํํด API๊ฐ ๋ฐ๋ ๋ ์์ ํ ์ฝ๋๋ฅผ ํ๊ณณ์ผ๋ก ๋ชจ์๋ค.
- API์ธํฐํ์ด์ค๊ฐ ๋์จ ๋ค์ ๊ฒฝ๊ณ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํด ์ฐ๋ฆฌ๊ฐ API๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋์ง ํ ์คํธํ ์๋ ์๋ค.
๊นจ๋ํ ๊ฒฝ๊ณ
- ์ข์ ์ํํธ์จ์ด ๋์์ธ์ ๋ณ๊ฒฝ์ด ์๊ธธ ๊ฒฝ์ฐ ๋ง์ ์ฌ์์ ์์ด ๋ณ๊ฒฝ์ ๋ฐ์ํ ์ ์๋ ๋์์ธ์ด๋ค.
- ๊ฒฝ๊ณ์ ์์นํ๋ ์ฝ๋๋ ๊น๋ํ ๋ถ๋ฆฌํ๋ค.
- ๊ธฐ๋์น๋ฅผ ์ ์ํ๋ ํ ์คํธ ์ผ์ด์ค๋ ์์ฑํ๋ค.
- ์ง์ ํธ์ถํ๋ ์ฝ๋๋ฅผ ๊ฐ๋ฅํ ์ค์ฌ ๊ฒฝ๊ณ๋ฅผ ๊ด๋ฆฌํ์.