250x250
Notice
Recent Posts
Recent Comments
Link
반응형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- scanner
- dfs
- spring boot
- Calendar
- JPA
- GC로그수집
- map
- Properties
- 리소스모니터링
- javascript
- 큐
- union_find
- CSS
- html
- priority_queue
- sql
- string
- BFS
- List
- 힙덤프
- 스택
- alter
- 스프링부트
- deque
- Union-find
- NIO
- date
- set
- Java
- math
Archives
- Today
- Total
매일 조금씩
Java 개념 정리 (3) - 컬렉션, 스레드 본문
728x90
반응형
컬렉션 기초
- JCF란 무엇인가요?
- JCF는 Java Collections Framework의 약어로, 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미합니다.
- JCF의 계층 구조를 설명해 주세요.
- JCF는 Collection 인터페이스와 Map 인터페이스로 나뉘고, Collection 인터페이스는 다시 List, Queue, Set 인터페이스로 나뉩니다.
- List 인터페이스는 무엇이고, 구현체의 종류는 무엇이 있나요?
- 순서가 있는 데이터의 집합으로, 데이터의 중복을 허용합니다. List 인터페이스는 ArrayList, LinkedList, Vector에 상속을 합니다.
- ArrayList에 대해 설명해 주세요.
- ArrayList는 크기가 가변적인 선형 리스트로, 인덱스를 이용하여 내부 요소를 관리한다는 점이 일반적인 배열과 유사합니다.
- ArrayList는 어떻게 동적으로 사이즈가 늘어나나요?
- 저장 용량(capacity)이라는 것이 존재하여 이 용량을 넘어서면 자동으로 용량을 증가함으로써 추가적으로 요소를 넣을 수 있도록 해 줍니다.
- LinkedList에 대해 설명해 주세요.
- LinkedList는 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어있는 자료 구조입니다. 데이터를 담고 있는 노드들이 연결되어 있고, 노드의 포인터가 이전 노드와 다음 노드와의 연결을 담당합니다. Node는 LinkedList에 객체를 추가하거나 삭제하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않습니다.
- 언제 ArrayList를 사용하고, 언제 LinkedList를 사용할까요?
- ArrayList는 접근 시간이 빠르지만 삽입 및 삭제가 느리고, LinkedList는 접근 시간이 느리지만 삽입 및 삭제가 빠르다는 특징이 있습니다. 따라서 리스트의 시작 부분이나 끝 부분에서 삽입과 삭제가 빈번한 Queue 같은 경우 LinkedList를 사용하고, 그렇지 않으면 ArrayList를 사용하는 편입니다.
- ArrayList와 Vector는 어떠한 차이가 있나요?
- Vector는 Thread-Safe하지만, ArrayList는 그렇지 않습니다. 다만, Vector는 모든 메서드가 syncronized로 되어 있어서 성능이 좋지 않고, 더 효율적인 방식으로 구현된 Thread-Safe한 CopyOnWriteArrayList 같은 대안이 있어서 현재는 거의 사용하지 않습니다.
- Stack과 Queue가 무엇인가요?
- Stack은 LIFO 방식을 가진 자료 구조이며, Vector에 상속을 받은 레거시 클래스입니다. Queue는 FIFO 구조를 가진 자료 구조이며 주로 LinkedList로 구현합니다.
- Set이 무엇이고, 구현 클래스가 무엇이 있는지 설명해 주세요.
- Set 자료구조는 중복된 요소를 저장하지 않고, 요소의 저장 순서를 유지하지 않는 특징이 있습니다. 주로 HashSet, LinkedHashSet, TreeSet 클래스를 통해 구현합니다.
- Set에서 중복 요소를 어떻게 걸러내는지 설명해 주세요.
- 객체를 저장하기 전에 객체의 hashCode()를 호출해서 해시 코드를 얻어냅니다. hashCode()는 객체의 주소를 가져와서 두 객체가 같은 객체인지 확인하는 역할을 합니다. 저장되어 있는 객체들의 해시 코드와 비교한 뒤 같은 해시 코드가 있다면 다시 equals() 메소드로 두 객체를 비교합니다. equals() 메소드는 객체의 내용이 같은지 확인합니다. 이때, true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않습니다.
- Map이 무엇이고, 구현 클래스가 무엇이 있는지 설명해 주세요.
- Key와 Value를 쌍으로 저장하는 자료구조로, Key는 중복될 수 없고 Value는 중복이 가능하다는 특징이 있습니다. Key를 통해 Value에 바로 접근이 가능하므로 상수 시간만에 탐색이 가능하다는 장점이 있습니다. 하지만, 일반적으로 데이터의 순서를 보장하지는 않습니다.
- 구현 클래스로는 HashTable, HashMap, TreeMap 등이 있습니다.
- HashMap은 어떻게 동작하나요?
- 해시 함수를 이용하여 데이터의 Key 값을 특정 인덱스로 변환하고, 빈 공간 내에 그 인덱스의 위치에 저장합니다. 이 인덱스를 해시 값이라고 부릅니다. 해시 값을 사용하면 저장된 값을 불러올 때 인덱스 값을 참조해서 불러오므로 연산 속도가 매우 빨라집니다.
- HashMap의 최악의 시간 복잡도를 설명해 주세요.
- Key 값은 다르지만 해시 함수에 의해 같은 출력 값을 갖는 현상을 해시 충돌이라고 하는데, HashMap은 이를 해시 체이닝을 통해 해결하고 있습니다. 만일, 한 개의 버킷에 대해 모두 해시 충돌이 발생하면 조회 시간 복잡도가 O(N)이 될 수 있습니다.
컬렉션 심화
- Map 인터페이스는 왜 Collection 인터페이스에 상속을 받지 않았나요?
- Collection은 요소들의 집합이라고 생각하면 되는데, Map은 요소라는 것을 정의하기가 어렵습니다. Map은 Key와 Value가 필요한데, 요소로 만드려면 Key-Value 쌍을 생각할 수 밖에 없습니다.
- 예를 들어, Collections.remove(Object o)를 취한다고 합시다. 만약, Map이 Collection에 상속을 받았다면, remove()는 단순히 Key-Value 쌍을 지우게 될 것입니다. 하지만, 실제 Map의 remove()의 인자는 key를 받습니다. 이것은 번거롭게 인자를 Key-Value 쌍 형태의 객체로 받지 않기 위함입니다.
- 이렇듯 요소라는 것의 모호함과 구조상 상응하지 않는 부분이 많아서 Map은 JCF에 포함하되, Collection 인터페이스에게 상속은 받지 않도록 설계한 것입니다.
- iterable과 iterator의 차이는 무엇인가요?
- iterable은 Collection의 상위 인터페이스로 iterator를 반환하는 iterator() 추상 메서드를 가지고 있습니다. iterator는 컬렉션 클래스의 데이터를 다룰 때 사용되는 인터페이스로, hasNext(), next(), remove() 등의 메서드를 사용할 수 있습니다.
- Collection과 Collections의 차이는 무엇인가요?
- Collection은 JCF의 최상위 인터페이스이고, Collections는 Collection 조작을 위한 유틸리티 클래스이며 정적 메서드를 통해 컬렉션을 정렬, 검색, 동기화, 변환하는 등의 작업을 수행할 수 있습니다.
스레드 기초
- Java에서 스레드를 만드는 방법을 설명해 주세요.
- Thread 클래스를 혹은 Runnable 인터페이스를 상속 받아 run() 메서드를 구현하는 방법이 있습니다. Callable 인터페이스를 상속 받아 call() 메서드를 구현하는 방법이 있습니다.
- 스레드 풀이란 무엇이고, 왜 사용할까요?
- 스레드 풀은 작업 처리에 사용되는 스레드를 제한된 개수만큼 정해 놓고, 작업 큐에 들어오는 작업들을 하나씩 스레드가 맡아 처리하는 기법입니다. 작업 처리 요청이 급격히 증가하더라도 작업 큐라는 곳에 작업이 대기하다가, 여유가 있는 스레드가 그것을 처리하므로 스레드의 전체 개수는 일정하며, 애플리케이션의 성능도 저하되지 않습니다.
스레드 심화
- 스프링과 같은 프레임워크에서는 스레드 풀의 스레드 개수를 수백 개 이상으로 운영합니다. 이는 Context Switching이 일어남에도 불구하고도 이런 선택을 내린 것인데, 왜 그럴까요?
- 웹 애플리케이션에서는 빈번하게 네트워크, 파일 입출력과 같은 작업을 처리해야하는데 이들은 주로 Blocking I/O 방식으로 동작합니다. 만일 스레드가 적다면 Blocking I/O로 인해 스레드가 block될 것이고 놀고 있는 CPU가 생기게 됩니다. 따라서 비싼 돈 주고 산 CPU에게 열심히 일을 시키기 위해 스레드를 늘리는 것입니다.
728x90
반응형
'Java' 카테고리의 다른 글
Java 개념 정리 (5) - JVM, GC (0) | 2025.02.16 |
---|---|
Java 개념 정리 (4) - 동시성 프로그래밍 (0) | 2025.02.16 |
Java 개념 정리 (2) - 문자열, 예외, 제네릭, 람다, 스트림, 어노테이션, 리플렉션 (0) | 2025.01.09 |
Java 개념 정리 (1) - Java 기본, 객체 지향 (0) | 2025.01.09 |
Servlet 이란? Spring 에선 어떻게 사용하고 구현되는지? (0) | 2024.11.03 |