객체지향 4가지 특징
- 추상화(Abstraction)
- 불필요한 부분을 제거함으로써 필요한 핵심만 나타낸 것.
- 일반화, 단순화
- 목적: 복잡성을 낮추기 위한 도구
- 다형성(Polymorphism)
- 다양한 형태를 가지는 것
- 하나의 타입으로 여러 종류의 객체를 참조.
- 캡슐화(Encapsulateion)
- 객체 내부의 세부사항을 외부로부터 감추는 것
- 목적: 인터페이스만 공개해서 변경하기 쉬운 코드를 만드는 것
- 상속(Inheritance)
객체지향의 5가지 설계 원칙(SOLID)
- SRP: Single Responsibility Principle(단일 책임의 원칙)
- OCP: Open/Closed Principle(개방 폐쇄의 원칙)
- 확장에는 열려있고, 변경에는 닫혀있다.
- 기존 코드를 변경하지 않고 기능을 추가할 수 있어야한다.
- LSP: Liskov's Substitution Principle(리스코프 치환의 원칙)
- 상위타입의 객체를 하위타입의 객체로 치환해도 문제가 없어야 한다.
- ISP: Interface Segregation Principle(인터페이스 분리의 원칙)
- 많은 기능을 가진 인터페이스를 작은 단위로 분리시킴으로써 클라이언트에게 필요한 인터페이스들만 구현하는 개념
- DIP: Dependency Inversion Principle(의존성 역전의 원칙)
- 의존관계를 맺을 때 변경이 거의 일어나지 않는 쪽에 의존.
객체지향 패러다임
- 적절한 객체에게 적절한 책임을 할당해 서로 메시지를 주고 받으며 협력하도록 하는 것.
- 점점 증가하는 SW복잡도를 낮추기 위해 객체지향 패러다임 대두
- 클래스가 아닌 객체에 초점을 맞추는 것
- 객체들에게 얼마나 적절한 역할과 책임을 할당하는지
절차지향 프로그래밍 vs 객체지향 프로그래밍
- 책임이 한곳에 집중돼 있는 방식(getter)
- 책임이 여러 객체로 적절히 분산돼 있는 방식
객체지향 설계 -> high cohesion, loose coupling 높은 응집도, 낮은 결합도
어떠한 곳에 문제가 생겼을 때 다른 곳에 문제가 되지 않는다.
객체지향 설계를 하는 이유는 어떤 문제가 생겼을 때 빠르고, 유연하게 대응할 수 있어서.
객체지향 설계의 순서
- 도메인을 구성하는 객체에는 어떤 것들이 있는지 고민
- 객체들 간의 관계를 고민
- 동적인 객체를 정적인 타입으로 추상화해서 도메인 모델링 하기
- 협력을 설계
- 객체들을 포괄하는 타입에 적절한 책임을 할당
- 구현하기
참고 - 객체지향은 모든 객체가 능동적인 존재.