일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- oracle
- android
- chatGPT's answer
- python
- 고전역학
- 자바암호
- spring integration
- kotlin
- 데이터베이스
- Database
- NIO
- 웹 크롤링
- 소프트웨어공학
- 역학
- 코틀린
- 시스템
- 리눅스
- 인프라
- 자바네트워크
- 자바
- spring data jpa
- GPT-4's answer
- write by GPT-4
- Java
- 유닉스
- 파이썬
- write by chatGPT
- flet
- JVM
- jpa
- Today
- Total
기억을 지배하는 기록
자바 nio - 2 본문
2. nio의 Buffer
1. Buffer 계층도
nio패키지에는 각종 데이터를 담는 Buffer류 클래스들이 있다. 이들 클래스는 모두 Buffer클래스를 상속받는데 버퍼 클래스는 여러 종류가 있어서 각각 기본형 데이터에 맞는 클래스들이 존재한다. 이들은 다음과 같은 클래스 계층도를 가진다.
가장 기본이 되는 클래스는 Buffer 클래스이며 여기에서 기본적인 메서드들이 정의된다. 이를 상속받은 기본형 데이터를 위한 Buffer클래스들이 있다. 단, boolean형에 대한 버퍼는 없다. 전반적인 클래스를 정리해 보자.
2. 클래스의 개요
클래스명 | 정의 |
Buffer | 가장 상위 클래스로서 기본 메서드를 가지고 있다. |
ByteBuffer | byte 버퍼 |
ByteOrder | 저장되는 바이트 순서의 열거 형태에 따른 버퍼 |
CharBuffer | char 버퍼 |
FloatBuffer | float 버퍼 |
IntBuffer | int 버퍼 |
LongBuffer | long 버퍼 |
MappedByteBuffer | 파일의 메모리 맵 영역을 내용으로 하는 direct byte 버퍼(데이터가 저장되는 메모리에 따른 버퍼) |
ShortBuffer | short 버퍼 |
DoubleBuffer | double 버퍼 |
표을 보면 낯설은 클래스가 두개 보인다. 바로 MappedByteBuffer 클래스와 ByteOrder 클래스이다.
먼저 MappedByteBuffer 클래스는 메모리 관리방식이 다른 클래스와 다른데, 버퍼는 만들기에 따라서 자바 가상머신내에 객체가 저장되는 메모리 공간인 Heap 버퍼가 있고 그외 다른 것들(변수들)이 저장되는 일반 버퍼가 있다. 여기서 Heap영역이 아닌 일반 메모리에 직접 접근하는 버퍼를 Direct Buffer라고 표현하는데 이 곳을 메모리 공간을 잡는 클래스이다.
ByteOder 클래스는 데이터가 어떤 순으로 구성될 것인지를 나타낸다. 컴퓨터는 두 바이트이상을 처리할때 처리효율이나 CPU 디자인 상의 문제로 데이터의 앞 바이트부터냐 뒤 바이트부터냐에 대한 해석의 순서에 차이가 있다. 이러한 차이는 데이터를 외부로 보내거나 받을때 영향을 미치기 때문에 데이터를 다루는 버퍼도 이를 고려해야 한다. 앞 바이트를 먼저 처리하는 CPU를 Big endian 이라고 표현하고 뒤 바이트를 먼저 처리하는 CPU는 앞 바이트에서 끝난다고 해서 Little endian 이라 한다. 만약 Little endian으로 동작하는 컴퓨터에서 만든 데이터 파일을 Big endian로 동작하는 컴퓨터에서 읽어 들여야 한다면 ByteOder 클래스로 데이터를 맞추어서 제대로 된 데이터를 얻을 수 있다. ByteOder 클래스의 클래스 메서드인 nativeOrder()메서드는 현재 동작하고 있는 컴퓨터의 CPU가 Big endian인지 Little endian인지 알려준다. 그럼 테스트를 해보자. 당장 메모장을 열고 다음과 같이 코딩을 해보자.........
/* ByteOrder 클래스의 nativeOrder() : 컴퓨터가 데이터를 어떤 순으로 처리하는지 검사 */ import java.nio.*; class BigLittleTest { public static void main(String[] args) { System.out.println("운영체제 종류 : "+System.getProperty("os.name")+"\n"+ "기본이 되는 네이티브의 바이트 순서 :"+ByteOrder.nativeOrder()); } } |
3. 예외 클래스의 개요
버퍼 클래스에서도 예외가 있는데 주로 버퍼가 다 찼을때, 데이터를 집어넣으러고 하는 경우, 버퍼에서 읽어올 데이터가 없을경우 발생하는 예외다. 역시 이들 예외도 클래스로 미리 정의 되어 있다. 다음 표는 버퍼에 관련되 예외 클래스이다.
클래스명 | 정의 |
BufferOverflowException | 데이터를 put()할때 버퍼의 limit에 이르렀을 때 슬로우 되는, 체크되지 않는 예외. |
BufferUnderflowException | 데이터를 get()할때 버퍼의 limit에 이르렀을 때 슬로우 되는, 체크되지 않는 예외. |
InvalidMarkException | 마크가 정의되어 있지 않은 상태로 버퍼를 리셋트 하려고 했을 때에 슬로우 되는, 미검사 예외. |
ReadOnlyBufferException | read 전용의 버퍼상에서 put 나 compact 라고 하는 컨텐츠 변경 메소드가 호출되면, 발생하는 예외. |
BufferOverflowException나 BufferUnderflowException 경우 버퍼 클래스류를 사용하면서 가장 많이 발생하게 될 예외가 될 것이다.....
자, 이제 버퍼 클래스를 자세히 살펴보자. 각 클래스의 메서드들은 파라미터 값만 각 데이터에 맞게 다르고 중복되는 메서드가 많으므로 주요 메서드를 위주로 살펴본다.
자바가상머신은 Big endian이다.... 자바가상머신도 일종의 독립된 컴퓨터이기 때문에 이런 문제를 취급하는데 자바는 어떤 환경이든 실행되어야 한다는 기본 전제가 있다. 그래서 자바 클래스 파일은 실행되는 컴퓨터의 CPU에 관계없이 무조건 Big endian으로 동작하게끔 되어있다. 사실 이런 과정은 자바가상머신이 외부 CPU와 데이터 교환을 할때 자동적으로 처리되므로 사용자가 신경쓸 필요가 없다. |
'오래된글 > Java' 카테고리의 다른 글
자바 nio - 4 (0) | 2018.04.09 |
---|---|
자바 nio - 3 (0) | 2018.04.09 |
자바 nio - 1 (0) | 2018.04.09 |
Java theory and practice: 웹 티어의 상태 복제 (0) | 2018.04.09 |
Java Testing with SPOCK (0) | 2018.04.09 |