SERIES

Effective Java

15 Posts·Last updated on March 13, 2025

자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

January 01, 2025

많은 경우의 클래스들은 하나 이상의 리소스에 의존하는 양상을 띈다. 알림을 보내는 클래스와 이메일을 보내는 클래스가 있다고 가정해보자. 는 를 사용하여 이메일을 보낸다. 여기서 가 리소스에 의존한다고 말한다. 이때 클래스는 다음과 같이 구현하는 경우가 있다. 정적 유틸리티 클래스(Static Utility Class) 다음 코드는 알림을 보내는 를…


public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라

January 09, 2025

캡슐화의 이점을 제공하지 못하는 클래스 위와 같은 코드는 데이터 필드에 대한 직접적인 접근을 허용한다. 이러한 코드는 캡슐화의 이점을 제공하지 못한다.(아이템15와 이어지는 맥락) API를 수정하지 않고는 내부 표현을 바꿀 수 없다. 필드로만 구성되어 있기 때문에 내부 표현을 변경하기 위해서는 외부 API를 변경해야 한다. 책에서는 다음과 같이 클래스…


클래스와 멤버의 접근 권한을 최소화하라

January 16, 2025

잘 설계된 컴포넌트 책에서는 잘 설계된 컴포넌트에 대해 다음과 같이 설명한다. 클래스 내부 데이터와 내부 구현 정보를 외부로 부터 잘 숨겨야 한다. API를 통해서만 다른 컴포넌트와 소통해야 하며, 내부 동작 방식에 개의치 않아야 한다. 이는 캡슐화(정보 은닉)의 개념으로, 이를 잘 지키는 것이 잘 설계된 컴포넌트라고 말하고 있다. 캡슐화의 장점 캡슐화는…


인터페이스는 구현하는 쪽을 생각해 설계하라

January 16, 2025

자바 8 이전에는 기존 인터페이스에 메서드르 추하려면 기존 구현체를 수정해야 했고, 이를 안할 시 컴파일 오률를 일으켰다. 자바 8에서는 디폴트 메서드라는 기능을 도입하면서 인터페이스에 새로운 메서드를 추가할 수 있게 되었지만, 모든 상황에 대비하여 안전하게 동작하리라는 보장은 없다. 디폴트 메서드와 위험성 디폴트 메서드는 인터페이스 구현체에서 재정의하지…


제네릭과 가변인수를 함께 쓸 때는 신중하라

January 23, 2025

가변인수와 제네릭이 함께 사용될 때의 허점 가변인수(varargs): 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해준다. 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어지게 된다. 이 배열은 내부로 감춰야 하지만, 클라이언트에 노출하는 문제가 발생할 수 있다. 이로 인해 가변인수 매개변수에 제네릭같은 실체화 불…


int 상수 대신 열거 타입을 사용하라

January 29, 2025

열거 타입: 일정 개수의 상수 값을 정의한 다음, 그외의 값은 허용하지 않는 타입 정수 열거 패턴의 단점 기존 정수 열거 패턴(int enum pattern)은 타입 안전을 보장할 방법이 없고 표현력이 좋지 않다는 단점이 존재한다. 위 코드에서 에서 를 동등 비교()를 해도 컴파일러의 경고 메시지가 없다. 자바에서는 정수 열거 패턴을 위한 별도 이름 공간…


정의하려는 것이 타입이라면 마커 인터페이스를 사용하라

January 30, 2025

마커 인터페이스 아무 메서드도 담고 있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 표시해주는 인터페이스를 마커 인터페이스(marker interface)라고 한다. 인터페이스가 대표적인 마커 인터페이스이다. 이 인터페이스를 구현한 클래스는 직렬화할 수 있다는 것을 나타낸다. 실제로 인터페이스는 아무 메서드도 담고 있지 않다. 단지 클래스가 이…


스트림은 주의해서 사용하라

February 05, 2025

스트림이란? 스트림 API는 다야의 데이터 처리 작업(순차적이든 병렬적이든)을 돕고자 Java8부터 추가되었다. 여기서 이 API가 제공하는 핵심 추상 개념은 다음 두 가지다. 데이터 원소의 유한 혹은 무한 시퀀스를 뜻하는 스트림 원소들로 수행하는 연산 단계를 표현한느 스트림 파이프라인 스트림의 원소들은 컬렉션, 배열, 파일, 정규표현식 패턴 매처, 난수…


적시에 방어적 복사본을 만들라

February 13, 2025

자바는 안전한 언어다 자바는 네이티브 메서드를 사용하지 않기 때문에 버퍼 오버런, 배열 오버런, 와일드 포인터 같은 메모리 충돌 오류에서 비교적 안전하다. 또한 자바로 작성한 클래스는 시스템의 다른 부분에서 무슨 짓을 하든 기본적으로 불변성을 유지할 수 있도록 설계되었지만, 모든 경우에 자동으로 보호되는 것은 아니다. 왜 방어적으로 프로그래밍 해야할까? …


라이브러리를 익히고 사용하라

February 21, 2025

라이브러리에 익숙치 않으면 발생할 수 있는 문제 아래는 무작위 수를 백만 개를 생성한 다음, 그중 중간 값보다 작은 게 몇 개인지를 출력하는 코드다. 괜찮은 듯 보여도 적지않은 문제를 내포하고 있다. n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. n 값…