본문으로 건너뛰기
Advertisement

Ch 2.1 변수 선언과 네이밍 컨벤션

파이썬에서 변수는 데이터를 저장하는 이름이 붙은 컨테이너입니다. 정적 타입 언어(Java, C++)와 달리 파이썬은 변수의 타입을 미리 선언하지 않아도 됩니다.

1. 변수란? 동적 타이핑(Dynamic Typing)

파이썬은 동적 타입 언어(Dynamically Typed Language) 입니다. 변수에 어떤 타입의 값이든 할당할 수 있고, 나중에 다른 타입의 값으로 변경할 수도 있습니다.

# 타입 선언 없이 바로 할당
message = "Hello" # str
count = 42 # int
price = 3.14 # float
is_active = True # bool

# 변수가 가리키는 타입 확인
print(type(message)) # <class 'str'>
print(type(count)) # <class 'int'>

# 동일 변수에 다른 타입 재할당 가능 (동적 타이핑)
x = 10
print(type(x)) # <class 'int'>
x = "파이썬"
print(type(x)) # <class 'str'>
x = [1, 2, 3]
print(type(x)) # <class 'list'>

파이썬에서 변수는 값 자체를 담는 것이 아닌, 객체를 가리키는 참조(reference) 입니다. x = 10은 "정수 10 객체를 x라는 이름으로 참조하라"는 뜻입니다.

2. 변수 선언 및 재할당

# 기본 할당
name = "Alice"
age = 30
height = 165.5

# 재할당
name = "Bob" # 같은 이름, 다른 값
age = age + 1 # 현재 값을 사용한 재할당
age += 1 # 위와 동일 (복합 할당)

print(f"{name}, {age}세") # Bob, 32세

3. 다중 할당

파이썬은 한 줄에 여러 변수를 할당하는 다양한 방법을 제공합니다.

# 여러 변수에 각각 다른 값 할당 (언패킹)
a, b, c = 1, 2, 3
print(a, b, c) # 1 2 3

# 여러 변수에 동일한 값 할당
x = y = z = 0
print(x, y, z) # 0 0 0

# 변수 스왑 — 임시 변수 없이 가능 (파이썬의 특기!)
a, b = 10, 20
print(f"교환 전: a={a}, b={b}") # a=10, b=20
a, b = b, a
print(f"교환 후: a={a}, b={b}") # a=20, b=10

# 확장 언패킹 (Python 3+)
first, *rest = [1, 2, 3, 4, 5]
print(first) # 1
print(rest) # [2, 3, 4, 5]

head, *middle, tail = [1, 2, 3, 4, 5]
print(head) # 1
print(middle) # [2, 3, 4]
print(tail) # 5

4. 네이밍 컨벤션

파이썬 PEP 8 스타일 가이드에서 권장하는 네이밍 규칙입니다.

# snake_case — 변수, 함수, 모듈 이름
user_name = "alice"
total_price = 29900
max_retry_count = 3

def calculate_total_price(items):
pass

# UPPER_SNAKE_CASE — 상수 (모듈 최상단에 정의)
MAX_CONNECTIONS = 100
DATABASE_URL = "postgresql://localhost/mydb"
PI = 3.14159265358979

# PascalCase (UpperCamelCase) — 클래스 이름
class UserProfile:
pass

class HttpRequestHandler:
pass

# 나쁜 예 (파이썬스럽지 않음)
userName = "alice" # camelCase — Java/JS 스타일
UserName = "alice" # PascalCase — 클래스로 오해
TOTAL_price = 100 # 혼합 스타일

네이밍 규칙 요약

대상스타일예시
변수, 함수snake_caseuser_name, get_data()
상수UPPER_SNAKE_CASEMAX_SIZE, API_KEY
클래스PascalCaseUserProfile, BaseModel
모듈, 파일snake_caseuser_profile.py
패키지lowercasemypackage

5. 예약어(Keywords) 목록

파이썬의 예약어는 변수명으로 사용할 수 없습니다.

import keyword

# 모든 예약어 출력
print(keyword.kwlist)
# ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await',
# 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except',
# 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is',
# 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try',
# 'while', 'with', 'yield']

# 예약어 확인
print(keyword.iskeyword("if")) # True
print(keyword.iskeyword("name")) # False

# 소프트 키워드 (Python 3.12+)
print(keyword.softkwlist)
# ['_', 'case', 'match', 'type']
# 예약어 충돌 해결법 — 밑줄 하나 추가
type_ = "integer" # type은 내장 함수라 충돌
list_ = [1, 2, 3] # list는 내장 타입
id_ = 12345 # id는 내장 함수

6. 스코프 기초 — 전역 vs 지역 변수

# 전역 변수 (모듈 최상단에 정의)
global_var = "전역 변수"

def my_function():
# 지역 변수 (함수 내부에서만 유효)
local_var = "지역 변수"
print(global_var) # 전역 변수 읽기 가능
print(local_var)

my_function()
print(global_var) # 가능
# print(local_var) # NameError: 함수 밖에서 접근 불가

# 전역 변수 수정 — global 키워드 필요
counter = 0

def increment():
global counter # 전역 변수 수정 선언
counter += 1

increment()
increment()
print(counter) # 2

7. del 문으로 변수 삭제

x = 10
y = [1, 2, 3]

# 변수 삭제
del x
# print(x) # NameError: name 'x' is not defined

# 리스트 요소 삭제
del y[0]
print(y) # [2, 3]

# 딕셔너리 키 삭제
data = {"a": 1, "b": 2, "c": 3}
del data["b"]
print(data) # {'a': 1, 'c': 3}

고수 팁: 의미 있는 변수명과 언더스코어 관례

의미 있는 변수명 작성이 가장 중요합니다.

# 나쁜 예
d = 86400
t = d * 7
l = [1, 2, 3, 4, 5]
n = len(l)

# 좋은 예
seconds_per_day = 86400
seconds_per_week = seconds_per_day * 7
scores = [1, 2, 3, 4, 5]
total_count = len(scores)

언더스코어(_) 관례:

# 1. _ (단일 언더스코어) — 무시할 값
for _ in range(5):
print("반복!") # 반복 변수가 필요 없을 때

_, important = (1, 2) # 첫 번째 값 무시

# 2. _ — REPL에서 마지막 결과
# >>> 3 + 4
# 7
# >>> _ + 1
# 8

# 3. _name (단일 앞 언더스코어) — 내부용(private) 관례
class MyClass:
def __init__(self):
self._internal_data = [] # 외부에서 직접 접근 비권장
self.__private = "진짜 숨김" # 이름 맹글링(name mangling)

# 4. __name__ (앞뒤 더블 언더스코어) — 파이썬 예약 특수 속성
print(__name__) # '__main__' (직접 실행 시)

# 상수는 항상 모듈 최상단에 정의 (함수 내부 X)
DATABASE_URL = "postgresql://localhost/db"
MAX_RETRIES = 3
TIMEOUT_SECONDS = 30

변수 선언과 네이밍 컨벤션을 익혔습니다. 다음 챕터에서는 파이썬의 기본 데이터 타입(int, float, bool, str, None)을 자세히 살펴보겠습니다.

Advertisement