본문 바로가기

Programming/Python

[파이썬 프로그래밍] 18화 이름공간과 스코핑룰(scoping rule)

[파이썬 프로그래밍] 18화 이름공간(namespace)과 스코핑룰(scoping rule)





 화 '아저씨'를 혹시 보셨나요? 꾀 오래전 영화인데 그 영화의 마지막 하이라이트 부분에서 주인공

원빈이 악당들에게 하는 대사가 있습니다 바로 이것이죠.


"금이빨 빼고 모조리 씹어 먹어줄께"


왜 갑자기 이런 얘기로 시작하냐면, 파이썬 공부할때도 이와 같은 감정으로 입문하게 된것입니다.

저 대사보다 조금 더 냉혹하다면, '뼈까지 씹어먹어줄께' 라는 대사를 쳤었다는 ㄷㄷ;;



아무튼 파이썬 프로그래밍 정리하는게 벌써 18화까지 왔습니다... 사실 이정도로 글을 쓸거라고 

예상 못했습니다. 그냥 간단하게 정리하고 끝내려고 했던게 생각보다 꾀 많이 쓰고 있네요.

문제는 아직 갈길이 한참 남았다는거죠. 게임도 만들고 데이터분석도 하고 문법을 떼고 실전 미니 프로젝트

도 진행해야 겠지요?


뭐, 거기까지 과연 제가 연재할수 있을지는 모르겠습니다만...


아무튼 강좌는 아니지만 혼자 정리하는 파이썬.. 그러나 누군가 에게는 도움이 될거라고 생각하는 파이썬 프로그래밍 대망의 18화 이번 시간에는 이름공간과 스코핑룰scoping rule)에 대해서 공부해 보도록 하겠습니다.


저 처럼 오염된 사람은, 스코핑룰이 스토킹룰 이라고 읽혀지는 사태가 벌어질 수 있으니 조심하시구요.

스토킹룰이 아닙니다.. 아무리 파이썬이 강력하다지만 스토킹까지는... 아니군요 가능할수 도 있겠네요.


파이썬으로 웹캠을 열어서 제어한다던지 하면, 뭐... 


아무튼, 시작부터 잡소리가 길어졌습니다. 바로 시작하죠.



이름공간(namespace)




 코드를 읽어 보시면 저 코드가 어머어마 하다는 것을 알수 있으실 겁니다.

뮤직뱅크(MusicBank) 라는 변수에 미스에이,걸스데이,소녀시대 를 넣어줍니다 ㅎㅎ


def 로 함수를 정의하고 스코핑룰을 쓴다음에 

또다시 뮤직뱅크를 선언해서 안에는 Fx,씨스타,포미닛 등을 넣어줍니다.


제가 모두 좋아하는 걸그룹들이네요.. 요새 걸그룹이 너무 많이 등장하는데 이상하게 다른건

기억 못하는데 이런건 한번 보면 기억이 나네요 ;;;


아무튼, 이름공간이 뭐냐면 말그대로 이름이 저장되는 공간 입니다 

저 위의 코드에서 제일위에  뮤직뱅크 변수를 선언하고 걸그룹들을 넣어줬죠?

저렇게 리스트 타입의 객체가 메모리 공간에 생기게 되고 이것을 뮤직뱅크 라는 이름을 가진

레퍼런스가 가리키게 됩니다.


이 뮤직뱅크라는 이름은 이름공간에 저장되고 이후에 뮤직뱅크라는

이름을 가지고 ['미스에이','걸스데이','소녀시대'] 라는 값을 가진 리스트 타입의 객체에

접근 할수 있게 되는 것이죠. 


말이 어렵게 느껴지시면 15화 함수의 정의 에서 그림을 그려드린것을 보고 한번

저 위의 코드를 그림으로 그려 보시는 것도 좋습니다. 사람은 그림으로 이해하는게 빠르니까요.

저도 그려봐야겠네요 :)







스코핑룰(scoping rule)




 함수는 별도의 이름공간을 가지게 됩니다. 함수 내부에서 사용되는 변수는 

함수내부의 이름공간을 참조하게 됩니다. 여기서 함수 내부의 이름공간에서 이름을 못찾게

되는 경우에는 상위 이름공간에서 이름을 찾게 됩니다. 


이것을 함수 내부의 이름공간을 '지역영역(Local scope)' , 함수밖의 영역을 전역영역(Global scope)'

이라고 하며, 파이썬 자체에서 정의한 내용에 대한 영역을 내장영역(Built-in scope)' 라고 하죠


이제 위의 예제코드를 살펴 보시겠습니다.

노란색 숫자1 이라고 써있는 부분을 보면 함수 내 지역 영역에 해당 이름이 없으므로,

전역영역 에서 같은 이름을 찾아서 사용 합니다.


노란색 숫자2 라고 써있는 부분을 보면 함수 내 지역 영역에 x 라는 이름이 등록 됩니다.


외국에서느 약어가 참 많죠? http도 [hypertext transfer protocol] 의 약어이고, IP도 [Internet Protocol] 의

약어입니다. 지금처럼 이름을 검색하는 규칙도 약어가 있습니다.


지역(Local)

전역(Global)

내장(Built-in)


여기에 젤 앞글자만 따서 읽어보시면 'LGB 규칙'이라고 합니다.  LGB 라고 하니까 문득 푸틴이 KGB요원

출신이라고 하던게 생각나네요...





global 선언



저 빨간박스 친 부분을 보시면 전역영역에 존재하는 걸스데이 변수의 값을 100 => 200 으로

변경했습니다. 이렇게 하기 위해 global 선언을 해줬구요.


global로 변수를 선언하게 되면 전역영역에 포함된 이름이지만 지역영역에서

값을 변경해서 사용할수 있습니다.




내장함수(__builtins__)



위처럼 내장함수 목록을 불러올수 있으며, 저기있는 내장함수는 따로 정의하지 않아도

바로 불러다 쓸수가 있습니다.





왜 이름이 스코핑룰 인가?



이거 뭐 어디서도 안나오는 질문 이고 답인것 같아서 생각난것을 적는 블로그 이기

떄문에 써봅니다.


먼저 스코프에 뭔지 말씀 드리면,


{ } <= 이런것처럼 가로로 묶게 되는것을 말합니다.

C언어로 얘기한다면,


#include <stdio.h>

int main()

{

return 0; 

}


보통 이런식으로 기본적으로 뼈대를 만드는 데 여기서 { } <= 요게 바로 가로라고 읽는 것이

아니라 '스코프' 라고 읽지요.


그렇다면 스코핑은 무엇인가?


스코프 + ing 가 합쳐져서 스코핑이 되었고, 여기서 룰이 붙은 이유는 LGB 규칙 처럼

규칙은 영어로 rule 이죠. 


그래서 스코프+ing+규칙(rule) = 스코핑룰 이라고 이름을 지은것 같습니다.

제가 만든것이 아니라서 정확하지는 않을지 모르지만 저는 이렇게 이해했습니다.