I/O Stream
I/O
- 데이터의 입력(input)과 출력(output)
- 데이터는 한쪽에서 주고 한쪽에서 받는 구조로 되어있음
ㄴ 이 때 입력과 출력의 끝단 : 노드(Node)
ㄴ 두 노드를 연결하고 데이터를 전송할 수 있는 개념 : 스트림(Stream)
- 물의 흐름이나 전기의 흐름과 같은 개념
ㄴ 스트림은 단방향 통신이 가능하며, 하나의 스트림으로 입출력 동시처리 불가
Node Stream
Node Stream
- 입/출력 노드에 직접 연결되는 스트림
- 필수적으로 존재해야 한다!!
노드 스트림은 데이터 타입에 따라 구분
입력 출력
byte InputStream OutputStream
char Reader Writer
보조 스트림
보조 스트림 (필터 스트림)
- 다른 스트림에 부가적인 기능을 제공하는 스트림
- 입출력 필터스트림은 꼭 같은 종류를 사용할 필요 없다.
하지만 입출력 format이 특정 필터에 종속적인 경우엔 쌍으로 써야함
스트림 체이닝 (Stream Chaining)
- 필요에 따라 여러 보조 스트림을 연결해서 사용 가능하다
- 데코레이터 패턴
데코레이터 패턴
데코레이터 패턴
- 구성과 위임을 통해 객체의 기능을 동적으로 확장
- 모든 경우의 수에 따라 클래스를 만드는 것이 아니라,
필요한 기능, 속성으로 클래스를 감싼다.
OCP
⇒ 확장에는 열려 있고, 변경에는 닫혀 있어야 한다.
(확장은 하지만, 그로 인해 발생하는 기존 코드의 변경을 막는다)
ex) 위의 그림에서 커피의 제조법에 따라 Soy(Coffe), Whip(soy), Whip(Whip(coffe)) 등
엄청나게 많은 경우가 생기게 되는데 이때마다 생성자 오버로딩??
⇒ 그렇게 된다면 새로운 조합의 생성 등 변화에 민감해진다!! (OCP 위배)
⇒ 내가 꾸며야 하는 대상의 정보를 주고, 그 대상의 정보를 사용한다.
ex) cost(){
1000 + target.cost();
}
⇒ 객체의 기능을 동적으로 확장
보조 스트림의 종류
보조 스트림의 생성 & 종료
- 이전 스트림을 생성자의 파라미터에 연결하여 생성
ex) new BufferedInputStream(System.in);
new DataInputStream(new BufferdInputStream(new FileInputStream());
- 보조스트림의 close()를 호출하면 노드 스트림의 close()까지 호출
사용할 스트림의 결정 과정
- 노드가 무엇인가 → 타입은 char? or Byte? → 방향이 무엇? → 추가 기능이 필요?
ㄴ 노드 스트림 ㄴ 보조 스트림
객체 직렬화(Serialization)
객체 직렬화
- 객체를 저장하거나, 네트워크로 전송하기 위해 연속적인 데이터로 변환하는 것
ㄴ 객체는 메모리 영역에 있고, reference를 저장하는데 그걸 보낼 순 없으니...
- 반대의 경우는 역 직렬화라고 부른다.
- 객체의 meta 정보를 가지고 있다.
⇒ 데이터를 일렬로 저장하고 metadata와 함께 보내면, 받는 쪽에서 metadata를 확인하여
새로운 객체를 만들고, 값을 넣는다.
직렬화되기 위한 조건
- Serializable 인터페이스를 구현할 것
- 클래스의 모든 멤버가 직렬화 가능해야함 (Serializable 인터페이스 구현)
- 직렬화에서 제외하려는 멤버는 transient 선언
객체 직렬화 serialVersionUID
SerailVersionUID
- 클래스의 변경 여부를 파악하기 위한 유일 키
- 직렬화 할 때의 UID와 역 직렬화 할 때의 UID가 다를 경우 예외 발생
- 직렬화하는 객체에 UID가 설정되지 않을 경우 컴파일러가 자동 생성
ㄴ 멤버 변경으로 인한 컴파일 시 변경됨 ⇒ Invalid Class Exception 초래
⇒ 직렬화되는 객체에 대해서 serialVersionIUID 설정을 권장
XML
XML
- extensible Markup language
- HTML과 다른 점
ㄴ 필요한 태그를 확장해서 사용 가능
ㄴ 정확한 문법을 지켜야 동작 (Well formed)
기본 문법
- 문서의 시작 <?xml version="1.0" encoding="UTF-8"?>로 함
- 반드시 root element가 존재해야 함
ㄴ 나머지 태그들은 Tree 형태로 구성
- 시작 태그와 종료 태그는 일치해야함
- 시작 태그는 key-value 구조의 속성을 가질 수 있음
ㄴ 속성 값은 " " 또는 ' ' 로 묶어서 표현한다.
- 대소문자를 구별한다.
파싱 - SAX parser
SAX parser
- Simple API for XML parser
- 문서를 읽으면서 태그의 시작, 종료 등 이벤트 기반으로 처리하는 방식
파싱 - DOM parser
DOM parser
- Document Object Model
- 문서를 다 읽고 난 후 구조 전체를 자료구조에 저장하여 탐색하는 방식