욤미의 개발일지

[DAY 3] Python: Lecture 7. Object-Oriented Programming 본문

NLP/STUDY

[DAY 3] Python: Lecture 7. Object-Oriented Programming

욤미 2022. 10. 18. 19:29
728x90
반응형

[Lecture 7] Object-Oriented Programming

절차 지향 프로그래밍

  • 절차를 차례대로 작성하는 것 → 절차 지향 프로그래밍
  • 중간 과정을 수정하면 뒤에 있는 코드도 수정해야할 수도 있음.
  • 협업 시 프로그래머의 수정 사항이 다른 프로그래머에게 큰 영향을 줌

→ 코드를 객체 단위로 나눌 필요가 있다. = 객체 지향 프로그래밍

  • 클래스(Class)당 객체(Object)는 여러개 일 수 있다.
  • 각 객체의 데이터(Attribute)는 달라도 행동(Method)는 동일하다.
  • Class 클래스명(부모클래스)클래스 선언
    • 클래스명은 CamelCase가 관습적으로 사용
    • 부모 클래스가 지정되지 않으면 object가 자동 상속된다.
  • 클래스 속성
    • 모든 객체가 같은 값을 참조, but 남용하면 스파게티 코드의 원인이 됨
  • 클래스 함수(Method)
    • 각 객체에 적용이 가능한 함수
    • 현재 수정하고자 하는 객체는 self로 지칭
    • instance.method(args, ...) 로 사용 가능
  • 객체 속성
    • self.변수명: 속성(attribute) 정의
  • Magic Method
    • __init__: 생성자
    • __del__ : 소멸자

Magic Method

  • indexing method __getitem__ __setitem__
  • length method __len__
  • typing method __str__ __int__ __float__ __bool__
  • comparison method __lt__ (lessthan, < 연산자 재정의) __le__(≤) __gt__(>) __ge__(≥) __eq__(==) __ne__(!=)
  • 함수화 method __call__
    • 생성된 객체를 호출 가능하게 함
  • context manager: with 구문을 들어가면 __enter__ 호출 __exit__로 탈출

객체지향의 3요소

1. 상속(Infereitance)

  • 기존 구현틀(부모Class) 상속 → 새로운 틀(자식 Class)을 제작
  • 자식 Class는 부모 Class의 기능을 사용할 수 있다.
  • 같은 기능을 재작성할 필요가 없음 → 재활용성과 생산성↑
  • 다중상속을 지원한다
    • but, 죽음의 다이아몬드 발생가능성이 있음
    • 파이썬은 mro로 우선순위를 정하기 때문에 어떤 순서로 상속되는지 알 수 있다.
  • super 내장 함수를 이용해 상위 클래스에 접근 가능

2. 다형성(Polymorpishm)

  • 같은 이름의 메소드를 다르게 작성
  • 각 자식 클래스가 다른 클래스와 차별
  • 부모 메소드로 접근시 자식 메소드 실행
  • 외부에서는 똑같은 API로 접근
  • 같은 이름의 메소드가 있으면 실행 = Duck Typing
✔️ Static & Class Method
     파이썬에는 2가지 정적 함수가 존재
     • 객체에서 접근 가능
     • 일반적으로 Class.method 형태로 사용

     • Static Method
        • @staticmethod 꾸밈자 사용
        • 특별한 argument를 받지 않음
        • 일반적으로 class 내 유틸 함수로 사용
        • Class를 일종의 Namespace로 사용

     • Class Method
        • @classmethod 꾸밈자 사용
        • 호출된 클래스인 cls를 받음(self와 비슷)
        • factory패턴에서 사용

3. 가시성, 캡슐화(Visibility)

  • 다른 클래스에게 객체 내부를 감추기
  • 캡슐화, 정보 은닉
  • 클래스 간 간섭 최소화
  • 최소한의 정보만을 지정된 API로 공개
  • C나 Java에서는 private(자기자신)나 protected(자기자신, 자식)고 구현
  • python에서는
    • 명시적인 private/protected 범위가 없다. 모두 public
    • private 변수/함수는 앞에 __를 붙임
    • protected 변수/함수 앞에는 _를 붙임
    • __의 경우 변수명 앞에 class 이름을 넣어 Mangling이 일어남(자식과 이름 겹치지 X)
    • private와 protected는 코드 완성 등에서 안 보인다.
    • 그러나 둘다 public과 기능적 차이는 없다. 밖에서 접근 가능
    • 굳이 구분하는 이유는 가독성 때문!
  • Property를 통해 Getter, Setter를 명시적 설정 가능
728x90
반응형
Comments