본문 바로가기

Old Posts/Java108

Java NIO - 파일 다루기 (Files 클래스) Java NIO에는 파일을 손쉽게 다룰 수 있는 유틸성 메소드를 모아둔 Files 라는 클래스가 있다. 주로 Path 인터페이스와 함께 사용해서 파일과 디렉토리를 다루는데 사용된다. Files.exists() 주어진 Path에 해당하는 파일이 파일시스템에 존재하는지 여부를 확인한다. Path path = Paths.get("/tmp/test.txt"); boolean exists = Files.exists(path, LinkOption.NOFOLLOW_LINKS); Path 객체를 가져와서 Files.exists() 메소드의 첫 번째 인자로 넘겨준다. 두 번째 인자로 준 LinkOption.NOFOLLOW_LINKS는 exists() 메소드가 파일 경로를 찾아갈 때 심볼릭 링크는 따라가지 않겠다는 의미다.. 2021. 1. 3.
Java NIO - 파일 읽기 쓰기 (FileChannel, Path) Java NIO를 이용해서 파일을 다룰 수 있는 클래스와 예제 코드를 소개하겠다. 1. FileChannel 파일에서 데이터를 읽고 쓸 수 있는 채널이다. 파일 채널을 생성하기 위해서는 IO의 FileInputStream, FileOutputStream의 getChannel()메소드를 호출하거나 RandomAccessFile의 getChannel() 메소드로 열 수도 있다. // RandomAccessFile 이용 RandomAccessFile file = new RandomAccessFile("testFile.txt", "rw"); FileChannel channel1 = file.getChannel(); // FileInputStream 이용 FileInputStream fis = new FileIn.. 2021. 1. 2.
Java NIO - Selector '셀렉터(Selector)'는 하나의 스레드가 여러개의 채널을 관리할 수 있게해주는 NIO 컴포넌트다. NIO는 셀렉터라는 메커니즘을 제공하여 하나 이상의 NIO 채널들을 모니터링하고, 데이터 전송이 가능해지는 상황을 인지할 수 있게 해준다. Java NIO - 셀렉터를 사용하는 이유 3개의 클라이언트 연결이 붙어 있는 서버 프로그램을 생각해보자. 서버에는 3개의 소켓채널(SocketChannel)이 열려있을 것이다. 클라이언트는 자기가 보내고 싶을 때 요청을 보내기 때문에 서버는 클라이언트의 요청을 기다려야한다. 가장 쉬운 방법은 클라이언트마다 스레드를 생성해서 붙여주는 방법이다. 각 스레드는 클라이언트와 연결된 채널에서 기다린다. 즉, 새로운 요청이 올 때까지 채널에 블로킹되어 있다. 서버 프로그램을.. 2021. 1. 1.
Java NIO - Chanel 사이의 전송 transferFrom(), transferTo() 입출력 프로그램을 작성할 때 채널과 채널 사이에 데이터를 전송해야할 경우가 있다. 지금까지 정리한 바에 의하면 우선 소스 채널에서 데이터를 버퍼로 읽어들이고, 버퍼에 채워져있는 데이터를 다시 타겟 채널로 쓰는 동작을 생각하게 된다. 하지만 중간에 버퍼가 끼어들게 되면 데이터가 버퍼로 복사되고 다시 채널쪽으로 복사되는 비효율이 있을 수 있다. Java NIO에서는 채널 사이에 데이터를 전송할 수 있도록 transferTo() 메소드와 transferFrom() 메소드를 제공한다. RandomAccessFile sourceFile = new RandomAccessFile("sourceFile.txt", "r"); FileChannel sourceChannel = sourceFile.getChannel(); .. 2020. 12. 31.
[Java 예제] Array를 Set으로 변환 예제 코드 Java에서 배열(Array)을 Set 타입으로 변경하는 코드는 다음과 같다. Set set = new HashSet(Arrays.asList(array)); 배열을 List로 변경한 다음 HashSet의 생성자에 넘겨주면 된다. 참고로 Arrays.asList(array) 동작은 O(1) 연산이다. 그냥 배열을 리스트 API로 해석할 수 있도록 만들어주는 역할을 할 뿐이다. List를 HashSet의 생성자로 넘겨주면, 리스트 크기의 해시 테이블을 먼저 만들고 리스트를 순회하면서 엘리먼트들을 하나씩 HashSet에 추가하는 연산을 수행한다. 즉, 최종적으로는 O(n) 동작이다. Set set = new HashSet(); Collecdtions.addAll(set, array); 결국 풀어쓰면 이 코드.. 2020. 12. 30.
Java NIO - Buffers Java NIO에서 버퍼(Buffer)는 채널(Channel)과 함께 사용된다. 데이터는 채널에서 읽혀 버퍼로 쓰여지거나 버퍼에 있는 데이터가 채널로 쓰여진다. Java NIO 버퍼(Buffer)는 본질적으로 메모리 블럭이다. 메모리의 한 공간에 할당되어 있는 공간을 NIO Buffer객체로 래핑(Wrapping)한 것으로 메모리로의 접근, 사용을 추상화 해 사용하기 편한 메소드를 제공해준다. 사용자는 버퍼에서 데이터를 얻고, 버퍼로 데이터를 저장한 다음 채널에 쓰거나 읽는다. 버퍼를 이용해 채널에서 데이터를 읽는 패턴은 다음과 같다. 버퍼가 채워진다(read from channel) buffer.flip() 메소드를 호출한다 버퍼에서 데이터를 꺼낸다 buffer.clear() 메소드 혹은 buffer... 2020. 12. 30.
Java NIO - Channel, Buffer 그리고 Selector 자바는 Java 4 부터 새로운 입출력 API를 지원하기 시작했다. NIO라는 이름으로 불리는 API는 New IO 혹은 Non-blocking IO라는 뜻을 가지고 있으며 java.nio 패키지로 포함되었다. 이후 Java 7으로 버전을 올리면서 Java IO와 Java NIO 사이의 일관성 없는 클래스 설계를 바로잡고, 비동기 채널 등의 네트워크 지원을 대폭 강화한 NIO 2 API가 추가되었다. Java NIO는 3가지 컴포넌트로 구성되어 있다. Channel Buffers Selectors 실제로는 이것보다 더 많은 컴포넌트들이 있지만 가장 핵심적으로는 저 3가지를 꼽을 수 있다. 채널(Channel) Java NIO의 모든 IO는 '채널(Channel)'에서부터 시작한다. 채널은 스트림과 유사하.. 2020. 12. 29.
[Java 예제] Array를 ArrayList로 변환 배열(Array)에 객체를 ArrayList로 변환해서 사용해야하는 경우가 있다. ArrayList.asList() import java.util.Arrays; import java.util.List; public class Tester { public static void main(String[] args) { String[] array = {"a", "b", "c", "d", "e"}; List list = Arrays.asList(array); System.out.println(list); } } ArrayList.asList()의 경우 배열을 List로 접근할 수 있도록 만들어준다. 대신 add()는 안된다. add()를 호출하면 UnsupportedOperationException이 발생한다. .. 2020. 12. 16.
[Java] @VisibleForTesting 애너테이션 자바 코드에서 @VisibleForTesting 애너테이션은 해당 메소드 혹은 멤버 변수의 가시성(Visibility)이 테스트를 위해 완화된 것임을 명시적으로 나타내는 의미다. 자바의 경우 프로그래밍을 할 때, 비즈니스 로직을 담고 있는 클래스와 테스트 클래스를 분리한다. 그리고 이 두 클래스를 같은 패키지에 두는 것이 일반적이다. 이렇게 되면, 비즈니스 로직을 담고 있는 클래스의 private 멤버나 메서드를 테스트 클래스에서 접근할 수 없다. 비즈니스 로직을 담고 있는 클래스는 캡슐화(Encapsulation)를 위해서 불필요하게 메서드나 멤버 변수를 외부로 노출시키지 않는 것이 좋다. 그렇다고 private 메서드의 테스트를 안할 수는 없다. 이 때 사용하는 것이 @VisibleForTesting.. 2020. 9. 30.