목록전체 글 (79)
영권's
ConcurrentHashMap ConcurrentHashMap 클래스는 동시성 친화적이며, 내부 자료구조의 특정 부분만 잠궈 동시에 추가, 갱신 작업을 허용한다. (내부적으로 synchronized 키워드를 블록 단위로 사용하여 메서드의 전체가 아닌 일부만 락을 걸어 동시성 문제를 해결하였다. 참고로 ConcurrentHashMap 이전에 멀티스레드에서 안전하게 만들어진 클래스는 HashTable이다. 하지만, HashTable은 주요 메서드 전체를 synchronized 로 감싸서 락을 걸기 때문에 성능상 ConcurrentHashMap 이 더 좋을 수 밖에 없다.
같은 기능의 객체를 매번 생성하는 것 보다 객체 하나를 재사용하는 것이 좋다. 특히 불변 객체는 언제나 재사용이가능하다. 하지 말아야 할 극단적인 코드 String s = new String("apple"); // 따라하지 말 것 위 문장은 실행 될 때마다 새로운 String 인스턴스를 생성한다. 기능적으로는 이미 만들어진 apple이라는 문자열과 똑같지만 항상 새로운 객체를 만들게 된다. 대신, String s = "apple"; 과 같이 사용하면 jvm안에 이와 같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다. 또한, 정적 팩토리 메서드를 사용하여 불필요한 객체 생성을 피할 수 있다. 그래서 Boolean(String) 생성자 대신 Boolean.valueOf(String)..
Java8에서 default로 사용되는 gc는 ParallelGC이고 Java9에서부터 default는 G1GC라고 한다. 둘의 차이점을 알기전에 GC에 대해서 먼저 알아보겠습니다. JVM에서 Heap 영역에 남아있는, 사용되지 않는 인스턴스들을 가비지라고 하며, Java에서는 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않기 때문에 가비지 컬렉터(Garbage Collector)가 더 이상 필요 없는 (쓰레기) 객체를 찾아 지우는 작업을 한다. GC에 대해서 알아보기 전에 알아야 할 용어 - 'stop-the-world' stop-the-world란, GC을 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다. stop-the-world가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 ..
자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 많은 클래스가 하나 이상의 자원에 의존한다. 예로 맞춤법 검사기는 사전(dictionary)에 의존하는데, 이런 클래스를 정적 유틸리티 클래스로 구현한 모습을 볼 수 있다. // 정적 유틸리티를 잘못 사용한 예 - 유연하지 않고 테스트 하기 어렵다. public class SpellCheker{ private static final Lexicon dictionary = ...; private SpellCheker(){} // 객체 생성 방지 public static boolean isValid(String word) { ... } public static List suggestions(String type) { ... } } // 싱글턴을 잘못 사용한..
아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라 가끔 정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때가 있을 것이다. 객체 지향적으로 사고하지 않는 이들이 종종 남용하는 방식이기에 그리 곱게 보이지는 않지만, 분명 쓰임새가 있다. 예를 들어, java.lang.Math와 java.lang.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아 놓을 수 있다. 또한, java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(혹은 팩토리)를 모아 놓을 수 있다. 마지막으로 final 클래스와 관련한 메서드들을 모아놓을 때도 사용한다. final 클래스를 상속해서 하위 클래스에 메서드를 넣는 건 불가능하기 때문이다. 정적 멤버만 담은..
Private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 그런데 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언틀르 테스트 하기가 어려워 질 수 있다. 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할 수 없기 때문이다. 싱글턴을 만드는 방식은 보통 두가지 이다. 두 방식 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로, public static 멤버를 하나 마련해둔다. 방법 1. public static 멤버가 final 필드인 방식 public calss Elvis{ public static final Elvis I..