내 변수는 어디서 살고 어디서 죽을까? 변수 스코프(Scope) 완벽 정리

Day 12

지역 변수 vs 전역 변수: 변수의 '활동 범위' 이해하기

내 변수는 어디서 살고 어디서 죽을까? 변수 스코프(Scope) 완벽 정리

안녕하세요! 11일차에 함수를 배우면서 이런 경험 없으셨나요? "어? 함수 안에서 만든 변수를 밖에서 썼더니 에러가 나요!" 혹은 "밖에서 만든 변수를 함수 안에서 바꿨는데 안 바뀌어요!"

오늘은 변수가 프로그램 어디까지 영향을 미치는지 결정하는 지역 변수(Local)전역 변수(Global)의 개념을 확실히 잡아보겠습니다.

Scope

1. 우리 집 안에서만! 지역 변수

함수 안에서 만들어진 변수는 지역 변수라고 합니다. 이 변수는 함수라는 '집' 안에서만 살 수 있고, 함수가 끝나면 흔적도 없이 사라집니다.

def my_house():
    inner_var = "함수 안의 보물"
    print(inner_var)

my_house()
# print(inner_var)  <- 에러 발생! (밖에서는 볼 수 없어요)

2. 마을 전체의 공유 재산, 전역 변수

함수 밖에서 만들어진 변수는 전역 변수입니다. 프로그램 전체에서 누구나 읽을 수 있는 공용 변수와 같습니다.

global_var = "나는 공용 변수"

def check_global():
    print(global_var) # 밖에서 만든 걸 안에서도 읽을 수 있어요.

check_global()
print(global_var)

3. 주의! 함수 안에서 전역 변수 수정하기

기본적으로 함수는 밖의 전역 변수를 '읽기'만 할 수 있습니다. 만약 함수 안에서 전역 변수의 값을 직접 바꾸고 싶다면 global이라는 키워드를 써서 파이썬에게 허락을 받아야 합니다.

global 키워드 사용법:
1. 함수 내부 맨 윗줄에 global 변수명을 선언합니다.
2. 이제 함수 안에서의 수정이 함수 밖 전역 변수에도 반영됩니다.
count = 0

def increment():
    global count # "밖의 count를 가져다 쓰겠다!"고 선언
    count += 1
    print("함수 안 count:", count)

increment()
print("함수 밖 count:", count) # 결과: 1 (값이 변했습니다!)
변수의 생존 범위(스코프) 비유

지역/전역 변수 = 집/마을 지도에서 어디까지 "살아있나"

핵심: 전역 변수마을 전체, 지역 변수집(함수) 안에서만 유효
🗺️ 마을 지도 (프로그램 전체)
여기서 보이는 것 = 전역 범위
Global 변수: town_light = "ON" Global 변수: weather = "SUNNY"
🏠 집 A (함수 A)
호출되면 입장
집 밖(마을)은 전역, 집 안은 지역
마을에서 들어온 전역
town_light, weather
(집에서도 “읽기” 가능)
집 안의 지역 변수
local_note = "A메모"
temp = 123
✖ 집 밖으로 나오면 사라짐
경계선: 이 점선 밖(마을)은 지역 변수 접근 불가
🏠 집 B (함수 B)
호출되면 입장
다른 집의 지역 변수는 서로 공유되지 않음
마을 전역은 동일
town_light, weather
(집 A/B 둘 다 접근 가능)
집 B의 지역 변수
local_note = "B메모"
temp = 999
✖ 집 A에서 볼 수 없음
경계선: 함수(집)마다 “자기 방”이 따로 생김
함수 호출 = 집에 들어가면서 지역 변수(방)가 생성
함수 종료 = 집에서 나가며 지역 변수가 사라짐
💡 포인트: 전역은 “마을 공지판”, 지역은 “각 집의 메모지”
(모바일에서 두 집이 너무 좁으면, 블로그스팟 테마에 따라 자동 줄바꿈될 수 있어요)

💡 12일차 궁금증 해결 (Q&A)

Q1. global은 많이 쓸수록 좋은가요?

A1. 아니요! 가급적 피하는 것이 좋습니다. 프로그램 규모가 커지면 어디서 전역 변수를 바꿨는지 찾기 힘들어져 오류의 주범이 되기 때문입니다. 가급적 함수에서 return으로 값을 돌려받아 사용하는 습관을 들이세요.

Q2. 지역 변수와 전역 변수 이름이 같으면 어떻게 되나요?

A2. 파이썬은 지역 변수를 우선시합니다. 함수 안에서는 함수 안의 변수 이름을 먼저 찾고, 없으면 밖에서 찾습니다. 하지만 헷갈리지 않게 이름을 다르게 짓는 것이 가장 좋습니다.

Q3. 왜 변수가 함수가 끝나면 사라지나요?

A3. 컴퓨터의 메모리를 효율적으로 쓰기 위해서입니다. 다 쓴 변수를 계속 갖고 있으면 프로그램이 점점 무거워지겠죠? 함수가 자기 할 일을 다 하면 청소부(가비지 컬렉터)가 나타나 깔끔하게 치워줍니다.

오늘의 미션 🚩

"로그인 횟수 제한기"
1. 전역 변수 fail_count = 0을 만드세요.
2. login() 함수를 만들고, 실행할 때마다 fail_count를 1씩 증가시키세요.
3. 함수 마지막에 "현재 로그인 실패 횟수: X"를 출력하게 해보세요. (global 키워드 활용!)

변수의 생존 범위까지 이해하셨다면, 이제 함수의 깊은 원리를 꿰뚫으신 겁니다!
내일은 코딩의 꽃, 13일차: 클래스(Class)와 객체(Object)로 대망의 객체지향 프로그래밍에 입문하겠습니다. 💙

참고 자료: 파이썬 공식 가이드 - 스코프와 네임스페이스

댓글

이 블로그의 인기 게시물

초보 파이썬 따라하기: 7가지 실전 프로젝트로 매일 코딩 습관 만들기

초보자를 위한 Step-by-Step: 리스트와 인덱싱으로 값을 추가/삭제해 Python 기초 잡기

조건문(if, elif, else) 배우기