파이썬 클래스 변수와 인스턴스 변수의 차이점 완벽 정리
🐍 객체지향 프로그래밍의 핵심, 클래스 변수와 인스턴스 변수 제대로 이해하기
파이썬 클래스 공부를 시작하면 가장 먼저 마주치는 개념 중 하나가 바로 클래스 변수와 인스턴스 변수입니다.
이 둘은 비슷해 보이지만, 실제로는 선언 위치부터 저장 방식, 접근 방법, 그리고 사용하는 목적까지 아주 큰 차이가 있어요.
그래서 이를 제대로 이해하지 못하면 코드가 예상과 다르게 동작하거나 오류가 발생할 수도 있죠.
이 글을 통해 여러분이 헷갈리지 않고 개념을 정확하게 정리할 수 있도록 도와드릴게요!
특히 객체지향 프로그래밍에서는 ‘공통적으로 사용할 값’과 ‘개별적으로 사용할 값’을 구분하는 것이 정말 중요합니다.
클래스 변수는 모든 객체가 함께 쓰는 반면, 인스턴스 변수는 객체마다 따로 가지는 고유한 값이에요.
코드를 짤 때 이 차이를 명확히 이해하고 적용하면 유지보수도 편하고, 오류도 줄어들게 됩니다.
자 그럼 지금부터 실제 예제와 함께 차근차근 알아볼게요 🧐
📋 목차
📌 클래스 변수란?
클래스 변수는 클래스 정의 내부에서, 메서드 바깥에 선언된 변수를 말합니다.
이 변수는 클래스에 의해 생성된 모든 인스턴스가 공유하며, 하나의 값으로 유지됩니다.
즉, 클래스에 소속된 모든 객체들이 같은 값을 참조하게 되는 것이죠.
예를 들어 어떤 자동차 클래스에서 제조사 이름 같은 정보는 모든 객체가 같기 때문에 클래스 변수로 선언할 수 있습니다.
이러한 방식은 공통적인 속성을 정의할 때 매우 유용합니다.
class Car:
manufacturer = "Hyundai" # 클래스 변수
def __init__(self, model):
self.model = model
car1 = Car("Avante")
car2 = Car("Sonata")
print(car1.manufacturer) # Hyundai
print(car2.manufacturer) # Hyundai
위 코드에서 manufacturer는 클래스 변수이기 때문에 car1과 car2 모두 같은 값을 출력합니다.
심지어 해당 변수는 클래스명.Car.변수명 형식으로도 접근할 수 있습니다.
💬 클래스 변수는 모든 인스턴스에 공통된 속성일 때 사용하며, 메모리 사용 측면에서도 효율적인 구조입니다.
단, 인스턴스에서 클래스 변수를 수정하면 독립된 인스턴스 변수로 재정의되므로 주의가 필요합니다.
이 부분은 뒷부분에서 자세히 다뤄볼게요.
📌 인스턴스 변수란?
인스턴스 변수는 각 객체(인스턴스)마다 개별적으로 존재하는 변수입니다.
클래스 내부에서 self 키워드를 통해 정의되며, 객체가 생성될 때마다 따로 저장되기 때문에 서로 영향을 주지 않습니다.
인스턴스 변수는 객체별로 고유한 상태나 속성을 표현할 때 사용합니다.
예를 들어 사람 클래스를 만들 때, 이름이나 나이처럼 사람마다 다른 값은 인스턴스 변수로 선언하는 게 맞겠죠.
class Person:
def __init__(self, name, age):
self.name = name # 인스턴스 변수
self.age = age # 인스턴스 변수
p1 = Person("지민", 28)
p2 = Person("윤아", 25)
print(p1.name) # 지민
print(p2.name) # 윤아
위 예제처럼 self.name과 self.age는 인스턴스를 생성할 때마다 각 객체에 고유하게 저장되는 변수입니다.
따라서 p1과 p2는 서로 영향을 주지 않고 독립적으로 작동합니다.
💡 TIP: 인스턴스 변수를 선언할 때는 반드시 self를 앞에 붙여야 하며, 생성자 __init__()에서 주로 사용됩니다.
정리하자면 인스턴스 변수는 객체 각각의 상태를 저장하며, 클래스 변수와는 달리 공유되지 않고 독립적인 값을 유지합니다.
이 차이를 잘 기억해 두면 클래스를 더 유연하게 설계할 수 있어요.
📌 클래스 변수와 인스턴스 변수의 차이
클래스 변수와 인스턴스 변수는 선언 위치부터 사용 방식까지 명확히 구분됩니다.
이 둘을 잘못 이해하면 프로그램이 의도와 다르게 동작하거나, 메모리 낭비로 이어질 수 있어요.
아래 표를 통해 핵심 차이점을 정리해볼게요.
| 구분 | 클래스 변수 | 인스턴스 변수 |
|---|---|---|
| 선언 위치 | 클래스 내부, 메서드 바깥 | 메서드 내부에서 self를 통해 선언 |
| 공유 여부 | 모든 인스턴스가 공유 | 각 인스턴스마다 별도 저장 |
| 접근 방법 | 클래스명.변수명 또는 self.변수명 | self.변수명 |
| 수정 시 영향 | 전체 인스턴스에 영향 (단, 인스턴스에서 수정 시 분리) | 해당 인스턴스에만 영향 |
표를 통해 확인할 수 있듯이, 클래스 변수는 모든 인스턴스가 같은 값을 공유하지만, 인스턴스 변수는 각자의 고유한 값을 갖는다는 점이 가장 큰 차이입니다.
💎 핵심 포인트:
공통 데이터는 클래스 변수로, 개별 데이터는 인스턴스 변수로 분리하는 것이 객체지향 프로그래밍의 기본입니다.
이 차이를 확실히 이해해두면, 유지보수나 확장성이 뛰어난 클래스를 구성할 수 있게 됩니다.
다음은 실제 코드 예제를 통해 두 변수를 더 명확하게 비교해보겠습니다.
📌 예제로 쉽게 비교해보기
이제 클래스 변수와 인스턴스 변수의 차이를 실제 예제를 통해 비교해보겠습니다.
코드를 직접 실행해보면 개념이 더 빠르게 와닿을 거예요.
class Dog:
species = "Canine" # 클래스 변수
def __init__(self, name):
self.name = name # 인스턴스 변수
dog1 = Dog("콩이")
dog2 = Dog("초코")
print(dog1.name) # 콩이 (인스턴스 고유 값)
print(dog2.name) # 초코
print(dog1.species) # Canine (공유 값)
print(dog2.species) # Canine
# dog1의 클래스 변수 species를 변경해보자
dog1.species = "Feline"
print(dog1.species) # Feline (dog1에서만 변경됨)
print(dog2.species) # Canine (dog2는 영향 없음)
print(Dog.species) # Canine (클래스 자체도 그대로)
위 예제에서 species는 클래스 변수로 모든 인스턴스가 공유하고 있습니다.
하지만 dog1.species = "Feline"으로 값을 변경하면, dog1에만 새로운 인스턴스 변수가 생성되어 클래스 변수와의 연결이 끊깁니다.
⚠️ 주의: 클래스 변수를 인스턴스를 통해 수정하면, 해당 인스턴스에만 적용되는 새로운 인스턴스 변수가 만들어집니다.
클래스 전체에 영향을 주려면 클래스명.변수명으로 수정해야 합니다.
이처럼 클래스 변수는 조심해서 사용해야 하며, 인스턴스 변수와의 관계를 명확히 이해하고 있어야 예상치 못한 버그를 피할 수 있습니다.
실무에서도 자주 혼동되는 부분이니 이 예제를 여러 번 따라 해보시길 추천드려요.
📌 클래스 변수 사용 시 주의사항
클래스 변수는 모든 인스턴스가 공유하는 만큼, 사용 시 몇 가지 주의해야 할 사항이 있습니다.
단순한 속성 정의가 아니라 프로그램의 동작 흐름에 직접적인 영향을 줄 수 있기 때문이에요.
- ⚠️인스턴스에서 클래스 변수를 수정하면 해당 인스턴스에만 적용되는 새 변수가 생성됩니다.
- 🛠️공유 데이터를 변경해야 할 땐 반드시 클래스명.변수명 형태로 수정하세요.
- 📌클래스 변수에 리스트나 딕셔너리처럼 변경 가능한 객체(mutable)를 사용하면, 모든 인스턴스가 함께 영향을 받습니다.
- 🚨공유 데이터가 인스턴스에 의해 예상치 못하게 덮어씌워지는 현상이 발생할 수 있으므로 주의가 필요합니다.
클래스 변수는 활용만 잘하면 매우 효율적인 도구가 될 수 있지만, 위 체크리스트처럼 잘못 다루면 오히려 코드의 버그 원인이 될 수 있습니다.
특히 팀 프로젝트나 대규모 코드에서 클래스 변수의 역할은 명확하게 정의되어야 해요.
💎 핵심 포인트:
클래스 변수는 “공유”가 핵심입니다.
따라서 모든 인스턴스가 같은 데이터를 써야 할 필요가 있을 때만 사용하고, 그렇지 않다면 인스턴스 변수를 사용하는 것이 더 안전합니다.
이제 클래스 변수와 인스턴스 변수의 차이점은 물론, 주의해야 할 상황까지 충분히 익히셨을 거예요.
이제 자주 묻는 질문들을 통해 놓치기 쉬운 부분들을 한 번 더 정리해볼게요.
❓ 자주 묻는 질문 (FAQ)
클래스 변수와 인스턴스 변수를 한 클래스에 같이 사용할 수 있나요?
클래스 변수는 클래스 전체에서 공유하고, 인스턴스 변수는 객체마다 고유하게 동작하므로 함께 사용하는 것이 일반적입니다.
클래스 변수는 꼭 클래스명으로 접근해야 하나요?
self를 통해 접근할 수도 있지만, 혼동을 줄이기 위해 클래스명을 사용하는 것이 좋습니다.
클래스 변수는 언제 사용하는 게 좋을까요?
예를 들어 전체 학생 수, 기본 세율, 공통 설정값 등에 사용됩니다.
인스턴스 변수는 클래스 외부에서 접근할 수 있나요?
생성된 객체를 통해
객체명.변수명 형식으로 접근할 수 있습니다.다만, 변수명을 외부에 공개해도 괜찮은 경우에만 사용하는 것이 좋습니다.
클래스 변수와 인스턴스 변수 이름이 같으면 어떻게 되나요?
객체가 클래스 변수와 동일한 이름으로 인스턴스 변수를 설정하면 클래스 변수와의 연결이 끊기고, 해당 인스턴스에만 적용됩니다.
리스트를 클래스 변수로 쓰면 어떤 문제가 생기나요?
따라서 mutable 객체를 클래스 변수로 사용할 때는 주의가 필요합니다.
클래스 변수는 클래스가 생성될 때만 정의되나요?
이후에는 모든 인스턴스가 이 변수를 공유하며, 클래스 전체의 상태를 나타낼 때 유용하게 사용됩니다.
클래스 변수로 인스턴스 개수를 셀 수 있나요?
클래스 변수에 생성자에서 카운트를 누적시켜 주면 전체 인스턴스 개수를 추적할 수 있습니다.
실무에서 자주 쓰이는 패턴 중 하나입니다.
📌 클래스 변수와 인스턴스 변수의 차이를 제대로 이해하자
파이썬 클래스에서 변수의 종류를 명확히 구분하는 것은 객체지향 프로그래밍의 기본이자 핵심입니다.
클래스 변수는 여러 객체가 함께 쓰는 공유 속성이고, 인스턴스 변수는 각 객체가 개별적으로 가지는 데이터라는 점을 확실히 기억하세요.
이번 글에서는 두 변수의 선언 위치, 접근 방식, 사용 예제, 주의사항까지 꼼꼼히 살펴보았습니다.
특히 클래스 변수를 수정하거나 활용할 때는 언제나 공유의 특성과 부작용을 함께 고려해야 하며, 인스턴스 변수는 객체 고유의 데이터를 표현할 때 가장 안전한 선택입니다.
앞으로 클래스를 활용한 다양한 프로젝트에서 이 개념을 명확히 이해하고 적용하신다면, 더 나은 설계와 유지보수가 가능할 것입니다.
처음엔 헷갈릴 수 있지만, 직접 예제를 작성해보며 익히는 것이 가장 좋은 학습 방법이에요.
🏷️ 관련 태그 : 파이썬클래스, 클래스변수, 인스턴스변수, 객체지향, self, 파이썬기초, 프로그래밍개념, 코드설계, 공유데이터, 파이썬변수종류