본문 바로가기

Java

[Java] 자료구조 List, Set, Map

 

자료구조(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를 리턴한다.

로또번호, 빙고게임처럼 중복된 값이 허용되지 않는 프로그램을 만들 때 사용