์šฐ๋ฆฌ๋Š” ์‹œ์Šคํ…œ์— ๋“ค์–ด๊ฐ€๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋ณดํ†ต ์ง์ ‘ ๊ฐœ๋ฐœํ•˜์ง€ ์•Š๋Š”๋‹ค. ์™ธ๋ถ€ ํŒจํ‚ค์ง€ ๊ตฌ์ž…, ์˜คํ”ˆ์†Œ์Šค, ์‚ฌ๋‚ด ํŒ€์˜ ์ œ๊ณต ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ์šฐ๋ฆฌ ์ฝ”๋“œ์— ๊น”๋”ํ•˜๊ฒŒ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์€ ๊ฝค๋‚˜ ์ค‘์š”ํ•˜๋‹ค. ์ด ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ•๊ณผ ๊ธฐ๊ต๋ฅผ ๋ฐฐ์›Œ๋ณด์ž.

์™ธ๋ถ€ ์ฝ”๋“œ ์‚ฌ์šฉํ•˜๊ธฐ

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ž…์žฅ๊ณผ ์‚ฌ์šฉํ•˜๋Š” ์ž…์žฅ ์‚ฌ์ด์—๋Š” ํ•„์—ฐ์ ์ธ ๊ธด์žฅ๊ฐ์ด ์กด์žฌํ•œ๋‹ค. ์ œ๊ณตํ•˜๋Š” ์ž…์žฅ์—์„œ๋Š” ๋ฒ”์šฉ์„ฑ์„ ์œ„ํ•ด ๋‹ค์–‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•œ๋‹ค. ๊ทธ์™€ ๋ฐ˜๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ž…์žฅ์—์„œ๋Š” ์‚ฌ์šฉํ•  ๋•Œ ํŽธ๋ฆฌํ•œ specificํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์›ํ•œ๋‹ค. ์ด๊ฒƒ์„ (์‹œ์Šคํ…œ) โ€œ๊ฒฝ๊ณ„์—์„œ์˜ ๊ธด์žฅโ€์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋‹ค์Œ์˜ interface๋ฅผ ๋ณด์ž.

  • 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 class๋ฅผ ์ €์žฅํ•˜๋Š” Map ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

Map sensors = new HashMap();
Sensor s = (Sensor)sensors.get(sensorId);

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ์ฝ”๋“œ ์ „๋ฐ˜์— ๊ฑธ์ณ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ์ผ๋‹จ ๋ฌธ์ œ๊ฐ€ ๋ญ๋ƒ๋ฉด, casting์˜ ๋ถ€๋‹ด์„ ์ง€์†ํ•˜์—ฌ ์•ˆ๊ฒŒ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ generic์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋…์„ฑ๊ณผ ์˜๋„ ๋ชจ๋‘๋ฅผ ์ฑ™๊ธธ ์ˆ˜ ์žˆ๋‹ค.

Map<String, Sensor> sensors = new HashMap<Sensor>();
Sensor s = sensors.get(sensorId);

์ด๋Ÿฌ๋ฉด ๋์ผ๊นŒ? ์•„๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์‚ฌ์šฉํ•˜๋Š” ์ธก์—์„œ ํ•„์š”์—†๋Š” method์—๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Ÿฐ ์ฝ”๋“œ๊ฐ€ ์ด๊ณณ ์ €๊ณณ์—์„œ ์ค‘๋ณต๋˜์–ด ์‚ฌ์šฉ๋œ๋‹ค๋ฉด, Map์˜ interface๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์ฐพ์•„์„œ ๋ณ€๊ฒฝ์‹œ์ผœ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ๋ณ€ํ™”์— ๊ฐ•๊ฑดํ•˜์ง€ ๋ชปํ•œ ๊ตฌ์กฐ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์˜, ์ข‹์€ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ wrapping์ด๋‹ค.

public class Sensors {
    // ๊ฒฝ๊ณ„์˜ ์ธํ„ฐํŽ˜์ด์Šค(์ด ๊ฒฝ์šฐ์—๋Š” Map์˜ ๋ฉ”์„œ๋“œ)๋Š” ์ˆจ๊ฒจ์ง„๋‹ค.
    // Map์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์—ฌํŒŒ๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Generic์„ ์‚ฌ์šฉํ•˜๋˜ ์ง์ ‘ ์บ์ŠคํŒ…ํ•˜๋˜ ๊ทธ๊ฑด ๊ตฌํ˜„ ๋””ํ…Œ์ผ์ด๋ฉฐ Sensorํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ธก์—์„œ๋Š” ์‹ ๊ฒฝ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค.
    // ์ด๋Š” ๋˜ํ•œ ์‚ฌ์šฉ์ž์˜ ๋ชฉ์ ์— ๋”ฑ ๋งž๊ฒŒ ๋””์ž์ธ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์ž˜๋ชป ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋œ๋‹ค.
 
    private Map sensors = new HashMap();
    
    public Sensor getById(String id) {
        return (Sensor)sensors.get(id);
    }
}

๋ชจ๋“  Map์„ ์ด๋Ÿฐ์‹์œผ๋กœ ๋””์ž์ธํ•˜๋ผ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, โ€œ๊ฒฝ๊ณ„์— ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šคโ€์˜ ๊ฒฝ์šฐ ์‹œ์Šคํ…œ ์ „๋ฐ˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์›์น™์„ ์ง€ํ‚ค๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” class ๋‚ด๋ถ€์— ๋„ฃ๋Š”๋‹ค.
  • ํ˜น์€ ๊ฐ€๊นŒ์šด ๊ณ„์—ด์˜ class์— ๋„ฃ๋Š”๋‹ค.
  • Map์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต๊ฐœ API์˜ ์ธ์ˆ˜๋กœ ๋„˜๊ธฐ๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ฆ‰, ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๋ง์ด๋‹ค.

๊ฒฝ๊ณ„ ์‚ดํ”ผ๊ณ  ์ตํžˆ๊ธฐ

third party ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ์ ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ด๊ฒŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์ œ์ธ์ง€, ์šฐ๋ฆฌ ์ฝ”๋“œ ๋ฌธ์ œ์ธ์ง€ ํŒŒ์•…์ด ์‰ฌ์›Œ์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ๋ถ„๋ช… ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ณณ์ด ์šฐ๋ฆฌ์ฑ…์ž„์ด ์•„๋‹ˆ๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฑ…์ž„์ธ๋ฐ ๋””๋ฒ„๊น…์— ์‹œ๊ฐ„์„ ์˜ค๋ž˜ ์Ÿ๋Š”๋‹ค๋ฉด ์ด๋Š” ๋ถ„๋ช…ํ•œ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„์ผ ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ์ ์— ์ฐฉ์•ˆํ•˜์—ฌ ์šฐ๋ฆฌ๋Š” ์ ์–ด๋„ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด๊ฒŒ ์žฅ๊ธฐ์ ์œผ๋กœ ๋” ์ ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋“ค์ด๋Š” ์ผ์ผ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ”๋กœ ๋ฌธ์ œ์ ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ฅผ ์ง ๋‰ด์ปคํฌ๋Š” โ€œํ…Œ์ŠคํŠธ ๊ณต๋ถ€ํ•˜๊ธฐโ€๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

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)๋Š” ๊ณต์งœ ์ด์ƒ์ด๋‹ค

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ, ๋จผ์ € ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์ž‘์„ฑํ•˜๋ฉด์„œ ์ตํžˆ๋Š” ๋ฐฉ์‹์€ ๊ต‰์žฅํžˆ ํšจ์œจ์ ์ด๋‹ค.

  1. ํ•„์š”ํ•œ ์ง€์‹๋งŒ ํ™•๋ณดํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  2. ์ดํ•ด๋„๋ฅผ ๋†’ํ˜€์ฃผ๋Š” ์‹คํ—˜์ ์ธ ๋ฐฉ์‹์ด๋‹ค.
  3. ๋“œ๋Š” ๋น„์šฉ์ด ์—†๋‹ค. ๊ทธ๋ƒฅ ํ•ด๋ณด๋ฉด ๋œ๋‹ค.
  4. ๋ฉ”์ธ ๋กœ์ง์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ ์ดํ•ด๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  5. third party ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ํ•™์Šต ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด โ€œํ•„์š”ํ•œ ๊ธฐ๋Šฅโ€์ด ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์ ์™ธ์—๋„, ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ„ ๋ถ€๊ทผ์—์„œ์˜ test๋Š” ์ƒˆ ๋ฒ„์ „์œผ๋กœ ์ด์ „์— ์žˆ์–ด ๋ณด๋‹ค ๋น ๋ฅธ ์ „ํ™˜์„ ๊ฐ€๋Šฅ์ผ€ํ•œ๋‹ค.

์•„์ง ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ

์•„์ง ๊ฐœ๋ฐœ๋˜์ง€ ์•Š์€ ๋ชจ๋“ˆ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๊ธฐ๋Šฅ์€ ์ปค๋…• ์ธํ„ฐํŽ˜์ด์Šค๋„ ์—†๋‹ค. ํ•ด๋‹น ๋ชจ๋“ˆ์— ์˜์กด์ ์ธ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์€ ๊ต‰์žฅํžˆ ์„ฑ๊ฐ€์‹œ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ๊ตฌํ˜„์ด ๋Šฆ์–ด์ง€๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.

์ €์ž์˜ ์˜ˆ์‹œ๋กœ ๋ฌด์„ ํ†ต์‹  ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ๋‹ค. ํŒ€ ์•ˆ์˜ ํ•˜๋ถ€ ํŒ€์œผ๋กœ โ€œ์†ก์‹ ๊ธฐโ€๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํŒ€์ด ์žˆ์—ˆ๋Š”๋ฐ ๋‚˜๋จธ์ง€ ํŒ€์›๋“ค์€ ์†ก์‹ ๊ธฐ์— ๋Œ€ํ•œ ์ง€์‹์ด ๊ฑฐ์˜ ์—†์—ˆ๋‹ค. โ€œ์†ก์‹ ๊ธฐโ€ํŒ€์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์•˜๋‹ค. ํ•˜์ง€๋งŒ ์ €์ž๋Š” โ€œ์†ก์‹ ๊ธฐโ€ํŒ€์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋Œ€์‹  โ€œ์›ํ•˜๋Š”โ€ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. [์ง€์ •ํ•œ ์ฃผํŒŒ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ด ์ŠคํŠธ๋ฆผ์—์„œ ๋“ค์–ด์˜ค๋Š” ์ž๋ฃŒ๋ฅผ ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ๋กœ ์ „์†กํ•˜๋ผ] ์ด๋ ‡๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•จ์œผ๋กœ์จ ๋ฉ”์ธ ๋กœ์ง์„ ๋” ๊น”๋”ํ•˜๊ฒŒ ์งค ์ˆ˜ ์žˆ์—ˆ๊ณ  ๋ชฉํ‘œ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋Š” Adapter Pattern์ด๋‹ค.

public class FakeTransmitter implements Transimitter {
    public void transmit(SomeType frequency, OtherType stream) {
        // ์‹ค์ œ ๊ตฌํ˜„์ด ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋”๋ฏธ ๋กœ์ง์œผ๋กœ ๋Œ€์ฒด
    }
}
 
public class CommunicationController {
    // TransmitterํŒ€์˜ API๊ฐ€ ์ œ๊ณต๋˜๊ธฐ ์ „์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.
    public void someMethod() {
        Transmitter transmitter = new FakeTransmitter();
        transmitter.transmit(someFrequency, someStream);
    }
}
 
public interface Transimitter {
    public void transmit(SomeType frequency, OtherType stream);
}
 
// ๊ฒฝ๊ณ„ ๋ฐ–์˜ API
public class RealTransimitter {
    // ์บก์Šํ™”๋œ ๊ตฌํ˜„
    ...
}
 
public class TransmitterAdapter extends RealTransimitter implements Transimitter { // Transimitter ์ธํ„ฐํŽ˜์ด์Šค ๋ฌด์กฐ๊ฑด ๊ตฌํ˜„
    public void transmit(SomeType frequency, OtherType stream) {
        // RealTransimitter(์™ธ๋ถ€ API)๋ฅผ ์‚ฌ์šฉํ•ด ์‹ค์ œ ๋กœ์ง์„ ์—ฌ๊ธฐ์— ๊ตฌํ˜„.
        // Transmitter์˜ ๋ณ€๊ฒฝ์ด ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์€ ์ด ๋ถ€๋ถ„์— ํ•œ์ •๋œ๋‹ค.
    }
}
 
public class CommunicationController {
    // TransmitterํŒ€์˜ API๊ฐ€ ์ œ๊ณต๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.
    public void someMethod() {
        Transmitter transmitter = new TransmitterAdapter();
        transmitter.transmit(someFrequency, someStream);
    }
}

๊นจ๋—ํ•œ ๊ฒฝ๊ณ„

์ข‹์€ ์†Œํ”„ํŠธ์›จ์–ด ๋””์ž์ธ์€ ๋ณ€๊ฒฝ์ด ์ƒ๊ธธ ๊ฒฝ์šฐ ๋งŽ์€ ์žฌ์ž‘์—… ์—†์ด ๋ณ€๊ฒฝ์„ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์œ„์—์„œ ์•Œ์•„๋ณธ ๋‚ด์šฉ๋“ค์„ ์ •๋ฆฌํ•ด๋ณด์ž.

  • ๊ฒฝ๊ณ„์—์„œ ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” โ€œ๋ณ€๊ฒฝโ€์— ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.
  • ์ด ๋ณ€๊ฒฝ์— ๋Œ€์ฒ˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๊ฒฝ๊ณ„์— ์œ„์น˜ํ•œ ์ฝ”๋“œ๋ฅผ ๊น”๋”ํžˆ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์žˆ๋‹ค.
    • ์™ธ๋ถ€ ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ์„ธ์„ธํ•˜๊ฒŒ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค.
    • ์ด๋ฅผ wrappingํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ๋ณ€๊ฒฝ ๋ฒ”์œ„๋ฅผ ์ œ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ†ต์ œ ๋ถˆ๊ฐ€๋Šฅํ•œ ์™ธ๋ถ€ ํŒจํ‚ค์ง€ ์˜์กด๋ณด๋‹ค ํ†ต์ œ ๊ฐ€๋Šฅํ•œ ์šฐ๋ฆฌ ์ฝ”๋“œ์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • ํ˜น์€ Adapter ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ž.

Reference