본문 바로가기

미래 먹거리를 위하여

[파이썬 정복하기] 점프 투 파이썬 5장 – 파이썬 날개 달기 ① (책 없이 시작하기)

5. 파이썬 날개 달기- 본격적인 파이썬 프로그래밍 시작!

5-1. 클래스

클래스는 객체를 만드는 설계도이며, 속성(데이터)과 메서드(행동)로 구성된다.

상속, 오버라이딩, 클래스 변수, 매직 메서드를 활용하면 구조적이고 재사용 가능한 코드를 만들 수 있다

구분 설명 예시 결과
클래스 정의 class 키워드로 정의 class Dog:
       pass
아무 동작 없는 클래스
임시 코드를 작성할 때 주로 사용
__init__() 메서드 생성자(객체 초기화),
객체가 생성될 때 자동 실행
class Dog:
       def __init__(self, name):
객체 생성 시 자동 실행
self 인스턴스 자신을 의미.
객체의 속성에 접근할 때 필요
class Dog:
       def __init__(self, name):
             self.name = name   # 속성 1
             self.age = 3       # 속성 2
현재 생성된 객체의 속성 접근 가능
속성(attribute) 객체가 가지는 데이터(정보) class Dog:
       def __init__(self, name):
             self.name = name   # 속성 1
             self.age = 3       # 속성 2
             self.name = "콩이"       # 속성 3
객체별로
독립적인 정보 저장
메서드(method) 클래스 내부 함수. 객체의 행동을 정의 def bark(self):                # 메서드
       print(f"{self.name}가 멍멍 짖는다!")
객체의 행동 정의
객체(인스턴스) 생성 클래스를 실제로 사용 가능한 형태로 만듦 my_dog = Dog("콩이") Dog 클래스의
인스턴스 생성
메서드 호출
= 메서드 실행
객체명.메서드명() class Dog:
       def __init__(self, name):
             self.name = name   # 속성 1
             self.age = 3            # 속성 2
             self.name = "콩이"       # 속성 3
...
def bark(self):                # 메서드
       print(f"{self.name}가 멍멍 짖는다!")

...
my_dog = Dog("콩이")

my_dog.bark()
콩이가 멍멍 짖는다!
속성 접근 객체명.속성명 / 속성 값 확인 가능 my_dog.name '콩이'
클래스 변수 클래스 전체에서 공유되는 변수 class Dog:
       species = "개"
모든 인스턴스가
동일한 값 사용
인스턴스 변수 인스턴스마다 독립적으로 존재 self.name = name 각 객체별로 고유 값 유지
클래스 메서드 클래스 전체가 공유하는 함수 @classmethod
      def info(cls):
            print("모든 개는 동물입니다.")
Dog.info() 실행 시 동작
정적 메서드 클래스, 인스턴스 모두와 무관한
일반 함수
@staticmethod
      def add(a,b):
           return a+b
Dog.add(2,3) → 5
상속(Inheritance) 기존 클래스의 기능을 물려받음 class Dog(Animal): 부모 클래스의
메서드 사용 가능
오버라이딩
(Overriding)
부모 메서드를 자식이 재정의 def bark(self): print("멍멍!") 기존 기능 변경
super() 부모 클래스의 기능을 명시적으로 호출 super().__init__(name) 부모 생성자 재사용 가능
내장 함수 클래스 관련 내장 함수들 isinstance(obj, Dog)
hasattr(obj, 'name')
getattr(obj, 'name')
클래스 확인 / 속성 접근 등
매직(특수) 메서드 __로 감싼 특별한 메서드 __init__, __str__, __len__, __add__ 등 연산자나 내장 함수 동작을 커스터마이징

5-2. 모듈(Module)

코드를 체계적으로 관리하는 핵심 개념. 파이썬 코드가 들어 있는 파일 하나.(확장자 .py 파일)

모듈은 코드 재사용을 위한 “부품 파일”이다. import로 불러오고, 필요한 부분만 from ~ import로 가져와 사용한다.

구분 설명 예시 결과
모듈 정의 함수나 변수, 클래스를
모아 놓은 파일
# mod1.py
def add(a, b):
    return a + b

def sub(a, b): 
    return a-b
mod1.py로 저장
# IDLE 에디터 파일 생성하는 방법
모듈 불러오기
import 모듈이름
다른 파일에서 사용 터미널 실행
cd mod1.py 폴더경로 입력
ls
python3
Python 3.14.0 (...)
>>>

import
mod1
아무 에러가 안일어나면 성공

#책에서 언급하는 C:\doit는 윈도우즈를 말하는 것.
Mac에서는 /Users/유저이름/doit
으로 보면 된다.
모듈 사용법 모듈명.함수명() ① mod1.add(3, 4)
② mod1.sub(10, 4)
7
② 6
별칭 지정 모듈 이름이 길 때 as 사용 import mod1 as m
m.add(3,4)
7
특정 함수만 가져오기 from 모듈이름 import 함수명
# 별칭 불가. 진짜 모듈 이름 입력
from mod1 import sub
mod1.sub(15,9)
6
여러 개
한꺼번에 가져오기
쉼표로 구분 가능. 다중 함수 호출 from mod1 import add, sub
m.add(7,8),mod1.sub(3,7)
(15, -4)
모듈 전체 가져오기 * 사용 (권장 X)
모듈 내 모든 함수 사용 가능
from mod1 import *
add(20,10),sub(10,30)
(30, -20)
표준 모듈 파이썬에 기본 내장된 모듈 import math, random, sys 바로 사용 가능
외부 모듈 pip로 설치 후 사용 pip install requests 외부 라이브러리 사용
파일을 직접 실행할 때
코드가 실행
이 파일이 직접 실행될 때만 아래 코드를 실행해라
if __name__ == "__main__"
“이 모듈이 다른 파일에서 import될 때는 실행되지 말고, 직접 실행할 때만 작동해라.”
def add(a, b):
    return a + b

if __name__ == "__main__":
    print("mod1.py 직접 실행됨")
    print(add(2, 3))
mod1.py 직접 실행됨
5
파일을 import 실행할 때   import mod1
print("test.py 실행 중")
test.py 실행 중
mv[파일경로] [이동할폴더경로] 파일이동 터미널
m
v /Users/유저네임/mod2.py /Users/유저네임/doit/
mod2.py이 doit 폴더로 옮겨짐
ls [폴더경로] 폴더 안 파일 확인 터미널
ls
doit 폴더내 파일 리스트가 나열됨
mkdir [폴더경로] 폴더 새로 만들기 터미널
cd /Users/유저네임/doit
mkdir mymod
mv mod2.py mymod
ls mymod 확인하기를 통해
mod2.py 파일이 보이면 성공
sys.path 라이브러리 모듈 확인/추가 터미널
python3
import sys
sys.path
파이썬 라이브러리가 설치되어 있는 디렉터리 목록 나열

['', '/Library/Frameworks/Python.framework/Versions/3.14/lib/python314.zip', '/Library/Frameworks/Python.framework/Versions/3.14/lib/python3.14', '/Library/Frameworks/Python.framework/Versions/3.14/lib/python3.14/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.14/lib/python3.14/site-packages']

sys.path.append 라이브러리 모듈 추가 sys.path
라이브러리 목록 나열
sys.path.append("/Users/유저네임/doit/mymod")
sys.path
"/Users/유저네임/doit/mymod"이 추가된 목록 확인 가능.
['', '/Library/Frameworks/Python.framework/Versions/3.14/lib/python314.zip', '/Library/Frameworks/Python.framework/Versions/3.14/lib/python3.14', '/Library/Frameworks/Python.framework/Versions/3.14/lib/python3.14/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.14/lib/python3.14/site-packages', '/Users/유저네임/doit/mymod']
모듈불러오기
PYTHONPATH 
환경 변수 사용하기
export PYTHONPATH

echo $PYTHONPATH
터미널
export PYTHONPATH=/Users/유저네임/doit/mymod
echo $PYTHONPATH
/Users/유저네임/doit/mymod

# 터미널 doit에서 실행하기: cd /Users/유저네임/doit 

5-3. 패키지(Package)

여러 개의 모듈(.py 파일)폴더로 묶은 것. 즉, “모듈들의 집합” = 패키지

패키지는 모듈을 묶은 구조적 단위로, __init__.py, __all__, import, 상대 경로를 이용해 코드를 체계적으로 관리.

구분 설명 예시 결과
(복습) 폴더 생성 터미널
cd /Users/유저네임/doit
mkdir game
mkdir game/sound



# mkdir -p game/sound
중간 경로가 없으면 자동으로 만들어줘”라는 의미
(복습) 빈 모듈 생성 touch game/__init__.py
touch game/sound/__init__.py
 
(복습) 모듈 생성 # echo.py
def echo_test():
    print("echo")

# render.py
def render_test():
    print("render")
파이썬 쎌 검색
① import game.sound.echo
game.sound.echo.echo_test()
echo
② import game.graphic.render
game.graphic.render.render_test()
render
패키지 정의 여러 모듈을 묶은 디렉터리(폴더) 구조 game/sound/echo.py 모듈을 체계적으로 관리
init.py 이 폴더는 패키지라는 표식

패키지를 가져올 때마다 실행되는 초기화 코드를 넣는곳
# game/sound/__init__.py

> game이 패키지고, 그 안에 sound라는 하위 패키지가 있구나” 하고 인식 
전체 import 패키지 안의 모듈을 불러오는 문법


경우, import game.sound.echo
= game 폴더 → sound 폴더 → echo.py 모듈을 순서대로 다 불러오겠다.
import game.sound.echo
game.sound.echo.echo_test()
echo
부분 import from을 사용해
하위 모듈만 불러옴
from game.sound import echo
= echo 모듈만 불러온다.
from game.sound import echo
echo.echo_test()
echo
함수만
import
모듈 내부의 함수만 불러옴 from game.sound.echo import echo_test
= echo_test() 함수만 불러오기
from game.sound.echo import echo_test
echo_test()
echo
모든 모듈
import
* 사용 시 __init__.py 안의 __all__ 설정 필요 from game.sound import *# __init__.py__all__ = ['echo']
> __init__.py의 __all__에 지정된 모듈만 가져온다.
지정된 모듈만 import
상대 경로
import
같은 패키지 내부에서
다른 모듈 불러오기

from
. importechofrom ..graphicimportrender
        . 현재폴더                    .. 상위 폴더
import game.sound.echo
game.sound.echo.echo_test()
echo
render

함수 예시 echo.py 내부 함수 def echo_test():
    print("echo 모듈 실행")

# 이 아래 부분은 '직접 실행할 때만' 실행됨
if __name__ == "__main__":
    echo_test()
echo 모듈 실행
실행 예시 모듈 불러와서 실행 import game.sound.echo
game.sound.echo.echo_test()
echo 모듈 실행
모듈 vs 패키지 모듈 패키지.py 파일 하나 모듈을 담은 폴더
import mod1
import game.sound.echo
 

# heredoc> 상태일 땐 아직 명령이 끝나지 않은 상태. 입력을 닫는 PY (종료 표시)를 꼭 넣어야 한다.

 

※ 캐시(바이너리 컴파일 파일) 직접 지우는 방법(폴더 전체)

터미널 실행 rm -rf /Users/유저네임/doit/game/__pycache__ ls -R /Users/유저네임/doit/game(삭제 확인)

# __pycache__ 폴더는 파이썬이 실행할 때 자동으로 생기는 캐시라, 지워도 전혀 문제 없음.


아 빡세다.

모듈, 패키지 헷갈린다. 편도 붓는듯.


2025.11.06.(목)

헷갈려서 다시 왔다.

1. 모듈(module)이란?

  • 모듈 = 함수나 변수, 클래스를 담아놓은 ‘파이썬 파일(.py)’ 즉, 일종의 도구 상자(toolbox) 같은 거
  • functools는 함수형 프로그래밍용 도구 상자. operator는 연산 관련 함수들 모아둔 도구 상자.

2. import는 도구 상자에서 필요한 도구만 꺼내는 행동

  • import는 “이 도구 상자 안에 있는 걸 가져올게요” 라는 뜻
예시 해석
import operator
print(operator.add(3, 5))
operator는 상자만 쓰려고 통채로 가져왔는데
add(더하기 함수)를 사용할래여 그러면 operator.add()로 써야 사용할 수 있어요.
from operator import add, mul
print(add(3, 5))
print(mul(3, 5))
operator라는 상자 안에 있는 add, mul(곱하기 함수)를 꺼내 쓸게요.

 

※ 파이썬 import 문법 비교표

형태 문법 예시 특징/장점 단점
① import 전체 모듈 import math
print(math.sqrt(16))
#호출방식: 모듈명.함수()
- 모듈 전체를 가져옴
- 이름 충돌 위험이 적음
- 매번 모듈명.을붙여야 해서
   코드가 길어짐
② from 모듈 import 함수명 from math import sqrt
print(sqrt(16))
#호출방식: 함수명()
- 필요한 함수만 가져와서 코드가 짧아짐
- 명확하고 깔끔함
- 같은 이름의 함수가 다른 모듈에 있으면 충돌 위험
③ import 모듈 as 별칭 import math as m
print(m.sqrt(16))
#호출방식: 별칭.함수()
- 이름이 긴 모듈을 짧게 쓸 수 있음
   (예: import numpy as np)
- 원래 모듈 이름이 가려져 가독성이 떨어질 수 있음