키클봇 코딩하기

지금까지 강의들에서 로봇을 예제로 많이 사용해 왔지요? 그런데, 이 로봇을 Class(클래스)라는 것으로 코딩을 해 보려고 해요.
클래스는 로봇을 하나의 온전한 유기체로서 표현되도록 해준답니다. 클래스는 나중에 다른 코딩에서 사용할 때도 편리하고, 이미 작성한 코드를 분석할 때에도 훨씬 편하게 해주지요. 굉장히 중요한 내용이니 집중해서 따라오세요!


강의들은 모두 무료입니다. 단, 저작권은 키클 코딩랩 에 있으며, 무단 복제 및 배포를 엄금합니다.
이를 어길 시, 본 사이트의 서버가 미국에 있으므로, 미국법에 의해 처벌될 수도 있습니다.




클래스 (Class) 공부하기

이전 강의들의 로봇 예제들에서, 로봇의 위치 좌표나 로봇이 움직이는 기능을 코딩할 때 어떻게 했었죠? 그저 필요할 때마다, 이름이 x, y라는 리스트를 선언하기도 하고, 그 리스트들이 가지고 있는 값을 변경하기도 하고 했었지요? 로봇의 속성과 기능들을 코딩하고 이용하는데 있어서, 무언가 체계적이지도 않고, 직관적이지 않으면서 어수선한 느낌이 들지는 않았나요?
사람은 팔/다리가 있고, 그것을 이용해 이동하기도 하지요. 마찬가지로, 로봇도 팔이나 바퀴가 달려 있어서, 그것들을 이용하여 이동하고, 이동하면 특정 위치 좌표위에 있게 되는 등 로봇이라는 개체 고유의 속성과 기능들이 있지요.
코딩을 할 때, 어떤 개체의 고유한 속성과 기능들을 적절한 코드들로 표현을 하고, 그 코드들을 모아서 하나의 묶음으로 만들어 놓으면 어떨까요? 나중에 코드들을 분석하고 이해하는데 훨씬 용이하고, 체계적인 코딩을 하는 것처럼 보이기도 하고, 또 그 묶음을 다른 곳에서 재사용하기에도 편리하답니다.
무슨 말을 하는지 이해가 잘 안되나요? 그렇다면, 일단 따라와 보세요. 곧 알게 될거예요.

먼저, 클래스(Class)에 대해서 알아보고 가지요.

[문법] Class의 정의와 작성법

클래스의 정의와 작성법에 대해서 이해가 되었나요? 그러면, 이어서 클래스를 어떻게 이용하는지에 대해서 알아보지요.

[문법] Class의 사용/객체화

클래스의 객체화와 이용법에 대해서도 공부가 되었나요? 사실 우리는 지금까지 계속 클래스를 사용해 오고 있었어요. 예를 들어, 그래프를 그리기 위해 figure를 생성할 때, "plot.figure()"라고 코딩을 했었죠? 여기서, plot이 matplotlib 라이브러리에 구현되어 있는 클래스인 것이고, figure()는 plot클래스의 메서드인 것이랍니다.




키클봇 (KikleBot) 코딩하기

클래스에 대해서 공부했으니, 로봇을 클래스로 코딩해 볼까요? 클래스의 이름은 키클봇(KikleBot)으로 하기로 하지요.
여는 때와 마찬가지로, 원하는 폴더에 새로운 Python파일을 만들고, "lec10_kiklebot.py"라고 파일 이름을 지어 볼게요.
그리고, 아래와 같이, 이전 강의 간단한 로봇 게임 만들기에서 코딩한 내용을 전부 복사해서 붙여넣기 해 넣으세요. 키보드로 이동 방향 명령을 받아서 로봇의 위치를 바꿔가는 코딩을 했었죠? 기억이 잘 나지 않는다면, 반드시 다시 복습을 하고 오세요. 이 코드를 바탕으로 수정해 가면서 키클봇 클래스를 만들 계획이랍니다.

자, 그럼 위의 코드들 중에서 로봇과 관련 코드들은 어디에 있는지 찾아볼까요?
로봇의 처음 위치를 나타내는 줄14, 로봇이 이동할 수 있는 방향을 정하는 줄15, 로봇이 이동할 수 있는 범위를 정하는 줄17과 줄18, 로봇을 선택된 방향으로 이동시키는 줄43과 줄44, 줄17과 줄18에서 정해놓은 이동 가능한 범위를 적용하는 줄45~줄52, 로봇이 지나온 위치들을 저장하는 줄54가 로봇과 관련된 코드라고 볼 수 있겠네요.
어떤가요? 로봇과 관련된 코드들이 유기적인 관계를 갖고 체계적으로 사용된다기보다는 산재되어 있고 어수선하게 이용되고 있지요. 이 코드들을 모아서 하나의 유기체로서의 모습을 보여주는 키클봇 클래스를 코딩해 보지요.

먼저, 로봇의 위치좌표와 이동 가능한 방향들은 키클봇(KikleBot) 클래스의 속성들로 정의할 거랍니다. 그리고, 로봇의 이동 범위 제한을 풀기로 하지요.
이러한 구상을 코딩하기 위해서, 위의 줄14~줄15와 줄17~줄18은 삭제하고, 아래의 줄14~줄18에 키클봇 클래스를 추가했답니다. 줄20의 구분선은 그저 편의상 추가했으니, 신경 쓰지 않아도 되구요.

줄14에서는 KikleBot이라는 이름의 클래스 코딩을 시작하고 있지요.
줄15에서는 속성들을 초기화 하기 위해, __init__() 메서드를 선언하고 있구요. 주목할 점은, init_coord를 전달인자로 받고 있는데요, 로봇의 처음 위치를 사용자에게서 받기 위함이랍니다.
줄16에서는, 로봇의 위치좌표를 저장하기 위해 클래스의 속성 coord를 선언함과 동시에, 사용자에게서 받은 로봇의 처음 위치좌표 init_coord를 할당(저장)하면서 초기화 작업을 하고 있지요.
줄17에서는, 로봇이 지나온 경로(위치좌표들)를 저장하기 위해 속성 coord와는 별도로 속성 traj를 선언하고 있는 것이예요. 그리고, 속성 coord의 위치좌표를 속성 traj의 첫 번째 경로 정보로 저장하고 있어요.
줄18에서는, 로봇이 이동 가능한 방향들을 속성 move라는 이름으로 초기화 하고 있는 것이랍니다.

그럼, 이제는 키클봇 클래스에 필요한 메서드들을 추가해 보지요.
로봇이 이동하여 위치좌표가 변경되는 기능을 메서드로 구현할 것이니, 위의 줄45~줄46은 삭제하구요. 이동 범위 제한도 없애기로 하였으니, 줄47~줄54도 삭제 하지요. 마지막으로, 이동 경로를 저장하는 줄56을 삭제하고 메서드로 코딩을 해보기로 하지요.
위 사항들을 반영하여, 키클봇 코딩을 확장해 보면, 아래의 줄20~줄24의 코드들이 추가된답니다.

줄20에서는, move_bot이라는 이름의 메서드 코딩을 시작하고 있지요. 클래스 자신을 지칭하는 self외에 선택된 이동방향을 전달인자로 받고 있답니다.
줄21~줄22는 이전과 같은 방식으로 로봇의 위치좌표를 이동 후의 위치로 변경하고 있답니다. 즉, 현재의 위치를 갖고 있는 coord에 선택된 이동 방향의 x좌표 이동분(줄21)과 y좌표 이동분(줄22)을 반영한 후, 그 계산된 값들을 다시 속성 coord에 저장하는 것이죠.
줄24는 새로 변경된 위치좌표 coord를 이동 경로를 저장하는 traj에 쌓아놓는 코드로서 이전과 같은 방식인 것을 볼 수 있답니다. 혹시 Numpy의 append()를 복습하고자 한다면 여기로 가보세요.
키클봇 클래스 작성은 이제 마친 것이랍니다. 확실히 조금 더 체계적이고 짜임새 있는 코딩이 된것 같지 않나요?

클래스를 작성했으니, 객체화하고 이용해야 겠지요?
아래 줄28과 줄53에 객체화하고 메서드를 이용하는 코드를 추가했어요.

줄28에서는, __init()__의 전달인자로서 로봇의 초기 위치좌표 (0, 0)을 Numpy의 array로 만들어 전달하면서 KikleBot을 객체화하고, 그 객체를 my_bot 변수에 저장하고 있어요.
줄53에서는 줄40~줄51을 통해서 정해진 이동방향 idx_move를 전달하면서 move_bot() 메서드를 호출하고 있지요. 이를 통해 키클봇 객체는 자신의 위치를 idx_move의 방향으로 이동시키게 되는 것이구요.




키보드 명령으로 키클봇 이동하기

이제, 키클봇 클래스를 이용하여 새로 작성된 코드를 실행해 볼까요?
Python파일을 저장하고, 터미널에서 "python3 lec10_kiklebot.py"로 실행해 보세요. 실행하는 방법에 대해서 복습이 필요하면 여기로 가보세요.
실행하면, 아래와 같이 실행 명령을 타이핑했던 터미널 창 위에 figure창이 생성되지요?
강의 간단한 로봇 게임 만들기에서 설명했듯이, 이렇게 제일 위에 놓여진 창을 활성화(activated)되었다고 하는데요. Figure창이 활성화되면, 키보드 명령을 내릴 수가 없답니다. 그래서 터미널 창을 다시 활성화 상태로 바꿔야 하는데요. 아래 보이는 화살표 표시 처럼, 터미널 창을 마우스 왼쪽버튼 클릭하면 활성화 상태가 된답니다.

그리고, 'i', 'j', 'k', 'l' 키들을 누르면, figure 창에 움직이는 로봇이 보일 거예요. 로봇 게임을 멈추고 싶다면, 'q'를 눌러서 무한루프 탈출해야 하는 것 잊지 마세요!

강의에서 작성된 소스 코드 (source code)를 다운받으려면, 다음 링크를 클릭하세요: 소스 코드 다운로드
혹시, 이해가 잘 안되는 부분에 대한 질문이 있거나 다루어 줬으면 하는 주제가 있으면, 화면 오르쪽 하단에 "질문하기" 버튼을 이용해 주세요.






발자취

2019-09-11 "키클 코딩랩 - 미국 공학박사 아빠의 코딩 연구소"로 이름 변경
2019-06-28 코딩 교실 공개
2019-03-18 코딩 교실 제작 시작

바로가기
Python 배움터
C/C++ 배움터
About
Contact
Privacy Policy
강의목록
질문하기
처음으로