일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- #@Transacional
- generic type
- assertJ
- NestJS 요청흐름
- SPOF
- pessimistic lock
- 프로그래머스
- COPYOFRANGE
- wrapper class
- propagation
- optimistic lock
- 역정규화
- demand paging
- Transaction
- 단어변환
- Generic method
- Java
- CQS
- CORS
- hoisting
- API
- cross-cutting concerns
- 벌크연산
- RequestMappingHandlerMapping
- tracking-modes
- type eraser
- TDZ
- IllegalStateException
- HandlerMethod
- ExceptionResolver
- Today
- Total
목록Language/Java (59)
jingyulog
개요Set은 중복을 허용하지 않고, 순서를 보장하지 않는 자료 구조이다.따라서 이를 구현하는 방법은 단순하다. 인덱스가 없기 때문에 단순히 데이터를 저장하고, 데이터가 있는지 확인하고, 데이터를 삭제하는 정도면 된다. 그리고 중복을 허용하지 않기 때문에 데이터를 추가할 때 중복 여부를 체크하면 된다.add(value): set에 값을 추가한다. 중복 데이터는 저장하지 않는다.contains(value): set에 값이 있는지 확인한다.remove(value): set에 있는 값을 제거한다.MyHashSetV0의 문제점Set을 구현한 다음 MyHashSetV0 버전의 코드의 문제는 데이터를 추가할 때 중복 데이터가 있는지 체크하는 부분에서 성능이 O(n)으로 좋지 않다는 점이다. 왜냐하면 이때 중복 데이터..
제네릭의 타입 매개변수와 타입 인자제네릭의 핵심은 사용할 타입을 미리 결정하지 않는다는 점이다. 즉, 클래스 내부에서 사용하는 타입을 클래스를 정의하는 시점에 결정하는 것이 아니라, 해당 클래스를 실제 사용하는 생성 시점에 클래스 내부에서 사용할 타입을 결정하는 것이다. 이를 쉽게 비유하면 메서드의 매개변수와 인자의 관계와 비슷하다. 차이가 있다면 메서드의 매개변수는 사용할 값에 대한 결정을 나중으로 미루는 것이고, 제네릭의 타입 매개변수는 사용할 타입에 대한 결정을 나중으로 미루는 것이다.메서드는 매개변수에 인자를 전달해서 사용할 값을 결정한다.제네릭 클래스는 타입 매개변수에 타입 인자를 전달해서 사용할 타입을 결정한다.용어 정리제네릭 타입(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 {..