티스토리 뷰
컬렉션 ( Collection ) 이란 ?
목록성 데이터를 처리하는 자료구조들의 집합
-
배열은 처음 만들 때 크기가 고정되지만, 컬렉션은 크기가 가변입니다!
-
또한, 배열은 객체를 삭체하는 경우 해당 인덱스가 비게 되고, 저장할 때 비어있는 곳을 일일이 검색해야합니다.
-
따라서 컬렉션을 이용하면 객체들을 효율적으로 추가, 삭제, 검색할 수 있게됩니다.
컬렉션 인터페이스는 크게 Set, List, Queue로 분류됩니다.
Map은 컬렉션 인터페이스를 상속받고 있지 않지만 컬렉션으로 분류됩니다.
1. List
객체를 일렬로 늘어놓은 구조
-
순서가 있고, 중복이 가능합니다.
-
객체를 저장하면 자동으로 인덱스를 부여하며, 객체를 인덱스로 관리합니다.
-
인덱스를 이용해 객체를 검색, 삭제, 수정합니다.
ArrayList
-
JAVA에서 가장 많이 사용되는 자료구조입니다.
-
단방향 포인터 구조
-
일반 배열과 같이 인덱스로 객체를 관리하지만, ArrayList는 용량이 가변입니다.
-
특정 인덱스에 객체를 삽입하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩 밀려납니다. ( 비효율적 )
-
특정 인덱스의 객체를 삭제하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨지면서 빈 인덱스를 채웁니다.
-
데이터의 조회가 빈번한 경우 데이터에 대한 인덱스를 가지고 있어 유용합니다.
생성
List<String> list = new ArrayList<String>();
추가
list.add("아이언맨");
list.add("닥터스트레인지");
list.add("스파이더맨");
list.add("토르");
수정
list.set(list.indexOf("토르"), "헐크");
삭제
list.remove("아이언맨");
list.remove(0);
검색
list.get(0);
List 사용해보기
import java.util.ArrayList;
import java.util.List;
public class ListTest01 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("홍길동");
list.add("이순신");
list.add("강호동");
list.add("이수근");
list.add("은지원");
list.add("조규현");
list.add("송민호");
list.add("표지훈");
list.add("유재석");
list.add("조세호");
list.add("신동엽");
prn(list);
transElement(list);
}
public static void prn(List<String> list) {
System.out.println(list);
System.out.print("{ ");
for (int i = 0; i < list.size(); i++) {
if (i < list.size() - 1)
System.out.print(list.get(i) + ", ");
else
System.out.println(list.get(i) + " }");
}
}
public static void transElement(List<String> list) {
// 1. 홍길동을 김길동으로 바꾸자
int index = list.indexOf("홍길동");
list.set(index, "김길동");
System.out.println(list);
// 2. "신"으로 끝나는 객체를 찾아서, 만일 있다면 신->자 로 바꾸자
for (int i = 0; i < list.size(); i++) {
if (list.get(i).endsWith("신")) {
list.set(i, list.get(i).replace("신", "자"));
}
}
System.out.println(list);
// 3. "호"로 끝나는 객체를 찾아서, 만일 있다면 삭제하자
for (int i = 0; i < list.size(); i++) {
if (list.get(i).endsWith("호")) {
list.remove(i);
}
}
System.out.println(list);
}
}
Vector
-
ArrayList와 동일한 내부 구조 ( ArrayList의 구버전)
-
잘 쓰이지 않습니다.
LinkedList
-
ArrayList와 사용방법은 같지만, 내부 구조가 전혀 다릅니다.
-
양방향 포인터 구조
-
위치 정보만 가지고 있으며, 체인처럼 관리합니다. ( 한 인덱스는 다음 인덱스의 주소값을 가지고 있습니다. )
-
데이터의 삽입, 삭제가 빈번한 경우 데이터의 위치 정보만 수정하면 되기 때문에 유용합니다.
2. Set
-
집합
-
저장 순서가 유지되지 않고, 객체를 중복해서 저장할 수 없습니다.
-
인덱스로 관리하지 않기 때문에 인덱스를 파라미터로 갖는 메소드가 없습니다.
-
전체 객체를 대상으로 한 번씩 반복해서 가져오는 Iterator(반복자)를 제공합니다.
HashSet
-
일반적인 경우
-
데이터의 순서가 중요하지 않은 경우
-
동일한 객체는 중복 저장하지 않습니다.
TreeSet
-
순서가 중요한 경우
LinkedHashSet
-
입력 순서가 중요한 경우
Set 사용해보기
SetTest01.java
import java.util.HashSet;
import java.util.Set;
public class SetTest01 {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("1");
set.add("5");
set.add("2");
set.add("7");
set.add("4");
set.add("4");
set.add("3");
System.out.println(set); // 중복이 안됨, 자동 정렬됨
setFind(set, "5");
setDelete(set, "5");
System.out.println(set);
}
public static void setDelete(Set<String> set, String del) {
for(String d : set) {
if(d.equals(del)) {
set.remove(del); // ConcurrentModificationException
System.out.println(d + " 지웠당!");
break;
}
}
}
public static void setFind(Set<String> set, String find) {
for(String f : set) {
if(f.equals(find)) {
System.out.println(f + " 찾았당!");
}
}
}
}
Set에 있는 데이터를 출력하는 방법
Score.java
package com.score;
public class Score {
private String name;
private int kor;
private int eng;
private int math;
public Score() {
}
public Score(String name, int kor, int eng, int math) {
this.name = name;
this.kor = kor;
this.eng = eng;
this.math = math;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getSum() {
return kor+eng+math;
}
public double getAvg() {
return getSum() / 3.0;
}
public String getGrade() {
switch((int) getAvg() / 10) {
case 10: case 9:
return "A";
case 8:
return "B";
case 7:
return "C";
case 6:
return "D";
default:
return "F";
}
}
@Override
public String toString() {
return "이름 : " + name + "\n국어 : " + kor + " 영어 : " + eng + " 수학 : " + math + " 총점 : " + getSum() + " 평균 : " + getAvg() + " 등급 : " + getGrade() + "\n";
}
}
SetTest02.java
package com.test03;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import com.score.Score;
public class SetTest02 {
public static void main(String[] args) {
Score sc01 = new Score("홍길동", 100, 45, 67);
Score sc02 = new Score("이순신", 95, 100, 75);
Score sc03 = new Score("김선달", 61, 89, 100);
Set<Score> set = new HashSet<Score>();
set.add(sc01);
set.add(sc02);
set.add(sc03);
set.add(new Score("조세호", 100, 100, 100));
transElement(set, "조세호", 0);
}
// Set에 있는 데이터 출력하기
public static void prn(Set<Score> set) {
// 1.
for(Score sc : set) {
//System.out.println(sc);
}
// 2.
Object[] arr = set.toArray();
for(int i=0; i<arr.length; i++)
//System.out.println(arr[i]);
for(Object o : arr) {
//System.out.println(o);
}
for(Object o : arr) {
if(((Score)o).getName().equals("조세호")) { // downcasting
//System.out.println(((Score)o).getName() + " : " + ((Score)o).getAvg());
}
}
// 3. Iterator : 컬렉션 저장 요소를 읽어오는 표준화된 방법
Iterator<Score> ir = set.iterator();
while(ir.hasNext()) {
System.out.println(ir.next());
}
}
public static void transElement(Set<Score> set, String name, int kor) {
// Iterator를 사용하여 set 안의 객체 중 이름이 조세호인 객체를 찾아서 해당 객체의 국어 점수를 파라미터 값으로 바꾸고 전체 출력하자.
Iterator<Score> ir = set.iterator();
while(ir.hasNext()) {
Score s = ir.next();
if(s.getName().equals(name)) {
s.setKor(kor);
}
}
prn(set);
}
}
3. Map
-
데이터를 삽입할 때 <Key, Value> 형태로 삽입됩니다.
-
Key로 객체들을 관리합니다.
-
Key는 중복 불가능 / Value는 중복 허용
HashMap
-
Map 인터페이스를 구현한 대표적인 Map 컬렉션
-
Key 타입은 주로 String을 많이 사용합니다.
생성
Map<String, Integer> map = new HashMap<String, Integer>();
삽입
map.put("백", 100);
map.put("백", 101); // Key는 중복 불가 -> "백"이라는 Key의 Value가 101로 바뀜
map.put("백하나", 101); // Value는 중복 가능
삭제 : 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴합니다.
System.out.println(map.remove("백")); // 101
검색 : Key 값으로 Value 값을 리턴합니다.
System.out.println(map.get("백하나")); // 101
주어진 Key 또는 Value가 존재하는 지의 여부 (boolean)
System.out.println(map.containsKey("백하나")); // true
System.out.println(map.containsValue(100)); // false
Map 사용해보기
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class MapTest01 {
public static void main(String[] args) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i=111; i<116; i++) {
map.put(i, i+1000); // 순서가 없음
}
map.put(112, 1113); // 중복이 안됨
System.out.println(map);
System.out.println(map.get(112));
prn(map);
}
public static void prn(Map<Integer, Integer> map) {
// Entry : key 따로 value 따로 접근할 수 있음
Set<Map.Entry<Integer,Integer>> entrySet = map.entrySet();
/*
for(Entry<Integer, Integer> entry : entrySet) {
if(entry.getValue() == 1113) {
System.out.println(entry.getKey());
}
}
*/
// Iterator를 사용해서 위의 forEach문과 같은 결과를 출력하자.
Iterator<Entry<Integer,Integer>> entryIt = entrySet.iterator();
while(entryIt.hasNext()) {
Entry<Integer, Integer> m = entryIt.next();
if(m.getValue() == 1113) {
System.out.println(m.getKey());
}
}
}
}
'JAVA > 이론' 카테고리의 다른 글
[JAVA] [ORACLE] JDBC ( Java Database Connectivity ) 의 개념과 Eclipse 연결하기 (0) | 2020.01.06 |
---|---|
[JAVA] 제네릭 ( Generic ) <> (0) | 2019.12.03 |
[JAVA] [OOP] 추상 클래스 ( Abstract Class ) 와 인터페이스 ( Interface ) (0) | 2019.11.28 |
[JAVA] [OOP] 상속 ( Inheritance ) 과 다형성 ( Polymorphism ) (0) | 2019.11.28 |
[JAVA] [OOP] 생성자 ( Constructor ) 에 대하여 (0) | 2019.11.27 |