[TIL] (230824) ArrayList에서 집함함수 사용이 가능한 이유( addAll, retainAll, removeAll)

Noh Jihyeon·2023년 8월 24일
0

TIL

목록 보기
10/49
post-thumbnail

자바 컬렉션 중 List, Set, Map에 대해서 간단한 정의를 내리고 연습문제를 풀어보았다(*자바의 정석 기준)
ArrayList로 주어진 두 개의 객체의 합집합, 차집합, 교집합을 구하는 것이었는데 List와 Set 두 가지 형식으로 풀어보았다.


🔸문제점


집합함수는 Set의 정의를 배울 때 나왔었다. 배운 대로 풀어보려고 했으나 문제에서 주어진건 ArrayList로 구현된 객체였다.
import java.util.*;
class Exercise11_1 {
public static void main(String[] args) {
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();
ArrayList kyo = new ArrayList(); // 교집합
ArrayList cha = new ArrayList(); // 차집합
ArrayList hap = new ArrayList(); // 합집합
list1.add(1);
list1.add(2);
list1.add(3);
list1.add(4);
list2.add(3);
list2.add(4);
list2.add(5);
list2.add(6);
/*
(1) . 알맞은 코드를 넣어 완성하시오
*/
System.out.println("list1="+list1);
System.out.println("list2="+list2);
System.out.println("kyo="+kyo);
System.out.println("cha="+cha);
System.out.println("hap="+hap);
  }
}

ArrayList에서는 따로 정의하지 않았기 때문에 혹시나 싶어서 ArrayList에서 정의된 집합메서드가 있는지 확인해 봤으나


ArrayList는 순서가 중요하거나 중복을 허용해야 할 때 사용됩니다. 
집합 함수를 사용하려면 Set이나 HashSet, TreeSet 등을 사용하는 것이 좋습니다.
ArrayList를 Set처럼 활용하려면 중복을 제거한 후 집합 함수를 적용하거나, 
직접 집합 함수를 구현해야 합니다.

이런 답변을 받았다.

Set으로 형변환을 진행해야 되는지 고민되었고 간단한 연산에 형변환까지는 사용되지 않을 것이라고 생각되어 어떤 식으로 풀어나갈지 고민에 빠졌다.


🔸시도해본 것들

1) 구현할 수 있는 Set으로 먼저 실행해 보기

  • 내가 생각하는 Set의 코드로 집합함수가 정상적으로 사용되는 건지 먼저 확인해 봤다.



✅ Set으로 집합구현하기


package com.jungsuk3.chap11;

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

/**
 * [11-1] 다음은 정수집합 1,2,3,4와 3,4,5,6의 교집합, 차집합, 합집합을 구하는 코드이다
 * 코드를 완성하여 실행결과와 같은 결과를 출력하시오 . .
 * [Hint] ArrayList addAll(), removeAll(), retainAll() . 클래스의 을 사용하라
 */

public class Ex11_1_2 {
    public static void main(String[] args) {
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> set2 = new HashSet<>();

        Set<Integer>  kyo = new HashSet<>(); // 교집합
        Set<Integer>  cha = new HashSet<>(); // 차집합
        Set<Integer>  hap = new HashSet<>(); // 합집합
        set1.add(1);
        set1.add(2);
        set1.add(3);
        set1.add(4);

        set2.add(3);
        set2.add(4);
        set2.add(5);
        set2.add(6);

//(1) . 알맞은 코드를 넣어 완성하시오
        kyo.addAll(set1);
        kyo.retainAll(set2);

        cha.addAll(set1);
        cha.removeAll(set2);

        hap.addAll(set1);
        hap.addAll(set2);

        System.out.println("list1="+set1);
        System.out.println("list2="+set2);
        System.out.println("kyo="+kyo);
        System.out.println("cha="+cha);
        System.out.println("hap="+hap);
    }
}


일단 문제에서 주어진 ArrayList 말고 Set으로 구현했을 때 원하는 값이 정상적으로 나왔다.

이제 문제가 요구한 ArrayList로 구현하는 방법을 알아봐야 했다.

구글링으로 "ArrayList 객체의 합집합 사용방법"으로 검색하니 새로운 게시글이 나왔고

위에 Set으로 구현한 것과 동일한 코드를 사용하는 것을 발견했다.


이게 어떻게 된 걸까?


⏩ 답은 List 인터페이스에 있었다.


ArrayList는 List인터페이스를 상속하는데 집합함수가 인터페이스에 정의됐기 때문에 ArrayList도 해당 메서드를 사용할 수 있었던 것이다.


🔸해결

집합함수를 Set과 동일하게 사용할 수 있다는 것을 확인한 후 아래와 같이 코드를 구현했다.


✅ ArrayList으로 구현완료


package com.jungsuk3.chap11;
import java.util.*;
/**
 * [11-1] 다음은 정수집합 1,2,3,4와 3,4,5,6의 교집합, 차집합, 합집합을 구하는 코드이다
 * 코드를 완성하여 실행결과와 같은 결과를 출력하시오 . .
 * [Hint] ArrayList addAll(), removeAll(), retainAll() . 클래스의 을 사용하라
 */

public class Ex11_1  {
    public static void main(String[] args) {
        ArrayList list1 = new ArrayList();
        ArrayList list2 = new ArrayList();
        ArrayList kyo = new ArrayList(); // 교집합
        ArrayList cha = new ArrayList(); // 차집합
        ArrayList hap = new ArrayList(); // 합집합
        list1.add(1);
        list1.add(2);
        list1.add(3);
        list1.add(4);

        list2.add(3);
        list2.add(4);
        list2.add(5);
        list2.add(6);

//(1) . 알맞은 코드를 넣어 완성하시오
        kyo.addAll(list1);
        kyo.retainAll(list2);

        cha.addAll(list1);
        cha.removeAll(list2);

        hap.addAll(list1);
        hap.addAll(list2);

        System.out.println("list1="+list1);
        System.out.println("list2="+list2);
        System.out.println("kyo="+kyo);
        System.out.println("cha="+cha);
        System.out.println("hap="+hap);
    }
}



🔸알게 된 점

ArrayList는 List인터페이스를 상속받아서 사용하기 때문에 원하는 메서드의 존재여부를 확인하기 위해서는 List인터페이스의 상속까지 고려해야 한다.

또한 사용하려는 객체타입(ArrayList)이 어떤 상속관계를 가지는지(List인터페이스) 파악해 보면 내가 사용하려는 타입이 어떤 기능을 가지는지 좀 더 명확하게 이해할 수 있을 것 같다.

집합함수를 어떻게 사용하는지 알 수 있는 시간이었다.

profile
꼭꼭 씹어서 소화시키는 맛있는 코딩

0개의 댓글