이펙티브자바
이펙티브 자바, 쉽게 정리하기 - item8. finalizer와 cleaner 사용을 피하라
finalizer와 cleaner의 사용을 피하라 자바가 제공하는 객체 소멸자 자바에서는 2가지 객체 소멸자를 제공한다. finalizer와 cleaner이다. 그러나, 이 두 소멸자는 기본적으로 쓰지 말아야 한다. 이후에 나오지만 try-catch-with-resources 방식이 권장된다. finalizer와 cleaner를 지양해야 하는 이유 가비지 컬렉터에 의해 실행이 결정되며, 즉시 실행된다는 보장은 없다. 객체에 접근하지 못하게 된 뒤로 finalizer나 cleaner가 실행되는데 얼마나 소요되는지 알 수 없다. finalizer와 cleaner가 즉시 실행된다는 보장이 없을 때 생기는 문제 ex) 시스템이 동시에 열 수 있는 파일의 갯수는 한정되어 있다. 열었던 파일을 닫아주지 않으면, 더..
이펙티브 자바, 쉽게 정리하기 - item7. 다 쓴 객체 참조를 해제하라
다 쓴 객체 참조를 해제하라 Stack 코드의 예제 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size == 0) { throw new EmptyStackException(); } return elements[--size]; } pri..
이펙티브 자바, 쉽게 정리하기 - item6. 불필요한 객체 생성을 피하라
불필요한 객체 생성을 피하라 객체 생성의 비용 객체를 매번 생성하고 지우는 것은 반복적으로 발생했을 때 큰 비용이 될 수 있다. 물론 현대 컴퓨터의 성능이 많이 좋아서 작은 객체는 큰 부담이 되지 않을 수도 있다. 계속 같은 내용의 객체를 사용할 것이라면 불변 객체를 만들어놓고 재사용하는 것이 좋다. 불필요한 객체 생성의 예 String 객체의 예 String s = new String("bikini"); 위 코드는 안티패턴이다. 결국 bikini라는 문자열을 사용하고 싶은 건데, 굳이 JVM 문자열 풀에서 가져오지 않을 이유가 없다. String s = "bikini"; 더 간결하면서도 더 옳은 코드이다. Boolean 객체의 예 Boolean boolean = new Boolean(true); 과연 ..
이펙티브 자바, 쉽게 정리하기 - item4. 인스턴스화를 막으려면 private 생성자를 사용하라
인스턴스화를 막으려면 private 생성자를 사용하라 인스턴스화를 막아야 하는 경우 유틸 클래스를 만들 때 java.lang.Math, java.util.Arrays, java.util.Collections와 같은 유틸 클래스를 구성하는 경우에는 해당 클래스가 쓸데없이 인스턴스화 되는 것을 막아야 한다. 객체지향적으로는 곱게 보이지 않을 수 있는 사용방식이다. 유틸 클래스 용도 1: 특정 인터페이스를 구현하는 객체 생성 팩토리 메서드를 모아놓는다. // from Collections 클래스 public static Map synchronizedMap(Map m) { return new SynchronizedMap(m); } Map 인터페이스 타입 객체를 넣으면, SynchronizedMap을 반환해주는 ..
이펙티브 자바, 쉽게 정리하기 - item2. 생성자에 매개변수가 많다면, 빌더 패턴을 고려하라
생성자에 매개변수가 많다면 빌더를 고려하라 생성자에 매개변수가 많다면? 영양 정보를 제공해야 하는데, 클래스 내부에 멤버 필드가 매우 많다고 가정하자. static class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; private final int carbohydrate; ... } 위 상황에서 경우의 수 별로 생성자로 만드는 것은 무리가 있다. 총 6개의 필드가 있고 이 중에 3개를 뽑는 것만 해도 경우의 수가 6*5*4/3*2가 나온다. 혹여나 만든다해도 실제 객체를 생성..
이펙티브 자바, 쉽게 정리하기 - item1. 생성자 대신 정적 팩터리 메서드를 고려하라
생성자 대신 정적 팩토리 메서드를 고려하라 핵심 요약 객체 생성에는 보통 생성자만 있다고 생각하기 쉽다. 정적 팩토리 메서드를 객체 생성 용도로 쓰는 것도 경우에 따라 좋다. 생성자 대신 정적 팩터리 메서드를 만들면 가지는 장점들 장점1: 생성자가 이름을 가질 수 있다. public class Test { @org.junit.jupiter.api.Test public void bigInteger() { BigInteger bigInteger = new BigInteger(10, 100, new Random()); BigInteger probablePrime = BigInteger.probablePrime(10, new Random()); System.out.println("bigInteger = " + ..
이펙티브 자바 - 들어가면서...
이펙티브 자바에서 추구하는 코드의 목적 명료성 (clearity) 단순성 (simplicity) 컴포넌트에 대해서 이 책에서 설명하는 컴포넌트란 개별 메서드부터 여러 패키지로 이뤄진 복잡한 프레임워크까지 재사용 가능한 모든 소프트웨어 요소를 뜻한다. 컴포넌트의 규칙 사용자를 놀라게 하는 동작을 해선 절대 안 된다. 정해진 동작이나 예측할 수 있는 동작만 해야 한다. 가능한 작되, 너무 작아서는 안된다. 복사되는 것이 아니라 재사용되어야 한다. 컴포넌트간 의존성은 최소로 유지해야 한다. 오류는 만들어지자마자 가능한 빠른 시간(컴파일 타임)에 잡아야 한다. 위 규칙은 매번 정확히 지켜질 순 없다. 다만, 어겨야할 때는 합당한 이유가 있어야 한다. 프로그래밍 고수가 되기 위해서는 정석이 되는 규칙을 먼저 배운..