자료구조(Data Structure)
데이터를 효율적으로 사용할 수 있도록 구조를 만들어 저장
java.util 패키지에 속하며 List, Stack, Queue, Map, Set 등 다양한 종류에 자료구조가 있다.
List 인터페이스
List 인터페이스는 데이터의 중복을 허용하고 순서가 정해져 있다. Collection 인터페이스에 속하며 대표적으로 ArrayList와 LinkedList로 나뉘어 진다.
ArrayList의 경우 데이터값들이 인접해 있어 전체적으로 순회하면서 조회하는 경우 좋은 성능을 보이지만 잦은 수정, 삭제가 있을 경우 데이터들의 지속적인 복사, 이동으로인해 성능이 좋지 못하다.
반면 LinkedList의 경우 데이터끼리 서로 참조하는 연결방식으로 되어 있어 추가, 삭제에 좋은 성능을 보이고, 데이터들에 대한 접근성은 떨어지는 편이다.
ArrayList
가장 많이 사용되는 자료구조 클래스이고 Object배열을 이용하여 데이터를 순차적으로 저장한다.
주요 메서드
메서드 | 내용 |
void add(Object obj) | 객체를 index에 저장 |
Object get(int index) | 지정한 index의 객체를 반환 |
Object remove(int index) | 지정한 index의 객체를 삭제 |
Object set(int index, Object element) | element(객체)를 원하는 index에 저장 |
int size() | ArrayList에 저장된 객체의 수를 반환 |
int indexof(Object obj) | 지정한 객체의 index 위치를 반환 |
boolean contains(Object obj) | 객체가 ArrayList에 포함되었는지 여부 확인 |
- 예제 코드
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
public class ListTest {
public static void show(List<String> list) {
Iterator<String> iter = list.iterator();
while(iter.hasNext()) {
System.out.print(iter.next()+ ", ");
}
System.out.println();
}
public static void main(String[] args) {
// List 자료구조를 활용하여 키보드에 입력한 데이터를 추가하고
// 데이터를 입력하여 삭제하자. ==> 전체 출력
ArrayList<String> list = new ArrayList<String>();
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("1.추가 2.삭제 3.종료");
System.out.println("선택 : ");
String menu = sc.nextLine();
switch (menu) {
case "1":
System.out.println("추가 : ");
list.add(sc.nextLine());
show(list);
break;
case "2":
System.out.println("삭제 : ");
String str = sc.nextLine();
int idx = list.indexOf(str);
if(idx != -1) {
list.remove(idx);
}
show(list);
break;
case "3":
System.out.println("프로그램 종료");
return;
}
}
}
}
Map 인터페이스
Map 인터페이스는 key와 value 한 쌍으로 데이터를 제공하며, 순서가 정해져 있지 않다. value의 경우 중복 값을 허용하지만 key는 중복 값을 허용하지 않는다.
주요메서드
메서드 | 내용 |
Object put(Object key, Object value) | key와 value값을 mapping하여 저장 |
Object get(Object key) | key값과 대응하는 value값을 반환 |
Set keySet() | 저장된 모든 key값을 반환 |
Collection values() | 저장된 모든 value값을 반환 |
Set entrySet() | key와 value를 Map.entry타입의 객체로 저장한 Set으로 반환 |
Object remove(Object key) | key와 대응하는 value값을 삭제 |
int size() | Map에 저장된 key, value쌍의 수를 반환 |
boolean isEmpty() | Map이 비어있는지 확인 |
boolean containsKey(Object key) | Map에 key값이 포함되어 있는지 확인 |
boolean containsValue(Object value) | Map에 value값이 포함되어 있는지 확인 |
Map.Entry 인터페이스
Map인터페이스 안에 내부 인터페이스이다. Map 자료구조의 경우 key, value 쌍 구조로 되어 있기 때문에 내부 인터페이스로 Entry 인터페이스를 정의해 두었다.
중복을 허용하는 values()의 경우 Collection이 반환 타입이고, 중복을 허용하지 않는 keySet()의 경우 Set 반환 타입이다.
Map.Entry 메서드
메서드 | 내용 |
Object getKey() | Entry의 key값을 반환 |
Object getValue() | Entry의 value값을 반환 |
Object setValue(Object value) | Entry의 value값을 지정된 값으로 변경 |
boolean equals(Object obj) | Entry가 동일한지 비교 |
- 예제 코드
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class MapExam {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("1", "NC");
map.put("2", "두산");
map.put("3", "키움");
System.out.println("요소의 사이즈 : " + map.size());
if(map.containsValue("두산")) {
map.remove("2");
}
System.out.println("요소의 사이즈 : " + map.size());
//System.out.println(map.get("3"));
//Map 전체목록을 출력
//Map => Set => Iterator
Set set = map.entrySet();
Iterator iter = set.iterator();
while(iter.hasNext()) {
Map.Entry<String, String> e = (Entry<String, String>) iter.next();
System.out.println("key : " + e.getKey() + ", value : " + e.getValue());
}
}
}
- 예제 코드2
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class MapMission {
public static void main(String[] args) {
//이름, 정수를 한쌍으로 한 Map 자료구조를 구현
//김자바 : 100, 박자바 : 70
//시험응시자(key) => keySet()
//점수(value) => values() : Collection => Iterator
//총점과 평균, 최고점수, 최저점수 출력
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("김자바", 100);
map.put("박자바", 70);
map.put("강자바", 80);
map.put("최자바", 50);
//key값 출력
Set<String> set = map.keySet();
System.out.println("시험응시자 : " + set);
//value값 출력
Collection<Integer> values = map.values();
System.out.println("점수 : " + values);
Iterator<Integer> iter = values.iterator();
int sum = 0;
while(iter.hasNext()) {
int num = iter.next();
sum += num;
}
System.out.println("총점 : " + sum);
System.out.println("평균 : " + sum/map.size());
System.out.println("최고점수 : " + Collections.max(map.values()));
System.out.println("최저점수 : " + Collections.min(map.values()));
}
}
Set 인터페이스
Set은 중복을 허용하지 않고 순서가 정해져 있지 않다. Collection 인터페이스에 속하며 대표적인 클래스로는 HashSet과 TreeSet이 있다.
HashSet은 중복된 값을 허용하지 않으며 add를 통해 중복된 값이 들어갈 경우 false를 리턴한다.
로또번호, 빙고게임처럼 중복된 값이 허용되지 않는 프로그램을 만들 때 사용
'Java' 카테고리의 다른 글
[Java] 입출력(IO) File, 직렬화(Serialization) (0) | 2020.07.25 |
---|---|
[Java] 정렬(Sort) Comparator, Comparable (0) | 2020.07.24 |
[Java] 입출력(IO) 정리 (0) | 2020.07.22 |
[Java] 정규표현식(Regular Expression) (0) | 2020.07.20 |
[Java] java.lang패키지(2) String클래스, StringBuffer클래스 (0) | 2020.07.17 |