곰퓨타의 SW 이야기

[python] 클래스 뿌시기 본문

TIL/코테개념_python

[python] 클래스 뿌시기

곰퓨타 2021. 1. 7. 02:21

이는 함수와 같이 중요한 개념이라고 생각하기 때문에 이에 대해 정리해보고자 한다.

 

 

물론 이 글 또한 점프투 파이썬을 볼 것이다!!

[내사랑 점프투 파이썬❣️]

wikidocs.net/28

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

클래스는 자바에서 보았던 개념이지만, 파이썬에서 어떤 식으로 사용되는지 익혀보고자 정리하게 되었다!

 

클래스와 객체

'클래스'는 과자를 만들 때 과자 틀에 해당하고, 과자 틀에 의해서 만들어진 과자가 '객체'이다. 

클래스는 똑같은 무엇인가를 계속해서 만들어낼 수 있도록 하고,

객체는 클래스의 틀에 고유의 값을 가질 수 있는 것이다.

 

클래스로 만든 객체에는 중요한 특징이 있다. 바로 객체마다 고유한 성격을 가진다는 것이다. 과자 틀로 만든 과자에 구멍을 뚫거나 조금 베어 먹더라도 다른 과자에는 아무 영향이 없는 것과 마찬가지로 동일한 클래스로 만든 객체들은 서로 전혀 영향을 주지 않는다.

 

a = Cookie()에서 a는 객체이고, a는 Cookie의 인스턴스 이다 ❗️

>>> class Cookie:
>>>    pass
>>> a = Cookie()
>>> b = Cookie()

 

 

사칙연산 클래스 만들기

직접 해보는 것이 문법을 익히기 가장 좋으므로, 사칙연산이 가능한 클래스를 직접 만들면서 클래스 문법 익혀보자 .

 

1. 클래스를 어떻게 먼저 구상하기

a = FourCal() 객체를 만들 경우, 이런 기능을 할 것이라고 가정해보자.

>>> a = FourCal()
>>> a.setdata(4, 2)
# 더하기 기능
>>> print(a.add())
6
# 곱하기 기능
>>> print(a.mul())
8
# 빼기 기능
>>> print(a.sub())
2
# 나누기 기능
>>> print(a.div())
2

 

2. 클래스 구조 만들기

아무기능이 없는 FourCal 클래스를 만들자.

여기서 pass는 아무것도 수행하지 않는 문법으로 임실로 코드르 작성할 때 사용한다.

>>> class FourCal:
...     pass
... 
>>> a = FourCal()
>>> type(a)
<class '__main__.FourCal'>

 

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

사칙 연산 기능을 갖춘 객체를 만뜰기 위해 수행할 대상(이 때는 숫자들!)을 지정할 수 있도록 한다.

'>>> a.setdata(4, 2)' 이 코드를 수행하기 위한 함수를 작성하자.

클래스 내부 함수는 '메서드'라고도 부른다.

>>> class FourCal:
...     def setdata(self, first, second):	# 매서드의 매개변수
...	# 매서드 수행문들
...         self.first = first	
...         self.second = second
...
>>>

 

이 메서드를 호출하기 위해서는 다음과 같이 호출해야 한다.

>>> a = FourCal()
>>> a.setdata(4, 2)

이 코드를 확인하면 a.setdata에서 a 객체를 호출하기 위해 setdata의 첫번째 파라미터가 self 이고 뒤의 두 개의 인자가 first, second 파라미터에 해당한다는 것을 알 수 있다. setdata의 첫번째 파라미터인 self라는 이름은 수정해도 되지만,  이는 객체를 가르킨다!

이 부분이 자바와 다르다고 생각하였는데 이 책 또한 정리해주었다.

※ 메서드의 첫 번째 매개변수 self를 명시적으로 구현하는 것은 파이썬만의 독특한 특징이다. 예를 들어 자바 같은 언어는 첫 번째 매개변수 self가 필요없다.

 

# a.setdata의 수행 순서
# 1. 
self.first = 4
self.second = 2

# 2. self 자리에 객체 a가 들어간다.
a.first = 4
a.second = 2

 

결과를 확인하는 방법은 다음과 같다.

>>> a.setdata(4, 2)
>>> print(a.first)
4

 

4. 더하기, 곱하기, 빼기, 나누기 기능 만들기

>>> 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)
>>> 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

 

생성자

생성자를 만들지 않으면, setdata가 실행되지 않으면, 객체에 저장된 변수 first, second가 없으므로 오류가 뜬다.

따라서 객체에 초깃값을 설정해야 할 필요가 있을 때는 setdata와 같은 메서드를 호출하여 초깃값을 설정하기보다는 생성자를 구현한다. 생성자(Constructor)란 객체가 생성될 때 자동으로 호출되는 메서드를 의미한다. 이는 __init__를 사용한다.

__init__은 생성자로 인식되어 객체가 생성되는 시점에 자동으로 호출된다.

>>> 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
...
>>>

 

생성자를 정의하였기 때문에, 객체를 생성할 때에 first, second에 해당하는 값을 전달하지 않으면 오류가 발생한다.

>>> a = FourCal()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() missing 2 required positional arguments: 'first' and 'second'

따라서 올바르게 호출하기 위해서는 다음과 같이 호출해야 한다.

>>> a = FourCal(4, 2)
>>> print(a.first)
4
>>> print(a.second)
2
>>> a.add()
6
>>> a.div()
2.0

다음과 같이 실행하면, self : 생성되는 객체, first : 4, second : 2가 대입된다.

 

상속

상속은 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용한다.

 

상속 개념으로 FourCal 클래스에 a의 b 제곱을 구현할 수 있는 기능을 추가해보자.

상속은 다음과 같이 정의한다.

class 클래스 이름(상속할 클래스 이름)

 

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

 

이는 FourCal 기능이 모두 가능하도록 하고 pow함수를 추가해준 것으로 MoreFourCal 객체는 FourCal 기능 또한 수행할 수 있다.

>>> a = MoreFourCal(4, 2)
>>> a.pow()
16
>>> a.add()
6
>>> a.mul()
8
>>> a.sub()
2
>>> a.div()
2

 

오버라이딩

부모 클래스에 있는 메서드를 동일한 이름의 메서드로 다시 만들어서 해당 클래스의 객체를 만들면 부모 클래스의 매서드 대신 오버라이딩 한 메서드가 실행되도록 하는 경우에 사용한다.

 

예를 들면,

 

FourCal 객체를 만들면 0으로 나눌 때 다음과 같은 오류가 발생할 것이다.

>>> a = FourCal(4, 0)
>>> a.div()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    result = self.first / self.second
ZeroDivisionError: division by zero

 

하지만 div 메소드 실행 시 4를 0으로 나누려 하면 오류가 난다. 이런 상황이 발생하면 0이 되도록 하여 에러가 나는 것을 방지하도록 하는 함수로 오버라이딩 하도록 하는 FourCal 클래스를 상속하는 SafeFourCal 클래스를 만들면 실행결과는 다음과 같다.

>>> 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

 

클래스 변수

객체 변수는 다른 객체들에 영향받지 않고 독립적으로 그 값을 유지한다. 

클래스 변수는 클래스 안에 함수를 선언하듯이 생성이 가능하고, '클래스이름.클래스 변수'로 사용할 수 있다.

이들은 객체를 여러개 찍어내더라도 같은 성질을 가질 수 있도록 클래스로 만든 모든 객체에 공유된다!

>>> class Family:
...     lastname = "김"
...
>>> print(Family.lastname)
김
>>> a = Family()
>>> b = Family()
>>> print(a.lastname)
김
>>> print(b.lastname)
김

 

여기서 Family의 lastname을 바꾸게 되는 경우 신기하게도, a와 b 모두 변경되는 것을 확인할 수 있다.

>>> Family.lastname = "박"
>>> print(a.lastname)
박
>>> print(b.lastname)
박

 

이들은 변수를 공유하기 때문에 그런 것이다..! 이들은 메모리 주소값을 통해서도 확인할 수 있다.

>>> id(Family.lastname)
4480159136
>>> id(a.lastname)
4480159136
>>> id(b.lastname)
4480159136

 

 

이 책에서 제공하는 공부 순서는,, 나랑 잘맞는건지 책을 잘쓴건지 이해가 잘되도록 되어있는것같다..ㅎㅎ

다음은 점프 투 파이썬과 함께 모듈에 대해서 뿌셔보자⭐️

 

 

'TIL > 코테개념_python' 카테고리의 다른 글

[python] 패키지 뿌시기  (0) 2021.01.07
[python] 모듈 뿌시기  (0) 2021.01.07
[python] 파일 읽고 쓰기  (0) 2021.01.07
[python] 사용자 입력과 출력 뿌시기  (0) 2021.01.06
[python] 함수 뿌시기  (0) 2021.01.06
Comments