들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 이 글의 요약 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..
들어가기 전 이 글은 인프런 백기선님의 이펙티브 자바 강의를 복습하며 작성한 글입니다. 이 글의 요약 인터페이스는 추상 클래스보다 더 많은 장점이 있다. 따라서 인터페이스를 기본으로 사용하되, 추상 클래스는 나중에 사용하자. 인터페이스에서는 default 메서드를 이용해 구현체 변경 없이 확장 가능하다. 인터페이스의 default 메서드는 구현체의 세부 구현을 깨뜨릴 소지가 있따. 인터페이스를 Wrapper 클래스와 함께 사용하면 기능 확장을 안전하게 할 수 있다. 만약 상속이었다면, 부모 클래스의 세부 구현 사항과 결합해 깨지기 쉬운 코드가 된다. 계층구조가 아닌 클래스의 관계는 상속을 통해 Composition하여 새로운 기능을 만들기 쉽다 인터페이스 + 추상 클래스를 이용한 추상 골격 클래스는 Te..
들어가기 전 이 글은 인프런 백기선님의 이펙티브 자바 강의를 복습하며 작성한 글입니다. 핵심 정리 상속용 클래스는 내부 구현을 문서로 남겨야 한다. @implSpec을 사용할 수 있다. 상속용 클래스의 재정의 가능한 메서드들에 @implSpec 태그를 이용해 문서화 한다. 내부 동작 중간에 끼어들 수 있는 훅(hook)을 잘 선별하여 protected 메서드로 공개해야 한다. 상속용으로 설계한 클래스는 배포 전에 반드시 하위 클래스를 만들어 검증해야 한다. 상속용 클래스의 생성자는 재정의 가능한 메서드를 호출해서는 안된다. Cloneable(아이템 13)과 Serializable(아이템 86)을 구현할 때 조심해야 한다. 상속용으로 설계한 클래스가 아니라면 상속을 금지한다. final 클래스 또는 pri..