List
List는 배열과 같이 순서가 있고, 배열처럼 index로 요소에 접근한다.
먼저 배열이 뭔지 알아보자!
배열의 단점: 배열은 데이터의 추가와 삭제에 매우 비효율적.배열은 데이터들이 메모리에 연속적으로 나열된 구조입
.
중간에 있는 데이터를 삭제하면 그 뒤의 모든 데이터를 한 칸씩 앞으로 당겨야 하고, 중간에 데이터를 추가하려면 그 뒤의 모든 데이터를 한 칸씩 뒤로 밀어야 합니다. 데이터가 많을수록 이 작업은 매우 느려짐!
크기가 고정되어 있다. (생성 시 크기 지정 필수)
기본 타입을 다룬다. ( int, double, char )
배열은 new()와 같은 생성자를 사용하지 않는다. 객체처럼 괄호()를 쓰는 방식이 아니라 대괄호[] 를 사용해 크기를 지정한다.
배열은 크기가 고정되어 있기 때문에 크기가 중요한 요소이다!
이와 달리 Collection은 가변크기이므로 요소가 추가되면 자동으로 크기가 늘어난다.
String[] array= new String[5];
array= {"a","b","c"}; //오류발생
오류가 나는 이유: 배열을 선언할 때가 아니면 중괄호{}를 사용한 초기화 구문을 단독으로 사용할 수 없다. 초기화시에만 사용하는 문법이기 때문이다.
String[] array = new String[5];
// new String[] 을 사용하여 새로운 배열 객체를 만들어 재할당합니다.
array = new String[]{"a", "b", "c"};
이렇게 할당하면 된다.
## 핵심 차이점: 클래스 vs 언어의 기본 기능
- 컬렉션 (ArrayList 등): ArrayList는 클래스(Class)입니다. 클래스는 객체를 만들기 위한 '설계도'이며, 이 설계도로 실제 객체를 만들 때 생성자(ArrayList())라는 특별한 메서드를 호출합니다.
- 배열 (int[] 등): 배열은 클래스가 아닌, 자바 언어 자체에 내장된 기본 기능입니다. 따라서 객체처럼 생성자를 호출하는 방식이 아니라, 배열만을 위한 특별한 문법을 사용해 생성합니다.
ArrayList
오류:
ArrayList<String> list = new ArrayList<String>();
int i=0;
list.add("Milk");
list.add("BREAD");
list.add(1,"APPLE");
list.set(2, "GRAPE");
list.add(5, "BUTTER"); //해당 줄에서 오류 발생
set(5,"BUTTER"): set은 존재하는 배열에 관해 접근해야한다.
add (5,"BUTTER"): add는 list.size()까지 접근할 수 있는데, 현재 list의 크기는 3이다.
비유: add(5, "새 사람"): 3번 사람과 4번 사람이 없는데, 5번째 자리에 끼어들기 (❌ 불가능)
LinkedList
순서가 있는 list 이다. 양방향으로 참고하기 때문에 이동하기가 쉽다.
해쉬맵 :
맵은 사전처럼 사용
해쉬가 붙은 이유: 해쉬테이블에 값을 저장함 => 해쉬값을 이용하면 데이터를 찾을 때 더 쉽게 찾을 수 있다.
Set<K> keys=map.keySet(); //key만 set으로 가져옴
System.out.println("Key : " + keys);
map은 keySet()으로 key값을 set으로 가져올 수 있다.
Collection<V> values = map.values();
System.out.println("Values : " + values);
map은 values()로 value 값을 collection으로 가져올 수 있다.
여기서 key는 set , value는 collection을 이용한다. 이유가 뭘까?
답은 중복 여부에 있다.
Key는 중복될 수 없고, Value는 중복될 수 있다.
여기서 set의 특징인 중복될 수 없음을 사용하는 것이다.
반면, value는 Key에 연결된 데이터일 뿐 중복되어도 문제가 없다.
Collection은 List와 Set의 최상위 인터페이스로, 자바의 모든 자료구조를 아우르는 가장 일반적인 개념이다.
- 원소의 중복을 허용한다.
- 순서를 보장하지 않는다. (순서가 필요하면 하위 인터페이스인 List를 사용)
따라서, 중복을 허용하면서, 순서는 보장하지 않는 collection을 사용하는 것이 map의 values 담기에 적절하다.
entrySet
Map에서 Key와 Value 가 모두 필요한 경우, entrySet을 사용한다.
Map.Entry는 Key와 Value를 함께 담고 있는 하나의 객체이다. 이 객체 안에는 Key를 꺼내는 getKey()와 getValue()가 있다.
Key가 중복X, 순서 X => Set을 사용.
Map은 Collection의 하위인터페이스가 아닌데도 함께 배우는 이유가 뭘까?
'데이터를 모아서 관리한다'라는 목적이 같기 때문이다.
둘 다 자바에서 효율적으로 데이터를 다루기 위해 만들어진 기술이다.
그렇다면 이렇게 나눈 이유가 뭘까?
차이점:
📂 Collection (List, Set)
- 데이터 자체에 초점을 맞춥니다.
- 하나의 데이터(element)들이 연속적으로 모여있는 구조입니다.
- 예시: 학생 이름 목록, 장바구니에 담은 상품 목록 등
- 접근 방식: 데이터를 하나씩 순서대로 꺼내보거나(Iterator), 특정 위치(index)의 데이터를 가져옵니다.
🏷️ Map
- 'Key'를 통한 데이터 접근에 초점을 맞춥니다.
- 모든 데이터는Key와 Value의 쌍(pair)으로 이루어져 있습니다.
- 예시: '대한민국'-'서울' 짝, '내 전화번호'-'홍길동' 짝처럼 사전이나 전화번호부와 같은 구조입니다.
- 접근 방식: 반드시 Key를 제시해야만 그에 해당하는 Value를 얻을 수 있습니다.
Collection이 데이터 자체를 목록으로 관리하는 방식이라면, Map은 Key를 통해 값에 빠르게 접근하는 검색 위주의 방식을 제공한다.
추가적으로 공부할 것 : generic, prettyPrinter인터페이스 인해,ArrayList의 동기화 처리
'자바' 카테고리의 다른 글
| week4: 자바 Thread -2 (0) | 2025.10.01 |
|---|---|
| week4: 자바 Thread (0) | 2025.09.27 |
| week2: 자바 프로그래밍 (static, final, 싱글톤) (0) | 2025.09.19 |
| 새 시작& 자바 개념 복습 (0) | 2025.09.07 |
| 6. Inheritance and Polymorphism (0) | 2025.05.27 |