⌜오브젝트⌟라는 도서를 읽기 전에 내가 자바를 공부하고 지금까지 약 1년 5개월, 자바 기본 서적 2권, ⌜객체지향의 사실과 오해⌟, ⌜스프링 입문을 위한 자바 객체지향의 원리와 이해⌟, ⌜클린 아키텍처⌟, ⌜마이크로서비스 패턴⌟ 및 다수의 도서들과 여러 자바 및 스프링 강의을 듣고, 설계해본 경험을 바탕으로 객체지향에 대해 간단하게 나의 생각을 정리해보려 한다.
객체 지향은 뭘까? 객체를 통한 프로그래밍을 지향한다는 의미이다.
객체란 뭘까? 상태와 행위를 가지고 자신의 상태를 자신이 관리하며, 행위를 통해 의사소통하는 데이터의 집합이다.
상태란 뭘까? 자신이 관리하는 데이터이다.
행위란 뭘까? 자신의 상태를 변경하거나, 외부에게 건네 줄 데이터를 메서드를 통해 제공하는 것이다.
왜 객체를 지향해야 하는 것인가?
객제지향을 말하기전 절차지향을 먼저 집고 넘어가야 한다. 프로그램은 절차적으로 수행된다. 그걸 그대로 코드로 나타낸다면 절차지향이 아닐까. 즉, 각 함수가 호출되는 제어의 흐름과 의존성 방향이 동일한 패러다임이 절차지향이라고 생각한다. 객체지향은 자신의 특성과 원칙을 지키면 제어의 흐름과 의존성 방향을 반대로 둘 수 있다.
그렇다면 왜 객체를 지향해야 하는 것일까
이건 객체지향이 제공하는 특징을 통해 확인할 수 있다.
캡슐화?
비슷한 관심사를 가지는여러 데이터와 데이터를 변경하는 행위들을 객체라는 캡슐에 캡슐화하는 것이다.
왜 캡슐화를 해야 하는가?
비슷한 관심사를 가지는 데이터가 하나의 캡슐에서 관리되며, 외부에 노출되지 않기 때문이다.
외부에 노출되지 않으면 어떤 점이 좋은가?
내부에서 데이터를 내 입맛대로 변경해도 외부에서는 접근하지 못하기에 변경에 용이하다.
추상화, 다형성, 상속?
캡슐화한 객체를 추상화하고, 상속(extends, implements)받음으로써 하나의 객체가 여러 형태를 띌 수 있다.
객체를 잘 사용하면 SOLID원칙을 지킬 수 있다.
SOLID?
나는 솔리드가 내포하고있는 의미를 이렇게 이해했다.
책임은 객체가 알고있는 것, 할 수 있는 것이다. 자신의 책임을 하나로 두었다면 자신이 변경될 이유는 하나일 것이다.
객체를 분리하는 방식 혹은 인터페이스를 두는 방식을 통해 객체가 변경될 이유를 하나의 엑터로 줄여라.
고수준의 클래스는 추상화를 의존하고, 외부에서 의존성을 주입시킴으로써 고수준 클래스가 저수준 클래스를 의존하는 꼴을 피해라. 즉, 제어의 흐름과 의존 방향을 반대로 둬라 그렇다면 고수준 클래스는 저수준 클래스의 변경에는 안전하고, 확장에는 열려있는 구조가 될 것이다.
클린 아키텍처?
나는 클린 아키텍처가 내포하는 있는 의미를 이렇게 이해했다.
애플리케이션의 정책과 외부의 세부사항을 분리하고 캡슐화 해라.
고수준 모듈은 추상화를 의존하고 저수준 모듈은 이를 구현함으로써 의존성을 역전시켜 정책이 세부사항을 의존하는 꼴을 피해라. 그렇다면 고수준 모듈은 저수준 모듈의 변경에는 안전하고, 확장에는 열려있는 구조가 될 것이다.
객체지향이 지향하는 것이 클래스 레벨에서 모듈 레벨로 올라갔다.
마이크로 서비스 아키텍처?
사실 마이로서비스를 운영하고 설계해본 경험이 전무하기에 이해도가 다소 부족할 수 밖에 없다고 생각한다.
하지만 도서의 내용을 학습한 결과, 결국엔 내포하고 있는 의미가 위의 두 패러다임과 동일하다고 생각한다.
도메인(관심사)을 기준으로 컴포넌트를 분리(캡슐화)하라. 컴포넌트 간의 느슨한 결합을 통해 독립적으로 동작하도록 해라.
클린 아키텍처가 지향하는 것이 모듈 레벨에서 컴포넌트 레벨로 올라갔다.
결국 객체지향이란 High Cohesion, Low Coupling 을 만족하는 애플리케이션을 구축하기 위해 이해하고 넘어가야 하는 개념중 하나라고 판단했다. 그것이 클래스, 모듈 레벨 혹은 컴포넌트 레벨이든 객체지향이 내포하고 있는 의미를 잘 생각해보면 어떻게 설계하는 것이 High Cohesion, Low Coupling을 만족하는지 생각할 수 있을 거라고 생각한다.
내가 얻어가고 싶은 것
나는 이번에 오브젝트라는 도서를 통해서 객체지향적인 설계의 구체적인 방법과 실패 및 성공 사례를 파악하고 싶다.
해당 지식을 습득해서 지금까지 내가 객체지향적인 설계를 하며 애매했던 부분을 시원하게 긁을 수 있길 바란다.
'일기' 카테고리의 다른 글
8주간의 휴식 기간을 가지며 (6) | 2024.07.13 |
---|---|
⌜오브젝트⌟ 를 학습하며 (객체지향과 설계에 대해) (0) | 2024.04.24 |
백엔드 취준생이 클린 아키텍처를 읽고 (0) | 2024.02.14 |
우테코 프리코스 회고와 앞으로의 계획 (0) | 2023.12.13 |
내가 얻은 것들 그리고 얻어갈 것들 (1) | 2023.10.12 |