본문 바로가기
728x90

Gayoung162

item 89. 인스턴스 수를 통제해야 한다면 readResolve보다는 열거 타입을 사용하라 item3의 싱글턴 패턴을 보자! 클래스는 바깥에서 생성자를 호출하지 못하게 막는 방식으로 인스턴스가 오직 하나만 만들어짐을 보장한다. public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public void leavingTheBuilding() {...} } 여기서 class 선언부에 implements Serializable을 추가하는 순간 이 클래스는 무슨 짓을 해도 싱글턴이 아니다. 어떤 readObject를 사용하든, 이 클래스가 초기화될 때 만들어진 인스턴스와는 별개인 인스턴스를 반환하게 된다. 이 때 readResolve 기능을 이용하면 readObject가 만들어낸 인스턴스.. 2022. 9. 15.
item 88. readObject 메서드는 방어적으로 작성하라 item 50에서는 불변인 날짜 범위 클래스를 만드는데 가변인 Date 필드를 이용했다. 그래서 불변식을 지키고 불변을 유지하기 위해 생성자와 접근자에서 Date 객체를 방어적으로 복사하느라 코드가 상당히 길어졌다. public final class Period { private final Date start; private final Date end; /** * @param start 시작 시각 * @param end 종료 시각; 시작 시각보다 뒤여야 한다. * @throws IllegalArgumentException 시작 시각이 종료 시각보다 늦을 때 발생한다. * @throws NullPointerException start나 end가 null이면 발생한다. */ public Period(Date.. 2022. 9. 13.
item 87. 커스텀 직렬화 형태를 고려해보라 개발 일정에 쫓기는 상황에서는 API설계에 노력을 집중하는 편이 낫다. '애자일'하게 다음 릴리스에서 다시 구현하기로 하고, 이번 릴리스에서는 동작만 하게 만들어놓는.. 그런걸 의미한다. 그러나, 클래스가 Serializable을 구현하고 기본 직렬화 형태를 사용한다면, 다음 릴리스 때 버리려 한 현재의 구현에 영원히 발이 묶인다. (ex BigInteger) 따라서, 먼저 고민해보고 괜찮다고 판단될 때만 기본 직렬화 형태를 사용해야 한다. 직렬화 형태는 유연성, 성능, 정확승 측면에서 고민하면 된다. 일반적으로 직접 설계했다고 하더라도 기본 직렬화 형태와 거의 같은 결과가 나올 경우에만 기본 형태를 써야 한다. 객체의 물리적 표현과 논리적 내용이 같다면? 기본 직렬화 형태라도 무방하다. [ 기본 직렬화.. 2022. 9. 13.
Cache Cache란 ? : 자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 저장소이다. 쉽게 말해, 보관 장소라고 생각하면 된다. 파레토의 법칙이란? : 캐시 동작의 당위성을 부여하는 철학적 법칙 (?) 이다. 80퍼센트의 결과는 20퍼센트의 원인으로 인해 발생한다는 의미! 즉, 모든 결과를 저장할 필요가 없다는 말이다. 서비스를 할 때 많이 사용되는 20%를 캐싱한다면 나머지 80%의 결과에 대한 효율을 극대화시킬 수 있다는 의미이다. Cache의 종류 1. look aside cache (Lazy Loading) Cache에 Data 존재 유무 확인 Data가 있다면 cache의 Data 사용 Data가 없다면 cache의 실제 DB Data 사용 DB에서 가져온 Data를 Cache에 저장 look a.. 2022. 9. 1.
item 82. 스레드 안정성 수준을 문서화하라 보통, API 문서에 synchronized가 붙은 메서드는 '스레드 안전'하다는 말이 있다. 하지만!!! 이는 언제나 맞는 말은 아니다. JavaDoc이 기본 옵션에서 생성한 API문서에는 synchronized 한정자가 포함되지 않기 때문이다. (메서드에 synchronized를 붙이고 말고는 구현 이슈일 뿐, API에 속하는 것이 아니기 때문이다.) 멀티스레드 환경에서도 API를 안전하게 사용하게 하려면, 클래스가 지원하는 스레드 안전성 수준을 정확히 명시해야 한다. 스레드 안전성 수준 나열 ( 안전성이 좋은 순서) 불변(immutabile) 이 클래스의 인스턴스는 마치 상수와 같아서 외부 동기화도 필요 없다. ex) String, Long, BigInteger 무조건적 스레드 안전(uncondit.. 2022. 9. 1.
item 81. wait와 notify보다는 동시성 유틸리티를 애용해라 새로운 사실! wait 그리고 notify는 올바르게 사용하기가 아주 까다롭다. 따라서 고수준 동시성 유틸리티를 사용하는 것이 좋다. wait와 notify란? : 스레드의 상태 제어를 위한 메소드 wait : 가지고 있던 고유 락을 해제하고, 스레드를 잠들게 하는 역할을 하는 메서드 notify : 잠들어 있던 스레드 중 임의로 하나를 골라 깨우는 역할을 하는 메서드 java.util.concurrent의 고수준 유틸리티 실행자 프레임워크 동시성 컬렉션 List, Queue, Map과 같은 표준 컬렉션 인터페이스에 동시성을 가미해 구현한 고성능 컬렉션 높은 동시성에 도달하기 위해 동기화를 각자 내부에서 수행 따라서 동시성 컬렉션에서 동시성을 무력화하는 것은 불가능하다. 외부에서 락을 추가로 사용하면 오.. 2022. 8. 31.
728x90