본문 바로가기

Java

Java Record (레코드) 참고: https://www.baeldung.com/java-15-new https://www.digitalocean.com/community/tutorials/java-records-class Record는 왜 만들어졌나? Record는 java 14에서 처음 소개된 새로운 클래스 타입이며, 변경불가(immutable) 데이터 객체를 쉽게 만들수 있게 한다. Record 타입이 생기기전에는 값이 변경이 불가능한 테이터 객체를 정의해서 사용했다. 변경 불가 데이터 객체를 만들기위 해서는 매번 아래 내용들을 작성해야 했다. 필드를 private final 로 정의 getter 메소드 작성 생성자 생성 hashCode, equals, toString 함수 재정의 클래스의 상속을 막고 싶다면 final cla.. 더보기
Java Optional 사용법 원문 : https://www.baeldung.com/java-optional, https://www.baeldung.com/java-9-optional 1. 개요 Java SE 8 에 소개된 java.util.Optional 클래스는 Haskell과 Scala 로부터 영감을 받아 개발 되었고, 아무 값도 없는(null) 값을 표현하는데 사용된다. NPE(NullPointException)를 방지하기 위한 null 체크와 같은 역할을 하는데 편리한 기능을 제공하기때문에 객체타입을 반환하는 함수를 작성할때 null 반환될 여지가 있는 경우 반환타입을 Optional로 해주면 좋다. 2. Optional 객체 생성하기 값이 비어 있는 Optional 객체를 생성할때는 간단히 Optional.empty() 정.. 더보기
Java 람다(Lambda) 표현식, Functional Interface 에 대한 조언 https://www.baeldung.com/java-8-lambda-expressions-tips Lambda Expressions and Functional Interfaces: Tips and Best Practices | Baeldung Tips and best practices on using Java 8 lambdas and functional interfaces. www.baeldung.com 1. 표준 함수형 인터페이스(Functional Interfaces) 위주로 사용하라 함수형 인터페이스는 java.util.function 패키지에 모여 있고, 거의 대부분의 람다 표현식이나 페소드 참조에 사용할 수 있다. 대표적인 함수형 인터페이스로는 아래와 같은 타입들이 있다. 파라미터 없이 어떤 .. 더보기
Java8 이후 람다를 이용하여 Collection 정렬하기 (정렬을 깔끔하게 작성하는 법) 원문 : https://www.baeldung.com/java-8-sort-lambda 우선 아래와 같은 class가 있다고 했을때 public class Human { private String name; private int age; public String getName() { return name; } public int getAge() { return age; } public Human(String name, int age) { this.name = name; this.age = age; } } Java8 이전에는 아래 코드와 같이 Comparator를 구현하여 정렬에 사용했다. void givenPreLambda_whenSortingEntitiesByName_thenCorrectlySorted.. 더보기
CompletableFuture 사용법 CompletableFuture는 Java8에 등장했다. Future와 CompletionStage를 구현했다. 따라서 비동기 연산들을 구성, 결합 실행하고 에러를 처리하는 메소드를 가지고 있다. 간단히 비동기 코드를 실행하고 싶다면, CompletableFuture의 runAsync, supplyAsync 함수를 사용한다. runAsync 는 return 타입이 없는 Runnable을 매개변수로 받고, supplyAsync는 return 타입이 있는 Supplier를 매개변수로 받는다. CompletableFuture future = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(2000); } catch (Exception e) { e.print.. 더보기
apache HttpClient, javax.net.ssl.SSLHandshakeException 발생시 대처법 HttpClient 를 이용하여 https 페이지를 접속하려 할때 아래와 같은 예외가 발생하기도 한다. javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:320) at ja.. 더보기
for each 문에 대하여 iterator() 메소드가 존재하는 class는 모두 for each 문을 사용 할 수 있다. 다른말로 바꿔하면 어떤 class 던지 Iterable 인터페이스를 구현(iterator() 메서드 구현)하였으면 for each 문을 사용 할 수 있다. for each 문의 기본 사용법은 아래와 같다. ArrayList ar = new ArrayList(); ar.add("a"); ar.add("b"); ar.add("c"); for(String str: ar){ System.out.println(str); } 만약 어떤 class를 for each 문이 사용 가능한 class로 만들고 싶다면 아래와 같이 Iterable 를 구현하면 된다. public class StockBox implements Ite.. 더보기
다이아몬드 연산자 (Diamond operator, JAVA 7 부터 추가) Java7 이전에는 generic을 사용할때 //Case 1. List list = new LinkedList(); //Case 2. List list = new LinkedList(); 와 같이 선언 해서 사용했다 Case 1. 의 경우엔 Integer를 저장하기로 선언 했지만 LinkedList로 초기화 할때는 별다른 조건을(generic) 안 걸었으니 LinkedList에 String 이나 Integer나 아무 타입이나 막 집어 너어도 컴파일 에러가 나지 않는다. 다만 런타임 에러가 날뿐... 그래서 Case 2. 처럼 명확하게 선언, 초기 화 해주는게 좋은데 Java 7 부터는 다이아몬드 연산자 라고 해서 좀 더 편하게 사용 할 수 있어 졌다. (Java 7 부터는 Case 1. 처럼 하면 컴파일.. 더보기