각종 후기/우아한테크코스

우아한 테크코스 3기 프리코스 2주차 미션 수행 후기

제이온 (Jayon) 2020. 12. 7.

안녕하세요? 코딩중독입니다.

 

 

저번 포스팅에서는 프리코스 1차 미션에 대한 이야기를 하였습니다. 궁금하신 분은 참고하시면 되겠습니다. 1차 미션이 종료된 다음날 2차 미션과 관련된 메일이 왔습니다.

 

과제를 fork해서 받아오고 나중에 pr을 통해 제출하는 과정이나 commit 규칙 등은 동일하고, 구현해야할 내용과 제약 조건이 많아졌습니다. 한 번 알아 봅시다.

 

 

2주차 미션 주제

우아한 테크코스 2기 1주차 때와 마찬가지로 3기 1주차도 '자동차 경주 게임'을 구현하는 것이었습니다.

 

아래는 프로그램 동작 과정입니다.

 

 

 

 

처음 경주할 자동차 이름들을 입력 받고, 시도할 횟수를 입력 받습니다.

 

그리고 각 자동차는 매 턴마다 1칸 전진하거나 멈춰야하는데, 0 ~ 9 사이의 난수에 따라 정해집니다.

 

난수가 4 이상이라면 1칸 전진하고, 4 미만이라면 멈추는 것입니다. 단, 멈추는 것이 한 턴에서만 멈추는 것이지, 계속 멈춰 있는 상태는 아닙니다.

 

위 과정을 프로그램으로 구현하면 됩니다.

 

 

힘들었던 점

마찬가지로 구현 난이도 자체는 낮습니다. 하지만, 우리는 단순히 프로그램을 돌아가게만 만드는 것이 아니라 '잘' 만들어야 합니다. 그리고 이 '잘' 만드는 것을 도와주기 위해, 우테코는 구현에 있어서 제약 조건을 추가하였습니다.

 

 

(1) else 예약어 사용 불가

처음에 의아했던 부분입니다. 삼항연산자는 '사망연산자'라고 부를 만큼 중첩해서 쓰면 가독성을 해치는 것인데, 우리가 프로그래밍 기초에서 배우는 else를 왜 쓰지 말라는 것인지 궁금했습니다.

 

우아한테크코스 오픈채팅방에서 이것을 물어보니 한 분이 'early return' 이라는 용어를 알려주셨습니다. 쉽게 말해서 쓸데 없이 조건을 쭉 나열하기보다는 조건에 안맞는 것은 바로 return을 해 버리는 것입니다. 그렇게 하면, return 이후 코드의 구조가 간편해지기때문에 가독성이 올라가는 장점이 있는 것이죠.

 

그래서 반복문 안에서도 else를 쓰지 않고 바로 continue나 break을 쓰는 등 else 예약어를 쓰지 않으려고 노력하였습니다.

 

추가로, else를 쓰지 말라니까 swtich ~ case문을 사용하시는 분이 있다고ㅋㅋㅋ switch ~ case문도 쓰면 안 됩니다. 뭔가 공부하면 할수록 파이썬에서 없앤 문법(do ~ while, switch, 삼항연산자 등)이 없앨만 하다는 생각이 들고 있습니다.

 

 

(2) 메소드의 길이는 15줄로 제한

사실 이 조건은 1주차 미션과도 일맥상통합니다. 하나의 메소드는 가능한 하나의 일만 하도록 설계하는 것이죠. 이것을 잘 수행하라고 일부러 15줄이라는 기준으로 두어 제한을 한 것 같습니다.

 

그리고 함수의 라인 수를 줄이는 데 (1)번 역할도 도움을 줍니다. else 쓰고 중괄호 열고 닫고 하는 것보다는 return으로 깔끔하게 끝내는 것이 라인 수를 줄일 수 있기때문이죠.

 

 

(3) 구조 설계

사실 근본적인 어려움이긴 합니다. 이번에는 1주차 미션과는 달리 클래스 설계를 잘 해야 합니다. 특히, 개발 경험이 없는 저같은 사람들은 어떠한 클래스가 무슨 일을 해야하는지 파악하기가 어렵습니다.

 

이 부분도 오픈채팅방에 도움을 구했더니, 단일책임원칙이라는 키워드를 알려주셨습니다. 단일책임원칙이란 모든 클래스가 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는 단어라고 합니다.

 

저는 사실 이것을 검색해도 쉽게 와닿지는 않았고.. 추후에 구매한 "객체지향의 사실과 오해"를 통해 구조를 잡는 방법을 익힐 수 있지 않을까 기대합니다.

 

그래도 과제를 수행해야했기때문에 제 나름대로 구조를 짜 보았는데, 무언가 상황을 떠올리려고 하였습니다. 가령, 자동차 경주 게임을 진행한다고 하면, 게임에 참가하는 사람이 있을 것이고, 자동차가 있을 것입니다. 그리고 플레이어는 차를 조종하기때문에 Player 클래스와 Car 클래스가 있어야하고, Player 클래스 안에 멤버 변수로 Car를 객체로 두어야 하지 않을까?라고 생각하였습니다. 게임의 플레이어는 반드시 하나의 차를 갖고 있을 것이기 때문이죠.

 

이제, 플레이어와 차의 정의가 끝났다면, 게임을 진행해야하기때문에 RacingGame이라는 클래스를 만들어서 게임의 여러 가지 규칙에 따라 진행해야한다고 생각하였습니다. 그리고 각각의 클래스가 무엇을 해야하는지 고민하여 메소드를 정의하였습니다. 

 

여전히 어려운 내용이지만, 계속 개발하면서 늘지 않을까 싶습니다.

 

 

(4) 예외 처리

PS에서는 입력 검사와 같은 예외 처리는 하지 않습니다. 그래서 저도 try ~ catch를 알고만 있었지, 학교 수업 외에는 써본 적이 없습니다. 사실 그마저도 수업에서 실습한 것이 전부였죠.

 

하지만, 이번에는 그러한 예외 처리와 함께 메시지를 띄워주어야했기때문에 try ~ catch와 throw에 대해서 공부하고 적용해 보았습니다.

 

이 부분도 아직 미숙해서 계속 개발하면서 연습해야겠습니다.

 

 

(5) 기타

그 외에는 기능 별 commit, README.md 작성, 대학교 시험기간과의 겹침이 되겠네요. 앞의 2개는 시간이 지나면 실력이 향상된다고 치고.. 시험은 12월 15일에 끝나가지고 프리코스 동안은 내내 어쩔 수 없이 기말고사 준비를 병행할 수 밖에 없겠습니다.

 

어떻게 보면 핑계죠, 다 열심히 해 보겠습니다.

 

 

정리

프리코스는 내일 마감이 됩니다. 이제 2주차지만, 뭔가 이것저것 실력이 늘고 있다는 것이 느껴집니다. 열심히 해서 최종 테스트도 잘 치르고 정규 교육을 받으면 좋겠네요 ㅎㅎ

 

제가 구현한 자동차 경주 게임 코드는 이곳에서 확인하실 수 있고, 궁금한 점은 편하게 댓글로 남겨주시면 되겠습니다~

댓글

추천 글