Collection - 자료구조를 쉽게 사용하는 집합
Collection 이란?
자바는 여러 자료구조들을 쉽게 사용할 수 있도록 인터페이스와 구현체 (ArrayList, HachSet, HashMap 등을) 제공하는 집합이다.
배열과 다르게 컬렉션은 길이를 동적으로 변경할 수 있다.
이게 무슨 의미냐면, 배열은 처음 구현부터 배열 길이를 설정해주어야한다. 하지만, 나중에 수정을 할 때, 새로운 값을 배열에 추가를 하고싶다면, 배열 추가도 해야하고, 배열 길이도 수정을 해주어야한다. 이를 '정적' 이라고 표현한다.
오늘은 ArrayList, HachSet, HashMap를 하나하나씩 살펴볼 것이다.
| 인터페이스 | 특징 | 구현체 |
| List | 순서 유지, 중복 허용 | ArrayList |
| Set | 순서 없음, 중복 불가 | HashSet |
| Map | 키-값 구조, 키 중복 불가 | HashMap |
ArrayList
: 요소의 '순서'를 유지하고 '중복'된 값을 저장
- 요소 추가 → add("값")
- 요소 조회 → get(인덱스)
- 요소 제거 → remove("값")
여기서 중요한 점이 있다. 앞에 코드를 보면, 내가 ArrayList 타입이 아닌 List 타입으로 선언해주었다.
그 이유는 ArrayList가 아니라 List에 의존해야 다형성을 가질 수 있고, 다른 원칙을 위반하지 않을 수 있기 때문이다.
이는 업캐스팅(Up-casting)과 연관이 있는데, 업캐스팅은 상위 개념으로 선언하고, 하위 개념을 생성해 할당하는 것을 의미한다.
예를 들면, 자료의 수정을 위해 LinkedList를 사용하고 싶어졌다고 가정을 해보자.
ArrayList 타입에는 LinkedList 구현체를 할당할 수 없어서 컴파일 에러가 발생하기 때문에, 모든 ArrayList를 LinkedList로 수정해줘야한다. 하지만, List로 선언한 경우에는 구현체만 ArrayList에서 LinkedList로 변경해주면 끝이다.
이러한 점에서 List 타입으로 선언을 해주도록 하자.
List<String> arrayList = new ArrayList<>();
arrayList.add("123"); // 1 번째 요소 추가
// 중복 데이터 허용
arrayList.add("123");
// 단건 조회
System.out.println("1 번째 요소 조회: " + arrayList.get(0)); // 조회 123
// 데이터 삭제
arrayList.remove("123");
HashSet
: 요소의 '순서를 유지하지 않고' '중복을 허용하지 않는다.'
- → 순서를 보장하지 않기 때문에 get() 지원을 하지 않는다.
- 요소 추가 → add("값")
- 요소 제거 → remove("값")
HashSet<String> uniqueNames = new HashSet<>();
// 추가
uniqueNames.add("Spartan");
uniqueNames.add("Steve");
uniqueNames.add("2");
// 순서를 보장 안함
System.out.println("uniqueNames = " + uniqueNames);
uniqueNames.get(0); // get 사용 불가
// 중복 불가
uniqueNames.add("Spartan");
System.out.println("uniqueNames = " + uniqueNames);
// 제거
uniqueNames.remove("Spartan");
System.out.println("uniqueNames = " + uniqueNames);
HashMap
: 요소의 '순서를 유지하지 않고' '중복을 허용하지 않는다.'
여기까지만 보면, HashSet과 똑같은거 아닌가싶지만
이는 키(Key) - 값(Value) 구조로 데이터를 저장한다.
키는 중복 될 수 없지만, 값은 중복 가능하다.
- 요소 추가 → put(”키”, 값)
- 요소 조회 → get(”키”)
- 요소 제거 → remove("Steve")
- 키 확인 → keySet()
- 값 확인 → values()
HashMap<String, Integer> hashMap = new HashMap<>();
// 추가
hashMap.put("Juno", 21);
hashMap.put("Hunho", 21); // 값은 중복 가능
hashMap.put("Ima", 18);
// 키 중복 불가: 값 덮어쓰기 발생
hashMap.put("Juno", 5);
// 조회
System.out.println(hashMap.get("Juno"));
// 삭제 가능
hashMap.remove("Juno");
// 키 확인
Set<String> keys = hashMap.keySet();
// 값 확인
Collection<Integer> values = hashMap.values();