Data/Python

[Python] 파이썬 클래스 - 정의 및 생성자

재은초 2023. 6. 17. 21:56
반응형

클래스(Class)란?

http://wiki.hash.kr/index.php/%EA%B0%9D%EC%B2%B4

  • 클래스(Class)란 똑같은 무엇인가를 계속해서 만들어낼 수 있는 설계 도면 같은 것이고, 객체(Object)란 설계도인 클래스에 의해서 만들어진 제품이다.
  • 클래스에 의해서 만들어진 객체는 객체별로 독립적인 성격을 갖으므로, 동일한 클래스에의해 생성된 객체들은 서로에게 전혀 영향을 주지 않는다.
  • 파이썬에서 선언되는 모든 클래스는 기본적으로 Object 클래스를 자동으로 상속하며, 파이썬에 존재하는 모든 자료형은 클래스로서 존재한다. 따라서 어떤 데이터가 있을 때 그 데이터는 자기가 속하는 자료형의 객체가 된다.
# 클래스를 사용하지 않을 때
>>> result1 = 0
>>> result2 = 0
>>> def add1(num):             # 각각의 계산기는 각각의 결과값을 유지해야 하기 때문에
>>>     global result1         # add 함수 하나만으로는 결과값을 따로 유지할 수 없다
>>>     result1 += num         # 그러므로 함수를 각각 따로 만들어야 한다.
>>>     return result1
>>> def add2(num):
>>>     global result2
>>>     result2 += num
>>>     return result2
>>> print(add1(3))
>>> print(add1(4))
>>> print(add2(3))
>>> print(add2(7))
3
7
3
10
# 클래스를 사용할 때
>>> class Calculator:
>>>     def __init__(self):
>>>         self.result = 0
>>>     def add(self, num):
>>>         self.result += num
>>>         return self.result
>>> cal1 = Calculator()          # Calculator 클래스로 만들어진  
>>> cal2 = Calculator()          # cal1, cal2 별개의 계산기가 각각의 역할 수행
>>> print(cal1.add(3))
>>> print(cal1.add(4))           # 클래스를 이용하면 계산기의 개수가 늘어나더라도
>>> print(cal2.add(3))           # 객체를 생성하기만 하면 되기 때문에 
>>> print(cal2.add(7))           # 함수를 사용하는 경우와 달리 매우 간단해짐
3
7
3
10
  • 클래스는 변수를 정의하는 속성 부분과 함수를 설정하는 기능 부분으로 나뉜다.
  • 한 클래스에는 여러개의 속성과 기능을 담을 수 있다. 예를 들어, 리스트라는 클래스의 경우에 속성은 [ 1. 1. 1....] 같은 리스트 내 원소이며, 기능은 append, extend, insert 등의 리스트 전용 함수이다.
# 파이썬 클래스 만들기
>>> class Cookie:            # 아무런 기능도 갖고 있지 않은 껍질뿐인 클래스
>>>    pass                  # 껍질뿐인 클래스도 객체를 생성하는 기능은 가지고 있다

# 파이썬 객체 만들기 예
>>> a = Cookie()             # 객체는 클래스에 의해서 만들어지며
>>> b = Cookie()             # 1개의 클래스는 무수히 많은 객체를 만들어낼 수 있다
                             # Cookie()의 결과값을 돌려받은 a와 b가 바로 객체

 

클래스 만들기

① 클래스를 어떻게 만들지 먼저 구상

# 클래스 작동 원리 구상하기
>>> a = FourCal()         # a라는 객체를 만듬
>>> a.setdata(4, 2)       # 4와 2라는 숫자를 객체 a에 지정
>>> print(a.add())        # a.add()수행 후, 두 수의 합(4 + 2) 돌려줌
6
>>> print(a.mul())        # a.mul()수행 후, 두 수의 곱(4 * 2) 돌려줌
8
>>> print(a.sub())        # a.sub()수행 후, 두 수의 차(4 - 2) 돌려줌
2
>>> print(a.div())        # a.div()수행 후, 두 수의 나눈 결과(4 / 2) 돌려줌
2

② 클래스 구조 만들기

>>> class FourCal:                 # 아무 기능도 없는 클래스 만듬
...     pass                       # 하지만 클래스이므로 객체를 만들 수 있음
>>> a = FourCal()                  # 객체 a를 만듬
>>> type(a)                        # type 내장 함수로 객체의 타입을 출력
<class '__main__.FourCal'>         # 객체 a의 타입은 클래스의 인스턴스

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

  • 클래스 안에 구현된 함수는 다른 말로 메서드(Method)라고도 부르며, 클래스에 포함되어 있다는 것만 제외하면 일반함수와 동일하다.
>>> a.setdata(4, 2)                        # 먼저 연산에 사용할 숫자 2개 입력
>>> class FourCal:                         
...     def setdata(self, first, second):  # ① 메서드의 매개변수
...         self.first = first             # ② 메서드의 수행문
...         self.second = second
...         self.__wallet = wallet         # 변수 앞 __로 비공개 속성 변경 가능

④ 함수 기능 만들기

# 덧셈과 동일
>>> class FourCal:                                # 1. 클래스 생성
...     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()                                 # 2. 객체 생성
>>> b = FourCal()
>>> a.setdata(4, 2)                               # 3. 객체의 메서드 실행
>>> b.setdata(3, 7)
>>> a.add()
6
>>> a.mul()
8
>>> a.sub()
2
>>> a.div()
2
>>> b.add()
10
>>> b.mul()
21
>>> b.sub()
-4
>>> b.div()
0


클래스의 생성자

  • 생성자(Constructor)란 객체가 생성될 때 자동으로 호출되는 함수를 의미하며, 객체의 생성시 호출되기 때문에 생성자라는 이름이 붙었다.
# setdata 메서드를 수행하지 않고 add 메서드를 수행하면 오류 발생
# setdata 메서드를 수행해야 객체 a의 객체변수 first와 second가 생성되기 때문
>>> 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'
  • 파이썬에서는 __init__이란 함수는 자동으로 생성자로 인식되고, 생성자명을 다른 이름으로 변경할 수는 없다. 참고로 자바와 C 언어에서 생성자는 클래스의 이름과 같다.
  • 생성자는 객체가 처음 생성될 때 호출되어 멤버 변수를 초기화하고 필요에 따라 자원을 할당하기도 하는데, 생성자의 첫번째 매개변수는 반드시 self 로 선언해야 한다.
# FourCal클래스에 생성자를 추가
>>> class FourCal:
...     def __init__(self, first, second):     # __init__ 생성자 추가
...         self.first = first                 # setdata 없이도 변수 할당
...         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)                      # a 객체 생성
>>> a.first                                
4
>>> a.second                      
2
>>> a.add()                                # add, div 메서드 수행
6
>>> a.div()
2.0

 

매개변수 self

https://wikidocs.net/28

  • self는 해당 함수가 호출되는 객체 자신을 가리키며, 메서드의 첫번째 매개변수인 self를 명시적으로 구현해야 하는 것은 파이썬만의 독특한 특징이다.
  • 주로 클래스가 다루고자하는 데이터를 주로 명시하며, self 인자는 항상 첫번째에 오며 자기 자신을 가리킨다. 이름이 꼭 self일 필요는 없지만, 관례적으로 self로 사용한다.
  • 객체.속성 과 self.속성은 같은 뜻을 의미한다.
# 객체를 통한 setdata 메서드를 호출 - self를 반드시 생략하여 호출
>>> a = FourCal()
>>> a.setdata(4, 2)      # a라는 객체를 만들고 a 객체를 통해 setdata 메서드를 호출

# 클래스를 통한 메서드를 호출 - 객체 a를 첫 번째 매개변수인 self에 꼭 전달
>>> a = FourCal()
>>> FourCal.setdata(a, 4, 2)


Reference

반응형