ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA - Collections Framework - Set, List, Map
    JAVA 2024. 1. 16. 13:10
    728x90

    1. Array와 Collections Framework

    배열은 연관된 데이터를 관리하기 위한 수단이었다. 그런데 배열에는 몇가지 불편한 점이 있었는데 그 중의 하나가 한번에 정해진 배열의 크기를 변경할 수 없다는 점이다. 이러한 불편함을 collections framework를 사용하면 줄어든다.

     

    아래의 예를 보자.

     

    import java.util.ArrayList;
    
    public class ArrayListDemo {
        public static void main(String[] args) {
            String[] arrayObj = new String[2];
            arrayObj[0] = "one";
            arrayObj[1] = "two";
    //        arrayObj[2] = "three"; // 오류 발생
            for (String array : arrayObj) {
                System.out.println(array);
            }
    
            ArrayList al = new ArrayList();
            al.add("one");
            al.add("two");
            al.add("three");
            // add(object e) // 인수로 object 데이터 타입으로 들어가야 한다.
            for (int i = 0; i < al.size(); i++) {
                System.out.println(al.get(i));
            }
            for (int i = 0; i < al.size(); i++) {
    //            String value = al.get(i); // object 타입이기 때문에 캐스팅을 해주어야 한다.
                String value = (String) al.get(i);
                System.out.println(value);
            }
        }

    근데 굳이 캐스팅을 해줄 필요 없이 아래 코드와 같이 배열 자체에 타입을 지정해주면 된다.

    ArrayList<String> al = new ArrayList<String>();
    al.add("one");
    al.add("two");
    al.add("three");
    // add(object e) // 인수로 object 데이터 타입으로 들어가야 한다.
    for (int i = 0; i < al.size(); i++) {
        String value = al.get(i); // object 타입이기 때문에 캐스팅을 해주어야 한다.
        System.out.println(value);
    }

    2. 전체적인 구성 / Collections Framework란?

    그럼 이제부터 collections framework가 무엇인지 본격적으로 알아보자. collections framework라는 것은 다른 말로는 컨테이너라고도 부른다. 즉 값을 담는 그릇이라는 의미이다. 그런데 그 앖의 성격에 따라서 컨테이너의 성격이 조금씩 달라진다. 자바에서는 다양한 상황에서 사용할 수 있는 다양한 컨테이너를 제공하는데 이것을 collections framework라고 부른다. ArrayList는 그 중 하나이다.

    위 그림은 collections framework의 구성을 보여준다. collection과 Map이라는 최상위 카테고리가 있고, 그 아래에 다양한 컬렉션들이 존재한다. 그럼 구체적인 collections framework 클래스들을 살펴보자.

    방금 사용했던 ArrayList를 찾아보자. Collection-List에 속해 있다. ArrayList는 List라는 성격으로 분류되고 있는 것이다. List는 인터페이스이다. 그리고 List 하위의 클래스들은 모두 List 인터페이스를 구현하기 때문에 모두 같은 API를 가지고 있다. 클래스의 취지에 따라서 구현방법과 동작방법은 다르지만 공통의 조작방법을 가지고 있는 거이다. 익숙한 ArrayList를 바탕으로 나머지 컬렉션들의 성격을 파악해보자.

    3. List와 Set의 차이점

    List와 Set의 차이점은 List는 중복을 허용하고, Set은 허용하지 않는다. 

    둘의 차이를 코드로 보자.

    HashSet<Integer> A = new HashSet<Integer>();
    A.add(1);
    A.add(2);
    A.add(2);
    A.add(2);
    A.add(3);
    
    ArrayList<Integer> AA = new ArrayList<Integer>();
    AA.add(1);
    AA.add(2);
    AA.add(2);
    AA.add(2);
    AA.add(3);

    이렇게 된 경우 A 는 

    1

    2

    3

    이렇게 출력이 되지만 AA는

    1

    2

    2

    2

    3

    이렇게 출력이 된다. HashSet은 저장된 입력값 중 중복된 값은 빼고 고유한 값들이 출력(저장된 것들이 모두 고유하다)되고, ArrayList는 입력한 모든 값이 저장이 되는 모습이다.

    4. Set이란?

    Set은 한국어로 집합이라는 뜻이다. 여기서는 집합이란 수학의 집합과 같은 의미이다. 수학에서의 집합도 순서가 없고, 중복되지 않는 특성이 있다는 것이 기억날 것이다. 수학에서 집합은 교집합, 차집합, 합집합과 같은 연산을 할 수 있었다. Set도 마찬가지이다.

    HashSet<Integer> A = new HashSet<Integer>();
    A.add(1);
    A.add(2);
    A.add(3);
    
    HashSet<Integer> B = new HashSet<Integer>();
    B.add(3);
    B.add(4);
    B.add(5);
    
    HashSet<Integer> C = new HashSet<Integer>();
    C.add(1);
    C.add(2);
    
    System.out.println(A.containsAll(B));//false
    System.out.println(A.containsAll(C));//true

    containsAll() : 현재 컬렉션이 다른 컬렉션의 모든 요소를 포함하고 있는지 확인하는 메서드

     

    여기서 containsAll()이라는 것은 위 코드로 설명을 하자면,

     

    A.containsAll(B) : B 안에 있는 것들이 A 안에 있는 것들에 모두 포함되지 않으므로 false이다.

    A.containsAll(C) : C 안에 있는 것들이 A 안에 있는 것들에 모두 포함되므로 true이다.

    합집합(union)

    A.addAll(B);

     

    교집합(inter)

    A.retainAll(B);

    차집합(difference)

    A.removeAll(B);

     

    마지막으로 정리하면

     

    List : 중복 상관없이 모두 저장되고, 순서대로 저장이 된다.

    Set : 중복을 제거하고 고유한 값들만 저장되며, 순서가 없다.

    5. Collection Framework

    출처 :&nbsp;https://dzone.com/articles/an-introduction-to-the-java-collections-framework

    데이터를 처리하는 방식을 구조화하여 설계해 놓은 것을 Collection Framework라고 한다. 자바의 collection framework의 구조는 위 다이어그램을 참조하면 된다.

    6. Iterator

    Iterator를 우리 말로 번역하면 "반복자"로, 객체 지향 프로그래밍에서 배열과 같은 여러 개의 데이터의 집합으로 이루어진 자료구조를 순회하는 객체를 의미한다.

     

    자바의 Iterator 인터페이스는 collection framework에 저장된 요소들을 순회하여 읽어오는데 사용되는데, 어떤 collection framework라도 읽어볼 수 있는 표준화된 방법을 제공한다.

    Iterator 관련 메서드

    1. hasNext()

     - 다음 요소가 존재하는지 혹은 그렇지 않은지 true/false로 리턴한다. true이면 다음 요소가 있다는 것이고, false이면 현재 요소가 마지막이라는 뜻이다.

    2. next()

     - 다음 요소를 가져온다.

    3. remove()

     - next()로 호출된 요소를 제거한다.

    예시 코드

    public class SetDemo {
        public static void main(String[] args) {
            //Hashset 생성
            ArrayList<String> A = new ArrayList<String>();
            A.add("java");
            A.add("python");
            A.add("c++");
            //Iterator 생성
            Iterator<String> iterator = A.iterator();
    
            //hasNext()와 next()를 사용해서 순회
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
    
            //Iterator를 사용해서 요소 제거
            iterator = A.iterator(); // 새로운 iterator를 얻어야 함
            while (iterator.hasNext()) {
                String element = iterator.next();
                if (element.equals("python")) {
                    iterator.remove(); //해당하는 요소 제거
                }
            }
            //제거후 리스트 출력
            System.out.println("제거후 출력");
            for (String string : A) {
                System.out.println(string);
            }
        }
    }

    7. Map의 기본 사용법 1

    보통 Map 인터페이스의 경우 HashMap<K, V>을 제일 많이 사용한다. Key : Value를 묶어 하나의 Entry형식으로 저장한다.

    HashMap<String, Integer> a = new HashMap<String, Integer>();
    a.put("one", 1);
    a.put("two", 2);
    a.put("three", 3);
    a.put("four", 4);
    System.out.println(a.get("one"));
    System.out.println(a.get("two"));
    System.out.println(a.get("three"));

    Set과 List와 다르게 Map은 key : value 형식으로 들어가므로 key과 value에 들어갈 타입을 지정해주어야 한다.

    Map에선 put을 사용해서 key, value형식으로 데이터를 저장한다. 

    나는 key는 String, value는 Integer로 지정해주었다.

     

    그리고 key의 경우 값을 저장하고 가져오기 위한 유일한 열쇠이며, value의 경우 key에 종속된 데이터이다.

    key의 경우 중복을 허용하지 않으며 value의 경우 중복을 허용한다.

     

    Map 활용

    put

    // 1. <String, String>
    HashMap<String, String> map1 = new HashMap<String, String>();
    map1.put("watch", "시계");
    map1.put("whale", "고래");
    map1.put("blog", "블로그");
    
    // 2. <String, Integer>
    HashMap<String, Integer> map2 = new HashMap<String, Integer>();
    map2.put("one", 1);
    map2.put("two", 2);
    map2.put("three", 3);
    
    // 3. <String, List<String>>
    HashMap<String, ArrayList<String>> map3 = new HashMap<String, ArrayList<String>>();
    ArrayList<String> numList = new ArrayList<>();
    numList.add("one");
    numList.add("two");
    numList.add("three");
    
    map3.put("number", numList);

    get

    map3.put("number", numList);
    
    numList = map3.get("number");
    System.out.println("numList = " + numList);

    get()메서드를 통해서 number가 key인 value를 찾는다.

    그 후 해당 변수를 출력해보면 원하는 결과가 나온다.

    containsKey

    // containsKey 메소드는 해당 key가 있으면 true, 없으면 false를 리턴한다.
    System.out.println(map1.containsKey("watch"));

    remove

    // remove 메소드는 해당 key값에 해당하는 아이템을 삭제한 후 해당 key의 value값을 리턴한다.
    System.out.println(map1.remove("wahch"));

    예제1

    HashMap<String, String> map = new HashMap<String, String>();
    map.put("watch", "몰라");
    map.put("whale", "몰라");
    map.put("blog", "몰라");
    map.put("apple", "몰라");
    
    map.put("watch", "몰라");
    map.put("whale", "몰라");
    map.put("apple", "몰라");
    
    for (String key : map.keySet()) {
        System.out.println("key : " + key + ", value : " + map.get(key));
    }

     

    실행결과

    key : apple, value : 몰라
    key : whale, value : 몰라
    key : watch, value : 몰라
    key : blog, value : 몰라

     

    알아서 key값이 중복 되면 중복 데이터가 들어가는게 아니라 key에 해당하는 value값이 바뀐다.

    'JAVA' 카테고리의 다른 글

    JAVA - 영속성 관리 - 내부 동작 방식  (1) 2024.01.30
    Java - 예외 처리(Exception Handling)  (0) 2024.01.16
    JAVA - 다형성과 설계  (0) 2024.01.13
    JAVA - 다형성2  (0) 2024.01.11
    JAVA - 다형성1  (1) 2024.01.09
Designed by Tistory.