본문은 Effective Java를 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다. 요약 소스 파일 하나에 여러 톱레벨 클래스를 담으면 한 클래스를 여러 가지로 정의할 수 있으며, 컴파일 순서에 따라 결과가 달라질 수 있다 따라서 소스 파일 하나에는 반드시 톱레벨 클래스(혹은 톱레벨 인터페이스)를 하나만 담는다
본문은 Effective Java를 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다. 선결론 중첩 클래스에는 네 가지가 있으며, 각각의 쓰임이 다르다 1)메서드 밖에서도 사용하거나 메서드 안에서 정의하기에 너무 길다면 멤버 클래스로 만든다 멤버 클래스의 1-1)인스턴스 각각이 바깥 인스턴스를 참조한다면 비정적으로, 1-2)그렇지 않다면(참조하지 않는다면) 정적으로 만든다 2)중첩 클래스가 한 메서드 안에서만 쓰이면서 그 인스턴스를 생성하는 지점이 단 한 곳이고, 2-1) 해당 타입으로 쓰기에 적합한 클래스나 인터페이스가 이미 있다면 익명 클래스로 만든다 2-2) 그렇지 않다면(없다면) 지역 클래스로 만든다 중첩 클래스 중첩 클래스(nest..
본문은 Effective Java를 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다. 선요약 새로운 클래스를 작성하는 데 태그 필드가 등장한다면 태그를 없애고 계층구조로 대체하는 방법을 생각해본다 기존 클래스가 태그 필드를 사용하고 있다면 계층구조로 리팩토링하는 것을 고민해본다 태그 달린 클래스 태그 달린 클래스는 두 가지 이상의 의미를 표현할 수 있으며, 그중 현재 표현하는 의미를 태그 값으로 알려주는 클래스를 의미한다. 태그 달린 클래스 Figure public class Figure { enum Shape { RECTANGLE, CIRCLE }; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // 다음 ..
본문은 Effective Java를 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다. 선결론 인터페이스는 타입을 정의하는 용도로만 사용한다 따라서 상수를 공개하는 수단으로 인터페이스를 사용하면 안 된다 인터페이스의 목적 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할 즉, 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 용도 상수 인터페이스 상수 인터페이스란 메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스 상수 인터페이스 안티패턴은 인터페이스를 잘못 사용한 예다 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아니라 내부 구현에 해당하므로 상수 인터페이스를 구현하는 것은 내부 ..
본문은 Effective Java를 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다. 선결론 기존 인터페이스에 디폴트 메서드로 새 메서드를 추가하는 일은 꼭 필요한 경우가 아니면 피해야 한다 반면, 새로운 인터페이스를 만드는 경우엔 유용하다 인터페이스 설계 및 테스트의 중요성 자바 8부터 추가된 디폴트 메서드로 인해 기존 인터페이스에 메서드를 추가하는 것이 가능해졌다 디폴트 메서드는 컴파일에 성공하더라도 기존 구현체에 런타임 오류를 일으킬 수 있다 디폴트 메서드는 인터페이스로부터 메서드를 제거하거나 기존 메서드의 시그니처를 수정하는 용도가 아니다 이런 형태로 인터페이스를 변경하면 반드시 기존 클라이언트를 망가뜨리게 된다 따라서 필자는 설계..