스트림은 바이트단위로 데이터를 전송하며 입출력 대상에 따라 다음과 같은 입출력 스트림이 있다.
어떠한 대상에 대해서 작업을 할 것인지 그리고 입력을 할 것인지 출력을 할 것인지에 따라서 해당 스트림을 선택해서 사용하면 된다.
이들은 모두 InputStream 또는 OutputStream의 자손들이며, 각각 읽고 쓰는데 필요한 추상메서드를 자신에 맞게 구현해 놓은 것들이다.
IO는 기본적으로 버퍼를 지원하지 않기 때문에, 버퍼를 제공해주는 보조스트림을 이용합니다.
한 문자를 의미하는 char형이 2byte이기 때문에 바이트기반의 스트림으로 2byte인 문자를 처리하는 데는 어려움이 있다.
이 점을 보완하기 위해서 문자기반의 스트림이 제공된다. 문자 데이터를 입출력할 때는 바이트 기반 스트림 대신 문자기반 스트림을 사용한다.
문자기반 스트림이라는 것이 단순히 2byte로 스트림을 처리하는 것만을 의미하지 않는다.
문자 데이터를 다루는데 필요한 또 하나의 정보는 인코딩으로 문자기반 스트림, 즉 Reader/Writer 그리고 그 자손들은 여러 종류의 인코딩과 자바에서 사용하는 유니코드간의 변환을 자동적으로 처리해준다. Reader는 틀정 인코딩을 읽어서 유니코드로 변환하고 Writer는 유니코드를 특정 인코딩으로 변환하여 저장한다.
객체를 저장한다는 것은 무엇을 의미하는가에 대해서 정리하고 넘아가자면 객체는 클래스에 정의된 인스턴스 변수의 집합입니다.
객체에는 클래스 변수나 메서드가 포함되지 않습니다. 객체는 오직 인스턴스 변수들로만 구성되어 있는데, 그 이유는 인스턴스 변수는 인스턴스마다 다른 값을 가질 수 있어야 하기 때문에 별도의 메모리 공간이 필요하지만 메서드는 변하는 것이 아니라서 메모리를 낭비해 가면서 인스턴스마다 같은 내용의 메서드를 포함시킬 이유가 없습니다,
따라서 객체를 저장한다는 것은 바로 객체의 모든 인스턴스변수의 값을 저장한다는 것이고, 저장한 객체를 다시 생성하려면 객체를 생성한 후에 저장했던 값을 읽어서 생성한 객체의 인스턴스 변수에 저장하면 되는 것
여기서 비효율적인 부분이 보이는데 커널 영역의 데이터를 포르세스 안의 버퍼로 저장하는 일이다. 커널 영역의 버퍼를 직접 전근할 수 있다면 굳이 프로세스 안의 버퍼로 복사하면서 cpu를 낭비하지 않아도 되고, GC 관리도 필요없어지게 된다. 또 하나의 문제는 위 프로세스를 거치는 동안 작업을 요청한 쓰레드가 블록킹 된다는 것이다.
'자바' 카테고리의 다른 글
모던 자바 - Reactive Programming 리액티브 프로그래밍 - java 9 Flow (0) | 2021.08.25 |
---|---|
매일 써도 잘 몰랐던 Java Map에 관한 스터디 (rehashing, 해싱, hashmap, loadfactor, doubling) (0) | 2021.08.03 |
자바 객체의 생성과정(라이플 사이클) / Strong Reference & Weak Reference / 객체와 메모리 (0) | 2021.06.25 |
Java Volatile And Atomic - 멀티스레딩 환경에서.. (0) | 2021.05.18 |
Java Singleton 의 7가지 패턴 (0) | 2021.05.17 |