본문 바로가기

Book/Clean Code

[클린 코드] Assignment #08: TIL - 6장. 객체와 자료구조

728x90

 

📢 DAY 10
🏷️ 오늘 읽은 범위: 6장. 객체와 자료구조

🖊️ 짧은 내용 요약

  • 추상화하자
    클래스 안에 선언하는 변수는 외부에서 직접적으로 접근하지 못하도록 숨기는 게 좋다. 하지만 그렇다고 마냥 get, set 함수를 넣는다고 변수가 숨겨지는 것은 아니다. 이런 변수와 같은 자료를 숨기려면 추상화를 통해 사용자가 자료를 구체적으로 몰라도 자료를 조작할 수 있게 해야 한다. 그래서 메소드를 만들 때도 자료의 사용을 직접적으로 알 수 없는 추상적인 표현을 사용하거나 추상 인터페이스를 사용해 객체를 구현한다.

    객체 자료를 추상화로 숨긴 채 자료를 다루는 함수만 공개한 형태
    자료 구조 자료를 그대로 공개하면서 별다른 함수는 없는 구조(ex. DTO)
  • 상황에 맞게 사용하자
    객체 지향적인 코드와 절차 지향적인 코드는 상호 보완적인 특징이 있다. 그래서 무조건적으로 객체 지향 코드를 작성할 게 아니라 시스템을 만들다가 발생할 수 있는 상황에 맞게 코드를 작성하는 게 좋다. 객체 지향 코드는 새로운 자료 타입을 넣을 때 유연하고, 절차 지향 코드는 새로운 함수를 넣을 때 유연하다.
  • 내부적으로 일어나는 일은 모르게 하자
    '자신이 조작하는 객체의 속사정을 몰라야 한다.'는 디미터 법칙을 지켜서 만든다. 예를 들어, 객체 안에 있는 함수를 호출한 뒤, 반환값이 객체일 때 이 객체의 함수를 다시 호출하는 경우에는 처음 호출한 함수가 자신이 몰라도 되는 객체를 탐색하게 되어 디미터 법칙에 위배되므로 이런 식의 코드는 자제한다. 자료 구조의 형태일 때는 체인처럼 호출해도 상관 없지만, 그렇다고 헷갈려서 객체와 자료 구조의 형태를 혼용해서 만들면 안된다.

😀 책에서 기억하고 싶은 내용

시스템을 구현할 때, 새로운 자료 타입을 추가하는 유연성이 필요하다면 객체가 더 적합하다.
다른 경우로 새로운 동작을 추가하는 유연성이 필요하다면 자료 구조와 절차적인 코드가 더 적합하다.
우수한 소프트웨어 개발자는 편견없이 이 사실을 이해해 직면한 문제에 최적인 해결책을 선택한다. (p. 128)
더보기
변수를 private으로 선언하더라도 각 값마다 조회 함수와 설정 함수를 제공한다면 구현을 외부로 노출하는 셈이다. 변수 사이에 함수라는 계층을 넣는다고 구현이 저절로 감춰지지는 않는다. (p. 118 ~ 119)
자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋다. 인터페이스나 조회/설정 함수만으로는 추상화가 이뤄지지 않는다. 개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다. (p. 119)
다시 말해, 객체 지향 코드에서 어려운 변경은 절차 지향 코드에서 쉬우며, 절차 지향 코드에서 어려운 변경은 객체 지향 코드에서 쉽다! (p. 122)
시스템을 구현할 때, 새로운 자료 타입을 추가하는 유연성이 필요하다면 객체가 더 적합하다. 다른 경우로 새로운 동작을 추가하는 유연성이 필요하다면 자료 구조와 절차적인 코드가 더 적합하다. 우수한 소프트웨어 개발자는 편견없이 이 사실을 이해해 직면한 문제에 최적인 해결책을 선택한다. (p. 128)

🤔 오늘 읽은 소감 & 떠오르는 생각

클래스를 사용해서 코드를 많이 짜봤다고 생각해서 책의 내용이 쉽게 이해될 줄 알았는데, 생각보다 어려웠다. java는 써본지가 오래돼서 예제를 완전히 이해하기 어려웠다. 그래서 10쪽밖에 안되는 분량을 읽고 또 읽고, 다른 사람의 TIL도 열심히 읽으면서 조금 이해할 수 있었다...그리고 나서 알게 된 건데 처음에 책의 내용을 이해하기 어려웠던 이유는 책에서 설명하는 자료 구조와 객체 용어를 정확하게 이해하지 못했기 때문이었다. 이해하고 보니 내가 많이 짰던 클래스는 대부분 책에서 말하는 자료 구조였다는 였다는 사실을 알게 되었다. 그러면서 전에 프로젝트를 진행할 때 DTO에 변수를 추가로 넣었다가 DTO 내의 함수를 모두 고치느라 애먹었던 기억이 떠오르며 책의 내용이 공감이 되었다. flutter로 프로젝트를 할 때는 자료 구조 형태로 코드를 짜고, python으로 연구실에서 프로젝트 코드를 짤 때는 객체 형태로 코드를 짰던 것 같다...문제 해결에 맞는 방법을 선택해 코딩을 한 게 아니라 언어나 프레임워크에 종속되듯이 코딩을 한 것 같아서 반성했다.

🔍 새로 알았거나 잘 이해되지 않는 내용

  • Data Transfer Object
    애플리케이션 코드에서 계층 간 서로 데이터를 주고받기 위해 사용되는 객체
  • bean
    모든 객체 변수가 private한 접근 제한을 가지고 getter 와 setter 함수로 접근 가능하며, 파라미터가 없는 생성자가 존재하는 객체

📚 참고

반응형