[Python] 4. 클래스&모듈 정리 및 예제풀이
📢Key Words [python 시험대비 및 복습]
자료형, 제어문, 함수 클래스 & 모듈 Numpy
1. 클래스는 왜 필요한가?
- 한 프로그램에서 2대의 계산기가 필요한 상황이 발생하면 어떻게 해야 할까? 각 계산기는 각각의 결괏값을 유지해야 하기 때문에 함수를 각각 따로 만들어야 한다.
- 클래스를 사용하면 계산기 대수가 늘어나더라도 객체를 생성만 하면 되기 때문에 함수를 사용하는 경우와 달리 매우 간단해진다.
2. 클래스와 객체
- 클래스(class)란 똑같은 무엇인가를 계속해서 만들어 낼 수 있는 설계 도면이고(과자 틀), 객체(object)란 클래스로 만든 피조물(과자 틀을 사용해 만든 과자)을 뜻한다.
- 객체와 인스턴스의 차이
- a = Cookie() 이렇게 만든 a는 객체이다. 그리고 a 객체는 Cookie의 인스턴스이다. 즉 인스턴스라는 말은 특정 객체(a)가 어떤 클래스(Cookie)의 객체인지를 관계 위주로 설명할 때 사용한다. “a는 인스턴스”보다는 “a는 객체”라는 표현이 어울리며 “a는 Cookie의 객체”보다는 “a는 Cookie의 인스턴스”라는 표현이 훨씬 잘 어울린다.
3. 사칙연산 클래스 만들기
01. 클래스를 어떻게 만들지 먼저 구상하기
- 클래스로 만든 객체를 중심으로 어떤 식으로 동작하게 할것인지 미리 구상을 한 후에 생각한 것들을 하나씩 해결하면서 완성해 나가는 것이 좋다. ex) 계산기라면 더하기, 빼기, 곱하기, 나누기의 기능들이 필요
02. 클래스 구조 만들기
>>> class FourCal:
... pass
...
>>>
- pass는 아무것도 수행하지 않는 문법으로 임시로 코드를 작성할 때 주로 사용한다.
03. 객체에 숫자 지정할 수 있게 만들기
>>> class FourCal:
... def setdata(self, first, second):
... self.first = first
... self.second = second
...
>>>
- setdata 메서드의 매게변수
메서드의 매개변수
- 클래스 안에 구현된 함수는 다른 말로 메서드(Method)라고 부른다.
- 일반 함수와는 달리 메서드의 첫 번째 매개변수 self는 특별한 의미를 가진다.
- setdata 메서드의 첫 번째 매개변수 self에는 setdata메서드를 호출한 객체 a가 자동으로 전달
- 클래스 이름.메서드 형태로 호출할 때는 객체 a를 첫 번째 매개변수 self에 꼭 전달해 주어야 한다. 반면에 다음처럼 객체.메서드 형태로 호출할 때는 self를 반드시 생략해서 호출해야 한다.
- setdata 메서드의 수행문
self.first = 4 self.second = 2 #위와 아래는 같은 의미 a.first = 4 a.second = 2
- 클래스로 만든 객체의 객체변수는 다른 객체의 객체변수에 상관없이 독립적인 값을 유지
- 더하기 기능 만들기
>>> class FourCal: ... def setdata(self, first, second): ... self.first = first ... self.second = second ... def add(self): ... result = self.first + self.second ... return result ... >>>
- 곱하기, 빼기, 나누기 기능 만들기
>>> 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 ... >>> #test >>> 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
4. 생성자 (Constructor)
>>> 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: ‘FourCal’ object has no attribute ‘first’” 오류가 발생한다.
- 객체에 초깃값을 설정해야 할 필요가 있을 때는 setdata와 같은 메서드를 호출하여 초깃값을 설정하기보다는 생성자를 구현하는 것이 안전한 방법이다.
- 생성자(Constructor)란 객체가 생성될 때 자동으로 호출되는 메서드를 의미한다.
- 파이썬 메서드 이름으로 __init__를 사용하면 이 메서드는 생성자가 된다.
```python
class FourCal: … def init(self, first, second): … self.first = first … self.second = second
#다만 아래처럼 호출해야함
a = FourCal(4, 2)
```
5. 클래스의 상속
- 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것
- 상속 개념을 사용하여 우리가 만든 FourCal 클래스에 ab (a의 b제곱)을 구할 수 있는 기능을 추가해 보자.
>>> class MoreFourCal(FourCal): ... def pow(self): ... result = self.first ** self.second ... return result ... >>>
- MoreFourCal 클래스는 FourCal 클래스를 상속했으므로 FourCal 클래스의 모든 기능을 사용할 수 있어야 한다.
- 상속은 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용한다.
- 기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황이라면 상속을 사용해야 한다.
6. 메서드 오버라이딩
- 오류가 아닌 0을 돌려주도록 만들고 싶다면 어떻게 해야 할까?
- FourCal 클래스를 상속하는 SafeFourCal 클래스를 만들어 보자.
>>> class SafeFourCal(FourCal): ... def div(self): ... if self.second == 0: # 나누는 값이 0인 경우 0을 리턴하도록 수정 ... return 0 ... else: ... return self.first / self.second ... >>>
- 부모 클래스(상속한 클래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것을 메서드 오버라이딩이라고 한다.
- 부모클래스의 메서드 대신 오버라이딩한 메서드가 호출된다.
7. 클래스 변수
>>> class Family: ... lastname = "김" ... >>> Family.lastname = "박" >>> print(a.lastname) 박 >>> print(b.lastname) 박
a.lastname = “최” print(a.lastname) 최
- 클래스 변수는 클래스 안에 함수를 선언하는 것과 마찬가지로 클래스 안에 변수를 선언하여 생성한다.
- 클래스 변수는 클래스로 만든 모든 객체에 공유된다는 특징이 있다.
- 객체변수는 클래스 변수와 동일한 이름으로 생성할 수 있다. a.lastname은 이제부터 Family 클래스의 lastname이 아닌 객체 a의 객체변수 lastname을 가리킨다.
1. 모듈
01 .모듈
- 모듈이란 함수나 변수 또는 클래스를 모아 놓은 파일이다.
02 .모듈 만들기
# mod1.py
def add(a, b):
return a + b
def sub(a, b):
return a-b
- 파이썬 확장자 .py로 만든 파이썬 파일은 모두 모듈이다.
03 .모듈 불러오기
- 모듈을 파이썬에서 불러와 사용하려면 어떻게 해야 할까?
- mod1.py를 저장한 디렉터리로 이동한 다음 대화형 인터프리터를 실행한다.
>>> import mod1 >>> print(mod1.add(3, 4)) 7 >>> print(mod1.sub(4, 2)) 2
- 실수로 import mod1.py로 입력하지 않도록 주의
- add, sub처럼 모듈 이름 없이 함수 이름만 쓰고 싶은 경우
>>> from mod1 import add >>> add(3, 4) 7 #or from mod1 import * #or from mod1 import add, sub
-
- 문자는 “모든 것”이라는 뜻
-
04 .if name == “main”: 의 의미
# mod1.py
def add(a, b):
return a+b
def sub(a, b):
return a-b
print(add(1, 4))
print(sub(4, 2))
#fix to
# mod1.py
def add(a, b):
return a+b
def sub(a, b):
return a-b
if __name__ == "__main__": ##
print(add(1, 4))
print(sub(4, 2))
- import mod1을 수행하는 순간 mod1.py가 실행이 되어 결괏값을 출력
- 이러한 문제를 방지하려면 mod1.py 파일을 다음처럼 변경해야 한다.
- if name == “main“을 사용하면 C:\doit>python mod1.py처럼 직접 이 파일을 실행했을 때는 name == “main“이 참이 되어 if문 다음 문장이 수행된다. 반대로 대화형 인터프리터나 다른 파일에서 이 모듈을 불러서 사용할 때는 name == “main“이 거짓이 되어 if문 다음 문장이 수행되지 않는다.
- name 변수란?
- 내부적으로 사용하는 특별한 변수 이름
- 직접 mod1.py 파일을 실행할 경우 mod1.py의 name 변수에는 main 값이 저장된다. 하지만 파이썬 셸이나 다른 파이썬 모듈에서 mod1을 import 할 경우에는 mod1.py의 name 변수에는 mod1.py의 모듈 이름 값 mod1이 저장된다.
05 .클래스나 변수 등을 포함한 모듈
# mod2.py
PI = 3.141592
class Math:
def solv(self, r):
return PI * (r ** 2)
def add(a, b):
return a+b
# 모듈을 불러와 쓸 때는
>>> import mod2
>>> print(mod2.PI)
3.141592
>>> a = mod2.Math()
>>> print(a.solv(2))
12.566368
>>> print(mod2.add(mod2.PI, 4.4))
7.541592
06 .다른 파일에서 모듈 불러오기
# modtest.py
import mod2
result = mod2.add(3, 4)
print(result)
-
modtest.py 파일과 mod2.py 파일이 동일한 디렉터리(C:\doit)에 있어야 한다.
-
모듈을 불러오는 또 다른 방법
-
- sys.path.append(모듈을 저장한 디렉터리) 사용하기
- sys 모듈을 사용하면 파이썬 라이브러리가 설치되어 있는 디렉터리를 확인할 수 있다.
- 파이썬 모듈이 위 디렉터리에 들어 있다면 모듈이 저장된 디렉터리로 이동할 필요 없이 바로 불러서 사용할 수 있다.
- sys.path에 C:\doit\mymod 디렉터리를 추가하면 아무 곳에서나 불러 사용할 수 있
>>> sys.path.append("C:/doit/mymod") >>> sys.path ['', 'C:\\Windows\\SYSTEM32\\python37.zip', 'c:\\Python37\\DLLs', 'c:\\Python37\\lib', 'c:\\Python37', 'c:\\Python37\\lib\\site-packages', 'C:/doit/mymod'] >>>
- sys.path.append(모듈을 저장한 디렉터리) 사용하기
-
- PYTHONPATH 환경 변수 사용하기
- set 명령어를 사용해 PYTHONPATH 환경 변수에 mod2.py 파일이 있는 C:\doit\mymod 디렉터리를 설정
- PYTHONPATH 환경 변수 사용하기
-
3. 연습문제
Summary
개인 공부 기록용 블로그 입니다.