본문 바로가기

JAVA14

Item24. 멤버 클래스는 되도록 static으로 만들라 중첩 클래스는 자신을 감싼 바깥 클래스에서만 사용된다면 적절하다. 중첩 클래스에는 네 가지가 있으며, 쓰임이 각각 다르다. 멤버 클래스 인스턴스가 바깥 인스턴스를 참조한다면 non static으로, 인스턴스와 상관없이 독립적으로 존재한다면 static으로 만든다. 재사용되지 않는다면 익명 클래스로 만든다. 로컬 클래스는 거의 사용하지 않는다. 중첩 클래스 vs 톱 레벨 클래스 중첩 클래스는 자신을 감싼 바깥 클래스에서만 사용되어야 한다. 그 외의 쓰임새가 있다면 톱 레벨 클래스를 사용한다. 중첩 클래스는 외부 클래스를 통해서만 접근 가능하므로, 논리적인 의미로 클래스를 그룹핑해야할 때 사용할 수 있다. public class OuterClass { public static class NestedClass.. 2023. 6. 29.
Item23. 태그 달린 클래스보다는 클래스 계층 구조를 활용하라 💡 태그 달린 클래스는 응집도가 낮다. 응집도 높은 여러 클래스로 쪼개야 한다. 클래스 계층구조가 존재한다면 상속을 사용해 서브타입으로 구현하라. 태그 달린 클래스 태그란, 두 가지 이상의 의미를 표현하는 플래그이다. 태그 달린 클래스는 현재 표현하는 의미를 태그 값으로 알려주는 클래스이다. 다음은 원과 사각형을 표현하는 클래스이다. // Tagged class - vastly inferior to a class hierarchy! (Page 109) public class Figure { enum Shape { RECTANGLE, CIRCLE }; // Tag field - the shape of this figure final Shape shape; // These fields are used onl.. 2023. 6. 29.
Item18. 상속보다는 컴포지션을 사용하라 요약 구현 상속은 부모 클래스의 구현을 자식 클래스가 그대로 물려받으므로, 부모와 자식이 구현에 의해 강하게 결합되어 캡슐화가 깨진다. 만약 상위 클래스의 메서드 구현이 하위 클래스에 영향을 받지 않도록 만들고 싶다면, 상속보다 캡슐화를 잘 지키는 컴포지션을 사용하는 것이 좋다. 컴포지션은 기존 클래스를 새로운 클래스의 구성요소로 사용하는 것이며, 새 클래스의 인스턴스 메소드는 기존 클래스의 대응하는 메소드를 호출해 그 결과를 반환한다. 이 방식을 전달이라 한다. 컴포지션과 전달의 조합은 넓은 의미로 위임에 해당한다. 위임은 상속과 달리 캡슐화를 깨뜨리지 않으면서 코드를 재사용할 수 있다. 상속은 서브 타입을 사용할 경우에 유효하다. 코드를 재사용하는 목적이라면 상속은 부모와 자식의 강한 결합을 유발하므.. 2023. 5. 29.
Item10. equals는 일반 규약을 지켜 재정의하라 이 문서가 다루는 것 String Constant Pool equals의 일반 규약과 규약을 어기는 경우 리스코프 치환 원칙 바람직한 equals 구현 방법 세줄 요약 equals는 필요하지 않다면 재정의하지 않는다. 필요하다면 동치관계(반사, 대칭, 추이, 일관, null 아님)을 지켜야한다. 특히 상속 관계에서 equals를 비교하게 되면 하위 타입에서 사용하는 필드를 포함해서 상위 타입과 하위 타입을 비교하지 말아라. 상위 타입과 하위 타입 비교는 상위 타입의 필드로만 해라. 하위 클래스에서 자신의 필드를 포함한 equals를 사용하고 싶다면 상속 말고 합성으로 구현하고 포인트 뷰를 열어라. equals의 바람직한 정의 : 물리적 동치성 비교 → instanceOf 체크 후 변환 → 필드 비교 참고.. 2023. 5. 29.
Item8. finalizer와 cleaner 사용을 피하라 이 문서가 다루는 것 finalizer와 cleaner 사용법과 문제점 대신 Auto 리소스 정리 작업의 필요성 안전망 역할으로써의 cleaner phanom reference 결론 객체 소멸 전 리소스를 정리하는 작업을 할 때 finalizer와 cleaner를 사용하지 말아라. 대신 AutoCloseable을 구현하고 try-with-resources를 사용해라. finalizer는 아예 사용하지 말아라. (자바 9부터 deprecated됨) cleaner는 리소스나 네이티브 피어 회수가 되지 않는 문제를 대비한 안전망 정도로만 사용해라. 이런 경우라도 불확실성과 성능 저하에 주의해야한다. finalizer와 cleaner는 무엇인가? finalizer와 cleaner는 객체 소멸 전 리소스를 정리하.. 2023. 5. 29.
Item3. 생성자나 열거 타입으로 싱글턴임을 보증하라 다루는 내용 방법1 : private 생성자 + public static final 필드 방법2 : 퍼블릭 스태틱 메소드 방법3 : enum 리플렉션 공격 역직렬화 시 깨지는 싱글톤 제네릭 싱글톤 팩토리 메소드 메소드 참조와 Supplier 코드로 만드는 싱글톤의 한계 싱글톤 레지스트리 싱글톤의 활용 싱글톤 만들 때 꼭 무상태로 만들자!!!! 방법1. private 생성자 + public static final 필드 public class Elvis { /** * 싱글톤 오브젝트 */ public static final Elvis INSTANCE = new Elvis(); private Elvis() {} public void sing() { System.out.println("Elvis is singi.. 2023. 5. 14.