OOP 개요
- 핵심: 프로그램을 수많은 객체(Object)라는 기본 단위로 나누고, 이들의 상호작용으로 서술하는 방식
- OOP란, 프로그램 설계 방법론, 패러다임 중 하나
- 객체: 하나의 역할을 하는 메소드와 변수(데이터) 의 묶음
- 객체지향은 메시지를 주고 받으면서 상호 협력하는 자율적인 객체들로 인식
OOP 효과
높은 응집도: 하나의 역할을 하는 데이터들을 모아 놓은 데이터형, 클래스 사용
- 응집도: 한 모듈내의 구성요소들 간의 연관 정도
낮은 결합도: 객체들간의 적절한 협력에 필요한 관계만을 유지를 함으로써 결합력을 낮춤
- 결합도(coupling): 묘듈 모듈간의 의존 정도
그에 따른 효과
- 요구사항 변경에 대한 대응성
- 유지보수성
- 재사용성
- 중복되는 코드량 감소
OOP의 4가지 특징
추상화
- 객체의 공통적인 속성과 기능을 추출하여 하나의 묶음으로 이름 붙여 정의하는 것
다형성
서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력
같은 자료형에 여러가지 타입의 데이터를 대입하여 다양한 결과를 얻어낼 수 있는 성질
캡슐화
필드와 메서드를 내부에 구현하여 은닉하고 외부로 부터 접근을 제한
- 관련 데이터와 코드 알고리즘이 하나의 묶음으로 내부에 구현됨
- 외부와의 상호작용은 메시지와 메소드를 통해서만 함
모듈 내에서 내부를 구현하여 응집도 높힘
외부 노출 최소화 결합도 낮춤
객체간에 의존성은 오직 public 메서드에 의해서만 발생
- 호출 순서 파악이 쉬움
상속
자식 클래스가 부모 클래스의 특성과 기능을 그대로, 전부 물려 받는 것
위험
결합도를 크게 늘림
컴파일 시점에 클래스의 관계가 결정, 유연하지 못한 소프트웨어
상위 클래스가 하위 클래스의 is-a 관계 일때만 사용
- Dog
is-a
Animal
- Dog
위험에 대응하는 법
- 상속 보단 합성이나 인터페이스 구현으로 대체
- 설계와 문서를 제대로 갖추고 상속
SOLID
- OOP의 5가지 기본 원칙의 첫 글자를 따서 명명한 원칙
- OOP의 4가지 특징이 반영
- 효과
- 중복되는 코드 감소
- 낮은 결합도, 높은 응집도
- 유지보수 용이, 요구사항 변경에 유연
- 결과적으로 생산성 상승
SRP, 단일 책임 원칙
- 단일 모듈은 변경의 이유가 오직 하나뿐 이여야 한다
- 책임을 많이 질수록 서로 다른 역할을 수행하는 코드 끼리 결합도 상승의 위험
- Ex) 회계팀, 인사팀의 Employee 클래스 사용
OCP, 개방 폐쇄 원칙
- 확장에 Open
- 요구사항이 변경될 때, 새로운 동작을 추가하여 애플리케이션의 기능을 확장할 수 있다
- 수정에 Closed
- 기존의 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경할 수 있다
LSP, 리스코프 치환 원칙
하위 타입은 상위 타입을 대체 할 수 있어야 한다는 원칙
즉, 하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야 한다
위반 사례
반영 사례
ISP, 인터페이스 분리 원칙
인터페이스를 잘게 분리하여, 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공해야 한다는 원칙
클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야 하는 것
위반 사례
반영 사례
DIP, 의존 역전 원칙
고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 되며, 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다는 원칙
자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어, 변하기 쉬운 것의 변화에 영향받지 않게 하는 것
저수준의 구현에 의존하던 것을 인터페이스에 의존하게 변경 (저->고) , (소스 코드 의존성)
소스 코드의 의존성(저→고) 과 제어 흐름(고→저) 을 반대(역전)로 됨
위반 사례
반영 사례
고수준 모듈 : 변하기 어려운, 추상화된 클래스 또는 인터페이스
저수준 모듈 : 변하기 쉬운, 구체 클래스