본문 바로가기

java

Java - Collection(List, Set...) 가변(mutable) 객체 초기화 (Arrays.asList()) List.of나 Set.of 함수를 이용하면 List, Set을 간편히 생성 할 수 있다. 하지만 이렇게 생성한 객체는 불변객체(immutable) 여서 변경 작업이 불가능 하다. (add 작업 시 UnsupportedOperationException이 발생한다.) List list = List.of("a", "b", "c"); Set set = Set.of("a", "b", "c"); list.add("d"); // java.lang.UnsupportedOperationException set.add("d"); // java.lang.UnsupportedOperationException 따라서, 변경 가능한 Collection 객체를 만들고 싶을때는 Array.asList 함수를 이용해서 List.of.. 더보기
JAVA - for 문으로 map의 key, value를 탐색하는 방법 (EntrySet 이용) 보통의 경우 for 문으로 map을 순회하고 싶을때는 아래처럼 key 를 받아오고, 이 key를 이용해서 value 를 다시 조회하는 형태로 했다. Map map = new HashMap(); map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); Set keys = map.keySet(); for(String key : keys) { String value = map.get(key); System.out.println(key + " : " + value); } 이 방법은 value를 찾아와야 하는 단계를 더 거치게 되어 비 효율적이고 뭔가 깔끔치 못하다. Key, Value 를 포함하고 있는 데이터 타입인 Entr.. 더보기
java.time.format.DateTimeParseException (...could not be parsed: Unable to obtain LocalDate from TemporalAccessor) 년월 데이터를 처리하기 위해 LocalDate를 사용하고 있던중, 문자열을 LocalDate로 변환할 일이 있어 별 생각 없이 LocalDate.parse(문자열, DateTimeFormatter)함수를 사용했다. String yearMonthString = "202210"; LocalDate yearMonth = LocalDate.parse(yearMonthString, DateTimeFormatter.ofPattern("yyyyMM")); 결과... java.time.format.DateTimeParseException: Text '202210' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {Year=2022, Mont.. 더보기
Java - Srping 시작할 때 동작하는 코드 작성하는 법 Spring Framework는 Event 와 Event가 발행되었을때 이를 처리하는 EventHandler(Listener)기능을 지원한다. Event 와 Listener 모두 사용자가 직접 정의하고 발행 할 수 있다. 사용자 정의 Event 외에도 기본적으로 제공하는 Event 가 존재하며, Spring Application 의 동작과 관련해서는 ApplicationEvent 가 존재한다. 따라서 Spring 이 시작할때 어떤 코드를 실행하고 싶다면 ApplicationEvent 클래스 중 시작과 관련된 Event인 ContextRefreshedEvent를 수신하는 Listener를 정의 하면 된다. @Component @Slf4j public class ApplicationEventListener .. 더보기
Java - LocalDateTime (LocalDate, LocalTime), ZonedDateTime, Period, Duration LocalDate, LocalTime, LocalDateTime, ZonedDateTime 과 같은 API들은 java.util.Date, java.util.Calendar의 단점을 보완하기 위해 Java8에 추가되었다. 기존 (java.util.Date, java.util.Calendar) API의 단점 Thread safe 하지 않다. 동시성 이슈(Concurrency issues)가 존재한다. 향상된 설계와 이해가 용이하다. Date와 Calendar API는 날짜 연산에 적합하지 않게 설계되었다. 새로운 API는 ISO 중심이고, 일관적인 날짜 시간, 기간 도메인 모델을 따르고, 다양한 편의 기능들을 제공한다. 시간대 (시차) 처리가 불편하다. 기존 API에서는 시간대역(시차)를 처리하기 위해 로.. 더보기
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 패키지에 모여 있고, 거의 대부분의 람다 표현식이나 페소드 참조에 사용할 수 있다. 대표적인 함수형 인터페이스로는 아래와 같은 타입들이 있다. 파라미터 없이 어떤 .. 더보기