개발/Spring

Serializable, NIO

728x90

 

생성한 객체를 파일로 저장할 일, 다른 서버에서 생성한 객체를 받을 일, 보낼일, 이럴 때 꼭필요한 것이 serializable 이다.

파일을 읽거나 쓰거나 보내거나 받도록 하려면 반드시 이 인터페이스를 구현해야한다.

 

이 인터페이스를 구현해야만 JVM 에서 해당 객체는 저장하거나 다른 서버로 전송할 수 있도록 해준다.

 

 

ObjevctOutputStream 이라는 클래스를 사용하면 객체를 저장할 수 있다.

ObjevcInputStream 은 객체를 읽을 수 있다.

 

 

transient라는 예약어는 Serializable과 떨어질 수 없는 관계이다.

 

객체를 저장하거나 다른 JVM으로 보낼 때 , transient라는 예약어를 사용하여 선언한 변수는 Sereialiable의 대상에서 제외된다.

 

해당 객체를 생성한 JVM에서 사용할 때에는 이 변수를 사용하는데 전혀 문제가 없다. 예를 들어 패스워드를 보관하고 있는 변수가 있다고 하면 이 변수가 저장되거나 전송되면 보안상 문제가 발생할 수 있다. 따라서 이렇게 보안상 중요한 변수나 꼭 저장해야할 필요가 없는 변수는 transient를 사용할 수 있다.

 

 

NIO는 채널과 버퍼를 사용한ㄴ다.

 

 

채널은 물건을 중간에서 처리하는 도매상이라고 생각하면 된다.

버퍼는 도매상에서 물건을 사고, 소비자에게 물건을 파는 소매상이라고 생각하면 된다.

 

우리는 대부분 소매상과 거래하고, 도매상을 만날일이 없다.

 

자바 NIO에서 데이터를 주고 받을 때에는 버퍼를 통해 처리한다.

 

스트림은 한 방향으로 통신이 가능하여 입력과 처리를 동시에 할 수 없다.

 

IO에서 바이트 스트림과 문자 스트림으로 데이터를 읽은 것과는 다르게 NIO에서는 채널을 통해 데이터를 읽고 쓴다.

 

채널과 스트림의 차이점 :

1. 채널은 읽고 쓰는 것이 모두 가능한 양방향임.

2. 채널은 비동기적으로 읽고 쓸 수 있다.

3. 채널은 항상 버퍼에서 부터 읽거나 버퍼로 쓴다.

 

 

버퍼 : 채널과 상호작용할 때 사용되는 것.채널에서 버퍼로 읽거지거나, 버퍼에서 읽혀 채널로 쓰여진다.

 

하나의 쓰레드가 데이터를 버퍼로 읽어 들이거나 쓰는 동안 해당 쓰레드는 다른 자겅ㅂ을 진행할 수 있는 특징을 가지고 있다.

 

 

 

NIO의 Buffer 클래스

 

int capacity 버퍼에 담을 수 있는 크기 리턴

int limit 버퍼에서 읽거나 쓸 수 없는 첫 위치 리턴

int position 현재 버퍼의 위치 리턴

 

position은위치가 있다. 버퍼에 데이터를 담거나 읽는 작업ㅇ르 수행하면 현재의 위치가 이동한다.

그래야 그 다음 위치에 있는 것을 바로 쓰거나 읽을 수 있기 때문이다.

 

0<= mark <= positoin <= limit <= capacity

 

 

flip -> limit 값을 현재의 포지션으로 지정하고 포지션을 가장 앞인 0으로 이동

mark -> 현재 포지션을 mark

 reset -> 버퍼의 포지션을 mark한곳으로 이동

rewind -> 현재 버퍼의 position을 0으로 이동

remaining -> limit - position 계산

hasRemaining -> position와 limit값에 차이가 있을 경우 트루 리턴

clear -> 버퍼를 지우고 positon 0, limit의 값을 버퍼의 크기로 변경

 

 

 

 

'개발 > Spring' 카테고리의 다른 글

자바 상속  (0) 2021.04.06
패키지와 접근 제어  (0) 2021.04.06
자바 참조 자료형  (0) 2021.04.05
자바 배열  (0) 2021.04.05
자바 소켓  (0) 2021.03.21