[I/O] Stream - Filter

포키·2023년 1월 26일
1

국비과정

목록 보기
42/73

컴파일에 대해서
컴파일은 단순히 java 코드를 bytecode로 바꾸는 과정이 아님.
ex) re-ordering : 성능 상의 이유로 작성된 javaCode의 순서를 바꾸어 bytecode로 작성함.


Filter

: 다른 Stream을 받아 변환하는 Stream.
생성자로 다른 Stream을 받아오는 것이 특징! (입력장치, 출력장치에 바로 연결되지 않는다!)

  • 데코레이터 패턴
  • Filter 개념 그림 by 강사님

BufferedReader / BufferedWriter

  • 버퍼를 사용하는 스트림
  • 줄단위 읽기를 가능하게 해줌

DataInputStream / DataOutputStream

  • 기초 자료형으로 읽고 쓰는 기능을 가진 Stream 클래스 (filter)
  • 여러개의 데이터를 자료형을 통해 구분하여 읽어올 수 있다.
    (=데이터 간의 경계를 스트림이 자체적으로 인지하는 셈)
    • 데이터를 쓸 때는, 데이터를 읽을 때도 고려해야 한다.
      파일로 작성된 데이터를 읽어올 때는, 데이터를 각각 분리하여 읽어올 필요가 있다.
      (하나의 파일 안에는 여러 데이터가 존재할 것. 그것을 전체 문자열로 읽어온 후 분리하기보다, 미리 분리하여 하나씩 가져올 수 있다면 더 편리함.)

메서드

  • readInt() / writeInt() : int 읽기/쓰기
  • readDouble() / writeDouble() : Double 읽기/쓰기
  • readBoolean() / writeBoolean() : boolean 읽기/쓰기
  • readUTF() / writeUTF() : 문자열(한글 포함) 읽기/쓰기

ObjectInputStream / ObjectOutputStream

  • 객체직렬화(Serialization) : 객체를 byte로 write하고, 그 파일을 다시 read하여 객체를 가져온다.
    = 물리적으로 다른 프로그램이 논리적으로 하나의 프로그램이 될 수 있다.
  • 객체 -> 파일 : Marshalling
    파일 -> 객체 : Unmarshalling
  • 객체와 객체의 멤버변수, 원소가 모두 Serializable을 구현해야 한다
    💥💥작성은 간단하지만, 사용을 위해 지불해야 하는 값이 비싸다. (사용 조건이 까다롭다)💥💥
  • RMI : Remote Method Invocation - 분산 컴퓨팅의 근간이 되는 기술
  • Serializable : 내용이 없는 마커 인터페이스. 직렬화 가능 여부를 알려줌.
  • externalizable : 직렬화 지원하는 인터페이스
    마커 인터페이스가 아니어서 사용이 불편 -> 보통 Serializable을 사용한다.

메서드

  • readObject()
  • writeObject()
  • reset() : writeObject() 뒤에 flush()와 함께 붙여줄 것

ClassNotFoundException

  • 객체를 복사하는 과정에서 Class 정보(=설계도)가 존재하지 않을 때 나타나는 예외

    class Class : 멤버변수, 메서드, 생성자와 같은 '클래스'의 정보를 저장하는 클래스
    객체정보(=멤버변수 값)을 가지는 게 아님!

InvalidClassException

  • 클래스 버전이 일치하지 않을 때 나타나는 예외 (버전관리의 중요성!!!)
  • 버전 일치 여부는 serialVersionUID : long 으로 판단
  • 따로 값을 정하지 않으면, '컴파일 할 때마다' 자동으로 버전이 매겨짐 (by 컴파일러)
  • 버전을 붙이는 기준은 '멤버변수'!
  • 객체와 객체의 멤버변수, 원소의 S.UID까지 모두 일치해야 한다

클래스 버전(serialVersionUID) 관리
컴파일러가 버전을 관리함 : 엄격한 검증이 이뤄지므로 문제 생길 여지가 적음
사람이 버전을 관리함 : 자유로운 사용 but 문제가 생기면 결과를 책임져야 함

transient 의 의미
직렬화에서 배제됨 (=복사될 때 초기값이 들어감)

주의점

  • UI(Swing Component)를 직접 복사할 수 없음
    ex) setVisible(true)를 설정한 후 복사해도 다시 setVisible(true) 해줘야 함
    (저장되지 않음 = 멤버변수가 아님)
  • UI가 아닌 UI의 정보(ex) Dimension, Border, Font 등)를 복사하여 새로 생성한 UI에 적용해야 함.
profile
welcome

0개의 댓글