본문 바로가기
Python

객체지향 프로그래밍

by Salgoo26 2021. 8. 30.

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에 접근할 수 없으며, 일반 함수처럼 작동하지만 자신이 정의된 클래스의 이름 공간에 속함
  • 스태틱 및 클래스 메서드는 클래스 설계에 대한 개발자의 의도를 전달하고 강제함
    • 이러한 점을 통해 코드의 유지 보수를 하는 데에 많은 도움을 줄 수 있음

'Python' 카테고리의 다른 글

상속  (0) 2021.08.30
클래스와 인스턴스  (0) 2021.08.30
객체  (0) 2021.08.30
데이터 구조  (0) 2021.08.30
제어문  (0) 2021.08.30

댓글