복잡한뇌구조마냥

[JAVA] 컬렉션 프레임워크 ( 자료구조, Set, List, Map ) 본문

BE/JAVA

[JAVA] 컬렉션 프레임워크 ( 자료구조, Set, List, Map )

지금해냥 2025. 6. 10. 16:52

컬렉션 프레임워크

- java.util 패키지에는 자료를 다룰 수 있는 자료구조 클래스가 다수 존재함.

- 자료구조 클래스를 컬렉션 프레임워크라고 함.

 

자료구조

- 자료를 저장할 수 있는 구조

<interface>
Collection
+ add(Object) : boolean
+ interator() : interator
+ size() : int

- 기본이 되는 interface는 Collection

- 중복도 허용하고, 자료가 저장된 순서도 기억하지 못함.

- 저장된 자료를 하나씩 꺼낼 수 있는 Interator 라는 인터페이스를 반환

<interface>
Iterator
+ hashNext(): boolean
+ next() : Object

- Collection이 순서 등 기능을 위해 의존함

- 꺼낼 것이 있는지 살펴보는 hasNext() 메소드

- 하나씩 자료를 꺼낼때 사용하는 next() 메소드

<interface>
Set
+ add(Object) : boolean

- 중복을 허용하지 않는 인터페이스

- Collection Interface를 상속

- add 메소드는 같은 자료가 있으면 false, 없으면 true를 반환

HashSet
+ add(Object) : boolean
+ interator(): interator
+ size() : int

- 자료구조

- Set 기반으로 구현

<interface>
List
+ get(int) : Object

- Collection Interface를 상속

- 순서를 저장함

ArrayList
+ add(Object): boolean
+ get(int): Object
+ interator(): interator
+ size(): int

- 자료구조

- List 기반으로 구현

<interface>
Map
+ get(Object) : Object
+ keySet(): Set
+ put(Object, Object): void

- Set Interface를 상속

- put 메소드를 이용해서 key와 value를 저장

- key를 매개변수로 받아들이는 get 메소드를 이용해서 값을 꺼냄

- key는 중복되어서는 안됨

- key의 중복 방지를 위해서 모든 key들에 대한 정보를 읽어들일 수 있는 Set을 반환하는 keySet() 메소드가 있음.

HashMap
+ get(Object) : Obejct
+ keySet(): Set
+ put(Object, Object): void

- 자료구조

- Map 기반으로 구현

 

Generic

// 수정전 Box.java
public class Box {
    private Object obj;

    public void setObj(Object obj){
        this.obj = obj;
    }

    public Object getObj(){
        return obj;
    }
}
public class BoxExam {
    public static void main(String[] args) {
    	// 수정 전 코드에 사용
        Box box = new Box();
        box.setObj(new Object());
        Object obj = box.getObj();
        System.out.println(obj);

        box.setObj("hellow");
        String str = (String)box.getObj();
        System.out.println(str);

        box.setObj(10);
        int num = (int)box.getObj();
        System.out.println(num);
    }
}

- 다른 타입을 적용할 때는 형변환을 통해서 값을 기입할 수 있음.

// 수정 후 Box.java
public class Box<E> {
    private E obj;

    public void setObj(E obj){
        this.obj = obj;
    }

    public E getObj(){
        return obj;
    }
}

 

public class BoxExam {
    public static void main(String[] args) {
        Box<String> box2 = new Box<>();
        box2.setObj("hello");
        String str2 = box2.getObj();
        System.out.println(str2);

        Box<Integer> box3 = new Box<>();
        box3.setObj(10);
        int num2 = box3.getObj();
        System.out.println(num2);
    }
}

- <>로 가상의 타입을 Generic 문법을 통해서 적용할 수 있음.

- Generic이 아닌 형식으로 선언하면 형변환을 통해서 값을 변경해줘야하는 일이 생김.

- Generic을 선언하므로서 가상의 타입으로 선언해주고 실제 사용할 때는 특정 타입으로 다양한 타입을 사용하는 클래스 생성 가능

 

Set

- 중복이 없고, 순서도 없는 자료구조.

- Hashset과 TreeSet이 있음.

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class SetExam {
    public static void main(String[] args) {
        Set<String> set1 = new HashSet<>();
        boolean flag1 = set1.add("Hello");
        boolean flag2 = set1.add("world");
        boolean flag3 = set1.add("Hello");

        System.out.println(flag1);
        System.out.println(flag2);
        System.out.println(flag3);
        System.out.println(set1.size());
        
        // Set에서 바로 문자 출력
        for(String str : set1){
            System.out.println(str);
        }
		
        // Set의 Iterator를 활용해서 출력
        Iterator<String> iter = set1.iterator();
        while(iter.hasNext()){
            System.out.println(iter.next());
        }
    }
}

- Generic 문법을 통해서 특정 타입을 사용하도록 지정

- 동일한 값은 추가되지 않음.

- add 함수는 boolean을 반환하고 예제 코드에서 보듯이 이미 들어있는 값은 추가되지 않음.

- Iterator를 통해서 set에 있는 값을 하나씩 꺼내서 볼 수 있음.

- Iterator는 순서가 없기 때문에 while을 통해서 hasNext()가 있을 때 동작하도록 구현하는게 나음.

 

List

- 배열과 비슷한 구조의 자료구조

- List는 데이터의 중복이 있을 수 있고, 순서도 있음.

import java.util.ArrayList;
import java.util.List;

public class ListExam {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Hello");
        list.add(" ");
        list.add("World");
        list.add("Hello");

        System.out.println(list.size());
        for(int i = 0; i < list.size(); i++){
            String str = list.get(i);
            System.out.println(str);
        }
    }
}

- 중복이 있어도 List에 추가할 수 있음

- 순서가 있기 때문에 for문을 통해서 특정 index의 값을 사용할 수 있음. 

 

Map

- Key와 Value를 쌍으로 저장하는 자료구조

- Key는 중복 될 수 없고, 값은 중복 될 수 있음.

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Iterator;

public class MapExam {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("001", "kim");
        map.put("002", "lee");
        map.put("003", "park");
        map.put("004", "kim");
        map.put("002", "kang");

        System.out.println(map.size());

        Set<String> keys = map.keySet();
        Iterator<String> iter = keys.iterator();
        while(iter.hasNext()){
            String key = iter.next();
            String value = map.get(key);
            System.out.println(key + " : " + value);
        }
    }
}

- 동일한 key값에 value를 넣으면 마지막에 넣은 value로 적용됨.

- 모든 KeySet은 Set 타입으로 저장되므로 set을 이용해서 key 목록을 가져옴.

- Set은 Iterator 형식으로 순서와 중복이 없기 때문에 목록을 불러와서 Map의 key와 value를 사용할 수 있음.

 

참고자료:

https://school.programmers.co.kr/learn/courses/9/9-%EC%9E%90%EB%B0%94-%EC%A4%91%EA%B8%89

 

자바 중급

자바 입문을 수강했다면 자바의 다양한 기능에 대해 더 알아볼 수 있는 자바 중급을 추천합니다.

school.programmers.co.kr

 

LIST