728x90
<객체 지향 프로그래밍의 특징>
1. 자료 추상화
- 공통의 속성과 행위를 찾아서 타입을 정의하는 과정
- 불필요한 정보를 숨기고 중요한 정보만을 표현 -> 프로그램을 간단하게
- 자료 추상화를 통해 정의된 자료형 -> 추상 자료형
- 추상 자료형은 자료 표현과 자료형의 연산을 캡슐화한 것 -> 접근 제어, 정보 은닉
- 일반적으로 추상 자료형은 클래스
- 추상 자료형의 인스턴스는 객체
- 추상 자료형에서 정의된 연산은 메소드(함수)
- 메소드의 호출을 생성자라고 함
2. 상속
- 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능
- 상속을 받는 새로운 클래스 : 서브클래스, 파생 클래스, 하위 클래스, 자식 클래스
- 새로운 클래스가 상속하는 기존의 클래스 : 슈퍼클래스, 기반 클래스, 상위 클래스, 부모 클래스
- 상속을 통해 자식 클래스를 이용해 프로그램의 요구에 맞추어 클래스 수정 가능
- 클래스 간의 종속 관계 형성함으로써 객체 조직화 가능
3. 다중 상속
- 클래스가 2개 이상의 클래스로부터 상속받을 수 있게 하는 기능
- 클래스들의 기능이 동시에 필요할 때 용이
- 클래스의 상속 관계에 혼란을 줄 수 있음 (ex 다이아몬드 상속)
4. 다형성 개념
- 다양한 형태로 나타날 수 있는 특징
- 어떤 한 요소에 여러 개념을 넣어 놓는 것
- 하나의 클래스에 행위를 여러 개 정의하거나, 상위 클래스의 행위를 하위 클래스에서 재정의
- 일반적으로 오버라이딩이나 오버로딩
- 오버라이딩 : 같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것
- 오버로딩 : 같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것
- 다형 개념을 통해 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있음
5. 동적 바인딩
- 실행 시간 중에 일어나거나 실행 과정에서 변결될 수 있는 바인딩
- <-> 정적 바인딩 : 컴파일 시간에 완료되어 변화하지 않는 바인딩
- 프로그램의 한 개체나 기호를 실행 과정에 여러 속성이나 연산에 바인딩함으로써 다형 개념 실현
<객체 지향 프로그래밍 5원칙 : SOLID>
1. SPR(Single Responsibility Principle) : 단일 책임 원칙
- 객체는 오직 하나의 책임을 가져야함 (오직 하나의 변경의 이유만을 가져야함)
- 클래스의 목적을 명확히 함으로써 구조가 난잡해지거나 수정 사항이 불필요하게 넓게 퍼지는 것을 예방하고 기능을 명확히 분리할 수 있게 함
- 하나의 클래스가 두 가지 이상의 책임을 지게 되면
- 클래스의 목적이 모호해지고
- 기능을 수정할 때 영향을 받는 범위가 커져서 유지보수가 힘들어지며
- 작성자조차도 정확히 무엇을 하는 클래스인지 설명할 수 없는 스파게티 코드가 되어버림
2. OCP(Open-Closed Principle) : 개방-폐쇄 원칙
- 객체는 확장에 대해서는 개방적이고 수정에 대해서는 폐쇄적이어야함 (객체 기능의 확장을 허용하고 스스로의 변경은 피해야함)
3. LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
- 자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있음 (부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 잘 작동해야함)
4. ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
- 클라이언트에서 사용하지 않는 메서드는 사용해선 안됨 -> 인터페이스를 다시 작게 나누어 만듦
5. DIP(Dependency Inversion Principle) : 의존성 역전 원칙
- 추상성이 높고 안정적인 고수준의 클래스는 구체적이고 불안정한 저수준의 클래스에 의존해서는 안됨
- (상대적으로 고수준인) 클라이언트는 저수준의 클래스에서 추상화한 인터페이스만을 바라보기 때문에, 이 인터페이스를 구현한 클래스는 클라이언트에 어떤 변경도 없이 얼마든지 나중에 교체될 수 있음
728x90
'PROGRAMMING > PYTHON' 카테고리의 다른 글
[Python] packing과 unpacking (0) | 2021.08.16 |
---|---|
[Python] input() vs sys.stdin.readline() (0) | 2021.08.16 |
[Python] 정규 분포, 확률 분포, 사분위 수 (0) | 2021.05.10 |
[Python] JSON, open API 다루기 (0) | 2021.04.28 |
[Python] Matplotlib (0) | 2021.04.26 |
댓글