객체지향 프로그래밍은 컴퓨터 프로그래밍 패러다임 중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체로 만들고 그 객체들 간의 상호작용을 하는 로직을 구성하는 프로그래밍 방법이다
예를 들어, 우리가 플레이 하는 온라인 게임중 팔을 짐승의 팔로 만든다거나 등에 천사의 날개를 단다거나 장비를 탈부착 한다는 등의 행동은 전부 객체지향 프로그래밍으로 구현할 수 있다
코드의 재사용이 용이하다
남이만든 클래스를 가져와서 사용할 수 있고, 상속을 통해 확장해서 사용할 수 있다
유지보수가 쉽다
절차지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메소드로 존재하기 때문에 해당 부분만 수정하면 된다
대형 프로젝트에 적합하다
클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러 명, 여러 회사에서 프로젝트를 개발할 때 업무를 분담하기 쉽다
처리 속도가 상대적으로 느리다
객체가 많으면 용량이 커질 수 있다
설계시 많은 시간과 노력이 필요하다
객체지향의 장점은 많지만 결코 유지보수가 쉽지 않으며 코드가 혼란스러운것을 예방할 수는 없다
Robert C. Martin이 개발한 이 다섯 가지 지침과 원칙을 통해 개발자는 읽기 쉽고 유지 보수가 쉬운 프로그램을 만들 수 있다
단일 클래스는 오직 하나의 일을 가져야 한다
이 원칙의 적용은 클래스에만 국한되지 않으며, 소프트웨어 컴포넌트와 마이크로 서비스에도 적용된다
클래스들이 같은 이유로 매번 변화하는 변화경향이 있다면, 클래스를 설계할 때 연관된 기능들을 함께 모으는 것을 목표로 해야한다. 우리는 기능을 분리하도록 노력하고, 기능들은 서로 다른 이유로 변경되어야 한다 -Steve Fenton
소프트웨어 엔티티(클래스, 모듈 함수)는 확장을 위해 열려있고, 수정되서는 안된다
수정과 확장은 별개이다. 우리는 구분할 필요성이 있다. 즉, 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계되어야 한다
이 원칙이 재대로 지켜지지 않는다면 객체지향 프로그래밍의 장점인 유연성, 재사용성, 유지보수성 등을 모두 잃어버리는 것과 같다
프로그램의 객체는 프로그램의 정확성을 꺠뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다
즉, 상위 타입 객체를 하위 타입 객체로 치환해도 정상적으로 동작해야 한다는 말과 같다
상속관계에서는 꼭 일관성 있는 관계인지 체크해야한다
상속관계가 아닌 클래스들을 상속관계로 설정하면, 이 원칙이 위배된다
한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 않아야 한다
인터페이스는 클라이언트를 기준으로 잘게 분리되어야 한다. 멀티 프로세스의 독립된 구조들 처럼 서로 문제가 생기지 않게 분리시켜놓는 것이 핵심이다
프로그래머는 추상화에 의존해야지, 구체화에 의존해서는 안된다. 의존성 주입은 이 원칙을 따르는 방법 중 하나다
즉 고수준 모듈(클래스)은 저수준 모듈(클래스)에 의존하지 말아야 한다는 의미이다
※ 고수준 모듈 : 의미 있는 기능을 제공하는 모듈
※ 저수준 모듈 : 고수준의 모듈을 제공하기 위해 필요한 모듈
SRP와 ISP는 객체의 크기가 커지지 않도록 한다. 한 곳에서의 변경이 다른곳에 미치는 영향을 최소화 한다
LSP와 DIP는 OCP를 지원한다. 추상화와 다형성을 이용해 기능을 확장하면서도 기존 코드의 수정을 최소화한다