Reading 6

아이템6. 불필요한 객체 생성을 피하라.

만약 내가 새로 인스턴스를 습관적으로 새로 생성하려고 하는 상황이 있다고 생각해보자. 그럼 바로 new 생성자를 통해서 인스턴스를 생성할 것이 아니라, 내가 만드려고 하는 대상이 불변 클래스인지 아닌지 생각해보고, 그 클래스의 정적 팩터리 메서드를 사용할 수 있는지 생각해보자. 정적 팩터리 메소드를 사용하면 불필요한 객체 생성을 피할 수 있기 때문이다. Boolean을 생성자로 생성하는 것보다 Boolean.valueOf(String)이라는 팩토리 메소드를 사용하는 것이 좋다는 얘기다. 만약 생성비용이 비싼 객체라면 어떨까? 불필요한 생성을 줄임으로써 성능을 상당히 개선할 수 있을 것이다. 이런 비싼 객체가 반복해서 필요하다면 '캐싱'을 통한 재사용이 아주 유용할 수 있다. static boolean i..

아이템9 . try-finally 보다는 try-with-resource를 사용하라

자바 라이브러리에서는 자원 사용 후 close()로 닫아줘야 하는것들이 있다. 예를들면 InputStream, OutputStream, java.sql.connection 과 같은. 전통적으로 이러한 자원들은 try-finally를 통해 자원을 닫아주었는데, 이 구문은 만약 기계의 물리적인 결함으로 인해 readline()이 실패할 경우 try에서 readLine()에 대한 실패가, finally에서 close()에 대한 실패가 발생한다. 이러한 경우는 시스템상에 close에 대한 예외처리만 잡기 때문에 물리적 결함에 대한 오류 파악이 매우 어렵다는 단점이 있다. 따라서 자바 7에서부터 제공하는 try-with-resource 구문을 사용하여 자원을 처리하는 것이 좋다. 이 구조를 사용하려면 자원이 Au..

아이템 7. 다 쓴 객체 참조를 해제하라

스택을 구현한 아래의 코드를 살펴보자. 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]; } /** * 원소를 위한 공..

아이템3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

싱글턴은 만드는 방식은 보통 둘 중 하나이다. 두 방식 모두 생성자는 private으로 감춰두고, 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 마련해둔다. 첫번째 방식은, public static final필드 방식이다. public class Elvis { public static final Elvis INSTANCE = new Elvis(5); public int age; private Elvis(int age) { this.age = age; } } public class Main { public static void main (String[] args){ Elvis elvis = Elvis.INSTANCE; //외부 클래스에서 접근 방식 System.out.println(e..

아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라

자바에서 생성자를 구현하는 방법은 여러가지가 있지만, 점층적 생성자 패턴과 자바빈즈 패턴, 그리고 빌드패턴에 대해 알아보자. 결론은 물론 정해져있다. 생성자에 매개변수가 많다면 빌더 패턴을 고려해야 한다. 점층적 생성자 패턴(telescoping constructor pattern) 아래와 같이 자바의 오버로딩 성격을 활용해서 클래스를 생성하는 점층적 생성자 패턴은 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기가 어렵다. public NutritionFacts(int servingSize, int servings) { this(servingSize, servings, 0); } public NutritionFacts(int servingSize, int servings, int calorie..

아이템1. 생성자 대신 정적 팩터리 메서드를 고려하라

아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라 이전에 람다식을 공부하면서, 인스턴스를 생성하지 않고 직접 클래스의 정적 메소드를 참조하는 방법에 대해 알아보았다. https://gocandoit.tistory.com/51 자바 기본서를 다시 읽다. 6 - 메소드 참조 메소드 참조 메소드 참조란, 메소드를 참조하여 매개변수의 정보 및 리턴 타입을 알아내어 람다식에서 불필요한 매개변수를 제거하는 것이다. 예를들어 아래와 같은 코드가 있을 때, 람다식은 gocandoit.tistory.com 그리고 여기서 말하는 정적 팩토리 메소드(static factory method)란 정적 메소드중, 리턴값이 그 클래스의 인스턴스값인 메소드를 말한다. 예를들어 자바의 Boolean 클래스는 리턴값이 Boolea..