Python을 배우면서 2.x대와 3.x의 버전이 있다는 것을 들었고 더 이상 .2.x대의 업그레이드는 없다고하여 많은 고민 없이 3.x대를 쓰기 시작했다. 하지만, 실재로는 여러 이슈가 있다. Android는 여전히 2.x대를 쓰고 있다. 그래서 상황에 따라서는, 2.x 과 3.x를 병행해서 쓰게 한다거나 개발 환경을 Windows와 Linux로 나누어 PC를 2대로 운용한다던지 해야 하는 상황이 있다. 그럼에도 지금까지는 2.x는 그래도 강건너 불구경이었다.


도움 요청

네트워크 성능 최적화가 주요 업무인 후배는 network에서 실재로 전송하고 받는 packet을 캡춰해 놓은 pcacp 데이터를 많이 분석한다. 관련해서 이야기도 많이 하고 나에게 조언을 구하기도 한다. 한번은 python 이야기를 하길레 내 경험을 이야기 하고 python 강습을 듣도록 권유했다. 그래서, 나름 작업을 시작했던 것 같다. 관련된 조언을 몇번씩 구해서 같이 고민하고 간단히 답을 구하기도 하고 혹은 못 도와주기도 했다. 하지만, 이번에는 좀 더 심각해 보였다. 우리 집까지 찾아 오겠다는 것이었다.


내용은 python의 pcap 분석 툴인 captcp[1]의 포팅을 도와 달라는 것이었다. 이 툴은 dpkt[2] 모듈을 이용해서 TCP/IP 패킷을 분석하는 툴이었다. 예전에 몇번 질문한 것도 결국은 이 것과 관련 된 것이었다. 추가적인 문제점은 운용 환경이 Windows였다는 것에서 시작해서, 결국은 Python 3로 포팅해야 한다는 것이었다.


간단한 변환

새롭게 알게 된 것은 python 2 스크립트를 3로 변환하는 툴이 있었다. 기본적으로 python 3를 설치하면 [python 3]\Tools\scripts에 설치 되어 있는 툴이다. 이를 이용하여 기본 변환을 하면 된다.



아래와 간단히 명령어를 입력하면 변환이 일어난다.

C:\> 2to3 captcp.py -w
view raw 2to3example hosted with ❤ by GitHub



미궁을 해매기

위와 같이 변환해도 Logical하게 문제가 발생하는 부분을 모두 처리해주지 못하기 때문에 바로 동작하지는 않는다. 결국에는 이 코드를 가지고 작동 시켜보면서 디버깅을 해야 하는 상황이었다. 이미 여러 이슈를 해결했지만, 최종 결과에는 이슈가 있었다. 테스트로 사용했던 동작은 statistic 옵션 이었다.

c:\>captcp statistic test.cap



하지만, 지속적으로 error가 발생하면서 이슈를 파악하기 어려웠다 이 부분을 같이 살펴 보면서 Logical한 이슈가 무엇인지 분석을 하였다. 


결과 부터 이야기 하면, python 3로 오면서 Object의 연산자 overloading에 대한 구현 부분이 바뀐 것이다. Object의 비교 연산자가 Override 구현이 정확하게 동작하지 않고 단순 주소 비교로 되면서 처리가 완료되지 못하고 오류가 발생하는 건이었다.


근본 원인이 밝혀 지니 수정 방향도 수립이 되었다. __cmp__가 적절하지 못하는 것이 예상되었고, googling해 보니 이미 관련된 설명[3]이 있다. 이를 기반으로 __eq__로 대체 구현하였더니 동작함을 확인할 수 있었다.



돌아보며

결국은 Python2의 결과물을 Python 3로 변환하는 것은 쉬운일이 아니다. 또한, Open Source의 특성 상 지원이 있을 수도 있고 없을 수도 있기 때문이다. 하지만 또 하나의 장점은 내가 직접 변환할 수도 있다는 것이다.


최종 결과물은 내 github repsitory[4]에 저장되어 있다. 원본 Project가 2016년 부터 멈추어 있고, python 3과 연계가 어떻게 될지 불분명해 보인다. 그래서, 원본으로 pull request를 보내지는 않을 예정이다. 대신, 내 repository에 유지해 보는 것이 여러 방향으로 괜찮지 않을까 하여 유지해 보려 한다.


사족이지만 방금 찾은 것인데, python 2.7은 2020년에 퇴역(EOL)한다[5].


[1] captcp, https://github.com/hgn/captcp

[2] dpkt, https://github.com/kbandla/dpkt

[3] cmp method in python 3, https://stackoverflow.com/questions/8276983/why-cant-i-use-the-method-cmp-in-python-3-as-for-python-2

[4] captcp for python 3, https://github.com/blcktgr73/captcp

[5] Python 2.7 will retire in..., https://pythonclock.org/





나의 기억 속의 Java

Java는 C/C++만 알고 있던 나에게는 새로운 언어라고 보다는 개념을 도입하는 언어였다. 이는 Java의 언어 형태가 C/C++과 매우 흡사하기 때문이다. 코드 일부만 보면, 어떤 언어인지 판단하기가 쉽지 않을 수도 있다. 처음 배울 때가 Java가 Public하게 처음 소개 될 때였다. 그 당시에는 Sun Microsystem에서 릴리즈 하였다. 대학원 당시 랩에서 Sun Spark 워크스테이션을 처음 접해 본 터라 컴퓨터를 만드는 회사에서 도입한 컴퓨터 언어라는 것이 신기하고 Object-Oriented 개념으로 만든 언어라는 것이 신기했다.


그리고는 , Java 1.2가 Java 2로 소개 되고, J2SE, J2ME와 같이 Profile을 가지고 소개되었다. 단말을 하였었기 때문에, 옆 부서에서 J2ME의 여러 모듈들을 포팅하는 것을 기억하고 있다. 이 당시는 J2ME라도 상당히 무겁고 응용도 많지 않은 상태여서 Mobile에는 적용이 어렵다는 생각을 많이 하였고, 심지어는 모바일에는 Java는 절대로 보편화 되지 못할 것이라는 나름대로의 판단이 있었ㄴ다.


다시 안드로이드를 시작하면서, Java로 어플리케이션을 작성하는 부분에 대해서 놀랐다. 그리고, 이야기 듣던 JNI로 C++단이나 커널과 연결되어 Platform을 구성하는 것에 대해서 많은 놀라울 수 밖에 없었다. 그리고도, 시간이 흘러 보니 내가 알고 있던 Java와는 많은 차이가 있었고 처음 부터 다시 다져봐야 할 이유가 충분하였다.


또 다시 시작.

Android를 하기 때문에, Java를 다시 봐야 하는 것은 자연 스러웠다. Python도 강좌를 통해서 익힌 터라 강좌를 찾았다[1]. 2가지 과정으로 되어 있었지만 첫번째 강좌만 들었다. 이후는 응용인데, Android에는 큰 도움이 되어 보이지 않아서였다. 전반적으로 IDE로 Eclipse를 쓰고 있어서 툴을 배우는데는 유용했다. 다른 언어와 유사한 데이터 타입, 연산자, 입출력, 루프 그리고 함수까지는 평이했고 C++을 했기 때무에 객체 지향관련 Class와 다형성까지 크게 문제가 없었다. Interface와 C++과 다른 부분들은도 예전과 크게 다르지 않았다고 느껴서 어렵지않았다. 하지만, 이 것을 마무리 하고나서는 많이 부족한 생각이 들었다.





책으로 보는 Java

결국은 책을 찾게 되었고, C++ 책의 같은 저자가 만든 책이 있는 것을 알고 그 책을 찾아 보았다. 이책은 Java 8기반으로 작성되어 있어서 Android를 기반으로 하고 있는 나도 더 도움이 되겠다 싶어 보게 되었다. 다 보고 난 후 총평은 새로운 개념들을 설명하면서는 정리가 좀 덜 된 듯 한 느낌을 들기는 하였다. 요리를 해야 하는 재로는 다 들어갔는데 잘 어울어지지 않는다는 느낌이었다. 물론, 내가 개념들을 깊이 이해하지 못해서이기도 하지만, 설명을 잘 하는 책이라면 충분히 그 느낌을 덜어주지는 않았을까 한다.


나의 관점에서 새로운 개념들은 Chapter 21부터 설명되는 Generic그리고 이를 활용한 Collection Framework였다. 이 후, Lambda와 Method 참조, 그리고 스트림까지이다. 특히, Android에서도 적용되는 Java 8의 신규 기능이라 할 수 있는 것은 Lambda와 Stream이다. 새로운 Android 코드들에는 이를 활용한 코드가 적용[3]되고 있으니, 반복해서 확인하고 몸에 익혀야 할 내용들이다.


Android와 Java

Android는 Java와 때려고 해도 때기 어렵다. Google이 Android 작성하는 언어으로 Kotlin을 발표하였다. 또한, Java의 현재 주인인 Oracle과 Android의 주인인 Google의 전쟁의 승자가 Oracle로 결정이 되어 더욱 암울해 보인다[4]. 하지만, 나는 여전히 처음 시작하는 언어로서 Java를 추천한다. 아직도 Java가 Android에서 계속 사용되어야만할 이유가 충분해 보이기 때문이다.

우선 Android 개발자 입장에서는 Java를 버릴 이유가 없다. 왜냐하면, 이미 Java를 기반으로 한 Android Phone들이 많이 팔렸고, 여기에 App들을 Java로 만들어서 배포한다. 극단적인 가정으로, Google이 Java를 포기하고 새롭게 Android2를 만든다고 하더라도 새로운 폰들이 바뀌는데는 상당한 시간이 걸린다. 아직까지 5년전 발표된 Kitkat까지 해야 94%휴대폰 커버(2018년도 1월 18일 기준)되니까. 비슷한 논리로 내년에 완전 Java를 사용하지 않는 플랫폼 만들어서 배포해서 유사한 시간이 걸린다고 하더라도 5년은 걸릴 것이다. 추가 참고 자료로 [5]를 보면, 시간 상으로 어떤 Version의 안드로이드 플랫폼들이 변화 하는지 볼 수 있다. 또한, 사람들의 스마트폰 교체 주기도 점점 길어 지고 있다. 이렇게 보면, 지금 Android가 가지고 있는 Market과 사용자들이 그렇게 쉽게 Java에서 다른 언어로 넘어갈까? 이 부분에 판단은 글을 읽으시는 분께 맏긴다.

공부라는 측면에서의 의견도 나는 Java를 계속 권한다. 위에서도 설명했듯이 Object Oriented Programming Paradigm을 근간으로 하고 있는 언어로서 이를 배우기 위한 최적의 언어이다. 그렇기 때문에 Java가 가지고 있는 여러 툴이나 도구이 아주 많다. 뿐만 아니라, 언어를 배우시고 배워야 할 Architecture 관련된 분야들이 Java를 기반으로 시작된 것들이 상당히 많다. Refactoring, Design Pattern 그리고 Unit Testing 등이 그 예이다. 그렇기 때문에, 이를 가장 잘 설명하는 책 및 Practice들이 Java를 기준으로 한 것이 차고 넘친다. 그리고, 사족으로 컴퓨터 언어 한두가지 정도는 더 하야 한다. 그렇기 때문에, Java로 시작해서 Java로 끝난다고 생각해서는 안되고, 여기서 필요에 따라 여기서 발전된 언어를 적어도 한 두개는 더 한다고 생각해야 한다.

그럼, Java는 없어질 언어인가요?

개인적으로는 C를 주로 사용했고, 거기서 C++, Java, Python 등의 다른 언어로 가지치기를 하고 있다. Java는 현재 정말 Popular하게 전개 되어 있는 프로그래밍 패러다임인 Object-Orient를 기반으로 만들어진 언어이다. 그리고, Android의 기반이 되고 있는 언어이다. 위에서도 이야기 했지만, 이를 바꾼다고 해도 시간이 소요된다. 그런 의미에서 Java는 위의 여러 사실을 바탕으로 Programmer의 First Language로 적극 추천할만한 언어이다. 물론 이것은 현재의 내 판단이고, 이는 또 바뀔 수 있다. 하지만, 적어도 5년 길면 10년까까지도 이 의견은 유효하리라고 판단한다.


[1] Java 배우기 Part 1(기본), http://www.credu.com/main/credu/user/course/zu_course_detail_R.jsp?p_subj=C69401

[2] 윤성우, "윤성우의 열헐 Java 프로그래밍", 2017년 7월

[3] Android Java 8 Support, https://developer.android.com/studio/write/java8-support

[4] 8년 전장 오크랄 웃고, 구글 울었다. http://www.zdnet.co.kr/news/news_view.asp?artice_id=20180328141031

[5] Android version history, https://en.wikipedia.org/wiki/Android_version_history



Python을 처음 들었을 때에는 Linux Shell Script 혹은 Windows에서 Bat 파일과 함께 Perl을 사용해서 업무 자동화를 주로 할 때였다. 이 때의 자동화는 Software 빌드를 자동으로 하는 업무가 주여서 주어진 내용으로 충분했고, Perl의 경우도 필요한 내용만 찾아서 사용하는 정도의 수준이었다. Python도 이와 유사항 언어였고 필요성을 느끼지 모해서 배우지 않았던 것이 사실이다. 


최근에 컴퓨터 언어의 Ranking들을 살펴 보다 보니, 순위가 엄청나게 높아져 있었다. 용처도 많고, 옆의 동료가 온라인 과정을 통해서 배우고 있고 이를 통해서 자신의 업무 자동화에 활용하고 있는 것을 보고 자극이 되어서 사내 온라인 강좌를 통해서 기본적인 내용을 듣게 되었다. 목표도 어렴풋이 사내 웹싸이트에 있는 정보를 모아서 주기적으로 보고하는 것을 주기적으로 해야 하는데, Web Page의 테이블에 있는 내용들을 지속적으로 손으로 정리해서 보고 하게 되면 과제 진행하는 2~3개월 동안 보고 하게 되면 업무 효율이 나지 않았다. 그래서, 반드시 자동화를 해야하기는 했는데 어떻게 해야할지 막막했다.



온라인 강좌로 시작하다.

내가 들었던 강좌는 멀티캠퍼스의 2개의 강좌[1-2] 였다. 첫번째 수강한 강좌는 활용 보다는 전체 내용을 처음 부터 하나씩 설명하는 구조였기 때문에 지루하였다. 하지만, 책을 보고 공부하는 것도 습관이 붙어 있지 않은 상태여서 매일 조금씩 강좌를 보는 것은 꾸준히 진도를 나가는 도움이 되었다. 컴퓨터 언어를 전혀 하지 않았다면 첫번째 구조와 같은 강좌가 도움이 될 것 같고, 이미 다른 언어를 알고 있다면 [2] 강좌가 응용 예가 더 많이 소개 되기 때문에 도움이 될 것이다. 두 개의 강좌에서 살펴 보면, 크게는 다음 항목들을 다루고 있다.


0. 설치, 환경 설정 및 IDE

어느 언어든 기본적인 환경 설정이 필요하다. Python도 다운로드 받아서 설치를 해야 한다. 또한, 개발을 편리하게 해주는 Integrated Development Environment (IDE)가 있다. 모든 강좌에서는 기본적인 Python 설치를 다룬다. [2] 강좌에서는 Python 개발자들이 상당히 많이 사용하는 PyCharm[3] 을 설정하는 법을 설명한다.


1. Basic Language

어떤 언어를 배워도 다루게 되는 기본 자료형(Default Data Type, 연산자(Operator), 변수(Variable), 표준 입출력, 제어문, 함수가 우선 이 부분에 해당되었다. [1]에서는 2~6장이 여기에 해당되고, [2]에서는 2~8장까지가 여기에 해당된다고 볼 수 있다.


3. OOP, Module 과 예외 처리

Python은 OOP를 지원한다. 하지만, 간략화 된 클래스, 상속과 다형성을 포함한다. [1]에서는 7장, 8장이 여기에 속하고 [2[에서는 16장에서 설명한다. 또한, 기능들을 분리하여 관리하기 위해 모듈 기능을 제공한다. 추가적으로 예외 처리 관련 항목도 설명한다.


4. 확장 기능

기본적인 개념을 바탕으로 파일 처리, XML, 네트워크, 데이터 베이스 뿐 아니라 그래픽 관련 모듈 설명도 한다. 특히, Tkinter는 Python이 설치되면 기본적으로 제공되는 기능으로 UI를 쉽게 구성할 수 있다. Python에서는 Regular Expression, 정규식도 많이 사용된다. 2개의 강의 모두 Regular Expression을 다루지만, [2[에서는 2개의 챕터를 할애해서 설명한다.


5. 응용

[2]의 강좌가 좀 더 응용에 집중하고 있다. 엑셀, JSON을 포함한 Open API 활용, Web Scrapping, 날짜 및 자동화 기능, 메일 발송/수신까지 광범위하게 다룬다. 위에서 설명한 특정 웹 페이지에 접속해서 정보를 받아 정리하는 기능이 Web Scrapping으로 볼 수 있는데, 내가 필요로 했던 자동화 기능도 바로 이를 활용하면 가능하였다.


아들에게 가르치기: Python for Kids

일주일에 한번씩 아이들이게 가르치는 기회가 생겼다. 방학에 중학교 1학년인 아들과 아들 친구과 관심을 보였고, 어떻개 진행할까 고민하다가 책[4]을 발견하였다. 원래는 영문판을 먼저 발견했다가 번역을 하려 하다가 번역본이 있다는 것을 알게 되어 이 책을 선정하였다. 강의 계획은 아래와 같았다.


12/09: Python 소개, 기본 설정. Ch1 책소개 Ch2

12/16: 복습, Ch3, 4: Data types & Turtle graphics

12/23: 복습, Ch5, 6 (if/loop)

12/30: 복습, Ch7, 8 (function, class)

01/06: 복습, Ch9, 10 (Built-ins and useful modules)

01/13: 복습, Ch11, 12 (Graphics), Project 논의

01/20: 복습, Ch13, 14 (Bounse Ball), Project 계획

01/27: 복습, Ch15, 16 (Game2)

02/03: 복습, Ch17, 18 (Game2)





한번에 2시간 혹은 2시간 30분 정도 소요 되었다. 중간에 쉬는 시간을 가지면서 했다. 복습을 시키면서 새로운 단원을 나갔고 실습 위주로 진행하였다. 이해하지 못하는 것은 이론 설명을 충분히 하였지만, 책에 포함된 코드를 이용하여 실습에 더 많은 시간을 할해했다. 그래서 인지, 두 아이는 큰 무리 없이 따라 왔었다. 이책이 좋았던 부분은 설명 자체도 실습이 가능한 구조여서 입력하여 결과를 볼 수 있었고, 마지막에 Game을 다루기 때문에 흥미를 이끌어 내기 쉬웠다.


추가적인 부분으로, PyCharm을 처음 부터 설치하게 해서 인터프리터 기능 보다는 코딩 개념으로 설명하였다. 강의, 실습도 2명이 하기 때문에 더 진도가 잘 나갔던 것 같다. 원래 계획으로는 위의 강습 후에 Project 같은 것을 할 계획이었지만, 시간 부족으로 진행하지는 못했다. 나중에 또 기회가 있다면, 프로젝트를 하면서 여러 명이 함께 기획하고 구현하고 발표하는 시간도 3주 정도 가져보면 더 발전이 있을 것으로 예상한다. 그렇다면, 총 12주 정도의 시간이 필요했다.


업무 자동화에 활용: Web Scrapping

Python은 C++/Java와는 다르게 인터프리터를 사용하는 언어이다. 내가 가장 먼저 사용해본 인터프리터 언어는 Basic이었다. 그 당시는 마치 지금의 Windows 명령어 프람프트(Cmd.exe) 와 유사한 인터페이스였다. 다른 것은 컴퓨터를 켜면 항상 그 화면이 떴고, 수행할 내용을 입력하고 얻는 방식, 즉 인터프리터 방식이 기본이었다. 옛날 방식의 기술이 항상 나쁜 것은 아니고 상황에 따른 선택이라는 생각이 든다. 즉, 이렇게 하게 되면 컴퓨터의 동작 방법을 몇가지는 알지 않더라도 컴퓨터 언어에 접근하게 해주는 것이 장점이 되고, 그래서 Python을 비전공자에게 권하게 된다고 생각된다. 고급 사용자의 경우는, 실행할 내용을 text파일로 저장해 놓는 Script도 사용할 수 있으니 이 또한 유연한 접근 방법이다. Android에서는 2.x를 사용하지만, 나는 우선 자동화와 추후를 위해서 3.x대를 선택하여 사용하였다.


위에서 설명하였듯이 Web 페이지에 접속해서 필요한 내용을 추출해 해는 것이라고 간단히 말할 수 있겠다. 내가 필요했던 업무도 사내 홈페이지들에 흩어 져 있는 우리 부서의 정보를 원하는 형태로 취합 정리하는 것이었다. 인트라넷 홈페이지는 로그인 처리가 필요했고 개별 링크에 관련 정보들이 흩어져 있었고, Java Script를 이용한 Dynamic Web이었다. 강좌에서 소개한 Library는 Beautiful Soup이였다. 이 라이브러리는 디테일한 컨트롤이 어려웠고, 사내 홈페이지에 접속하는 것이 매우 어려웠다. 결국 Googling을 많이 하다 보니, Selenium이라는 모듈을 알게 되었고, [5]에 포함된 내용과 Googling을 통해서 원하는 기능을 구현할 수 있었다.




돌아 보며.

새셈 느낀 것이지만 필요한 목적이 있으면 배움이 더 유용하다. 그래서, 업무와 연계 시키거나 혹은 다른 목적을 찾으면 좋다. 특히, 가르치는 것은 더 많은 배움을 동반한다. 현재는 이러한 목적을 넘어선 다른 것 또한 찾고 있다. 그것이 더 좋은 공부라는 것을 알기 때문이다.


[1] 파이썬으로 배우는 실전 프로그래밍, http://www.credu.com/main/credu/user/course/zu_course_detail_R.jsp?p_subj=C90113

[2] 파이썬을 이용한 자동화 스크립트, http://www.credu.com/main/credu/user/course/zu_course_detail_R.jsp?p_subj=CB6392

[3] JetBrains PyCharm, https://www.jetbrains.com/pycharm/

[4] 제이슨 R. 브리그스 et. al, "누구나 쉽게 배우는 파이썬 프로그래밍 (Python for Kids)", BJPUBLIC. 2013

[5] Ryan Mitchel, "Web Scrapping with Python", O'Reilly 2015

+ Recent posts