본문 바로가기

Java76

[엘레강트 오브젝트] 2. 학습 - (4) 메서드 이름을 신중하게 선택하세요 빌더의 이름은 명사로, 조정자의 이름은 동사로 짓자 빌더는 항상 뭔가를 반환합니다 반환타입은 void가 될 수 없으며, 이름은 항상 명사여야 합니다 // Builder int pow(int base, int power); float speed(); Employee employee(int id); String parsedCell(int x, int y); // 형용사를 통해 명사를 꾸며주어 풍부한 정보를 제공 객체로 추상화한 실세계 엔티티를 수정하는 메서드를 조정자라고 부릅니다 조정자의 반환 타입은 항상 void이고, 이름은 항상 동사입니다 // 조정자(manipulator) void save(String content); void put(String key, Float value); void remove.. 2021. 9. 12.
[엘레강트 오브젝트] 2. 학습 - (3) 항상 인터페이스를 사용하세요 객체들은 서로 필요로 하기 때문에 결합됩니다 애플리케이션이 성장하기 시작하고 객체 수가 수십 개가 넘어가면서부터 객체 사이의 강한 결합도가 심각한 문제가 됩니다 결합도 문제는 유지보수성에 큰 영향을 미칩니다 애플리케이션 전체를 유지보수 가능하도록 만들기 위해서는 최선을 다해서 객체를 분리해야합니다 객체 분리란 상호작용하는 다른 객체를 수정하지 않고도 해당 객체를 수정할 수 있도록 만든다는 것을 의미합니다 바로 인터페이스를 이용하는 것입니다 interface Cash { Cash multiply(float factor); } Cash는 인터페이스 입니다 우리의 객체가 다른 객체와 소통하기 위해 따라야하는 계약입니다 class DefaultCash implements Cash { private int dol.. 2021. 9. 5.
[엘레강트 오브젝트] 2. 학습 - (2) 최소한 뭔가는 캡슐화하세요 너무 많이 캡슐화하는 방식도 좋지 않지만, 아무것도 캡슐화하지 않는 방식 또한 바람직하지 않습니다 class Year { int read() { return System.currentTimeMillis() / / (1000 * 60 * 60 * 24 * 30 * 12) - 1970; } } Year 클래스의 인스턴스는 어떤 것도 캡슐화하지 않기 때문에 이 클래스의 모든 객체들은 동일합니다 이렇게 아무것도 캡슐화하지 않는 방식은 바람직하지 않습니다 이처럼 프로퍼티가 없는 클래스는 객체지향 프로그로밍에서 악명 높은 정적 메서드와 유사합니다 아무런 상태, 식별자도 가지지 않고 오직 행동만을 포함합니다 인스턴스 생성과 실행을 엄격하게 분리하는 순수한 OOP에서는 기술적으로 프로퍼티가 없는 클래스를 만들 수 없습.. 2021. 9. 5.
[엘레강트 오브젝트] 2. 학습 - (1) 가능하면 적게 캡슐화하세요 모든 것은 유지보수성과 관련이 있습니다 복잡성이 높을수록 유지보수성이 저하되고, 시간과 돈이 낭비되며, 고객 만족도가 떨어집니다 따라서 4개 또는 그 이하의 객체를 캡슐화할 것을 권장합니다 내부에 캡슐화된 객체 전체를 가리켜 객체의 상태 또는 식별자라고 부릅니다 class Cash { private Integer digits; private Integer cents; private String currency; } Cash 클래스는 3개의 객체를 캡슐화하고 있습니다 이 3개의 객체들이 함께 모여 Cash 클래스 객체를 식별합니다 동일한 값의 달러, 센터, 통화를 가진 2개의 객체가 있다고 하면 두 객체는 서로 동일할까요? 아닙니다. Java 언어가 안고 있는 설계적 결함때문에 같지 않습니다 Java를 비.. 2021. 9. 4.
[엘레강트 오브젝트] 1. 출생 - (3) 생성자에 코드를 넣지 마세요 인자에 손대지 말자 class Cash { private int dollars; Cash(String dlr) { this.dollars = Integer.parsInt(dlr); } } 인자를 정수로 표현할 필요는 있지만, 생성자 내 객체 초기화에는 코드가 없어야 하고 인자를 건드려서는 안됩니다 대신, 필요하다면 인자들을 다른 타입의 객체로 감싸거나 가공하지 않은 형식으로 캡슐화해야 합니다 class Cash { private Number dollars; Cash(String dlr) { this.dollars = new StringAsInteger(dlr); } } class StringAsInteger implements Number { private String source; StringAsInt.. 2021. 9. 2.
[엘레강트 오브젝트] 1. 출생 - (2) 생성자 하나를 주 생성자로 만드세요 생성자는 새로운 객체에 대한 진입점입니다 몇 개의 인자를 전달받아, 어떤 일을 수행한 후, 임무를 수행할 수 있도록 객체를 준비시킵니다 class Cash { private int dollars; Cash(int dlr) { this.dollars = dlr; } } 현재 하나의 생성자가 있고, 인자로 dlr을 받아 private 변수 dollars 프로퍼티에 캡슐화합니다 이 책에서 권장하는 방식에 따라 올바르게 클래스를 설계한다면, 클래스는 많은 수의 생성자와 적은 수의 메서드를 포함할 것입니다 → 생성자의 수가 메서드의 수보다 더 많아집니다 사실 생성자의 개수가 더 많을수록 클래스는 더 개선되고, 사용자 입장에서 클래스를 더 편하게 사용할 수 있습니다 new Cash(30); new Cash(29.9.. 2021. 9. 2.
[엘레강트 오브젝트] 1. 출생 - (1) '-er'로 끝나는 이름을 사용하지 마세요 객체는 자신의 가시성 범위안에서 살아갑니다 if (price < 100) { Cash extra = new Cash(5); price.add(extra); } 스스로가 extra라면 price는 나를 둘러싸고 있는 주변 세계입니다 1.1 -er로 끝나는 이름을 사용하지 마세요 클래스는 객체의 팩토리입니다 클래스는 객체를 생성합니다 → 클래스가 객체를 인스턴스화한다라고 표현합니다 class Cash { public Cash(int dollars) { ... } } Cash five = new Cash(5) new는 객체의 팩토리를 제어할 수 있는 원시적인 수단입니다 널리 알려진 팩토리 패턴은 new 연산자를 대신해서 사용할 수 있는 더 강력한 옵션이기는 하지만, 개념적으로 팩토리 패턴과 new 연산자는 동.. 2021. 9. 1.