목록Backend/Java (44)
elevne's Study Note

이전 시간에 알아보았던 것처럼 일정 시간 이후 특정 일을 수행하고자 하거나, 일정 주기를 기준으로 반복하여 특정 일을 수행하고자 할 때에는 ScheduledExecutorService 라는 스레드풀을 사용할 수 있다. 생성하는 방식은 다른 스레드풀과 동일하게, Executors 의 정적메소드로 생성된다. 이 경우에는 newScheduledThreadPool 메소드를 사용한다. (파라미터로는 풀 사이즈를 int 로 넘긴다) public static void Example1() { ScheduledExecutorService ses = Executors.newScheduledThreadPool(1); Runnable task2 = () -> System.out.println("RUNNING TASK2..."..

비동기적인, 멀티스레드를 활용한 프로그램을 작성할 때 callback 함수들을 많이 작성하게 되고 그러한 코드들은 작성하기 어려워진다. 만약 그 콜백 내에서 예외처리 등을 해주어야한다면 더욱 작성하기 어려워진다. 기존의 Future 인터페이스는 Java 5 에서 asynchronous computation 을 위해 추가되었지만, 여러 개의 작업을 합쳐서 작성하는데에는 많은 불편함이 있었다. Java 8 에서 그러한 문제를 해결하기 위해 CompletableFuture 클래스를 만들었다. 이는 Future 과는 다르게 다른 Asynchronous computation 끼리 조합이 가능하다. public class CompletableFutureExample { static ExecutorService ex..

java.nio.channels.FileChannel 을 이용하면 파일 읽기와 쓰기를 할 수 있다. FileChannel 은 동기화 처리가 되어있기 때문에 멀티스레드 환경에서 사용해도 안전하다고 한다. FileChannel 의 write() 메소드로 파일에 바이트를 작성, read() 메소드로 바이트를 읽는다. 이 두 메소드 다 매개값으로 ByteBuffer 객체를 받게된다. write() 메소드에서는 ByteBuffer 의 position 부터 limit 까지 파일에 바이트를 작성하고 read() 메소드에서는 파일에서 읽혀지는 바이트가 ByteBuffer 의 position 부터 저장된다. write() 메소드의 리턴값은 ByteBuffer 에서 파일로 쓰여진 바이트의 수, read() 의 리턴값은 B..

NIO 에서는 데이터를 입출력하기 위해 항상 Buffer 을 사용하게된다. Buffer 은 읽기, 쓰기가 가능한 메모리 배열로, 저장되는 데이터 타입에 따라서 분류될 수도, 어떤 메모리를 사용하느냐에 따라 다이렉트와 논다이렉트 버퍼로 분류될 수도 있다. 우선 아래와 같이 저장되는 데이터 타입에 따라 별도의 Buffer 클래스가 제공된다. (모두 Buffer 추상클래스를 상속한다) 버퍼는 메모리의 위치에 따라서 논다이렉트와 다이렉트 버퍼로 분류되기도 한다. 논다이렉트 버퍼는 JVM 이 관리하는 힙 메모리 공간을 이용하는 버퍼이고, 다이렉트 버퍼는 운영체제가 관리하는 메모리 공간을 이용하는 버퍼이다. 두 버퍼는 아래와 같은 특징을 지닌다. 구분 논다이렉트 버퍼 다이렉트 버퍼 사용하는 메모리 공간 JVM 힙 ..

저번 시간에는 입출력을 위한 Java 의 IO API 에 대해서 알아보았다. Java IO 에서 이미 입출력을 위한 모든 필요한 클래스들을 제공해주기는 하지만, JDK 4 부터는 더 빠른 입출력을 위한 Java NIO 를 사용할 수 있게 되었다. Java NIO 는 IO 의 대체제와 같은 것으로, 고성능의 네트워킹과 파일 조작을 할 수 있다. NIO 는 IO 와는 다른 방식으로 작동된다. Java 의 입출력 작업에 필요한 모든 클래스를 포함하는 java.io.package 와 마찬가지로 java.nio 패키지는 NIO API 전체에서 사용되는 버퍼 클래스를 정의한다. Java NIO 는 다음 두 이유로 사용된다고 한다. Non-Blocking 방식: NIO 는 Non-Blocking 방식의 IO 작업을 ..

Java 의 Reflection 은 Class, Interface, 필드 및 메서드의 런타임 속성을 검사, 수정할 수 있게끔 해주는 API 이다. Compile 시에 이름을 모를 때 특히 유용하게 사용될 수 있다고 한다. 또, Reflection 을 사용하여 새로운 Object 를 생성, 메소드를 호출하고 filed 에 값을 세팅해줄 수도 있다. Reflection 은 동적 바인딩, Dynamic Binding 기능을 지원하는 것이다. 바인딩이란 프로그램에 사용된 구성 요소의 실제 값 또는 프로퍼티를 결정짓는 행위를 의미하는데, 정적 바인딩과 동적 바인딩으로 나뉜다. 정적 바인딩은 Compile 시 진행되는 것으로 프로그램 실행 중 변하지 않는다. 동적 바인딩은 Runtime 시 결정되는 것으로 Java..

UDP (User Datagram Protocol) 는 비연결 지향적 프로토콜이다. 비연결 지향적이란 데이터를 주고받을 때 연결 절차를 거치지 않고, 발신자가 일방적으로 데이터를 발신하는 방식이다. 연결 과정이 없기 떄문에 TCP 보다는 빠른 전송이 가능하지만 데이터 전달의 신뢰성이 떨어진다는 단점이 있다. UDP 는 발신자가 데이터 패킷을 순차적으로 보내더라도 이 패킷들은서로 다른 통신 선로를 통해 전달될 수 있기 때문에 먼저 보낸 패킷이 나중에 보낸 것보다 늦게 도착할 수도 있다. 일반적으로 데이터 전달의 신뢰성보다 속도가 중요한 프로그램에서 UDP 를 사용한다. 이를 구현하기 위해 Java 에서는 java.net.DatagramSocket, java.net.DatagramPacket 클래스를 제공한..

TCP (Transmission Control Protocol) 는 연결 지향적 프로토콜이다. 연결 지향 프로토콜이란 클라이언트와 서버가 연결된 상태에서 데이터를 주고받는 프로토콜을 말한다. 클라이언트가 연결 요청을 하면 서버가 연결을 수락한 다음 통신 선로가 고정되고, 모든 데이터는 고정된 통신 선로를 통해 순차적으로 전달되는 것이다. TCP 는 데이터를 보내기 전에 반드시 연결이 형성되어야 하는데 이는 시간이 많이 걸리고, 고정된 통신 선로가 최단선이 아니면 UDP 보다 데이터 전송 속도가 느릴 수 있다는 단점이 있지만 데이터를 정확하고 안정적으로 전달한다는 장점이 있다. Java 에서는 이를 구현하기 위해 java.net.ServerSocket 과 java.net.Socket 클래스를 제공한다. T..