객체는 자신의 가시성 범위(scope of visibility)
안에서 살아간다
if (price < 100) {
Cash extra = new Cash(5);
price.add(extra);
}
클래스는 객체의 **팩토리
**고, 객체를 생성한다.
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’로 끝난다면, 이 클래스의 인스턴스는 실제로는 객체가 아니라 어떤 데이터를 다루는 절차의 집합일 뿐이다
대표자(representative)
**지, 내부에 캡슐화된 데이터를 다루기 위한 절차의 집합이 아니다책에서 권장하는 방식에 따라 올바르게 클래스를 설계한다면, 많은 생성자와 적은 메서드를 가진다. 생성자 수가 메서드 수보다 더 많아지는 것이다