[Python] 지역변수와 전역변수(global)

·2025년 6월 27일

Python

목록 보기
28/33

변수의 범위(Scope) 개념

변수는 자신이 생성된 범위(코드블럭) 안에서만 유효

🔸지역변수 (Local Variable)

  • 함수 에서 만든 변수
  • 함수 안에서 살아 있다가 함수 코드의 실행이 종료되면 그 생명을 다함
    • 예시: 스타벅스 매장 내에서 사용하는 머그컵

🔸전역변수 (Global Variable)

  • 함수 외부에서 만든 변수
  • 프로그램이 살아있는 동안에 함께 살아 있다가 프로그램이 종료되면 같이 소멸
  • 프로그램 전체를 유효범위로 가지는 변수
    • 예시: 텀블러 (어디서든 사용 가능)

✔️ 기본 예제

전역변수와 지역변수의 사용 예

a = 'scott'    # 전역변수

def fun2():
    b = 'allen'  # 지역변수
    return b

print(a)        # 전역변수는 어디서든 접근 가능
print(fun2())   # 함수를 호출해야 지역변수 사용 가능
# print(b)      # 오류! 지역변수는 함수 외부에서 접근 불가

전역변수의 활용 예제

pi = 3.1415926   # 전역변수

def circle_func1(num):   # 원의 넓이를 구하는 함수
    return pi * num * num

def circle_func2(num):  # 부채꼴의 넓이를 구하는 함수
    return 1/4 * pi * num * num

print(circle_func1(5))  # 78.53975
print(circle_func2(5))  # 19.634375

전역변수가 필요한 이유는
원주율(π) 처럼 어느 함수에서 사용하든 절대로 일관된 데이터를 사용해야 할 때 필요


📌 global 키워드 사용

전역변수를 함수 내에서 변경하고 싶을 때는 global 키워드를 사용

전역변수 변경 예제

pi = 3.1415926   # 전역변수

def circle_func1(num):   # 원의 넓이를 구하는 함수
    global pi 
    pi = 3.14  # 전역변수 값 변경
    return pi * num * num

def circle_func2(num):  # 원의 넓이를 구하는 함수
    return pi * num * num

print(circle_func1(5))  # 78.5 (변경된 pi 값 사용)
print(circle_func2(5))  # 78.5 (전역변수가 변경되어 영향받음)

⚠️ global을 사용하게 되면 전역변수가 변경되어 다른 함수에도 영향을 받게 됨


전역변수가 필요한 경우

전역변수는 무분별하게 사용하면
코드의 예측 가능성을 낮추고 유지보수를 어렵게 만들 수 있지만, 특정 상황에서는 필요

1. 프로그램 전체에서 공유해야 하는 값이 있을 때

  • 설정 값, 환경 변수, 상태 값 등
    프로그램 전반에서 참조해야 하는 값은 전역변수로 선언하면 편리
    • 예: 오라클과 파이썬과의 연동시 환경변수 셋팅할 때 전역변수 사용이 유용함

2. 함수 간 상태를 유지해야 할 때

  • 여러 함수에서 동일한 데이터를 수정하거나 누적해야 하는 경우
    전역변수를 사용하면 간결한 코드 작성이 가능
    • 예: 토스앱 사용의 방문자수를 누적해서 쌓을 때 전역변수 사용이 유용함

3. 객체나 데이터가 지속적으로 사용될 필요가 있을 때

  • 로그, 캐시, 데이터베이스 연결 같은 리소스를 관리할 때 전역변수를 사용하면 효율적
    • 예: 토스 앱이나 웹에 사용자들이 사용할 때 만들어지는 로그들을 관리할 때 전역변수를 사용하면 효율적

실무 사례1: 데이터베이스 연동

1. 함수를 사용하지 않았을 때

import oracledb     # 오라클과 파이썬 연동을 위한 파이썬 모듈
import pandas as pd # 엑셀 --> 판다스(표 형태의 데이터를 다루는 모듈)

# 파이썬에서 오라클로 접속하기 위한 정보를 구성
dsn = oracledb.makedsn("127.0.0.1", '1521', "xe")   #(건물주소, 층, 회사이름)
                                                    #(ip주소, 포트, 서비스이름)
db = oracledb.connect(user='c##scott', password='tiger', dsn=dsn)

# 오라클의 데이터를 파이썬에서 출력하는 코드
cursor = db.cursor()   # 오라클의 데이터를 올리기 위한 메모리 구성

# 더블쿼테이션 마크를 3개로 둘러준 것은 SQL을 아래로 자유롭게 작성하기 위함
SQL = """ SELECT *
          FROM emp """

cursor.execute(SQL)  # 쿼리의 수행 결과가 메모리에 구성
row = cursor.fetchall()  # 메모리에 올린 데이터를 row 변수에 담습니다

# 컬럼명 받아오는 코드
colname = cursor.description
# print(colname)
col = []
for i in colname:
    col.append(i[0].lower())
print(col)

cursor.close()  # 파이썬 메모리 닫기
db.close()      # db 접속 끊기
print(row)

emp = pd.DataFrame(row, columns=col)
print(emp)

2. 함수로 생성하고 전역변수를 사용하지 않았을 때

import oracledb
import pandas as pd

def fetch_oracle_data(table_name):
    # 파이썬에서 오라클로 접속하기 위한 정보를 구성
    dsn = oracledb.makedsn("127.0.0.1", '1521', "xe")
    db = oracledb.connect(user='c##scott', password='tiger', dsn=dsn)
    
    # 오라클의 데이터를 파이썬에서 출력하는 코드
    cursor = db.cursor()  # 오라클의 데이터를 올리기 위한 메모리 구성
    
    SQL = f"""
    SELECT * FROM {table_name}
    """
    
    cursor.execute(SQL)  # 쿼리의 수행 결과가 메모리에 구성
    row = cursor.fetchall()  # 메모리에 올린 데이터를 row 변수에 담습니다
    
    # 컬럼명 받아오는 코드
    colname = cursor.description
    col = []
    for i in colname:
        col.append(i[0].lower())
    
    cursor.close()
    db.close()
    
    table = pd.DataFrame(row, columns=col)
    return table

# 함수 호출
result = fetch_oracle_data('dept')
# print(result)
result

3. 함수를 사용하고 전역변수를 사용했을 때

import oracledb
import pandas as pd

# 전역변수 설정값
db_config = {
    "host": "127.0.0.1",
    "port": "1521",
    "service_name": "xe",
    "user": "c##scott",
    "password": "tiger"
}

# DB에 연결하는 함수
def get_connection():
    dsn = oracledb.makedsn(db_config['host'], db_config['port'],
                           service_name=db_config['service_name'])
    db = oracledb.connect(user=db_config['user'], password=db_config['password'], dsn=dsn)
    return db

# 오라클의 데이터를 가져오는 함수
def fetch_oracle_data(table_name):
    # 파이썬에서 오라클로 접속하기 위한 정보를 구성
    db = get_connection()
    
    # 오라클의 데이터를 파이썬에서 출력하는 코드
    cursor = db.cursor()   # 오라클의 데이터를 올리기 위한 메모리 구성
    
    SQL = f""" SELECT *
               FROM {table_name} """
    
    cursor.execute(SQL)  # 쿼리의 수행 결과가 메모리에 구성
    row = cursor.fetchall()  # 메모리에 올린 데이터를 row 변수에 담습니다
    
    # 컬럼명 받아오는 코드
    colname = cursor.description
    col = []
    for i in colname:
        col.append(i[0].lower())
    
    cursor.close()
    db.close()
    
    table = pd.DataFrame(row, columns=col)
    return table

# 함수 호출
result = fetch_oracle_data('emp')
print(result)

전역변수 사용의 장점

만약 DB 정보가 변경되면 전역변수를 사용했을 때는 전역변수만 수정해주면 간단하게 해결됩니다.

DB 보안의 이유로 자주 패스워드를 변경하는데, 패스워드를 변경하고 전역변수만 수정하면 됩니다

# 패스워드 변경 시 전역변수만 수정
db_config = {
    "host": "127.0.0.1",
    "port": "1521",
    "service_name": "xe",
    "user": "c##scott",
    "password": "tiger2"  # 패스워드만 변경
}

실무 사례2: 방문자 수 관리

전역변수를 제대로 사용하지 않았을 때

def visit(count):
    count += 1
    print(f"현재 방문 횟수: {count}")
    return count  

visit_count = 0
visit_count = visit(visit_count)  # 현재 방문 횟수: 1
visit_count = visit(visit_count)  # 현재 방문 횟수: 2
visit_count = visit(visit_count)  # 현재 방문 횟수: 3

전역변수를 사용했을 때 (개선된 코드)

visit_count = 0

def visit():
    global visit_count  # 전역변수를 수정하겠다고 지정
    visit_count += 1
    print('현재 방문 횟수: ', visit_count)

visit()
visit()
visit()

0개의 댓글