06_파이썬 중급(2)

ryu·2023년 5월 10일

모듈 사용

import, from, as

  • import를 활용하여 모듈을 임포트할 수 있고 as 키워드를 이용해서 이름을 단축시킬 수 있음

    import calculator as cal	# 임의로 정한 모듈
    
    cal.add(10, 20)
    cal.sub(10, 20)
  • from ~ import를 활용하여 모듈의 특정 기능만 사용할 수 있음


실행(메인) 파일

__name__ 전역변수

  • __name__ 에는 모듈 이름이 저장되거나 '__main__'이 저장됨

    • 이 때 실행파일인 경우에 '__main__'이 저장되고, 실행파일이 아닌 모듈의 경우 그 모듈의 파일 이름이 저장됨

      import itertools
      
      print(itertools.__name__)	# itertools
      print(__name__)	# __main__
  • if __name__ == '__main__':은 이 파일이 실행 파일일 때만 아래 실행문을 실행하라는 의미임


패키지

패키지란?

  • 모듈을 그룹으로 관리하는 것

site-packages

  • site-packages에 있는 모듈은 어디서나 사용할 수 있음
  • 그렇지 않은 건 경로를 신경써야 함
  • 만약 어디서나 사용이 가능하게 하고 싶다면 가상환경 폴더 내의 site-packages라는 디렉토리 내로 옮겨주면 됨
    • venv/lib/site-packages

자주 사용하는 모듈

  • math: 수학 관련 모듈
  • random: 난수 관련 모듈
  • time: 시간 관련 모듈

math

  • 자주 쓰는 수학관련 함수

    • sum()
    • max(), min()
    • pow()
    • round()
  • math 모듈의 함수

    • fabs()
    • ceil()
    • floor()
    • trunc()
    • gcd()
    • factorial()
    • sqrt()

time

  • lt = time.localtime()
    • lt.tm_year
    • lt.tm_mon
    • lt.tm_mday
    • lt.tm_hour
    • lt.tm_min
    • lt.tm_sec
    • lt.tm_wday

객체지향 프로그래밍

  • 객체를 이용한 프로그램으로 객체는 속성과 기능으로 구성됨
  • 객체는 클래스에서 생성됨

객체 사용의 장점

  • 코드 재사용, 모듈화에 좋음

클래스 만들기

  • class 키워드와 속성(변수) 그리고 기능(함수)를 이용해서 만듦

    class Car:	# 클래스 선언
      
      	def __init__(self, color, length):	# 생성자
          	self.color = color	# 속성
            self.length = length
            
        def doStop(self):	#	기능
          	print('STOP!')
        
        def doStart(self):
          	print('START!')
  • 클래스 명의 첫글자는 대문자

객체 생성

  • 객체는 클래스의 생성자를 호출함

    car1 = Car('red', 200)
    car2 = Car('blue', 300)

객체 속성 변경

class NewGenerationPC:
  	def __init__(self, name, cpu, memory, ssd):
      	self.name = name
        self.cpu = cpu
        self.memory = memory
        self.ssd = ssd
        
    def doExcel(self):
      	print('excel run!')
    
    def doPhotoshop(self):
      	print('photoshop run!')
       
    def printPCInfo(self):
      	print(f'self.name: {self.name}')
        print(f'self.cpu: {self.cpu}')
        print(f'self.memory: {self.memory}')
        print(f'self.ssd: {self.ssd}')
        
myPC = NewGenrationPC('myPc', 'i5', '16G', '256G')
myPC.printPCInfo()

myPC.cpu = 'i9'
myPC.memory = '64G'
myPC.printPCInfo()

객체와 메모리

  • 변수는 객체의 메모리 주소를 저장하고 이를 이용해서 객체를 참조
  • 따라서 하나의 객체를 두 변수가 참조하고 있다고 할 때 하나의 변수에서 속성값을 변경하면 다른 하나의 변수에서도 변경됨
  • 같은 내용을 가진 별개의 객체를 만들어서 변수가 참조하게 하고 싶다면 copy()를 사용

얕은복사와 깊은복사

얕은 복사

  • 객체 주소를 복사하는 것으로, 객체 자체가 복사되지는 않음

깊은 복사

  • 객체 자체를 복사하는 것으로 객체 자체를 복사하는 것
  • 리스트의 경우 extend(), for문, copy(), [:] 등을 활용하여 깊은복사 가능

클래스 상속

  • 클래스는 또 다른 클래스를 상속해서 내 것처럼 사용 가능

    class NormalCar:
      	pass
      
    class TurboCar(NormalCar):	# TruboCar 클래스는 NormalCar 클래스를 상속
      	pass

생성자

  • 객체가 생성될 때 생성자를 호출하면 __init__()가 자동으로 호출됨

__init__()

  • 속성을 초기화
  • 초기화할 값을 매개변수로 주어지게 하는 것도 가능하고, 매개변수를 전달하지 않고 매직메서드 내에 기본값을 지정해주어도 됨

super()

  • 상위 클래스의 속성을 사용하고 싶을 때

다중 상속

  • 2개 이상의 클래스를 상속
  • 다중상속은 남용하지 않는 것이 좋음
    • 상속하는 상위 클래스들에 동일한 이름의 메서드들이 있을 때 헷갈릴 수 있음
    • 원칙적으로는 상속하는 순서에 따라 해당 이름을 가진 메서드를 찾지만, 개발자 입장에서 혼동이 올 수 있음

오버라이딩

  • 하위클래스에서 상위클래스의 메서드를 재정의(override)하는 것

    class Robot:
      	def __init__(self, c, h, w):
          	pass
        
        def fire(self):
          	print('총알 발사!')
            
    class NewRobot(Robot):
      	def __init__(self):
          	super().__init__(c, h, w)
            
        def fire(self):
          	print('불꽃 발사!')	# 오버라이딩

추상클래스

  • 상위 클래스에서 하위 클래스에 메서드 구현을 강요하는 것

  • 하위클래스에서 지정하지 않을 시 에러 발생

  • 하위클래스에서 반드시 구체화해야 하는 메서드는 상위클래스에 @abstractmethod(추상메서드) 데코레이터로 지정되어있음

  • 추상메서드로 지정되지 않은 것은 반드시 구체화할 필요는 없지만, 추상메서드를 구체화하지 않은 경우 에러가 발생

  • 추상클래스는 metaclass=ABCMeta 옵션을 주어 지정할 수 있음

    • 해당 클래스에 추상메서드가 없어도 클래스 선언이 가능
    • 추상메서드가 없다면 그 클래스의 인스턴스를 생성할 수 있으나 추상메서드가 있다면 추상클래스의 인스턴스를 생성할 수는 없음
from abc import ABCMeta, abstractmethod

# 1. 추상클래스 내에 정의된 추상 메서드가 없는 경우
class Airplane(metaclass=ABCMeta):

    def backward(self):
        print('후진!')

basicAirplane = Airplane()
basicAirplane.backward()	# 후진!

# 2. 추상클래스 내에 정의된 추상 메서드가 있는 경우
class Airplane(metaclass=ABCMeta):

    @abstractmethod
    def forward(self):	# 추상메서드
        print('전진!')

    def backward(self):
        print('후진!')

basicAirplane = Airplane()	# TypeError: Can't instantiate abstract class Airplane with abstract method forward
basicAirplane.backward()

예외

예외란?

  • 문법적인 문제는 없으나 실행 중 발생하는 예상하지 못한 문제

예외의 종류

  • 예외 관련 클래스는 Exception 클래스를 상속
  • ArithmeticError, ZeroDivisionError, EnvironmentError, LookupError, SyntaxError 등등

0개의 댓글