Programming Tools/Python_파이썬

[Python] - 객체, 클래스, 추상화, 인스턴스화(Object, Class, Abstraction, Instantiation)

LiDARian 2021. 5. 19. 23:43
반응형

객체, 클래스, 추상화, 인스턴스화

  1. 객체(Object) : 실제로 존재하는 구체적인 대상 또는 시스템. 객체는 유일하고 다른 객체와 구별된다. 객체는 상태(속성, 멤버 변수)와 행위(메소드, 멤버 함수)를 가진다. (attribute, method) : (member variable, member function 이라고도 불린다.)
  2. 클래스(Class) : 새로운 자료형을 만든다. 구조체랑 비슷하다.
  3. 추상화(Abstraction) : 동일 유형 객체를 하나의 자료형으로 묶음. 즉 각 객체를 하나의 클래스로 묶음. 객체 -> 클래스
  4. 인스턴스화(Instantiation) : 클래스를 하나의 객체로 표현. 추상화와는 반대. 클래스 -> 객체
예시1
class C1 :
  a = 1

print(C1.a)
print(dir(C1))
del C1.a

print(dir(C1))
print(C1.a)

# output :
1
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
Traceback (most recent call last):
  File "main.py", line 9, in <module>
    print(C1.a)
AttributeError: type object 'C1' has no attribute 'a'

.연산자를 이용해 클래스의 멤버변수, 멤버함수에 접근한다.
dir()함수는 클래스의 속성을 보는 함수이다.
del()은 멤버변수를 삭제하는 함수이다.

위 예시에서, del() 명령어 이후로 dir()을 사용했을 때, 멤버 변수 a가 출력되지 않는 것을 볼 수 있다. 또한 C1.a를 통해 접근도 되지 않는다.

예시2 : 인스턴스 생성
class C1 :
    a = 1

print(C1.a)
C1.b = 2 # 멤버변수 생성
print(C1.b)
x = C1() # 인스턴스 생성, 클래스와는 따로 산다.
x.a = 10
print(x.a)
print(C1.a) # x.a와는 다른 값이 나온다.

# output:
1
2
10
1

클래스에서 인스턴스를 만들려면 x = C1()라고 치면 된다


객체와 인스턴스의 차이(안중요)

클래스로 만든 객체를 인스턴스라고도 한다.

객체와 인스턴스의 차이는 무엇일까?

a = Cookie() 이렇게 만든 a는 객체이다. 그리고 a 객체는 Cookie의 인스턴스이다.
즉 인스턴스라는 말은 특정 객체(a)가 어떤 클래스(Cookie)의 객체인지를 관계 위주로 설명할 때 사용한다.
"a는 인스턴스"보다는 "a는 객체"라는 표현이 어울리며 "a는 Cookie의 객체"보다는 "a는 Cookie의 인스턴스"라는 표현이 훨씬 잘 어울린다.

정적 메서드, 클래스 메서드

메서드는 클래스 안에 있는 함수. 멤버함수라고도 한다.

정적 매서드(Static Method) : 인스턴스 개체를 따로 안만들어도 됨
클래스 메서드(Class Method) : 무조건 첫 인수로 클래스 객체를 전달한다

정적 메서드는 self를 받지 않는다. 그래서 인스턴스 속성에는 접근할 수 없다. 정적 메서드는 인스턴스 속성, 인스턴스 메서드가 필요 없을 때 사용합니다.
클래스 메서드는 정적 메서드처럼 인스턴스 없이 호출할 수 있다는 점은 같으나, 클래스 메서드는 메서드 안에서 클래스 속성, 클래스 메서드에 접근해야 할 때 사용합니다.

예시
class Calculator:
  def mul(x,y) :
      return x*y

  @staticmethod # 정적메서드 선언
  def add(x,y) :
      return x + y

  @classmethod # 클래스메서드 선언
  def total(x,y) :
      return x + y

print(Calculator.mul(10,20))
print(Calculator.add(10,20))
print(Calculator.total(10, 20))

# output:
200
30
Traceback (most recent call last):
  File "main.py", line 13, in <module>
    print(Calculator.total(10, 20))
TypeError: total() takes 2 positional arguments but 3 were given

이 경우는 에러가 뜬다
@를 데코레이터라고도 한다.

class Calculator:
  result = 0
  def mul(x,y):
      return x * y
  @staticmethod
  def add(x,y):
    return x + y
    result = 0
  @classmethod
  def total(x,y):
    x.result = x.result + y
    return x.result

print(Calculator.mul(10,20))
print(Calculator.add(10,20))
print(Calculator.total(10))

이건 ok


메서드의 또 다른 호출 방법

잘 사용하지는 않지만 다음과 같이 클래스를 통해 메서드를 호출하는 것도 가능하다.

a = FourCal()
FourCal.setdata(a, 4, 2)

위와 같이 클래스 Classname.Method 형태로 호출할 때는 객체 a를 첫 번째 매개변수 self에 꼭 전달해 주어야 한다.
반면에 다음처럼 객체.메서드 형태로 호출할 때는 self를 반드시 생략해서 호출해야 한다.

a = FourCal()
a.setdata(4, 2)

참고

클래스메서드

https://dojang.io/mod/page/view.php?id=2380

반응형