출생

객체는 자신의 가시성 범위(scope of visibility) 안에서 살아간다

if (price < 100) {
  Cash extra = new Cash(5);
  price.add(extra);
}

-er로 끝나는 이름을 사용하지 마세요

클래스는 객체의 **팩토리**고, 객체를 생성한다.

new 연산자는 강력하지 않다. 너무 원시적이기 때문에 보다 유연하고 강력하게 만들 수 있다

class Shapes {
  public Shape make(String name) {
    if (name.equals("circle")) {
      return new Circle();
    }
    if (name.equals("rectangle")) {
      return new Rectangle();
    }
    throw new IllegalArgumentException("not found");
  }
}

개념상 팩토리 패턴과 new 연산자가 크게 다르지 않다

클래스란 필요할 때 객체를 꺼낼 수 있고, 더 이상 필요하지 않은 객체를 반환할 수 있는 창고다.

클래스의 이름은 **무엇을 하는지(what he does)**가 아니라 **무엇(what he is)**인지에 기반해야 한다. 즉, **역량(capability)**으로 특징지어져야 한다

클래스 이름이 ‘-er’로 끝난다면, 이 클래스의 인스턴스는 실제로는 객체가 아니라 어떤 데이터를 다루는 절차의 집합일 뿐이다

생성자 하나를 주 생성자로 만드세요

책에서 권장하는 방식에 따라 올바르게 클래스를 설계한다면, 많은 생성자와 적은 메서드를 가진다. 생성자 수가 메서드 수보다 더 많아지는 것이다