일단 하자

# 7 - 1. 클래스 선언 및 self의 이해 본문

파이썬 웹 개발/파이썬 기초 개념

# 7 - 1. 클래스 선언 및 self의 이해

coredump064 2019. 11. 14. 21:15

1. 클래스 선언

2. 클래스 네임스페이스

3. 클래스, 인스턴스 변수

4. self

 

+클래스를 쓰는 이유

1. 클래스 단위의 기능분류로 유지보수를 쉽게하고 생산성을 안정화시킬 수 있다.

2. 반복적인 코드를 피하고, 상속을 통한 코드의 재활용으로 인해 코드가 안전하다.

 

많은 패키지들이 클래스 코딩(객체지향)으로 명확하게 클래스 단위를 통한 기능분류를 해놓았다.


결론 : 클래스 코딩을 해야한다.


1. 클래스 선언

class 클래스명: # ()는 해도 되고 안해도 된다.
	함수
    함수
    함수
    ...

 

클래스 이름의 첫글자는 대문자가 원칙이다. 

class Test:
	def __init__(self):
    	print("초기화")
        
test1 = Test()

 클래스는 속성과 메서드로 구성된다. __init__함수는 인스턴스가 생성될 때 자동으로 호출이 되는 메서드이다.  C++, Java에서의 생성자와 같다. 클래스가 메모리 test1에 할당되는 순간에 __init__이 자동으로 호출되서 '초기화'가 출력이 되었다.

 

2. 클래스 네임스페이스

네임스페이스는 객체를 인스턴스화할 때 저장된 독립적인 메모리 공간이다.

class UserInfo:
	def __init__(self, name):
    	self.name = name
    def user_info_p(self):
    	print("Name :", self.name)
        
user1 = UserInfo("Kim")
user1.user_info_p() # 인스턴스화는 할당하는 것을 말한다.

user2 = UserInfo("Park")
user2.user_info_p()

 현재 user1과 user2는 같은가? 아니다. 서로 갖고 있는 속성값이 다르다. 각각의 네임스페이스(저장공간)에는 전혀 다른 값이 들어가있다. 서로 독립적인 네임스페이스를 갖는다.

# 메모리 주소값 출력
print(id(user1))
print(id(user2))

# 네임스페이스 출력
print(user1.__dict__)
print(user2.__dict__)

 

+ 중간 정리

우리는 클래스 형태의 코딩을 하고 그것을 인스턴스화해서 메모리에 할당한다.

 

- 클래스, 인스턴스의 차이

클래스는 붕어빵을 만드는 틀이고, 인스턴스는 그 틀을 통해서 만들어낸 붕어빵이라고 생각하면 된다. 인스턴스는 C++, Java 등 다른 언어에서는 객체, Object라고 한다. 다 같은 말이다.

 

 

3. 클래스, 인스턴스 변수

클래스 변수/ 클래스 메서드 : 직접 사용 가능. 객체보다 먼저 생성되며 모든 객체들이 공유한다.

인스턴스 변수/ 인스턴스 메서드 : 객체마다 별도로 존재, 인스턴스 생성 후 사용 가능하다.

 

4. self

class SelfTest:
	def function1():
    	print("function1 called!")
    def function2(self):
    	print(id(self)
    	print("function2 called!")
        
self_test = SelfTest()
self_test.function1() # 에러발생
selfTest.funcion1()

 function1은 self인자가 없기 때문에 인스턴스에서 호출할 수 없는 클래스 메서드이다. 그래서 클래스를 통해 직접 호출해야한다.

 

self_test.function2()
print(id(self_test))

 function2에서 호출한 self의 id와 self_test의 id가 같은 것을 볼 수 있다. 즉, self_test가 self인자로 넘어간 것이다. 그래서 고유의 instance를 가질 수 있는 것이다.

 

 또한, 클래스로 인스턴스 메서드를 호출할 수 없다. 호출하기 위해서는 인스턴스를 인자로 넘겨주어서 호출해야한다.

SelfTest.function2(self_test)

 

+ 요약

self가 있다 : 인스턴스 속성

self가 없다 : 클래스 속성

# 클래스 변수(self없음), 인스턴스 변수(self있음)
class WareHouse:
	# 클래스 변수
    stock_num = 0 # 클래스 변수이므로 인스턴스끼리 공유한다.
    def __init__(self, name):
    	self.name = name
        WareHouse.stock_num += 1
    def __del__(self): # 인스턴스가 종료될 때 호출되는 함수(소멸자)
    	WareHouse.stock_num -= 1
        
        
user1 = WareHouse("Kim")
user2 = WareHouse("Park")
user3 = WareHouse("Lee")
# 각각의 인스턴스의 네임스페이스 출력
print(user1.__dict__)
print(user2.__dict__)
print(user3.__dict__)

클래스 변수는 나오지 않는다.

# 클래스의 네임스페이스
print(WareHouse.__dict__)

stock_num이 3으로 출력된 것을 볼 수 있다. 즉, 인스턴스 끼리 공유한다는 것을 알 수 있다.

 

print(user1.stock_num)
print(user2.stock_num)
print(user3.stock_num)

자신의 네임스페이스에 없으면 클래스의 네임스페이스에 가서 찾는다. 거기에도 없으면 에러를 발생시킨다.

 

del user1

print(user2.stock_num)
print(user3.stock_num)

 user1이 del로 메모리에 삭제되면서 __del__함수가 호출되고, stock_num의 값이 1감소하였다. stock_num은 클래스 변수로 모든 인스턴스가 공유하기 때문에 다른 인스턴스의 stock_num 또한 1이 감소된 것을 볼 수 있다.

 

모든 타입. 클래스, list, int, float 등 모든 타입은 자기만의 네임스페이스를 갖는다.

Comments