* 32. 객체 출력하기
직접만든 클래스인 DataOutputStream 을 기존 java의 패키지인
ObjectOutputStream으로 교체해준다.
이렇게함으로써 형변한 과정을 코드로해주는 것이 아니라 java의 패키지가 진행해준다.
또한 인스턴스를 사용하지 않는 메소드라 해도 non-static으로 만들어주는 것이 좋다.
나중에 재사용할지도모르기 때문이다.
* 버전 번호 명시 java.io.Serializable
Serializable 은 버전 번호를 명시해주는 것이다.
* serializableUID 스태틱 필드
만약 생성한 serializable UID의 버전번호와 읽어들일 데이터의 버전이 다르다면
오류가 발생한다.
이전 버전으로 serializable 한 데이터를 새 버전의 인스턴스로 읽어들이기 싫다면
버전 번호를 달리하라 !
* 33. 텍스트 포맷(csv)으로 입출력 하기
* 34. Refactoring : ① Information Expert
기존 App.java 클래스의 메소드
private void saveBoard(String filename, List<Board> list) {
try {
FileOutputStream out0 = new FileOutputStream(filename);
BufferedOutputStream out1 = new BufferedOutputStream(out0); // <== Decorator(장식품) 역할 수행!
DataOutputStream out = new DataOutputStream(out1); // <== Decorator(장식품) 역할 수행!
out.writeShort(list.size());
for (Board board : list) {
out.writeInt(board.getNo());
out.writeUTF(board.getTitle());
out.writeUTF(board.getContent());
out.writeUTF(board.getWriter());
out.writeUTF(board.getPassword());
out.writeInt(board.getViewCount());
out.writeLong(board.getCreatedDate());
}
saveBoard 를 Information Expert 리팩토링 기법을 적용하여
Board.java 클래스에 메소드로 만들어준다.
saveMember 를 Information Expert 리팩토링 기법을 적용하여
Member.java 클래스에 메소드로 만들어준다.
List <member> X
member만 들어오기 때문에 saveCsv를 구현할 수 없다 !
List <board> X
board만 들어오기 때문에 saveCsv를 구현할 수 없다 !
List<?> X
① String 클래스는 CsvObject의 자손이 아니기 때문에 saveCsv를 구현할 수 없다 !
② String 클래스는 CsvObject의 인터페이스를 구현하지 않아서 saveCsv를 구현할 수 없다 !
List<? extends CsvObject> O
CsvObject의 인터페이스를 구현한 클래스이어야 한다.
여기서, "?" 라는 와일드카드 뒤에 오는 것이 인터페이스든 클래스든
무조건 extends 로 확장해주어야한다.
<CsvObject 인터페이스>
<CsvObject 인터페이스를 상속받는 Member 와 Board>
<CsvObject 인터페이스 규칙에 따라서 실행하는 각 메소드>
<obj 객체에 담긴 Member 또는 Board 의 toCsvString 메소드를 실행>
* Factory Method 패턴 적용
<Member 클래스에 메서드를 추가>
<App 클래스에 메서드를 리팩토링>
② Factory Method (GOF)