EnumSet 키로 enum 상수를 사용 enum 상수를 기반으로 하므로 효율적으로 동작 키 집합이 고정되어 있으므로 메모리 사용이 효율적 키가 해당 enum의 상수와 일치하는 경우 비트 벡터로 구현되어 있어 공간 효율적 null 값을 허용하지 않는다 열거 순서(iterator order)는 해당 enum의 상수가 선언된 순서 enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } public static Day WEEKEND_DAY = EnumSet.of(SATURDAY, SUNDAY); EnumMap 키로 enum 상수를 사용 enum 상수를 기반으로 하므로, 키의 순서가 고정되어 있고 연속적 enum 상수를 사용할 때 ..
LocalDate 시간을 제외한 날짜를 표현하는 불변 객체 LocalDate date = LocalDate.of(2023,10,18);//2023-10-18 int year = date.getYear(); Month month = date.getMonth(); int day = date.getDayOfMonth(); DayOfWeek dow = date.getDayOfWeek(); //WEDNESDAY int len = date.lengthOfMonth();//31 (10월의 일수) boolean leap = date.isLeapYear();//false (윤년) TemporalField 시간 관련 객체에서 어떤 필드의 값에 접근할지 정의하는 인터페이스 ChronoField는 TemporalField 인..
익명 클래스를 람다 표현식으로 리펙토링 1. 익명 클래스에서 this는 익명클래스 자신을 가리키지만 람다에서 this는 람다를 감싸는 클래스를 가리킨다. 2. 람다에서 감싸는 클래스의 변수를 가릴 수 없다. int a = 10; Runnable r1 = () -> { int a = 2;// Conmpile Error }; Runnable r2 = new Runnable() { public void run() { int a = 2;// Success } }; 3. 익명 클래스는 인스턴화할 때 명시적으로 형식이 정해지지만 람다의 형식은 콘텍스트에 따라 달라진다. interface Task { public void execute(); } public static void doSomething(Runnable ..
What? Java 객체를 JSON으로 Serialize 할 때, API Request, Response 으로 JSON 으로 변환 할 때, DTO 객체를 Mybatis 에 전달할 때 등등 boolean 타입 필드명의 'is' 가 누락되는 현상 @Getter @Setter public class Car { private boolean isElectronic; } // {"electronic":false} Why? Lombok의 @Getter를 사용하게 되면 boolean 필드는 getter 메소드가 아니라 is 메소드를 생성 (getIsElectronic 이 아닌 isElectronic) is로 시작하는 필드명은 is가 중복되지 않고 생성 (isIsElectronic 이 아닌 isElectronic) @G..
ConcurrentHashMap 동시성 친화적 내부 자료구조의 특정 부분만 잠궈 동시 추가, 갱신 작업 허용 동기화된 HashMap 보다 읽기 쓰기 연산 성능이 월등 forEach : 각(키, 값) 쌍에 주어진 액션을 수행 forEach, forEachKey, forEachValue, forEachEntry reduce : 모든(키, 값) 쌍을 제공된 reduce 함수를 이용해 결과로 합침 reduce, reduceKeys, reduceValues, reduceEntries search : null이 아닌 값을 반환할 때까지 각(키, 값) 쌍에 함수를 적용 search, searchKeys, searchValues, searchEntries 계산이 진행되는 동안 바뀔 수 있는 객체, 값, 순서 등에 의존..
forEach 메서드 Map.Entry 의 반복자를 이용하던 것을 BiConsumer를 인수로 받는 forEach 메서드 지원 Map ageOfFriends = Map.of("A", 27, "B", 21, "C", 25); for(Map.Entry entry : ageOfFriends.entrySet()) { String friend = entry.getKey(); Integer age = entry.getValue(); System.out.println(friend + " is " + age + " years old."); } ageOfFriends.forEach((friend, age) -> System.out.println(friend + " is " + age + " years old.")); 정..
컬렉션 팩토리 자바 9에서는 컬렉션 객체를 쉽게 만들 수 있는 방법을 제공 고정 크기의 리스트를 만들었으므로 요소를 갱신할 수 있지만 추가하거나 삭제 불가 (UnsupportedOperationException 발생) List friends = Arrays.asList("A", "B", "C"); List 정적 팩토리 메소드 List.of 팩토리 메소드로 변경할 수 없는 리스트 생성 요소를 추가하려면 UnsupportedOperationException 발생 set() 메서드로 변경하려해도 예외 발생 null 요소는 금지하므로 의도치 않은 버그를 방지 List.of 팩토리 메소드는 다양한 오버로드 버전 (최대 10개까지) 10개 이상의 요소는 가변인수 버전의 팩토리 메소드 사용 추가 배열을 할당해서 리스..
gradle// https://mvnrepository.com/artifact/org.json/jsonimplementation 'org.json:json:20230618'Object to JsonUser user = new User("Chris", 34);Car car1 = new Car();car1.setName("K5");car1.setCarNumber("1234");car1.setType("SUV");Car car2 = new Car();car2.setName("K7");car2.setCarNumber("1111");car2.setType("SEDAN");List carsList = Arrays.asList(car1, car2);user.setCars(carsList..
Mokito Framework Mockito는 Java에서 Mock 객체를 만들고 테스트하는 데 사용되는 인기있는 프레임워크 다른 클래스에 대한 가짜(Mock) 객체를 만들고, 해당 객체가 어떻게 동작해야 하는지를 정의하고, 테스트 중에 해당 객체의 동작을 검증 Mockito는 테스트 주도 개발(Test Driven Development, TDD) 및 단위 테스트 작성을 보다 쉽고 효율적으로 만들어줍니다. Mock 객체 생성: Mockito를 사용하여 다른 클래스의 가짜(Mock) 객체를 생성할 수 있습니다. 동작 정의: Mockito를 사용하여 Mock 객체의 특정 메서드 호출에 대한 동작을 정의할 수 있습니다. 예를 들어, 특정 메서드가 호출될 때 반환해야 하는 값을 지정하거나, 예외를 던져야 할 때..
gradleimplementation 'net.sf.json-lib:json-lib:2.4:jdk15@jar'implementation 'commons-lang:commons-lang:2.6'implementation 'commons-logging:commons-logging:1.2'implementation 'commons-collections:commons-collections:3.2.2'implementation 'commons-beanutils:commons-beanutils:1.9.4'implementation 'net.sf.ezmorph:ezmorph:1.0.6'Object to JsonUser user = new User("Chris", 34);Car car1 = new C..