Python 클래스

배추·2025년 11월 23일

🐍 Python

목록 보기
13/19

Python의 클래스에 대해 알아봅니다.


▶︎클래스

  • 클래스: 반복되는 변수와 메서드(함수)를 미리 정해놓은 틀.

클래스는 왜 필요한가?

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))
print(add1(4))
print(add2(3))
print(add2(7))
  • 위는 계산기 함수.
  • 계산기가 3개, 5개, 10개로 점점 더 많이 필요해진다면 어떻게 해야 할까? 그때마다 전역 변수와 함수를 추가할 것인가?
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))
print(cal1.add(4))
print(cal2.add(3))
print(cal2.add(7))
  • Calculator 클래스로 만든 별개의 계산기 cal1, cal2(이것을 ‘객체’라고 함)가 각각의 역할을 수행한다.
  • 계산기의 결괏값 역시 다른 계산기의 결괏값과 상관없이 독립적인 값을 유지한다.
  • 이렇게 클래스를 사용하면 계산기 대수가 늘어나도 객체를 생성하면 되므로 함수만 사용할 때보다 간단하게 프로그램을 작성할 수 있다.
  • 빼기 기능을 더하고 싶다면 Calculator 클래스에 다음과 같이 빼기 기능을 가진 함수를 추가하면 된다.
class Calculator:
    def __init__(self):
        self.result = 0

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

    def sub(self, num):
        self.result -= num
        return self.result

▶︎클래스와 객체

  • 클래스: 똑같은 무언가를 계속 만들어 낼 수 있는 설계 도면(과자 틀)
  • 객체: 클래스로 만든 피조물(과자 틀로 찍어 낸 과자)
    • 클래스로 만든 객체는 객체마다 고유한 성격을 가진다. 동일한 클래스로 만든 객체들은 서로 전혀 영향을 주지 않는다.

+) 객체와 인스턴스

  • 인스턴스: 클래스로 만든 객체.
    • 특정 객체가 어떤 클래스의 객체인지를 관계 위주로 설명할 때 사용한다.
  • 예) a = Cookie()
    • a는 객체이다. 그리고 a 객체는 Cookie의 인스턴스이다.
    • ‘a는 인스턴스’보다 ‘a는 객체’라는 표현이 어울리며
    • ‘a는 Cookie의 객체’보다 ‘a는 Cookie의 인스턴스’라는 표현이 훨씬 잘 어울린다.

▶︎클래스 만들기

# 클래스 정의
class FourCal:
    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()
b = FourCal()

a.setdata(4, 2) # a 객체의 first, second 객체변수에는 각각 값 4와 2가 저장
b.setdata(3, 8)

a.add() # 6
a.mul() # 8
a.sub() # 2
a.div() # 2

b.add() # 11
b.mul() # 24
b.sub() # -5
b.div() # 0.375

클래스 정의

  • class 사용.
  • 객체를 만들 수 있는 기능을 가지고 있다.
class FourCal:
    pass

객체 생성

  • 클래스명(): class의 인스턴스인 객체 생성.
a = FourCal() # a객체 생성, a는 FourCal의 인스턴스

type(a) # <class '__main__.FourCal'>

메서드의 매개변수

  • 클래스 안에 구현된 함수는 다른 말로 메서드(method)라고 부른다.
  • 파이썬 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용한다.
    • 객체의 메서드를 호출할 때 호출한 객체 자신이 전달되기 때문에 self라는 이름을 사용.
    • self말고 다른 이름을 사용해도 상관없다.
  • 객체를 이용해 클래스의 메서드를 호출하려면 같이 도트(.) 연산자를 사용하면 된다.
  • 메서드의 첫 번째 매개변수 self에는 메서드를 호출한 객체가 자동으로 전달된다.
  • +) 메서드의 첫 번째 매개변수 self를 명시적으로 구현하는 것은 파이썬만의 독특한 특징이다. 자바와 같은 언어는 첫 번째 매개변수 self가 필요없다.
class FourCal:
    def setdata(self, first, second): # 메서드의 매개변수
        self.first = first # 메서드의 수행문
        self.second = second

a.setdata(4, 2) # 매서드 호출위해 도트(.) 연산자 사용

메서드를 호출하는 방법

  1. 객체.메서드
  • self를 반드시 생략해서 호출해야 한다.
    a = FourCal()
    a.setdata(4, 2)
  1. 클래스명.메서드
  • 클래스를 이용해 메서드를 호출. (잘 사용하지는 않음.)
  • 객체 a를 첫 번째 매개변수 self에 꼭 전달해야 한다.
    a = FourCal()
    FourCal.setdata(a, 4, 2)

메서드의 수행문

  • 객체에 생성되는 객체 변수를 ‘인스턴스 변수’ 또는 ‘속성’이라고도 부른다.
class FourCal:
    def setdata(self, first, second): # 메서드의 매개변수
        self.first = first # 메서드의 수행문
        self.second = second

a.setdata(4, 2) # a.first = 4, a.second = 2로 설정
  • a.first = 4 수행: a 객체에 객체변수 first가 생성되고 4라는 값이 저장된다.
  • a.second = 2 수행: a 객체에 객체변수 second가 생성되고 2라는 값이 저장된다.
  • 클래스로 만든 객체의 객체변수는 다른 객체의 객체변수에 상관없이 독립적인 값을 유지한다.
a.setdata(4, 2) 
b.setdata(3, 7) 

a.first # 4
b.first #3

▶︎생성자

a = FourCal()
a.add() # 오류
  • FourCal 클래스의 인스턴스 a에 setdata 메서드를 수행하지 않고 add 메서드를 먼저 수행하면 오류가 발생한다.
  • setdata 메서드를 수행해야 객체 a의 객체변수 first와 second가 생성되기 때문.
  • 이렇게 객체에 first, second와 같은 초깃값을 설정해야 할 필요가 있을 때는 setdata와 같은 메서드를 호출하여 초깃값을 설정하기보다 생성자를 구현하는 것이 안전한 방법이다.

📍생성자 __init__

  • 생성자(constructor): 객체가 생성될 때 자동으로 호출되는 메서드.
  • 파이썬 메서드명으로 __init__를 사용하면 이 메서드는 생성자가 된다.
  • 객체 생성 시 생성자의 매개변수를 전달해야 한다.
class FourCal:
    def __init__(self, first, second):
        self.first = first
        self.second = second
    def add(self):
        result = self.first + self.second

a = FourCal(4, 2) # 객체 생성 시 매개변수 전달
a.first # 4
a.second # 2

▶︎클래스의 상속

  • 상속: 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것.
  • 상속은 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용한다. 기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황이라면 상속을 사용.
  • class 클래스_이름(상속할_클래스_이름) : 클래스 이름 뒤 괄호 안에 상속할 클래스 이름을 넣어주면 된다.
class MoreFourCal(FourCal):
    def pow(self):
        result = self.first ** self.second
        return result

a = MoreFourCal(4, 2)
a.add() # 6 -> 상속받은 class의 메서드를 그대로 쓸 수 있다.
a.mul() # 8
a.sub() # 2
a.div() # 2
a.pow() # 16
  • MoreFourCal 클래스는 FourCal 클래스를 상속했으므로 FourCal 클래스의 모든 기능을 사용할 수 있다.

▶︎메서드 오버라이딩

  • 메서드 오버라이딩(method overriding): 부모 클래스(상속한 클래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것.
  • 메서드를 오버라이딩하면 부모 클래스의 메서드 대신 오버라이딩한 메서드가 호출된다.
class SafeFourCal(FourCal):
    def div(self):
        if self.second == 0:  # 나누는 값이 0인 경우 0을 리턴하도록 수정
           return 0
        else:
            return self.first / self.second

a = SafeFourCal(4, 0)
a.div() # 0 # FourCal 클래스와 달리 ZeroDivisionError가 발생하지 않는다.

▶︎클래스 변수

  • 클래스 변수: 클래스 안에서 선언한 변수.
  • 클래스변수는 클래스_이름.클래스변수로 사용할 수 있다.
class Family:
    lastname = "김"
    
Family.lastname # 김 # 클래스 변수 사용

a = Family()
b = Family()
a.lastname # 김
b.lastname #김
  • 클래스로 만든 객체를 이용해도 클래스변수를 사용할 수 있다.
class Family:
    lastname = "김"
    
# Family 클래스로 만든 객체를 이용해 클래스변수 사용
a = Family()
b = Family()
a.lastname # 김
b.lastname #김
  • 클래스변수는 클래스로 만든 모든 객체에 공유된다. 변경되도 모든 객체에 변경 사항이 적용된다.
class Family:
    lastname = "김"
    
a = Family()
b = Family()

Family.lastname = "박"
a.lastname # 박
b.lastname # 박

+) 객체변수

  • 객체변수는 다른 객체들의 영향을 받지 않고 독립적으로 그 값을 유지한다.
class Family:
    lastname = "김"
    
a = Family()
b = Family()

Family.lastname = "박"
a.lastname = "최"

a.lastname # 최
b.lastname # 박
profile
난 🥬

0개의 댓글