[Python101] 000. 파이썬 실행하는 법

파이썬 강좌를 시작하기전에 파일을 작성하고 실행하는 법에 대해 잠깐 짚고 넘어가야 겠다는 생각이 들었다.

0. 터미널

터미널은 윈도의 도스창처럼 명령을 타이핑해서 여러가지 동작을 수행하고 프로그램을 실행할 수 있는 환경으로, 컴퓨터에 접근하는 일종의 ‘단말기’와 같은 역할을 앱이다. 윈도에서는 “명령 프롬프트”로 불리고 흔히 “도스창”으로 이야기되는 비슷한 역할을 하는 녀석이 있다.

터미널을 실행하면 다음과 같은 모양으로 문자들이 표시된다. 특히 마지막에는 자기 컴퓨터의 이름과 로그인 계정 이름 뒤에 $가 표시된다.

Last login: Fri Apr 20 22:53:13 on ttys000
mymy-iMac:~ myUserID$

엔터를 칠 때마다 이 줄이 꼭 따라다니는데 이는 {컴퓨터이름}:{현재위치} {사용자이름}$ 의 모양이 된다. $는 프롬프트이며, 앞으로 이 글 (혹은 이 블로그 글의 거의 모든 강좌에서 터미널 명령을 이야기할 때) 표시가 되더라도 입력하는 것은 아니다.

1. 대화형 쉘

파이썬(Python)은 역시 python 이라는 이름으로 설치가 이미 되어 있으므로 실행해보도록 하자.

$ python
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

파이썬을 그냥 실행되면 “대화형 쉘” 형태로 실행이 된다. >>> 라고 표시되는 것은 파이썬의 프롬프트이며, 이 때 계산식이나 명령을 입력하면 바로 그 결과를 볼 수 있다. 몇 가지 수식을 입력해서 계산해보자. (아마 어떤 건 잘되는데, 나눗셈 같은 건 좀 이상하게 답이 틀리는 경우가 있을 것이다.)

대화형 쉘을 종료하려면 그냥 터미널 창을 닫거나, exit() 라고 입력한다. (괄호 열고 닫고가 있어야 한다.)

2. 스크립트 실행하기

파이썬의 대화형 쉘은 실제로 도움말 등의 정보를 얻을 때 유용하게 사용가능하다. 하지만 실제로 “재사용 가능한 프로그램”을 만드려면 코드를 작성하여 저장하고 이를 실행할 수 있어야 한다.

우선 편의상, 파이썬 스크립트의 저장 경로는 Documents 폴더 아래에 pys 라는 폴더를 만들어서 이곳에 저장하기로 했다.

만약  run_test.py 라는 이름으로 파이썬 스크립트를 작성했다면, 이는 터미널에서 다음과 같이 실행할 수 있다.

$ cd Documents/pys
$ ls
run_test.py
$ python run_test.py

1) cd 명령은 해당 폴더로 이동하는 명령이다. Doc… 까지만 치고 tab 키를 누르면 자동으로 완성해준다. 슬래시(/)는 그 아래 폴더로 더 들어갈 때 쓴다.

2) ls 명령은 폴더에 있는 파일 목록을 본다. 내 아이디 이름 앞에 현재 폴더 이름이 나오지만, 확실히 하기 위해 파일을 확인해 본다.

3) 파이썬 스크립트를 실행하기 위해서는 python {파이썬 파일 이름} 하고 명령을 주면 된다.

3. IDLE

터미널이 주는 초보자에 대한 공포감 때문에 IDLE은 좋은 대안이 될 수 있다. 물론 처음에는 가능한 ‘타이핑’을 많이 해보는 것이 매우 중요한데, 아무래도 실수들을 하다보니 계속해서 터미널에서 python …. 을 치게 되는 것이 좀 번거로울 수 있다.

파이썬은 자체적으로 개발 환경인 IDLE을 지원하고 있다. 그렇다고 뭐 엄청 대단한 것은 아니고…

  • 아주 간단한 텍스트 파일 편집 기능
  • 파이썬 문법에 따라서 색상 표시
  • 파이썬 문법에 따라서 자동으로 들여쓰기 해주기
  • 작성 중인 파일을 바로 실행해보기
  • 보다 예쁜 창으로 대화형 쉘 실행하기

정도의 기능을 제공하는데, 이정도면 매우 멋지다. IDLE을 실행하고자 하면 터미널을 열고 다음을 입력하면 된다. 그러면 새로운 IDLE 창이 뜨는데, 이 때 기존의 터미널 창을 닫아버리면 안된다.

$ idle

IDLE을 처음 실행하면 대화형 쉘로 동작하게 된다. IDLE은 입력받는 수식을 계산하거나 명령을 실행하는 작업을 실시간으로 할 수 있다. 그래서 계산기로 쓰기에도 좋다. IDLE을 가지고 좀 놀아보는 방법은 다음 링크에서 확인할 수 있는데, 꼭 들러서 조금 친해지길 권한다.

하루동안 IDLE 가지고 놀기

앞으로의 강좌는 위의 링크에서 하고 있는 질문, “IDLE을 닫고 나면 내가 정성들여 타이핑한 명령들을 다시 사용하지 못하는가”에 대한 그 다음 단계들을 제공한다. 또한 터미널 역시 상당하 자주 보게되는 화면이다. 원래는 흰바탕에 검은 글씨인데, 환경 설정을 통해서 기본 윈도 테마를 바꿔보도록 하자. 모양과 색상을 적절히 선택하고 “기본”을 클릭해서 터미널의 기본테마로 만들자. 개인적으로 Ocean 테마가 보기에 깔끔해보여서 애용한다.

IDLE과 조금 친해진다면 이제 진짜 강좌를 시작하면 될 것 같다.

[Python101] 파이썬을 배워 보자.

이 강좌는 양파엄마의 집중력 향상과 불안증 완화를 위해 기획되었습니다. 이 시리즈의 글을 양파 엄마에게 바칩니다.

개인적으로 파이썬을 매우 좋아한다. 내가 파이썬을 좋아하는 이유는 파이썬을 좋아하는 사람들이 파이썬을 좋아하는 이유와 비슷할 것이다. 그 중에서도 내가 파이썬을 좋아하는 이유를 굳이 꼽아보자면 다음과 같은 것들이 있다.

  • 배우기 쉽다. 파이썬의 문법이나 개념들은 상당히 쉬워서 초보자가 시작하기에 매우 좋다.
  • IDLE : 많은 사람들이 부족함과 아쉬움에 대해 토로하는 프로그램인데, 개인적으로 IDLE은 최소한의 텍스트 편집 기능, 텍스트 하이라이팅, 자동완성 등을 제공하는 더할 나위 없이 좋은 프로그램이다. 게다가 작성하는 코드를 바로 실행할 수 있고 무엇보다 상당히 가볍다. 따라서 전업 개발자가 아니라도 얼마든지 부담없이 접근할 수 있다.
  • 첫 번째와 두 번째 이유를 합치면 비 전문가가 쉽게 접근하여 쓸모있는 툴을 만들어 쓰기에 적합하다는 의미로 해석된다. 즉 분명히 생산성 향상에 기여하는 바가 있고, 개발 경험이 없는 사람이 개발 관련 개념이나 지식에 접근하기 가장 좋은 수단은 스스로 개발을 경험해보는 것이다. 따라서 IT 서비스 기획자라면 한 번 쯤 손을 대 볼만한 언어이다.
  • 왠만한 곳에서 다 돌아간다. : 윈도를 제외하고 거의 모든 시스템에는 파이썬이 기본으로 내장되어 있다. 윈도에서는 설치 패키지를 설치하기만 하면 된다. 그리고 파이썬이 설치되어 있는 시스템에서는 왠만하면 다 돌아간다.
  • 가볍다 : 파이썬 인터프리터도 가볍고, IDLE도 무척이나 군살없는 경량 (?) 개발환경이다. 게다가 파이썬은 그 독특한 문법 덕분에 (펄만큼이야 하겠냐만은) 어떤 문제를 해결할 수 있는 코드는 그 모양이 거의 유사한 형태로 수렴하고, 분량 역시 Java 등의 언어보다 작다. 코드량에서도 가볍다.

블랙베리로 이메일 보내고 받는 걸 성공한 여자친구(연애시절의 아내)에게 “파워유저 인증서” 같은 걸 만들어서 발부하는 지경에, 문득 “파이썬을 가르쳐보자.”는 결심이 섰다. 물론 지금 당장 파이썬으로 아내가 뭔가 멋진 프로그램을 만들 수 있을거라는 기대는 하지 않는다. 또 한편으로 끈기가 부족하기도 해서 과연 어느 정도까지 내가 생각하고 있는 과정을 함께 해 나갈 수 있을까 염려도 되지만, 나 역시 끈기는 부족하기에 ㅋㅋ 기초적인 내용만이라도 간단히 알려주고 싶다. 그래서 아내가 조금이라도 지루하거나 우울해할 틈에 집중해서 시간을 보낼만한 거리를 만들고… 혹시 모르잖아? 아내가 파이썬에서 시작해서 Objective-C로 옮겨 대박 앱을 개발해 낼지도…. 아니다 돈은 내가 벌어와야지.

어쨌거나 컴맹인 아내가 이를 계기로 컴퓨터와 조금 더 친해졌으면 좋겠다. 사진 편집에서 동영상 편집, 프레젠테이션 만들기 등등 알려줘야 할 게 너무 많은데 시간이 참 쉽게 나질 않는다. 어쨌거나 침대에서 나란히 이런 이야기들을 하는 게 참 어색하기도 할 것 같긴하다.

아무쪼록 앞으로의 강좌는 “Learn Python The Hard Way”로부터 많은 내용을 참고했다. 예제의 많은 부분 역시 해당 강좌에서 따 온 것을 쓸 예정이다. (난 그리 창의적이진 못하다.) 대신에 Learn Python The Hard Way는 거의 기초 지식이 없는 완전 초보가 접근하기에는 부족해 보이는 부분도 많고 전적으로 본문이 영어로 되어 있어서 가능한 쉽게 구성해 보고자 한다.

처음에는 무슨 말인지, 뭐가 뭔지 모를수도 있겠지만 하다보면 “익숙해지고” 익숙해지면 자연스럽게 그 의미들을 알게 될테니 일단 시작해 보겠다.

  1. 환경은 Python 2.7.1 , OSX 10.7 을 기준으로 한다. (설치 과정은 다루지 않는다.)
  2. 터미널에 대한 의존도가 좀 있다. 터미널 사용에 관련된 글은 아마 불가피하게 강좌에 포함될 예정이다.

 

OSX 라이언에는 이미 파이썬이 설치되어 있으므로, 별다른 준비는 필요치 않다. 대신 2가지 정도를 미리 준비해 두자.

1. Documents 폴더 아래에 pys 폴더를 만들어 둔다. (이는 터미널에서 입력해야 하는 명령을 가능한 한 통일해보기 위해서이다.)

2. 경우에 따라 텍스트 에디터를 사용해야 할 경우가 있다. 텍스트 에디터의 설정을 “일반 텍스트”를 기본으로 놓고, 글꼴을 고정폭 글꼴인 Menlo 나 Monaco 등으로 바꾼다.

윈도 사용자의 경우에는 파이썬 2.x를 설치할 것을 권한다. 이 때 환경 변수 설정을 꼭 해줘야 한다. (대부분의 설치 가이드가 이 내용을 다루고 있을 것이다.)

 

Vim 에서 파이썬 스크립트 바로 실행하기

…라고 제목을 쓰면 Vim을 파이썬 IDE로 탈바꿈 시키는 위대한 플러그인 들을 사용하는 방법을 말하는 것 같아서 약간 낚시 같지만, vi 쓰기 시작한지도 얼마안되는데 이런 플러그인 들은 찾기도, 설정하는 것도 어려워서 포기.

사실 파이썬 코드 작성하는데는 IDLE이 그리 부족하다고 생각하지도 않지만, 그래도 왠지 vi에 애착이 가기 시작하는데, 작성한 코드를 따로 실행하는 게 너무 번거롭다. 따라서 해결책은 현재 편집중인 스크립트를 저장하고 실행하는 명령을 다른 키에 맵핑해주면 된다는 것.

:map <F2> :w<Enter>:!python %<Enter>

라고 실행해주고 일단 한 번 파일을 저장한 후, F2 키를 눌러주면 끝. %는 현재 편집중인 파일의 파일 이름을 말한다. MacVim에서는 Vim의 명령 줄 아래로 결과가 출력되는 것을 볼 수 있다.

[Objective-C] CGD를 사용한 싱글톤 구현하기 (공유 인스턴스)

어떤 클래스의 인스턴스를 공용으로 만드는 것은 사실 알게 모르게 많이 사용하고 있는 패턴이다. 예를 들어 [NSFileManager defaultManager] 라든가 [UIApplication sharedApplication], [NSNotificationCenter defaultCenter] 같은 것들이 공용 인스턴스가 될 것이다.

이는 싱글톤이라는 패턴이라고 하는데, 그러니까 단 하나만 존재한다는 뭐 그런 의미겠지. 암튼 싱글톤을 만드는 방법은 좋은 점도 있겠지만 글로벌하게 접근하는 객체를 위해서 만들기에는 좀 부담스럽지 않은가 하는데, 아래와 같은 방법을 통해 (이는 전통적인 싱글톤 구현방법은 아니라고 한다.) 손쉽게 만들 수 있다. 이는 코드를 그대로 가져다 붙이기만 하면 되고, 빠르고, ARC의 적용을 받으며, 멀티스레드 환경에서도 안전하게 동작한다.

+(id)sharedInstance
{
    static dispatch_once_t pred = 0;
    __strong static id _sharedObject = nil;
    dispatch_once(&pred, ^{
        _sharedObject = [[self alloc] init];
        });
    return _sharedObject;
}

싱글톤에 대한 애플 개발자 문서의 설명은 다음과 같다.

싱글톤 클래스는 애플리케이션에서 얼마나 요청하든 상관없이 하나의 인스턴스만을 만드는 클래스이다. 주로 앱의 자원에 액세스하는 글로벌 인터페이스를 만드는데 사용될 수 있다. 예를 들어 다른 객체에 사운드를 제공하는 클래스를 만들었다면 이를 싱글톤으로 활용하면 된다.

[Objective-C] 오토릴리즈 풀

오토릴리즈 풀

오토릴리즈풀은 연기된 release 메시지를 보내는 매커니즘이다. 이는 객체를 양도하되 즉시 해제되지 않기를 원할 때 사용하는 방법이다. (예를 들면 메소드를 통해서 생성된 객체가 이런 경우에 해당된다.) 보통의 경우에는 오토릴리즈 풀을 생성할 필요가 없지만, 이렇게 해야하는 경우나 이렇게 하는 편이 좋은 경우는 있을 수 있다.

오토릴리즈 풀에 관해

오토릴리즈 풀은 NSAutoreleasePool의 인스턴스로 autorelease 메시지를 받은 객체들이 모이는 풀이다. 이곳에 모인 객체들은 오토릴리즈 풀이 메모리에서 해제될 때 release 메시지를 받게 된다. 오토릴리즈 풀은 다른 오토릴리즈풀을 담을 수 있는 것처럼 보이는데, 실질적으로는 이들은 스택처럼 동작한다. 만약 새로운 오토릴리즈 풀을 생성한다면 이는 기존의 오토릴리즈 풀 내에 포함되는 것이 아니라 오토릴리즈 풀 스택의 맨 위에 추가된다. 만약 어떤 객체가 autorelease 메시지를 받는다면, 이 객체는 최상위의 오토릴리즈 풀에 들어가게 된다.

코코아는 기본적으로 하나의 오토릴리즈 풀이 사용될 수 있다고 가정한다. 만약 사용가능한 오토릴리즈 풀이 없다면 오토릴리즈 객체는 release 메시지를 받지 못하고 메모리릭이 발생하게 된다. 따라서 풀이 없는 상황에서 autorelease 메시지를 보내면 코코아는 에러를 띄운다. 앱킷이나 UI킷 프레임워크는 각각의 이벤트 루프의 시작점에서 자동적으로 풀을 생성한다. 하지만 다음의 경우에는 별도의 오토릴리즈 풀을 만들어야 한다.

  1. 명령줄 프로그램과 같이 UI킷 혹은 앱킷을 사용하지 않는 프로그램을 만들 때. 앱킷을 사용하지 않는 파운데이션 기반 프로그램의 템플릿은 main 함수에서 오토릴리즈구문을 명시해주고 있다.
  2. 많은 양의 임시 객체를 사용하는 루프를 쓸 때. 만약 루프 안에서 임시 객체를 만들어 쓸 때 루프 속에 오토릴리즈 풀을 만들면 이는 루프를 돌면서 사용하는 메모리의 최대치를 낮게 제어할 수 있다.
  3. 다른 스레드를 만들 때, 오토릴리즈 풀을 생성한다. 스레드가 실행되면 가능한 먼저 오토스레드 풀을 만들어야 한다. 그렇지 않으면 메모리가 누수될 여지가 생긴다

NSAutoreleasePool 객체를 만들 때는 alloc, init 을 통해 생성하고 폐기시에는 drain 메시지를 보낸다. 오토릴리즈 풀에 autorelease 나 retain을 할 경우에는 예외가 발생한다. 오토릴리즈 풀은 생성된 루프나 함수 내에서 폐기 되어야 한다. 또한 객체의 인스턴스 변수에 대해서는 오토릴리즈 풀을 생성할 필요도 없고, 보통 하지 않는다.

로컬 오토릴리즈 풀 사용하기

많은 프로그램에서 오토릴리즈되는 임시 객체를 생성한다. 이러한 객체는 풀이 비워질 때까지 메모리에 들어있게 되는데, 로컬 오토릴리즈 풀을 사용하면 이러한 임시 객체가 사용하는 메모리의 최대치를 제한할 수 있게 된다. 풀이 비워질 때 임시 객체들은 릴리즈되고, 이들 객체는 다시 해제되어 메모리 사용량을 줄여줄 수 있다.

NSArray *urls = <# file url의 배열 #>;

for (NSURL *url in urls) {
    NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
    NSError *error = nil;
    NSString *fileContents = [[[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error] autorelease]
    /* 이러한 객체를 처리한다 */
    [loopPool drain];
}

만약 루프 내의 오토릴리즈 풀 내에서 생성한 객체를 오토릴리즈 풀을 비운 후에도 유지하고 싶다면 명시적으로 retain 한다. 이렇게 명시적으로 retain 한 객체는 오토릴리즈 풀을 비운 이후에 다시 autorelease 메시지를 보내 오토릴리즈 객체로 만들어서 외부로 반환할 수 있다.

오토 릴리즈 풀 내에서 다른 오토릴리즈 풀을 생성하는 경우 이 들은 “nested” 되었다기 보다는 스택에 쌓이는 방식처럼 동작한다. 이 오토릴리즈 풀 스택의 최상위에 있는 풀은 현재 오토릴리즈 풀이다. 만약 스택의 중간에 있는 오토릴리즈 풀을 비우면 그 위에 있는 모든 풀들도 비워진다.