'''
클래스 변수
1. 메서드 밖에서 선언한 변수 의미
2. 프로그램 실행 시 생성 ~ 프로그램 종료시 제거된다.
3. 객체 생성과 무관
4. 참조는 클래스명.클래스변수 형식으로 사용한다.
5. 용도는 누적용(여러 인스턴스가 공유해서 누적하면서 사용하는 용도)
'''
class Cat:
x=10
def __init__(self,name,age):# 인스턴스 메서드 ==> 객체 생성후에 사용가능하다.
self.name=name
self.age=age
def cum_up(self): #인스턴스 메서드 ==> 객체 생성후에 사용가능하다.
Cat.x=Cat.x+1
self.age=self.age+1
print(Cat.x)# 클래스 변수는 객체생성과 무관하다.
# 객체 생성
c1=Cat("야옹이",2)
c1.cum_up()
print("클래스 변수 x:",Cat.x)
print("인스턴스 변수 age:",c1.age)
c2=Cat("나비",3)
c2.cum_up()
print("클래스 변수 x:",Cat.x)
print("인스턴스 변수 age:",c2.age)
'''
클래스 매서드
1. 문법
class 클래스 명:
@classmethod #decorator (자바는 annotation)
def 클래스 매서드명 (cls):
pass
==> 프로그램 실행시 생성~ 프로그램 종료시 제거
==> 사용방법:
클래스명.클래스매서드() 형식으로 사용한다.
==> 용도:
- 객체 생성 없이 매서드 사용하기 위해서
def 인스턴스 매서드(self):
pass
==> 객체 생성시 인스턴스 매서드가 생성됨.
(객체 생성 후에 사용이 가능하다.
사용방법: self.인스턴스 매서드
c1.인스턴스 매서드)
'''
class Cat:
@classmethod
def kkk(cls):
print("cls 주소값",id(cls))
print("kkk")
#인스턴스 매서드
def a(self):
self.b() #같은 클래스 내에서 인스턴스 매서드 호출은 self.매서드명(인스턴스 변수 사용과 동일)
print("self 주소값:",id(self))
print("a")
def b(self):
print("b")
Cat.kkk() # 객체 생성 전에 사용이 가능함
print("Cat 주소값:",id(Cat))
c1=Cat()
print("c1 주소값:",id(c1))
c1.a()
c1.b()
x = 10 # 클래스 변수 ==> 접근 방법 2가지 (내부: cls.x, 내외부:Cat.x)
@classmethod
def y(cls): #클래스 매서드==> 접근 방법 2가지 (내부: cls.y(), 내외부:Cat.x)
print("x 값 접근1:",cls.x)
print("x값 접근2:",Cat.x)
#print(self) 에러 이유는 클래스 변수 및 매서드가 인스턴스(self) 보다 먼저 생성되기 때문이다.
def k(self):
print("k에서 x접근:",Cat.x) #실행되는 이유는 인스턴스 매서드(k)보다 클래스 변수인 x가 먼저 생성되기 때문이다.
Cat.y() #클래스 매서드 접근
print(Cat.x)
c1=Cat() #인스턴스 매서드 접근
c1.k()