Collection API 는 언제 어떻게 쓸까요??
Collection 이란?
일단 간단하게 컬랙션은 배열이라고 생각하면 편합니다!
하지만 배열과 다른점이 있는데요. 그점을 핵심만 정리해봤습니다.
- 배열과 다르게 하나의 컬랙션에 서로 다른 여러가지 데이터형이 저장 가능하다!
- 참조 데이터 형만 저장 가능하다. 기본 데이터형은 Wrapper클래스를 이용하거나, 오토박싱으로 저장 가능합니다.
- 객체인 데이터를 저장할 때마다 크기가 자동으로 늘어난다. (유용하죠?)
- Generic 타입을 지원한다. (이건 추후에 다뤄볼게요 흠… AutoBoxing을 안다면 이해하기 조금 쉬울겁니다.)
메서드 설명
Object[] toArray() | Collection에 저장된 객체를 배열로 변환시킵니다. |
Iterator<E> iterator() | Collection에 저장된 데이터를 반복출력하기 위한 Iterator 인터페이스 반환. |
int size() | Collection에 저장된 객체의 갯수를 숫자로 표현. |
솔직히 컬랙션 API에서 자주 사용하는 메소드는 그리 많지 않습니다 !
그렇다면 왜 컬랙션에 대해서 알아야 할까요 흠….
이유는 컬랙션에 상속되어있는 클래스들이 실제 업무에서 되게 유용하게 쓰이는 자료구조 이기 때문입니다!!!
그중에서 3가지(List, Set, Map) 를 전체적으로 알아보겠습니다!
List 배열의 특징
- 데이터의 저장되는 순서가 있기 떄문에 데이터가 중복 저장이 가능합니다. (인덱스 번호가 있기 때문에!)
- 기본적으로 저장된 위치값을 사용할 수 있기 때문에 Set 계열 보다 다양한 기능을 처리 할 수 있습니다.
메서드 설명
Object get(int index) | List의 index 위치에 있는 요소를 반환(가져온다) 합니다. |
void add(Object o), void add(int index, Object o) | List에 순차적으로 추가 List의 index 위치에 요소 o 를 추가 |
void set(int index, Object o) | List의 index에 위치해 있는 요소를 o요소로 수정합니다. |
void remove(Object o) | List의 첫번째 위치( index 0 ) 부터 순서대로 확인하여, 요소 o를 삭제 (한개만) |
void remove(int index) | List의 index위치에 있는 요소를 삭제. |
예시 :
//ArrayList는 List클래스가 가지고 있는 여러가지 배열클래스중 하나입니다!
//또 다른것으로는 LinkedList가 있습니다 :)
ArrayList<String> list = new ArrayList<String>();
list.add("HI"); // index 0 "HI" 요소 추가!
list.add("How"); // index 1 ~~
list.add("are"); // index 2 ~~
list.add("you"); // index 3 ~~
list.remove(3); // index 3번지 요소를 삭제!
list.set(0, "What's up"); // index 0번지에 있는 HI를 What's up 으로 수정!
list.get(2); // index 2 번지에 있는 "are"을 가져왔습니다!
list.remove("are"); // index 0번지 부터 끝까지 반복하면서 "are" 을 삭제합니다
// 하지만 먼저 검색된 인덱싱만 삭제 되기에 추후에 똑같은 중복값은 삭제가 안됩니다!
추가적으로 사용할 수 있는 메소드 ! (유용한 것들만)
list.isEmpty(); // list의 요소가 비어 있는지 확인 후 boolean형으로 반환!
list.contains("HI"); // list의 요소중에서 "HI" 라는 요소가 있는지 확인!
// 똑같이 boolean 형으로 반환!
list.size(); // list의 요소의 개수 확인 후 int형으로 반환!
// array의 .length 와 동일한 것입니다!
이 정도만 알아도 왠만한것들은 만들 수 있어용 엣흠.
Set 배열의 특징
- 저장순서가 없습니다 ! (그래서 중복저장 X , 그렇다고 해서 indexing이 안된것은 아닙니다. 주소값은 존재해요 🙂)
- 저장된 위치를 알 수 없기 때문에 위치값으로 데이터를 얻을 수 없습니다.
- 실제로 구현된 HashSet, SortedSet 같은 클래스들을 통해 Set계열을 이용할 수 있습니다.
사용하는 메소드는 대부분이 List와 비슷하거나 똑같기 때문에 제외!!!
하지만 특이점이 있는게 예를들어서 :
add를 하면 List는 인덱싱 번호를 설정할 수 있지만 Set은 저장순서가 없기때문에 이 또한 없습니다.
또한 for문을 이용해 출력을 하게 되면 RANDOM 하게 나옵니다 흠.
언제 쓸까요??…
저의 개인적인 생각으로는 단순히 랜덤하게 데이터를 입력하고 랜덤으로 데이터를 뽑아 올때 쓸것같은데
대표적인 케이스는 나이키 Draw 시스템 (일정 시간내에 응모를 한 사람중 랜덤으로 당첨이 되는것)
와 같이 랜덤 당첨시스템을 쓸때 유용하게 데이터를 컨트롤 할 수 있을것 같습니다 .
반대로 선착순 같은 경우는 인덱싱이 있는게 좋겠죠???
위에 특징만 잘 기억해두시면 Set을 쓸때 헷갈리지 않을겁니다! 물론 다른 컬랙션에 비해 자주 안쓰겠지만요….!
그래서 코드샘플은 준비하지 않았답니다 허헣 🙂
Map 배열의 특징
일단 특징 부터 !
- Map은 Key, Value가 한쌍으로 갖는 자료형 입니다 ! (key는 인덱싱같은 존재! Value는 저희가 입력한 데이터 같은??)
- Map은 List,Array 처럼 순차적으로 해당 요소 값을 구하지 않고 Key값을 통해 Value값을 얻습니다.
솔직히 이게 정말정말 큰 다른점이라 이 내용만 숙지를 잘 알면 활용도가 매우 높은 컬랙션중 하나입니다. 크…..
메서드 (간단하게!) 설명
put | key와 value를 입력해 데이터를 Map에 저장합니다 |
get | key에 해당하는 value 값을 가져옵니다. |
containsKey | Map에 해당 key가 있는지 확인하고 boolean형으로 반환합니다. |
remove | key값에 해당되는 아이템(key, value)를 삭제합니다. (삭제후 value값을 리턴을 해줍니다 띠용) |
keySet | Map의 모든 Key값을 모아서 Set자료형으로 리턴해줍니다. |
코드 샘플 :
import java.util.HashMap;
public class Sample {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("name", "연우진");
map.put("job", "개발자");
}
}
put메서드를 사용하여 key값과 value값을 한쌍으로 저장합니다!
System.out.println(map.get("name")); // "연우진" 출력
key값을 통해 value값을 출력해봤습니다.
getOrDefault
맵의 key에 해당하는 value가 없을 경우에 get 메소드를 사용하면 다음처럼 null이 리턴된다.
System.out.println(map.get("java")); // null 출력
이때 null 대신 디폴트 값을 얻고 싶은 경우에는 getOrDefault 메소드를 사용한다.
System.out.println(map.getOrDefault("java", "자바")); // "자바" 출력
번외)
LinkedHashMap과 TreeMap
Map의 가장 큰 특징은 순서에 의존하지 않고 key로 value를 가져오는데 있습니다. 하지만 가끔은 Map에 입력된 순서대로 데이터를 가져오고 싶은 경우도 있고 때로는 입력된 key에 의해 소트된 데이터를 가져오고 싶을 수도 있을겁니다. 이런경우에는 LinkedHashMap과 TreeMap을 사용하는 것이 유리합니다.
- LinkedHashMap은 입력된 순서대로 데이터를 저장하는 특징을 가지고 있다.
- TreeMap은 입력된 key의 오름차순 순서로 데이터를 저장하는 특징을 가지고 있다.
자 오늘은 여기까지 !!
'Java' 카테고리의 다른 글
[Java] Optional 에 대한 개념 및 사용법 (0) | 2023.03.10 |
---|---|
InnerClass 왜 사용할까? (0) | 2023.01.13 |
윤년과 평년을 구별하는 프로그래밍 (0) | 2023.01.13 |
추상클래스와 인터페이스 (0) | 2023.01.13 |
Static 이란? (0) | 2023.01.13 |