반응형
클래스
- 객체 지향 프로그래밍에서 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀을 의미
- 객체를 조금 더 효율적으로 생성하기 위해 만들어진 구문
기본 형식 (구문)
- 함수 정의 형식과 동일
class 클래스 이름 : # 대소문자를 구분하기때문에 소문자로 class 정의
클래스 내용 # 인스턴스 : 클래스로부터 만들어진 객체
인스턴스
- 클래스가 있는 객체 지향 프로그래밍에서 클래스에 정의된 변수 (=클래스 변수)
- 클래스와 인스턴스는 별도의 이름 공간이 할당
- 동적으로 인스턴스 내부에 멤버 추가 가능
- 인스턴스마다 모두 독립적인 이름 공간
a = 0
class S1 :
a = 1
x = S1()
print(a) >>> 0
print(x.a) >>> 1
print(S1.a) >>> 1
x.a = 10
print(a) >>> 0
print(x.a) >>> 10
print(S1.a) >>> 1 # x와 S1은 독립적인 공간을 가짐
메소드
- 클래스가 가지고 있는 함수
- 일반적인 함수와 똑같이 정의하지만 첫 번째 매개변수로 self를 사용 (관례적)
- self는 인스턴스 객체 자신의 레퍼런스를 지니고 있음
- 각 인스턴스들은 self를 활용해 자신의 이름 공간에 접근 가능
메소드 호출
- 인스턴스 객체를 활용한 메소드 호출(self 인자 생략)
class MyClass :
def class_set(self, v):
self.value = v
def class_get(self):
return self.value
# 인스턴스 객체를 활용한 메소드 호출(self 인자 생략)
c = MyClass() # 인스턴스 생성
c.class_set('10')
print(c.class_get())
>>> 10
- 클래스 객체를 이용한 메소드 호출(직접 인스턴스를 적어줌)
class MyClass :
def class_set(self, v):
self.value = v
def class_get(self):
return self.value
# 클래스 객체를 이용한 메소드 호출(직접 인스턴스를 적어줌)
c = MyClass() # 인스턴스 생성
MyClass.class_set(c, '10')
print(MyClass.class_get(c))
>>> 10
- 객체 내부 메소드의 호출
- 주의! self를 적어주지 않으면, 외부에서 메소드를 찾게 됨
class MyClass() :
def class_set(self, v):
self.value = v
def class_get(self):
return self.value
def class_incr(self):
self.class_set(self.value + 1) # 내부 메소드 호출
c = MyClass() # 인스턴스 생성
c.class_set('10')
print(c.class_get())
>>> 10
c.class_incr()
print(c.class_get())
>>> 11
class MyClass1() :
def class_set(self, v):
self.value = v
def class_get(self):
return self.value
def class_incr(self):
class_set(self.value + 1) # self가 없으면 외부에서 메소드를 찾음
c = MyClass1() # 인스턴스 생성
c.class_set('10')
print(c.class_get())
>>> 10
c.class_incr()
print(c.class_get())
>>> 10
- 정적 메소드
- 인스턴스 객체와 무관하게 클래스 이름공간에 존재하는 메소드
- 클래스 이름을 이용하여 직접 호출 가능
- 장식자 @staticmethod 사용
class C:
def ham(self, x, y):
print('instance method', x , y)
c = C()
c.ham(1, 2) >>> instance method 1 2
C.ham(1, 2) >>> error #인스턴스 객체 없이 클래스에서 직접 호출
class D:
@staticmethod
def spam(x, y):
print('static method', x, y)
D.spam(1, 2) >>> instance method 1 2 #인스턴스 객체 없이 클래스에서 직접 호출
d = D()
d.spam(1, 2) >>> instance method 1 2 #인스턴스 객체를 통해서도 호출 가능
반응형