전략 패턴

전략 패턴은 한 유형의 알고리즘을 보유한 상태에서 런타임에 적절한 알고리즘을 선택하는 기법이다.
다양한 기준을 갖는 입력값을 검증하거나, 다양한 파싱 방법을 사용하거나, 입력 형식을 설정하는 등 다양한 시나리오에 전략 패턴을 활용할 수 있다.

우테코 예외처리 코드 전략 패턴으로 해결해보기

우테코 프리코스를 진행하면서 입력값에 대한 예외처리를 하는 것이 상당히 어려웠다. 예외처리를 하기 위한 클래스를 구성하는 것 부터 메소드들의 리턴값 구성 등등 마음에 들게 코딩을 하지 못했다. 모던 자바 인 액션을 읽다가 전략 패턴을 접했는데 전략 패턴으로 입력값 검증을 잘 해낼 수 있을 것 같아서 도전해본다.

전략 패턴 도입 이전 코드

먼저 try-catch문을 사용했다. isLapInt()의 의도는 이렇다.

  1. 몇 바퀴를 돌것인지 결정하기 위해서 int를 입력받는다.
  2. int를 입력받았다면 true를 반환하며 메소드를 끝낸다.
  3. int가 아니라면 InputMismatchException 에러가 발생하며 false를 반환한다.
  4. false를 반환했다면 isLapInt()를 호출한 함수에서 다시 isLapInt()를 호출한다.

문제점

  1. 클래스 변수 lap을 유지해야 한다.
  2. 딱 보기에도 그냥 복잡하다.
  3. 프로그램에 또 다른 입력값을 검증하기 위해서는 또 다른 try-catch문을 작성해야한다.

전략 패턴 도입 이후

  1. 전략 패턴을 위한 함수형 인터페이스를 작성한다. (Validation)
  2. 인터페이스를 구현한다. 필자의 경우에는 입력값이 "," 하나 이거나 숫자인 경우를 검증하는 IsOnlyComma, IsNumeric Class를 구현했다.
  3. 함수형 인터페이스 Validation을 사용하는 Validator Class를 구현한다.
  4. 자바의 다형성을 이용해 전략 패턴을 사용한다.
    public interface Validation {
     boolean execute(String s);
    }
    

public class IsOnlyComma implements Validation{
@Override
public boolean execute(String s) {
return s.equals(",");
}
}

public class IsNumeric implements Validation {
@Override
public boolean execute(String s) {
return s.matches("\d+");
}
}

public class Validator {
private final Validation validator;

public Validator(Validation validator) {
    this.validator = validator;
}

public boolean validation(String s) {
    return validator.execute(s);
}

}


# 코드의 변화

Validator validator = new Validator(new IsNumeric());
while(validator.validation(scanner.next()));

위에 try-catch문이 단 두 줄로 끝낼 수 있게 되었다. 전략 패턴이 실무에서 가장 많이 쓰일정도로 많이 사용된다고 하는데 더 많은 연습이 필요할 것 같다.
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기