(클린코드) 6장. 객체와 자료 구조

Posted by Eun JongHyeok on January 26, 2025

오늘 TIL 3줄 요약

  • 객체는 동작을 지시해야 한다.
  • 자료 구조는 내부 구조를 공개한다.
  • .(dot)이 많이 보이면 디미터의 법칙을 한 번 생각해 보자.

TIL (Today I Learned) 날짜

  • 2025.01.26 - 2025.01.27

오늘 읽은 범위

  • 6장. 객체와 자료 구조

책에서 기억하고 싶은 내용을 써보세요.

객체 vs 자료 구조

  • 객체는 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개합니다.

  • 자료 구조는 자료를 그대로 공개하며 별다른 함수를 제공하지 않습니다.

  • get, set을 제공한다고 클래스가 되는게 아니라 추상화를 통해 구현을 감추고 자료의 핵심을 조작할 때 진정한 의미의 클래스를 구현할 수 있습니다.

절차 지향 vs 객체 지향

분별 있는 프로그래머는 모든 것이 객체라는 생각이 미신임을 잘 안다.

  • 절차 지향이 적합한 상황이 있고 객체 지향이 적합한 상황이 있습니다.

  • 절차 지향 코드는 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽고
    새로운 자료 구조를 추가하기 어렵습니다.

  • 객체 지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽고
    새로운 함수를 추가하기 어렵습니다.

디미터 법칙

  • 모듈은 자신이 조작하는 객체의 속사정을 몰라야 합니다.
1
2
3
4
5
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath(); 
  • 위 코드는 Options와 ScratchDir가 객체일 경우 디미터 법칙을 위반하게 됩니다.

ctxt가 객체라면 면가를 하라고 말해야지 속을 드러내라고 말하면 안 된다.

  • 실제로 무슨 용도로 사용하는지 알고 추상화해야 합니다.
  • 위 예제에서 임시 디렉터리의 절대 경로를 얻으려하는 이유는 임시 파일을 생성하기 위해서 입니다.
1
BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);
  • 위와 같이 함수를 만들면 ctxt는 내부 구조를 드러내지 않으면서 함수는 자신이 몰라야 하는 객체를 탐색할 필요가 없게 됩니다.

오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요

  • 디미터의 법칙에 대해 보통 .(dot)을 많이 붙이지 말라는 의미로 잘못 이해할 수 있지만
    이 책을 통해서 객체인지 자로구조인지 신경써야 한다는 걸 알 수 있었습니다.
    • 단순히 .(dot)을 나누는게 정답은 아니라는 사실과 자료 구조일 경우 문제가 없다는 점
    • 자료구조는 본질적으로 내부 구조를 노출하도록 설계되어 있기 때문에
  • 처음 디미터 법칙의 예제와 해결책을 봤을 때 createScratchFileStream 도 결국 내부에서 체이닝을 써야하지 않나? 라고 생각했엇는데 클래스 외부에 노춣이 되냐 안되냐가 중요하다는 것을 뒤늦게 깨달았습니다.😓

궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

  • DTO, 활성 레코드는 직접 사용해본 적이 없어서 “일단 자료 구조로 취급해야 한다” 이해하고 넘어갑니다..😭

오늘 읽은 다른사람의 TIL


nomadcoder
study
노마드코더
노개북
개발자북클럽

← Previous Post Next Post