1. 클래스 변수와 인스턴스 변수의 차이점
파이썬에서 클래스 변수는 클래스에 속한 변수로 모든 인스턴스가 공유하게 됩니다. 반면, 인스턴스 변수는 각 인스턴스 개별적으로 가지는 변수입니다.
이를 이해하기 위한 예시로 간단한 테이블을 볼까요?
| 변수 유형 | 설명 | 전형적인 사용 예 |
|---|---|---|
| 클래스 변수 | 모든 인스턴스가 공유하는 변수 | 학생 수를 저장하는 변수 |
| 인스턴스 변수 | 각 인스턴스마다 고유한 변수 | 학생의 이름, 성적 등 |
여기서 중요한 점은 **클래스 변수는 모든 인스턴스가 동일한 변수를 보지만**, **인스턴스 변수는 각자 고유한 데이터를 유지**한다는 것입니다. 이러한 개념은 클래스 간 변수를 공유할 때 특히 중요합니다.
2. 클래스 변수로 데이터 공유하기
클래스 변수를 활용하여 여러 클래스 간에 데이터를 공유할 수 있습니다. 다음은 이를 나타내는 예제입니다:
“`python
class School:
total_students = 0
def __init__(self, name):
self.name = name
School.total_students += 1
a = School(“Central High”)
b = School(“West High”)
print(School.total_students) # 출력: 2
“`
위 예제에서, **모든 School 객체는 같은 클래스 변수 `total_students`를 공유**하며, 각 인스턴스가 생성될 때마다 이 값은 증가합니다. **이러한 방식으로 클래스 변수를 사용하면 클래스 내 여러 인스턴스에서 동일한 정보를 유지**할 수 있게 됩니다.
3. 상속을 통해 변수 공유하기
상속을 사용하여 부모 클래스의 변수를 자식 클래스에서도 사용할 수 있습니다. 이는 클래스 간 변수를 공유하는 또 다른 방법입니다.
“`python
class Parent:
parent_variable = “부모 클래스 변수”
class Child(Parent):
pass
child_instance = Child()
print(child_instance.parent_variable) # 출력: 부모 클래스 변수
“`
위 예제에서 `Child` 클래스는 `Parent` 클래스를 상속받아 `parent_variable`을 **자동으로 사용 가능**하게 되었습니다. 상속을 통해 여러 클래스에서 중요한 공통 변수를 효율적으로 공유하고 활용할 수 있습니다.
4. 싱글톤 패턴을 통한 변수 공유
싱글톤 패턴은 클래스의 인스턴스를 단 하나만 존재하게 하면서, 그 인스턴스를 통해 변수를 공유하는 방법입니다. 이는 전역 객체를 사용할 때 유용합니다.
“`python
class Singleton:
_instance = None
@staticmethod
def get_instance():
if Singleton._instance is None:
Singleton._instance = Singleton()
return Singleton._instance
singleton1 = Singleton.get_instance()
singleton2 = Singleton.get_instance()
print(singleton1 is singleton2) # 출력: True
“`
이 과정을 통해 `Singleton` 클래스의 **모든 인스턴스는 같은 객체**를 참조하게 됩니다. 따라서 **변수가 인스턴스 간에 자연스럽게 공유됩니다**. 이 기법은 설정 정보와 같은 글로벌 객체를 유지할 때 유용합니다.
5. 모듈을 통한 데이터 공유
파이썬 모듈을 이용해 클래스 간 변수를 공유할 수도 있습니다. 모듈은 전역 변수처럼 동작하며, 모든 모듈이 해당 변수를 접근할 수 있습니다.
“`python
# mymodule.py
shared_variable = “모듈 내 공유 변수”
# main.py
import mymodule
print(mymodule.shared_variable) # 출력: 모듈 내 공유 변수
mymodule.shared_variable = “새로운 값”
print(mymodule.shared_variable) # 출력: 새로운 값
“`
이 방법을 사용하면 **모든 클래스가 모듈의 변수를 쉽게 접근 및 수정**할 수 있어 공유 상태를 유지하기 간편해집니다. 하지만 주의해서 사용해야 하는 점은, 변수의 상태가 예측 불가능하게 변할 수도 있으므로 신중한 설계가 필요합니다.
6. 커스텀 메소드를 통한 데이터 공유
커스텀 메소드를 만들어 인스턴스 간 변수를 공유하는 것도 가능합니다. 메소드를 통해 값을 설정하거나 가져오는 방식입니다.
“`python
class Team:
shared_data = {}
def set_data(self, key, value):
Team.shared_data[key] = value
def get_data(self, key):
return Team.shared_data.get(key)
team1 = Team()
team1.set_data(‘lead’, ‘Alice’)
team2 = Team()
print(team2.get_data(‘lead’)) # 출력: Alice
“`
위 예제에서는 `set_data`와 `get_data` 메소드를 통해 클래스의 **공유 데이터**를 설정하고 가져옵니다. 따라서 여러 인스턴스 간에 데이터를 **안전하게 관리**할 수 있습니다.
이 방법은 클래스 디자인에 유연성을 더해주고, 필요에 따라 데이터 접근 로직을 변경할 수 있는 장점을 제공합니다.