객체 지향 프로그래밍
프로그램을 단순한 명령어의 나열로 보는 것이 아니라, 각 독립된 단위인 객체들의 구성으로 보고 설계를 하는 것이다. 독립된 객체들은 각 역할을 맡고 있고, 유기적으로 객체 간 메시지로 소통하여 데이터를 처리한다.
객체 지향 프로그래밍의 이점은
유연하고 변경에 용이하다. 왜냐하면 독립적인 단위로 나눠져 있다보니 조립하듯 쉽게 교체 및 변경이 쉽다.
사람이 사물을 인지하고 사용하는 방식과 유사하게 설계를 할 수 있어서, 설계를 이해하기 쉽다.
객체 지향 특징
추상화,캡슐화,상속,다형성이 있지만 다형성이 중요하다.
다형성
역할과 구현으로 구분하여, 하나의 역할에 여러 구현체들을 사용할 수 있다는 것이다. 기존 설계를 유지하면서 세부적인 기능들을 변경하기 쉽다.
실세계 예시를 들면, 운전자는 기본적인 자동차 운전법만 알면, 다양한 자동차들(KIA차, 현대차, 전기차, 수소차, 휘발유차)를 운전할 수 있다.
객체 사용자는 동작구조를 몰라도 역할을 알고 메시지만 잘 전달하면 해당 기능을 사용할 수 있다. 세부적인 동작구조가 변경되어도 영향을 받지 않는다. 즉, 의존성을 낮출 수 있다.
자바 언어에서는 역할은 인터페이스, 구현은 인터페이스를 구현한 클래스로 설계할 수 있다.
스프링에서는 IoC 제어의 역전, DI 의존관계 주입 방법을 통해서 다형성을 활용해서 역할과 구현을 더 편리하게 사용할 수 있다.
SOLID 원칙
SRP: 단일 책임 원칙(single responsibility principle)
OCP: 개방-폐쇄 원칙(open/closed principle)
LSP: 리스코프 치환 원칙(Liskov subsitutation principal)
ISP: 인터페이스 분리 원칙(Interface segregation principle)
DIP: 의존관계 역전 원칙(Dependency inversion principle)
SRP 단일 책임 원칙(single responsibility principle)
- 한 클래스는 하나의 책임만 갖는다
- 문맥과 상황에 따라 책임의 범위를 임의로 정해야 한다
- 책임의 범위를 정할 때 기준은 변경의 영향이 최소화가 되도록 해야 한다. 한 객체가 변경되었을 때 다른 객체들도 변경이 최소화되도록 하면 원칙을 잘 준수한 것이다.
OCP 개방 폐쇄 원칙 Open/Closed principal
- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있다
- 즉, 객체의 변경이 일어났을 때, 다른 객체들까지 변경이 생기는 변경에는 닫혀있어야 하고, 새로운 기능 적용에는 열려있어야 하는 것이다.
- 다형성을 활용. 자바 언어에서 인터페이스와 구현체들을 사용하는 것. 인터페이스로 변경이 생기는 것을 막고 새 기능의 구현체로 교체가 용이하다.
- 하지만 위 방법으로 OCP를 완벽하게 지켰다고 할 수 없다. 클라이언트에서 구현체 지정을 바꿔줘야하는 점이 남아있다. 그래서 객체를 생성하고 주입해주는 설정 기능이 따로 있으면 클라이언트에서 구현체를 지정해줘야 하는 점이 설정 쪽으로 이동시킬 수 있고, 클라이언트는 확장에도 변경사항이 없게 된다.
LSP 리스코프 치환 원칙 Liskov substitution principle
- 프로그램의 정확성을 깨트리지 않으면서, 하위 타입의 인스턴스로 바꿀 수 있어야 한다
- 인터페이스에서 기대하는 기능에 맞게 구현체 기능들이 바르게 구현되어야 한다
ISP 인터페이스 분리 원칙 Interface segregation Principle
- 너무 클라이언트 별로 인터페이스를 나누는 것도 문제고, 너무 범용적으로 인터페이스를 만들어도 문제다. 적절하게 인터페이스를 분리. 인터페이스는 역할이기 때문에 역할을 잘 분리해야 한다고 생각하면 된다.
- 여러 개의 인터페이스를 세부적으로 나누는 것보다 범용적인 인터페이스 하나가 더 나은 편이 많다. 범용 인터페이스를 만들고 쪼개는 것이 낫다.
- 자동차 사용자에는 2가지로 나눌 수 있다. 운전자, 정비사. 이 사용자에 따라 자동차 인터페이스를 운전 인터페이스와 정비 인터페이스로 나눌 수 있다. 이렇게 하면 정비의 역할(인터페이스)가 변경될지라도 운전 인터페이스는 변경을 안해도 된다.
DIP 의존관계 역전 원칙 Dependency Inversion Principle
- 사용자의 요구에 따라 객체가 의존해야 하는데, 객체 구현에 사용자가 의존하는 역전 현상
- OCP 에서 설명했던 사용자가 인터페이스도 의존하지만, 구현 클래스도 동시에 의존하는 것은 DIP 위반이다. 사용자가 구현체를 모르고 사용할 수 있도록, 구현체 주입은 따로 설정으로 빼는 것이 필요하다.
결론
- 객체 지향의 핵심은 다형성이다. 역할과 구현을 적절하게 분리한 덕분에, 기존 설계를 유지하면서도 세부적인 기능들을 변경하기 쉽다. 개발자의 클린코드 관점에서 벗어나서 빠르게 변하는 비지니스 요구에 비용을 최소화하면서 기능을 추가할 수 있다.
- 자바 언어에서 기본적으로 지원하는 걸로는 OCP, 개방폐쇠원칙, DIP 의존관계 역전 원칙을 지킬 수 없다. 구현체를 주입해주는 관리 기능 구현이 필요하다. 스프링 프레임워크가 해당 기능을 제공해준다.
'공부노트 > 자바' 카테고리의 다른 글
JVM 구조 및 메모리 구조 (0) | 2023.09.17 |
---|---|
OOP 설계 실습 (0) | 2022.03.26 |
Java는 Call By Reference가 없다. Object 참조만 있을 뿐. (0) | 2021.11.21 |