본문 바로가기

Python 기초

11. 클래스 (Class) - 1

클래스 객체 생성 

 

class ClassName :
	pass
    
c = ClassName()

 

" 객체 = 클래스 이름 "

클래스의 생성자와 소멸자 

 

class One :
	def __init__(self) :
    	print('constructor')
        
    def __del__(self) :
    	print('destructor')
        
ex1 = One()

class Two : 
	def __init__(self, a, b, c) :
    	print(f'constructor({a},{b},{c})')
        
    def __del__(self) :
    	print('destructor')
        
ex2 = Two(1,2,3)

 

  • 생성자(constructor) : 클래스 객체가 생성 될 때 호출된다. 생성자는 __init__ 이라는 미리 지정된 이름을 사용해야 하며 첫 번째 인자로 반드시 self 를 지정해주어야한다. 필요하다면 def __init__(self,a,b,c) 와 같이 self 뒤에 필요한 인자들을 더 추가할 수 있다.
  • 소멸자(destructor) : 클래스 객체가 소멸될 때 호출된다. 소멸자는 __del__ 이라는 미리 지정된 이름을 사용해야하며, 첫 번째 인자로 반드시 self 를 지정해주어야 한다.

✅ self 인자, 오버로딩

 

1. 메소드 (클래스 내에서 선언 되는 함수) 들은 첫 번째 인자로 무조건 self 를 선언해야한다.

 

2. 생성자 오버로딩 

 

   파이썬에서는 생성자 오버로딩을 지원하지 않는다. 즉, 파이썬에선 생성자를 여러개 만들 수 없다.

 

클래스 인스턴스 필드 

 

" 인스턴스 필드 = 객체마다 따로 보관되는 데이터 " 

 

class One : 
	def __init__(self) : 
    	self.x = 0       # 인스턴스 필드 x 
        self.y = 0 		 # 인스턴스 필드 y
        
ex1 = One()
ex1.x = 5 
ex2 = One()
ex2.x = 10 

-------------------------------------------------------

# ex1.x = 5 
# ex2.x = 10  
# 즉, ex1 객체와 ex2 객체의 각 인스턴스 필드는 다른 값을 가진다.

 

1. One 클래스의 생성자 메소드에서 self 를 이용해 x와 y 필드를 만듦

2. One 클래스의 인스턴스 ex1, ex2 를 각각 만들어 다른 값을 저장하고 출력.

 

각 객체의 x 들은 다른 값을 가질 수 있다는 것을 알 수 있다.

 

✅ __dict__ 어트리뷰트 

 

딕셔너리(dictionary) 이다. 함수에 관련된 데이터들을 키와 값으로 저장할 수 있다. 

 

접근 권한 한정자 

 

C++ 과 같은 프로그래밍 언어는 멤버 변수( = 파이썬의 인스턴스 필드) 와 멤버 함수( = 파이썬의 메소드) 는 클래스 외부에서 접근 정도를 제한 할 수 있는 public 과 private 한정자들을 언어 차원에서 지원하지만 파이썬에서는 접근 권한 한정자를 직접 지원하진 않는다. 

 

✅ name mangling 

 

프로그래밍 언어에서 컴파일러나 인터프리터가 일정한 규칙에 의해 원래의 이름을 다른 이름으로 변경해 버리는 것. 파이썬에서는 __ 가 붙은 인스턴스 필드를 '_클래스이름__변수이름' 과 같이 바꾼다.

 

class One:
	def __init__(self):
    	self.x = 1
        self.y = 2
        self.__z = 3
        
    def print(self): 
    	print(self.x, self.y, self.__z)
        
 ex = One()
 ex.print()
 
 print(ex.__dict__)           # {'x': 1, 'y':2, '_One__z': 3}
 print(ex.__z)				  # Error. 외부에서 접근 할 때는 __z 라는 이름을 찾지 못한다.
 print(ex._One__z)			  # 3

 

클래스 메소드 

 

클래스 메소드란 클래스에 종속적인 함수를 말한다. 일반 함수처럼 def 키워드를 이용해 정의되며, 인자를 받을 수 있고 리턴도 할 수 있다.

 

차이점은 클래스 메소드는 클래스 내부에서 저으이 되어야하며, 클래스 내부에 선언된 인스턴스 필드들을 사용할 수 있따. 그리고 클래스 메소드는 클래스 객체에 종속적이다. 

 

class One:
	def Method():
    	print('This is method')
        
ex = One()
ex.Method() # TypeError: Method() takes 0 positional arguments but 1 was given

 

오류가 발생하는 이유는 클래스 메소드가 객체에 종속적이며 객체를 통해 호출될 때 인터프리터에 의해 메소드의 객체가 첫번째 인자로 넘겨지기 때문이다. 앞서 언급한 생성자, 소멸자 클래스 메소드의 첫 번째 인자로 self 를 지정해 주었던 이유가 바로 이것이다.

 

class One: 
	def Method(self):
    	print('This is method')
        
ex = One()
ex.Method() # 올바르게 실행됨.

 

클래스의 메소드를 호출할 때, 우리는 아무런 인자를 넘기지 않는다고 하더라도 인터프리터는 내부적으로 메소드 호출 시 첫 번째 인자로 객체를 가리키는 변수를 넘긴다.

 

class One:
	def __init__(self, x, y):
    	self.x = x 
        self.y = y
        
    def Method(self):
    	print(f'This is method. x:{self.x}, y:{self.y}')
        
ex = One(1,2)
ex.Method()  # This is method. x:1, y:2

 

인터프리터로부터 넘겨받은 self 인자는 위와같이 클래스 메소드에서 클래스 내부의 필드를 접근하기 위해 사용된다.

 

 

❕ 출처 

 

https://kukuta.tistory.com/331

'Python 기초' 카테고리의 다른 글

13. 자료구조의 변경  (0) 2022.07.15
12. 클래스(Class) - 2 instance vs. static  (0) 2022.03.30
10. for 문  (0) 2022.01.25
9. if 조건문  (0) 2022.01.24
8. 자료형 참/거짓 & 변수  (0) 2022.01.24