Skip to main content

김시용

1. 📌 핵심 개념 정리

✅ 요약하기

  1. 자료 추상화
    추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 의미의 클래스다. (인터페이스나 조회/설정 함수만으로는 추상화가 이뤄지지 않는다)

  1. 자료/객체 비대칭
    객체는 동작을 공개하고 자료를 숨긴다. 그래서 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기 쉽다. 반면, 기존 객체에 새 동작을 추가하기는 어렵다.
    자료 구조는 별다른 동작 없이 자료를 노출한다. 그래서 기존 자료 구조에 새 동작을 추가하기는 쉬우나, 기존 함수에 새 자료 구조를 추가하기는 어렵다.
    보통 모든 것을 객체로 바라보지만, 때로는 단순한 자료 구조가 적합한 상황도 있다.

  1. 디미터 법칙
    자신이 조작하는 객체의 내부를 몰라야 한다는 법칙이다.
    객체는 자료를 숨기고 함수를 공개한다. (조회 함수로 내부 구조 공개하면 안된다)
    기차 충돌 : 함수의 반환형이 호출하는 함수를 바로 호출하는 경우
     final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
    
    자료 구조는 무조건 함수 없이 공개 변수만 포함하고 객체는 비공개 변수와 공개 함수를 포함한다면 디미터 법칙 어기지 않는다.
    위의 기차 충돌 예시에서 반환하는 값이 필요한 이유가 무엇인가? 해당 이유에 맞는 동작(임시 파일 생성)을 구현하여 자료 구조의 내부를 감춘다.
      BufferedOuputStream bos = ctxt.createScratchFileStream(classFileNmae);
    

  1. 자료 전달 객체
    DTO (Data Transfet Object)로 DB에 저장된 가공되지 않은 정보를 Application code에서 사용할 객체로 변환하는 처음 단계에서 사용하는 구조체다.
     public class Address {
      private String street;
      private String streetExtra;
      private String city;
      private String state;
      private String zip;
    
      public Adress(String street, String streetExtra, String city, String state, String zip) {
         this.street = street;
         this.streetExtra = streetExtra;
         this.city = city;
         this.state = state;
         this.zip = zip;
      }
    
      // 각 변수 반환하는 get 함수들...
    }
    
    • 활성 레코드로 구현 가능 공개 변수가 있거나, 비공개 변수에 조회/설정 함수가 있는 자료 구조지만, 대개 save, find 같은 탐색 함수도 제공한다.
      레코드는 자료 구조로 취급한다. 비지니스 규칙 메서드를 레코드에 구현하지 마라.

2. 🤔 이해가 어려운 부분

🔍 질문하기

  1. 디미터 법칙
    • 어려웠던 부분
      예시가 없어서 이해가 어렵다.

    • 궁금한 점 디미터 법칙을 어긴 예시 코드와 그것을 개선한 코드 살펴보기

    • 디미터 법칙을 어긴 예시 코드

      class Address {
        constructor(city) {
          this.city = city;
        }
    
        getCity() {
          return this.city;
        }
      }
    
      class Person {
        constructor(name, address) {
          this.name = name;
          this.address = address;
        }
    
        getAddress() {
          return this.address;
        }
      }
    
      class Company {
        constructor(name, owner) {
          this.name = name;
          this.owner = owner;
        }
    
        getOwner() {
          return this.owner;
        }
      }
    
      // 사용 예시
      const address = new Address("Seoul");
      const person = new Person("John", address);
      const company = new Company("TechCorp", person);
    
      // 기차 충돌 문제점 발생
      console.log(company.getOwner().getAddress().getCity());  // Seoul 출력
    
    • 개선한 예시 코드
      class Address {
        constructor(city) {
          this.city = city;
        }
    
        getCity() {
          return this.city;
        }
      }
    
      class Person {
        constructor(name, address) {
          this.name = name;
          this.address = address;
        }
    
        getCity() {
          return this.address.getCity(); // 중간 단계 숨기기
        }
      }
    
      class Company {
        constructor(name, owner) {
          this.name = name;
          this.owner = owner;
        }
    
        getOwnerCity() {
          return this.owner.getCity(); // 중간 객체와 직접 상호작용 X
        }
      }
    
      // 사용 예시
      const address = new Address("Seoul");
      const person = new Person("John", address);
      const company = new Company("TechCorp", person);
    
      // 기차 충돌 문제 해결
      console.log(company.getOwnerCity()); // "Seoul" 출력
    
    

3. 📚 참고 사항

📢 논의하기

관련된 자료가 있다면 공유하고, 더 깊이 논의하고 싶은 아이디어나 의견을 정리합니다.

  1. 논의하고 싶은 주제
    • 주제
      객체 지향 vs 절차 치향
    • 설명
      보통 객체 지향으로 모두 개발하지만, 책에서는 절차 지향이 적합한 상황도 있다하는데 어느 상황에서 절차 지향이 적합한가?

  • 절차 지향적인 코드가 적합한 경우
    1. 단순한 데이터 처리

    객체 간의 복잡한 상호작용이 필요하지 않은 경우

    1. 일회성 스크립트

    데이터를 가져와서 가공하고 저장하는 간단한 작업

    1. 성능이 중요한 경우

    불필요한 객체 생성을 줄이고, 순차적인 처리가 유리한 경우

    1. 기능 중심의 코드

    데이터보다는 로직이 중심이 되는 경우