개발자 99% 커뮤니티에서 수다 떨어요!
💡 연습문제 4. 간단한 터틀 그래픽 시스템을 제어하기 위해 소형 언어를 하나 구현하려한다. 이 언어는 한 글자짜리 명령어들로 구성되는데, 어떤 명령어는 뒤에 한 자리 숫자가 따라 나올 수도 있다. 예를 들어 다음 내용을 입력하면 사각형이 하나 그려진다.
P 2 # 2번 펜을 선택한다
D # 펜을 종이에 가져다 댄다
W 2 # 서쪽으로 2cm 이동하며 그린다
N 1 # 그다음 북쪽으로 1cm 이동하며 그린다
E 2 # 그다음 동쪽으로 2cm 이동하며 그린다
S 1 # 그다음 다시 남쪽으로 그린다
U # 펜을 종이에서 뗀다
이 언어를 파싱하는 코드를 구현하라. 새로운 명령어를 추가하기 쉽게 코드를 설계해야 한다.
자바로 파싱하는 코드를 작성해보았다.
명령어를 담을 클래스를 정의했다.
public class Command {
private String command;
private Boolean argYn;
private String func;
public Command(String command, Boolean argYn, String func) {
this.command = command;
this.argYn = argYn;
this.func = func;
}
public String getCommand() {
return command;
}
public Boolean getArgYn() {
return argYn;
}
public String getFunc() {
return func;
}
}
위와 같이 명령어 이름, argument 여부, 실행해야 할 함수를 담을 클래스를 정의했다.
아래는 Command 클래스 Map 을 생성하는 코드이다.
private static Map<String, Command> createCommandMap() {
Map<String, Command> commandMap = new HashMap<>();
Command P = new Command("P", true, "doSelectPen");
Command U = new Command("U", false, "doPenUp");
Command D = new Command("D", false, "doPenDown");
Command N = new Command("N", true, "doPenDir");
Command E = new Command("E", true, "doPenDir");
Command S = new Command("S", true, "doPenDir");
Command W = new Command("W", true, "doPenDir");
commandMap.put("P", P);
commandMap.put("U", U);
commandMap.put("D", D);
commandMap.put("N", N);
commandMap.put("E", E);
commandMap.put("S", S);
commandMap.put("W", W);
return commandMap;
}
아래는 실행하는 main 메서드이다.
public static void main(String[] args) {
Map<String, Command> commandMap = createCommandMap();
Scanner scan = new Scanner(System.in);
String input = scan.nextLine();
String key = input.substring(0,1);
Command command = commandMap.get(key);
if(command == null) {
System.out.println("해당 명령어는 등록되어 있지 않습니다.");
return;
}
if(input.length() > 1 && !command.getArgYn()) {
System.out.println("인자가 필요하지 않습니다.");
return;
}
if(input.length() <= 1 && command.getArgYn()) {
System.out.println("인자가 필요합니다.");
return;
}
String func = command.getFunc();
System.out.println(func + "가 실행됩니다.");
}
이런식으로 파싱하는 코드를 작성해보았다.