파이썬의 어려움

난데없이 1주일만에 파이썬 공부해서 GUI 프로그래밍을 해야 하니 참으로 어려운 일이다. C나 VB와 비교할 때, type이 실행시에 지정되니 편한 사람도 있겠지만 이것때문에 계속해서 헷갈리고 있다.

파이썬의 클래스는 말만 클래스지 완전한 클래스가 아니다. 심지어, 클래스 내부에서 참조할 때에도 항상 self를 붙여야 하고, 클래스 내부의 메소드를 정의할 때 항상 self를 인자로 넘겨받아야만 한다. 다시말해서, 메소드를 호출 할 때, 클래스 내부에서 사용하는데도 불구하고 self.methodName(a, b)라는 형식으로 self를 참조해야만 한다.



[각주:

1

]



VB는 써도 되지만, 안써도! 된다.

그리고.

myBmp = wx.Bitmap.LoadFile(filename, filetype)

이런식으로 불러올 수 없다. 당연하다면 당연한건데, 쓰다보면 불편하다. 선언도 없는데…

myBmp = wx.EmptyBitmap(1,1)

myBmp.LoadFile(filename, filetype)

이런식으로 가짜로 선언(?)한 후에 사용해야 한다.

  1. self는 VB에서의 me, C++에서의 this처럼 자기가 소속된 클래스를 가리키는 이름이다.

    [본문으로]

8 thoughts on “파이썬의 어려움

Add yours

  1. 1.파이썬이 엄격하다고 생각하지는 않습니다.

    다만 들여쓰기를 강제하는게 “제 마음에” 들지 않는다는 뜻입니다. self를 쓰는 것도 마찬가지로, “저는 불편”하네요. 그게 명시적으로 객체가 변경되고 있다는 사실을 알 수 있기 때문에 사용하는게 더 좋다고 생각합니다. 그러나 제 맘에는 안들어요.

    2.파이썬이 자유롭다는걸 부정할 생각도 없습니다.

    아무튼 private가 문법에 없다는 거죠. 자기가 원하는 방식으로 private을 만들어 쓰면 되는것도 맞고, 저도 그렇게 씁니다.

    3.그래서

    프로그램 만들기 귀찮다는 겁니다. 파이썬은 어쨌든 이번에 처음 배우는 언어이고, 배울 노력은 전혀 안하고 있습니다. 배울 시간도 없고 저는 전업 개발자가 아니라 일 끝나고 “쉬는 시간”이나 “퇴근후 집”에서 “취미”도 아닌 무려 “업무용” 프로그램을 만드는 개발자입니다. 파이썬이 그냥 “제 맘에” 안든다는 거지, 직관적이지 않다고 주장할 생각도 없고(직관적인거 인정합니다.) 생산성이 떨어진다고 주장할 생각도 없고(생산성 높은것도 인정해요.) 아무튼 solariser님의 파이썬에 관한 의견을 부정할 생각은 전혀 없어요.

    생산성이라면, 일단 제가 지금 처음 배우는데 당장 다음주까지 완성해야 하기 때문에 현재 상황에서 생산성이 매우 떨어진다는, 지극히 개인적인 입장에서의 생산성 저하 얘기를 할 수는 있겠네요. 물론 그게 파이썬이 갖는 생산성 저하를 지지하는 근거는 아닙니다. 그냥 제가 능력이 떨어져서 생산성이 떨어지는 것일 뿐이죠. 아무튼 근데 VB로 했으면 생산성이 떨어지지 않았을 거예요. 그건 이미 잘 아는 거니까요. VB가 좋은 언어라서가 아니라, 제가 그냥 지난 2년간 써봤으니까 그런거예요.

    제가 말하고 싶은건, 그냥 제 맘에 안드는 특징이 몇가지 있고, 지금 그 특징과 현재의 제 상황 때문에 파이썬 쓰기가 매우 짜증난다는 점입니다. 그게 장점인가 단점인가를 따질 생각도 없고, 파이썬이 나쁜 언어라고 주장할 생각도 전혀 없습니다. 쓸만한 언어예요. 못써먹을 것이면 제가 애초에 손댈 생각도 안하고 못한다고 버텼겠죠.

    제가 들여쓰기를 원래 잘 하긴 했지만, 아무튼 강제하는건 싫어요. (아님 VB처럼 100%자동이거나)

    원래 인간이라는 존재는 모든게 다 논리적이진 않잖아요. 이건 제 취향의 문제예요. 논리적 문제도 아니고 도덕적 문제도 아닌 단순한 취향의 문제죠.

    기획, 설계, 코딩, 디버깅, 테스트, 사용까지 혼자 다 해야 하는데 업무용 프로그램인거 보셨어요? 저는 지금 그런 경우이고, 아무튼 파이썬이 문제가 아니라 “내가 지금 파이썬을 잘 모르니까 짜증난다”가 문제입니다. 그냥 제 개인적인 문제이고, 파이썬이 그저 별로 맘에 들지 않을 뿐이예요. 내가 만든다면 이렇게 안만들겠어 – 라고 생각하긴 하지만, 그렇다고 뭔가 언어를 만들 실력도 시간도 의지도 없으며, 어차피 파이썬으로 개발 해야합니다.

    루비로 개발하라고 했어도 똑같은 얘기를 했을 거고, 코볼로 시켰어도 똑같은 말이 나왔을 거예요. 제가 그나마 할 줄 아는 C, C++, VB.net이 아닌 한 아마 그랬을 거고, 그나마도 C++에 MFC로 하라고 했으면 욕했을거예요.

    저한테 딱 맞는 언어인건 알겠는데, 지금 현재 상황에서 배우기 귀찮은 언어라는게 문제예요. 번거롭고 어려워요. 왜냐하면, 저는 지금 바쁘거든요. 그럼에도 불구하고 파이썬을 갖고서 뭘 해야돼요. 알고리즘은 머릿속에 다 있는데, VB로 하면 금방 하겠는데, 파이썬 이제 막 배워서 하려고 하니 답답하죠. 대체로 wxPython을 전혀 모르기 때문에 발생하는 답답함이긴 하지만, 저는 지금 Python+wxPython 환경에서 개발하니까, 그냥 그 둘을 하나로 생각합니다. 파이썬 잘하는 사람한테 설명해주면 한 10시간 정도면 다 만들거예요. 근데 저는 그걸 3개월째 하고 있어요.

    아무튼 이 글은 그냥 투덜대는 거라니까요…-_-;

    결론적으로 파이썬은 좋은 언어지만, 그냥 제 맘에 안들어요.

  2. 글을 너무 짧게 쓰니 오해가 발생하는 것 같군요.

    1. “파이썬은 업격 하다”

    많은 분들이 오해 하시는데, 전혀 아닙니다. 제가 주력하는 사용하는 언어는 C++, Java, Perl, Python 입니다. (사실 파이썬은 시작한 뒤로 perl은 손 놨지요 ㅋ) 저 넷중에서 파이썬이 가장 자유로우며 문법이 가장 적습니다.

    들여쓰기, self의 강요를 항상 말씀하시는데, 이것 두개만 가지고 파이썬이 엄격하다고 제단하는 것은 파이썬 입장에서는 서러운 상황입니다. 저 두가지는 이론적인 배경(네이밍 스페이스, 컴파일러) 때문에 그렇기도 하지만, 관례 적인 입장에서도 저렇게 하는 것이 옳다는 전제 하에서 출발한 언어 입니다. snowall님은 들여쓰기를 잘하시겠지요. 그런데 실제로 들여쓰기 따위는 개나 줘버려라 하는 사람들이 더 많습니다. (사실 들여쓰기 꼭꼭 지키는 사람 찾기가 더 힘듭니다.)

    더욱 참담한 현실은 들여쓰기의 제한 조건도 정확하게 모르는 사람이 많습니다. 난 탭이 싫어~ 하는데, 파이썬의 들여쓰기는 탭이 아닙니다. 글자 그대로 들여쓰기 입니다. 공백 한칸(스페이스 하나)만 해도 잘 됩니다. 본인의 취향에맞춰 일관성 있게 들여 쓰기 해서 사용하면 되는 언어 입니다. 애초에 들여 쓰기를 하지 않은 사람들에게 이것이 강제가 되니 피곤할지 몰라도 원래 들여쓰기를 잘하던 사람들은 별 고민할 꺼리가 없어야 하는게 맞습니다.

    self역시 꼭 self를 쓸필요는 없습니다. s도 되고, this도 되고 원하는 대로 사용할 수 있습니다. 다만 뺄수는 없습니다. 이 문제는 위의 들여 쓰기와 동일 합니다. 실제로 대형 프로젝트를 해보면 self, this가 붙어 있지 않으면 과연 이변수가 어디서 왔는지 찾아야 하는 경우가 종종 발생합니다. self의 존재로 인해서 명시적으로 객체가 변경되고 있다는 사실을 알 수 있기 때문에 사용하는게 더 좋습니다.

    2. “파이썬은 자유롭다”

    저 두가지 조건만 제외 하면 가장 자유로운 형태의 언어 입니다. 일단 구현체만 봐도, CPython, Jython, IronPython, PyPy등등. 이것이 가능한 이유가 극도로 제한된 문법 덕분입니다. 이렇게 만들어진 간략한 문법위에 프로그래머가 직접 추상성을 쌓아 올라가는 형태로 개발하는것이 파이썬입니다.

    예로 파이썬은 private가 없다고 하는데, 이것은 잘못된 생각입니다. Private라는 문법적 장치가 없는 것 뿐입니다. (글자 그대로 없지 않느냐 하면.. -_-) 자기가 원하는 방식으로 private하게 만들어서 쓰면 됩니다. 더욱 멋진 것은 public으로 쓰다가 수정 해야 할 때, 클래스만 수정 하면 됩니다. 만약 c, Java에서 퍼블릭으로 풀려 있는 프로퍼티에 접근하는 방식을 변경하려면 소스를 다 뒤져서, get, set으로 다 수정해야 합니다. python은 데코레이터만 살짝 붙여 주면 됩니다.(실제 파이썬 커뮤티에서도 이런 방식을 더 선호 합니다. 굳이 필요하지 않는건 get, set으로 하지 말고 필요하면 그때 바꾸자.) 애초에 private, const 를 강제하거나 java스타일의 get, set 지옥쪽이 더욱 엄격한 언어라고 보는게 맞습니다.

    3. “그래서?”

    사실 문제는 파이썬의 문법이 너무 간략하기 때문에, 대부분의 입문서나 관련 서적들의 내용이 문법의 설명에만 그친다는데 있습니다. 데코레이터, 제네레이터, 람다, 클로저, 메타 클래스.. 등등 의 파이썬의 철학을 들어 본 사람이 거의 없기 때문에 이런 문제가 발생합니다. 저런거 없이도 잘 쓸수는 있습니다만, 그건 파이썬 답게는 아닙니다.

    더 웃긴것은 저런 파이썬 적인 특징을 쓰면 코드가 더욱 직관적으로 변합니다. 대표적으로 하나 꼽으면 foreach문 입니다. (for in) 대부분의 언어는 for도 있고, foreach도 있지요. 그런데 파이썬은 foreach밖에 없습니다. 그러다 보니 대부분의 라이브러리가 foreach를 지원합니다. while(hasnext) 등의 상황과 비교해보면 천국이지요. (정확하게는 iterable합니다.)

    그러면 파이썬 따위가 뭔데 파이썬에 대해서 알아야 하는건데 라고 물으시면, 답은 생산성입니다. C, Java에 비해서 압도적인 생산성을 자랑합니다. snowall님에게 사실 딱 맞는 언어지요. 개발자도 아닌데, 이런 저런 프로그램을 만들어야 한다면 python이 알아야하고, 신경써야 하는게 거의 없기 때문에 답이 될수 있는 겁니다. 문제는 C, Java류의 언어와 페러다임이 전혀 다르기때문에, C, Java의 틀에서 접근하면 실패할 수 도 있습니다.

    PS. 뱀발로 wx.Bitmap.LoadFile(filename, filetype) 이건 C++이기 때문에 이렇게 호출 할 수 없는게 정답 입니다. 만약 LoadFile이 객체를 생성 한다면 객체의 소유권이 모호해 집니다. 일단 C++이니 저런식의 객체 생성은 복사 생성자를 이용해서 복사 하거나, 포인터를 넘기는 수 밖에 없습니다. 당연히 복사 생성성자는 성능에 문제가 있습니다. 객체를 생생해서 포인터를 넘겨 주면, 누가 관리할 것인가 하는 문제가 발생합니다. 받는 쪽에서 관리하는게 맞는데, 그러면 라이브러리를 사용하는 사용자에게 부담이 전가 되겠지요. 이런 저런 문제점이 발생할 가능성이 있다면 아예 없애 버리는게 정답 입니다. (그리고 정말 자주 사용하면 생성용 함수 하나 만들어서 직접 관리하는가…가 되죠. -_-)

  3. 파이썬에서는 바인딩이 동적으로 이루어지므로 물론 타입 지정이 무의미하죠. 저는 타입지정을 미리 하고 쓰는걸 더 선호하는 사람일 뿐입니다.

    파이썬에서는 공식적으로는 은폐가 안됩니다.

    http://docs.python.org/tutorial/classes.html#tut-private

    그리고 self참조 문제는 self를 참조하는게 그냥 제가 쓰기에 그저 불편하다는 거죠. 바꾸라는게 아니라. 실행중에 컨텍스트가 변하는 파이썬이니까 self를 참조하는건 당연합니다. 그것이 “잘못됐다”라든가 “나쁘다”고 주장하고 싶은건 아니예요. 그저 “내가 느끼기에 불편하다”는 것일 뿐입니다.

    wxwidgets의 문제이든 python의 문제이든, 음… 아무튼 저는 불편해요. 그거에 대해서 제가 wxwidgets이나 python에 기여할 생각은 없고 시간도 없으므로 고치라고 할 생각은 없습니다. 그저 불편하다고 생각할 뿐이죠.

    그래서 이 글은 그냥 투덜대는 글입니다. 저는 파이썬 언어 설계의 철학에 관한 깊이있는 이해도 없고, 프로그램을 만드는 데에 있어서 깊이있는 고민도 없이, 그냥 원하는 내용이 작동하기만 하면 되는 프로그램을 만들고 있기 때문에 원하는대로 작동하지 않는다고 투덜댄 것일 뿐입니다.

    파이썬은 그 존재를 알게 된 때부터 별로 안좋아했는데, 그 이유는 들여쓰기를 강요하기 때문이죠. (복사해서 붙여넣기 하면 스페이스를 탭으로 바꿔줘야 합니다.) “그게 바로 파이썬의 매력이다”라고 말하는 파이썬의 팬들이 있겠지만, 아무튼 그래서 별로 맘에 안들었어요. 물론 C나 C++이나 VB코딩할 때 들여쓰기 안하냐? 이렇게 물어보신다면, 딱딱 칸 맞춰서 합니다. (심지어 VB.net은 VS에서 강제로 칸을 맞춰놓죠. 그러나 언어의 스펙상으로는 들여쓰기 강제가 없습니다.)

    그래서, 처음부터 별로 좋아하지도 않는 언어를 갖고 왜 프로그램을 만들고 있느냐? 그렇게 물어본다면, 시켜서…입니다.

    위에서 파이썬을 쓰라고 하니 써야죠. 지금 3개월째 삽질중인데, VB.net으로 했으면 아마 2달쯤 전에 완성됐을거예요. 나중에 언젠가 “파이썬으로 개발 해봤음”이라고 이력서에 한줄 더 쓰고 면접보러 가서 자랑하려면 일단 해보는게 좋을 것 같아서 그냥 하기는 합니다.

    파이썬이 그렇게 생긴건 생긴거고, 저는 단지 파이썬이 맘에 들지 않을 뿐이고, 그래도 지금 이 프로그램은 파이썬으로 만들어야 하고, 그러니 블로그에 조금 투덜댄 것 뿐이예요.

  4. “난데없이 1주일만에 파이썬 공부해서 GUI 프로그래밍을 해야 하니 참으로 어려운 일이다. C나 VB와 비교할 때, type이 실행시에 지정되니 편한 사람도 있겠지만 이것때문에 계속해서 헷갈리고 있다.”

    1. 파이썬에서는 타입 지정이 무의미 합니다.

    “파이썬의 클래스는 말만 클래스지 완전한 클래스가 아니다.”

    2. 파이썬의 클래스는 완전한 클래스 입니다. 상속, 다형성, 캡슐레이션 등 모두 지원합니다.

    심지어, 클래스 내부에서 참조할 때에도 항상 self를 붙여야 하고, 클래스 내부의 메소드를 정의할 때 항상 self를 인자로 넘겨받아야만 한다. 다시말해서, 메소드를 호출 할 때, 클래스 내부에서 사용하는데도 불구하고 self.methodName(a, b)라는 형식으로 self를 참조해야만 한다.”

    3. 파이썬의 다이나믹스를 고려하면 일종의 등가교환입니다. 컴파일시에 결정되는 C하고는 달리 실행중에 컨테스트가 변하는 파이썬의 장점을 살리기 위해서는 어쩔수 없습니다. 그리고 엄격한 self의 적용이 가져오는 역기능은 타이핑 증가 외에는 없습니다.

    “그리고.

    myBmp = wx.Bitmap.LoadFile(filename, filetype)

    이런식으로 불러올 수 없다. 당연하다면 당연한건데, 쓰다보면 불편하다. 선언도 없는데…

    myBmp = wx.EmptyBitmap(1,1)

    myBmp.LoadFile(filename, filetype)

    이런식으로 가짜로 선언(?)한 후에 사용해야 한다.”

    4. 이건 wxwidgets의 문제 입니다. 원래 C++라이브러리입니다. 그럼 감이 오시겠죠. 왜 저린 식으로 구현되어 있는지. (아주 당연한겁니다. C에서는) wxPython은 이걸 파이썬에 붙여 놓은 것 뿐입니다.

  5. 구글에서 python self라고 바로 설명을 볼 수 있습니다. (무려 한글로 된.. -_-)

    나름 관심을 가지고 블로그를 구독 하고 있었는데, 실망입니다.

  6. 사실 scope를 생각한다면, class안에서 정의된 대상을 class안에서 쓰는건데 어디에 있는건지 모르고 “그게 뭐임?” 물어보는건 좀 이상하죠.

    물론 class바깥에 정의된 대상과 혼동의 여지가 있으므로 “여기에서 정의된 그 녀석”을 명확히 구분하도록 하는 효과가 있어서 그런 부분에서 엄격하다면 엄격한거겠지만 말이죠.

댓글 남기기

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.

Proudly powered by WordPress | Theme: Baskerville 2 by Anders Noren.

Up ↑

%d 블로거가 이것을 좋아합니다: