본문 바로가기
WEB/Clean Code

[Clean Code] 6장. 객체와 자료구조

by IT황구 2022. 2. 21.
728x90
반응형

6장. 객체와 자료구조

Clean Code 6장 (객체와 자료구조)

변수를 비공개로 정의하는 이유는 뭘까?

  • 남들이 변수에 의존하지 않게 만들기 위함이다. 충동이든 변덕이든, 변수타입이나 구현을 맘대로 바꾸고 싶어서다.
  • 그러면 왜 getter,setter 함수를 public으로 만들어서 비공개 변수를 외부에 노출할까?
  • 진정한 의미의 클래스추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 한다.
// 구체적인 Vehicle 클래스
public interface Vehicle {
  double getFuelTankCapacity();
  double getGallonsOfGasoline();
}
// 추상적인 Vehicle 클래스 (더 좋다)
public interface Vehicle {
  double getPercentFuelRemaining();
}
  • 자료를 세세히 공개하기 보다는 추상적인 개념으로 표현하는게 좋다.
  • 인터페이스의 단순 조회,설정 함수만으로는 추상화가 이루어지지 않는다.

절차지향 코드 vs 객체지향 코드

// 절차지향
// 각 도형들을 각각 클래스로 만들고, 도형이 동작하는 방식은 Geometry class에서 구현한다
public class Square{
  public Point topLeft;
  public double side;
}

public class Rectangle{
  public Point topLeft;
  public double height;
  public double width;
}

public class Geometry{
  public final double PI = 3.141592;

  public double area(Object shape) throws NoSuchShapeException
  {
    if(shape~~)

  }
}
// 객체 지향
// shape로 부터 상속받고, 각 도형에 맞는 넓이구하는걸 도형 클래스에서 구현
public class Square implements Shape{
  private Point topLeft;
  private double side;

  public double area(){
    return side*side
  }
}

public class Rectangle implements Shape{
  private Point topLeft;
  private double height;
  private double width;

  public double area(){
    return height * width;
  }
}

두개의 차이점은?

  • 장점
    • 절자지향적 코드는 기존 자료구조를 변경하지 않으면서 새 함수를 추가하기 쉽다. (Geometry에 추가)
    • 객체지향적 코드는 기본 함수를 변경하지 않으면서 새 클래스를 추가하기가 쉽다.
  • 단점
    • 절차지향적 코드는 새로운 자료구조를 추가하기 어렵다. 그러려면 모든 함수를 고쳐야한다.
    • 객체지향적인 코드는 새로운 함수를 추가하기 어렵다. 모든 클래스를 고쳐야한다.
  • 디미터 법칙
    • 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙
    • 객체는 자료를 숨기고 함수를 공개한다.
    • 즉 객체는 조회함수로 내부 구조를 공개하면 안된다.
클래스 C의 메서드f는 다음과 같은 객체의 메서드만 호출해야 한다.

1. 클래스 C
2. f가 생성한 객체
3. f의 인수로 넘어온 객체
4. C의 인스턴스 변수에 저장된 객체

잡종 구조

  • 절차 지향, 객체 지향을 둘다 섞으면 어떨까?
  • 오히려 새로운 함수, 자료구조 둘 다 추가하기 어려운 문제가 생긴다. 더 안좋다!

자료 전달 객체 (DTO) 생략..

  • DB와 통신할때나 소켓에서 받은 메시지의 구문을 분석할때 유용. get,set은 그냥 사이비 캡슐화로 별다른 이익을 제공하진 않음.
public class Addrdess{
  private String street;
  private String streetExtra;

  public Address(String street, String streetExtra)
  {
    this.street = street;
    ~~
  }

  public String getStreet(){
    return ~
  }

}

결론

  • 객체는 동작은 공개하면서, 내부구조를 숨겨야 한다.
    • 기존 동작을 변경하지 않고 새 객체타입 추가는 쉽지만, 기존 객체에 새 동작을 추가하기는 어렵다.
  • 자료구조(절차 지향)는 내부구조를 노출해야 한다.
    • 기존 자료구조에 새 동작을 추가하긴 쉽지만, 새 자료구조 추가는 어렵다.

여기서 우리 프로젝트에 적용할점은?

  • 음.. 객체는 자료를 숨긴다. 자료구조는 내부 구조를 공개한다의 차이를 배웠다.
  • 적용할점은 잘 모르겠다 아직은..
728x90
반응형

'WEB > Clean Code' 카테고리의 다른 글

[Clean Code] 8장. 경계  (0) 2022.02.22
[Clean Code] 7장. 오류처리  (0) 2022.02.21
[Clean Code] 5장. 형식 맞추기  (0) 2022.02.20
[Clean Code] 4장. 주석  (0) 2022.01.23
[Clean Code] 3장. 함수  (0) 2022.01.22