파이썬 구조와 모듈
목차
파이썬의 전체적인 아이디어를 잡기 위해서 구조라는 딱딱한 내용에 대해서 한번 체크하고 가겠습니다.
파이썬은 모듈 시스템으로 만들어져 있습니다. 모듈이란 여러 분야에서 다른 뜻으로 사용되는 단어입니다. 자동차 업계에서 모듈이라는 단어를 많이 쓰지요. 자동차는 수만개의 부품으로 만들어지는데 하나의 공장에서 이 모든일 일을 하게되면 수만개의 부품을 조립해야 하니까 굉장히 복잡해집니다. 그래서 단계적으로 완성된 부품들을 수만개의 공장에서 납품을 받아서 완성차 공장에서 최종 완성하여 출고합니다.
부품들을 모듈로 세분화하여 분업화를 극대화 시킨게 자동차 산업의 특성이지요. 소프트웨어 기술도 초창기에는 몇 사람의 실력자가 프로그램을 만들기 시작하다가 하드웨어의 발전과 함께 점점 복잡한 프로그램이 개발되고 자연스럽게 분업화가 이루어졌습니다. 현대의 소프트웨어의 용량은 방대하고 하는 일이 많기 때문에 모듈화를 시키면 전체의 통합과 호환성 문제를 해결하는데 도움이 됩니다. 객체지향 프로그래밍도 모듈화로 분업화 시켜 전체에 통합되는 독립적인 객체를 운영하기 위한 방식으로 볼 수 있습니다.
쉽게 말하면 아주 거대한 소프트웨어 생태계를 만들고 유지하기 위해서 발달한 설계 방식입니다. 딱히 MS나 구글처럼 거대 IT기업에 다니지 않더라도 모듈화 개념은 유용한데요. 우리가 파이썬으로 어떤 프로그램을 개발한다고 할 때 하나부터 열까지 직접 구현하는게 아닙니다. 어떤 패키지의 모듈을 사용해서 구현할 것인가? 거기서 부터 시작하는 거지요. 예를 들어서 파이썬으로 GUI 프로그램을 만들어야 한다. 그러면 tkinter 패키지를 사용할 것인가 pyqt를 사용할 것인가 상당히 중요합니다. 프로그래머에게 직접 GUI를 만들라고 하면 몇개월 혹은 몇년이 걸릴지 모르는 일입니다. 또 요새는 크로스 플랫폼으로 윈도우, 맥OS, 리눅스에 따라 각자 만들고 수많은 하드웨어에 테스트까지 해야 합니다.
설계가 중요하다 디자인 패턴이다 이런 이야기도 이미 잘 만들어져 있는 패키지의 모듈을 가져다 쓰지 못하면 아무 소용없는 이야기가 됩니다. 물론 지금은 오픈소스 생태계가 상당히 정착되었기 때문에 큰 틀에서의 설계와 비즈니스 로직이 더 중요한 시대입니다.
파이썬은 고급 언어이고 선택할 수 있는 오픈소스 프레임워크가 엄청나게 많기 때문에 초보자들은 모듈의 개념에 대해서 중요성 이라던가 잘 못느끼는 부분이 있습니다. 그래서 모듈의 중요성에 대해서 한번 강조해봤습니다.
파이썬의 언어와 문법은 오픈소스 패키지들을 쉽고 빠르게 자신의 소프트웨어 개발에 접목시킬 수 있도록 최적화되어 있습니다. 어떻게 보면 타인이 만든 패키지를 내것으로 완전히 소화를 해서 프로그램을 구현하는게 결과물 측면에서 중요한 부분인데 사용법이 직관적이고 문법이 쉬운 것도 소프트웨어 개발자 뿐만 아니라 각종 공학자들이 적응하기 쉽도록 발달했기 때문입니다. 덕분에 tiobe index에서 이제는 top 3 순위권에 정착했습니다. 지금이야 파이썬이 득세를 했지만 과거에 펄(Perl)이나 루비, PHP 등과 함께 범용 인터프리터 언어와 경쟁하던 시절도 있었습니다.
하나의 파이썬 프로그램은 모듈의 집합체라고 보면 됩니다. 프로그래머가 하는 일은 IDE – 통합개발환경을 열고 .py라는 확장자의 모듈 파일을 작성하여 임포트(import) 문에서 여러개의 파일들을 논리적으로 연결하고 테스트를 완료한 후에 최종 프로그램의 실행 환경을 구축하여 서비스를 구현하고 유지 보수를 하는 것 입니다. 파이썬으로 코딩을 한다 – 는 것은 대부분 모듈 파일을 작성하는 일을 말합니다.
파이썬 프로그램의 구조
파이썬은 모듈(Module)로 구성되어 있습니다. 모듈에는 문장 혹은 문(Statement)이라는 단위. 흔히 코드 한줄 을 말합니다. 문은 연산자와 피연산자, 혹은 객체의 함수를 사용하는 완전한 독립된 지시사항입니다. 문에는 표현(expression)이 들어갑니다. 표현에는 표현식 뿐만 아니라 객체를 생성하거나 메소드를 실행하는 등 객체(object)를 처리하는 일을 합니다.
이것을 위에서 부터 분해하면 다음과 같습니다.
*파이썬 프로그램(python program) -> 모듈(module) -> 문(statement) -> 표현(expression) -> 객체(object)
파이썬의 모든 데이터는 객체입니다. 객체지향 프로그래밍 언어의 그 객체가 맞긴 한데 자바 언어의 객체처럼 특수한 형식이 정해진 것이라기 보다는 일반적인 객체(general object)라는 개념으로 이해하는게 좀 더 이해가 빠릅니다.
C언어 계열이나 자바같이 정적인(static) 언어를 중심으로 사용해왔다면 파이썬의 이 느슨한 정의가 거슬리게 들릴 수도 있습니다. 사람에게 친화적이고 직관적인 방식으로 진화하기 위해 파이썬의 어떤 개념들은 좀 기계적으로 딱딱 맞지 않는 것들이 있는 것 같습니다. (동적 타이핑 언어라는 부분이니까)
예를 들어서 정수 3 이것은 파이썬에서 객체입니다. 리터럴 문자열들도 객체입니다. 객체에는 속성과 메소드가 있습니다. 파이썬에서는 아래와 같은 표현(expression)이 가능합니다.
print((1).__add__(2))
바로 정수 객체 (1)의 메소드를 사용한 것 입니다. 숫자 1이지만 객체이기 때문에 속성도 있고 메소드도 있습니다. 리터럴이 객체라는 것이 다소 충격적일 수도 있는데요. 파이썬의 모든 데이터는 객체입니다. type 함수를를 사용하면 어떤 클래스에 속해있는지 알 수 있습니다.
print(type(10)) * 결과 <class 'int'>
문자열 리터럴도 객체이기 때문에 그냥 ” ” 따옴표를 친 후에 메소드를 불러오면 됩니다. 이런 방식은 C나 자바에서는 볼 수 없는 형태입니다. 상당히 파격적입니다.
print("Python".__add__(" Complete!")) print("Python".upper()) print("Python".lower()) *실행결과 Python Complete! PYTHON python
이 객체에게 어떤 처리를 하는 것이 표현(expression) 입니다. C언어에서는 문장을 이루는 요소 중에 표현식이 있고 또 선언문 이라는게 있습니다. 변수를 사용하기 전에 미리 컴파일러에게 메모리의 영역을 할당 받는 일입니다. 파이썬에서는 그런 선언이 필요없습니다. 동적 타이핑에 따라 파이썬 인터프리터가 실행시간에 바로 추론을 하여 데이터 타입을 선택하여 변수에 할당합니다.
파이썬은 변수의 선언에 대한 고민할 필요없이 그냥 표현을 문장에 구현합니다. 이 문장들이 모여서 모듈을 만드는데 모듈 안에는 각종 변수와 함수가 객체의 형태로 저장됩니다.
파이썬의 중요한 특징으로는 객체 지향형 프로그래밍과 함수형 프로그래밍을 둘다 가능한 부분입니다. 순수 객체지향 프로그래밍인 자바를 학습한 사람들에겐 혼동이 올 수 있는데 파이썬은 어떤 형식이나 틀에 맞추는게 목표라기 보다는 문제해결을 중심으로 합니다. 객체지향이 맞으면 그것으로 하면 되고 함수형이 맞으면 함수형을 사용하면 됩니다.
한때 객체지향 프로그래밍을 최고의 가치로 따지던 시절이 있었는데 시대의 흐름에 따라 그 가치도 변하는 것으로 이해할 수 있습니다. 객체지향이 아니면 안돼~ 라는 사고는 비즈니스 로직을 개발하는데는 큰 도움이 안될지도 모르겠습니다. 어쨋든 파이썬은 객체지향이 필수가 아니라 선택입니다.
요약
파이썬 프로그램의 구조에 대해서 알아봤습니다. 모듈에 대한 자세한 사용법은 다음 포스팅에서 다루겠습니다.
외부참고문서
Basic Concepts of Python Programming (Beginners Guide) | eduCBA