[Java] Lamda Expressions(람다식) 람다식은 Anonymous Founction(익명 함수)를 생성하기 위한 식으로 함수형 인터페이스를 구현하기 위해 자바 8에서 도입한 표현식이다. 장점 자바 코드가 간결해진다. 컬렉션의 요소를 필터링하거나 매핑해서 원하는 결과를 쉽게 집계할 수 있다. 람다식의 형태 람다식의 형태는 매개변수를 가진 코드블록이지만 런타임 시에는 익명 구현 객체를 생성한다. 람다식 -> 매개변수를 가진 코드 블록 -> 익명 구현 객체 public interface func { U apply(T data); } 익명 클래스 문법 new 인터페이스 이름() { 반환타입 메서드명 (인자) { 실행문 } }; 람다식과 익명 클래스의 차이점 람다식과 익명클래스의 차이점은 람다식에서..
Language/Java
[Java] Generic(제네릭) Generic(제네릭)은 class와 interface, method를 정의할 때 Type(타입)을 Parameter(파라미터)로 사용할 수 있도록 하는 역할을 한다. 그래서 타입 파라미터는 코드를 작성할 때 구체적일 타입으로 대체되어 다양한 코드를 생성할 수 있도록 한다. 장점 컴파일 시 정확한 타입 체크를 할 수 있다. 컴파일러에서 코드에서 잘못 사용한 타입 때문에 에러가 발생하는 상황을 예방할 수 있다. Casting(형변환)을 사용하지 않는다. Casting을 사용하면 불필요한 타입 변환을 하므로 성능에 영향을 줄 수 있다. List list = new ArrayList(); list.add("work"); String data = (String) list.ge..
6. 작업실행 대부분 병렬 어플리케이션은 '작업task'을 실행하는 구조가 효율적으로 구성되어있다.- 작업: 추상적이면서 명확하게 구분된 업무의 단위작업은 원론적으로 완전히 독립적인 동작으로 상태,결과, 부수효과 등에 영향을 받지 않아야함 작업을 실행하는 가장 간단한 방법- 단일 스레드에서 작업 목록을 순차적으로 실행하는 방법 6.1.1 작업을 순차적으로 실행하나의 스레드가 모든 요청을 순차적으로 처리하는 경우class SingleThreadWebServer {public static void main(String[] args) {ServerSocket socket = new ServerSocket(80);while (true) {Socket conn = socket.accept();handleReque..
volatile 키워드 멀티코어 프로세서는 별도의 캐시를 가지고 있다코어는 메모리에서 읽은 값을 캐시에 저장한다.작업을 처리할 때 캐시에서 먼저 확인하고 없으면 메모리에서 호출하여 처리한다.그러다보니 도중에 메모리에 저장된 변수의 값이 변경되었는데 캐시에 저장된 값이 갱신되지 않아서스레드가 멈추지 않고 계속실행되는 경우가 있다. 그래서 volatile 키워드를 이용할 경우코어는 작업을 처리할 때 캐시가 아닌 메모리에서 불러와 처리하기 때문에캐시와 메모리간의 불일치 문제가 해결된다. 변수에 volatile 키워드를 붙이는 대신 synchronized 블록을 이용할 때도 같은 효과를 얻을 수 있다. 스레드가 synchronized 블럭으로 진입할 때와 나올 때, 캐시와 메모리간의 동기화가 이루어지기 때문에 ..
NIO TCP blocking channel 소켓서버 & 클라이언트 서버 소켓 생성ServerSocketChannel sock = ServerSocketChannel.open();sock.configureBlocking(true);sock.bind(new InetSocketAddress(9190)); 요청기다림SocketChannel socketChannel = sock.accept(); 클라이언트 소켓 생성SocketChannel socketChannel = SocketChannel.open();socketChannel.configureBlocking(true);socketChannel.connect(new InetSocketAddress(9190)); 서버 or 클라이언트로부터 정보 받기socketC..
비동기 파일채널 FileChannel의 read() write()는 입출력작업을 하는 동안 블로킹이 된다.그래서 UI 및 이벤트를 처리하는 스레드에서 이 메소드들을 호출하면 블로킹되는 동안 UI갱신이나 이벤트 처리를 할 수 없어 작업 스레드를 생성해서 처리해야한다. 그래서 NIO에서 불특정 다수 파일 및 대용량 파일의 입출력 작업을 위해 비동기 파일 채널(AsynchronousFileChannel)을 별도로 제공함 1. AsynchronousFileChannel 생성과 닫기- AsynchronousFileChannel은 두 가지 정적 메소드인 open()을 호출하여 얻을 수 있다. AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(Pa..
Io, nio 차이입출력방식 : 스트림방식 , 채널방식버퍼방식 : 논 버퍼, 버퍼비동기방식 : 지원안함, 지원블로킹/논블로킹 방식 : 블로킹방식, 블로킹/논블로킹모두 지원 스트림 vs 채널스트림 : 입력을 하기위해 입력 스트림을 생성하고 출력을 하기위해 출력 스트림을 생성해야함NIO(채널) : 채널은 양방향으로 입력과 출력이 가능. 입출력을 하기 위해 별도의 채널을 만들 필요가 없음. 버퍼 vs 논버퍼IO에서는 스트림이 1바이트를 쓰면 입력스트림이 1바이트를 읽는다. (이런 시스템은 대체로 느림)그래서 버퍼를 이용하여 복수 개의 바이트를 한꺼번에 입력받고 출력하는 것이 빠른 성능을 냄(보조 스트림 BufferedInputStream, BufferedOutputStream) IO는 스트림에서 읽은 데이터를..
WatchService(와치서비스) - 디렉토리 내부에서 파일 생성, 수정, 삭제 등의 내용 변화를 감시하는데 사용. (파일변경 통지 매커니즘으로알려짐)ex) 텍스트 에디터 1. 생성WatchService watchService = FileSystems.getDefault().newWatchService(); Path 객체에서 register() 메소드에 watchService를 등록하고 어떤 변화(생성, 삭제, 수정)를 감시할 것인지 StandardWatchEventKinds을 지정한다. 2. 감시자 지정Path path = Paths.get("d:/test");path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatch..
규칙2. 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라 정적 팩터리나 생성자의 문제- 선택적 인자가 많은 상황에 잘 적응하지 못하다는 것 프로그래머들은 보통 점층적 생성자 패턴(telescoping constructor pattern)을 적용- 필수 인자만 받는 생성자를 하나 정의하고, 선택적 인자를 하나 받는 생성자를 추가하고, 거기에 두 개의 선택적 인자를 받는 생성자를 추가하는 식으로 생성자들을 쌓아 올리듯 추가하는 것.결국 모든 선택적 인자를 다 받는 생성자를 추가하면 정의는 끝나게됨.ex)1234567891011121314151617181920212223242526272829//점층적 생성자 패턴 - 더 많은 인자 개수에 잘 적응하지 못한다. public class Nutritio..
규칙 1. 생성자대신 정적 팩터리 메서드를 사용할 수 없는지 생각해 보라 클래스를 통해 객체를 만드는 일반적인 방법- public으로 선언된 생성자(constructor) 다른 방법클래스에 public으로 선언된 정적 팩터리 메서드(static factory method)를 추가하는 것.Ex)_Boolean 클래스의 valueOf 정적 팩터리 메서드의 장점 1. 생성자와는 달리 정적 팩터리 메서드에는 이름(name)이 있다.- 생성자에 전달되는 인자(parameter)들은 어떤 객체가 생성되는지를 설명하지 못함.- 정적 팩터리 메서드는 이름을 잘 짓기만하면 사용하기 쉽고, 클라이언트 코드의 가독성(readability)도 높아짐- 클래스에는 시그니처(signature)별로 하나의 생성자만 넣을 수 있는데..