본문 바로가기

Java

람다 표현식을 활용한 디자인패턴 - 템플릿 메서드

디자인 패턴은 유용하다.

람다 표현식을 디자인 패턴에 적용한다면 더 간결하게 구현할 수 있다.

 

템플릿 메서드

알고리즘 개요를 제시하고 알고리즘의 일부를 수정할 필요가 있을때 템플릿 메서드를 사용한다.

예를들어 라면을 끓이는 과정을 코딩해보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public abstract class 라면 {
    public void cook(){
        prepareWater();
        inputPowder();
        inputNoodle();
    }
 
    protected void prepareWater(){
        System.out.println("물을 넣는다.");
    }
 
    protected abstract void inputPowder();
 
    protected void inputNoodle(){
        System.out.println("면을 넣는다.");
    }
}

수프를 넣는 과정말고는 물을 붇고 면을 넣는 과정은 동일하다.

수프는 각 라면의 종류에 따라 다르므로 '라면' 클래스를 상속받는 곳에서 구현해준다.

 

1
2
3
4
5
6
7
public class 신라면 extends 라면 {
    @Override
    protected void inputPowder() {
        System.out.println("신라면 수프를 넣는다.");
    }
}
1
2
3
4
5
6
7
public class 짜파게티 extends 라면 {
    @Override
    protected void inputPowder() {
        System.out.println("자장 수프를 넣는다.");
    }
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Main {
    public static void main(String[] args) {
        신라면 ramen1 = new 신라면();
        ramen1.cook();
 
        System.out.println();
 
        짜파게티 ramen2 = new 짜파게티();
        ramen2.cook();
 
        //실행결과
//        물을 넣는다.
//        신라면 수프를 넣는다.
//        면을 넣는다.
//
//        물을 넣는다.
//        자장 수프를 넣는다.
//        면을 넣는다.
    }
}

 

위의 코드는 라면의 종류가 늘어날수록 그에 해당하는 클래스를 추가 해주어야 하는 수고로움이 있다.

하지만 람다 표현식을 사용한다면 그 수고로움을 덜 수 있다.

람다 표현식을 사용하여 구현하면 다음과 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class 라면 {
    public void cook(Runnable runnable){
        prepareWater();
        runnable.run();
        inputNoodle();
    }
 
    protected void prepareWater(){
        System.out.println("물을 넣는다.");
    }
 
    protected void inputNoodle(){
        System.out.println("면을 넣는다.");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Main {
    public static void main(String[] args) {
        라면 ramen1 = new 라면();
        ramen1.cook(()-> System.out.println("신라면 수프를 넣는다."));
 
        System.out.println();
 
        라면 ramen2 = new 라면();
        ramen2.cook(()-> System.out.println("자장 수프를 넣는다."));
        
        //실행결과
//        물을 넣는다.
//        신라면 수프를 넣는다.
//        면을 넣는다.
//
//        물을 넣는다.
//        자장 수프를 넣는다.
//        면을 넣는다.
    }
}

 

※ 람다 표현식을 사용하는 것이 항상 좋은 것은 아니다.

경우에 따라 불필요한 코드를 제거할 수 있어서 유용할 수 있고, 기존의 방식을 고수하는 것이 좋을 수 있다.

반응형