미국 공학박사 아빠의 코딩 연구소

라이브러리로 코딩을 고급스럽게

이전 강의까지 Python의 기본적인 코딩 기법들을 공부해 왔지요?
이제는 그 깊이를 조금씩 더해가고, 폭을 조금씩 넓혀 가야 해요.
보다 효율적이고 체계적이며 확장성이 좋은 코딩을 해야 보다 크고 고차원적인 코딩을 할 수 있고, 다른 사람들과 협업하기에도 좋답니다.
이번 강의에서는 그 첫걸음으로 조~금만 깊이 들어가 볼게요.


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




키클봇 라이브러리 만들기

먼저, 원하는 폴더에 새로운 Python파일을 만들고, "lec13_kiklebot.py"라고 파일 이름을 지어 보세요.
그리고, 파일을 열고, 강의 원격으로 키클봇 조종하기에서 작성했던 키클봇 서버 코드를 아래와 같이 복사해 넣을게요. 각 코드들에 대한 자세한 설명의 복습이 필요하면 꼭 되돌아 가서 확인하고 오세요.
어떤 부분들을 한층 더 깊이있고 고급스러운 코드로 만들 수 있을까요?

lec13_kiklebot.py

키클봇(KikleBot) 클래스를 정의한 줄5~줄15 부분이 한 단계 수준을 높일 여지가 있는 부분이예요. 키클봇 클래스는 키클봇이라는 로봇을 하나의 유기체로 보고 코딩을 한 것이지요? 클래스의 장점 중 하나는, 복사해서 붙여넣기만 하면 필요한 여러사람들 모두 사용할 수 있다는 것이예요. 일단, 속성과 기능등을 유기적인 모습인 클래스로 코딩을 해놓으면, 추후 더 이상 수정할 필요없이 독립된 모듈로서 여러사람이 가져다가 사용할 수 있는 것이지요.
그런데, 문제가 하나 있지요. 필요한 사람들과 공유하려면, 클래스 코드 부분을 복사해서 그 사람들에게 보내줘야 하는 불편함이 있는 것이죠. 복사할 때 실수를 하면, 실수가 있는지도 모르는 사람들은 자신들의 파일에 붙여넣기 하고는 왜 코드가 실행이 제대로 안되는지 고민하며 밤새도록 고민하는 경우도 있을 수 있지요.
이 불편함을 없애면서 안전하게 다른 사람들과 공유할 수 있는 방법이 있답니다.
바로, 위 줄1의 socket 라이브러리처럼 자신이 공유하고 싶은 코드들을 라이브러리로 만드는 것이죠.
필요한 사람이 있으면, 라이브러리 파일을 주면 되고, 그 사람은 그저 import만 하면 된답니다.

우리는 키클봇 클래스를 라이브러리로 만들건데요. 라이브러리로 만드는 방법은 어렵지 않아요.
일단, "lec13_kiklebot.py"과 같은 폴더에 새로운 Python파일을 만들고, "lec13_kiklebot_lib.py"라고 파일 이름을 지어 보지요.
그리고, 아래와 같이 "lec13_kiklebot.py"의 줄3~줄15을 복사해서 "lec13_kiklebot_lib.py"에 붙여넣으세요.
그런 후, 파일 "lec13_kiklebot.py"에서는 줄5~줄15을 삭제하세요.

lec13_kiklebot_lib.py

위 코드 내용에 대한 기억이 잘 나지 않는다면, 강의 원격으로 키클봇 조종하기에 가서 꼭 확인하세요.
그리고, 테스트용으로 아래 줄17~줄19의 코드들을 추가해 보지요.

lec13_kiklebot_lib.py

줄15는 무의미한 구분선이예요.
줄17은 (1, 0)을 로봇의 처음위치로 전달하면서 KikleBot 객체를 생성하는 것이죠.
줄18에서는, 키클봇 객체가 생성되었다는 메세지를 터미널에 출력하고 있어요. 키클봇의 coord속성을 이용하여, 위치 (1, 0)에서 키클봇이 생성되었다고 말하고 있어요.
줄19에서는, 나중에 다른 사용자가 키클봇 클래스를 이용하기 위해 import할 경우, 줄17~줄19는 실행되면 안된다는 것을 강조하기 위해 터미널에 "import할 때 이 메세지가 보이면 안된다"라고 터미널에 출력하고 있어요.
위 파일을 저장하고 "python3 lec13_kiklebot_lib.py"라고 실행하면, 터미널에

KikleBot class is created at ( 1 , 0 )
This message should not be shown when importing..

라고 출력되는 것을 볼 수 있답니다.




키클봇 라이브러리 import하기

이제, "lec13_kiklebot_lib.py"에 구현한 키클봇 클래스를 "lec13_kiklebot.py"에서 import하여 사용해 볼까요? 앞서 말했듯, 키클봇 클래스 코드들은 삭제 되었구요, 줄4는 새로 추가된 코드이고, 줄13은 수정된 코드랍니다.

lec13_kiklebot.py

줄4에서는, 우리가 만든 키클봇 라이브러리 "lec13_kiklebot_lib.py"를 import하는 코드예요. 이미 import에 대해서 알고 있지요? 알고 있는 내용에서 조금 더 확장해 볼게요.

[문법] import - 라이브러리 이용하기 2

라이브러리를 import하는 새로운 방법을 잘 익혔나요? 그렇다면, 자신이 만든 라이브러리는 어떻게 import하는지도 알아보지요.

[문법] import - 자신이 만든 라이브러리 이용하기

자신이 만든 라이브러리를 어떻게 import하는지 알겠죠?
코드로 돌아와서, 줄4에서는 from을 이용하여 "lec13_kiklebot_lib.py"에 구현한 KikleBot 클래스를 직접 import 하고 있답니다. 라이브러리 "lec13_kiklebot_lib.py"를 통째로 import하는 방법도 가능하다는 것을 보여주기 위해, 주석 표시 "#" 뒤에 그 방법도 붙여 놨으니 유념하세요.
줄13에서는, 키클봇 클래스의 객체화를 하고 있지요. 역시, 주석 표시 "#" 뒤에는, 라이브러리 "lec13_kiklebot_lib.py"를 통째로 import할 경우 객체를 생성하는 코드를 붙여놨어요.




특수 변수 __name__ 이용하기

이제, "lec13_kiklebot.py" 파일을 저장하고, 터미널에서 "python3 lec13_kiklebot.py"라고 실행해 보세요. 그럼, "lec13_kiklebot_lib.py"를 import한 코드가 정상적으로 실행이 되면서, 아래와 같은 메세지가 터미널에 출력되지요.

KikleBot class is created at ( 1 , 0 )
This message should not be shown when importing..

이 메세지들은 "lec13_kiklebot_lib.py" 라이브러리에서 테스트용으로 작성했던 코드들이었던 것 기억나지요? 즉, 라이브러리 파일 내에 테스트 코드가 실행이 된거예요. 우리는 라이브러리 안의 키클봇 클래스만 사용하고 싶은데, 테스트 코드도 실행이 된 것이죠. 위 두번째 메세지도 말하듯, 이 메세지들은 import 할 때 보이면 안되는데도 말이예요.

이 문제를 해결해 볼 건데요. Python이 자동으로 제공하는 "__name__"이라는 특수 변수를 사용해야 한답니다. 이것이 무엇인지 알아볼까요?

[문법] __name__

위에 설명된 __name__의 특성을 이용해서 "lec13_kiklebot_lib.py"을 수정해 봅시다. 아래 줄17~줄20이 수정된 부분이예요.

lec13_kiklebot_lib.py

줄17은 새로 추가한 코드인데, __name__에 "__main__"이 할당되는지 확인하는 것을 조건으로 if문을 코딩하였답니다. 즉, 이 코드는 "lec13_kiklebot_lib.py"가 "python3 lec13_kiklebot_lib.py"로서 실행이 되는지를 점검하는 것이지요.
줄18~줄20은 원래 있던 코드들이지요? 바뀐 점은 들여쓰기(indentation)을 해서 if문의 블락(block)으로 들어간 것이예요. 이렇게 함으로써, 이 코드들은 "python3 lec13_kiklebot_lib.py"로 실행할 때만 실행이 되고, "lec13_kiklebot_lib.py"가 다른 Python파일에서 import될 때에는 실행되지 않는답니다.




원격 조종 실행하기

이제, 키클봇 라이브러리를 통해 조금 더 고급스러워진 코드를 실행 해볼까요?
위에서 작성한 파일 "lec13_kiklebot.py"와 "lec13_kiklebot_lib.py" 모두 저장을 하고, 터미널에서 "python3 lec13_kiklebot.py"로 키클봇 서버를 실행해 보세요. 이제는, 터미널에 아무런 메세지도 출력되지 않지요?

이제, 명령 클라이언트를 실행해 볼게요. 이전 강의 원격으로 키클봇 조종하기에서 작성했던 명령 클라이언트 파일을 "lec13_kiklebot.py"와 같은 폴더에 다운로드 받으세요.
그리고, 아래 보이는 것처럼 "lec13_kiklebot.py"을 실행한 터미널 창 위의 아무 지점에서나 마우스 오른쪽 버튼을 누르세요. 그러면 새로 열리는 팝업 메뉴에서 "Open Terminal"을 클릭해서 새 터미널 창을 여세요.

그리고, "python3 lec12_cmd.py"로 클라이언트를 실행해 보세요. (실행 방법에 대해서 복습이 필요하면 여기로)
실행하면, 아래와 같이 클라이언트를 실행한 터미널 창 위에 figure창이 생성되지요.
이렇게 Figure창이 활성화되면, 키보드 명령을 내릴 수가 없으니, 아래 보이는 화살표 표시 처럼, 클라이언트를 실행한 터미널 창을 마우스 왼쪽버튼 클릭하여 활성화 상태로 만드세요.

그리고, 'i', 'j', 'k', 'l' 키들을 누르면, figure 창에 움직이는 키클봇이 보인답니다. 즉, 클라이언트를 통해 원격으로 명령을 보내고, 그 명령을 받은 서버가 키클봇에게 전달하여 키클봇이 움직이는 것이지요.
원격 조종을 멈추고 싶다면, 'q'를 눌러서 무한루프 탈출해야 하는 것 잊지 마세요!

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






발자취

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

바로가기
About
Contact
Privacy Policy
강의목록
질문하기
처음으로