프로그래밍 노트/JAVA

자바 5에서 제공하는 Executor 프레임워크와 스레드 풀을 통해 자바는 스레드의 힘을 높은 수준으로 끌어올렸다. 바로 태스크 제출과 실행을 분리하여 제공했기 때문이다. 우리는 스레드 풀을 만들어 놓고, 스레드풀에 태스크만 제출하면 된다! 스레드의 문제점 ㅠㅠ 운영체제에 직접 접근한다. 생성비용이 비싸다. 운영체제 스레드의 숫자는 제한되어 있으며, 이 수를 초과해버리면 자바 애플리케이션이 예상치 못한 방식으로 크래시될 수 있다. (계속 스레드를 생성하는 상황은 절대 나오면 안된다.) 즉, 개발자가 직접 스레드를 다루기에는 신경쓸게 많다는 것이다. 만약에 다양한 기기에서 실행될 수 있는 프로그램을 만든다면 미리 하드웨어 스레드 개수를 추측하지 않는 것이 좋다. 주어진 프로그램에서 사용할 최적의 자바 스레..
LocalDateTime 시간대(Zone Offset, Zone Region)에 대한 정보가 없는 API이다. (Local 이 접두어로 붙어있다.) 즉, 한국에서 2021-01-01T08:00:00 시간이라면 다른 지역으로 넘어가도(미국) 같은 2021-01-01T08:00:00를 나타낸다. LocalDateTime = LocalDate + LocalTime LocalDateTime birthDateTime = LocalDateTime.of(1990, 10, 16, 08, 00, 00); ZonedDateTime LocalDateTime + Time Zone(시간대) 가 합쳐진 방식이다. ZonedDateTime = LocalDate + LocalTime + ZoneOffset + ZoneRegion Z..
2020/12/19 - [프로그래밍 노트/JAVA] - [JAVA] JVM 가상머신 메모리 구조 가비지 컬렉터(GC) 애플리케이션이 생성한 객체의 생존 여부를 판단하여, 더 이상 참조되지 않거나 null인 객체의 메모리를 해제시키며 메모리를 반납한다. (Heap의 재사용) Minor GC New/Young 영역에서 일어나는 Garbage Collection 새로 생성된 객체(Instance)는 Eden 영역에 위치한다. Eden 영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동된다. 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 일정시간 참조되고 있다는 뜻이므로 Old영역으로 이동시킨다. Eden 영역에 객체가 가득차게 되면 GC 발생 Survivor0 영역에 ..
JAVA8 의 Time 패키지에서 날짜 차이를 구하는 방법을 알아보자. Duration 사용 Period 사용 ChronoUnit 사용 Duration 두 시간 사이의 간격을 나타낸다. between() 정적 메서드를 사용하면, Duration 객체를 생성해 준다. LocalDateTime startDateTime = LocalDateTime.of(2020, 12, 20, 9, 30, 30); LocalDateTime endDateTime = LocalDateTime.of(2020, 12, 20, 10, 0, 40); Duration duration = Duration.between(startDateTime, endDateTime); log.debug("seconds : {}", duration.getS..
JVM 가상머신, JVM 구조 JAVA와 OS 사이에서 중개자 역할을 수행하여 JAVA가 OS에 구애받지 않고 재사용을 가능하게 해준다. 메모리 관리, Garbage collection을 수행한다. 실행과정 JVM은 OS로부터 프로그램이 필요로 하는 메모리를 할당 받는다. (메모리를 여러 영역으로 나누어 관리) 자바 컴파일러(javac)가 자바 소스코드(.java)를 바이트코드(.class)로 변환시킨다. Class Loader를 통해 class 파일들을 JVM으로 로딩한다. 로딩된 클래스는 Runtime Data Area에 배치됟나. Execution Engine이 class 파일들을 해석(interpret)한다. 해석된 바이트코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어지..
collect()메소드는 단순히 요소를 수집하는 기능 외 컬렉션의 요소들을 그룹핑해서 Map객체를 생성하는 기능도 제공한다. Collectors의 groupingBy() 또는 groupingByConcurrent()가 리턴하는 Collector를 매개값으로 대입하면 사용할 수 있다. groupingBy()는 Map객체를 리턴하며, groupingByConcurrent는 ConcurrentMap을 리턴한다. Collectors의 static method // With a classification function as the method parameter: // T를 K로 매핑하고, K키에 저장된 List에 T를 저장한 Map 생성 static Collector groupingBy(Function
List, Set, Map과 같은 java collection이 아니라, 우리가 직접 만든 클래스로 컨테이너를 사용하려면 어떻게 해야 할까? 스트림은 사용자 정의 컨테이너 객체에 수집할 수 있도록 Stream 인터페이스는 collect() 메소드를 제공한다. (Stream, IntStream, LongStream, DoubleStream 인터페이스의 collect 메소드) https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html collect(Supplier, BiConsumer, BiConsumer) (리턴타입 R) 첫 번째 매개변수, 공급자(Supplier) : 요소들이 수집될 컨테이너 객체(R)을 생성하는 역할을 한다. 순차 처리..
스트림은 최종 처리 단계에서 요소들을 수집하는 collect()를 제공하고 있다. 이 메소드를 이용하면 필요한 요소만 컬렉션으로 담을 수 있고, 요소들을 그룹핑한 후 집계(리덕션)할 수 있다. 필터링한 요소 수집 Stream의 collect(Collector collector) 메소드는 필터링, 매핑된 요소들을 새로운 컬렉션에 수집해서 리턴한다. 매개값인 Collector는 어떤 요소를 어떤 컬렉션에 수집할 것인가를 나타낸다. 타입 파라미터의 의미(T, A, R) T ⇒ 요소 A ⇒ 누적기(accumulator) R ⇒ 저장될 컬렉션 T 요소를 A 누적기가 R에 저장한다는 의미가 된다. Collector의 구현객체는 Collectors 클래스의 정적 메소드를 이용해서 이용할 수 있다. 참고) https:..
Stream API는 최종 처리 단계 에서 요소들이 특정 조건에 만족하는지 조사할 수 있도록 세가지 매칭 메소드를 제공한다. allMatch() 모든 요소들이 매개값으로 주어진 Predicate의 조건을 만족하는지 조사 anyMatch() 최소한 한 개의 요소가 매개값으로 주어진 조건을 만족하는지 조사 noneMatch() 모든 요소들이 매개값으로 주어진 조건을 만족하지 않는지 조사 public static void main(String[] args){ int[] intArr = {2, 4, 6}; boolean result = Arrays.stream(intArr) .allMatch(a -> a%2 == 0); System.out.println("2의 배수? " + result); result = Ar..
Optional을 어떻게 하면 효율적으로 사용할 수 있을까? 전통적인 null check 코드를 살펴보자 NullPointException 방어패턴 중첩 null 체크 if(a != null){ B b = a.getMember(); if(b != null){ C c = b.getAddress()); if(c != null){ ... } } } return "incheon"; return 하기 if(a == null) return "incheon"; B b = a.getMember(); if(b == null) return "incheon"; C c = b.getAddress(); ... 어떻게 하면 null처리를 효과적으로 어떻게 할 수 있을까? Optional 자바8에는 Optional이라는 것이 생겼..
깡냉쓰
'프로그래밍 노트/JAVA' 카테고리의 글 목록 (2 Page)