- 캡슐화 : 객체의 필드와 메서드를 하나로 묶고 실제 구현 내용을 감추는 것
- 상속 : 상위 객체는 하위 객체에게 자신의 필드와 메서드를 물려줄 수 있음
- 다형성 : 하나의 타입에 여러 객체를 대입해서 다양한 기능을 이용할 수 있음
- 추상화 : 공통된 특성을 추출해서 공통된 추상화로 간추리는 것
로버트 마틴이 정의한 객체지향 설계의 5원칙
- SRP : 한 컴포넌트에는 하나의 책임만 따른다.
- OCP : 소프트웨어 요소는 확장에는 열려 있지만 변경에는 닫혀 있어야 한다.
- 요구사항 변경이나 추가가 발생해도 기존 구성요소를 수정하기 보다는 확장 및 재사용이 가능하도록 설계해야 한다는 뜻
- LSP : 객체는 정확성을 깨뜨리지 않으면서 하위 타입 인스턴스로 변경될 수 있어야 한다.
- ISP : 하나의 통합 인터페이스보다는 여러 개의 구체적인 인터페이스를 사용해야 한다.
- DIP : 추상화에 의존하고, 구체화에 의존하면 안 된다.
Overloading
- 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것
- 메서드의 이름을 통일해서 프로그램의 가독성을 증가시킬 수 있음
Overriding
- 부모로부터 상속받은 메서드 로직을 재정의하는 것
- 부모의 것과 동일한 return 타입, 매개 변수들을 사용해야 함
Cohesion and Coupling
높은 응집도, 낮은 결합도를 추구해야 함
모듈 = 클래스일수도, 패키지일수도, 심지어 마이크로서비스일수도 있는 객체 단위
- 모듈 내 요소들이 서로 얼마나 밀접하게 연결되어 있는지
- "함께 변경된 코드는 함께 유지된다"
- 모듈이 관련 없는 요소를 포함한 경우 "응집도가 낮다"고 표현
- SRP와 연관된 개념이며, 모듈은 단일 책임 원칙을 가져야 한다고 강조
- 높은 응집도의 장점
- 모듈이 하나의 목적을 추구하므로 가독성이 좋아진다
- 모듈 관련 코드는 모두 모듈 안에 있으므로 영향 범위를 줄이면서 기능을 수정할 수 있다
- 모듈 간 의존성이 적어지므로 단위 테스트에 용이하다
- 모듈 간 상호 의존 정도
- 한 가지를 수정했을 때 다른 수정사항이 얼만큼 발생하는지
- 낮은 결합도의 장점
- 모듈 간 강결합은 구조를 이해하기 어렵게 만들며, 변경이 어려워진다
- 강결합된 경우 단위 테스트를 하기에도 어렵다
- 강결합된 경우 통합 테스트 또한 깨지기 쉬워진다
Reference