현실세계를 객체로 모델링하여 소프트웨어를 개발하는 방법론으로서
객체는 속성과 행위로 구성되어 있고, 객체간의 상호작용을 통해 프로그램을 실행시킵니다.
이러한 객체를 중심으로 프로그램을 설계하고 구현하는 것이 객체 지향 프로그래밍입니다.
객체지향의 주요 개념으로는 캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism)이 있습니다.
추상화
구체적인 사물들의 공통적인 특징을 파악해서 이를 하나의 개념(집합)으로 다루는 것
캡슐화(Encapsulation)
객체의 속성과 행위를 하나로 묶어, 객체의 내부 구현을 외부에 감추고, 외부에서는 객체에 접근하기 위해 정의된 인터페이스만을 사용할 수 있도록 하는 것을 의미합니다. 이를 통해 코드의 재사용성과 유지보수성을 높일 수 있습니다.
상속(Inheritance)
객체지향 프로그래밍은 소프트웨어 개발에서 유지보수성, 확장성, 재사용성 등의 이점을 제공합니다. 객체지향 개발 방법론을 적용하여 코드를 작성하면, 코드의 가독성이 높아지며, 모듈화가 용이해지고 유지보수가 쉬워집니다. 또한 객체지향의 장점 중 하나인 다형성을 활용하여 코드의 재사용성을 높일 수 있습니다.
클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리
SRP: 단일 책임 원칙(single responsibility principle)
OCP: 개방-폐쇄 원칙 (Open/closed principle)
LSP: 리스코프 치환 원칙 (Liskov substitution principle)
ISP: 인터페이스 분리 원칙 (Interface segregation principle)
DIP: 의존관계 역전 원칙 (Dependency inversion principle)
Single responsibility principle
한 클래스는 하나의 책임만 가져야 합니다.
책임이라는 건클 수 있고, 작을 수 있습니다.문맥과 상황에 따라 다를 수 있기 때문에
🎀 중요한 기준은 변경입니다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 적용했다고 말할 수 있습니다.
Open/closed principle
확장에 대해서는 개방적이고, 수정에 대해서는 폐쇄적이어야 한다는 것으로 기존의 코드를 변경하지 않으면서 기능을 추가 할 수 있도록 설계되어야 한다는 것을 의미합니다.
Liskov substitution principle
자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 한다.
예) 자동차 인터페이스의 엑셀은 앞으로 가라는 기능, 뒤로 가게 구현하면 LSP 위반, 느리 더라도 앞으로 가야함
Dependency inversion principle
프로그래머는 “추상화에 의존해야지, 구체화에 의존하면 안된다.” 것으로 변화하기 쉬운 것에 의존하지 말라는 원칙입니다.
쉽게 이야기해서 구현 클래스에 의존하지 말고, 인터페이스에 의존하라는 뜻으로
역할(Role)에 의존하게 해야 한다는 것과 같습니다.
Interface segregation principle
인터페이스를 클라이언트에 특화되도록 분리시키라는 설계 원칙으로
특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다라는 것을 의미 합니다.
예를 들어
자동차 인터페이스를 -> 운전 인터페이스, 정비 인터페이스로 분리하면
사용자 클라이언트를 -> 운전자 클라이언트, 정비사 클라이언트로 분리를 할 수 있습니다.
분리하면 정비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않고
자동차 인터페이스 -> 운전 인터페이스, 정비 인터페이스로 분리하면
사용자 클라이언트 -> 운전자 클라이언트, 정비사 클라이언트로 분리됩니다.
분리하면 정비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않고, 인터페이스가 명확해지고, 대체 가능성이 높아집니다.
참고
김영한 강의 스프링기본
https://aws.amazon.com/ko/what-is/api/