14 Aug 2023 EffectiveJava
어떤 클래스의 인스턴스를 직렬화할 수 있게 하려면 클래스 선언에 implements Serializable만 덧붙이면 된다.
직렬화를 지원하기란 짧게 보면 손쉬워 보이지만, 길게보면 아주 값비싼 일이다.
Serializable
Serializable을 구현하면 릴리스한 뒤에는 수정하기 어렵다.
Serializable을 구현하면 직렬화된 바이트 스트림 인코딩도 하나의 공개 API가 된다. 그래서 이 클래스가...
14 Aug 2023 EffectiveJava
직렬화의 도입
1997년, 자바에 처음으로 직렬화가 도입되었다. 처음엔 다소 위험하다는 이야기가 나왔지만, 프로그래머가 어렵지 않게 분산 객체를 만들 수 있다는 구호는 매력적이었고, 지지자들은 장점이 위험성을 압도한다고 생각했다.
직렬화의 위험성
보안 문제는 실제로도 우려한 만큼 심각한 것으로 밝혀졌다. 2000년대 초반에 논의된 취약점들이 그 후로...
14 Aug 2023 EffectiveJava
여러 스레드가 실행 중이면 운영체제의 스레드 스케줄러가 어떤 스레드를 얼마나 오래 실행할지 정한다.
정상적인 운영체제라면 이 작업을 공정하게 수행하지만 구체적인 스케줄링 정책은 운영체제마다 다를 수 있다.
정확성이나 성능이 스레드 스케줄러에 따라 달라지는 프로그램이라면 다른 플랫폼에 이식하기 어렵다.
이식성 좋은 프로그램 작성법
견고하고 빠릿하고 이식성...
12 Aug 2023 EffectiveJava
지연초기화(lazy initialization)
필드의 초기화 시점을 그 값이 처음 필요할때까지 늦추는 기법. 정적 필드와 인스턴스 필드 모두에 사용할 수 있다.
그래서 지연초기화를 하는 값이 전혀 쓰이지 않으면 초기화도 결코 일어나지 않는다. 지연초기화는 주로 최적화 용도로 쓰이지만, 클래스와 인스턴스 초기화 때 발생하는 위험한 순환...
02 Aug 2023 EffectiveJava
API문서에서 아무런 언급도 없으면 그 클래스 사용자는 나름의 가정을 해야만 한다.
만약 그 가정이 틀리면 클라이언트 프로그램은 동기화를 충분히 하지 못하거나 지나치게 한 상태이며, 두 경우 모두 심각한 오류로 이어질 수 있다.
스레드 안정성 문서화
API 문서에 synchronized 한정자가 보이는 메서드는 스레드 안전하다는...