Java 7에 추가된 것들
Fork / Join
- Java 7에서 추가된 클래스 중 Fork / Join과 관련된 클래스들이 존재한다.
- Fork / Join은 어떤 계산 작업을 할 때 "여러 개로 나눠 계산한 후 결과를 모으는 작업"이다.
- Fork는 여러개로 나누는 것
- Join은 나눠 작업한 결과를 모으는 것
- Fork / Join에 Work stealing 개념이 포함되어 있다.
- Work stealing : 작업의 여유가 있는 Queue에서 작업이 많은 Queue의 작업들을 가져가서 일을 하는 것을 의미한다.
// Fork / Join 작업의 기본 개념
if (작업의 단위가 충분히 작을 경우) {
해당 작업을 수행
} else {
작업을 반으로 쪼개어 두 개의 작업으로 나눔
두 작업을 동시에 실행, 두 작업이 끝날 때까지 결과를 기다림
}
- Fork / Join 작업의 기본 개념으로 회귀적으로 수행될 때 많이 사용된다.
- Fork / Join 기능은 java.util.concurrent 패키지의 RecursiveAction과 RecursiveTask라는 abstract 클래스를 사용해야 한다.
- RecursiveTask 클래스는 V라는 타입으로 결과가 리턴된다.
- RecursiveAction 클래스는 결과를 리턴하지 않고 제네릭을 사용하지 못한다.
- 두 클래스 모두 compute()라는 메소드가 재귀 호출되고 연산을 수행한다.
- 두 클래스 모두 ForkJoinTask 클래스를 확장하고 있다.
- ForkJoinTask 클래스
- Future 인터페이스를 구현했다.
- 비동기적인 요청을 하고 응답을 기다릴 때 사용하는 인터페이스
- Future 인터페이스를 구현했다.
동기(Synchronous): 작업이 순차적으로 진행되는 방식
한 작업이 시작되면 완료될 때까지 다른 작업이 기다려야 한다.
비동기 (Asynchronous) : 작업이 독립적으로 진행되는 방식
작업의 완료 여부를 기다리지 않고 다른 작업을 시작할 수 있다.
IO, 네트워크 요청과 같이 시간이 오래걸리는 작업에 유용하다.
- 작업을 수행하는 클래스를 만든 후 ForkJoinPool 클래스를 사용해 작업을 한다.
Fork / Join 클라이언트 밖에서 호출 | Fork / Join 클라이언트 내에서 호출 | |
비 동기적 호출 수행 시 | execute(ForkJoinTask) | ForkJoinTask.fork() |
호출 후 결과 대기 | invoke(ForkJoinTask) | ForkJoinTask.invoke() |
호출 후 Future 객체 수신 | submit(ForkJoinTask) | ForkJoinTask.fork() |
- Fork / Join은 복잡한 연산을 여러 쓰레드에서 실행하기 위해서 만든 것.
- 계산이 복잡할수록 효과가 크고 쓰레드를 관리할 필요가 없다는 장점이 있다.
NIO2
- NIO2 에서는 File 클래스의 미흡한 부분을 보완하기 위해 파일의 속성을 다루고 심볼릭 링크를 처리할 수 있는 기능을 제공하며 어떤 파일이 변경됐는지 확인하기 쉽게 WatchService 클래스를 제공한다.
- NIO2에서 File 클래스를 대체하는 클래스로 Paths, Files, FileSystems, FileStore 클래스가 제공된다.
- Paths : static get() 메소드로 파일과 경로에 대한 정보를 갖고 있는 Path 인터페이스 객체를 얻을 수 있다.
- Files : 기존 File 클래스를 보완한 클래스로 Path 객체를 사용해 파일을 통제하는데 사용한다.
- FileSystems : 현 사용중인 파일 시스템에 대한 정보를 처리하는데 필요한 메소드를 제공한다.
static getDefault()메소드로 현 사용중인 기본 파일 시스템 정보를 갖고 있는 FileSystem 인터페이스 객체를 얻을 수 있다. - FileStore : 파일을 저장하는 디바이스, 파티션, 볼륨 등에 대한 정보를 확인하는데 필요한 메소드를 제공한다.
- Paths 클래스에는 생성자가 없고 static get() 메소드를 통해 Path 객체를 얻는다.
- java.io.File 클래스의 toPath() 메소드를 통해서도 Path 객체를 얻을 수 있다.
- Paths 클래스의 get() 메소드 호출 시 FileSystems.getDefault().getPath(first, more)이 내부에서 호출된다.
- Paths 클래스의 메소드
- static get() : Path 객체를 리턴한다.
- relativize() : 매개 변수로 넘긴 Path와 현 Path와의 상대 경로를 리턴한다.
커맨드 창으로 경로 이동 시 어떻게 이동할지 알려주는 역할 - toAbsolutePath() : relativize() 메소드의 결과와 같이 상대 경로를 절대 경로로 변경한다.
- normalize() : 매개 변수로 넘어온 문자열을 하나의 경로로 생각하고 현 Path의 가장 마지막 path로 추가한다.
- resolve() : 기존 경로에 추가해서 새 경로를 만든다.
- Files 클래스의 메소드 (몇 개만 작성...)
- writeFile() : Path 객체를 매개 변수로 받아 해당 경로의 파일에 데이터를 저장한다.
- readAllBytes() : 데이터를 바이트 배열로 받아서 읽는다.
- readAllLines() : List<String> 타입으로 데이터를 받아서 읽는다.
- delete() : 파일과 경로를 지우는 메소드로 지우려는 디렉토리에 파일이 있으면 지우지 않고 예외를 발생시킨다.
- copy() : 파일을 복사한다.
- move() : 파일을 지정한 경로로 이동시킨다.
- StandardOpenOption은 Enum 클래스로 파일을 열 때의 조건을 지정하는 역할이다. (실제로는 더 많다)
- APPEND : 쓰기 권한으로 파일을 연다. (이어쓰기)
- CREATE : 파일이 존재하지 않으면 새로 생성할 때 사용한다.
- CREATE_NEW : 파일을 생성하고 존재하는 경우 실패로 간주한다.
- DELETE_ON_CLOSE : 파일을 닫을 때 삭제한다.
- DSYNC : 파일을 수정하는 모든 작업이 동기적(순차적)으로 파일 저장소에 처리되도록 할 때 사용한다.
SYNC와 차이점으로는 메타 데이터까지 포함하지 않는다. - READ : 읽기 권한으로 파일을 연다.
- SPARSE : 파일을 Sparse할 때 사용한다.
- SYNC : 파일의 내용 및 메타 데이터에 대한 모든 업데이트는 순차적으로 파일 저장소에서 처리되도록 할 때 사용한다.
- TRUNCATE_EXISTING : 존재하는 파일이 있을 때 쓰기 권한으로 파일을 열고 파일 내 모든 내용을 지울 때 사용한다.
- WRITE : 쓰기 권한으로 파일을 연다.
Sparse file : 파일 자체가 부분적으로 비어 있을 때 파일 시스템 공간을 보다 효율적으로 사용하려고 시도하는 컴퓨터 파일 유형이다.
- WatchService 인터페이스
- 해당 디렉토리에 파일 생성, 수정, 삭제 이벤트가 발생 시 처리할 수 있게 도와주는 인터페이스
- Path 클래스의 register() 메소드로 어떤 디렉토리에서 어떤 이벤트를 감시할지 지정할 수 있다.
- NIO2에서 추가된 클래스
- SeekableByteChannel (random access)
- 바이트 기반 채널을 처리하는데 사용하는 클래스로 보다 채널을 유연하게 처리할 수 있다.
- NetworkChannel
- 네트워크 소켓을 처리하기 위한 채널로 바인딩, 소켓 옵션을 세팅하고 로컬 주소를 알려주는 인터페이스다.
- MulticastChannel
- IP 멀티캐스트를 지원하는 네트워크 채널이다.
- AsynchronousFileChannel
- 비동기 처리가 가능하도록 돕는 클래스로 CompletionHandler 인터페이스를 구현해 모든 모든 데이터가 성공적으로 처리되었을 때 수행되는 completed()와 실패했을 때 처리되는 failed() 메소드를 적절히 사용하는 방식으로 처리할 수 있고 Future 인터페이스로 결과를 받을 수도 있다.
- SeekableByteChannel (random access)
멀티캐스트 : IP를 그룹으로 묶고 그룹에 데이터를 전송하는 방식
- java.util.Objects 클래스
- 기존 Object 클래스의 메소드를 static으로 구현해놓았으며 Object 클래스와 달리 null 객체가 매개 변수로 넘어오더라도 NPE 예외를 발생시키지 않도록 구현된 클래스다.
간단 내용 정리
1. JDK 7에서 새로 추가된 Fork/Join은 어떤 것을 의미하나요?
어떤 작업을 계산할 때 여러 개로 나눠 계산한 후 결과를 모으는 작업을 의미한다.
2. Fork/Join에 있는 Work steal 이라는 개념은 무엇인가요?
작업의 여유가 있는 Queue에서 작업이 많은 Queue의 작업들을 가져가서 일을 하는 것을 의미한다.
3. Path 라는 인터페이스는 어떤 기능을 제공하나요?
파일과 경로에 대한 정보를 가지고 처리한다.
4. Files 클래스는 어떤 기능을 제공하나요?
Path 객체를 사용해 파일을 통제하는데 사용한다.
5. WatchService 라는 클래스는 어떤 기능을 제공하나요?
파일 생성, 삭제, 수정 등의 파일의 변경을 다루기 위해서 사용한다.
6. NIO에서 이야기하는 채널(Channel)은 무슨 역할을 하나요?
데이터를 받는 작업을 처리하기 위한 통로로 디바이스, 파일, 네트워크 등과의 연결 상태를 나타내는 클래스다.
7. java.util 패키지에 추가된 Objects 라는 클래스는 어떤 메소드들을 제공하나요?
Object 클래스가 제공하는 메소드를 static으로 제공하며 매개 변수 객체가 null일지라도 NPE 예외를 발생시키지 않는다.
출처: 이상민, <자바의 신 VOL.2> 로드북
'Java > 자바의 신 VOL.2' 카테고리의 다른 글
15. Java 8에서 변경된 것들은? (0) | 2024.07.10 |
---|---|
14. Java 8에 추가된 것들은? (0) | 2024.07.08 |
12. Java 7에서 달라진 것들에는? (1) | 2024.07.08 |
기말 점검 및 실습 문제 풀이 (1) | 2024.07.06 |
11. 이제 주요 API도 알아봤으니 정리해봅시다 (2) | 2024.07.05 |