본문 바로가기

Java23

『Java』 자바에서 Charset 클래스와 UTF-8의 관계는 무엇인가? Charset 클래스란 무엇인가? Java에서 Charset은 텍스트 데이터가 byte 배열과 String 간에 변환될 때 사용되는 문자 인코딩을 정의하는 클래스다. 즉, Java Application이 다양한 언어와 지역의 문자열을 처리하기 위해 특정한 인코딩 방식을 지정하고 이를 통해 바이트와 문자 간 변환을 수행하는 데 핵심적인 역할을 한다. Charset 클래스는 다음과 같은 기능을 제공한다.   등록된 Charset 조회 현재 JVM에서 사용 가능한 Charset들의 목록을 조회할 수 있다. Charset 인스턴스 생성 forName(String charsetName) 메서드를 통해 "UTF-8", "ISO-8859-1"와 같은 표준 명칭을 이용하여 해당 Charset 객체를 얻을 수 있다.. 2024. 12. 10.
『Java』 Priority Queue 우선순위 큐 일반적인 큐(Queue)는 먼저 들어간 데이터가 먼저 나오는 FIFO(First In First Out) 구조다. 반면에 우선순위 큐(Priority Queue)는 들어가는 순서와 상관없이 우선순위가 높은 데이터가 먼저 나오는 자료구조다.  우선순위 큐 내부의 엘리먼트들은 새로운 요소가 추가되거나 기존 요소가 제거될 때마다 정렬된다. 우선순위 큐는 힙(Heap) 자료구조를 통해 구현되며 다른 자료구조를 통해서도 구현될 수 있다.  선언 방법Java에서 PriorityQueue는 기본적으로 최소 힙(min-heap) 구조로 작은 숫자가 먼저 나오도록 설계되어 있다. 높은 숫자(큰 숫자)가 먼저 나오도록 하려면 Collections.reverseOrder()를 사용하여 최대 힙(max-heap).. 2024. 12. 2.
『Java』 Map, Stack, Queue, Deque Map Map은 키-값의 쌍을 저장하는 자료 구조다. 키는 맵 내에서 유일해야 한다. 그리고 키를 통해 값을 빠르게 검색할 수 있다. 키는 중복될 수 없지만, 값은 중복될 수 있다. Map은 순서를 유지하지 않는다. 자바는 HashMap, TreeMap, LinkedHashMap 등 다양한 Map 구현체를 제공한다.이들은 Map 인터페이스의 메서드를 구현하며 각기 다른 특성을 가지고 있다. HashMap구조해시를 사용해서 요소를 지정한다. Key 값은 해시 함수를 통해 해시 코드로 변환되고 해시 코드는 데이터를 저장하고 검색하는 데 사용된다. 특징삽입, 삭제, 검색 작업은 해시 자료 구조를 사용하므로 일반적으로 상수 시간 O(1)의 복잡도를 가진다. 순서순서를 보장하지 않는다.   LinkedHashMa.. 2024. 11. 28.
『Spring Boot』 Spring Boot Annotation 정리 스프링 부트를 사용하여 RESTful API를 개발할 때 주로 사용하는 어노테이션을 알아보자. 특히 JSON 형식의 데이터를 처리할 때 유용한 애노테이션들을 중심으로 살펴보자. 어노테이션을 사용할 때에도 내부 동작 원리나 해당 어노테이션을 사용하게 된 배경을 아는 것 또한 중요하지만 Deep Dive 하기 전에 40개 정도만 가볍게 한번 훑어보자.  @RestController @Controller와 @ResponseBody를 결합한 애노테이션으로 컨트롤러의 메서드들이 JSON 형식의 데이터를 반환하도록 한다.   @ResponseBody 메서드의 반환 값을 HTTP 응답 본문으로 변환한다. @RestController에서는 기본적으로 적용된다.  @RequestMapping 클래스나 메서드 수준에.. 2024. 11. 25.
『Java』 내부 클래스, 정적 중첩 클래스, 지역 클래스, 익명 클래스 Java에서 중첩 클래스(Nested Class)는 다른 클래스 내부에 정의된 클래스를 의미한다.  중첩 클래스의 종류중첩 클래스는 다음과 같이 네 가지로 분류된다.내부 클래스(Inner Class)정적 중첩 클래스(Static Nested Class)지역 클래스(Method Local Inner Class)익명 클래스(Anonymous Class)각각의 중첩 클래스는 사용하는 방법과 특징이 다르므로 아래에서 자세히 살펴보자.  내부 클래스 (Inner Class)내부 클래스는 외부 클래스의 멤버로 선언되는 클래스이며 Non-Static Nested Class라고도 한다.외부 클래스의 인스턴스에 종속적이다.외부 클래스의 모든 멤버(인스턴스 변수 및 메서드)에 접근할 수 있다.외부 클래스의 인스턴스를 생성.. 2024. 11. 24.
『Java』 스레드는 어떻게 메모리를 공유하는가? 스레드는 Stack을 제외한 Heap 메모리와 Method Area 메모리 공간을 공유한다.각 스레드는 자기 자신의 Stack Memory를 가지고 있으며, 스레드끼리 Stack Memory 공간을 침범할 수 없다. 인스턴스 변수나 정적 변수는 스레드가 공유할 수 있으나, 메서드 내 지역 변수는 Thread Stack에서 사용되므로 다른 스레드와 공유할 수 없다.   로컬 변수는 메서드 내부에 선언된 변수처럼 Stack에 일시적으로 할당된 후 사용하고 소멸되는 변수를 말한다.인스턴스 변수는 소멸하지 않는 한 모든 스레드에서 접근이 가능하므로 값이 변경될 경우 변경된 값을 읽을 수 있다. Heap 메모리를 공유하기 때문에 참조값을 통해 인스턴스에 접근할 수 있기 때문이다. 2024. 11. 22.
『Java』 HashMap은 어떤 원리로 동작하는가 HashMap은 자주 사용하는 컬렉션 중 하나다. 키와 값을 쌍으로 저장하며 데이터의 삽입, 삭제, 검색이 평균적으로 O(1) 시간 복잡도를 갖는 자료구조다. HashMap의 내부 동작 원리와 해시 충돌 해결 방법에 대해 알아보자.   HashMap 개념HashMap은 키(Key)와 값(Value)이 1:1로 매핑되는 자료구조다. 여기서 키는 중복을 허용하지 않지만 값은 중복될 수 있다. 내부적으로 배열을 사용하며 각 배열의 요소를 버킷(bucket)이라고 한다.키를 해시 함수에 통과시켜 해시 값을 얻고 해시 값을 이용해 버킷 배열의 인덱스를 결정한다.일반적으로 해시 함수는 hashcode() % M 형태로 계산되기에 서로 다른 키가 동일한 인덱스를 가리키는 해시 충돌(hash collision)이 발생.. 2024. 11. 22.
『Java』 상속보다 컴포지션을 사용해야 하는 이유 상속보다 컴포지션을 사용해야 하는 이유 상속이란 한 클래스가 다른 클래스를 확장하여 기능을 재사용하고 추가하는 것을 말한다. 반면에 컴포지션은 기존 클래스의 인스턴스를 새로운 클래스의 필드로 포함하여 기능을 사용하는 것을 말한다.   상속이 항상 나쁜 선택일까?다음과 같은 경우에는 상속을 사용해도 문제가 없다. 같은 프로그래머나 팀이 상위 클래스와 하위 클래스를 모두 통제할 수 있을 때상위 클래스가 상속을 고려하여 잘 설계되고 문서화되어 있을 때명확한 is-a 관계가 있을 때 (예: Dog는 Animal이다)   상속의 문제점, 캡슐화의 파괴 캡슐화는 객체의 내부 구현을 숨기고 공개된 인터페이스를 통해서만 상호작용하도록 하는 원칙이다. 상속을 사용할 때 하위 클래스는 상위 클래스의 내부 구현에 의존하게 .. 2024. 11. 20.
『Java』 for-each 문을 사용하기 위한 인터페이스는 무엇인가? for-each 문을 사용하기 위해서는 Iterable 인터페이스를 구현해야 한다. 자바 컬렉션 프레임워크의 클래스들은 Iterable 인터페이스를 구현하여 iterator() 메서드를 제공하며 이를 통해 요소들을 순회할 수 있다.  for-each for-each 문은 배열이나 컬렉션과 같은 반복 가능한 객체를 순회(iterate) 하기 위한 간단한 문법을 제공한다.   Iterable Interface for-each 문을 사용하려면 대상 객체가 Iterable 인터페이스를 구현해야 한다. Iterable 인터페이스는 java.lang 패키지에 위치하며 제네릭 인터페이스로 Iterator iterator() 메서드를 선언하고 있다.   Iterable Interface 구조iterator() 메서.. 2024. 11. 19.