Comparable 인터페이스를 구현한 클래스의 인스턴스는 자연적인 순서를 가지게 된다. Comparable 인터페이스는 compareTo라는 메서드를 하나 가진다. compareTo 메서드는 동치성 비교와 순서 비교가 가능하다. 자바의 거의 모든 값 클래스와 열거 타입이 Comparable을 구현한 상태이다. CompareTo 메서드의 일반 규약 동치성 인스턴스 자기 자신을 compareTo로 비교한 값은 0이 나와야 한다. n1.compareTo(n1) 대칭성 인스턴스 두개의 비교 순서를 뒤집으면 항상 반대의 값이 나와야 한다. n1.compareTo(n2) // 양수 n2.compareTo(n1) // 음수 추이성 n1.compareTo(n2) > 0 n2.compareTo(n3) > 0 // 추이..
Dev Book
우리는 흔히 자원을 닫아주는 close 메서드를 사용할때 try-finally 안에서 처리해준다. static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try{ return br.readLine(); } finally { br.close(); // finally 블록 안에서 close 메서드 호출! } } 위의 방법을 사용했을때의 문제점은 크게 두가지가 있다. 자원을 두개 이상 사용하면 구조가 복잡해진다. 예외가 정상적으로 표시되지 않는다. 두번째 문제점에 대해 조금 더 알아보자. 예외가 중첩으로 일어날때, 가장 중요한 예외는 가장 먼..
자바는 가비지 컬렉터(GC)를 사용하여 메모리를 관리해주기 때문에 직접 메모리를 관리해야 하는 C/C++ 언어보다 사용하기 편리하다. 하지만 가비지 컬렉터가 모든 메모리 관리를 대신해준다고 믿고 있다가는 메모리 누수로 성능 저하가 일어날 수 있다. 메모리 누수의 예를 살펴보자. 스택의 예 public class Stack { private Object[] elements; // 배열에 들어가있는 데이터의 개수 private int size = 0; // 배열의 고정 할당 크기, size가 이 크기를 넘어가면 복사해서 새로 만든다. private static final int DEFAULT_INITIAL_CAPACITY = 10; public Stack() { elements = new Object[Def..
똑같은 기능을 하는 객체는 매번 생성하기 보다 객체 하나를 재활용 하는 방법을 선택하자. 객체 재활용의 대표적인 예로 String 클래스가 있다. String 클래스의 문자열 생성 과정을 살펴보자. String s = "java" // String constant pool을 사용하는 방법 String s2 = new String("java") // 일반적인 객체 생성을 사용하는 방법 위의 리터럴(" ")을 사용하는 방법은 String의 intern() 메서드를 사용해 String constant pool 내부의 문자열 객체를 재활용 한다. 반면 아래의 객체 생성 방법은 Heap에 문자열 객체를 생성한다. String s1 = new String("java") String s2 = new String("j..
의존 관계를 가지는 두 가지 경우를 먼저 살펴보자 // 정적 유틸리티 클래스 방식 public class SpellChecker { private static final Lexicon dictionary = new KoreaDictionary(); private SpellChecker() {} // 객체 생성 방지 } // 싱글톤 방식 public class SpellChecker { private static final Lexicon dictionary = new KoreaDictionary(); public static SpellChecker INSTANCE = new SpellChecker(); private SpellChecker(){}; } 위의 두가지 경우는 다양한 사전 종류에 유연하게 대처하..
[ 유틸리티 클래스 ] 객체 생성이 목적이 아닌, 정적 메서드와 정적 필드만을 사용하기 위해 만들어진 클래스를 유틸리티 클래스라고 한다. 유틸리티 클래스의 예로 java.lang.Math가 있다. public final class Math { // Math 내부는 모두 static 변수와 static 메서드로 이루어져 있다. public static final double E = 2.7182818284590452354; ... public static double floor(double a) { return StrictMath.floor(a); } ... } java8 이전에는 인터페이스에 static 메서드 선언이 불가능했기때문에 이런 유틸리티성 작업은 모두 클래스에서 해야했지만, java8 이후로는 ..
[ 싱글톤(Singleton)이란 ] 싱글톤은 인스턴스가 오직 하나만 생성 될 수 있는 클래스를 말한다. 싱글톤은 무상태로 유지되야 하며 우리가 가장 많이 접할 수 있는 싱글톤으로는 스프링 컨테이너에서 빈을 싱글톤으로 관리하는게 있다. [ 싱글톤을 만드는 방식 ] 싱글톤을 만드는 방식은 보통 두가지 중 하나이다. public static final로 싱글톤 객체를 만드는 방식 public static 메서드로 싱글톤 객체를 반환하는 방식 두 방식 모두 private 생성자를 통해 외부에서 인스턴스 생성이 불가능하게 하고, static으로 싱글톤 객체가 프로그램 로딩 시 미리 만들어지게 한다. [ public static final로 싱글톤 객체 생성 ] public class Elvis { public ..
정적 팩터리와 생성자를 통한 객체 생성은 선택적 매개변수의 수가 많을때 제약이 있다. public class NutritionFacts { private final int servingSize; // 필수 private final int servings; // 필수 private final int calories; // 선택 private final int fat; // 선택 .... } 선택적 매개변수란 위의 NutritionFacts를 생성할때 꼭 필요하지 않은 변수를 말한다. 예를 들어 calories와 fat이 영양 정보를 표시하는데 꼭 필요한 정보가 아니라면, 당장 생성자를 통해 초기화 해주지 않아도 된다. 이런 상황에서 대처할 수 있는 방법들을 알아보자. [ 대안 1. 점층적 생성자 패턴 ] ..