Book/이펙티브 자바 3판

아이템 76. 가능한 한 실패 원자적으로 만들라 실패 원자적(failure-atomic)? 호출된 메소드가 실패하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다는 특성 어떻게 하면 실패 원자적 특성을 가진 메서드를 만들수 있을까? 아주 간단한 방법은 불변 객체(아이템 17)로 만드는 것이다. 메서드가 실패하면 새로운 객체가 만들어 지지 않을 수 있으나, 기존 객체가 불안정한 상태에 빠질일은 없다. 왜냐하면 생성 시점에 고정되어 절대 변하지 않기 때문이다. 그럼 가변객체는? 가장 흔한 방법은 작업 수행에 앞서 매개변수를 검사하는 것(아이템 49)이다. 쉽게 말하면 객체 내부 상태가 변하기 전에 잠재적 예외 가능성을 걸러내라는 의미이다. 간단한 Stack 코드를 보자. public Object po..
아이템54. null이 아닌, 빈 컬렉션이나 배열을 반환하라 컬렉션에 값이 없으면? 대부분 null로 처리한다고 한다고 합니다. (전 그런적이 없는데...) return list.isEmtpy() ? null : new ArrayList(list); 이거의 가장 큰 단점은 위의 값을 return하는 메소드를 사용하는 곳에서 null 방지를 해줘야 한다는 점입니다. 이렇게 쓰는 사람들의 의견은 빈 컬렉션을 반환하는 것이 비용이 들기 때문에 null로 처리해야한다는 의견입니다. 그러나 저 의견은 손쉽게 깨트릴수 있습니다. 빈 컬렉션을 만드는 것의 문제점이 아닌 이유 성능 저하의 주범이라고 확인되지 않는 이상 이정도의 성능 차이는 신경 쓸 수준이 못된다. 빈 컬렉션과 배열을 굳이 새로 할당하지 않고 만들수 있..
아이템 53. 가변인수는 신중히 사용하라 가변인수란? 명시한 타입의 인수를 0개 이상 받을 수 있도록 하는 것이다. static int sum(int... numbers) { int sum = 0; for (int number : numers) { sum += number; } return sum; } sum(1, 2); sum(1); sum(); 가변인수 메소드를 호출하면 먼저 인수의 갯수와 같은 배열을 만들고 인수들을 배열에 저장해 가변인수 메서드에 전달한다. 최소한 인수가 한개라도 필요하게 하려면 아래와 같이 validation 로직을 작성해주면 된다. static int sum(int... numbers) { if (numbers.lenght == 0) { throw new IllegalArgum..
아이템45. 스트림을 주의해서 사용하라 스트림(stream)이란? 데이터 처리 작업(순차 또는 병렬)을 지원하고자 Java8부터 추가되었다. 핵심은 두가지 이다. 데이터 원소의 유한 혹은 무한 시퀀스를 뜻하는 스트림 원소들로 수행하는 연산 단계를 표현하는 스트림 파이프 라임 스트림의 원소는 컬렉션, 배열, 파일, 정규표현식 패턴 매처, 난수 생성기 등 어디로부터든 원소들이 올 수 있다. 기본 타입으로는 int, long, double을 지원하며, 객체 참조도 원소가 될 수 있다. 스트림은 한번만 소비할 수 있다. 즉, 스트림의 연산 후 또 다른 연산을 하려고 하면 에러를 발생시킨다. IntStream stream = IntStream.of(1, 2); stream.forEach(x -> System.ou..
아이템35. ordinal 메서드 대신 인스턴스 필드를 사용하라 서론 대부분의 열거 타입 상수는 자연스럽게 인덱스(하나의 정수값)을 갖게 된다. 따라서 Java enum은 ordinal 이라는 메서드를 제공해 인덱스를 반환해준다. 그러나 ordinal은 사용하면 안된다. 그 이유를 살펴보도록 하겠습니다. 잘못 사용한 예 pbulic enum Number { ONE, TWO, THREE, FOUR pbulic int convertInt() { return ordinal() + 1; } } 지금과 같이 Number라는 enum이 있고, enum의 Int형을 ordinal로 정의한다고 생각해봅시다. 이떄, 갑자기 Zero(0)이 필요하다고 생각해봅시다. 그렇다면 아래와 같은 코드가 될것 입니다. pbulic ..
아이템14. Comparable을 구현할지 고려하라 package java.lang; import java.util.*; public interface Comparable { public int compareTo(T o); } 단순 동치성 비교 + 순서까지 비교 + 제네릭 이 3가지의 특징을 가지고 있는 메서드가 바로 compareTo이다. 따라서 Comparable을 구현한 객체의 배열은 손쉽게 정렬이 가능하다. 아울러 자바 플랫폼 라이브러리의 모든 값 클래스, 열거 타입은 모두 Compareable을 구현하고 있다. 규약 객체가 매개변수로 들어온 객체보다 작으면 음의 정수(-1), 같으면(0), 크다면 양의 정수(+1)을 반환한다. 객체와 매개변수로 들어온 객체의 타입이 다르다면 ClassCastEx..
아이템 7. 다 쓴 객체 참조를 해제하라. JVM은 GC가 메모리를 관리해줍니다. GC가 있다고 해서 메모리 관리를 개발자가 신경을 쓰지 않아도 된다고 오해할 수 있지만, 절대 사실이 아닙니다. 아래와 같이 스택 코드가 있다고 생각해봅시다. public class Stack { private static final int DEFAULT_INITAL_CAPACITY = 16; private Obejct[] elements; private int size = 0; public Stack() { elements = new Object[DEFAULT_INITAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++]; } publ..
아이템2. 생성자에 매개 변수가 많다면 빌더를 고려하라 서론 정적 팩터리, 생성자에는 공통점이 있다. 바로 선택적 매개변수가 많을 때는 적절하게 대응하지 못한다는 점이다. 따라서 선택적 매개변수가 많을 때에는 3가지 방식으로 많이 사용한다. 점층적 생성자 패턴 자바빈즈 패턴 빌더 패턴 점층적 생성자 패턴(Telescoping Constructor Pattern) 필수 매개변수만 받은 생성자, 필수 매개변수와 선택적 매개변수 1개만 받는 생성자, 필수 매개변수와 선택 매개변수 2개만 받는 생성자 ..... 이렇게 필요할 때마다 각 생성자를 오버로딩하는 방식으로 하는 것이라고 생각하면 됩니다. public class NutritionFacts { private final int servingSize; // ..
아이템1. 생성자 대신 정적 팩터리 메서드를 고려하라 클래스의 인스턴스를 얻는 방법 public 및 protected 생성자 정적 팩터리 메서드(static factory method) public 및 protected 생성자 public class book { public book { } } public class Main { public static void main(String[] args) { Book book = new Book(); } } 정적 팩터리 메서드 public class Book { public static Book getInstance() { return new Book(); } } public class Main { public static void main(String[] ar..
Seyun(Marco)
'Book/이펙티브 자바 3판' 카테고리의 글 목록