전체 글 410

JDK LTS 와 각각의 내용에 대해 간략히 알아보자(JDK8, JDK11, JDK17, JDK21, JDK25)

일단 Java 에서 LTS 는 현재까지JDK8JDK11JDK17JDK21JDK25가 있다.우리는 기본적으로 JDK21 을 쓰고 있는데, 그래서 이걸 써서 뭐가 좋아졌어? 하면 뭔가 피상적인 대답밖에 할 수 없었어서… 무엇이 좋아졌는지를 조금 더 상세히 보려 한다.JDK8아마 책에서 modern java 라고 하면 얘를 많이 대상으로 했을 것이다.이전 java 랑은 차원이 다르게 많이 바뀌기도 했고 자바를 쓸 일이 있으면 최소한 이거는 써야 한다는 생각이 든다.JDK8의 특징특징은 다음과 같다.Lambda ExpressionStream APIOptionalLocalDate이미 워낙 유명해서 딱히 뭐 설명할만한 특성은 없다.한가지 재미있는 부분은 람다'식' 과 스트림'API' 라는 이름인데 저게 다른 이름으..

이론 정리/java 2025.10.10

간략한 Shenandoah GC 방식 설명

ZGC처럼 STW이 유발하는 지연 시간을 줄이는 것이 목표개념포워딩 포인터, 배리어 두개를 통해 동시 압축을 구현했다.포워딩 포인터(Forwarding Pointer)모든 객체는 헤더에 1word 크기의 포워딩 포인터를 위한 추가 공간을 가진다. (평상시는 자기 자신을 지칭)1word 는 보통 해당 시스템의 레지스터 크기나 메모리 주소의 크기와 같다.32비트에서는 32비트64비트에서는 64비트객체의 주소가 변경되면 기존 주소에 있는 객체의 헤더에 변경된 주소 데이터를 남긴다(포워딩 포인터에 변경)읽기/쓰기 배리어이름 그대로 읽기/쓰기 양쪽에 모두 적용되는 배리어애플리케이션 스레드가 힙에 있는 객체에 접근하려 할 때마다 배리어 코드 실행배리어가 객체 헤더를 확인해서 포워딩 포인터가 설정되어 있는지 확인하고..

이론 정리/java 2025.10.10

간략한 ZGC 방식 설명

힙 크기가 무관하게 일시정지 시간을 1ms 미만으로 보장하는 것이 목표참고로 얘는 64비트 이상의 컴퓨터에서만 활용 가능하다(컬러드 포인터의 동작 방식과 연관이 있음)개념컬러드 포인터, 로드 베리어라는 것이 핵심이다.컬러드 포인터(Colored Pointer)64비트 운영체제에서 메모리 주소는 64비트를 다 사용하지 않는데(64비트는 진짜 개커서 실제로 컴퓨터는 48/52비트를 사용하도록 설계되어 있기 때문) 그래서 나머지 비트는 잉여 공간이 된다.이렇게 남은 잉여 공간 활용 가능GC 관련 메타데이터(객체가 마킹되었는지, 재배치 되었는지 등)을 저장헤더가 아닌 포인터 자체에 정보를 저장하기 때문에 객체에 접근하는 시점에 상태를 알 수 있다로드 배리어GC에서 객체 이동을 하면 파편화가 발생할 수 있어(주소..

이론 정리/java 2025.10.10

간략한 G1GC 방식 설명

여기서 '1' 은 one 이 아니라 first 라고 생각하면 된다.즉, garbage 를 먼저 처리하는 방식이다.개념이전의 serial, parallel GC 에서는 Young 영역과 old 영역을 물리적으로 나누어 두었는데, 이거는 다른 식으로 생각한다.전체 Heap 을 여러 개의 'Region' 으로 나눈다. (보통은 heap 영역의 크기에 맞춰서 2048개의 region 을 만들도록 각 region 의 크기를 결정한다.)각각의 region 은 동적으로 Eden, Survivor, Old 역할을 부여받는다.보통 때에는 Free 상태로 있다가 필요할 때 할당된다.참고로 GC가 끝나면 다시 Free 상태로 돌아감Region 의 크기의 50% 를 초과하는 객체는 'Humongous' 라는 Region 에 ..

이론 정리/java 2025.10.10

간략한 Serial, Parellal GC 방식 설명

Heap Memory 구조Young Generation새로 생성된 객체 대부분이 여기 있다.이거는 3개로 나뉜다. eden, survivor0, survivor1Eden : 새로 생기면 여기 있음Survivor0, Survivor1 : Eden 에서 최소 한 번 이상 살아남으면 여기 있다. 하나의 영역에 모든 애들이 존재하고 Minor GC 단계에서 스와핑함Old GenerationYoung Generation 에서 여러번 GC가 있어도 살아남은 친구들을 여기로 옮긴다.이거는 오랫동안 사용될 가능성이 높은 친구들이다.동작Minor GCEden 영역이 꽉차면 발생한다.Mark and Copy로 동작한다.STWMarkStack 영역이나 static 변수 등에서부터 시작해서 Eden, Survivor 영역의 ..

이론 정리/java 2025.10.09

BOJ 14567 java 풀이

DP 문제이다.선수과목에서 숫자가 큰거보다 나중에 들어야하는 작은거는 없다.작은거부터 큰거로 가면서 이전 선수과목 중 가장 기수가 높은거 + 1 해주면 된다.그리고 그 과정에서 이 과목이 내꺼의 선수과목인지를 미리 체크해서 그걸 쓰면 됨 import java.util.Scanner;class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int M = sc.nextInt(); boolean[][] cond = new boolean[N+1][N+1]; int[] dp = new in..

알고리즘 공부 2025.09.14

BOJ 2303 재풀이

DP로 푼다.내꺼 기준 왼쪽만 본다. - 내가 왼쪽이랑 숫자를 바꾸려 하면 : 왼쪽 숫자는 변경되지 않은 상태일때만 가능- 내가 왼쪽이랑 숫자를 바뀌지 않는다면 : 왼쪽 숫자가 변경되었든 아니든 상관 없음. 근데 내 왼쪽이 vip거나 내가 vip 면 그냥 왼쪽의 모든 방법을 더해주면 된다. 즉, 앞의 상태를 가지고 있는 DP import java.util.Scanner;class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); boolean[] seat = new boolean[n+1]; int vips = ..

알고리즘 공부 2025.09.14

BOJ 17070 java 풀이

DP 문제이고 (BFS 쓰면 시간초과남)중요한건 결국 "해당 위치에 도달하는 방법을 구하면 된다"예를 들어 왼쪽으로 오는 방법은 왼쪽/대각선, 세로로 오는 방법은 세로/대각선, 대각선으로 오는 방법은 왼쪽/세로/대각선그래서 그 이전에 있던 방법들을 구하면 됨 import java.util.Scanner;class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[][] map = new int[n][n]; for (int i = 0; i 0) { dp[2][i][j] ..

알고리즘 공부 2025.09.14

LeetCode 1293. Shortest Path in a Grid with Obstacles Elimination java 풀이

문제가 어려워서 오래 걸림. 최단 거리 -> BFS장애물 부수기 -> 해당 위치에 n 번 부술 수 있는 상태로 방문한 적 있는가? 상태 체크 --> 유일성 확인 로직을 부술 수 있는 횟수까지 포함해야 한다. 3차원 배열로 check 하지 않으면 나중에 부술 수 있는데 안부수는 문제가 생김. class Solution { private static boolean[][][] check; private static int[] xMove = {-1, 1, 0, 0}; private static int[] yMove = {0, 0, -1, 1}; public int shortestPath(int[][] grid, int k) { if(grid.length == 1 && grid[..

알고리즘 공부 2025.09.13

미미키는 NCP를 어떻게 활용했는가

미미키가 뭐에요?'아.. 그 밈 뭐더라?'하며 특정 상황에 맞는 밈을 찾지 못했던 경험을 해결하기 위해 기획된 밈 백과사전 서비스입니다.밈을 쉽게 찾고, 어떨 때 쓸 수 있는지 확인하고, 상황에 맞춰 빠르게 활용할 수 있는 서비스에요. 여기서 밈잘알 테스트를 해볼수도 있고 실제로 앱을 깔아서 쓰셔도 좋습니다.서버는 어떻게 구성했나요?NCP 를 활용했고, 인프라 구축과 배포 환경은 최대한 자동화된 방식으로 할 수 있도록 다음과 같이 적용했습니다.Compute > Server (VM): Docker 컨테이너(애플리케이션, 데이터베이스 등)를 실행하고 실제 서비스를 운영하는 가상 서버 환경으로 사용했습니다.Container > Container Registry: GitHub Actions에서 빌드된 애플리케..