컴퓨터/프로그래밍

[파이썬] 상속 / 오버로딩과 오버라이딩 / 생성자와 클래스변수

옆동네애옹이 2024. 1. 9. 17:03
728x90

참고: https://wikidocs.net/16071 

상속(Inheritance)

class Parent:
    ...내용...

class Child(Parent):
    ...내용...
  • Parent class를 상속받는 Child class를 선언
  • 그러면 자식클래스에서 부모클래스의 속성, 메소드를 기재하지 않아도 포함됨

부모 클래스 확장하기

  • 부모 클래스에 새 메소드 추가 
  • 새로운 attribute 추가
  • 기존 메소드 재정의: 매개변수를 같게 주는 경우
    • Method Overriding

 

자식클래스 내에서 부모클래스 호출하기

  • 그럴때는 super() 라는 키워드를 사용하면 자식클래스 내에서 코드에서도 부모클래스를 호출할 수 있습니다.

 

# 오버라이딩 vs. 오버로딩

- Overriding: 상속 시 상위 클래스에서 정의한 메소드를, 하위 클래스에서 재정의하는 것 (매개변수 변화 X) "올라타는거"

    -> 상속과 관련된 개념, 메소드 오버라이딩 시 부모클래스의 메소드는 무시되고, 자식클래스의 메소드가 동작.

 

- Overloading: 같은 메소드를 매개변수 변화에 따라 다르게 주는 것.

  - 파이썬은 오버로딩을 공식적으로 지원하지 않음(??) 하나의 메소드에게 다형성을 부여하는 것. 파이썬에서는 연산자 오버로딩을 사용하는 경우가 많음: 연산자를 객체끼리 사용할 수 있게 하는 기능. "연산자 오버로딩" 나중에 더 찾아보긔

    -> operator overloading (연산자 오버로딩): dunder (double underscore) -> magic method, class 안의 특수 method, 대부분 operator overloading 후 사용됨. 연산자 오버로딩: 피연산자가 문자이거나 / 숫자이거나 / 문자와 숫자이거나 전체 모두 오버로딩을 해놨기 때문에 쓸 수 있었던 것.

 

 

# 생성자 변수 vs. 클래스변수

- 파이썬에서 생성자(Constructor)에 변수를 사용하는 것과 클래스 변수(Class Variable)를 사용하는 것은 서로 다른 개념입니다

 

1. 생성자(Constructor): -> 인스턴스 변수, 각 인스턴스가 생성될 때마다 다른 변수를 각기 생성

  • 생성자는 클래스의 인스턴스(객체)가 생성될 때 호출되는 특별한 메서드입니다. 일반적으로 __init__이라는 이름을 가집니다.
  • 생성자는 객체가 초기화될 때 필요한 작업을 수행하도록 사용됩니다. 이때 객체의 속성을 초기화하거나 인스턴스 변수에 초기값을 할당하는 등의 작업을 할 수 있습니다.
  • 생성자에 전달되는 변수들은 해당 객체의 인스턴스 변수로 사용됩니다.

2. 클래스 변수(Class Variable): -> 클래스 변수, 모든 인스턴스가 동일한 클래스 변수를 공유

  • 클래스 변수는 클래스 내부에서 선언되고 모든 인스턴스가 공유하는 변수입니다. 즉, 해당 클래스의 모든 객체가 동일한 클래스 변수를 공유합니다.
  • 클래스 변수는 클래스의 모든 인스턴스가 공유하기 때문에 일반적으로 클래스 수준의 정보나 설정 값을 저장할 때 사용됩니다.

따라서, 생성자에 변수를 사용하는 것은 각 객체의 초기화와 관련이 있고, 클래스 변수는 해당 클래스의 모든 인스턴스가 공유하는 값에 사용됩니다.

 

 

# 객체지향 프로그래밍과 엮어서 생각하기

클래스 만들고 객체 프로그래밍 하는 이유
1. 캡슐화 (변수자체는 정보은닉, 값 불러들이는 함수 만들어서 걔로만 꺼낼 수 있게) -> getA, setA // 변수 보호 목적
2. 상속
3. 추상화 (세부사항 정의없이 추상적으로 표현)
4. 다형성 (객체의 속성/기능이 상황에 따라 여러 형태 가질 수 있음)
-> 오버로딩(한 클래스, 같은 이름 메소드 여러 개 정의, 다른 매개변수) & 오버라이딩 (상속받은 자식클래스가 부모클래스의 메소드 다르게)

 

# SOLID: 객체지향언어 5원칙(Principles)

https://mangkyu.tistory.com/194

 

[OOP] 객체지향 프로그래밍의 5가지 설계 원칙, 실무 코드로 살펴보는 SOLID

이번에는 객체 지향 프로그래밍의 5가지 핵심 원칙인 SOLID에 대해 알아보고자 합니다. 실제로 애플리케이션을 개발할 때 어떻게 적용할 수 있을지 구체적인 예시를 들어 살펴보고자 합니다. 아

mangkyu.tistory.com

1.

[ 단일 책임의 원칙(SRP, Single Responsibility Principle) ]

-> 하나의 클래스는 하나의 액터만 담당해야 함

class person { def cook, def plate, def order, def eat } -> 요리사는 cook, plate만 쓰고, 손님은 order, eat만 쓴다면 안좋은 클래스얌 -> 이런식으로 쓰면 안돼

 

2.

[ 개방 폐쇄 원칙 (Open-Closed Principle, OCP) ]

출처: https://mangkyu.tistory.com/194 [MangKyu's Diary:티스토리]

-> 클래스 자체 변경은 X, 확장은 상속 오버로딩 등으로 해야함 다형성(overloading & overriding)

 

3.

[ 리스코프 치환 원칙 (Liskov Substitution Principle, LSP) ]

출처: https://mangkyu.tistory.com/194 [MangKyu's Diary:티스토리]

-> 부모 class를 자식class로 치환해도 정상동작해야 함.

 

4.

[ 인터페이스 분리 원칙 (Interface segregation principle, ISP) ]

출처: https://mangkyu.tistory.com/194 [MangKyu's Diary:티스토리]

->

목적과 관심이 각기 다른 클라이언트가 있다면 인터페이스를 통해 적절하게 분리해줄 필요가 있는데, 이를 인터페이스 분리 원칙이라고 부른다. 즉, 인터페이스 분리 원칙이란 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공하는 것

출처: https://mangkyu.tistory.com/194 [MangKyu's Diary:티스토리]

예를 들어 파일 읽기/쓰기 기능을 갖는 구현 클래스가 있는데 어떤 클라이언트는 읽기 작업 만을 필요로 한다면 별도의 읽기 인터페이스를 만들어 제공해주는 것이다.

출처: https://mangkyu.tistory.com/194 [MangKyu's Diary:티스토리]

 

5. 

[ 의존 역전 원칙 (Dependency Inversion Principle, DIP) ]

출처: https://mangkyu.tistory.com/194 [MangKyu's Diary:티스토리]

-> 부모클래스는 되도록 추상적, 자식클래스는 되도록 구체적. (저수준 모듈이 고수준 모듈(입출력에 먼 에 의존적)

728x90