일단 하자
# 7 - 1. 클래스 선언 및 self의 이해 본문
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 등 모든 타입은 자기만의 네임스페이스를 갖는다.
'파이썬 웹 개발 > 파이썬 기초 개념' 카테고리의 다른 글
# 8. 모듈과 패키지 (0) | 2019.11.28 |
---|---|
# 7 - 2. 클래스 상속 및 다중 상속 (0) | 2019.11.26 |
# 6. 함수 및 람다(lambda) (0) | 2019.11.13 |
# 5 - 3. 조건문, 반복문 퀴즈 (0) | 2019.11.13 |
# 5 - 2. 반복문 (0) | 2019.11.13 |