Search
Duplicate
😀

11. I/O 스트림, 직렬화, 데코레이터 패턴, XML 파싱

태그
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 - 문서를 다 읽고 난 후 구조 전체를 자료구조에 저장하여 탐색하는 방식