일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 자바할래
- System.out
- raw 타입
- 항해99
- 제네릭 와일드 카드
- throwable
- annotation processor
- docker
- 프리미티브 타입
- 로컬 클래스
- github api
- System.err
- 상속
- 정렬
- 브릿지 메소드
- 접근지시자
- Study Halle
- 합병 정렬
- auto.create.topics.enable
- 스파르타코딩클럽
- 함수형 인터페이스
- Switch Expressions
- 자바스터디
- 바운디드 타입
- System.in
- 제네릭 타입
- junit 5
- yield
- 익명 클래스
- 람다식
- Today
- Total
목록Book (37)
코딩하는 털보
소프트웨어 설계 품질을 높여주는 설계 규칙 4가지 모든 테스트를 실행한다. 테스트를 철저히 거쳐 모든 테스트 케이스를 항상 통과하는 시스템은 '테스트가 가능한 시스템'이다. 테스트가 가능한 시스템을 만들려고 애쓰다보면 설계 품질이 좋아진다. SRP를 준수하는 클래스는 테스트가 훨씬 더 쉽다. 결합도가 높으면 테스트 케이스를 작성하기 어렵다. 그래서 테스트를 많이 작성할수록 DIP원칙을 적용하고 의존성 주입, 인터페이스, 추상화 등으로 결합도를 낮춘다. 중복을 없앤다. 소규모 재사용, TEMPLATE METHOD 패턴 등 중복을 제거할 수 있는 기법을 익혀야 한다. 템플릿 메서드 패턴, https://rockintuna.tistory.com/187 프로그래머 의도를 표현한다. 유지보수 비용을..
이펙티브 자바, 아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하는 것음 어렵다. 예를 들면 자바 8 Collection 인터페이스에 추가된 디폴트 메서드는 여러 서드파티 컬렉션 구현체에서 재정의 되지 않은 경우가 많기 때문에 동기화를 하지 못하는 등 여러 문제가 발생한다. 디폴트 메서드는 기존 구현체이 런타임 오류를 일으킬 수 있다. 디폴트 메서드를 추가하면 기존 구현체에 영향을 줄 수 있다. 기존 인터페이스에 새로운 디폴트 메서드를 추가하는 일은 꼭 필요한 경우가 아니라면 피해야한다. 핵심은 디폴트 메서드라는 도구가 있지만 인터페이스를 설계할 때는 여전히 세심한 주의를 기울여야 한다는 것. 새로운 인터페이스라면 릴리스 ..
이펙티브 자바, 아이템 20. 추상 클래스보다는 인터페이스를 우선하라 인터페이스를 우선해야 하는 이유 추상 클래스를 구현하려면 추상 클래스를 상속해야 한다. 자바는 단일 상속만 지원하므로 이 방식은 새로운 타입을 정의하는 데 커다란 제약을 안게 된다. 인터페이스는 기존 클래스에서 손쉽게 구현해넣을 수 있다. 인터페이스는 믹스인(mixin) 정의에 안성맞춤이다. mixin : 클래스가 구현할 수 있는 타입, 믹스인을 구현한 클래스에 원래의 '주된 타입'외에 특정 선택적 행위를 제공한다고 선언하는 효과를 준다. (ex Comparable, Serializable, ...) 추상 클래스는 위에 나온 제약 때문에 믹스인을 정의할 수 없다. 인터페이스로는 계층구조가 없는 타입 프레임워크를 만들 수 ..
이펙티브 자바, 아이템 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 상속을 고려한 설계와 문서화가 뜻하는 것. 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다. 상속용 클래스의 메서드에서 자신의 다른 메서드를 호출할 수도 있는데(자기사용) 호출되는 메서드가 재정의될 수 있다면 클래스를 상속하여 메서드를 재정의할 때 문제가 발생할 수 있다. 때문에 자기사용에 대한 내용을 API 설명에 적시해야 한다. 백그라운드 스레드나 정적 초기화 과정에서도 메서드가 호출되어 자기사용이 발생할 수 있다. @implSpec 어노테이션은 자바독 도구가 API문서에 Implementation Requirements로 시작하는 메서드 내부 동작 방식 설명..
이펙티브 자바, 아이템 18. 상속보다는 컴포지션을 사용하라 동일한 패키지 안에서의 상속이나 확장할 목적으로 설계되었고 문서화도 잘 된 클래스의 상속은 안전하다. 그러나 일반적인 콘크리트 클래스를 패키지 경계를 넘어서 다른 패키지의 콘크리트 클래스를 상속하는 일은 위험하다. 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. 다르게 말하면, 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다. 특히 상위 클래스의 메서드를 재정의해서 사용했을 때 문제가 발생하기 쉽다. 또는 하위 클래스에서 새로운 메서드를 만들때도 상위 클래스의 변경으로 인한 영향이 없다고 할 수는 없다. 상속 대신 컴포지션을 사용하자. 기존 클래스를 확장하는 대신 새로운 클래스에서 private 필드로 기존 클래..
이펙티브 자바, 아이템 17. 변경 가능성을 최소화하라 불변 객체는 단순하다. 생성된 시점의 상태를 파괴될 때까지 그대로 간직한다. 불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉽고 오류가 생길 여지가 적어 안전하다. 클래스는 꼭 필요한 경우가 아니라면 불변이어야 한다. 불변으로 만들 수 없는 클래스라도 변경할 수 있는 부분을 최소화하자. 불변 클래스 만들기 규칙 setter를 제공하지 않는다. getter가 있다고 해서 무조건 setter를 만들지는 말자. 클래스를 확장할 수 없게 막는다. 가장 쉬운 방법은 final 클래스로 만들기. 또는 모든 생성자를 private 또는 package-private으로 만들고 정적 팩토리를 제공하기. 모든 필드를 final로 선언한다. 모든 필드를 pr..
디자인 패턴 4. 팩토리 패턴 디자인원칙, 추상화된 것에 의존하도록 만들어라. 구상 클래스에 의존하도록 만들지 않도록 한다. (Dependency Inversion Principle) 위 원칙은 고수준 구성요소가 저수준 구성요소에 의존하면 안 된다는 것이 내포되어 있다. 예를 들면 처음에 예로 나왔던 PizzaStore는 고수준 구성요소이며 여러가지 저수준 구성요소인 Pizza 클래스들에 의존하고 있다. public class PizzaStore { Pizza orderPizza(String type) { Pizza pizza; if (type.equals("cheese")) { pizza = new CheesePizza(); } else if ( type.equals("pepperoni")) { piz..
디자인 패턴 4. 팩토리 패턴 이번 장의 예시는 PizzaStore였다. 여러 종류의 피자 중에서 한 가지 타입의 피자 객체를 생성하고 가공하여 반환하는 메서드 orderPizza. (재미있는건 클린 코드에서도 피자를 예로 들었던 빌더 패턴이 있었다.) String 아규먼트 type으로 피자 종류를 선택하고 인스턴스를 생성한다. public class PizzaStore { Pizza orderPizza(String type) { Pizza pizza; if (type.equals("cheese")) { pizza = new CheesePizza(); } else if ( type.equals("pepperoni")) { pizza = new PepperoniPizza(); } else if ( type..
디자인 패턴 3. 데코레이터 패턴 디자인원칙, 클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다. (Open-Closed Principle) 기존 코드는 건드리지 않은 채로 확장을 통해서 새로운 행동을 간단하게 추가할 수 있도록 해야한다. 이렇게 하면 새로운 기능 추가가 매우 유연하여 급변하는 환경에 잘 적응하면서도 튼튼한 디자인을 만들 수 있다. 이 원칙은 어떻게 보면 모순되어 보일 수 있다. 하지만 직접 코드를 수정하지 않고 코드를 확장할 수 있게 해주는 기법들이 있다. 상속은 변경될 가능성이 높은 부분에는 적합하지 않다. 책에서는 스벅 음료 추상클래스를 상속받는 음료 메뉴들을 예로 들었다. public abstract class Beverage { String de..
이펙티브 자바, 아이템 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 public 클래스의 public 필드는 API를 수정하지 않고는 (API를 사용하는 클라이언트에 피해를 줄 수 있으므로)내부 표현을 바꿀 수 없고, 불변식을 보장할 수 없으며, 외부에서 필드에 접근할 때 부수 작업을 수행할 수도 없다. 필드를 private으로 바꾸고 접근자 및 변경자 메서드를 활용하자. public class Point { private final int x; private final int y; public Point(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY()..