모든 개념을 객체라는 단위로 정의하고, 객체 간 상호작용을 중심으로 기술하는 프로그래밍 패러다임입니다.
- 여러가지 사물 또는 개념에서 공통적 특성을 추출하여 기능을 간추리는 것을 말합니다.
추상화를 통해 구현한 객체의 복잡한 구조를 숨기고 단순한 인터페이스를 제공할 수 있습니다.
- 큰 개념을 더 작은 개념으로 나누거나 구체적으로 기술하기 위한 기능입니다. C++의 class는 상속 기능을 지원합니다.
- 하나의 인터페이스를 통해 여러 동작을 수행할 수 있게 합니다. C++에서는 오버로딩, 오버라이딩, 업캐스팅, 다운캐스팅 등이 있습니다.
- 서로 관계가 있는 함수와 변수들을 묶어 하나의 구조로 만들 수 있습니다. C++에서는 class를 의미합니다. 클래스는 내부 구성요소를 외부로부터 보호하고 은닉하는 기능을 지원합니다. 은닉성이 깨지면 데이터의 유효성 검사를 하기 어렵고, 시스템 결합도가 증가합니다.
- 구현된 클래스는 하나의 기능만을 가져야 하고, 클래스에 구현된 모든 method와 property는 해당 기능을 수행하는데 그 목적을 두고 있어야 한다는 원칙입니다.
- 기능의 확장에 대해서는 개방적이고, 수정에 대해서는 폐쇄적이어야 한다는 원칙입니다. 쉽게 말해서, 새로운 기능을 추가할 때 클래스를 직접 수정해야하는 설계 보다는 파생 클래스를 만들어 확장하거나, 새로운 컴포넌트를 만들어 확장하는 형태로 기능을 추가하는 설계여야 한다는 의미입니다.
- 파생클래스는 어떠한 경우에도 부모 클래스를 대체할 수 있어야 한다는 원칙입니다. 이를 지키기 않는 상속 관계에서는 파생클래스에서 사용하지 않는 부모의 기능이 발생하게 됩니다.
- 인터페이스 분리 원칙은 구현할 class에 무의미한 메소드 만들지 않는 것이 좋고, 그렇게 하기 위해 인터페이스를 작은 단위로 분리해야 한다는 원칙입니다. C++에서는 다중상속과 추상 클래스로 이를 구현할 수 있습니다.
- 저수준 모듈이 고수준 모듈에 의존해서 구현되면 안된다는 원칙입니다.