Chapter 6 - Objects and Data Structures

자료를 세세하게 공개하기보다는 추상적인 개념으로 표현해야 한다

자료 추상화


  • 구체적인 Point Class: 자료 그대로 공개 + 별다른 함수 제공 X

    public class Point {
      public double x;
      public double y;
    }
    
  • 추상적인 Point Class (접근방법을 강제하기): 추상화 뒤로 자료를 숨기고 자료를 다루는 함수만 공개
    public interface Point {
      double getX();
      double getY();
      void setCartesian(double x, double y);
      double getR();
      double getTheta();
      void setPola( double r, double theta);
    }
    
  • 구체적인 Vehicle Class:
    public interface Point {
      double getFuelTankCapacityInGallons();
      double getGallonsOfGasoline();
    }
    
  • 추상적인 Vehicle Class
    public interface Point {
      double getPercentFuelRemaining();
    }
    

자료/객체 비대칭


  • procedural (자료구조를 사용하는) : 기존 자료 구조 변경하지 않으면서 새 함수 추가하기 쉬움
  • OOP: 기존 함수를 변경하지 않으면서 새 클래스 추가하기 쉬움

  • procedural: 새로운 자료구조 추가하기 어려움, 모든 함수를 고쳐야 함
  • OOP: 새로운 함수 추가하기 어려움, 모든 클래스를 고쳐야 함

  • \(\Rightarrow\) tradeoff : OOP에서 어려운 변경은 procedural에서 쉽고 vice versa

디미터 법칙


모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다 - Law of Demeter (LoD)

  • aka The Principle of Least Knowledge

  • \(\rightarrow\) 객체는 자료를 숨기고 함수를 공개
  • 조회함수로 내부 구조 공개하면 안됨!

  • 기차충돌:
    final String outputDir = ctxt.getOption().getScratchDir().getAbsolutePath();
    
  • BETTER:
    Options opts = ctxt.getOptions();
    File scratchDir = opts.getScratchDir();
    String outputDir = scratchDir.getAbsolutePath();
    
    • 단 여기서 opts, scratchDir, outputDir 이 객체라면 디미터 법칙 위반
    • 자료구조라면 내부 구조 노출하므로 디미터 법칙 적용X
  • 잡종구조: 절반은 객체, 절반은 자료구조인 잡종 구조, 양쪽 세상에서 단점만 모아둔 구조
    • 공개변수, 공개함수, 주요 함수, getter, setter 모두 섞여 있음
    • 되도록 피하기
    • 새로운 함수는 물론 자구도 추가하기 어려움
  • 구조체 감추기:
    BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);
    
    • 임시파일 생성을 위해 dir path 얻음
    • \(\Rightarrow\) ctxt 객체가 최종 목적인 임시파일을 생성하도록 명령
    • ctxt: 내부구조 드러내지 않음, 몰라야 하는 내부 객체 탐색필요X

자료 전달 객체


  • DTO:
    • 공개변수만 있고 함수는 미존재
    • 데이터베이스와 통신하거나 소켓에서 받은 메시지의 구문을 분석할 때 유용
    • DB에서 저장된 (가공X) 정보를 Application 코드에서 사용할 객체로 변환하는 일련의 단계에서 가장 처음으로 사용되는 구조체
  • Bean 구조: (보다 일반적인 형태) 비공개 변수와 getter, setter가 있는 클래스

  • 활성 레코드: 공개, 비공개 변수, getter, setter, serach 함수

결론


객체자료구조
동작 공개, 자료 숨김별다른 동작 없이 자료를 노출
기존 동작 변경안하고 객체 타입 추가 쉬움기존 자구에 새 동작 추가 쉬움
기존 객체에 새 동작 추가 어려움기존 함수에 새 자료구조 추가 어려움
  • 새로운 자구 타입 추가 유연성 \(\rightarrow\) 객체
  • 새로운 동작 추가하는 유연성 \(\rightarrow\) 자구 + 절차적 코드