공원 산책 (프로그래머스 연습문제)
내가 풀었던 풀이
변수 선언
변수는 가로와 세로의 길이, 시작지점을 저장하고 움직이는 현재의 상태를 초기화할 변수를 선언하고 초기화 했다.
데이터 전처리
2차원 String 배열로 입력받은 park 배열을 직접 이용하여 "S"를 움직여서 할 수 있지만 직관적이지 못하다고 생각하여 2차원 int 배열로 전처리를 진행하였다. S는 1, O는 0, 그리고 장애물 X는 -1을 각 배열에 값으로 대입했다.
입력받은 routes 또한 향상된 for문을 통해 route로 반복하였고 route는 split함수를 통해 방향(dir)과 정도(amount)로 나눠서 저장했다.
주요 방향 움직임 로직
E, S, N, W 4방향의 움직임 중 E 방향 움직임 로직만을 가져왔다. 각 방향은 if, else if, else로 조건에 맞게 각 로직을 수행하도록 했다. 로직은 간단한데 첫 번째 조건은 2차원 배열을 벗어났을 때, break를 걸어주는 것이다. 두 번째 조건은 장애물을 만났을 때, break를 걸어주는 것이고, 마지막 조건은 마지막 i 수행까지 배열을 벗어나지 않고 장애물을 만나지 않았으면 startX 변수를 i만큼 더해주는 것이다.
내 풀이에 대한 고찰
내가 푼 코드를 봤을 때 로직이 단순해서 이해하는데는 크게 문제가 없지만 반복적으로 if와 else if 그리고 else가 자주 사용되어 한 눈에 담기지 않을 것이라고 생각했다. 따라서 이 풀이를 어떻게 하면 다른 사람이 보고 쉽게 이해할 수 있을까? 라고 고민하다가 자바의 주요 특징인 객체지향 프로그래밍으로 현재 좌표를 나타내는 startX, startY 그리고 주요 로직을 캡슐화로 구현하면 다른 사람이 보고 이해하기 쉽겠다고 생각했다.
데이터 숨기기
좋은 객체 지향은 데이터와 메서드를 잘 숨겨야 한다고 공부했다. 따라서 다른 개발자가 이 클래스를 가지고 쓸 때 햇갈리지 않기 위해 데이터를 직접 사용하지 못하게 private로 숨겼다. 따라서
마지막에 결과값 반환을 위한 getStartX, getStartY 메서드를 생성하여 반환하도록 했다.
생성자
생성자는 solution 메서드에서 데이터 전처리하여 가공한 데이터를 입력받게 생성했다.
move 메서드
move 메서드는 방향과 정도(amount)를 매개변수로 받아 클래스 안에 있는 방향 메서드로 가게 안내자 메서드로 작성했다.
방향 메서드
move메서드가 방향 메서드를 지정해주기 때문에 main 메서드에서는 방향 메서드를 직접 호출할 필요가 없다. 따라서 다른 개발자의 혼돈을 줄이기 위해서 private 접근 제어자를 사용했다. 로직은 이전 풀이에서와 같은 로직을 사용했다.
Solution 클래스
메인 메서드에서의 사용의 다음과 같이 했다. 전처리 부분도 클래스 내부에 넣었어야 했나? 라는 생각이 들었지만, 그래도 기존 코드와 비교했을 때 클래스가 잘 캡슐화 되어있기 때문에 사용하거나 이해하는데 더 쉬울 것이라고 생각했다.
전체 고찰
이번 문제는 실무에서 하는 것과 같이 클래스를 캡슐화 시켜서 객체지향프로그램으로 구현해보자는 것이 이 문제를 다시 고찰하게 된 이유였는데 확실히 캡슐화를 시키니 캡슐화된 클래스를 보고 본문에 구현하는데 큰 도움을 주었다. 실무에서는 클래스를 만드는 파트, 만든 클래스를 활용하는 파트가 나누어져있다고 알고 있는데 왜 프로젝트를 객체지향프로그래밍으로 해야되는지 이유를 느낄 수 있었다.
전체 코드 : https://github.com/Vryez11/JVCS