OOP 최종정리
== & is (객체비교)
==- 동등한(equal)
- 변수가 참조하는 객체가 동등한, 즉 내용이 같은 경우 True
- 두 객체가 같아 보이지만 실제로 동일한 대상을 가리키고 있다고 확인해 준 것은 아님
- is
- 동일한(identical)
- 두 변수가 동일한 객체를 가리키는 경우 True
클래스 변수와 인스턴스 변수
클래스 변수
- 클래스의 정의 안에(인스턴스 메서드 밖에) 선언
- 특정 클래스 인스턴스에 묶여있지 않음
- 클래스 자체의 내용을 저장
- 같은 클래스에서 생성된 모든 객체는 동일한 클래스 변수를 공유
인스턴스 변수
- 항상 특정 인스턴스에 묶여 있음
- 클래스에 저장되지 않고 클래스에서 생성된 개별 객체에 저장
- 인스턴스 마다 완전히 독립적이므로 변수의 값을 수정하면 오로지 해당 객체에만 영향을 미침
클래스 변수와 인스턴스 변수의 함정
- 새 Cat 인스턴스를 만들고 각 인스턴스는 name 이라는 인스턴스 변수를 얻음
class Cat:
num_tails = 1
def __init__(self, name):
self.name = name
alice = Cat('alice')
james = Cat('james')
- 각 Cat 인스턴스 또는 클래스 자체에서 직접 클래스 변수(num_tails) 에 접근 가능
print(alice.num_tails)
print(james.num_tails)
print(Cat.num_tails)
-----------------------
# result
=> 1
1
1
- 클래스 변수를 수정하고 각 인스턴스에서 클래스 변수에 접근해보자
Cat.num_tails = 2
print(alice.num_tails)
print(james.num_tails)
----------------------
# result
=> 2
2
- 클래스 변수를 다시 원래 값으로 변경
- 인스턴스로 클래스 변수를 다시 변경해보자
- 그런데 클래스 변수가 변경된 것이 아닌, james 인스턴스에 num_tails 인스턴스 변수가 생겼음
Cat.num_tails = 1
james.num_tails = 2 # james 인스턴스 내에 num_tails 라는 변수가 추가됨. (class 변수과 다른 변수)
print(alice.num_tails)
print(james.num_tails)
print(Cat.num_tails)
----------------------
=> 1
2
1
- 이렇게 인스턴스 내에 클래스 변수와 동일한 변수가 추가된다면, 해당 인스턴스는 더이상 클래스 변수에 접근할 수 없음 (인스턴스 내의 변수를 우선적으로 탐색하기 때문)
정리
- 클래스 변수는 모든 클래스 인스턴스에서 공유하는 데이터를 위한 변수
- 인스터느 변수는 각 인스턴스에 고유한 데이터를 위한 것
- 클래스 변수는 동일한 이름의 인스턴스 변수에 의해 가려질 수 있기 때문에 주의해야 함
- 이 경우 버그나 원치 않는 동작을 유발할 수 있기 때문에 주의해야
인스턴스 메서드 / 클래스 메서드 / 스태틱 메서드
인스턴스 메서드
- self 매개 변수를 통해 동일한 객체에 정의된 속성 및 다른 메서드에 자유롭게 접근 가능
- 뿐만 아니라 클래스 자체에 접근할 수 있음
- 즉, 인스턴스 메서드가 클래스 상태를 수정할 수도 있음 (하지만 하면 안됨)
클래스 메서드
- 클래스를 가리키는 cls 매개변수를 받음
- cls 인자에만 접근할 수 있기 떄문에 객체 인스턴스 상태를 수정할 수는 없음
스태틱 메서드
- 임의 개수의 매개 변수를 받을 수 있지만, self나 cls 매개 변수는 사용하지 않음
- 즉, 객체 상태나 클래스 상태를 수정할 수 없음
- 일반 함수처럼 동작하지만 클래스의 namespace에 귀속됨
- 주로 해당 클래스를 한정하는 용도로 사용
스태틱 메서드는 언제 사용해야 할까?
- 스태틱 메서드는 self, cls 인자를 취하지 않기 때문에 사용에 있어 큰 제약이 있어 보임
- 하지만, 반대로 특정한 메서드가 주변의 다른 것들과 독립적일 수 있음을 뜻함
- 스태틱 메서드와 클래스 메서드를 사용하는 것은 개발자의 의도(이 메서드는 클래스, 인스턴스 변수에 아무런 영향을 미치치 않는다)를 전달하는 동시에 개발자가 자신의 의도를 강제해 버그로 인해 설계를 깨뜨리지 않도록 함
- self, cls 인자를 전달하지 않기 때문에 객체 인스턴스, 클래스 상테에 접근할 수 없음을 보장
- 또한 일반 함수를 사용하는 것처럼 실행할 수 있기 때문에 객체 지향 프로그래밍과 절차지향 프로그래밍 스타일 사이를 연결하는 역할을 하기도 함
정리
- 인스턴스 메서드는 인스턴스가 필요하며, self를 통해 인스턴스에 접근
- 클래스 메서드는 클래스 인스턴스가 필요하지 않음
- 인스턴스(self)에는 접근할 수 없지만 cls를 통해 클래스 자체에 접근할 수 있음 (=클래스 변수 조작 가능)
- 스태택 메서드는 self, cls에 접근할 수 없으며, 일반 함수처럼 작동하지만 자신이 정의된 클래스의 이름 공간에 속함
- 스태틱 및 클래스 메서드는 클래스 설계에 대한 개발자의 의도를 전달하고 강제함
- 이러한 점을 통해 코드의 유지 보수를 하는 데에 많은 도움을 줄 수 있음
댓글