Java

    [Java의 정석] 14. 람다와 스트림

    [Java의 정석] 14. 람다와 스트림

    1. 람다식 1) 람다식이란? 메서드의 이름과 반환값 없이, 하나의 식처럼 표현한 것으로 '익명 함수'라고도 한다. int[] arr = new int[5]; Arrays.setAll(arr, (i) -> (int) (Math.random()*5 + 1)); // 람다식 더보기 /* int max(int a, int b) { return a > b ? a : b; } */ (int a, int b) -> a > b ? a : b (a, b) -> a > b ? a : b // 타입 추론이 가능한 경우는 타입 힌트를 생략 가능 더보기 a -> a*a // 매개변수가 하나인 경우는 괄호 생략 가능 (int a) -> a*a // 매개변수 타입이 있으면 괄호 생략 불가능 더보기 /* (String name, ..

    Java 한글 인코딩 안될때 jdk 버전 확인해야함.

    Java 한글 인코딩 안될때 jdk 버전 확인해야함.

    배경 IDE 에서는 한글이 잘 출력되는데, java 소스코드(System.out.println)를 통해서 출력시 글자가 깨지는 현상. 원인 JEP-400(인코딩이 default 로 UTF-8 로 설정되는 기능)이 jdk 18 버전에서 문제를 일으키는 것으로 확인. (Windows 환경) 해결방안 jdk 버전을 17 이하 버전을 사용할 것. 참고 https://inside.java/2021/10/04/the-default-charset-jep400/ Jep 400 and the default charset – Inside.java Have you ever wondered what is `default charset`? Here’s what the javadoc for Charset.defaultCharse..

    Spring MSA 를 간단하게 구현해보자 (+ 최신 release, 모니터링, heapdump)

    Spring MSA 를 간단하게 구현해보자 (+ 최신 release, 모니터링, heapdump)

    GitHub - Dong-Hyeon-Yu/spring-cloud-monitoring-example: Monitoring Spring MSA example (release train-2021.01) / gateway+discover Monitoring Spring MSA example (release train-2021.01) / gateway+discovery+config+feign / grafana+prometheus+docker / jvm heap dump example - GitHub - Dong-Hyeon-Yu/spring-cloud-monitoring-example:... github.com 환경 ▪️ Release Trains : 2021.0.1 (https://spring.io/project..

    JavaThread 에 대해 깊게 이해해보자 (feat. Openjdk 커널 분석)

    JavaThread 에 대해 깊게 이해해보자 (feat. Openjdk 커널 분석)

    Thread에 대한 기초적인 os 지식은 이 글(쓰레드(Thread)와 동기화 문제)을 참고하기 바람 Thread는 user가 관리하느냐, os가 관리하느냐에 따라 User-Level-Thread 또는 Kernel-Level-Thread 로 나뉜다. 두 가지의 장점을 합친 Hybrid 모델도 존재한다. Java에서는 Kernel thread와 User thread를 모두 사용하는 Hybrid 모델이다. (jdk 1.2 버전까지는 100% User-Level-Thread인 GreenThread라는 것이 있었다고 한다.) 그림을 잘 보면, User-level thread 3개가 2개의 Kernel-Level-Thread를 공유하고 있는 것을 알 수 있다. OS 수업을 듣다가, java 는 구체적으로 이런 방..

    [JVM] 레퍼런스

    GC 관련 HotSpot Virtual Machine Garbage Collection Tuning Guide One strength of the Java SE platform is that it shields the developer from the complexity of memory allocation and garbage collection. docs.oracle.com JVM specification The Java® Virtual Machine Specification Tim Lindholm Frank Yellin Gilad Bracha Alex Buckley Daniel Smith docs.oracle.com Java concurrency 정리 잘된 블로그 https://jenkov.com/..

    JIT compiler

    JIT compiler

    JVM 은 이식성을 위해 java specific instruction 을 생성하고 JVM 에서 line by line 으로 해석한다. 하지만 이런 방식은 c 같은 언어에 비해 매우 느릴 수 밖에 없다. c 는 모든 코드를 기계어로 한번에 번역하여 실행하는 반면 java 는 동일한 함수가 여러번 호출되는 경우에, 해당 함수를 번역하고 실행하는 작업이 반복되기 때문이다. 그러한 코드를 hot code 라고 하고, 잘 호출되지 않는 코드를 cold 코드라고 한다. 그래서 JIT 컴파일러를 도입하여, hot code 는 machine specific 한 기계어로 번역을 하고 캐시하는 것이다. 이런 방식으로 인터프리터 방식의 단점을 보완한다.

    Java Bytecode 와 RISC-V instruction 비교

    Java Bytecode 와 RISC-V instruction 비교

    c 와 java 의 차이점 - 함수호출을 c 에서는 call procedure, java 에서는 invoke method - 객체참조를 c 에서는 포인터, java 에서는 object reference - c 에서는 메모리를 동적할당한 후에 명시적으로 해제해야하는 반면, java 에서는 사용자가 그렇지 않았을 때의 오류를 방지하기 위해 garbage collector가 참조되지 않는 힙 메모리를 정리한다. (full gc 등) 그래서 java 에서는 free 라는 예약어가 없다. - c array 은 bound 검사를 하지 않는다. java 는 배열 선언 시 해당 배열에 대한 길이를 따로 저장하고, 범위를 초과하는 참조에 대해서 runtime 에 오류를 발생시킨다. Java Bytecodes vs RIS..

    [Java의 정석] 12. 제네릭스, 열거형, 어노테이션

    1. Generics 1.1 제네릭스란? : 컴파일 시에 타입을 확인하는 기능. => 타입 안정성을 높이고 형변환의 번거로움을 줄인다. 1.2 제네릭 클래스의 선언 class Box { T item; void setItem(T item) { this.item = item; } T getItem() { return this.item; } } Box b = new Box(); b.setItem(new Object()); // error b.setItem("abc"); // ok // 이전 코드 호환을 위해 아래도 가능 Box b = new Box(); b.setItem(new Object()); // ok, but warning b.setItem("abc"); // ok, but warning Box : 제..