2013년 6월 9일 일요일

Python에 관해서

Python을 써야하는 이유?

 현재 성숙한 C와 C++, 새로운 Ruby, C#, Lua, Enterprise 분야에 넓게 퍼진 Java와 같이 많은 language들이 존재하지만, 이를 선택하여 습득하는 것은 여전히 어려운 과제라고 할 수 있다. 모든 상황에 맞는 단 하나의 language는 존재하지 않지만, programming에 대한  수 많은 문제를 해결하거나 program을 배우기 위해서는 Python이 꽤나 좋은 선택이 될 수 있다. 전 세계에 Python을 사용하는 programmer들은 수 만명 이상이며 매년 증가하고 있는 추세이다.

 Python은 진정한 cross-platform language로써 Window, Linux/UNIX, Macintosh 등등의 platform에서 동일하게 동작한다. 또 Python은 소규모 application들이나 prototype들을 빠르게 개발하는데 사용할 수 있으며, 대규모 program으로 확장할 수도 있다. Python에는 쉽게 사용할 수 있는 GUI toolkit, web programming library들 등등을 포함하고 있으며 무료로 사용이 가능하다. 이와 같이 다양한 이점들이 있어서 새로운 사용자들이 점점 늘어나고 있다.

Python의 이점은?

 Python은 1990년대에 귀도 반 로썸에 의해 개발된 현대적인 programming language 이다. (유명 코메디 극단의 이름을 따서 이름을 정했다고 한다.) Python이 모든 application에 있어서 완벽한 것은 아니지만, 지니고 있는 장점들이 다양한 상황에 대해서 good choice로 만들어 주고 있다.

Python은 사용하기 쉽다.

 기존의 language들에 친숙한 programmer들은 Python이 배우기 쉽다는 것을 알 수 있을 것이다. loop, 조건문, 배열 등과 같이 모든 친숙한 구조들을 포함하고 있지만 Python은 이들 대부분을 더 쉽게 사용할 수 있다. 왜 인지에 대한 몇 가지 이유를 여기에 기술하였다.
type들은 변수가 아니라 객체들로 연결된다. 변수는 어떤 type 값도 할당 받을 수 있으며, list는 다양한 type의 객체들을 포함할 수 있다. 이는 일반적인 type 선정이 필요하지 않으며, 당신의 code가 미리 정의된 type들에 구속되지 않는다는 것을 의미한다.
Python은 매우 높은 수준의 추상화로 동작한다. 이는 Python language 구성 방식과 Python 배포판에 포함된 많은 표준 code library에 대한 결과의 일부이다. 이로 인해 web page를 download하기 위한  program을 두세 줄로 작성할 수도 있다.
문법 규칙이 매우 단순하다. 물론 Python 전문가가 되려면 시간과 노력이 필요하지만, 초보자들도 유용한 code를 빠르게 작성할 수 있을 만큼 Python 문법은 충분히 이해하기에 단순하게 되어 있다.

Python은 빠른 application 개발을 위한 suite들을 잘 갖추고 있다. Python으로 program을 작성하면 C나 Java로 작성할 때보다 시간을 1/5로 단축할 수 있으며, C로 작성한 code들보다 line 수가 1/5로 줄일 수 있다. 물론 대부분이 for loop로 정수 연산을 수행하는 숫자 algorithm으로 된 특정 application에 있어서는 생산성이 낮아질 수도 있다. 하지만 일반적인 application에서는 생산성이 매우 높아질 수 있을 것이다.

Python은 표현력이 강하다.

 Python은 매우 표현력이 강한 language이다. 표현력이 강하다는 것은 Python 단일 line code는 대부분의 다른 language들의 단일 line code보다 더 많은 것을 표현할 수 있다는 것을 말한다. 보다 표현력이 강한 language가 주는 이점은 명백하다. 당신이 작성해야할 line들이 적어지므로 더 빨리 project를 완료할 수 있다는 것이다. 또한 더 적은 line의 code가 주는 이점은 program을 유지보수하고 debug하기가 더 쉬워진다는 점이다.
 Python의 표현력이 code를 어떻게 단순화할 수 있는지에 대해서는 var1과 var2 두 변수의 값을 교환하는 code를 통해 알아볼 수 있다. Java와 같은 language에서는 이를 수행하기 위해서는 3 line의 code가 있어야 하며 추가적인 변수도 필요하다.

int temp = var1;
var1 = var2;
var2 = temp;

temp 변수는 var2에 대입하기 위한 var1의 값을 저장하기 위해 필요하며, 이후 저장된 값을 var2에 대입한다. 과정 자체는 그렇게 복잡한 것은 아니지만, 이 3 line을 읽고 교환이 되는 과정을 이해하는 것은 노련한 coder들이라고 해도 어느정도 머리를 써야한다.
 그에 반해서 Python으로 동일한 교환 과정을 하나의 line으로 표현할 수 있으며, 값의 교환 방식도 더 명확하게 보여준다.

var2, var1 = var1, var2

물론 위의 예제는 매우 단순한 것이지만, 이 language를 사용한다면 동일한 이점을 얻을 수 있을 것이다.

Python은 가독성이 뛰어나다.

 Python의 또 다른 이점은 읽기가 편하다는 것이다. 당신은 물론 programing language는 computer에게만 읽혀지는 것이라고 생각할 수 있겠지만, 사람도 마찬가지로 code를 읽어야 한다. 아마 당신이 가장 가능성이 높겠지만, 이후에 누군가가 당신의 code를 debug하거나 유지보수하고 수정해야 할 수도 있을 것이다. 이 상황들에서 code가 읽고 이해하기 쉽다면 이같은 일을 하기에 훨씬 수월할 것이다.
 이해하기 쉬운 code는 debug, 유지보수, 수정을 하는데 있어서 이점을 가진다. Python의 주된 이점의 특징은 들여쓰기의 사용이다. 다른 language들과는 달리 Python은 code block의 들여쓰기에 대해서 강력하게 규제를 하고 있다. 이같은 규제가 좀 이상할지는 몰라도 당신의 code를 항상 매우 읽기 쉬운 형태로 만들어주는 이점이 있다.
 하나는 Perl, 다른 하나는 Python으로 작성된 짧은 program 둘이 여기 있다. 둘 다 숫자로된 동일한 크기의 두 list들의 값을 받아 각각을 쌍으로 합해서 반환하는 program이다. 나는 Python code가 Perl code보다 더 읽기가 쉽다고 생각이 된다. Python code는 깔끔하게 보이는 데다가 이해하기 어려운 기호들도 훨씬 더 적어 보이기 때문이다.
# Perl version. 
sub pairwise_sum {
    my($arg1, $arg2) = @_;
    my(@result) = ();
    @list1 = @$arg1;
    @list2 = @$arg2;
    for($i=0; $i < length(@list1); $i++) {
        push(@result, $list1[$i] + $list2[$i]);
    }
    return(\@result);
}


# Python version.
def pairwise_sum(list1, list2):
    result = []
    for i in range(len(list1)):
        result.append(list1[i] + list2[i])
    return result

두 code들은 동일한 동작을 하지만 가독성 측면에서는 Python code가 더 낳다.

Python은 기본적으로 완전한 library들을 포함한다. - [건전지 포함"Batteries included"]

 Python의 또 다른 이점은 건전지 포함"Batteries included"이라는 기본 개념에 따라 library들을 포함하고 있다는 것이다. 당신이 Python을 설치하기만 해도 추가적인 library들을 설치하지 않아도 될 만큼 실제 작업을 위해 필요한 모든 것이 포함되어있다. 왜냐하면 Python standard library가 email, web page, database, operating system call, GUI 개발 등등을 처리할 수 있는 module들을 포함하고 있기 때문이다.
 예를 들면, 단 두 line의 Python code로 directory 내에 있는 file들을 공유할 수 있는 web server를 작성할 수도 있다.

import http.server
http.server.test(HandlerClass=http.server.SimpleHTTPRequestHandler)

 network 연결들과 HTTP를 처리할 수 있는 library는 이미 Python에 포함되어 즉시 사용할 수 있으므로 따로 설치할 필요가 없다.

Python은 cross-platform language이다.

 Python은 또한 훌륭한 cross-platform language이다. Python은 Windows, Mac, Linux, UNIX 등등의 다양한 platform들에서 동작한다. 왜냐하면 Python은 해석형(interpreted) language이므로 Python interpreter(해석기)를 가진 platform이라면 동일한 code가 동작된다. 그리고 현재 거의 대부분의 platform들이 Python interpreter를 가지고 있다. 심지어 Java(Jython), .NET(IronPython) version도 제공되어 다양한 환경에서 Python이 동작할 수 있게 해준다.

Python은 무료다.

 Python은 무료이기도 하다. Python은 원래부터 open source model로 개발되어 무료로 사용이 가능하며 앞으로도 계속 그러할 것이다. 당신은 실제로 어떤 version의 Python을 down하고 설치하여 상용이나 개인용 application을 개발하더라도 이에 대한 대가를 지불할 필요가 없다.
 어떤 이들은 지원 미비와 유료 고객 사례에 부족에 따른 우려로 인해 free software을 여전히 경계하기도 한다. 하지만 Python은 Google, Rackspace, ILM, Honeywell 등의 저명한 회사에서 business의 주요 부분에 사용되고 있다. 이 회사들뿐만이 아니라 다른 많은 회사들도 Python의 안정성, 신뢰성이 높다는 것과 전문가들이 많은 사용자 community에서 활발한 활동들을 통해 지원이 확실한 제품이라는 것을 인식하고 있다. 만약 당신이 어려운 Python 질문을 가지고 있다면 대다수의 기술지원 통화로 지원을 받는 것보다 Python internet newsgroup에서 더 빨리 해결책을 찾을 수 있을 것이다. 여기에서 얻을 수 있는 해결책은 무료에 정확도가 높다.


Python은 쉽고, 표현력도 강하며, 뛰어난 가독성에 풍부한 기본 library들을 가지고 있으며, cross-platform에 open source이기도 하다. 속셈이 뭐냐고 묻는다면 그저 개발에 관심을 가진 당신에게 강력한 도구가 되기 위해 탄생한 점이라는 것이다. ^^

Python의 단점은?

 Python이 많은 이점을 가짐에도 불구하고 모든 것이 완벽한 language는 아니다. Python이 당신의 요구사항에 맞는지 결정하려면 Python의 단점도 고려해야 한다.

Python은 고속 language가 아니다.

 Python은 완전히 compile되는 language가 아니므로 실행 속도에 대해서 단점을 가지고 있다. Python에서는 완전히 compile하는 대신에 code를 Python interpreter가 실행할 수 있도록 먼저 내부 byte-code 형태로 semi-compile한다. Python에서는 C로 작성된 program에 준하는 속도와 효율적인 implementation들을 가지기 위해서 정규 표현식(regex)을 사용한 문자열 parsing 등과 같은 몇 가지 작업들이 존재한다. 그렇지만 대부분 Python을 사용하면 C와 같은 language를 사용하는 것보다 느린 program이 된다. 여기에서 당신이 명심해야 할 것은 대다수의 application들에게 있어 현재의 computer는 다 쓰지 못할 만큼의 연산 power를 가지고 있으므로 program의 속도는 그렇게 중요하지는 않다는 것이다. 오히려 개발 속도가 더 중요한데, Python program들은 일반적으로 더 빠른 개발의 이점을 가지고 있다는 것을 명심해야 한다. 추가적으로 Python은 CPU 연산에 집중적인 program을 수행하 위해 C나 C++로 작성된 module들로 확장하기가 편리하다는 특징이 있다.

Python은 모든 library를 가지고 있지는 않다.

 Python이 훌륭한 library들의 collection을 포함하고 있으며, 더 많은 library들을 사용할 수 있지만, 이 분야에 있어서 최고는 아니다. C, Java, Perl 과 같은 language는 Python이 제공하지 않거나 선택 폭이 좁은 library들에 대해서 더 폭 넓은 library들의 collection들을 가지고 있다. 하지만 이런 경우는 상당히 한정되어 있으며, Python의 확장 기능을 통해 C와 다른 language들에 존재하는 library들을 사용하기가 용이하다. Python의 library는 거의 대부분의 computing 문제에 대한 지원이 훌륭한 편이다.

Python은 compile 시에 변수 type을 점검하지 않는다.

 몇몇의 language들과 달리 Python의 변수들은 integer, string, class instance와 같이 다양한 object들을 참조하는 label과 같다. 이는 해당 object들 자체는 type을 가지고 있다고 해도 이를 참조하는 변수는 특정 type에 묶여있지 않다는 것이다. 바람직하지는 않지만 변수 x가 하나의 line에서는 string을 참조하고 다른 line에서는 integer를 참조하도록 사용하는 것도 가능하다.
>>> x = "2"
>>> print(x)   # x는 string "2"
'2'
>>> x = int(x)
>>> print(x)  # 이제 x는 integer 2
2

 Python이 변수가 아니라 object에 type을 두고 있다는 것은 interpreter는 당신이 변수의 type을 잘못 지정했는지 점검을 하지 못한다는 것이다. 만약 당신이 count라는 변수를 integer로 지정하고 string 값 "two"를 할당한다고 하더라도 Python은 이를 지적해주지 않는다. 이런 특징으로 인해 추가적인 code 점검이 필요한 것은 기존의 coder들에게 단점으로 지적되고 있다. 하지만 이런 error들은 일반적으로 찾아서 수정하는 것이 쉬우며 Python의 test 기능들은 type error를 피할 수 있도록 지원을 하고 있다. 대부분의 Python programmer들은 이에 대해 역동적인 typing의 유연성으로 대하고 있다.

Python 3를 배워야 하는 이유?

 Python은 매년 발전하고 있다. 현재는 3.x version까지 나와 배포되고 있다.(하지만 많은 library나 site들에서 사용하는 version은 2.x version이다.)
 원래는 Python 3000 알려진 Python 3는 Python의 역사에서 최초로 하위 호환성을 깨는 최초의 version이라는 것을 주목하기 바란다. 이는 이전 version의 Python에서 작성된 code들은 Python 3에 맞게 변경하지 않으면 동작하지 않는다는 것을 의미한다. 예를 들면, 기존 version Python의 print 문은 argument에 괄호를 씌우는 것이 요구되지 않는다.

print "hello"

Python 3에서 print는 함수(function)이고 괄호가 요구된다.

print("hello")

 왜 기존의 code의 호환성을 희생을 감수하면서까지 이렇게 변경을 하는지 의문을 가질 수 있을 것이다. 어떤 language라도 이런 변화는 큰 모험이므로 Python의 core 개발자들은 신중하게 이 주제에 대해서 고려했었다. Python 3의 변경사항들은 기존 code와의 호환성을 깨는 것이지만, 변경되는 것들은 그렇게까지 크지는 않고 이 language의 일관성, 가독성, 명료성을 더 개선한다. Python 3는 모든 것이 다시 작성된 language는 아니며 면밀한 검토에 의한 결과물이다. 또한 core 개발자들은 기존의 code를 Python 3로 안전하고 효율적으로 이전할 수 있는 전략과 도구들의 제공에도 신경을 쓰고 있다.
 Python 3를 배워야 하는 이유를 다음과 같이 들 수 있다. 현재 최고의 Python이며 project들을 전환한다면 개선사항에 대한 이점을 가질 수 있다. 향후에는 Python 3를 더욱 많이 사용하게 될 것이다. 만약 당신이 아직 전환하지 못하는 library가 있다면 현재는 Python 2.x를 사용해야 할 것이다. 하지만 Python을 배우기 시작하였거나 신규로 project를 시작한다면, Python 3를 사용하는 것이 좋을 것이다. 굳이 더 나은 것 뿐만이 아니라 Python 3은 미래이기 때문이다.

요약

 Python은 현대적이고 고수준 언어이며 많은 기능들을 가지고 있다.

  • 역동적인 typing
  • 단순하고 일관성이 있는 문법과 의미
  • Multiplatform
  • 설계가 잘된 design과 진보된 기능들
  • 고수준의 module화 되어 있다.
  • 빠른 개발과 대규모 programming에 적합하다.
  • speed가 그렇게 느리지는 않지만 고속을 위해 C/C++ module들로 확장이 용이하다.
  • 다양한 GUI toolkit들을 쉽게 접할 수 있다.
  • 지속성 object storage, 고급 hash table, 확장형 class 문법, universal 비교 함수 등과 같은 고급 내장 기능들.
  • 수치 연산, image 편집, user interface, web scripting 등과 같은 강력한 내장 library들.
  • 활동이 활발한 Python community에 의한 지원
  • 다른 language들과의 통합을 통해 서로의 약점을 보완하고 양쪽의 장점을 취할 수 있게 해준다.

이제 부터 Python에 대한 여정을 시작해보고자 하니 많은 이들이 이 글을 통해 도움을 얻었으면 하는 바램이다.