📌 01. 컬렉션
컬렉션이란 다수의 데이터를 쉽고 효율적으로 처리할 수 있는 클래스들의 집합이다.
다수의 데이터를 처리한다는 것이 배열과 유사하지만 가장 큰 차이점은 index가 없어 더 자유롭다는 것이다.
컬렉션은 크게 3가지가 있다.
- Set 인터페이스
- Map 인터페이스
- List 인터페이스
보다싶이 3가지 모두 인터페이스이기 때문에 단독으로 인스턴스를 가질 수 없다.
따라서 3개의 인터페이스를 구현하고 있는 자식클래스를 통하여 그 기능을 구현한다.
📖 Set 인터페이스
Set인터페이스를 구현하는 클래스들은 중복된 데이터의 값을 허용하지 않는다.
이것이 Set의 가장 큰 특징이다.
📝 HashSet
HashSet클래스는 Set인터페이스를 구현하는 클래스중 가장 많이 쓰이는 클래스이고
Set인터페이스의 특징을 모두 따른다.
// HashSet클래스에 대한 객체 생성
HashSet<String> hs = new HashSet<String>();
// add()메소드를 통한 데이터 저장
hs.add("유비");
hs.add("관우");
hs.add("유비");
hs.add("장비");
hs.add("조조");
// remove()메소드를 통한 데이터 삭제
hs.remove("조조");
// size()메소드를 통한 크기 측정
int size = hs.size();
// 출력
System.out.println(hs);
System.out.println("크기 : " + size);
[출력]
[관우, 장비, 유비]
크기 : 3
여기서 지금까지 보지 못했던 <>부호 가 나온다.
이는 제너릭변수를 지정하는 곳으로 사용할 기능의 제너릭 타입을 정해준다.
즉, 한번 지정한 제너릭타입은 해당 객체를 사용하는동안 계속 사용된다.
중복된 값을 허용하지 않는다.
위 코드를 보면 "유비"라는 문자열이 중복해서 add()메소드를 통해 저장이 된다.
하지만 출력을 할때보면 "유비"는 단 하나이고 크기에도 2개로 포함되지 않았다.
이는 Set의 가장 큰 특징으로 Set인터페이스를 구현하는 클래스는 중복될 값을 저장할시
원래 있는 값에 붙여넣기 때문에 중복된 값을 알아서 걸러준다는 것이다.
순서를 유지하지 않는다.
배열같은 경우는 첫 인덱스의 주소값이 정해지면 다음 인덱스는 그 다음 주소값으로 정해진다.
하지만 컬렉션 객체는 데이터를 저장할때마다 랜덤한 주소값이 지정된다.
특히나 Set메소드에선 인덱스가 없다는 점이 정말 큰 단점으로 다가온다.
인덱스가 없으니 크기에 제한받지 않고 자유롭게 데이터를 넣고빼고 할수는 있지만
원하는 데이터값을 불러오기가 힘들어진다.
📝 TreeSet
HashSet과 거의 유사하지만 다른점은 데이터를 정렬해서 출력한다는 것이다.
마찬가지로 중복된 값을 허용하지 않고 데이터가 순서에 상관없이 저장된다.
HashSet<String> hs = new HashSet<String>();
hs.add("유비");
hs.add("관우");
hs.add("유비");
hs.add("장비");
hs.add("조조");
System.out.println(hs);
TreeSet<String> ts = new TreeSet<String>();
ts.add("유비");
ts.add("관우");
ts.add("유비");
ts.add("장비");
ts.add("조조");
System.out.println(ts);
[출력]
[관우, 장비, 조조, 유비]
[관우, 유비, 장비, 조조]
📖 Map 인터페이스
Map인터페이스는 다른 컬렉션 인터페이스와는 약간 다른 저장 방식을 가진다.
Map인터페이스를 구현하는 클래스들은 키(key)와 값(value)을 하나의 데이터로 묶어서 저장한다.
때문에 Map은 제너릭타입 또한 2개를 사용한다.
📝 HashMap
// HashMap클래스에 대한 객체 생성
HashMap<Integer, String> hm = new HashMap<Integer, String>();
// put()메소드를 통한 데이터 저장
hm.put(1, "유비");
hm.put(2, "관우");
hm.put(3, "관우"); // 값의 중복
hm.put(4, "조조");
hm.put(4, "장비"); // 키의 중복
hm.put(5, "여포");
// remove()메소드를 통한 데이터 삭제
hm.remove(5);
// get()메소드를 통한 데이터 불러오기
System.out.println("1번방의 데이터 : " + hm.get(1));
// size()메소드를 통한 크기 측정
int size = hm.size();
// 출력
System.out.println(hm);
System.out.println("크기 : " + size);
[출력]
1번방의 데이터 : 유비
{1=유비, 2=관우, 3=관우, 4=장비}
크기 : 4
키값을 가진다
각 방마다 부여되는 고유한 값이 키값이 부여되기 때문에
Set인터페이스와는 다르게 원하는 값을 불러올 수 있다.
값의 중복은 허용되나 키값의 중복은 허용되지 않는다.
위에서 보면 2번방과 3번방에서 "관우"라는 문자열이 중복되지만 정상적으로 출력이 된다.
그러나 키값이 4번인 데이터를 두번 저장하면 4번방이 두번 생기는 것이 아니라
후에 저장한 데이터로 덮어씌워진다.
📖 List 인터페이스
List인터페이스 특히 그중 ArrayList는 컬렉션 인터페이스를 통틀어서도 가장 많이 사용되는 클래스 중 하나이다.
ArrayList는 이름 그대로 배열을 이용하여 인덱스를 가지고 데이터에 가장 빠르게 접근할 수 있다.
또한 컬렉션의 기능을 물려받아 그 사용이 좀 더 자유로워진다.
📝 ArrayList
// ArrayList클래스에 대한 객체 생성
ArrayList<String> al = new ArrayList<String>();
// add()메소드를 통한 데이터 저장
al.add("유비");
al.add("관우");
al.add("장비");
al.add("조조");
al.add("여포");
System.out.println(al);
// 2번재 add()메소드를 통한 데이터 저장
al.add(3, "동탁");
System.out.println(al);
// remove()메소드를 통한 데이터 삭제
al.remove(2);
System.out.println(al);
// set()메소드를 통한 데이터 수정
al.set(2, "장비");
System.out.println(al);
// get()메소드를 통한 데이터 불러오기
System.out.println("2번방의 데이터 : " + al.get(1));
[출력]
[유비, 관우, 장비, 조조, 여포]
[유비, 관우, 장비, 동탁, 조조, 여포]
[유비, 관우, 동탁, 조조, 여포]
[유비, 관우, 장비, 조조, 여포]
2번방의 데이터 : 관우
'Java > Java Fundamental' 카테고리의 다른 글
자바 설치하기 (1) | 2022.09.05 |
---|---|
Day11_추상과 인터페이스 (0) | 2021.11.01 |
Day10_상속 (0) | 2021.10.19 |
Day09_클래스 (0) | 2021.10.19 |
Day08_배열 (0) | 2021.10.18 |