1. 자바의 컬렉션 프레임워크 (Collection Framework)
자바의 컬렉션 프레임워크는 데이터를 저장하고 처리하는데 필요한 클래스들과 인터페이스들을 제공하는 라이브러리이다. 컬렉션 프레임워크는 크게 List, Set, Map으로 구분되며, 각 컬렉션 타입은 데이터를 관리하는 방식과 특징에 따라 다르게 설계된다.
- List: 순서가 있는 데이터 집합으로, 중복된 값을 허용한다. 인덱스를 사용하여 데이터에 접근할 수 있다. 대표적인 구현체는 ArrayList, LinkedList, Vector가 있다.
- Set: 순서가 없고 중복을 허용하지 않는 데이터 집합이다. 예를 들어, HashSet, TreeSet, LinkedHashSet 등이 있다. 중복을 제거하는데 유용하다.
- Map: 키-값 쌍으로 데이터를 저장하는 집합이다. 키는 중복을 허용하지 않으며, 각 키는 유일하다. 값은 중복될 수 있다. 대표적인 구현체는 HashMap, TreeMap, LinkedHashMap 등이 있다.
컬렉션 프레임워크는 인터페이스와 구현체로 나뉘며, Iterator를 사용해 데이터를 순차적으로 처리할 수 있다. 또한, Concurrent Collections와 같이 멀티스레딩 환경에서 안전하게 데이터를 처리할 수 있는 클래스를 제공한다.
2. 자바에서의 동기화(Synchronization)와 스레드 안전(Thread Safety)
멀티스레딩 환경에서 여러 스레드가 공유 자원에 접근할 때 **스레드 안전(Thread Safety)**을 보장해야 한다. 자바는 스레드 안전을 보장하기 위해 동기화(Synchronization) 기법을 사용한다.
- 동기화(Synchronization): synchronized 키워드를 사용하여 한 번에 하나의 스레드만 메서드나 블록을 실행할 수 있도록 제한한다. 이를 통해 여러 스레드가 동시에 공유 자원에 접근하지 못하게 하고, 데이터를 일관성 있게 유지할 수 있다.
- 스레드 안전한 클래스: 예를 들어, Vector, Hashtable, Collections.synchronizedList 등의 클래스는 동기화를 통해 스레드 안전을 보장한다.
하지만 동기화는 성능에 영향을 미칠 수 있기 때문에, 필요할 때만 사용하는 것이 중요하다. 또한 **ReentrantLock**과 같은 명시적 락을 사용하면 동기화의 제어를 더 세밀하게 할 수 있다.
3. 자바에서의 메모리 관리와 가비지 컬렉션 (Memory Management and Garbage Collection)
자바는 **가비지 컬렉션(GC)**을 통해 메모리 관리를 자동으로 처리한다. 개발자는 직접 메모리 할당이나 해제를 관리할 필요가 없으며, 자바 가상 머신(JVM)이 필요 없는 객체를 자동으로 제거한다.
- 힙(Heap): 동적으로 할당되는 객체들이 저장되는 메모리 영역으로, 가비지 컬렉터가 이 영역을 관리한다.
- 스택(Stack): 각 스레드마다 할당되는 메모리 영역으로, 로컬 변수와 메서드 호출 정보를 저장한다.
- 가비지 컬렉터: 가비지 컬렉터는 더 이상 참조되지 않는 객체를 찾아 메모리에서 제거한다. 이를 통해 메모리 누수를 방지하고 효율적으로 메모리를 관리한다.
가비지 컬렉션의 주요 알고리즘은 Mark-and-Sweep, Generational GC 등이 있으며, 자바에서는 JVM 옵션을 통해 가비지 컬렉션의 동작 방식을 제어할 수 있다.
가비지 컬렉션은 자주 발생하면 성능에 영향을 미칠 수 있으므로, 메모리 관리에 신경 써야 한다. **메모리 풀(Memory Pool)**이나 **메모리 누수(Memory Leak)**를 방지하려면 객체의 생명주기를 정확히 관리하는 것이 중요하다.
4. 자바에서의 리플렉션(Reflection)
**리플렉션(Reflection)**은 자바에서 클래스나 메서드, 필드에 대한 정보를 런타임에 동적으로 확인하고, 조작할 수 있는 기능을 제공한다. 이는 자바의 Reflection API를 통해 이루어진다.
- 클래스 정보 얻기: Class 객체를 통해 런타임에 클래스의 정보에 접근할 수 있다.
- 메서드 호출: 런타임에 메서드 정보를 동적으로 가져와서 호출할 수 있다. Method 객체를 사용한다.
- 필드 접근: Field 객체를 사용하여 클래스의 필드 값을 읽거나 쓸 수 있다.
리플렉션은 매우 강력한 기능이지만, 성능상 비용이 크고, 보안상 위험할 수 있다. 또한, 컴파일 시점에 알 수 없는 정보를 사용하므로 코드의 가독성이 떨어지고, 디버깅이 어려워질 수 있다. 그래서 사용에 신중을 기해야 한다.
5. 자바의 람다(Lambda)와 함수형 인터페이스(Function Interface)
**람다(Lambda)**는 자바 8에서 도입된 기능으로, 익명 함수를 표현할 수 있게 해준다. 람다를 사용하면 코드를 더 간결하고 읽기 쉬운 형태로 만들 수 있다.
- 람다 표현식: (매개변수) -> {실행할 코드} 형태로 간단한 함수를 정의할 수 있다. 예를 들어, Runnable 인터페이스의 run() 메서드를 람다로 표현할 수 있다.
java복사편집Runnable run = () -> System.out.println("Hello, World!");
- 예시:
- 함수형 인터페이스(Function Interface): 단 하나의 추상 메서드만을 갖는 인터페이스를 함수형 인터페이스라고 한다. 자바의 람다는 함수형 인터페이스를 구현하는 데 사용된다. 대표적인 함수형 인터페이스로는 Runnable, Callable, Comparator 등이 있다.
- 자바 8부터는 java.util.function 패키지에서 다양한 기본 함수형 인터페이스(Function, Predicate, Consumer, Supplier 등)를 제공하여 함수형 프로그래밍을 지원한다.
람다를 활용하면, **고차 함수(Higher-Order Function)**나 컬렉션 처리를 더 직관적이고 함수형으로 구현할 수 있다. 예를 들어, Stream API와 함께 사용할 수 있어 매우 유용하다.
섹션3. 자바 동시성 및 멀티스레딩↓
면접에서 진짜 자주 나오는 자바 질문 - 섹션 3. 자바 동시성 및 멀티스레딩
1. 자바에서 스레드 생성 방식자바에서 스레드는 두 가지 방법으로 생성할 수 있다:Thread 클래스를 상속받아 run() 메서드 오버라이딩Runnable 인터페이스 구현 후 Thread 객체에 전달예시:// Runnable 구
biesil.tistory.com
'Programming > Java' 카테고리의 다른 글
면접에서 진짜 자주 나오는 자바 질문 - 섹션 4. 자바 8 핵심 기능 (0) | 2025.04.17 |
---|---|
면접에서 진짜 자주 나오는 자바 질문 - 섹션 3. 자바 동시성 및 멀티스레딩 (0) | 2025.04.17 |
면접에서 진짜 자주 나오는 자바 질문 - 섹션 1. 자바 기본 개념 (1) | 2025.04.17 |
쓰레드 풀(Thread Pool)의 개념과 최적화 방법 (1) | 2025.04.15 |
JAVA 데드락(Deadlock)과 이를 방지하는 방법 (교착상태) (0) | 2025.04.15 |