tanficial / object

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

object

Ch00 : 들어가며

패러다임

  • 특정 시대의 어느 성숙한 개발자 공동체에 의해 수용된 프로그래밍 방법과 문제해결 방법, 프로그래밍 스타일.
  • 어떤 패러다임을 사용하느냐에 따라 우리가 해결할 문제를 바라보는 방식과 프로그램ㅇ을 작성하는 방법이 달라짐.
  • 개발자 공동체가 동일한 프로그래밍 스타일과 모델을 공유할 수 있게 함으로써 불필요한 부분에 대한 의견 충돌 방지.
  • 하나의 패러다임이 적합하지 않은 상황에서도 다른 패러다임을 적용할 수 있는 시야를 기르고 지식을 갈고 닦아야 함.

Ch01 : 객체, 설계

모둘이 가져야하는 3가지 기능

| 모듈 : 크기와 상관 없이 클래스나 패키지, 라이브러리와 같이 프로그램을 구성하는 임의의 요소

  1. 제대로 동작할 것
  2. 변경이 용이할 것
  3. 코드의 이해가 쉬울 것

이해가 쉬운 코드

  • 이해 가능한 코드란, 그 동작이 우리의 예상에서 크게 벗어나지 않는 코드.
  • 하나의 클래스나 메서드에서 너무 많은 세부사항을 다루면, 코드를 작성하는 사람이나 코드를 읽고 이해해야 하는 사람 모두에게 부담을 준다.

변경에 용이한 코드

  • 어떤 객체가 변경될 때 그 객체에게 의존하는 다른 객체도 함께 변경 될 수 있다.
  • 의존성 : 의존성을 변경에 대한 영향을 암시한다. 의존성이라는 말 속에는 어떤 객체가 변경될 때 그 객체에게 의존하는 다른 객체도 함께 변경될 수 있다는 사실이 내포돼 있다.
  • 애플리케이션의 기능을 구현하는데 필요한 최소한의 의존성만 유지하고 불필요한 의존성을 제거.
  • 결합도 : 객체 사이의 의존성이 과한 경우를 결합도가 높다고 말한다.
  • 객체 사이의 결합도를 낮춰 변경이 용이한 설계를 만들어야 한다.

캡슐화

  • 개념적이나 물리적으로 객체 내부의 세부적이 사항을 감추는 것
  • 변경하기 쉬운 객체를 만드는 것이 목적
  • 캡슐화를 통해 내부로의 접근을 제한하면 객체와 객체 사이의 결합도를 맞출 수 있기 때문데 설계를 좀 더 쉽게 변경할 수 있게 된다.

인터페이스

  • 객체를 인터페이스와 구현으로 나누고 인터페이스만을 공개하는 것은 객체 사이의 결합도를 낮추고 변경하기 쉬운 코드를 작성하기 위해 따라야 하는 가장 기본적인 설계 원칙이다.

캡슐화와 응집도

  • 객체 내부의 상태를 캡슐화하고 객체 간에 오직 메시지를 통해서만 상호작용하도록 만드는 것이 핵심
  • 밀접하게 연관된 작업만을 수행하고 연관성 없는 작업은 다른 객체에게 위임하는 객체를 응집도가 높다고 말한다.
  • 객체의 응집도를 높이기 우해선는 객체 스스로 자신의 데이터를 책임져야 한다.
  • 외부의 간섭을 최대한 배제하고 메시지를 통해서만 협력하는 자율적인 객체들의 공동체를 만드는 것이 훌륭한 객체지향 설계

절차지향과 객체지향

  • 절차적 프로그래밍 : 프로세스와 데이터를 별도의 모듈에 위치시키는 방식, 프로세스가 필요한 모든 데이터에 의존해야 하기에 변경에 취약하다.
  • 객체지향 프로그래밍 : 프로세스와 데이터를 동일한 모듈 내부에 위치하도록 프로그래밍 하는 방식
  • 훌륭한 객체지향 설계의 핵심은 캡슐화를 이용해 의존성을 적절히 관리해 객체 사이의 결합도를 낮추는 것
  • 객체지향은 이해하기 쉽고, 객체 내부의 변경이 객체 외부에 파급되지 않도록 제어할 수 있기 때문에 변경하기 수월하다.

책임의 이동

  • 객체지향의 설계의 핵십은 적절한 객체에 적절한 책임을 할당하는 것.
  • 객체는 다른 객체와의 협력이라는 문맥 안에서 특정한 역할을 수행하는 데 필요한 적절한 책임을 수행해야 한다.
  • 어떤 데이터를 가지냐보다는 어떤 책임을 할당할 것인가에 초점을 맞춰야한다.

정리

  • 설계를 어렵게 만드는 것은 의존성이며, 이를 해결하기 위해서 불필요한 의존성을 제거해 객체 사이의 결합도를 낮추는 것이다.
  • 결합도를 낮추기 위해 객체를 캡슐화하여 객체의 자율성을 높이고 응집도 높은 객체들의 공동체를 설계해야 한다.
  • 불필요한 세부사항을 캡슐화하는 자율적인 객체들이 낮은 결합도와 높은 응집도를 가지고 협력하도록 최소한의 의존성만을 남기는 것이 훌륭한 객체지향 설계이다.

트레이드오프

  • 책임을 부여하다 보면 오히려 새로운 의존성이 추가되어 결합도가 높아지는 경우가 있다.
  • 이런 트레이드오프가 발생하면 어떤걸 우선시 할지 생각해 적절히 선택해야한다.
  • 어떤 기능을 설계하는 방법은 한가지 이상일 수 있고, 결국 설계는 트레이드 오프의 산물이다. 어떤 경우에도 모든 사람들을 만족시킬 수 있는 설계를 만들 수는 없다.

의인화

  • 현실에서는 수동적인 존재라고 하더라도 일단 객체지향의 세계에 들어오면 모든 것이 능동적이고 자율적인 존재로 바뀐다.
  • 능동적이고 자율적인 존재로 소프트웨어 객체를 설계하는 원칙을 가리켜 의인화라고 부른다.
  • 훌륭한 객체지향 설계란 소프트웨어를 구성하는 모든 객체들이 자율적으로 행동하는 설계이다.

설계란

  • 코드를 배치하는 것
  • 좋은 설계란 오늘 요구하는 기능을 온전히 수행하면서 내일의 변경을 매끄럽게 수용할 수 있는 설계
  • 변경에 대응하는 것이 중요한 이유는 요구사항이 항상 변경되기 때문.
  • 또한 코드를 변경할 때 버그가 추가될 가능성이 높기 때문.

객체지향 설계

  • 객체지향 프로그래밍은 의존성을 효율적으로 통제할 수 있는 다양한 방법을 제공해 요구사항 변경에 좀 더 수월하게 대응할 수 있는 가능성을 높여준다.
  • 변경 가능한 코드 = 이해하기 쉬운 코드
  • 객체사이에 메시지를 전송하기 위해서는 두 객체를 결합시켜야 하고, 이 결합이 의존성을 만든다.
  • 훌륭한 객체지향 설계란 협력하는 객체 사이의 의존성을 적절하게 관리하는 설계다.
  • 객체지향 설계란 객체들 사이의 의존성을 적절하게 조절함으로써 변경에 용이한 설계를 만드는 것

About


Languages

Language:Java 100.0%