๐Ÿ”ฅ TIL - Day 78 ๋””์ž์ธ ํŒจํ„ด - ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ Template Method

Kim Dae Hyunยท2022๋…„ 1์›” 3์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
89/93

ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ธฐ ์ „์— ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์„ ๋จผ์ € ์•Œ์•„๋ณด์ž.

๋‘ ํด๋ž˜์Šค TestA ์™€ TestB๊ฐ€ ์žˆ๋‹ค.
๋‘ ํด๋ž˜์Šค๋Š” ํ•œ ๊ฐœ ๋ฉ”์„œ๋“œ(logic)๋ฅผ ๊ฐ–๊ณ  ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” 0.5์ดˆ๊ฐ€ ์†Œ์š”๋˜๋Š” ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

logic ๋ฉ”์„œ๋“œ์˜ ์‹คํ–‰์‹œ๊ฐ„์„ ์ธก์ •ํ•ด์•ผ ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ์–ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ–ˆ๋‹ค.

@Slf4j
public class WithoutTemplateMethodTest {

    public class TestA {
        public void logic() throws InterruptedException {           
            log.info("start");
            // ์‹คํ–‰์‹œ๊ฐ„ ์ธก์ •์‹œ์ž‘
            long start = System.currentTimeMillis();
            
            // ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
            log.info("TestA logic1 processing ...");
            Thread.sleep(500);

            // ์‹คํ–‰์‹œ๊ฐ„ ๋กœ๊ทธ์ถœ๋ ฅ
            long end = System.currentTimeMillis();
            long spendTime = end - start;
            log.info("end, time = {}", spendTime);
        }
    }

    public class TestB {
        public void logic() throws InterruptedException {
            // ์‹คํ–‰์‹œ๊ฐ„ ์ธก์ •์‹œ์ž‘
            log.info("start");
            long start = System.currentTimeMillis();

            // ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
            log.info("TestB logic processing ...");
            Thread.sleep(500);
            
            // ์‹คํ–‰์‹œ๊ฐ„ ๋กœ๊ทธ์ถœ๋ ฅ
            long end = System.currentTimeMillis();
            long spendTime = end - start;
            log.info("end, time = {}", spendTime);
        }
    }
}

๋‘ ํด๋ž˜์Šค์˜ logic ๋ฉ”์„œ๋“œ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋‹จ ๋‘ ์ค„์ด๋‹ค.
๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ๋Š” ๊ด€๊ณ„์—†๋Š” ์‹คํ–‰์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ์ฝ”๋“œ์˜ ์–‘์ด ํ›จ์”ฌ ๋งŽ๋‹ค. ๋˜ํ•œ ์‹คํ–‰์‹œ๊ฐ„ ์ธก์ • ๋ถ€๋ถ„์€ ์™„๋ฒฝํ•˜๊ฒŒ ์ค‘๋ณต๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๊ด€๋ จ์—†๋Š” ๊ณตํ†ต์˜ ๋ถ€๊ฐ€๊ธฐ๋Šฅ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ์ค‘๋ณต๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๊ด€๊ณ„์—†๋Š” ๋ถ€๊ฐ€๊ธฐ๋Šฅ (๋กœ๊น…, ์‹คํ–‰์‹œ๊ฐ„ ์ธก์ • ๋“ฑ ..) ์„ ๋ถ„๋ฆฌํ•ด๋‚ด๋Š” ์†”๋ฃจ์…˜์œผ๋กœ ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“Œ ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ์ ์šฉ

ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์–ด๋–ค ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์—ฌ๊ธฐ์„œ ํ…œํ”Œ๋ฆฟ์—๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ถ€๊ฐ€๊ธฐ๋Šฅ์ด ๋‹ด๊ฒจ์ ธ ์žˆ๊ณ  ํ…œํ”Œ๋ฆฟ ์ฝ”๋“œ์˜ ์›ํ•˜๋Š” ๊ณณ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ์‹œํ‚ค๋ฉด ๋œ๋‹ค.

์ƒ์†์„ ์ด์šฉํ•ด์„œ ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด์„ ์ ์šฉํ•  ๊ฒƒ์ด๋‹ค.
ํ…œํ”Œ๋ฆฟ ์—ญํ• ์„ ํ•˜๋Š” ์ถ”์ƒํด๋ž˜์Šค ํ•˜๋‚˜๋ฅผ ์ •์˜ํ•˜๊ณ  ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์œ„ํ•ด ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋  ์ถ”์ƒ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๊ณตํ†ต์˜ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์— ํ•ด๋‹นํ•˜๋Š” execute ๋ถ€๋ถ„์—์„œ ์ž์‹ํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” call ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค.

@Slf4j
public abstract class AbstractTemplate {

    public void execute() {
        log.info("start");
        long start = System.currentTimeMillis();

        call();

        long end = System.currentTimeMillis();
        long spendTime = end - start;
        log.info("end, time = {}", spendTime);
    }

    protected abstract void call();
}

์ด์ œ ์‹คํ–‰์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋Š” AbstractTemplate๋ฅผ ์ƒ์†ํ•˜๊ณ  call ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๋ฉด ๋œ๋‹ค.

@Slf4j
public class SubClass1 extends AbstractTemplate {

    @Override
    protected void call() {
        log.info("logic1 processing ...");
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


@Slf4j
public class SubClass2 extends AbstractTemplate{

    @Override
    protected void call() {
        log.info("logic2 processing ...");
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

์ •์˜ํ•œ ๋‘ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

public class TemplateMethodTest {

    @Test
    void test() {
        AbstractTemplate subClass1 = new SubClass1();
        subClass1.execute();

        SubClass2 subClass2 = new SubClass2();
        subClass2.execute();
    }
}

๋ถ€๋ชจํƒ€์ž…์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ(์—…์ผ€์ŠคํŒ…)ํ•˜๊ณ  ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋œ ์ž์‹ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค.

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ์™€ ์™„๋ฒฝํ•˜๊ฒŒ ๊ฐ™์€ ๊ฒƒ์„ ํ•™์ธํ•  ์ˆ˜ ์žˆ๋‹ค.



๐Ÿ“Œ ์ฐธ๊ณ 

์ธํ”„๋Ÿฐ - ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ ๊ณ ๊ธ‰ํŽธ (๊น€์˜ํ•œ ๋‹˜)

profile
์ข€ ๋” ์ฒœ์ฒœํžˆ ๊นŒ๋จน๊ธฐ ์œ„ํ•ด ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๐Ÿง

0๊ฐœ์˜ ๋Œ“๊ธ€