핵심 정리 태그 달린 클래스의 단점 쓸데없는 코드가 많다. 가독성이 나쁘다. 메모리도 많이 사용한다. 필드를 final로 선언하려면 불필요한 필드까지 초기화 해야 한다. 인스턴스 타입만으로는 현재 나타내는 의미를 알 길이 없다. 클래스 계층 구조(상속)로 바꾸면 모든 단점을 해결할 수 있다. 태그가 달린 클래스는? 태그 달린 클래스는 클래스가 가진 필드 중 일부가 클래스의 구체적인 타입을 나타내고, 이 타입에 따라 클래스의 전체 동작이 바뀌는 클래스다. 예시로는 Figure 클래스를 들 수 있다. // 코드 23-1 태그 달린 클래스 - 클래스 계층구조(상속)보다 훨씬 나쁘다! (142-143쪽) public class Figure { enum Shape {RECTANGLE, CIRCLE} // 태그 필..
핵심 정리 상수를 정의하는 용도로 인터페이스를 사용하지 말 것! 클래스 내부에서 사용할 상수는 내부 구현에 해당한다. 내부 구현을 클래스의 API로 노출하는 행위가 된다. 클라이언트에 혼란을 준다. 상수를 정의하는 방법 특정 클래스나 인터페이스 열거형 인스턴스화 할 수 없는 유틸리티 클래스 (private 생성자등) 상수를 정의하는 용도로 인터페이스를 사용하는 것은 안티패턴임 인터페이스에 상수를 정의하고, 클래스가 이 인터페이스를 구현을 하도록 한다. 그러면 그 클래스는 상수를 바로 사용할 수 있게 된다. 이것은 안티패턴이고, 이유는 두 가지다. 인터페이스의 원래 의도를 오염시킨다. 내부에서 사용되는 상수를 외부로 바로 노출시킨다. (내부 구현 노출) 아래에서 이 내용들을 하나씩 살펴보고자 한다. // ..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 이 글의 요약 ConcurrentModificationException은 멀티 쓰레드 환경에서 변하면 안되는데 변한 조건들이 있을 때 발생하는 에러다. 예를 들면 syncronzied 메서드 내에서 다른 메서드가 변수를 수정한다거나 했을 때 발생한다. ConcurrentModificiationException은 싱글 쓰레드에서도 발생하는데 주로 fail-fast를 기반으로 한 Collection을 순회하면서, element를 변경했을 때 발생한다. 완벽 공략 38. ConcurrentModificationException ConcurrentModificationException은 현재 바뀌면 안되는 것을 수정할 때 발생하는 예외다...
들어가기 전 이 글은 인프런 백기선님의 이펙티브 자바 강의를 복습하며 작성한 글입니다. 핵심 정리 기존 인터페이스에 디폴트 메서드 구현을 추가하는 것은 위험한 일이다. 디폴트 메서드는 구현 클래스에 대해 아무것도 모른 채 합의 없이 무작정 '삽입' 될 뿐이다. 디폴트 메서드는 기존 구현체에 런타임 오류를 일으킬 수 있다. 인터페이스를 설계할 때는 세심한 주의를 기울여야 한다. 서로 다른 방식으로 최소한 세 가지는 구현을 해보자. 아래에서 자세한 설명을 살펴보고자 한다. 기존 인터페이스에 디폴트 메서드 구현을 추가하는 것은 위험한 일임. 인터페이스에 default 메서드를 구현하면, 이 인터페이스를 구현한 모든 클래스에 해당 default 기능을 강제적으로 삽입하게 되고 이로 인해 문제가 발생할 수 있다...
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 이 글의 요약 추상 클래스를 이용해서 Template 메서드 패턴을 만들 수 있고, 이를 이용해서 구현체마다 다른 비즈니스 로직 결과를 보여줄 수 있다. Template Method 패턴은 상속 기반이기 때문에 상속의 단점을 고스란히 가진다. Template CallBack 패턴은 Template Method 패턴의 장점을 가지면서, 좀 더 느슨한 의존관계를 가진다 인터페이스의 default 메서드에 Object 클래스의 toString(), equals(), hashCode()를 재정의 할 수 없다. 완벽 공략 p132, 템플릿 메서드 패턴 p135, 디폴트 메서드는 equals, hashCode, toString 같은 Objec..