/ PYTHON

(Python) 클래스변수와 인스턴스 변수


객체와 클래스

클래스 : 객체를 만들어 내기 위한 설계도, 틀이라고 할 수 있다. 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성과 행위를 변수와 메서드로 정의한것이다

객체(인스턴스) : 클래스에 선언된 모양 그대로 생성된 실체이다. 클래스에서 정의한 것을 토대로 실제 메모리상에 할당된 것으로 실제 프로그램에서 사용되는 데이터이다

추상화 : 공통의 속성이나 기능을 묶어 이름을 붙이는것이다


인스턴스 변수

인스턴스 변수는 각각의 인스턴스마다 독립된 변수이다. 클래스는 여러 인스턴스를 생성하지만 각각의 인스턴스 변수는 생성된 인스턴스마다 각각의 값을 보존하고 있다.

인스턴스화 될 때마다 새로운 값이 할당되며 서로 다른 객체 간에는 값을 공유할 수 없는 변수이다
-> 객체 단위로 값이 따로 관리되는 변수는 반드시 인스턴스 변수를 사용한다
-> 클래스 변수는 객체 이름이 아닌 클래스 이름으로 접근, 되도록 값이 변경되지 않는 경우에 사용하는 것이 안전하다


인스턴스 변수 선언과 접근 방법

인스턴스 변수 생성은 생성자 클래스 __ init() __ 내부에 작성되고 클래스 내부에서 ‘self.인스턴스 변수’로 접근할 수 있다

def __init__(self, 인스턴스 변수) 
self.인스턴스 변수 =  # 선언

self.인스턴스 변수 # 접근

self: 인스턴스 메서드는 첫번째의 매개변수로 self가 넘어오게 되어있다. self는 각 고유, 클래스를 기반으로 생성된 인스턴스가 자기 내부의 고유의 값을 저장하기 위한 어떤 예약된 지시어, 예약어이다

인스턴스 변수와 클래스 변수는 동일한 변수 이름 생성이 가능하다. 실행이 되면 가장 먼저 인스턴스 네임스페이스에서 네임을 찾고 해당 네임이 없는 경우 상위(클래스 변수)에서 검색된다


클래스 변수

클래스 변수는 모든 인스턴스 사이에서 공유된 값을 가진 변수이다. 여러 인스턴스에서 클래스 변수를 호출해 변경하면 클래스 변수는 공유되기 때문에 값이 유연하기 바뀐다
클래스에 의해 생성된 모든 객체가 인스턴스화되는 시점에 같은 값을 조회할때 사용 하는 변수이다

클래스 변수 선언과 접근 방법

클래스 변수 생성은 self를 붙이지 않고 클래스 내부 바로 아래에 보통 선언한다

class ThisClass():
    클래스 변수 =  # 선언

    클래스.클래스 변수 # 접근



클래스 내부에 쓰인 클래스 변수와 인스턴스 변수를 코드로 살펴보자.

class Car():
    """
    Car class
    Author: kim
    Date:2021.07.05
    """
    # 클래스 변수
    # 즉, 클래스변수는 모든 인스턴스가 공유하고 있다
    car_count = 0


    def __init__(self, company, details):
        # 인스턴스 변수
        self._company = company
        self.car_count = 10
        self._details = details
        Car.car_count += 1


python 에서 기본적으로 제공해주는 기능들이며 실제로 자주 쓰이는 메소드들이다.

__ str __ : 클래스 내부에다 상속받고 있는 str 을 정의하면 클래스 인스턴스 내부의 속성 정보를 원하는대로 출력이 가능하다.

__ repr __ : str과 같은 역할을 하지만 차이점이 존재한다. str은 비공식적인 사용자 입장에서 인스턴스 내부의 속성 정보를 보고 싶을때 출력한다. 즉 사용자 레벨에서 print문으로 정보를 확인할때 str을 사용하고 개발자 입장에서 객체의 엄격한 타입등을 인식할 수 있게 출력하려면 repr을 사용한다. 이때 기본값은 str이기 때문에 둘다 써져있을때는 str이 우선 출력된다.

__ dict __ : 불필요한 정보를 제외하고 인스턴스 안의 네임스페이스만 보고싶을때 사용한다. 인스턴스 안에 있는 속성 정보 즉 애트리뷰트 값을 볼 수 있다. car1.__dict__

{'_company': 'Ferrari', '_details': {'color': 'Silver', 'horsepower': 300, 'price': 6000}}

dir() : dir을 쓰게 되면 인스턴스가 가지고 있는 모든 속성 즉, 메타 정보를 볼 수 있다.

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__'....

__ doc __ : “"”를 이용해 클래스에 대한 코멘트를 달았을 경우 doc를 통해 해당 클래스에 대한 코멘트를 볼 수 있다