| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- propagation
- type eraser
- IllegalStateException
- tracking-modes
- pessimistic lock
- Transaction
- COPYOFRANGE
- NestJS 요청흐름
- TDZ
- SPOF
- optimistic lock
- generic type
- hoisting
- RequestMappingHandlerMapping
- ExceptionResolver
- 프로그래머스
- cross-cutting concerns
- Generic method
- API
- CORS
- assertJ
- #@Transacional
- HandlerMethod
- CQS
- Java
- demand paging
- 단어변환
- 벌크연산
- 역정규화
- wrapper class
- Today
- Total
목록Language/Java (58)
jingyulog
제네릭의 타입 매개변수와 타입 인자제네릭의 핵심은 사용할 타입을 미리 결정하지 않는다는 점이다. 즉, 클래스 내부에서 사용하는 타입을 클래스를 정의하는 시점에 결정하는 것이 아니라, 해당 클래스를 실제 사용하는 생성 시점에 클래스 내부에서 사용할 타입을 결정하는 것이다. 이를 쉽게 비유하면 메서드의 매개변수와 인자의 관계와 비슷하다. 차이가 있다면 메서드의 매개변수는 사용할 값에 대한 결정을 나중으로 미루는 것이고, 제네릭의 타입 매개변수는 사용할 타입에 대한 결정을 나중으로 미루는 것이다.메서드는 매개변수에 인자를 전달해서 사용할 값을 결정한다.제네릭 클래스는 타입 매개변수에 타입 인자를 전달해서 사용할 타입을 결정한다.용어 정리제네릭 타입(Generic Type)클래스나 인터페이스를 정의할 때, 타입..
개요우리가 작성한 .java 파일은 JDK에 포함된 javac(java compiler)를 통해 컴파일된다. 이 과정에서 JVM에 이해할 수 있는 바이트 코드로 변환되어 .class 파일이 생성된다.이후부터는 JVM이 담당하는데, 먼저 Class Loader가 바이트 코드를 JVM 메모리에 동적으로 로드한다. 이렇게 로드된 바이트 코드는 Method Area에 저장되며, 이때, Loading, Linking, Initiaiization 단계를 거친다.그다음 실행 엔진(Execution Engine)이 로드된 바이트 코드를 실행한다. 하지만 바이트 코드는 컴퓨터가 읽을 수 없기 때문에 Interpreter와 JIT 컴파일러(Just-In-Time Compiler)를 함께 사용하여 기계어로 변환한다.Inte..
public T genericMethod(T o) {// 제네릭 메소드 ... } [접근 제어자] [반환타입] [메소드명]([제네릭타입] [파라미터]) { // 텍스트 } 제네릭 메서드는 클래스와 다르게 반환타입 이전에 제네릭 타입을 선언한다. 그러면 genericMethod는 파라미터 타입에 따라 T 타입이 결정된다. 즉, 클래스에서 지정한 제네릭 유형과 별도로 메서드에서 독립적으로 제네릭 유형을 선언하여 쓸 수 있다. 여기서에 제네릭 메서드가 필요한 이유에 대한 힌트를 얻을 수 있다. 바로 정적 메서드로 선언할 때 필요하기 때문이다. 즉, 객체 생성과 관계 없이 독립적으로 static 메서드에서 사용할 제네릭 타입이 필요한 것이다.
ThreadLocal을 사용하여 동기화를 적용하여 개발하기 위해 기존 인스턴스 변수의 참조타입을 ThreadLocal으로 변경할 수 있다. 이를 적용하여 필드 대신에 ThreadLocal을 사용하여 데이터를 동기화하는 ThreadLocalLogTrace 클래스를 만들면 다음과 같다. package hello.advanced.trace.logtrace; import hello.advanced.trace.TraceInfo; import hello.advanced.trace.TraceStatus; import lombok.extern.slf4j.Slf4j; @Slf4j public class ThreadLocalLogTrace implements LogTrace{ private static final Stri..
동시성 문제를 알아보기 위해 파라미터로 넘어온 name을 클래스 변수 nameStore에 저장하고, 1초간 쉰 다음 nameStore가 참조하는 값을 반환하는 서비스 코드를 다음과 같이 작성한다. @Slf4j public class FieldService { private String nameStore; public String logic(String name) { log.info("저장 name = {} -> nameStore = {}", name, nameStore); nameStore = name; sleep(1000); log.info("조회 nameStore = {}", nameStore); return nameStore; } private void sleep(int millis) { try {..
병행(concurrent)와 병렬(parallel) 싱글 코어에서 하나의 쓰레드로 두 개의 작업을 수행한 시간보다 오히려 두 개의 쓰레드로 작업한 시간이 싱글쓰레드로 작업한 시간보다 더 걸리게 되는데 그 이유는 쓰레드간의 context swtiching에 시간이 걸리기 때문이다. 따라서 싱글 코어에서 단순히 CPU만을 사용하는 계산 작업이라면 오히려 멀티쓰레드보다 싱글쓰레드로 프로그래밍하는 것이 더 효율적이다. 다음은 하나의 쓰레드로 두 가지 작업을 하는 코드와 결과이다. public class ThreadEx4 { public static void main(String[] args) { long startTime = System.currentTimeMillis(); for (int i = 0; i < ..
