클래스와 객체의 본질

YangJiWon·2020년 9월 3일
0

python

목록 보기
11/12

객체 안에 변수가 만들어지는 시점

  • 클래스 : 객체를 만들기 위한 일종의 설계도

  • 객체 : 클래스를 기반으로 만들어진 실제 사물

  • 파이썬의 클래스와 객체에는 조금 독특한 부분이 있습니다. 아래의 예를 참고하시죠

class Simple:
    def set_i(self, i):
        self.i = i
    def get_i(self):
        return self.i
  • 클래스의 기본 정의는 다음과 같습니다.
  • 클래스 내에 들어갈 변수와 메소드를 결정하는 것
  • 그런데 위의 클래스에는 메소드의 정의만 존재합니다. 변수의 선언은 존재하지 않습니다.
    하지만 파이썬은 객체에 필요한 변수를 알아서 생성해줍니다. 그리고 객체 내에 변수가 생성되는 정확한 시점은 다음과 같습니다.

객체 내에서 해당 변수를 대상으로 대입 연산을 처음 진행하는 순간

  • 따라서 위의 클래스를 대상으로 다음과 같이 객체를 생성하고 메소드를 호출하면 문제가 없습니다.
s1 = Simple()
s1.set_i(200) # 이 메소드의 실행 과정에서 객체 내에 변수 i가 만들어집니다.
s1.get_i()
# 200 출력
  • 하지만 get_i 메소드를 set_i 메소드보다 먼저 호출해 버리면 오류가 발생합니다.
  • 그러나 클래스를 정의할 때, 객체 생성 시 자동으로 호출되는 __init__메소드를 다음과 같이 정의하고 또 그 안에서 객체 내에 필요한 모든 변수를 초기화 해주기만 한다면 위에서 보인 오류 상황은 걱정하지 않아도 됩니다.
class Simple:
    def __init__(self):
        self.i = 0
    def set_i(self, i):
        self.i = i
    def get_i(self):
        return self.i


s = Simple()
s.get_i() # 0
s.set_i(25)
s.get_i() # 25

객체에 변수와 메소드 붙였다 떼었다 하기

  • 파이썬의 객체는 변수와 메소드를 붙이기도 하고 떼기도 할 수 있습니다.
class SoSimple:
    def geti(self):
        return self.i

ss = SoSimple()
ss.i = 27 # 이 순간 변수 ss에 담긴 객체에 i라는 변수가 생깁니다.
ss.geti() # ss에 담긴 객체에 i가 생겼으므로 geti 메소드 호출 가능
# 27

ss.hello = lambda : print('hi~')
ss.hello()
# hi~

del ss.i # ss에 담긴 객체에서 변수 i 삭제
del ss.hello # ss에 담긴 객체에서 메소드 hello 삭제
  • 이와 같이 파이썬 클래스에 메소드와 클래스를 붙였다가 뗄 수 있습니다.

  • 여기서 한 가지 의문이 드는 것은, 클래스는 객체와 달리 설계도일 뿐인데 어떻게 변수를 추가할 수 있을까?

  • 변수 추가가 가능한 이유는 다음에 있습니다.
    파이썬의 클래스는 클래스이자 객체이다.

  • 프로그래머가 직접 정의하는 클래스들은 'type이라는 클래스'의 객체입니다.

  • 그래서 객체에 변수를 추가하듯이 클래스에도 변수를 추가할 수 있습니다.

class Simple:
    def __init__(self, i):
        self.i = i
    def set_i(self, i):
        self.i = i
    def get_i(self):
        return self.i

Simple.n = 7 # Simple 클래스에 변수 n을 추가하고 7로 초기화

s1 = Simple(3)
s2 = Simple(5)
print(s1.n, s1.geti(), sep = ', ')
print(s2.n, s2.geti(), sep = ', ')
  • 이 두 객체에는 n이 없습니다. 이 때 파이썬은 해당 객체의 클래스를 찾아가서 n을 찾습니다.
    즉, 두 경우 모두 Simple 클래스에서 n을 찾습니다. 그래서 s1과 s2를 통해 n을 출력한 결과가 같습니다.

  • 정리하자면,

  1. 클래스에 속하는 변수를 만들 수 있습니다.
  2. 객체에 '찾는 변수'가 없으면 해당 객체의 클래스로 찾아가서 그 변수를 찾습니다.

파이썬에서는 클래스도 객체

  • type은 우리가 지금까지 자료형을 확인할 때 호출해 왔던 함수의 이름입니다.
    그런데 이는 사실 클래스의 이름입니다.
type
# <class 'type'>
type([1, 2])
# <class 'list'>
type(list)
# <class 'type'>
  • [1, 2]의 자료형을 물으니 list라고 답하고, list의 자료형을 물으니 type 클래스의 객체라고 말했습니다.
  • 즉, list 클래스는 사실 type이라는 클래스의 객체였던 것입니다.

정리하자면,
1. 클래스도 객체입니다.
2. 클래스는 type이라는 클래스의 객체입니다.

전체 요약

  • 파이썬의 클래스는 그 자체로 객체로 객체를 대상으로 할 수 있는 일들 대부분을 클래스를 대상으로도 할 수 있습니다.
  • 다음과 같이 변수에 클래스를 담을 수 있는 것도 클래스가 객체이기 때문에 가능한 일입니다.
class Simple:
    pass
simple2 = Simple
s1 = Simple()
s2 = simple2() # 변수 simple2로도 객체 생성할 수 있음
profile
데이터데이터데이터!!

0개의 댓글