5 minute read

📢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 메서드의 매게변수 매개변수 self 메서드의 매개변수
    • 클래스 안에 구현된 함수는 다른 말로 메서드(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)에 있어야 한다.

  • 모듈을 불러오는 또 다른 방법

      1. 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']
          >>>
          
      1. PYTHONPATH 환경 변수 사용하기
        • set 명령어를 사용해 PYTHONPATH 환경 변수에 mod2.py 파일이 있는 C:\doit\mymod 디렉터리를 설정

3. 연습문제

Summary

개인 공부 기록용 블로그 입니다.