반응형
오브젝트의 1장인 객체, 설계를 간단히 정리해보았다.
객체, 설계
패러다임
정의
- 모델, 패턴, 또는 전형적인 예를 의미
- 한 시대의 사회 전체가 공유하는 이론이나 방법, 문제의식 등의 체계
- 과거의 패러다임이 새로운 패러다임에 의해 대체됨으로써 정상 과학의 방향과 성격이 변하는 것을 패러다임 전환이라 함.
- 예) 우주를 바라보는 패러다임이 천동설에서 지동설로 변화
.
특성
- 패러다임과 패러다임을 채용하는 언어는 특정한 종류의 문제를 해결하는데 필요한 일련의 개념들을 지원한다.
- 두 개의 패러다임은 하나의 언어에 함께 존재할 수 있으며, 함께 공존함으로써 서로의 장단점을 보완할 수 있다. 이러한 언어를 다중패러다임 언어라고 한다.
- 절차 + 객체 = C++
- 함수 + 객체 = Scala
.
결론
- 은총알은 없으며, 객체지향이 적합하지 않을 때는 언제라도 다른 패러다임을 적용할 수 있는 시야를 길러야 한다.
모듈
정의
- 크기와 상관없이 클래스나 패키지, 라이브러리와 같이 프로그램을 구성하는 임의의 요소를 의미한다.
필수 조건
- 제대로 실행되야 한다.
- 변경에 용이해야 한다.
- 이해하기 쉬워야 한다.
의존성(dependency)
정의
- 특정 객체가 다른 객체의 내부에 대해 아는 정도.
- 안다는 것은 특정 객체의 코드가 다른 객체의 변수 및 메소드를 사용하고 있다는 것을 말한다.
- 특정 객체가 다른 객체의 내부를 많이 알 수록 변경이 발생했을 때 함께 변경 변경되는 코드가 많아 진다.
오해와 진실
- 오해. 객체의 의존성을 완전히 없애는 것은 좋다!
- 진실. 객체 지향 설계는 서로 의존하면서 협력하는 객체들의 공동체를 구축하는 것이다. 그래서 애플리케이션의 기능을 구현하는 데 필요한 최소한의 의존성만 유지하고 불필요한 의존성을 제거 해야 한다.
의존성과 결합도(coupling)의 연관성
- 의존성이 과한 경우를 결합도가 높다고 한다.
- 객체들이 합리적인 수준수에서 의존할 경우에는 결합도가 낮다고 한다.
캡슐화(encapsulation)
정의
개념적이나 물리적으로 객체 내부의 세부적인 사항을 감추는 것.
목적
- 변경하기 쉬운 객체를 만드는 것.
- 객체 내부로의 접근을 제한하면 객체와 객체 사이의 결합도를 낮출 수 있기 때문에 설계를 좀 더 쉽게 변경할 수 있게 된다.
- 접근 지정자로 접근 가능한 변수와 메소드를 제한 함으로써 한정된 인터페이스 (interface)를 제공하고 세부적인 내부 로직인 구현 (implementation)은 숨김으로써 캡슐화 한다.
응집도(cohension)
정의
- 밀접하게 연관된 작업만을 수행하고 연관성 없는 작업을 다른 객체에게 위임하는 정도.
- 자신의 데이터를 스스로 처리하는 자율적인 객체를 만들면 결합도를 낮출 수 있을뿐더러 응집도를 높일 수 있다.
절차 지향과 구별되는 객체 지향의 특성
절차 지향의 특성
- 세부 처리 내용과 흐름에 해당하는 프로세스와 주로 값을 담는 역할을 하는 데이터를 별도의 모듈에 위치시키는 방식을 절차적 프로그래밍(Procedural Programming)이라 한다.
- 개인적인 생각으로는 Spring Framework에서 Service가 프로세스에 해당하고 VO가 데이터라고 생각한다.
- 일반적으로 프론트엔드로부터 넘어온 세부 요청 사항을 컨트롤러가 받고 이에 대한 처리를 서비스가 한다.
- 서비스가 처리를 하면 이에 대한 결과를 VO에 담는 데이터 역할하기 때문이다.
- 서비스가 맡은 역할의 특성상 결합도가 높아질 수 있어 객체지향적으로 설계하고 개발하도록 주의해야 한다고 생각한다.
객체 지향의 특성
- 세부 처리 내용과 흐름에 해당하는 프로세스와 주로 값을 담는 역할을 하는 데이터를 동일한 모듈에 위치시키는 방식.
- 훌륭한 객체지향 설계의 핵심은 캡슐화를 이용해 의존성을 적절히 관리함으로써 객체 사이의 결합도를 낮춘다.
두 방식의 차이를 만드는 책임의 이동(shift of Responsibility)
- 작업의 특성 객체에 의해 처리되도록 하는 것이 아닌 개별 객체로 책임을 적절히 분산하는 것을 의미한다.
- 특정 데이터에 대해 잘 아는 객체가 그 객체에 대한 처리를 담당하도록 해야하며 이를 정보 전문가 패턴(information expert pattern)이라 한다.
- 정보 전문가 패턴을 따를 경우 밀접하게 연관된 작업만 수행하고, 연관성 없는 작업을 다른 객체에게 위임하게 됨에 따라 응집도가 높아지면서 책임이 분명해진다.
- 각 객체의 책임이 분명해지면, 불필요한 의존성이 사라지게 되고 이는 곳 결합도를 낮추게 된다.
설계에 대하여
- 어떤 기능을 설계하는 방법은 한 가지 이상일 수 있다.
- 동일한 기능을 한 가지 이상의 방법으로 설계할 수 있기 때문에 결국 설계는 트레이드 오프의 산물이다.
- 좋은 설계는 기능을 온전히 수행할 수 있으면서 내일의 변경을 매끄럽게 수용할 수 있는 설계다.
현실 세계와 객체 지향의 세계
- "객체 지향의 세계는 현실 세계을 본떠 만든 것이다." 란 말은 거짓이다.
- 객체 지향의 세계는 현실 세계를 기반으로 새롭게 재 창조 된다.
- 객체 지향의 세계에서의 객체는 의인화되어 능동적이고 자율적으로 활동한다.
- 현실 세계에서 사물인 가방과 지갑, 영화 등 수 많은 사물들이 인간에 의해 사용되어지는 수동적인 존재이지만 객체 지향의 세계에서는 능동적이고 자율적으로 활동하고 스스로를 책임지는 존재가 될 수 있다.
- 지갑 이란 객체를 예를 들어보겠다.
- 현실 세계에서 지갑 객체는 사람에 의해 돈이나 카드 따위가 넣어지고 빼내어 진다.
- 객체 지향 세계에서 지갑 객체는 돈이나 카드 등을 스스로 관리하고 통제하며 사람 객체나 포스 객체의 요청에 대해 능동적으로 상황에 대응할 수 있다.
반응형
'Java' 카테고리의 다른 글
Objects 시리즈_3장.책임, 역할, 협력 (0) | 2020.04.22 |
---|---|
Objects 시리즈_2장.객체지향 프로그래밍 (0) | 2020.04.20 |
Objects 시리즈_0장.오리엔테이션 (0) | 2020.04.14 |
토비의 봄을 담은 제네릭 2편 람다와 인터섹션 (0) | 2020.03.26 |
토비의 봄을 담은 제네릭 1편 (0) | 2020.03.26 |