본문 바로가기

반응형

전체 글

Chapter 8 컬렉션 API 개선 Arrays.asList() 팩토리 메서드를 통해 리스트를 생성할 수 있다. List friends = Arrays.asList("Raphael", "Olivia", "Thibaut"); 단, 고정 크기의 리스트를 생성했기에 요소 추가, 삭제가 불가능하다. 만약 friends.add("test")로 추가할 경우 UnsupportedOperationException 예외가 발생한다. 이처럼 자바 9에서 작은 리스트, 집합, 맵을 쉽게 만들 수 있도록 팩토리 메서드를 제공한다. 1) 리스트 팩토리 - List.of (크기 변경 불가능) List friends = List.of("Raphael", "Olivia", "Thibaut"); 2) 집합 팩토리 - Set.of (크기 변경 불가능) Set friend.. 더보기
Chapter 7 병렬 데이터 처리와 성능 스트림으로 데이터 컬렉션 관련 동작을 손쉽게 병렬 처리할 수 있다. 병렬 스트림 병렬 스트림은 각각의 스레드에서 처리할 수 있도록 스트림 요소를 여러 청크로 분할한 스트림이다. ParallelStream을 호출하여 병렬 스트림을 생성할 수 있다. 순차 스트림을 병렬 스트림으로 변환하기 (ParallelStream 적용) @Test @Description("1~n까지 숫자의 합을 구하기(직렬 & 병렬)") void parallelStreamTest7_1() throws Exception{ // given int n = 100; Long sequentialResult = Stream.iterate(1L, i->i+1) .limit(n) .reduce(0L, Long::sum); // when Long par.. 더보기
Chapter6 스트림으로 데이터 수집 컬렉터란 무엇인가? collect로 다양한 요소 누적 방식을 인수로 받아서 스트림의 결과 리듀싱 연산기능을 수행할 수 있다. > 고급 리듀싱 기능을 수행할 수 있다. - collect로 결과를 수집하는 과정을 간단하면서도 유연한 방식으로 정의할 수 있다는 점이 컬렉터의 강점임. Collectors에서 제공하는 메서드의 기능 3가지 1. 스트림 요소를 하나의 값으로 리듀스하고 요약 2. 요소 그룹화 3. 요소 분할 1. 리듀싱과 요약 1) counting 팩토리 메서드를 통해 개수를 구할 수 있다. @Test @Description("메뉴 리스트 개수 구하기") void collectTest6_2_0() throws Exception { // given setMenu(); // when long strea.. 더보기
Chapter3 람다 표현식 람다 표현식 : 메서드로 전달할 수 있는 익명 함수를 단순화 한 것 [기존의 코드] Comparator byWeight = new Comparator() { @Override public int compare(Apple o1, Apple o2) { return o1.getWeight().compareTo(o2.getWeight()); } }; [람다를 적용한 코드] Comparator byWeight = (Apple o1, Apple o2) -> o1.getWeight().compareTo(o2.getWeight()); ※ 람다 표현식은 return 을 함축하고 있음으로 return 명시 X 람다는 어디에 사용할까? > 람다는 함수형 인터페이스 (많은 디폴트 메소드를 갖고 있더라도 추상 메소드가 오직 1.. 더보기
Chapter2 동작 파라미터화 코드 전달하기 변화하는 요구사항에 대응하기 위해 단순히 파라미터를 추가하지 않고 동작 파라미터화를 이용하여 유연하게 대응할 수 있다. 동적 파라미터화란, 메서드가 다양한 동작(전략)을 받아서 내부적으로 다양한 동작을 수행할 수 있음을 의미함. 강점 : 한 메서드가 다른 동작을 수행하도록 재활용할 수 있음. [코드 개선하기] 1. 메소드 파라미터로 구현한 필터링 코드 public static List filterApples(List inventory, Color color, int weight, boolean flag){ List result = new ArrayList(); for(Apple apple : inventory){ if(flag && apple.getColor().equals(color) || (!flag.. 더보기
스프링 부트 배치_springBoot batch 1. 스프링 배치의 장점 - 대용량 데이터 처리에 최적화되어 고성능 - 로깅, 통계처리, 트랜잭션 관리등 재사용 가능한 필수 기능 지원 - 수동으로 처리하지 않도록 자동화되어 있음 - 예외 사항과 비정상적인 동작에 대한 방어 기능 존재 - 작업 프로세스 구조만 이해하면 비지니스 로직에만 집중 가능 2. 스프링 부트 배치의 주의사항 스프링 부트 배치는 스프링 배치를 간편하게 사용할 수 있게 하는 프로젝트임 - 복잡한 구조 피하기 - 데이터 무결성을 유지하기 위한 방어책 필요 - 배치 처리 시스템의 I/O 사용 최소화 - 스프링부트 배치 스케쥴러가 따로 없음으로 쿼치 프레임워크 또는 CI 툴 사용을 권장함 3. 스프링 부트 배치 이해하기 일반적인 구조는 3단계로 이뤄져있음 1) 읽기 (Reade) : 데이터.. 더보기
HashMap의 동작 Amortized Constant Time을 위하여 어떻게 해시 충돌 가능성을 줄이는가? HashMap = HashTable 제공 기능은 동일 [차이점] 1. HashMap은 동기화 X (Thread-Safe 보장 안함) -> 직접 Syncronize로 동기화 구현해야됨, HashTable은 동기화 O 2. HashMap은 보조 해시 합수는 사용하기 때문에 HashTable 보다 해시 충돌이 덜 발생함 3. HashMap은 지속적으로 개선되고 있음 [공통점] 1. 키에 대한 해시 값을 사용하여 값을 저장하고 조회하며, 키-값 쌍의 개수에 따라 동적으로 크기가 증가하는 할당 배열이라고 부름 HashMap java 8 버전에 개선된 사항 데이터의 개수가 일정 이상일 때에는 링크드리스트보다 트리가 성능상 이점.. 더보기
가비지 컬렉션에 대한 정리 stop-the-world = GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것 -GC를 실행하는 쓰레드를 제외한 모든 쓰레드는 멈춤 [GC의 가설] Weak generational hypothesis - 1. 객체는 금방 접근 불가능 상태, 2. 오래된 객체에서 젋은 객체로의 참조는 드물다 위 가설의 장점을 살리고자 물리적 구조를 Young 영역, Old 영역으로 나뉜다 Young 영역 - 새로 생성된 객체들이 위치하는 곳, Minor GC 발생 Old 영역 - Young 영역에서 살아남은 객체들이 위치하는 곳, Major GC(Full GC) 발생 ※ Old 영역의 객체가 Young 영역의 객체를 참조하는 경우 Old 영역에는 카드 테이블이 존재함 -> Young 영역 객체에서 Old 영역.. 더보기

반응형