Java

· Java
앞서 Future와 CompletableFuture를 활용해 비동기 작업 처리를 해보았다. 이를 이용해 비동기 작업 파이프라인 만드는 법을 살펴보자. 동기 작업과 비동기 작업 조합하기 만약 음식을 요리하고 완성된 후 접시에 담는다고 가정해보자. List foodNames = List.of("피자", "햄거버", "파스타", "김밥", "떡볶이"); ExecutorService executor = Executors.newFixedThreadPool(Math.min(foodNames.size(), 100), runnable -> { Thread t = new Thread(runnable); t.setDaemon(true); return t; }); List dishFutures = foodNames.stre..
· Java
Future의 단순 활용 Java5 부터는 미래의 어느 시점에 결과를 얻는 모델에 활용할 수 있도록 Future 인터페이스를 제공하고 있다. 비동기 계산을 모델링하는 데 Future를 이용할 수 있으며, Future는 계산이 끝났을 때 결과에 접근할 수 있는 참조를 제공한다. 시간이 걸릴 수 있는 작업을 Future 내부로 설정하면 호출자 스레드가 결과를 기다리는 동안 다른 유용한 작업을 수행할 수 있다. Future는 저수준의 스레드에 비해 직관적으로 이해하기 쉽다는 장점이 있다. Future를 이용하려면 시간이 오래 걸리는 작업을 Callable 객체 내부로 감싼 다음에 ExecutorService에 제출해야 한다. Java8 이전의 예제 코드는 아래와 같다. ExecutorService execut..
· Java
디폴트 메서드(default method)란? 보통 인터페이스는 규칙을 잡거나, 서비스의 플로우 로직을 잡는 데 사용하곤 한다. 하지만 인터페이스를 구현하는 클래스에서는 메서드를 모두 구현해야하기 때문에 인터페이스에 메서드를 추가할때 문제가 발생한다. 메서드 하나를 추가하려면 해당 인터페이스를 구현하는 모든 클래스에서는 해당 메서드를 모두 구현해줘야 하는 것이다. Java8에서는 이러한 문제를 해결하기 위해 2가지 방법을 제공한다. 인터페이스 내부에 정적 메서드(static method)를 사용한다. 인터페이스의 기본 구현을 제공할 수 있도록 디폴트 메서드(default method) 기능을 사용한다. 인터페이스에 디폴트 메서드를 사용하여 메서드를 구현할 수 있다. 디폴트 메서드를 이용하면 인터페이스의 ..
· Java
새로운 날짜와 시간 API 자바 API는 복잡한 애플리케이션을 만드는 데 필요한 여러 가지 유용한 컴포넌트를 제공한다. 아쉽게도 자바 API가 항상 완벽한 것은 아니다. 대부분의 자바 개발자가 지금까지의 날짜와 시간 관련 기능에 만족하지 못했다. Java1에서는 java.util.Date 클래스 하나로 날짜와 시간 관련 기능을 제공했다. 하지만 대부분의 자바 개발자가 지금까지의 날짜와 시간 관련 기능에 만족하지 못했다. 날짜를 의미하는 Date라는 클래스의 이름과 달리 Date 클래스는 특정 시점을 날짜가 아닌 밀리초 단위로 표현한다. 게다가 1900년을 기준으로 하는 오프셋, 0에서 시작하는 달 인덱스 등 모호한 설계로 유용성이 떨어졌다. java1.1에서는 Date 클래스의 여러 메서드를 사장시키고 ..
· Java
자바로 프로그램을 개발하면서 한 번이라도 NullPointerException을 껶지 않은 사람은 없을 것이다. NullPointerException은 모든 자바 개발자를 괴롭히는 예외다. 1965년 토니 호어(Tony Hoare)라는 영국 컴퓨터과학자가 힙에 할당되는 레코드를 사용하며 형식을 갖는 최초의 프로그래밍 언어 중 하나인 알골(ALGOL)을 설계하면서 처음 null 참조가 등장했다. 그는 구현하기가 쉬웠기 때무엔 null을 도입했다고 하였다. 하지만 여러 해가 지난 후 그는 null 및 예외를 만든 결정을 가리켜 십억 달러짜리 실수라고 표현했다. 모든 자바 프로그래머라면 NullPointerException이라는 귀차는 예외가 발생하는 상황을 몸소 겪었을 것이다. 값이 없는 상황을 어떻게 처리..
· Java
DSL(Domain-specific Languages, 도메인 전용 언어)란? DSL은 특정 비즈니스 도메인의 문제를 해결하려고 만든, 작은, 범용이 아닌 특정 도메인을 대상으로 만들어진 특수 프로그래밍 언어다. 예를 들어 쇼핑몰 플랫폼을 개발한다고 가정했을 때, 비지니스 도메인에는 상품을 결제하고 배송처리와 같은 개념이 포함된다. DSL에란 특정 비즈니스 도메인을 인터페이스로 만든 API라고 생각할 수 있다. (자바 8에서는 Stream, Collector 등 여러 가지 작은 DSL들이 추가되었다.) 자바에서는 도메인을 표현할 수 있는 클래스와 메서드 집합이 필요하다. DSL에서 동작과 용어는 특정 도메인에 국한되므로 다른 문제는 걱정할 필요가 없어서 특정 도메인의 복잡성을 더 잘 다룰 수 있고, 저수..
· Java
람다 테스팅 일반적으로 좋은 소프트웨어 공학자라면 프로그램이 의도대로 동작하는지 확인할 수 있는 단위 테스팅(unit testing)을 진행한다. 우리는 소스 코드의 일부가 예상된 결과를 도출할 것이라 단언하는 테스트 케이스를 구현한다. 보이는 람다 표현식의 동작 테스팅 일반적인 메서드는 이름이 존재하기 때문에 단위 테스트를 문제없이 진행할 수 있지만, 람다는 익명이므로 테스트 코드 이름을 호출할 수 없다. 따라서 필요하다면 람다를 필드에 저장해 테스트 할 수 있다. public class OrderProduct { private String name; private int count; private int price; .... } public static class Order { public stati..
· Java
디자인 패턴(design pattern)이란? 소프트웨어를 설계할 때 특정 맥락에서 발생하는 문제들을 해결할 수 있는 해결책을 유형별로 정리한 것이 디자인 패턴(design pattern)이다. 디자인 패턴은 공통적인 소프트웨어 문제를 설계할 때 재 사용할 수 있는, 검증된 청사진을 제공해주고, 공통의 언어를 만들어주며 팀원 사이의 의사 소통을 원활하게 해주는 아주 중요한 역할을 한다. 람다를 이용하면 이전에 디자인 패턴으로 해결하던 문제를 더 쉽고 간단하게 해결할 수 있다. 또한 람다 표현식으로 기존의 많은 객체지향 디자인 패턴을 제거하거나 간결하게 재구현할 수 있다. 하지만 모든 코드에서 람다 표현식을 사용하는건 적절하지 않다. 클래스에 상태가 있거나 여러 메서드를 정의하는 등 복잡하다면 기존 패턴을..
· Java
코드 가독성 개선 코드 가독성이란 일반적으로 코드를 다른사람도 쉽게 이해할 수 있는 정도라고 생각하면 될 것 같다. 즉, 코드 가독성을 개선한다는 것은 우리가 구현한 코드를 다른 사람이 쉽게 이해하고 유지보수 할 수 있게 만드는 것을 의미한다. 코드의 가독성을 높이려면 코드의 문서화를 잘하고, 표준 코딩 규칠을 준수하는 등의 노력을 기울여야 한다. 익명 클래스를 람다 표현식으로 리팩터링 하기 하나의 추상 메서드를 구현하는 익명 클래스는 람다 표현식으로 리팩터링 할 수 있다. // 익명 클래스 사용 Runnable r1 = new Runnable() { public void run() { System.out.println("Run!!"); } } // 람다 표현식 사용 Runnable r2 = () -> ..
· Java
컬렉션 팩토리(Collection Factory) java 9에서는 작은 컬렉션 객체를 쉽게 만들 수 있는 방법을 제공한다. 자바에서 적은 요소를 포함하는 리스트를 만들때 아래처럼 사용할 것이다. List cars = new ArrayList(); cars.add("아반테"); cars.add("소나타"); cars.add("그랜저"); 이렇게 코드를 작성하게 되면 새 문자열을 저장하는데도 많은 코드가 필요하다. Arrays.asList() 팩토리 메서드를 이용하면 코드를 간단하게 줄일 수 있다. List cars = Arrays.asList("아반테", "소나타", "그랜저"); 내부적으로 고정된 크기의 변환할 수 있는 배열로 구현되었기 때문에 요소를 갱신할 순 있지만 추가하게 되면 Unsupporte..
beekei
'Java' 카테고리의 글 목록 (2 Page)