목록책 정리 (74)
초보개발자 긍.응.성
자바는 두 가지 객체 소멸자를 제공한다. finalizer와 cleaner이며 해당 소멸자의 사용은 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다. 파괴자 자바의 finalizer와 cleaner는 C++에서의 파괴자(destructor)와 다른 개념이다. C++의 파괴자는 특정 객체와 관련된 자원을 회수하는 보편적인 방법임에 반해 자바에서는 가비지 컬렉터가 그 작업을 담당하고, 프로그래머에게는 아무런 작업도 요구하지 않는다. C++의 파괴자는 비 메모리 자원을 회수하는 용도로도 쓰인다. 하지만 자바에서는 try-with-resources와 try-finally를 사용해 해결한다. finalizer와 cleaner는 즉시 수행된다는 보장이 없다. 객체에 접근할 수 없게 된 후 fin..
C와 Java의 가장 큰 차이점이라면 메모리 관리와 가비지 컬렉터라고 말할 수 있다. 가비지 컬렉터는 다 쓴 객체를 알아서 회수해가기에 메모리를 직접 관리할 필요가 없다. 그렇다고 메모리 관리에 더 이상 신경을 쓰지 않아도 된다고 생각할 수 있지만, 이번 아이템은 절대 그렇게 생각해서는 안된다는 것을 말하고 있다. 아래와 같이 구현한 Stack 클래스를 보자 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITAL_CAPACITY]; } // p..
똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 재사용은 빠르고 세련되다. 특히 불변 객체는 언제든 재사용 가능하다. 아래는 불필요한 객체 생성의 극단 적인 예시이다. String s = new String("I'm Son"); // 절대 사용하지 말 것! 위 문장은 실행될 때 마다 새로운 String 인스턴스를 새로 생성한다. 인자로 넣어주는 I'm Son과 정확히 같은 문자열을 쓸데없이 만들어 낸다. String s = "I'm Son"; 이 코드는 실행될때 하나의 String 인스턴스를 사용한다. 또한 이 방식을 사용한다면 같은 JVM안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용한다. 생성자 대신 정적 팩토리 메서드로! 생성자 대..
많은 클래스는 하나 이상의 자원에 의존한다. 그리고 이런 클래스들을 정적 유틸리티 클래스나 싱글턴 방식으로 만들어 사용하는 모습을 볼 수 있다. 하지만 그런 방법은 좋은 방법이 아니다. 맞춤법 검사 로직을 담고 사전이라는 자원(resource)에 의존하는 클래스를 다음과 같은 방법으로 만들었을 때를 살펴보자. 차례대로, 정적 유틸리티 클래스와 싱글턴 방식의 예시이다. 정적 유틸리티 클래스 public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // 객체 생성 방지 public static boolean isValid(String word) { ... }; public static ..
단순히 정적 메서드와 정적 필드를 담은 클래스를 만들어야 할 때가 있다. 그 예시는 다음과 같다. java.lang.Math, java.util.Arrays: 같이 기본 타입 값이나 배열 관련 메서드를 모아놓은 클래스 java.util.Collections: 특정 인터페이스를 구현하는 객체를 생성해 주는 정적 메서드를 담은 클래스 final 클래스와 관련한 메서드 (final 클래스를 상속해서 하위 클래스에 메서드를 넣을 수 없기 때문). 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 것이 아니다. 하지만 생성자를 명시하지 않으면 자바 컴파일러가 자동으로 기본 생성자를 만들어준다. 이로 인해 매개변수를 받지 않는 public 생성자가 자동으로 만들어지며, 사용자는 이 생성자에 대해 ..
싱글턴 (Singleton) 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글턴의 전형적인 예로는 함수와 같은 무상태(stateless) 객체나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있다. 그런데 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기 어려워질 수 있다. 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 mock 구현으로 대체할 수 없기 때문이다. 싱글턴을 만드는 방법 싱글턴을 만드는 방식은 보통 아래를 따른다. 생성자는 private 으로 감춘다 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 마련한다. public static 멤버는 두 가지 방법으로 구현 가능하다. 하..