본문 바로가기

728x90

자바☕/이펙티브 자바

(8)
이펙티브 자바 읽고 정리해보기 9. 아이템 9. try-finally보다는 try-with-resources를 사용하라 자바의 InputStream, OutputStream, java.sql.connection 등은 close 메서드를 통해 닫아줘야 하는 자원의 대표적인 사례로, 안전망으로 clener(finalizer)가 구현되어 있으나, 항상 기대처럼 동작하지 않는다https://cdaosldk.tistory.com/343 이펙티브 자바 읽고 정리해보기 8.아이템 8. finalizer와 cleaner(자바 8 이전 : finalizer, 8 이후 : cleaner 즉 동일) 사용을 피하라 finalizer는 오동작, 낮은 성능, 이식 문제를 야기할 수 있다. 그래서 자바 9부터는 deprecated 되었으며, cleanercdaosl..
이펙티브 자바 읽고 정리해보기 8. 아이템 8. finalizer와 cleaner(자바 8 이전 : finalizer, 8 이후 : cleaner 즉 동일) 사용을 피하라 finalizer는 오동작, 낮은 성능, 이식 문제를 야기할 수 있다. 그래서 자바 9부터는 deprecated 되었으며, cleaner가 그 대안으로 소개된다. 하지만, cleaner도 여전히 느리고, 예측할 수 없고, 일반적으로 불필요하다C++의 destructor와는 다른 개념으로, 자바는 가비지 컬렉터가 있어 자원 회수에 프로그래머의 역할이 필요없다. 비 메모리 자원 회수를 위해서는 자바에 try-with-resources와 try-finally가 있다finalizer와 cleaner는 즉시 수행된다는 보장이 없고, 가비지 컬렉터 구현에 따라 수행속도가 가지각색이..
이펙티브 자바 읽고 정리해보기 7. 아이템 7 : 다 쓴 객체의 참조를 해제하라public class Stack { private Object[] elements; private int size = 0; private static final int DEFALUT_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 Empty..
이펙티브 자바 읽고 정리해보기 6. 아이템 6 : 불필요한 객체 생성을 피하라같은 기능의 객체를 매번 생성하는 것보다 만들어진 하나의 객체를 재사용하는 것이 더 효율적인 경우가 많다. 특히 불변 객체(아이템 17)는 언제던지 재사용이 가능하다String s = new String("bikini");이 코드를 통해 매 번 쓰이지 않는 String 인스턴스가 (극단적으로) 수백만 개 만들어질 수 있다. "bikini" 자체가 만드려는 객체와 기능이 완전히 똑같아 객체를 생성할 필요가 없지만, 생성자로 객체를 생성하게 되면 호출 시마다 새로운 객체가 만들어지는 것이다String s = "bikini";이 방식을 사용하면 String s에 새로운 String을 생성하는 것이 아니라 기존 객체를 계속 할당하므로, 같은 가상머신 안에서 똑같은 문자열..
이펙티브 자바 읽고 정리해보기 4 & 5. 아이템 4 : 인스턴스화를 막기 위해 private 생성자 활용하라java.lang.Math 클래스나 java.util.Arrays는 기본 타입 값이나 배열 관련 메서드를 모아둔 클래스로, 실무에서 이와 같이 정적 메서드와 정적 필드만 있는 클래스를 구현할 수도 있다. 또한 java.util.Collections처럼 특정 인터페이스 구현체를 생성하는 정적 메서드(팩터리)를 모아놓을 수 있다(java 8부터는 해당 메서드를 인터페이스에 넣을 수 있다). final 클래스 관련 메서드를 모아놓을 때에도 사용할 수 있다. final 클래스를 상속한 하위클래스에 메서드를 넣을 수 없다정적 멤버만 있는 유틸리티 클래스는 인스턴스로 사용하기 위한 목적이 아니지만, 생성자를 명시하지 않으면 컴파일러가 public 생..
이펙티브 자바 읽고 정리해보기 3. 아이템 3 : private 생성자나 열거 타입으로 싱글턴임을 보장하라싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 대표적인 케이스로 함수(아이템 24)같은 stateless 객체나 설계상 유일해야 하는 시스템 Component가 있다. 클래스를 싱글턴으로 만들면 클라이언트를 테스트하기 어려워질 수 있다. 타입을 인터페이스로 정의한 후 그 인터페이스를 구현해서 만든 싱글턴인 경우에만 Mock을 사용할 수 있기 때문이다싱글턴은 일반적으로 두 가지 방식으로 만든다. 모두 private 생성자를 사용하고 인스턴스 접근 수단으로는 static 멤버변수를 둔다1) public static이 final 필드인 경우public class A { public static final A Ins..
이펙티브 자바 읽고 정리해보기 2. 아이템 2 : 생성자에 매개변수가 많다면 빌더를 고려하라정적 팩터리와 생성자 방식은 선택적 매개변수에 관련해 동일한 제약을 공유한다. 선택 매개변수가 많아질 수록 대응이 어렵다는 점이다. 이 경우 점층적 생성자 패턴을 통해 모든 경우의 수에 해당하는 생성자를 만들어 이 경우에 대비할 수 있으나, 이는 매개변수가 많아질 수록 코드 가독성과 작성 난이도가 올라가는 것은 똑같다다른 대안으로 자바 빈즈 패턴을 이용해 매개변수가 없는 생성자로 객체를 만든 후, 설정자를 이용해 원하는 매개변수의 값을 설정하는 것이다public class A { // 기본값이 있는 경우, 매개변수는 초기화된다 private int a = -1; // 필수; 기본값 없음 private int b = -1; // 필수; 기본값 없..
이펙티브 자바 읽고 정리해보기 1. 아이템 1 : 생성자 대신 정적 팩토리 메서드를 고려하라 클래스의 인스턴스를 얻을 때 일반적으로 public 생성자를 활용한다. 이 때 정적 팩터리 메서드를 활용하는 방법도 있다 예시) public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 기본 타입인 boolean 값을 받아 Boolean 객체 참조로 값을 반환한다 정적 팩터리 메서드 방식의 장점 1. 이름을 가질 수 있다 생성자는 그 자체로는 어떤 이유로 생성하는 지, 무엇이 반환되는 지를 제대로 설명할 수 없다. 정적 팩터리 메서드는 이를 잘 설명할 수 있다 하나의 메서드 시그니처로는 하나의 생성자를 만들 수 있기 때문에, 생성자만을 사용해 인스턴스를..

728x90