Reference/Effective-Java

    [Effective-Java] Chapter12 #86. Serializable을 구현할지는 신중히 결정하라

    직렬화를 지원하기란 짧게 보면 손쉬워 보이지만, 길게 보면 아주 값비싼 일이다. 📌 직렬화 단점 1️⃣ 릴리즈한 뒤에 수정하기 어렵다. 직렬화된 byte stream encoding(직렬화 형태)도 하나의 공개 API가 된다. 기본 직렬화 형태를 사용하면 private와 package-private 인스턴스 필드마저 API로 공개하는 꼴이다. (캡슐화와 정보 은닉성이 깨진다.) 적용 당시 클래스 내부 구형 방식에 영원히 묶이게 된다. 뒤늦게 클래스 내부 구현을 손보면 직렬화 형태가 달라지므로 버전 호환성이 깨진다. 직렬화 형태를 유지하면서 내부 표현을 바꿀 수는 있지만, 어려우면서 지저분한 혹을 남긴다. 직렬화 클래스를 만들 대는 길게 보고 감당할 수 있는 만큼 고품질 직렬화 형태도 주의해서 함께 설계하..

    [Effective-Java] Chapter12 #85. 자바 직렬화의 대안을 찾으라

    이번 챕터를 어떻게 정리하면 좋을까 싶었는데, 직렬화의 개념과 문제점, 그리고 그 대안책인 JSON, 프로토콜 버퍼, 마지막으로 레거시 코드에서 어떻게 대처할 것인가 총 3가지 파트로 분리했다. 📌 직렬화의 문제 🟡 직렬화(Serialization)란? 넓은 의미로는 어떤 데이터를 다른 데이터의 형태로 변환하는 것을 말한다. 이 책에서는 객체의 상태를 byte stream으로의 Serialization, 즉 변환하는 것을 말하고 있다. 반대로 byte stream을 객체의 상태로 변환하는 것을 역직렬화(Deserialization)라고 한다. 🟡 바이트 스트림(Byte Stream)이란? 데이터의 흐름. 데이터 통로. Stream : Client와 Server 같이 출발지와 목적지로 입출력하기 위한 통로..

    [Effective-Java] Chapter11 #84. 프로그램의 동작을 스레드 스케줄러에 기대지 말라

    📌 이식성을 높이는 방법 💡 정확성이나 성능이 스레드 스케줄러에 따라 달라지는 프로그램이라면 다른 플랫폼에 이식하기 어렵다. 실행 가능한 Thread 평균 개수를 Processor 개수보다 지나치게 많아지지 않도록 하라. 그래야 Scheduler가 고민할 거리가 줄어든다. 실행 준비가 된 Thread들은 맡은 작업을 완료할 때까지 계속 실행되도록 만들어라 전체 Thread 수는 훨씬 많을 수 있고, 대기 중인 Thread는 실행 가능하지 않다. (실행 가능한 Thread 수를 구분하라는 의미) 각 Thread가 어떤 유용한 작업을 완료한 후에 다음 일거리가 생길 때까지 대기하도록 만들어라. 실행 가능한 Thread 수를 적게 유지하는 주요 기법 Thread는 당장 처리해야 할 작업이 없다면 실행돼서는 안..

    [Effective-Java] Chapter11 #83. 지연 초기화는 신중히 사용하라

    ⚔️ 지연 초기화는 양날의 검 소프트웨어 시스템은 Application 객체를 제작하고 의존성을 서로 연결하는 준비 과정과 준비 과정 이후에 이어지는 Runtime 로직을 분리해야 한다. 제작(Construction)과 사용(use)은 아주 다르다. 시작 단계는 모든 Application이 풀어야 할 관심사(Concern)다. 지연 초기화는 관심사 분리가 제대로 이루어지지 않는 좀스러운 방법 중 하나다. public Service getService() { if (service == null) service = new MyServiceImpl(); return service; } 장점 실제 필요한 시점에 객체를 생성하므로 불필요한 부하를 줄인다. Class와 Instance 초기화 때 발생하는 순환 문제..