Skip to content

Latest commit

 

History

History
83 lines (65 loc) · 5.42 KB

Ch6.md

File metadata and controls

83 lines (65 loc) · 5.42 KB

Ch6. 객체와 자료 구조(Objects and Data Structures)

생각 공유

@ChanhuiSeok

  • 자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋다.
  • 분별 있는 프로그래머는 모든 것이 객체라는 생각이 미신임을 잘 안다. 때로는 단순한 자료구조와 절차적인 코드가 가장 적합한 상황도 있다.
  • 디미터 법칙 : 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다. 객체는 자료를 숨기고 함수를 공개한다. 즉 객체는 조회 함수로 내부 구조를 공개하면 안 된다는 의미이다. 낯선 사람은 경계하고 친구하고만 놀아라. (어떤 클래스 혹은 메서드에 관련되지 않은 객체를 사용하지 말자.)
    • 객체라면 내부 구조를 감춰야 한다. 뭔가를 하라고 말해야지 속을 드러내라고 말하면 안 된다. ✏ 책에서 나오는 절대 경로 예제가 좋은 것 같다. 절대 경로를 구하는 목적이 임시 파일을 생성하기 위한 목적이었으니, 임시 파일을 만들어라 라고 하는 메서드를 정의해 두고 그 안에서 절대 경로를 만드는 것이 더 좋겠다.
  • 결론
    • 객체는 동작을 공개하고, 자료를 숨긴다. 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기는 쉽지만, 기존 객체에 새 동작(함수)을 추가하기는 어렵다. (책의 목록 6-6에 나오는 코드 예시를 보면 된다.)
    • 자료 구조는 별다른 동작 없이 자료를 노출한다. 기존 자료 구조에 새 동작을 추가하기는 쉬우나, 기존 함수에 새 자료 구조를 추가하기는 어렵다. (책의 목록 6-5 코드)
  • 개인적으로 이번엔 6장이 한번에 이해하기 어려웠다. 나중에 한번 더 읽어봐야 겠다.

@jjangsungwon

객체 지향 코드에서 어려운 변경은 절차적인 코드에서 쉬우며, 절차적인 코드에서 어려운 변경은 객체 지향 코드에서 쉽다. 상황에 따라 각각의 장단점이 분명히 드러난다. 우수한 소프트웨어 개발자는 편견 없이 이 사실을 이해해 직면한 문제에 최적인 해결책을 선택한다고한다. 이 사실을 이해하는 것은 어렵지 않았다. 하지만, 직면한 문제에서 최적인 해결책을 선택하는 것은 쉬울까?

객체

  • 동작을 공개하고 자료를 숨긴다.
  • 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개한다.
  • 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다. (=기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기 쉽다)
  • 새로운 함수를 추가하기 어렵다. 그러려면 모든 클래스를 고쳐야 한다. (=기존 객체에 새 동작을 추가하기는 어렵다)

자료 구조

  • 별다른 동작 없이 자료를 노출한다.
  • 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다.
  • 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다.
  • 새로운 자료 구조를 추가하기 어렵다. 그러려면 모든 함수를 고쳐야 한다.

기차 충돌(train wreck)

(1)
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

(2)
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();
  • (2) 코드를 통해 (1) 코드를 어느 정도 유추할 수 있다고 생각함.
  • 각각의 함수 반환 타입이 Options, File, String 이 아니라 모두 동일한 String 이였다면 저렇게 분리할 필요가 있었을까? 분리해서 얻는 이득이 무엇일까?

@qrlagusdn

  • 구현을 감추기 위해서는 추상화가 필요함
    • 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 함

객체

  • 클라이언트가 내부 구현을 모른채로 사용할 수 있어야 진정한 의미의 객체이다.
  • 동작을 공개하고 자료를 숨긴다
  • 기존 동작을 변경하지 않으면서 새 객체 타임을 추가하기는 쉬움
  • 하지만 기존 객체에 새 동작을 추가하기는 어렵다

자료구조

  • 별다른 동작없이 자료를 노출함
  • 기존 자료 구조에 새 동작을 추가하기는 쉬움
  • 하지만 기존 함수에 새 자료 구조를 추가하기는 어려움 → 새로운 자료 타입을 추가하는 유연성이 필요한 시스템일 경우 객체가 더 적합 → 새로운 동작을 추가하는 유연성이 필요하면 자료구조와 절차적인 코드가 더 적합 객체와 자료구조는 근본적으로 양분된다. 객체 지향 코드에서 어려운 변경은 절차적인 코드에서 쉽고, 절차적인 코드에서 어려운 변경은 객체 지향코드에서 쉽다.

DTO (Data Transfer Object)

자료 전달 객체 자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는 클래스다. DB와 통신하거나 소켓에서 받은 메시지의 구문을 분석할 때 유용

Train Wreck

String a = b.c().d().e().f() 다른 객체의 구현에 대해 많이 알게 되면 미래의 변경을 어렵게 한다.

디미터의 법칙

  • 사용하는 객체의 내부 구현을 몰라야 한다.
  • 자료와 구현은 숨기고, 함수를 노출해야한다
  • 다른 객체의 함수가 반환한 객체의 함수를 호출해서는 안된다.