본문 바로가기
개발

인스턴스 변수 vs 클래스 변수 차이

by Kyutree 2026. 1. 31.

아침에 커피를 마시면서 문득 이런 생각이 들었습니다.

'클래스'라는 이름으로 묶여 있지만, 객체마다 다른 값을 가질 수도 있고, 모든 객체가 공유하는 값도 있을 텐데, 이걸 코드로 어떻게 표현할까?

프로그래밍을 하다 보면 이러한 고민에 빠지게 됩니다.

오늘은 객체 지향 프로그래밍(OOP)에서 중요한 개념인 인스턴스 변수와 클래스 변수의 차이점에 대해 자세히 알아보겠습니다.

 

인스턴스 변수란 무엇인가

 

인스턴스 변수는 클래스를 통해 생성된 각 객체(인스턴스)마다 독립적으로 가지는 변수를 의미합니다.

즉, 각 인스턴스는 자신만의 고유한 인스턴스 변수 값을 저장하고 수정할 수 있습니다.

참고 자료에 따르면, 인스턴스 변수는 객체를 실체화시킨 것으로 클래스로 만들 수 있다고 합니다.

예를 들어, '자동차'라는 클래스가 있다면, 각 자동차 객체는 '색상', '모델', '최고 속도'와 같은 자신만의 인스턴스 변수를 가질 수 있습니다.

각각의 자동차는 서로 다른 색상, 모델, 최고 속도를 가질 수 있기 때문입니다.

 

클래스 변수란 무엇인가

 

클래스 변수는 클래스 자체에 속하는 변수이며, 해당 클래스의 모든 인스턴스가 공유하는 값을 저장합니다.

클래스 변수는 클래스의 인스턴스가 얼마나 많이 존재하는지에 관계없이, 하나의 사본만 존재합니다.

예를 들어, '자동차' 클래스에 '바퀴 수'라는 클래스 변수가 있다면, 모든 자동차 인스턴스는 기본적으로 4개의 바퀴를 가진다는 정보를 공유하게 됩니다.

특정 자동차의 바퀴 수를 변경하더라도 다른 자동차의 바퀴 수에는 영향을 미치지 않습니다.

하지만 클래스 변수의 값을 변경하면, 해당 클래스의 모든 인스턴스에 영향을 미칩니다.

 

인스턴스 변수와 클래스 변수의 선언 및 사용

 

인스턴스 변수는 일반적으로 클래스의 생성자(constructor) 내에서 `self.변수명` 형태로 선언됩니다.

반면, 클래스 변수는 클래스 정의 바로 아래, 메서드 밖에 `변수명 = 값` 형태로 선언됩니다.

참고 자료에 따르면, 인스턴스 변수는 `{인스턴스의 이름}.{클래스 변수}` 형태로 사용하는 것이 가능하지만 권장되지는 않습니다.

클래스 변수는 `클래스명.변수명` 또는 `인스턴스명.변수명` 형태로 접근할 수 있지만, 클래스명으로 접근하는 것이 더 명확하고 권장됩니다.

 

인스턴스 변수와 클래스 변수의 활용 시점

 

어떤 변수를 인스턴스 변수로 사용할지, 클래스 변수로 사용할지는 프로그램의 설계에 따라 결정됩니다.

만약 객체마다 독립적인 값을 가져야 하는 속성이라면 인스턴스 변수를 사용해야 합니다.

예를 들어, 각 학생의 이름, 나이, 점수 등은 인스턴스 변수로 관리하는 것이 적절합니다.

반면, 모든 객체가 공유하는 값, 또는 클래스 자체에 대한 정보를 나타내는 변수는 클래스 변수로 사용하는 것이 좋습니다.

예를 들어, 특정 학교의 학생 수를 추적하거나, 모든 자동차의 기본 바퀴 수를 저장하는 데 클래스 변수를 사용할 수 있습니다.

참고 자료에서는 클래스 변수는 클래스에서 공통된 속성을 가질 때, 인스턴스 변수는 각각 독립된 값을 가질 때 사용한다고 조언합니다.

 

주의사항 및 추가 정보

 

클래스 변수를 사용할 때 주의할 점은, 인스턴스를 통해 클래스 변수의 값을 변경하면, 해당 인스턴스에만 새로운 인스턴스 변수가 생성될 수 있다는 것입니다.

이는 클래스 변수의 값을 변경하는 것이 아니라, 같은 이름의 인스턴스 변수를 새로 만드는 것이기 때문에 예상치 못한 결과를 초래할 수 있습니다.

최근에는 객체 지향 프로그래밍 언어에서 클래스 변수와 관련된 다양한 기능과 디자인 패턴이 등장하고 있습니다.

예를 들어, 싱글톤 패턴은 클래스의 인스턴스를 단 하나만 생성하도록 제한하는 디자인 패턴인데, 클래스 변수를 활용하여 구현할 수 있습니다.

이러한 패턴들을 이해하고 활용하면 더욱 효율적이고 유지보수가 용이한 코드를 작성할 수 있습니다.

 

인스턴스 변수와 클래스 변수는 객체 지향 프로그래밍의 기본적인 개념이지만, 프로그램의 동작 방식에 큰 영향을 미칩니다.

각 변수의 특징과 활용 시점을 정확히 이해하고, 상황에 맞게 적절하게 사용하는 것이 중요합니다.

최근 개발 트렌드를 살펴보면, 코드를 더욱 명확하고 유지보수하기 쉽게 만들기 위해 불변 객체(immutable object)를 사용하는 경우가 많습니다.

이러한 경우에는 클래스 변수의 사용을 최소화하고, 인스턴스 변수를 통해 객체의 상태를 관리하는 것이 좋습니다.

프로그래밍은 결국 데이터를 효율적으로 관리하고 활용하는 기술입니다.

인스턴스 변수와 클래스 변수를 능숙하게 다루는 것은 데이터 관리 능력 향상에 큰 도움이 될 것입니다.