🤓 스터디/이펙티브 자바38 [아이템 88] readObject 메서드는 방어적으로 작성하라 코드 8-1 방어적 복사를 사용하는 불변 클래스 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 start, Date end) { this.start = new Date(start.getTime()); this.end = new Date(end.getTime()).. 2023. 5. 8. [아이템 87] 커스텀 직렬화 형태를 고려해보라 먼저 고민해보고 괜찮다고 판단될 때만 기본 직렬화 형태를 사용하라 클래스가 Serializable을 구현하고 기본 직렬화 형태를 사용한다면 현재의 구현에 종속적이게 된다. 즉, 기본 직렬화 형태를 버릴 수 없게 된다. 따라서 유연성, 성능, 정확성과 같은 측면을 고민한 후에 합당하다고 생각되면 기본 직렬화 형태를 사용해야 한다. 일반적으로 직접 설계하더라도 기본 직렬화 형태와 거의 같은 결과가 나올 경우에만 기본 형태를 사용해야 한다. 기본 직렬화 선택에 적합한 경우 기본 직렬화 형태는 객체가 포함한 데이터뿐만 아니라 그 객체를 시작으로 접근할 수 있는 모든 객체와 객체들의 연결된 정보까지 나타낸다. 그러나, 이상적인 직렬화 형태라면 물리적인 모습과 독립된 논리적인 모습만을 표현해야 한다. 객체의 물리적.. 2023. 5. 8. [아이템 86] Serializable을 구현할지는 신중히 결정하라 💡클래스의 인스턴스를 직렬화하는 방법 : 클래스 선언에 implements Serializable 덧붙이기 Serializable을 구현하면 수정하기 어렵다. 클래스가 Serializable을 구현하면 직렬화된 바이트 스트림 인코딩(직렬화 형태)도 하나의 공개 API가 된다. 이 클래스가 널리 퍼진다면 그 직렬화 형태도 영원히 지원해야 하는 것이다.(공개 API처럼) 커스텀 직렬화 형태를 설계하지 않고 자바의 기본 직렬화 형태를 사용하면 클래스의 private과 package-private 인스턴스 필드마저 API로 공개하는 꼴이 된다.(캡슐화 깨짐) Serializable 구현의 문제점 👿 버그와 보안 구멍이 생길 위험이 높아진다. 객체는 생성자를 사용해 만드는 게 기본이다. 즉, 직렬화는 언어의 기본.. 2023. 5. 2. [아이템 85] 자바 직렬화의 대안을 찾으라 💡직렬화(Serializable)란? 어떤 데이터를 다른 데이터의 형태로 변환하는 것인데, 책에서는 객체의 상태를 바이트 스트림으로 변환하는 것을 의미한다. (바이트 스트림에서 객체의 상태로 변환하는 것은 역직렬화(Deserializable)이다.) 💡바이트 스트림이란? 1byte(컴퓨터에서 기본으로 처리되는 최소 단위)를 입출력할 수 있는 스트림이다. 자바에서 입출력 스트림을 통해 흘러가는 데이터의 기본단위이고 일반적으로 바이트로 구성된 파일, 즉 동영상, 이미지, 음악 파일을 처리하기 적합한 스트립이다. (클래스 이름에 Stream이 붙으면 바이트 스트림을 처리하기 위한 클래스) 이번 아이템 주제는 딱 한 문장으로 요약된다. "... 여러분이 작성하는 새로운 시스템에서 자바 직렬화를 써야 할 이유는 .. 2023. 5. 2. [아이템 77] 예외를 무시하지 말라 API 설계자가 메서드 선언에 예외를 명시하는 까닭은, 그 메서드를 사용할 때 적절한 조치를 취해달라고 말하는 것이다. 예외를 무시하기 예) catch 블록을 비워두면 예외가 무시된다. try{ ... }catch(SomeException e){ } 예외는 문제 상황에 대처하기 위해 존재하는데 catch 블록을 비워두면 예외가 존재할 이유가 없어진다. 만약 예외를 무시하기로 했다면 catch 블록 안에 그렇게 결정한 이유를 주석으로 남기고 예외 변수의 이름도 ignored로 바꿔놓자 Future f = exec.submit(planaMap::chromaticNumber); int numColors = 4; try{ numColors = f.get(1L, TimeUnit.SECONDS); }catch(Ti.. 2023. 4. 27. [아이템 76] 가능한 한 실패 원자적으로 만들라 메서드가 실패하더라도 해당 객체는 메서드 호출 전 상태(정상적으로 사용할 수 있는 상태)를 유지해야 한다. 이러한 특성을 실패 원자적(failure-atomic)이라고 한다. 실패 원자적으로 만드는 방법 ✅ 메서드를 불변 객체로 설계하기 메서드가 실패하면 새로운 객체가 만들어지지 않고, 기존 객체가 불안정한 상태에 빠지는 일도 결코 없다. 불변 객체의 상태는 생성 시점에 고정되어 절대 변하지 않기 때문이다. ✅ 가변 객체의 메서드의 작업 수행 전에 매개변수의 유효성을 검사하기 객체의 내부 상태를 변경하기 전에 잠재적 예외의 가능성 대부분을 걸러낼 수 있다. ✅ 객체의 임시 복사본에서 작업을 수행한 다음, 작업 성공 후 원래 객체와 교환하기 데이터를 임시 자료구조에 저장해 작업하는 게 더 빠를 때 적용하기.. 2023. 4. 27. 이전 1 2 3 4 ··· 7 다음