본문 바로가기

Effective Java73

[Effective Java] 아이템25 톱레밸 클래스는 한 파일에 하나만 담으라 ■ 하나의 java 파일에는 하나의 톱레밸 class를 생성하자 소스 파일 하나에 여러 톱레밸 클래스를 선언하더라도 자바 컴파일러는 불평하지 않는다. 하지만 이렇게 할 경우 심각한 위험을 감수해야한다. 패키지 트리구조로 파악되지 않는 클래스가 생긴다. 수동 컴파일 시 컴파일하는 자바 파일의 순서에 따라 상이한 동작을 초래한다. 예를 들어 다음 코드를 살펴보자 // 코드 25-1 두 클래스가 한 파일(Utensil.java)에 정의되었다. - 따라 하지 말 것! (150쪽) class Utensil { static final String NAME = "pan"; } class Dessert { static final String NAME = "cake"; } // 코드 25-2 두 클래스가 한 파일(Des.. 2021. 3. 2.
[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.