일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Kotlin
- 스프링
- 자바 ORM 표준 JPA 프로그래밍
- thread
- OS
- spring
- Collection
- Java
- 보조스트림
- 자바
- SpringBoot
- 쿠버네티스
- Real MySQL
- 이스티오
- IntellJ
- list
- Stream
- K8s
- 토비의 스프링 정리
- mysql
- gradle
- MSA
- GC
- JPA
- 토비의 스프링
- 백준
- Stack
- redis
- jvm
- 스트림
- Today
- Total
목록Java (58)
인생을 코딩하다.

FIFO구조의 일반적인 큐와는 다르게, PriorityQueue(우선순위)는 들어온 순서와 상관없이 데이터를 꺼낼 때 우선순위가 가장 높은 데이터가 가장 먼저 나온다. AbstractQueue를 상속하고 Serializable를 확장하고 있다. oracle docs의 문서를 살펴보았을때 PriorityQueue의 특징을 살펴보면, 내부구조가 heap으로 되어있다. null 값을 허용하지 않는다. 비교 불가능한 객체의 삽입도 허용하지 않는다, (실행하면 ClassCastException이 Throw 된다.) PriorityQueue 클래스와 그 반복자는 Collection 및 iterator 인터페이스의 메서드의 모든 것을 구현한다. 하지만 iterator() 메서드로 순회했을 때 순서를 보장하지 않는다...

ThreadLocal Oracla Docs에서는 ThreadLocal 클래스를 다음과 같이 설명한다. ThreadLocal 클래스는 thread-local 변수들을 제공한다. 이 변수들은 get 또는 set 메소드를 통해 접근하는 각 스레드가 독립적으로 변수의 초기화 된 사본을 가지고 있다는 점에서 다르다. ThreadLocal 인스턴스들은 보통 스레드와 상태를 연결하려고 하는 클래스들의 private static 필드들이다. (예를들어, 유저 ID 또는 트랜잭션 ID) 일반 변수의 수명은 특정 코드 블록(예, 메서드 범위, for 블록 범위 등) 범위 내에서만 유효하다. { int a = 10; ... // 블록 내에서 a 변수 사용 가능 } // 변수 a는 위 코드 블록이 끝나면 더 이상 유효하지 않..

volatile volatile란? volatile 키워드는 java 변수를 Main Memory에 저장하겠다 라는 것을 명시한다. 매번 변수의 값을 읽을 때마다 CPU cache에 저장된 값이 아닌 Main Memory에서 읽는 것이다. 또한 변수의 값을 쓸 때마다 Main Memory까지 작성한다. volatile를 쓰지 않았을 때, non-volatile일때의 문제점 멀티쓰레드 어플리케이션에서의 non-volatile 변수에 대한 작업은 성능상의 이유로 CPU 캐시를 이용한다. 둘 이상의 CPU가 탑제된 컴퓨터에서 어플리케이션을 실행한다면, 각 쓰레드는 변수를 각 CPU의 캐시로 복사하여 읽어들인다. non-volatile 변수에 대한 작업은 JVM 이 메인 메모리로부터 CPU 캐시로 변수를 읽어들..

SOLID는 객체 지향 프로그램을 구성하는 속성, 메서드 클래스, 객체, 패키지, 모듈, 라이브러리, 프레임워크, 아키텍처 등 다양한 곳에 다양하게 적용되는 것이기에 막상 SOLID가 적용됐는지 아닌지 애매모호하거나 보는 사람의 관점에 따라 다르게 해석될 수 있는 소지가 있음을 밝혀둔다. SOLID 자체는 제품이 아닌 개념이기에 그렇다. SOLID가 개념이긴 하지만 우리가 만드는 제품, 즉 소프트웨어에 녹여 내야 하는 개념이다. SOLID를 잘 녹여낸 소프트웨어는 그렇지 앟은 소프트웨어에 비해 상대적으로 이해하기 쉽고, 리팩토링과 유지보수가 수월할 뿐만 아니라 논리적으로 정연하다. SOLID는 객체 디자인 패턴의 뼈대이며, 스프링 프레임워크의 근간이 되기도 한다. SOLID를 녹여내는 소프트웨어 설계를 ..

ArrayList add() 동작방식 ArrayList는 내부에서 elementData 배열을 기반으로 구성되어 있다. 생성자를 통해서 직접 element 배열의 capacity 설정이 가능하다. 기본 Capacity는 10이다. ArrayList의 기본 생성자를 사용할 경우 elementData에 EMPTY_ELEMENTDATA (빈 Object 배열)을 할당한다. add()의 내부구조 modCount++로 구조적으로 변경된 횟수를 카운트한다. add(e, elementData, size); 위의 로직을 살펴보자. 두 번째 파라미터는 오브젝트형 배열을 인자로 받고있고, 세 번째 파라미터는 int형 정수(size)를 받고있다. s와 elementDate의 길이를 비교하여 배열의 사이즈를 조정해야 하는지 ..

얕은 복사(Shallow Copy) 한 쪽에서 수정이 발생되면, 다른쪽에도 영향을 끼쳐 같아지게 된다. 객체를 복사할 시, 해당 객체만 복사하여 새 객체를 생성. 복사된 객체의 인스턴스 변수는 원본 객체의 인스턴스 변수와 같은 메모리 주소를 참조. 따라서, 해당 메모리의 주소의 값이 변경되면 원본 객체와 복사된 객체의 인스턴스 변수 값도 같이 변경 됨. public static void main(String[] args) { List first = new ArrayList(); first.add(0); first.add(1); first.add(2); List second = first; first.add(3); System.out.println(second.toString()); } 위 작성한 에제 코..

JVM 역할이 뭘까?? 자바 애플리케이션 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행 JAVA와 OS사이에서 중개자 역할을 수행하여 JAVA가 OS에 구애받지 않고 재사용을 가능하게 해줌 메모리관리, Garbage collection을 수행한다. 스택 기반으로 동작한다. 즉, 운영체제 위에서 동작하는 프로세스로 자바 코드를 컴파일해서 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 바꿔 실행시켜주는 역할을 한다. // 바이트코드) 자바 가상머신이 이해할 수 있는 언어로 변환된 자바 소스 코드 왜 JVM을 알아야 하는가? 메모리 효율성을 위해 메모리 구조를 알아야 하기 때문이다. 동일한 기능의 프로그램이더라고 메모리 관리에 따라 성능이 좌우된다. 우리는 한정된 메모리를 효율적으로 사용하여..

Map이란 키와 값을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스들을 구현하는데 사용되는 List형태의 조상 Map 인터페이스와 이 구현체들은 Collection에 속하지만 Map은 Collection이 아니다. 왜 그럴까? '엘리먼트들의 그룹' Collection 인터페이스의 기본 개념과 맞지 않는다. Map은 java.util 패키지의 Map이라는 이름의 인터페이스로 선언되어 있고, 구현해 놓은 클래스들도 많이 있다 Map 인터페이스에 선언되어 있는 메소드 리턴 타입 메소드 이름 및 매개 변수 설명 V put(L key, V value) 첫 번째 매개 변수인 키를 갖는, 두 번째 매개변수인 값을 갖는 데이터를 저장한다. void putAll(Map