JavaBookStudy / JavaBook

책읽기 스터디
https://javabookstudy.github.io/
Apache License 2.0
19 stars 2 forks source link

[Effective Java] Item 87. 객체의 물리적 표현과 논리적 표현의 차이 #54

Closed taxol1203 closed 3 years ago

taxol1203 commented 3 years ago

코드 87-2는 물리적 표현과 논리적 표현의 차이가 달라, 기본 직렬화 형태에 적합하지 않은 클래스라고 되어있습니다.

public final class StringList implements Serializable {
    private int size = 0;
    private Entry head = null;

    private static class Entry implements Serializable {
        String data;
        Entry next;
        Entry previous;
    }
    // ... 생략
}

위 클래스는 논리적으로 문자열을 표현했고 물리적으로는 문자열들을 이중 연결 리스트로 표현했다. 이 클래스에 기본 직렬화 형태를 사용하면 각 노드에 연결된 노드들까지 모두 표현할 것이다. 따라서 객체의 물리적 표현과 논리적 표현의 차이가 크다

위 설명을 읽어봐도 논리적과 물리적 표현의 차이라는 것이 정확이 뭘 말하는지 모르겠습니다.

jth2747 commented 3 years ago

아이템 87에서 물리적 표현과 논리적 내용이 같은 예시로 Name class가 언급되어 있습니다. 성명은 논리적으로는 이름, 성, 중간이름으로 구성되고 물리적으로는 인스턴스가 각 구성요소를 잘 표현했습니다. 이런 경우에 물리적 표현과 논리적 내용이 같다고 말할 수 있습니다. 그런데 stringList class는 논리적으로는 단순히 문자열의 리스트를 나타내는 것이나, 이 논리적 형태를 물리적 표현 형태로 잘 나타내기 위해 양방향 연결리스트를 사용하였습니다. 코드로 잘 나타내기 위해 사용한 물리적인 표현 형태가 기존의 논리적인 형태랑 많이 달라진 경우라고 할 수 있겠습니다.

그래서 462p에 나온 stringList class의 합리적인 직렬화 형태가, writeObject와 readObject 메소드로 리스트 크기를 입력 후, 이어서 모든 원소(string)를 순서대로 기록하여, 말 그대로 문자열의 리스트를 나타내는 논리적 형태를 잘 따른 형태가 되는 것 같습니다.