Java/이펙티브 자바
-
아이템21. 인터페이스는 구현하는 쪽에서 생각해 설계하라.Java/이펙티브 자바 2023. 9. 5. 11:32
핵심 정리 - 기존 인터페이스에 디폴트 메서드 구현을 추가하는 것은 위험한 일이다. ▷ ex) collection의 removeIf - synchronized 관련한 코드가 없기에 멀티쓰레드 환경에서 안전 X ㆍ디폴트 메서드는 구현 클래스에 대해 아무것도 모른 채 합의 없이 무작정 "삽입" 될 뿐이다. ㆍ디폴트 메서드는 기존 구현체에 런타임 오류를 일으킬 수 있다. public class SubClass extends SuperClass implements MarketInterface { public static void main(String[] args) { SubClass subClass = new SubClass(); subClass.hello(); // SuperClass의 hello는 priva..
-
아이템20. 추상 클래스보다 인터페이스를 우선하라.Java/이펙티브 자바 2023. 8. 31. 11:51
핵심 정리 - 인터페이스의 장점 - 자바 8부터 인터페이스도 디폴트 메서드를 제공할 수 있다. (완벽 공략 3) public interface TimeClient { void setTime(int hour, int minute, int second); void setDate(int day, int month, int year); void setDateAndTime(int day, int month, int year, int hour, int minute, int second); LocalDateTime getLocalDateTime(); static ZoneId getZonedId(String zoneString) { try { return ZoneId.of(zoneString); } catch (Dat..
-
아이템19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라.Java/이펙티브 자바 2023. 8. 30. 12:57
핵심 정리 - 상속용 클래스는 내부 구현을 문서로 남겨야 한다. ㆍ@implSpec 을 사용할 수 있다. javadoc -d 경로 -tag "implSpec:a:Implementation Reqirements:" - 내부 동작 중간에 끼어들 수 있는 훅(hook)을 잘 선별하여 protected 메서드로 공개해야 한다. - 상속용으로 설계한 클래스는 배포 전에 반드시 하위 클래스를 만들어 검증해야 한다. - 상속용 클래스의 생성자는 재정의 가능한 메서드를 호출해서는 안된다. ㆍCloneable(아이템 13)과 Serializable(아이템 86)을 구현할 때 조심해야 한다. - 상속용으로 설계한 클래스가 아니라면 상속을 금지한다. ㆍfinal 클래스 또는 private 생성자
-
아이템18. 상속보다는 컴포지션을 사용하라Java/이펙티브 자바 2023. 8. 23. 12:27
핵심 정리 - 패키지 경계를 넘어 다른 패키지의 구체 클래스를 상속하는 일은 위험하다. ㆍ상위 클래스에서 제공하는 메서드 구현이 바뀐다면... ㆍ상위 클래스에서 새로운 메서드가 생긴다면... - 컴포지션 (Composition) ㆍ새로운 클래스를 만들고 private 필드로 기존 클래스의 인스턴스를 참조. ㆍ새 클래스의 인스턴스 메서드들은 기존 클래스에 대응하는 메서드를 호출해 그 결과를 반환한다. ㆍ기존 클래스의 구현이 바뀌거나, 새로운 메서드가 생기더라도 아무런 영향을 받지 않는다. 완벽 공략 요약 - p119, 데코레이터 패턴 - p119, 컴포지션과 전달 조합은 넓은 의미로 위임(delegation)이라고 부른다. - p119, 콜백 프레임워크와 셀프 문제 완벽 공략 - 데코레이터 패턴 기존 코드..
-
아이템17. 변경 가능성을 최소화 하라.Java/이펙티브 자바 2023. 8. 15. 10:07
핵심 정리 - 불변 클래스 - 불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다. - 불변 클래스를 만드는 다섯 가지 규칙 ㆍ객체의 상태를 변경하는 메서드를 제공하지 않는다. ▷ setter를 제공하지 않는다. ㆍ클래스를 확장할 수 없도록 한다 ▷ 상속을 할 수 없게 만든다. ( 1. final class 2. private contructor ) ㆍ모든 필드에 final로 선언한다. ㆍ모든 필드를 private으로 선언한다. ▷ public이면 필드 참조를 할 수도 있기에 우리는 필드 참조를 원치않는다. ㆍ자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. ▷ getter를 만들어 주지 않거나 방어적인 복사를 해서 사용 public fin..
-
아이템16. public 클래스에서는 public 필드가 아닌 접근 메서드를 사용하라.Java/이펙티브 자바 2023. 8. 13. 11:59
핵심 정리 - 클라이언트 코드가 필드를 직접 사용하면 캡슐화의 장점을 제공하지 못한다. - 필드를 변경하려면 API를 변경해야 한다. - 필드에 접근할 때 부수 작업은 할 수 없다. - paackage-private 클래스 또는 private 중첩 클래스라면 데이터 필드를 노출해도 문제가 없다. 완벽 공략 - p103, 아이템 67에서 설명하듯, 내부를 노출한 Dimesion 클래스의 심각한 성능문제는 오늘날까지도 해결되지 못했다. public class DimensionExample { public static void main(String[] args) { Button button = new Button("hello button"); button.setBounds(0, 0, 20, 10); Dimen..
-
아이템15. 클래스와 멤버의 접근 권한을 최소화하라Java/이펙티브 자바 2023. 6. 27. 12:48
핵심 정리 - 구현과 API를 분리하는 "정보 은닉"의 장점 - 시스템 개발 속도를 높인다. (여러 컴포넌트를 병렬로 개발할 수 있기 때문에) - 시스템 관리 비용을 낮춘다. (컴포넌트를 더 빨리 파악할 수 있기 때문에) - 성능 최적화에 도움을 준다. (프로파일링을 통해 최적화할 컴포넌트를 찾고 다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 개선할 수 있기 때문에) - 소프트웨어 재사용성을 높인다. (독자적인 컴포넌트라면) - 시스템 개발 난이도를 낮춘다. (전체를 만들기 전에 개별 컴포넌트를 검증할 수 있기 때문에) 핵심 정리 - 클래스와 인터페이스의 접근 제한자 사용 원칙 - 모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 한다. - 톱레벨 클래스와 인터페이스에 package-private 또는..
-
아이템 14. Comparable을 구현할지 고민하라Java/이펙티브 자바 2023. 6. 23. 08:36
핵심정리1 - Comparable 규약 핵심 정리: compareTo 규약 - Object.equals에 더해서 순서까지 비교할 수 있으며 Generic을 지원한다. - 자기 자신이 (this)이 compareTo에 전달된 객체보다 작으면 음수, 같으면 0, 크다면 양수를 리턴한다. - 반사성, 대칭성, 추이성을 만족해야 한다. - 반드시 따라야 하는 것은 아니지만 x.compareTo(y) == 0 이라면 x.equals(y)가 true 여야 한다. 핵심정리1 - Comparable 구현 방법1 - 자연적인 순서를 제공할 클래스에 implements Comparable 을 선언한다. - compareTo 메서드를 재정의한다. - compareTo 메서드 안에서 기본 타입은 박싱된 기본 타입의 compa..