'Module'에 해당되는 글 2건

  1. 2013.05.01 Module
  2. 2013.02.15 모듈화 프로그래밍 (Modular Programming)

Module

Programming/Python 2013. 5. 1. 02:26 |


모듈이란, 파이썬 프로그램 파일 혹은 C 확장 파일로 프로그램과 데이터를 정의하고 있으며, 고객(client,  어떤 모듈을 호출하는 측)이 모듈에 정의된 함수나 변수의 이름을 사용하도록 허용하는것으로 정의한다.

모듈은 코드들을 묶어 재사용 가능하게 만드는 하나의 단위이다.

모듈은 서로 연관된 작업을 하는 코드들의 모임으로 구성된다. 작성 중인 모듈의 크기가 어느 정도 커지게 되면 일반적으로 관리 가능한 작은 단위로 다시 분할된다.

지나치게 큰 모듈은 개념적으로나 실행 효율면에서 좋지 않다.

이렇게 분리된 모듈은 코드의 독립성을 유지하여 나중에 재사용할 수 있도록 만드는 것이 좋다.


표준 모듈파이선 언어 패키지 안에 포함된 모듈

사용자 생성 모듈사용자가 직접 만든 모듈

써드 파티 모듈다른 업체나 개인이 만들어서 제공하는 모듈



모듈을 왜 사용하는가?

1) 코드를 재사용할 수 있다.

2) 모듈은 시스템 구성 요소의 기본 단위이다. 하나의 시스템을 모듈 단위로 분리해서 설계하는 것은 여러 면에서 작업의 효율을 높일 수 있다.

3) 모듈은 별도의 이름공간을 제공한다.

이름 공간이란? 이름(변수)이 저장되는 공간을 의미 (함수도, 클래스의 객체도 별도의 이름 공간이다.)


※ 앞 뒤에 두 개의 '_'이 붙은 이름들은 시스템에서 사용하고 있는 이름들이다.



모듈의 검색 경로

파이썬은 가장 먼저 현재 디렉토리를 찾고, 없으면 환경 변수 PYTHONPATH에 기술된 디렉토리의 목록을 검색한다.

ex) csh의 경우 : setenv PYTHONPATH ~/Desktop

ex) bash의 경우 : export PYTHONPATH=~/Desktop


모듈의 검색 경로 동적으로 바꾸기

프로그램 내에서 동적으로 검색 경로를 바꾸려면 sys 표준 모듈의 path 리스트를 이용한다.

sys.path는 파이썬이 검색하는 디렉토리의 모든 경로가 들어 있다.

ex) sys.path.append('~/Desktop')



import 에 대하여

1) import 모듈명

이 방법은 모듈의 네임 스페이스를 그대로 유지하므로 모듈 내의 이름을 부를 때는 '모듈 이름.이름' 형식을 이용한다.

ex) A.B.C는 객체 A에서 B를 찾고, 객체 A.B에서 C를 찾는다.


2) from 모듈명 import 이름(들)

이 방법은 모듈 내의 특정한 이름들을 현재의 네임 스페이스로 불러들인다. 따라서 이들 이름은 직접 참조가 가능하다.

만약, 기존에 모듈에서 불러온 이름과 동일한 변수가 있었다면 그 값은 상실된다.


3) from 모듈명 import *

모듈 안에 있는 '_'로 시작하는 이름을 제외한 모든 이름들을 현재의 이름 공간 안으로 불러들인다.


4) import 모듈명 as 새 이름

이 방법은 모듈 이름을 다른 이름으로 사용하고자 할 때 사용한다. 모듈 이름이 너무 길거나, 혹은 사용 중인 이름과 충돌이 일어날 때 유용하게 사용될 수 있다.


5) from 모듈명 import 이름 as 새 이름

이 방법은 모듈 내에서 정의된 이름을 다른 이름으로 사용하고자 할 때 사용한다.


6) from 모듈명 import (이름들..)

하나의 모듈에서 다수의 이름을 import할 때 다음과 같이 괄호를 사용할 수 있다.

ex) from string import (atoi, atol, upper)


※ import와 from은 실행 가능한 문이다. 따라서 보통의 문이 나올 수 있는 곳이면 어디에서나 사용 가능하다.

※ import와 from은 치환문이다. 즉, import mymath는 현재의 네임 스페이스에 mymath란 이름을 생성하고 이름 mymath는 모듈 객체를 참조한다.


import는 코드를 수행한다.  

import 했을 때, 모듈 안의 문들이 순차적으로 수행된다.



컴파일과 적재 시간

import 문은 *.pyc 파일을 먼저 찾는다. 

*.pyc 파일은 *.py 를 컴파일한 바이트 코드 파일이며, 바이트 코드 생성은 import 할 때(필요하다면) 자동적으로 수행된다.


※ byte code 란?

하나의 중간 언어, 즉, 사람이 보는 파이썬 언어와 기계가 수행하는 기계어의 중간 위치에 있는 언어이다. 이 중간 언어의 역할은 실행 파일을 기계나 플랫폼에 의존하지 않도록 만드는 일이다.

파이썬은 묵시적으로 필요하다면 자동적으로 컴파일되므로 컴파일 언어이면서 동시에 인터프리터 언어의 수행 방식을 취하고 있다. 이 때문에 얻어지는 편리함은 상당히 크다.


바이트 코드 생성이 필요한지의 판단은 파일 생성 시간을 기준으로 한다.

즉, a.py의 생성 시간이 a.pyc의 생성 시간보다 더 최근이라면 새로 컴파일을 한다.


*.pyc 파일은 이식 가능하여 다른 플랫폼 환경에서 수행 가능하다. 또한 소스.py 파일이 없어도 .pyc파일을 먼저 찾아 수행하므로, 코드를 숨기는 간단한 기법으로 활용 가능하다.


※ decompyle - 바이트 코드에서 소스 코드로 변환

바이트 코드가 있다면 소스 코드로 변환하는 것은 어렵지 않다. 이런 일을 해주는 툴이 http://www.goebel-consult.de/decompyle/ 에 공개되어 있다.

사용법은 간단하다.  a.pyc를 소스 코드로 변환하려면 다음과 같이 한다. 변환 결과는 화면에 표시된다.

ex) ./decompyle a.pyc     or     python decompyle a.pyc



문자열로 표현된 모듈 가져오기

모듈 이름이 문자열로 표현되어 있을 때, 그 이름의 모듈을 임포트하는 방법은, __import__ 함수를 사용하는 것이다.

aa = 're'

re = __import__(aa)


※ 한번 import 되는 module은 메모리에 적재되어 있다가 다른 module 에서 import 할 때도 같이 공유된다.



모듈의 재적재

모듈은 처음의 import에 대해서만 실행하고 적재한다. 이미 적재되어 있는 모듈의 import에 대해서는 기존의 잭재되어 있는 모듈을 그냥 이용한다.

파이썬을 이렇게 만든 이유는 재귀적인 import의 가능성 때문이다. 

ex) A.py

import B

ex) B.py

import A


import를 반복한다면 두 모듈은 무한 루프를 돌 것이다. 그래서 일단 메모리에 적재된 모듈은 다시 물리적인 임포트를 하지 않고 이용한다.

만일 모듈을 다시 적재하고 싶다면 "reload" 함수를 이용하면 된다

ex) reload(module)


모듈을 편집기를 이용하여 수정하고, 또 다른 화면에서는 그 모듈을 테스트할 때, reload를 이용하면 파이썬을 빠져 나가서 다시 import하지 않더라도 변경된 내용을 사용할 수 있어 편리하다.


※ 모듈의 재적재

모듈 reload는 해당 모듈만 재적재한다. 예를 들어 모듈 X가 Y를 임포트할 때, reload(X)는 모듈 X만을 재적재하며, Y를 재적재하지는 않는다.



Posted by scii
:

모듈(Module)이란?

: 소프트웨어에서 말하는 모듈이란 프로그램의 일부분을 의미하는 것이다.

C언어를 이용하여 계산기에 관련된 함수들을 구현했다면, 이러한 함수들의 집합도 하나의 모듈이 될 수 있다.


※ 일반적으로 소프트웨어 공학에서 이야기하는 모듈(module)이라는 것은 크게는 하나의 파일이 될 수도 있지만,

작게는 하나의 함수가 될 수도 있다.




외부 변수의 사용: 키워드 extern (External = 외부의, 밖의)의 의미.

: ex) extern int i;

이렇게 선언을 하면, 컴파일러에게 변수 i는 외부에(다른 파일에) 선언되어 있음을 알려주는 것이다.

그래서 컴파일러는 그냥 컴파일을 한다.


※ 외부(다른 파일)에 정의된 함수를 호출하기 위해서 함수를 선언할 때 extern이라는 키워드를 반드시 써야 하는 것은 아니다.

왜냐하면, 함수 선언 자체가 extern의 의미를 포함하고 있기 때문이다.


ex) extern double add(double a, double b);

               double add(double a, double b);  // 이 둘은 같은 의미이다.


그러나, extern이라는 키워드를 붙여 주는 것이 나쁘지는 않다. 왜냐하면 함수의 정의가 외부에 존재한다는 의미를 부여할 수 있기 때문이다.




외부 접근 금지: 전역 변수 선언시, 키워드 static의 의미. 

:전역 변수로 변수 앞에 static 선언을 하면 외부의 접근을 금지한다는 뜻이 된다.(정확히는 변수의 접근 영역을 파일로 제한한다는 뜻.)

ex) static int a;  ←   extern int a; 접근 불가!!!

     int a;  ←   extern int a; 접근 가능!!!




링크(Link)에 대한 이해

: 컴파일을 하면 오브젝트 파일이 생긴다.(obj파일은 단지 기계어로 변환된 내용만을 지닌 파일이다.)

만약, 모듈화 프로그래밍을 해서 두개의 파일이 있다면 두개의 obj파일이 생성되어있을것이다.

링크는 이 파일 두개를 서로 연결시켜주는 작업을 한다. 그래서 하나의 완성된 실행 파일을 생성한다.


: 최종적인 실행 파일의 생성을 위해서 접근하는 변수가 어디에 존재하는지, 호출하는 함수가 어디에 존재하는지 

연결해 주는 작업을 가리켜 링크라 한다.




헤더파일(Header File)의 구현과 유용성

: ANSI 표준에서 정의하고 있는 헤더 파일을 "표준 헤더 파일"이라 한다.

이러한 헤더 파일들을 모아놓은 곳이 "표준 디렉토리"라고 한다.


: 확장자가 .h로 끝나는 파일을 헤더 파일이라고 한다. 헤더 파일은 #include 전처리기 지시자에 의해서 다른 파일 내에 포함된다.


※ 일반적으로 함수의 정의를 헤더 파일에 포함시키지는 않는다. 선언만 헤더 파일에 포함한다.




- 헤더 파일을 포함하는 두 가지 방법 -


ex) #include <abc.h>                  // 표준 디렉토리에서 abc.h를 찾아서 포함.

     #include "c:/include/abc.h"    // c:/include 에서 abc.h를 찾아서 포함.

     #include "/include/lib/plus.h" // /include/lib/plus.h에 존재하는 plus.h 포함.(유닉스 계열 컴퓨터)


 < >를 이용한 헤더 파일의 포함.

: 표준 디렉토리는 컴파일러마다 유지하고 있는 위치가 다르다.

: 표준 디렉토리에 존재하는 헤더 파일을 포함하기 위해서는 < >를 사용한다.


 " "를 이용한 헤더 파일의 포함.

: " "를 이용해서 헤더 파일을 포함할 경우 헤더 파일이 존재하는 디렉트로의 위치를 직접 지정하는 것이 가능하다.

: 보통 사용자가 정의하는 헤더 파일은 위치를  정해서 따로 관리하기 마련인데, 이렇게 임의의 위치에 존재하는

헤더 파일을 포함하는 경우, 다시 말하면 사용자가 정의하는 헤더 파일을 포함하는 경우 " "를 이용하게 된다.



※ main 함수를 지니고 있는 파일을 메인 모듈(main module)이라 한다.





여기서는 file.c라는 파일을 만들어 함수의 "정의"를 해두었다. 

그리고 메인 모듈로 가선 함수의 "선언"을 해주었다.


자 그런데.. 만약 저 함수들의 인자받는 것이 바뀐다면... 이를테면 void 형으로 바뀐다면...


메인모듈의 있는 함수 원형 선언문 모두를 void로 바꾸어야 한다.

지금은 4개밖에 없지만.. 저것이 10~20개면.. 그리고 다른 파일들도 저 선언을 가지고 있다면..

파일을 돌아다니며 다 바꿔주어야 한다. 참 귀찮을 것이다.


그런데, 헤더파일을 만들어서 거기에 함수 원형을 선언하고 메인 모듈이나 다른 파일들이 #include하는 식이라면...

헤더파일에 있는 함수 선언만 바꿔주면 끝이다.





이러한 번거로운 일들을 편히 하기 위해서 헤더 파일이라는 것을 만든다.


'Programming > C' 카테고리의 다른 글

fprintf와 문자열 형식  (0) 2013.02.15
조건부 컴파일  (0) 2013.02.15
전처리기 (Pre-Processor)  (0) 2013.02.15
C언어에서의 Token  (0) 2013.02.15
메모리 관리와 동적 할당  (0) 2013.02.15
Posted by scii
: