Item 25 - 톱레벨 클래스는 한 파일에 하나만 담으라
소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 자바 컴파일러는 불평하지 않는다. 하지만 아무런 득이 없을 뿐더러 심각한 위험을 감수해야 한다. 한 클래스를 여러 가지로 정의할 수 있다. 그 중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달라진다. 두 클래스가 한 파일...
소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 자바 컴파일러는 불평하지 않는다. 하지만 아무런 득이 없을 뿐더러 심각한 위험을 감수해야 한다. 한 클래스를 여러 가지로 정의할 수 있다. 그 중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달라진다. 두 클래스가 한 파일...
중첩 클래스 (nested class) 중첩 클래스는 다른 클래스 안에 정의된 클래스를 말한다. 자신을 감싼 바깥 클래스에서만 쓰여야한다. 정적 멤버 클래스, (비정적) 멤버 클래스, 익명 클래스, 지역 클래스 정적 멤버 클래스 다른 클래스 내부에서 static으로 선언된 클래스 다른 정적 멤버와 똑같은 접근 규칙을 적용받는다...
태그 달린 클래스 두 가지 이상의 의미를 표현할 수 있고, 현재 표현하는 의미를 태그 값으로 알려주는 클래스 public class Figure { enum Shape { RECTANGLE, CIRCLE }; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // 다음 필드들은 모양이 사각...
인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 하는데, 인터페이스는 이 용도로만 사용해야 한다. 상수 인터페이스는 메서드 없이 static final 필드로만 가득 찬 인터페이스로, 인터페이스를 잘못 사용한 예이다. public interface PhysicalConstants { static final do...
디폴트 메서드의 도입 자바 8 이전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 방법이 없었다. 자바 8부터는 디폴트 메서드가 소개되면서 기존 인터페이스에 메서드를 추가할 수 있게 되었다. 그러나 이렇게 추가된 디폴트 메서드가 모든 기존 구현체들과 매끄럽게 연동되리라는 보장은 없다. 디폴트 메서드 추가 시 주의...
인터페이스의 장점 자바 8부터 인터페이스도 디폴트 메서드를 제공할 수 있다. 기존 클래스에 손쉽게 새로운 인터페이스를 구현해 넣을 수 있다. BUT, 추상 클래스는 그렇지 않다. 새로 추가된 추상 클래스의 모든 자손이 상속 구조를 가지면서 혼란을 준다. 인터페이스는 믹스인(mixin) 정의에 안...
상속을 고려한 설계와 문서화 📃 (1) 상속용 클래스는 내부 구현을 문서로 남겨야 한다. 상속용 클래스는 재정의 할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다. 아래와 같이 @implSpec 태그를 이용해서 불필요하게 내부 구현 방식을 설명해야 한다. (2) 클래스의 내부 동작 과정 중간에 끼어 들어갈 수 있...
데코레이터 패턴(Decorator Pattern) 이란? 객체에 동적으로 기능을 추가하여 확장할 수 있게 해주는 디자인 패턴 상속을 통해 클래스를 확장하는 대신, 객체를 감싸는 방식으로 기능을 추가하거나 변경한다. 기존 코드를 수정하지 않고도 새로운 기능을 추가하거나 수정할 수 있게 된다. 데코레이터 패턴...
상속은 코드를 재사용하는 강력한 수단이지만 항상 최선은 아니다. 상속의 문제점 아래의 클래스는 정상적으로 보이지만 문제가 있다. public class InstrumentedHashSet<E> extends HashSet<E> { private int addCount = 0; public Instrume...
불변 클래스 인스턴스의 내부 값을 수정할 수 없는 클래스 ex. String, BigInteger, BigDecimal, 기본 박싱 클래스들 불변 클래스는 가변 클래스보다 설계/구현/사용이 쉽고, 오류가 생길 여지도 적다. 불변 클래스를 만들기 위한 규칙 객체의 상태를 변경하는 메서드를 제공하지 않는...