[F-lab 모각코 챌린지 38일차] TIL

JeongheeKim·2023년 7월 8일

TIL

목록 보기
38/66

학습계획


  • Serializable
  • transient
  • New IO

Today I Learned


Serializable

  • java.io패키지에 있으며 클래스가 파일을 읽기/쓰기 작업을 할때나, 다른 서버로 보내고 받을때 반드시 Serializable 인터페이스를 구현해야한다.
  • Serializable 인터페이스 구현되어, JVM 에서 해당 객체는 저장하거나 다른 서버로 전송할 수 있게 한다.
  • Serializable 인터페이스 구현 함과 동시에 serialversionUID값을 지정하는것을 권장한다. 이는 컴파일 시 자동으로도 생성된다. 이는 해당객체의 버전을 명시한다.
    static final long serialversionUID = 1L;
  • 객체의 형태가 변경되면 컴파일 시 serialversionUID가 새로 생성된다.
  • 데이터의 구조가 변경되면 serialversionUID를 변경해줘야 하지만, IDE에서 자동으로 변경되도록 도와준다.

transient

  • 해당 키워드를 사용하면 Serializable 대상에서 제외된다.

New IO

  • jdk1.4에서 java.nio패키지에 소개되었다.
  • 효율적으로 low-level I/O 방식으로 최신 운영체제에서 사용될 수 있도록 개발하였다.
  • Channel 사용
    • 데이터의 흐름이 양방향, 하나의 채널로 데이터 읽고 쓰기가 가능
  • 예제 설명
    1. 작성할 데이터를 byte배열로 변경한다.
    2. 바이트 배열을 buffer공간에 wrap이란 메소드로 전달한다.
    3. channel 객체를 통해 buffer객체를 넘겨준다.
package ch27;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class NioSample {
    public static void main(String[] args) {
        NioSample sample = new NioSample();
        sample.basicWriteAndRead();
    }

    private void basicWriteAndRead() {
        String fileName = "/Users/jeongheekim/Downloads/test/nio.txt";
        try {
            writeFile(fileName,"My first NIO file");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void writeFile(String fileName, String data) throws IOException {
        FileChannel channel = new FileOutputStream(fileName).getChannel();
        byte[] bytes = data.getBytes();//1
        ByteBuffer buffer = ByteBuffer.wrap(bytes);//2
        channel.write(buffer);//3
        channel.close();//자원반납
    }
}
  • buffer 공간 사용
    • buffer
      • 데이터를 임시로 저장하는 메모리 공간으로 입출력 작업이나 데이터 처리 시 사용
      • java heap메모리에 존재 = GC의 관리는 받는 영역이어서 buffer에서 사용되지 않는 공간은 GC에의해 정리됨
      • ByteBuffer이외에도, CharBuffer, DoubleBuffer, FloatBuffer등이 있다.
    • buffer 공간에 데이터를 읽고 써서 성능이 좋다.
      • buffer 내에서 데이터 위치를 이동하면서 필요한 부분의 데이터만 읽고 쓸 수 있다.
  • 동기 / 비동기 방식 모두 지원
  • blocking / non-blocking 방식 모두 지원
    • thread를 종료하는 방식인 interrupt를 사용해서 블로킹 상태를 빠져나갈 수 있다.
  • 적절한 사용 예시
    • 연결 클라이언트 수가 많을때
    • 전송되는 데이터가 적을 경우
    • 입출력 작업 처리가 빨리 끝날 경우

❓NIO방식이 IO에 비해 어떤 이유로 인해 그렇게 빠른가?

  1. Buffer 공간 사용
    1. buffer 공간에서 데이터 청크를 읽고 쓸수 있으므로 시스템 호출을 줄일 수 있어서 NIO 성능이 향상 될 수 있다.
      1. 시스템 호출을 줄인다는것은 user ↔ kernerl 사이의 컨텍스트 스위칭 횟수를 줄일 수 있다.
      2. IO작업은 시스템 호출을 통해 커널에 의해 처리됨.
  2. Non-blocking 방식 사용
    1. I/O작업 시 대기하지 않고 다양한 I/O작업을 싱글 스레드에서 작업 할 수 있기 때문

[연습문제]

java.io.Serializable을 import 하는 이유는 무엇인가요?*

  • 클래스가 파일에 읽고 쓸 수 있도록 하거나, 다른 서버로 보내거나 받게 하기 위함

java.io.Serializable의 serialVersionUID 를 지정하는 이유는 무엇인가요?*

  • 객체의 버전 명시를 위해

자바에서 객체를 파일로 읽거나 쓸 때 사용하는 Stream 클래스 이름은 무엇인가요?*

  • FileInputStream, FileOutputStream

transient 예약어의 용도는 무엇인가요?*

  • 객체의 직렬화 대상에서 제거하기 위해서

NIO가 생긴 이유는 무엇인가요?*

  • I/O에서 사용한 스트림 대신 채널과 버퍼를 대신하여 속도를 개선하기 위해

NIO에서 Channel의 용도는 무엇인가요?*

  • 데이터 중간 처리 역할. 일종이 도매상

NIO에서 Buffer의 용도는 무엇인가요?*

  • 데이터를 처리하기 전에 잠시 담는 역할

NIO에서 Buffer의 상태를 확인하기 위한 메소드들에는 어떤 것들이 있나요?*

  • capacity() : 버퍼에 담을 수 있는 크기 리턴
  • limit() : 버퍼에서 읽거나 쓸 수 없는 첫 위치 리턴
  • position() : 현재 버퍼의 위치 리턴

NIO에서 Buffer의 position을 변경하기 위한 메소드들에는 어떤 것들이 있나요?*

  • flip(), mark(), reset(), rewind(), remaining(), hasRemaining(), clear()

[참고]

https://www.educative.io/answers/what-is-the-javanio-package

0개의 댓글