일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 프로그래머스
- propagation
- 벌크연산
- generic type
- CQS
- NestJS 요청흐름
- cross-cutting concerns
- pessimistic lock
- Java
- SPOF
- COPYOFRANGE
- hoisting
- type eraser
- 역정규화
- Transaction
- assertJ
- ExceptionResolver
- RequestMappingHandlerMapping
- IllegalStateException
- #@Transacional
- tracking-modes
- HandlerMethod
- demand paging
- TDZ
- API
- wrapper class
- CORS
- optimistic lock
- 단어변환
- Generic method
- Today
- Total
목록Language (116)
JingyuKim
제네릭의 타입 매개변수와 타입 인자제네릭의 핵심은 사용할 타입을 미리 결정하지 않는다는 점이다. 즉, 클래스 내부에서 사용하는 타입을 클래스를 정의하는 시점에 결정하는 것이 아니라, 해당 클래스를 실제 사용하는 생성 시점에 클래스 내부에서 사용할 타입을 결정하는 것이다. 이를 쉽게 비유하면 메서드의 매개변수와 인자의 관계와 비슷하다. 차이가 있다면 메서드의 매개변수는 사용할 값에 대한 결정을 나중으로 미루는 것이고, 제네릭의 타입 매개변수는 사용할 타입에 대한 결정을 나중으로 미루는 것이다.메서드는 매개변수에 인자를 전달해서 사용할 값을 결정한다.제네릭 클래스는 타입 매개변수에 타입 인자를 전달해서 사용할 타입을 결정한다.용어 정리제네릭 타입(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..

memcpy와 memmove 두 함수는 모두 특정 메모리를 다른 메모리로 복사할 때 사용된다. 이번 포스팅에서는 두 함수의 사용법과 차이점에 대해 알아보자. 두 함수 모두 특정 메모리 주소에서 원하는 크기만큼 다른 곳으로 복사시켜 주고, memory.h 또는 string.h 헤더 파일에 포함되어 있다. 그럼 함수의 반환 타입과 인자값에 대해 조금 더 자세히 알아보자. memcpy void* memcpy (void* dest, void* src, size_t size); dest: 복사되는 메모리의 첫번째 주소 src: 복사할 메모리의 첫번째 주소 size: 복사할 크기 (byte) 반환값: 성공시 dest, 실패시 NULL memmove void* memmove (void* dest, void* src,..
위 지시문들은 보통 조건부 컴파일 지시자라고 한다. #이 앞에 오는 전처리 지시자이다. 먼저 #if, #elif, #else, #endif부터 알아보면, 일반적으로 우리가 사용하는 if, else if, else와 방식이 유사하다는 것을 알 수 있다. 규칙은 #if를 사용하면 꼭 끝나는 부분에 #endif를 삽입해야 한다는 것을 숙지하자. 왜냐하면, 전처리기는 scope를 사용하지 않아서 꼭 끝을 내줘야 하기 때문이다. 이는 보통 조건부로 코드를 추가 및 제거해서 컴파일할 때 많이 사용한다. #include #define VERSION 3 int main(void) { #if (VERSION == 1) printf("VERSION 1. \n"); #elif (VERSION ==2) printf("VERS..
#define은 전처리기 지시자로 컴파일하기 전에 실행되는 컴파일러의 한 부분이다. 또한 기호 상수를 만들기 위한 지시자로 보통 매크로라고 한다. 매크로를 정의하는 방법은 다음과 같이 세미콜론을 사용하면 안된다. 이때 보통 매크로 이름은 대문자를 많이 사용한다. 즉, 정의한 매크로를 사용하면 컴파일하기 전에 해당 매크로에 정의한 값으로 변경이 되는 방식이다. #include #define ARRAY_SIZE 10 int main(void) { int num[ARRAY_SIZE]; for (int i = 0; i < ARRAY_SIZE; i++) { num[i] = i; } return 0; } 위의 코드처럼 배열의 크기를 변경할 때도 해당 매크로의 정의에서 값만 변경해주면 모두 적용되기 때문에 훨씬 사용..
프로그래밍에서 선언과 정의에 대해서 알아보자. 선언과 정의의 가장 큰 차이는 "메모리를 할당하는가"이다. 즉, 메모리를 할당하지 않고, 대상의 이름만 알려준다면 선언이고, 대상의 메모리가 할당된다면 그것은 정의이다. 다만 혼동하기 쉬운 예로 typedef는 사용자 정의 타입이라고 불리지만, 실제로 메모리 영역상에 올리지는 않기 때문에 정의라고 볼 수는 없다. void main() { int a; int b = 10; } 위의 예에서 int a; 는 선언과 동시에 정의한 것이다. 즉, int 4byte 만의 영역이 메모리 할당되었다는 말이다. 너무 헷갈리는데 선언과 정의가 무엇이며, 각자의 특징에 대해 좀 더 자세히 알아보려고 한다. 선언 컴파일러가 참조할 식별자와 이름을 알린다는 의미이다. 여기서 식별자..