Study/Python

[Python] 클래스

taecongs 2023. 9. 12. 12:01

Python 공부하기 ✨
테스트 코드 실행 : Python Tutor


파이썬에서 클래스란?

  • 쉽게 말해 객체(instance)를 만들어내기 위한 '틀'이다. '객체지향 프로그래밍'의 핵심이기도 하다.
  • 주로 붕어빵에 비유하는데, 붕어빵을 객체라고 한다면 클래스는 붕어빵 틀에 해당한다.
  • 즉, 동일한 무언가를 계속해서 만들어낼 수 있는 형태이며 만들어낸 객체들은 모두 고유한 성격을 가진다.
  • 단, 객체별로 갖는 기능은 모두 동일하다.

 

(1) 클래스가 필요한 이유

  • 만약 한 프로그램에서 2대의 계산기가 필요한 상황이라고 가정하면, 계산기는 각각의 결과값을 유지해야 하기 때문에 add1, add2 함수를 각각 따로 만들어야 한다.
// (1) 클래스를 사용하지 않는 경우
result1 = 0
result2 = 0

def add1(num):  # 계산기1
    global result1
    result1 += num
    return result1

def add2(num):  # 계산기2
    global result2
    result2 += num
    return result2

print(add1(3))    # 3
print(add1(4))    # 7
print(add2(3))    # 3
print(add2(7))    # 10
  • 이러한 문제를 해결하기 위해 아래와 같이 클래스를 사용한다.
// (2) 클래스를 사용한 경우
class Calculator:
    def __init__(self):
        self.result = 0

    def add(self, num):
        self.result += num
        return self.result

cal1 = Calculator()
cal2 = Calculator()

print(cal1.add(3))   # 3 
print(cal1.add(4))   # 7	
print(cal2.add(3))   # 3
print(cal2.add(7))   # 10

 

(2) 객체의 인스턴스(instance)

  • 객체는 클래스에서 선언된 틀 그대로 만들어진 실체이며, 자신의 고유한 상태와 이름, 행동을 갖는다.
  • 보통, 객체와 인스턴스를 크게 구분짓지 않고 사용하기도 하지만 약간의 차이점이 있다.
  • 인스턴스는 '클래스'로 만든 객체를 말한다.

 

(3) 클래스에서의  self 

// (3) 클래스를 사용한 경우
def setdata(self, first, second):   # 메서드의 매개변수
    self.first = first              # 메서드의 수행문
    self.second = second            # 메서드의 수행문
    
a.setdata(4, 2)

  • self는 단어 그대로 자기자신이라 생각하면 된다.
  • 쉽게 말해 객체를 호출할 때 호출한 객체 자신이 전달된다.

 

(4) 클래스에서의  __init__ 

// (4) 클래스를 사용한 경우
class FourCal:
    def __init__(self, first, second):
        self.first = first
        self.second = second
    
    def setdata(self, first, second):
        self.first = first
        self.second = second
        
    def add(self):
        result = self.first + self.second
        return result
        
    def mul(self):
        result = self.first * self.second
        return result
        
    def sub(self):
        result = self.first - self.second
        return result
        
    def div(self):
        result = self.first / self.second
        return result

a = FourCal(4, 2)

print(a.add())
print(a.mul())
print(a.sub())
print(a.div())
  • 인스턴스가 생성될 때 항상 실행되는 것이다.
  • __init__ 메서드는 setdata 메서드와 이름만 다르고 모든 게 동일하다.
  • 메서드 이름을 __init__로 했기 때문에 생성자로 인식되어 객체가 생성되는 시점에 자동으로 호출된다는 차이가 있다.
  • __init__ 메서드가 호출되면 setdata 메서드를 호출했을 때와 마찬가지로 first와 second라는 객체변수가 생성된다.

 

(5) 메서드 오버라이딩

// (5) 메서드 오버라이딩을 사용한 경우
class FourCal:
    def __init__(self, first, second):
        self.first = first
        self.second = second
    
    def setdata(self, first, second):
        self.first = first
        self.second = second
        
    def add(self):
        result = self.first + self.second
        return result
        
    def mul(self):
        result = self.first * self.second
        return result
        
    def sub(self):
        result = self.first - self.second
        return result
        
    def div(self):
        result = self.first / self.second
        return result

a = FourCal(4, 2)

print(a.add())
print(a.mul())
print(a.sub())
print(a.div())

class MoreFourCal(FourCal):
    def pow(self):
        result = self.first ** self.second
        return result

a = MoreFourCal(6, 4)
print(a.pow())


class SafeFourCal(FourCal):
    def div(self):
        if self.second == 0:
            return 0
        else:
            return self.first / self.second
            
a = SafeFourCal(4, 0)
print(a.div())
  • 부모 클래스(상속한 클래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것을 메서드 오버라이딩(method overriding)이라고 한다.