Python

[python] Class이해하기

class

class는 프로그래머가 지정한 이름으로 만든 하나의 독립된 공간이고, namespace라고 부른다.

클래스에 대한 또다른 설명은 다음과 같다.

함수뿐만 아니라 다양한 변수를 포함한 큰 프로그램을 하나의 묶음으로 정의하는 것이 "클래스(class)"이다.

class 왜 쓰는 걸까?

같은 데이터를 가지고 계속해서 연산의 결과를 저장하며 여러가지 함수를 묶어 처리해야 하는 경우가 있다. 예를들어 계산기를 구현한다고 할 때 계속해서 global변수로 연산결과를 받아서 다음 연산을 함수로 넘겨 진행해도 되지만, 이렇게 한다면 다른 계산기로 다른 연산을 하고 싶을 때는 같은 함수를 여러개 작성해야 하는 일이 생긴다. 그래서 우리는 class를 사용하고, 그 데이터 처리에 필요한 변수와 함수를 모두 하나로 모은다. 이게 바로 class이다.

class 이름:
	클래스 멤버 정의
	클래스 메소드 정의
class MyClass:
  var = '안녕하세요'
  def sayHello(self):
    print(self.var)

obj = MyClass()
print(obj.var) # '안녕하세요' 출력
obj.sayHello() # '안녕하세요' 출력

클래스 멤버와 인스턴스 멤버 이해하기

  • 클래스 멤버 : 클래스 내에서 선언되는 변수, 클래스 메소드 바깥에서 선언
  • 인스턴스 멤버 : 클래스 메소드 안에서 self와 함게 선언되는 변수

인스턴스 변수는 따라서 클래스의 인스턴스 객체가 만들어질 때 자동으로 호출되는 클래스 생성자에서 선언하는 것이 일반적 = 다른 클래스 메소드 호출로도 생성 가능하지만 권장하지는 않는다

class MyClass:
  var = '클래스 멤버'
  def sayHello(self):
    param1 = '지역변수' # 지역변수는 인스턴스 객체인 obj의 멤버로 참조 불가
    self.param2 = '인스턴스 변수'
    print(param1)
    print(self.var)​

obj = MyClass()
print(obj.var)
print(MyClass.var)
# print(obj.param1) # MyClass' object has no attribute 'param1'
# print(obj.param2) # MyClass' object has no attribute 'param2'
obj.sayHello()
# print(obj.param1) # MyClass' object has no attribute 'param1'
print(obj.param2) # 인스턴스 변수는 클래스 메소드 호출하고 나면 변수가 초기화 되어 오류 없이 사용 가능

 

클래스 메소드 이해하기

클래스 메소드 : 클래스 내에서 정의되는 함수

  • 클래스 메소드의 첫 번째 인자는 반드시 self
  • class MyClass:
      var = 'hi'
      def sayHello(self): # self는 클래스의 인스턴스 객체를 지시하는 참조자
        print("안녕하세요")
      
      def sayBye(self,name): # 인자가 필요하면 두 번째 인자부터 정의
        print(f"{name}! 다음에 보자!")
    
    obj = MyClass()
    obj.sayHello()
    obj.sayBye('rabo')

클래스 생성자 이해하기

클래스 생성자 : 클래스의 인스턴스 객체가 생성될 떄 호출되는 함수

  • 일반적으로 클래스의 인스턴스 멤버를 선언하거나 초기화와 관련된 작업은 클래스 생성자에서 처리
  • def init(self, *args) 가변인자이기 떄문에 필요한만큼 인자를 받을 수 있음
    class MyClass:
      def __init__(self):
        self.var = "hi"
        print('MyClass 인스턴스 객체가 생성되었습니다')
    
    obj = MyClass()
    print(obj.var)​
    
    -----
    MyClass 인스턴스 객체가 생성되었습니다
    hi
    class MyClass:
      def __init__(self, txt):
        self.var = txt
        print('생성자 인자로 전달받은 값은 <'+self.var+'> 입니다')
    
    obj = MyClass('철수')
    ---
    생성자 인자로 전달받은 값은 <철수> 입니다​

클래스 소멸자 이해하기

  • 클래스 소멸자 : 클래스의 인스턴스 객체가 메모리에서 제거될 때 자동으로 호출되는 함수
  • 클래스 소멸자는 인스턴스 객체에서 사용한 자원을 해제하기 위해 자동으로 호출
  • del (self)
    • 인스턴스 객체 제거 del<인스턴스 객체>
  • class MyClass:
      def __del__(self):
        print('MyClass 인스턴스 객체가 메모리에서 제거됩니다')
    
    obj = MyClass()
    del obj # "MyClass 인스턴스 객체가 메모리에서 제거됩니다"가 출력

클래스 상속 이해하기

클래스는 상속이라는 특성을 가지는 이름공간이다.

  • 상속 : 부모 클래스의 모든 기능들을 자식클래스로 상속
  • 상속이란 어떤 클래스가 가지고 있는 모든 멤버나 메소드를 상속받는 클래스가 모두 사용할 수 있도록 해주는 것
    `class 자식클래스(부모클래스):`
  • 상속해주는 클래스를 부모 클래스 or 슈퍼 클래스
  • 상속받는 클래스를 자식 클래스 or 서브 클래스
  • 다중상속 : 자식 클래스는 여러 개의 부모클래스로부터 상속받을 수 있음
  • class 자식클래스(부모클래스1, 부모클래스2)
class Add:
  def add(self, n1, n2):
    return n1 + n2

class Multiply:
  def multiply(self,n1,n2):
    return n1*n2

class Calculator(Add, Multiply):
  def sub(self, n1, n2):
    return n1 - n2

obj = Calculator()
print(obj.add(1,2)) # 3
print(obj.sub(1,2)) # -1
print(obj.multiply(1,2)) # 2