Ch3 파이썬 중급 20-33 (중급5-7)

김민지·2023년 3월 12일
0

Part 01. Python

목록 보기
8/12
  1. 객체와 메모리
  • 변수는 객체의 메모리 주소를 저장하고 이를 이용해 객체를 참조함

    rb1 = Robot('red', 200, 80)
    rb2 = Robot('blue', 300, 120)
    rb3 = rb1 -> rb3도 rb1의 메모리주소를 가져옴. rb1의 객체가 복사된것이 아니라, 객체의 메모리주소를 복사한것! 따라서 rb1의 객체가 바뀌면 rb3의 객체도 바뀜

  • copyScores = scores.copy()
    -> 객체를 똑같이 복사한, 완전히 별개의 객체를 만들 수 있음
    -> 이 경우, 원래의 객체를 수정해도 복사한 객체가 바뀌진 X
  1. 객체 복사 : 얕은복사, 깊은복사

  2. 얕은복사 : 객체 주소를 복사. 객체 자체가 복사되진 X (하나의 메모리주소를 공유)
    -> 같은 주소를 공유하고 있는 하나의 객체가 수정되면 다른 객체 역시 수정됨

tc1 = TemCls(10, 'Hello')
tc2 = tc1
  1. 깊은복사 : 객체 자체를 복사하는 것. 새로운 또 하나의 객체가 만들어짐
    -> 아예 다른 객체가 만들어지는 것이기에 수정해봐도 다른 객체에 영향을 주지 X
import copy
tc1 = TemCls(10, 'Hello')
tc2 = copy.copy(tc1)
scores = [9, 8, 5, 7, 6, 10]
scoresCopy = []
for s in scores:
    scoresCopy.append(s)
scores = [9, 8, 5, 7, 6, 10]
scoresCopy = []
scoresCopy.extend(scores)
scores = [9, 8, 5, 7, 6, 10]
scoresCopy = []
scoresCopy = scores.copy()
scores = [9, 8, 5, 7, 6, 10]
scoresCopy = []
scoresCopy = scores[:]
  1. 클래스 상속
  • 클래스는 또 다른 클래스를 상속해서 내 것처럼 사용 가능
class TurboCar(NormalCar):

-> TurboCar 클래스는 NormalCar 클래스를 상속함 -> NormalCar의 기능을 전부 사용가능.

  1. 생성자
  • 객체가 생성될 때 생성자를 호출하면 init()가 자동 호출됨
  • init() -> 속성을 초기화함
    ex) cal = Calculator(10, 20) -> cal이란 객체생성, 10,20으로 속성 초기화
  • super() : 상위 클래스의 속성 초기화
    ex) super().init(cn1, cn2)
  • 기능은 상속만 하면 상위 클래스의 기능을 언제든 쓸 수 있음. but 속성은 init()이 호출되어야만 속성이 초기화됨. 따라서 super()를 이용해 상위클래스의 init()을 강제로 호출해서 속성을 초기화해야 속성 사용가능
  1. 다중 상속

    class Car(Car01, Car02, Car03):
    -> 3개의 클래스 모두 상속

  2. 오버라이딩

  • 하위 클래스에서 상위 클래스의 메서드를 재정의(override)
  • super().메서드() -> 재정의되기 전의 상위 클래스의 메서드를 다시 불러옴
  1. 추상 클래스
  • 상위 클래스에서 하위 클래스에 메서드 구현을 강요
  • 상위 클래스에서 메서드 선언만 하고 실행부를 써놓지 않으면, 하위 클래스에서 그 메서드를 구체화해야 하게 만듬
  • 각자 알아서 기능을 다르게 쓸때 추상클래스를 사용
from abc import ABCMeta
from abc import abstractmethod
class Airplane(metaclass=ABCMeta):
    @abstractmethod
    def flight(self):
        pass
  1. 예외
  • 예외란, 문법적인 문제는 없으나 실행 중 발생하는 예상치 못한 문제
    ex) 0으로 나눌 수 없는데 나눌 때, 문자열을 int로 캐스팅할 때
  • 에러는 소프트웨어적으로 대응할 수 없는 문제(전기문제, 천재지변 등)
  • 예외 관련 클래스는 Exception 클래스를 상속함
  1. 예외처리
  • 예상치 못한 예외가 프로그램 전체 실행에 영향이 없도록 처리함
  • try ~ except : 예외 발생 예상 구문을 try ~ except로 감쌈
try:
    print(n1 / n2)
except:
    print('예상치 못한 예외가 발생했다')
    print('다른 프로그램 실행에는 문제가 없다!')

-> try를 실행해보고 예외가 발생한다면 except를 실행

  • try ~ except ~ else : 예외가 발생하지 않은 경우에 실행하는 구문을 else에
    -> try에 예외가 발생하지 않는다면 except를 생략하고 else를 실행
  1. finally
  • 예외 발생과 상관없이 항상 실행하는 구문
  1. Exception 클래스
  • 예외를 담당하는 클래스
    -> 이를 통해 예외가 왜 일어났는지에 대한 정보를 얻을 수 있음
except Exception as e:
    print(f'exception : {e}')

-> 예외발생시 'exception : division by zero' 라고 뜸

  • raise 키워드 : 예외를 강제적으로 발생시킬 수 있음
def divCalculator(n1, n2):
    if n2 != 0:
        print(f'{n1} / {n2} = {n1 / n2}')
    else:
        raise Exception('0으로 나눌 수 없습니다.')

-> 예외가 발생하는 조건을 직접 만들 수 있음. 예외 문구도 직접 쓸 수 있음.

  1. 사용자 예외 클래스
  • Exception을 상속하는 클래스를 만들어 예외 문구를 만들 수 있음
class NotUseZeroException(Exception):
    
    def __init__(self, n):
        super().__init__(f'{n}은 사용할 수 없습니다.')

<생각>
하나하나 이해하고 따라가려면 시간이 너무 많이 걸리고
쭉 진도만 빼려면 이해가 안가서 점점 어려워져 내용을 놓치게 되는데
이 사이의 합의점을 찾아야 할 것 같다..
원래 공부스타일은 1회독-이해안가도 대충 듣고 넘김, 2회독-조금 친해짐, 3회독-이제 슬슬 이해되고 머리에 들어옴 이런식으로 다회독하면서 익히는 성향인데, 그렇게 하기엔 내용이 많고 진도가 빨라서 그게 될지 잘 모르겠다
일단은 이해가 안돼도 코드 직접 다 쳐보고 이해가 잘 안돼도 진도부터 빼면서 강의듣는중
벨로그에서 코드 쓰는법을 드디어 알았다..!

<제로베이스 데이터 취업 스쿨>

0개의 댓글