전체 카테고리361 [Effective Java] 아이템24 멤버 클래스는 되도록 static으로 만들라 ■ 중첩 클래스 중첩 클래스란 다른 클래스안에 정의된 클래스를 말한다. 중첩 클래스에는 4가지 종류가 있다. 이중 정적 멤버 클래스를 제외한 클래스를 내부 클래스(inner class)라고 부른다. 정적 멤버 클래스 멤버 클래스 익명 클래스 지역 클래스 ■ 중첩 클래스 사용 이유 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근할 수 있다. 서로 관련 있는 클래스들을 논리적으로 묶어, 코드의 캡슐화를 증가시킬 수 있다. 외부에서 내부 클래스에 접근할 수 없으므로 코드의 복잡성을 줄일 수 있다. 외부 클래스의 복잡한 코드를 내부 클래스로 옮겨 코드 복잡성을 줄일 수 있다. ■ 정적 멤버 클래스 정적 멤버 클래스는 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도 접근할 수 있다는 점을 제외.. 2021. 3. 1. [Effective Java] 아이템23 태그 달린 클래스보다는 클래스 계층구조를 활용하라 ■ 태그 달린 클래스 두 가지 이상의 의미를 표현할 수 있으며, 그중 현재 표현하는 의미를 태그 값으로 알려주는 클래스를 본적이 있을 것 이다. 다음은 원과 사각형을 표현할 수 있는 클래스이다. 태그 달린 클래스의 단점은 아래와 같다. 여러 구현이 하나의 클래스에 혼합돼있어서 가독성이 나쁘다. 다른 의미를 위한 코드도 항상 함께하니 메모리도 많이 사용한다. 필드들을 final로 선언하려면 해당 의미에 쓰이지 않는 필드들까지 생성자에서 초기화해야한다. 새로운 의미를 추가하려면 모든 switch문을 찾아 새 의미를 처리하는 코드를 추가해야한다. 즉, 장황하고 오류를 내기 쉽고 비효율적이다. // 코드 23-1 태그 달린 클래스 - 클래스 계층구조보다 훨씬 나쁘다! (142-143쪽) class Figure .. 2021. 3. 1. [Effective Java] 아이템22 인터페이스는 타입을 정의하는 용도로만 사용하라 ■ 상수 인터페이스 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할로만 사용해야한다. 이 지침에 맞지 않는 예로 상수 인터페이스가 있다. 상수 인터페이스란 상루르 뜻하는 static final 필드로만 가득 찬 인터페이스를 말한다. // 코드 22-1 상수 인터페이스 안티패턴 - 사용금지! (139쪽) public interface PhysicalConstants { // 아보가드로 수 (1/몰) static final double AVOGADROS_NUMBER = 6.022_140_857e23; // 볼츠만 상수 (J/K) static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; // 전자 질량 (kg) static final d.. 2021. 3. 1. [Effective Java] 아이템21 인터페이스는 구현하는 쪽을 생각해 설계하라 ■ 인터페이스 디폴트 메서드 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기는 어렵다. 디폴트 메서드는 기존 구현체에 런타임 오류를 일으킬 수 있다. 인터페이스를 설계 할 때는 세심한 주의를 기울여야 한다. ■ 자바 8의 Collection 인터페이스에 추가된 디폴트 메서드 자바 8에서 추가된 Collection 인터페이스의 removeIf() 메서드는 Predicate의 결과에 따라 원소를 제거하는 함수이다. 범용적으로 구현되어 있지만 모든 Collection 구현체와 어우러지는 것은 아니다. default boolean removeIf(Predicate 2021. 3. 1. [Effective Java] 아이템20 추상 클래스보다는 인터페이스를 우선하라 ■ 추상 클래스와 인터페이스의 차이점 추상 클래스 : 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야한다. 인터페이스 : 인터페이스에서 정의한 메서드를 모두 정의한 클래스라면 다른 어떤 클래스를 상속했든 상관없이 같은 타입으로 취급. 즉, 인터페이스는 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다. 인터페이스가 요구하는 메서드를 구현하고, implements만 추가하면 된다. 추상 클래스의 경우 2개의 클래스가 같은 추상 클래스를 확장하길 원한다면, 그 추상 클래스는 계층 구조상 두 클래스의 공통 조상이어야한다. 새로 추가된 추상 클래스의 모든 자손이 적절하지 않은 상황에서도 이를 상속하게 된다. ■ 믹스인 정의 인터페이스는 믹스인 정의에 맞춤이다.. 2021. 2. 24. [Effective Java] 아이템19 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 ■ 상속을 고려한 문서화와 설계 우선 메서드를 재정의하면 어떤 일이 일어나는지를 정확히 정리하여 문서로 남겨야 한다. 즉, 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지(자기사용) 문서로 남겨야한다. 클래스의 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수도 있다.(전 장의 addAll 예시) 그런데 재정의가 가능한 메서드라면 그 사실을 api 명세에 적시해야 한다. API문서의 메서드 설명 끝에서 종종 "Implementation Requiredments"로 시작하는 절을 볼 수 있다. 그 메서드 내부 동작 방식을 설명하는 곳이다. 이 절을 메서드 주석에 @implSpec 태그를 붙여주면 자바독 도구가 생성해준다. public boolean remove(.. 2021. 2. 23. 이전 1 ··· 15 16 17 18 19 20 21 ··· 61 다음