본문 바로가기
Java

Objects 시리즈_1장.객체, 설계

by Jordy-torvalds 2020. 4. 14.
반응형

오브젝트의 1장인 객체, 설계를 간단히 정리해보았다. 

객체, 설계

패러다임

정의

  • 모델, 패턴, 또는 전형적인 예를 의미
  • 한 시대의 사회 전체가 공유하는 이론이나 방법, 문제의식 등의 체계
  • 과거의 패러다임이 새로운 패러다임에 의해 대체됨으로써 정상 과학의 방향과 성격이 변하는 것을 패러다임 전환이라 함.
    • 예) 우주를 바라보는 패러다임이 천동설에서 지동설로 변화

.

특성

  • 패러다임과 패러다임을 채용하는 언어는 특정한 종류의 문제를 해결하는데 필요한 일련의 개념들을 지원한다.
  • 두 개의 패러다임은 하나의 언어에 함께 존재할 수 있으며, 함께 공존함으로써 서로의 장단점을 보완할 수 있다. 이러한 언어를 다중패러다임 언어라고 한다.
    • 절차 + 객체 = C++
    • 함수 + 객체 = Scala

.

결론

  • 은총알은 없으며, 객체지향이 적합하지 않을 때는 언제라도 다른 패러다임을 적용할 수 있는 시야를 길러야 한다.

모듈

정의

  • 크기와 상관없이 클래스나 패키지, 라이브러리와 같이 프로그램을 구성하는 임의의 요소를 의미한다.

필수 조건

  • 제대로 실행되야 한다.
  • 변경에 용이해야 한다.
  • 이해하기 쉬워야 한다.

의존성(dependency)

정의

  • 특정 객체가 다른 객체의 내부에 대해 아는 정도.
  • 안다는 것은 특정 객체의 코드가 다른 객체의 변수 및 메소드를 사용하고 있다는 것을 말한다.
  • 특정 객체가 다른 객체의 내부를 많이 알 수록 변경이 발생했을 때 함께 변경 변경되는 코드가 많아 진다.

오해와 진실

  • 오해. 객체의 의존성을 완전히 없애는 것은 좋다!
  • 진실. 객체 지향 설계는 서로 의존하면서 협력하는 객체들의 공동체를 구축하는 것이다. 그래서 애플리케이션의 기능을 구현하는 데 필요한 최소한의 의존성만 유지하고 불필요한 의존성을 제거 해야 한다.

의존성과 결합도(coupling)의 연관성

  • 의존성이 과한 경우를 결합도가 높다고 한다.
  • 객체들이 합리적인 수준수에서 의존할 경우에는 결합도가 낮다고 한다.

캡슐화(encapsulation)

정의

개념적이나 물리적으로 객체 내부의 세부적인 사항을 감추는 것.

목적

  • 변경하기 쉬운 객체를 만드는 것.
  • 객체 내부로의 접근을 제한하면 객체와 객체 사이의 결합도를 낮출 수 있기 때문에 설계를 좀 더 쉽게 변경할 수 있게 된다.
  • 접근 지정자로 접근 가능한 변수와 메소드를 제한 함으로써 한정된 인터페이스 (interface)를 제공하고 세부적인 내부 로직인 구현 (implementation)은 숨김으로써 캡슐화 한다.

응집도(cohension)

정의

  • 밀접하게 연관된 작업만을 수행하고 연관성 없는 작업을 다른 객체에게 위임하는 정도.
  • 자신의 데이터를 스스로 처리하는 자율적인 객체를 만들면 결합도를 낮출 수 있을뿐더러 응집도를 높일 수 있다.

절차 지향과 구별되는 객체 지향의 특성

절차 지향의 특성

  • 세부 처리 내용과 흐름에 해당하는 프로세스와 주로 값을 담는 역할을 하는 데이터를 별도의 모듈에 위치시키는 방식을 절차적 프로그래밍(Procedural Programming)이라 한다.
    • 개인적인 생각으로는 Spring Framework에서 Service가 프로세스에 해당하고 VO가 데이터라고 생각한다.
    • 일반적으로 프론트엔드로부터 넘어온 세부 요청 사항을 컨트롤러가 받고 이에 대한 처리를 서비스가 한다.
    • 서비스가 처리를 하면 이에 대한 결과를 VO에 담는 데이터 역할하기 때문이다.
    • 서비스가 맡은 역할의 특성상 결합도가 높아질 수 있어 객체지향적으로 설계하고 개발하도록 주의해야 한다고 생각한다.

객체 지향의 특성

  • 세부 처리 내용과 흐름에 해당하는 프로세스와 주로 값을 담는 역할을 하는 데이터를 동일한 모듈에 위치시키는 방식.
  • 훌륭한 객체지향 설계의 핵심은 캡슐화를 이용해 의존성을 적절히 관리함으로써 객체 사이의 결합도를 낮춘다.

두 방식의 차이를 만드는 책임의 이동(shift of Responsibility)

  • 작업의 특성 객체에 의해 처리되도록 하는 것이 아닌 개별 객체로 책임을 적절히 분산하는 것을 의미한다.
  • 특정 데이터에 대해 잘 아는 객체가 그 객체에 대한 처리를 담당하도록 해야하며 이를 정보 전문가 패턴(information expert pattern)이라 한다.
    • 정보 전문가 패턴을 따를 경우 밀접하게 연관된 작업만 수행하고, 연관성 없는 작업을 다른 객체에게 위임하게 됨에 따라 응집도가 높아지면서 책임이 분명해진다.
    • 각 객체의 책임이 분명해지면, 불필요한 의존성이 사라지게 되고 이는 곳 결합도를 낮추게 된다.

설계에 대하여

  1. 어떤 기능을 설계하는 방법은 한 가지 이상일 수 있다.
  2. 동일한 기능을 한 가지 이상의 방법으로 설계할 수 있기 때문에 결국 설계는 트레이드 오프의 산물이다.
  3. 좋은 설계는 기능을 온전히 수행할 수 있으면서 내일의 변경을 매끄럽게 수용할 수 있는 설계다.

현실 세계와 객체 지향의 세계

  • "객체 지향의 세계는 현실 세계을 본떠 만든 것이다." 란 말은 거짓이다.
  • 객체 지향의 세계는 현실 세계를 기반으로 새롭게 재 창조 된다.
  • 객체 지향의 세계에서의 객체는 의인화되어 능동적이고 자율적으로 활동한다.
  • 현실 세계에서 사물인 가방과 지갑, 영화 등 수 많은 사물들이 인간에 의해 사용되어지는 수동적인 존재이지만 객체 지향의 세계에서는 능동적이고 자율적으로 활동하고 스스로를 책임지는 존재가 될 수 있다.
  • 지갑 이란 객체를 예를 들어보겠다.
    • 현실 세계에서 지갑 객체는 사람에 의해 돈이나 카드 따위가 넣어지고 빼내어 진다.
    • 객체 지향 세계에서 지갑 객체는 돈이나 카드 등을 스스로 관리하고 통제하며 사람 객체나 포스 객체의 요청에 대해 능동적으로 상황에 대응할 수 있다.
반응형