<배운 내용 복습>
https://imcodiiing.tistory.com/280
자바 컬렉션 중 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으로 형변환을 진행해야 되는지 고민되었고 간단한 연산에 형변환까지는 사용되지 않을 것이라고 생각되어 어떤 식으로 풀어나갈지 고민에 빠졌다.
✅ 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도 해당 메서드를 사용할 수 있었던 것이다.
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인터페이스) 파악해 보면 내가 사용하려는 타입이 어떤 기능을 가지는지 좀 더 명확하게 이해할 수 있을 것 같다.
집합함수를 어떻게 사용하는지 알 수 있는 시간이었다.