본문 바로가기
Python

Python Class 개념 한번에 이해하기 (객체,인스턴스,어트리뷰트)

by Queen2 2022. 9. 8.
728x90
반응형

오늘은 파이썬 공식 홈페이지 자료를 기반으로 공부해도 해도 헷갈리는 개념인 파이썬의 클래스를 , 정리해보려 해요!

 

클래스란?

특정 값을 가진 데이터 혹은 함수 기능을 묶어서 프로그래밍에 사용할 수 있는 종합패키지라고 보시면 되는데요

파이썬 공식문서 상의 내용을 그림으로 구현해봤는데요

클래스 내부에는 데이터나 기능을 구현하는 빨간박스 내부 -> 이름 공간이 있는데 그 내부에 있는 변수나 함수 재료들이 객체인 것이죠! 예를 들어, 큰 패키지 내부에 면도기와 면도 크림이 있다면 그 내용물이 객체라고 볼 수 있는데요

 

클래스의 기능은 크게 2가지가 있다고 합니다. 클래스를 사용하기 위한 1) 인스턴스 만들기 2) 클래스 내부 객체를 활용하기 위한 어트리뷰트 참조라고 합니다.

 

첫 번째 인스턴스 만들기의 경우, 클래스의 객체를 호출한다! 라고 생각하면 편한데요. 

클래스의 객체를 호출한다는 것에는 '인스턴스 객체는 오직 어트리뷰트 참조'만 이해한다는 전제가 깔려 있는데요

def __init__(self):
    self.data = []

Class와 관련된 문서를 보면 꼭 나오는 __init__(self) 메서드의 예시를 보면 왜 self.data = [ ] 이런식으로 self.data 이런 모습을 가지고 있을까 궁금했는데, 인스턴스가 어트리뷰트 참조형태만을 이해하기 때문에 저런 식으로 표현했던거였습니다!

 

공식 문서에서는 '__init__(self)는 특정한 초기 상태로 커스터마이즈된 인스턴스로 객체를 만드는 것'으로 설명했는데요. 즉, 클래스에서 활용하려고 하는 비어있는 객체(어트리뷰트 참조 형태로 표현된 인스턴스)를 만든다!고 생각하시면 됩니다. 게임을 처음 깔고 세팅할 때 나오는 기본템들을 모두 구비해둔다고 생각하면 좀 편할 것 같아요.

 

따라서, 위 예시처럼 __init__ 메서드를 정의함과 동시에, 클래스는 자동적으로 초기화된 인스턴스를 만들 수 있게 되는 것이죠. MyClass 클래스 정의 이후 x =MyClass()를 호출하면 바로 초기화된 인스턴스를 가질 수 있다는 겁니다.

 

>>> class Complex:
...     def __init__(self, realpart, imagpart):
...         self.r = realpart
...         self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)

위 예시는 좀 더 유연한 적용을 위해서 인스턴스에 사용할 수 있는 다양한 변수들이 주어진 경우인데요.

다르게 번역하자면 def __init__()에서 self (클래스)가 realpart과 imagpart 변수를 기본적으로 가지고 있다. 그리고 Complex()에 realpart와 imagpart라는 객체를 인스턴스 생성 형태로 가져올 수 있다는 것입니다.

 


어트리뷰트 참조는 인스턴스보다 이해하기가 쉬웠는데요. '클래스에서  어떤 객체를 참조해라'는 걸 알려주는 가이드 같은 역할을 합니다. 공식 문서상의 예시를 보면, MyClass.i와 MyClass.f 둘 다 i와 f()라는 객체를 어트리뷰트 참조를 했다고 볼 수 있습니다.

class MyClass:
    """A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'

class Dog:

    kind = 'canine'         # 함수가 아닌 데이터 형태의 객체

    def __init__(self, name):
        self.name = name    # 초기화된 객체 값 제공

>>> d = Dog('Fido')			#Dog 클래스를 인스턴스 생성으로 호출
>>> e = Dog('Buddy')
>>> d.kind                  # 어트리뷰트 참조
'canine'
>>> e.kind                  
'canine'
>>> d.name                  # 어트리뷰트 참조
'Fido'
>>> e.name                 
'Buddy'

클래스의 핵심 개념인 객체, 인스턴스, 어트리뷰트 참조 개념을 알아봤는데요, 혹시 오류가 있다면 얼마든지 알려주시고 도움이 되었으면 좋겠습니다!

728x90
반응형

댓글