일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Linux
- 그래프
- 알고리즘
- kruskal
- MySQL
- miller-rabin
- 투 포인터
- spring boot
- tarjan
- 이분 탐색
- 구현
- concurreny
- Java
- DP
- BindingAdapter
- springdoc
- DFS
- BFS
- disjoint set
- 위상정렬
- SCC
- 백트래킹
- union-find
- 분리 집합
- 위상 정렬
- MST
- kapt
- Meet in the middle
- 페르마 소정리
- 누적 합
- Today
- Total
목록Java (42)
기맹기 개발 블로그
1. JVM, JRE, JDK JVM (Java Virtual Machine) 스택 기반의 VM 명령어와 데이터가 모두 스택에 저장된다. 장점 : 스택에 저장된 값의 메모리 주소를 사용하지 않기 때문에 명령어 크기가 작다. 단점 상수 값에 비해 스택에서 값을 가져오는 작업이 느려서 성능이 떨어질 수 있다. 스택에 저장된 값이 메모리 상에 연속적으로 존재하지 않기 때문에 캐시 효율성이 떨어질 수 있다. 레지스터 기반 VM은? 레지스터에 저장된 값을 직접 사용하기 때문에 스택 기반 VM보다 빠르지만, 메모리 사용량이 증가한다. 바이트코드를 OS에 의존적인 머신코드로 변환하여 실행한다. JVM 자체는 바이트코드를 실행하는 표준이며, 특정 벤더에 의해서 구현된다. JVM Specification (Java SE..
이 글은 인프런 강의 재고시스템으로 알아보는 동시성이슈 해결방법 을 수강하고 정리한 내용입니다. 동시성 이슈 하나의 공유 자원에 동시에 여러 스레드가 쓰기 작업을 하는 상황에서는 Race condition이 발생할 수 있다. 간단한 재고 관리 시스템을 예시로 웹 애플리케이션에서의 동시성 이슈와 해결 방법들을 알아보자. @Service public class StockService { ... @Transactional public void decrease(Long id, Long quantity) { Stock stock = stockRepository.findById(id).orElseThrow(); stock.decrease(quantity); stockRepository.saveAndFlush(sto..
JIT 메소드 인라인 OOP에서 캡슐화를 위해 private 필드를 게터/세터만을 이용해서 접근할 수 있도록 합니다. 이로 인해 메소드 호출 스택이 늘어나는 오버헤드가 발생하지 않을까라는 의문을 해결해보고자 합니다. Java JIT 컴파일러의 최적화 Java는 컴파일과 인터프리터 방식을 모두 사용합니다. *.java 코드는 javac에 의해 *.class의 바이트코드로 변환됩니다. JVM 내부에서는 바이트코드를 네이티브 코드로 변환하기 전에 JIT(Just-In-Time) 컴파일러는 런타임에 바이트코드를 최적화합니다. 이 때 최적화를 위해 메소드 인라이닝이 진행됩니다. 메소드 인라이닝 메소드 인라이닝 (inlining)이란 메소드를 호출을 본문으로 대체하는 것입니다. JIT 컴파일러는 자주 호출하는 메소..
Thread 클래스로부터 직접 생성 java.lang.Thread 클래스로부터 Runnable을 매개값으로 갖는 생성자를 호출하여 생성할 수 있다. Runnable은 작업 스레드가 실행할 수 있는 코드를 가진 객체이다. @FunctionalInterface public interface Runnable { public abstract void run(); } Runnable 구현 클래스를 생성하거나, 익명 구현 객체를 만들거나, (자바 8부터는) 람다식을 이용해 매개값으로 전달할 수 있다. 작업 스레드는 생성되는 시점에 실행되는 것이 아니라, start() 메소드를 호출해야 실행된다. Thread thread = new Thread(() -> { // 스레드 실행 코드 }); thread.star..
기존 코드에서의 문제점 저는 springdoc을 이용해 Swagger로 API 문서를 제공하고 있었습니다. springdoc에서 컨트롤러의 API 메소드에 붙여서 자동으로 문서화를 지원하는 어노테이션은 @ApiResponse입니다. 이는 다음과 같이 구성된 인터페이스입니다. @Target({METHOD, TYPE, ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Repeatable(ApiResponses.class) public @interface ApiResponse { String description() default ""; String responseCode() default "default"; Header[] headers()..
제네릭 Java 5부터 추가된 Generic을 사용하여 다음의 장점을 얻을 수 있다. 컴파일 시간에 강한 타입 체크가 가능하다. 불필요한 타입 캐스팅을 제거하여 성능을 향상시킨다. 제네릭 타입: class, interface public class 클래스명 { ... } public interface 인터페이스명 { ... } 타입을 파라미터로 가지는 클래스와 인터페이스를 제네릭 타입이라고 한다. 타입 파라미터는 변수명과 동일한 규칙으로 작성할 수는 있지만, T 처럼 대문자 한글자로 표현하는 것이 관례이다. 자바 7부터 연산자를 사용하면 컴파일러가 타입 파라미터를 자동 추론한다. List myList = new ArrayList(); // 타입 파라미터 명시 List myList = new ArrayLi..
BOJ 17404 RGB거리 2 난이도 : 골드 4 https://www.acmicpc.net/problem/17404 17404번: RGB거리 2 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net 전략 전형적인 DP 문제이다. i 번째 집을 j 색으로 칠하는 비용을 cost[i][j]라고 하자. 0번째 집 ~ i 번째 집을 칠할 때 i번째 집을 j 색으로 칠했을 때 최소 비용을 다음과 같은 점화식으로 표현할 수 있다. dp[i][j] = cost[i][j] + min( {dp[i - 1][j가 아닌 색] } )..
BOJ 16946 벽 부수고 이동하기 4 난이도 : 골드 2 https://www.acmicpc.net/problem/16946 16946번: 벽 부수고 이동하기 4 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 한 칸에서 다른 칸으로 이동하려면, 두 칸이 인접해야 한다. 두 칸이 www.acmicpc.net 전략 N, M blankCount[r][c] 2. 1인 칸에 대해서 상하좌우 blankCount를 더한다. 시행착오 4 5 11001 00111 01010 10101 위의 예시를 보자. 1의 과정이 끝난 다음에 blankCount는 다음과 같이 기록될 것이다. 00220 33000 30101 01010 이 때 map..