본문 바로가기

프로그래밍&IT/학습, 책

[클린 코드] 4. 객체와 자료구조

Ch6. 객체와 자료구조

변수를 private (비공개)로 정의하는 이유? 남들이 변수에 의존하지 않게 만들고 싶어서.

하지만 왜 get / set 함수를 당연히 공개 (public)해서 외부에 노출할까?

 

자료추상화

  • 자료를 세세히 공개하기보단 추상적인 개념으로 표현하는 편이 좋다.
  • 인터페이스, get/set 함수만으로 추상화가 이뤄지지 않는다.
  • 자료/객체 비대칭
  • 변수사이에 함수라는 계층을 넣는다고 구현이 저절로 감춰지지 않으며 구현을 감추려면 추상화가 필요하다
  • 추상인터페이스를 제공해 사용자가 구현을 모른채 자료 핵심을 조작할 수 있어야 진정한 의미의 클래스
  • 아무 생각없이 get/set 추가는 나쁘다
// 구체적인 Vehicle 클래스
public interface Vehicle {
	double GetFuelTankCapacityInGallons();
    double GetGallonsOfGasoline();
}

// 추상적인 Vehicle {
	double GetPercentFuelRemaining();
}

 

자료/객체 비대칭

  • 객체와 자료구조는 근본적으로 양분된다
  • (자료구조 사용하는) 절차적인 코드는 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다. 반면 객체지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가 하기 쉽다
  • 객체지향 코드에서 어려운 변경은 절차적인 코드에서 쉬우며 절차적인 코드에서 어려운 변경은 객체지향 코드에선 쉽다
  • 새로운 자료타입이 필요하면 클래스, 객체지향 기법이 적합하며 새루운 함수가 필요하면 절차적인 코드, 자료구조가 좀 더 적합
  • 자료구조 방식과 객체지향 간의 잡종 사용은 안된다.

디미터법칙?

객체 지향 프로그래밍에서 코드의 결합도를 낮추기 위해 고안된 설계 원칙 중 하나. 이 법칙은 객체가 다른 객체와 어떻게 상호작용해야 하는지를 규정하며, "친구와만 대화하고, 친구의 친구와는 대화하지 않는다"는 간단한 원칙으로 요약할수있다.

* 핵심 개념

  1. 객체 간 결합도 최소화
    객체는 자신이 직접 참조하는 객체(친구)와만 상호작용해야 하며, 그 객체가 참조하는 객체(친구의 친구)와는 상호작용하지 않아야 합니다.
  2. 캡슐화 강화
    내부 구현을 외부에 노출시키지 않도록 하여 코드 유지보수성과 재사용성을 높입니다.
  3. 직접적인 접근 권장
    객체는 다음 네 가지와만 상호작용해야 합니다.
    • 자기 자신
    • 메서드의 매개변수로 전달된 객체
    • 메서드에서 생성된 객체
    • 클래스의 속성으로 직접 참조하는 객체
// 위반코드
public class Person {
    private Address address;

    public Address getAddress() {
        return address;
    }
}

public class Address {
    private String city;

    public String getCity() {
        return city;
    }
}

Person person = new Person();
String city = person.getAddress().getCity(); // 친구의 친구에 직접 접근

// 준수 사례
public class Person {
    private Address address;

    public String getCity() {
        return address.getCity(); // 캡슐화
    }
}

Person person = new Person();
String city = person.getCity(); // Person과만 상호작용

 

결론

객체는 동작을 공개하고 자료를 숨긴다. 기존 동작을 변경하지 않으면서 새 객체 타입 추가가 쉬우나 기존 객체에 새 동작을 추가하기는 어렵다.

자료구조는 별다른 동작없이 자료를 노출한다. 동작 추가는 쉬우나 기존 함수에 새 자료구조를 추가하기는 어렵다