Python - Class - 클래스와 인스턴스, 메소드 개념, 메소드 호출 방법

반응형


클래스

  • 객체 지향 프로그래밍에서 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀을 의미
  • 객체를 조금 더 효율적으로 생성하기 위해 만들어진 구문


기본 형식 (구문)

  • 함수 정의 형식과 동일
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 #인스턴스 객체를 통해서도 호출 가능
반응형