[Python] 클래스(Class)

참조


소개

  • 파이썬을 공부해야 할 일이 생겨서, 위키독스에 올라와 있는 점프 투 파이썬 내용을 보면서 파이썬 공부한 내용을 기록합니다.
  • 보다 자세한 내용은 점프 투 파이썬 해당 사이트에 가셔서 더 깊게 확인하실 수 있습니다.

객체와 인스턴스의 차이

  • 클래스로 만든 객체를 인스턴스라고도 합니다.
  • 그렇다면 객체와 인스턴스의 차이는 뭇엇일까요?
  • a = Cookie() 이렇게 만든 a는 객체입니다. 그리고 a 객체는 Cookie 의 인스턴스입니다.
  • 즉 인스턴스라는 말은 특정 객체(a)가 어떤 클래스(Cookie)의 객체인지를 관계 위주로 설명할 때 사용합니다.
  • a는 인스턴스 보다는 a는 객체라는 표현이 어울리며, a는 Cookie의 객체 보다는 a는 Cookie의 인스턴스라는 표현이 훨씬 잘 어울립니다.

파이썬 클래스 만들기

  • 클래스는 무작정 만드는 것보다 클래스로 만든 객체를 중심으로 어떤 식으로 동작하게 할것인지 미리 구상을 한 후에 생각한 것들을 하나씩 해결하면서 완성해 나가는 것이 좋습니다.
  • 사칙연산을 예를 들어 클래스를 만들어 보겠습니다.

클래스 구조 만들기

  • 일단은 아무 기능이 없어도 되기 때문에 사칙연산의 기본 껍데기 Class 부터 만듭니다.
>>> class FourCal:
...     pass
... 
>>>
  • 우선 대화형 인터프리터에서 pass란 문장만을 포함한 FourClas 클래스를 만들었습니다.
  • 현재 상태에서 FourCal 클래스는 아무 변수나 함수도 포함하지 않지만 객체 a를 만들 수 있는 기능을 가지고 있는지 확인합니다.
class FourCal:
    pass

a = FourCal()
print(type(a))

<class '__main__.FourCal'>
  • 위와 같이 a = FourCal() 로 a 객체를 먼저 만들고 그 다음에 type(a)로 a 객체가 어떤 타입인지 알아 보았습니다.
  • 객체 a가 FourCal 클래스의 객체임을 알 수 있습니다.

객체에 숫자 지정할 수 있게 만들기

  • 이제 더하기, 나누기, 곱하기, 빼기 등의 기능을 하는 객체를 만들기 위해서 클래스 에서 함수를 추가합니다.
  • 우선 a 객체에 사칙연산을 할 때 사용할 2개의 숫자를 먼저 알려주어야 합니다.
  • 다음과 같이 연산을 수행할 대상 (4,2)을 객체에 지정할 수 있게 만듭니다.
>>> a.setdata(4, 2)

class FourCal:
    def setdata(self, first, second):
        self.first = first
        self.second = second
  • 앞에서 만든 FourCal 클래스에서 pass 문장을 삭제하고 그 대신 setdata 함수를 만들었습니다.
  • 클래스 안에 구현된 함수는 다른 말로 메서드라고 부릅니다.
  • 메서드도 클래스에 포함되어 있다는 점만 제외하면 일반 함수와 다를 것이 없습니다.
  • setdata 메서드를 다시 보면 다음과 같습니다.
def setdata(self, first, second):   # ① 메서드의 매개변수
    self.first = first              # ② 메서드의 수행문
    self.second = second            # ② 메서드의 수행문
  • setdata 메서드는 매개변수로 self, first, second 3개 입력값을 받습니다.
  • 그런데 이상한 부분이 있습니다.
  • setdata 메서드에서는 self, first, second 총 3개의 매개변수가 필요한데 실제로는 a.setdata(4,2) 처럼 2개의 값만 전달했습니다.
  • 그 이유는 a.setdata(4,2) 처럼 호출하면 setdata 메서드의 첫 번째 매개변수 self에는 setdata 메서드를 호출한 객체 a가 자동으로 전달되기 때문입니다.
class FourCal:
    def setdata(self, first, second):
        self.first = first
        self.second = second

a = FourCal()
a.setdata(4,2)
print(a.first)
print(a.second)

4
2

더하기 기능 만들기

  • 그럼 이제 2개의 숫자를 더하는 기능을 추가해 보도록 하겠습니다.
class FourCal:
    def setdata(self, first, second):
        self.first = first
        self.second = second

    def add(self):
        result = self.first + self.second
        return result

a = FourCal()
a.setdata(4,2)
print(a.add())
  • 위와 같이 더하기 메서드를 만들었습니다.
  • 곱하기, 빼기, 나누기 기능도 추가하겠습니다.
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()
a.setdata(4,2)
print(a.add())
print(a.mul())
print(a.sub())
print(a.div())

6
8
2
2.0

생성자(Constructor)

  • 이번에는 앞서 만든 FourCal 클래스를 다음과 같이 사용해 봅니다.
>>> a = FourCal()
>>> a.add()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in add
AttributeError: 'FourCal' object has no attribute 'first'
  • FourCal 클래스의 인스턴스 a에 setdata 메서드를 수행하지 않고 add 메서드를 수행하면 "AttributeError" 오류가 발생합니다.
  • setdata 메서드를 수행해야 객체 a의 객체변수 first, second가 생성되기 때문입니다.
  • 이렇게 객체에 초깃값을 설정해야 할 필요가 있을 때는 setdata 와 같은 메서드를 호출하여 초깃값을 설정하기 보다는 생성자를 구현하는 것이 안전한 방법입니다.
  • 생성자란 객체가 생성될 때 자동으로 호출되는 메서드를 의미합니다.
  • 파이썬 메서드 이름으로 __init__를 사용하면 이 메서드는 생성자가 됩니다.
  • 다음과 같이 FourCal 클래스에 생성자를 추가합니다.
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
  • 새롭게 추가된 생성자 __init__ 메서드만 따로 떼어 내서 살펴봅니다.
def __init__(self, first, second):
    self.first = first
    self.second = second
  • __init__ 메서드는 setdata 메서드와 이름만 다르고 모든 게 동일합니다.
  • 단 메서드 이름을 __init__으로 했기 때문에 생성자로 인식되어 객체가 생성되는 시점에 자동으로 호출되는 차이가 있습니다.
  • 생성자를 선언했다면 아래와 같이 객체를 생성할때 바로 인수에 값을 전달할 수 있습니다.
>>> a = FourCal(4, 2)
>>> print(a.first)
4
>>> print(a.second)
2

클래스의 상속

  • 상속이란 "물려받다" 라는 뜻으로 재산을 상속받다 라고 할 때의 상속과 같은 의미입니다.
  • 클래스에도 이 개념을 적용할 수 있습니다.
  • 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것입니다.
  • 이번에는 상속 개념을 사용하여 우리가 만든 FourCal 클래스에 ab (a의 b제곱)을 구할 수 있는 기능을 추가해 봅니다.
  • 앞에서 FourCal 클래스는 이미 만들어 놓았으므로 FourCal 클래스를 상속하는 MoreFourCal 클래스는 다음과 같이 간단하게 만들 수 있습니다.
>>> class MoreFourCal(FourCal):
...     pass
... 
>>>
  • 클래스를 상속하기 위해서는 다음처럼 클래스 이름 뒤 괄호 안에 상속할 클래스 이름을 넣어주면 됩니다.
  • MoreFourCal 클래스는 FourCal 클래스를 상속했으므로 FourCal 클래스의 모든 기능을 사용할 수 있어야 합니다.
>>> a = MoreFourCal(4, 2)
>>> a.add()
6
>>> a.mul()
8
>>> a.sub()
2
>>> a.div()
2
  • 상속받은 FourCal 클래스의 기능을 모두 사용할 수 있음을 확인했습니다.
  • 이제 원래 목적인 a의 b제곱(ab)을 계산하는 MoreFourCal 클래스를 만들어 보자.
>>> class MoreFourCal(FourCal):
...     def pow(self):
...         result = self.first ** self.second
...         return result
...
>>>

>>> a = MoreFourCal(4, 2)
>>> a.pow()
16
  • MoreFourCal 클래스로 만든 a 객체에 값 4와 2를 설정한 후 pow 메서드를 호출하면 4의 2제곱 (42)인 16을 돌려주는 것을 확인할 수 있습니다.
728x90

'파이썬(Python)' 카테고리의 다른 글

[Python] 내장 함수  (0) 2022.02.09
[Python] 예외 처리  (0) 2022.02.08
[Python] 함수(Function)  (0) 2022.02.05
[Python] for문  (0) 2022.02.05
[Python] while문  (0) 2022.02.05

이 글을 공유하기

댓글

Designed by JB FACTORY