package ex_set;
import java.util.*;
public class Ex1 {
public static void main(String[] args) {
/*
* 컬렉션 프레임워크(Collection Framework)
* 1. Set 계열
*
*/
// Set set = new Set(); // 사용 불가!
// HashSet 객체 생성
// HashSet set = new HashSet(); // 일반적인 HashSet 객체 생성 방법
// HashSet -> Set 업캐스팅하여 사용하는 방법
Set set = new HashSet(); // 업캐스팅
// => 대부분의 메서드를 부모 인터페이스인 Set 인터페이스가 보유중이므로
// 업캐스팅 상태에서도 대부분의 기능을 사용하는데 문제가 없음
// Set 객체의 메서드
// boolean isEmpty() : 컬렉션 객체가 비어있는지 판별
System.out.println("Set 객체가 비어있는가? " + set.isEmpty());
// int size() : 컬렉션 객체 내의 요소(데이터) 갯수 리턴
System.out.println("Set 객체에 저장된 요소 갯수 : " + set.size());
// String toString() : 컬렉션 객체 내의 모든 요소를 문자열로 리턴(오버라이딩)
System.out.println("Set 객체의 모든 요소 : " + set.toString());
System.out.println("Set 객체의 모든 요소 : " + set); // toString() 생략 가능
// boolean add(Object e) : 요소 1개(e)를 컬렉션에 추가 후 추가 성공 여부 리턴
// => 파라미터가 Object 타입이므로 모든 데이터타입 추가 가능
// 만약, 제네릭 설정 시 Object -> 제네릭타입으로 변경!
// => 리턴타입이 boolean 이므로 요소 추가 성공 여부 리턴됨(중복데이터 추가 시 false)
System.out.println("Set 객체에 데이터가 추가 되었는가? " + set.add(1));
set.add("TWO");
set.add(3.14);
System.out.println("Set 객체가 비어있는가? " + set.isEmpty());
System.out.println("Set 객체에 저장된 요소 갯수 : " + set.size());
System.out.println("Set 객체의 모든 요소 : " + set);
// => 저장 순서가 유지되지 않으므로 출력되는 데이터의 순서는 다를 수 있다!
System.out.println("실수 3.14 추가가 가능한가? " + set.add(3.14));
System.out.println("문자 '4' 추가가 가능한가? " + set.add('4'));
// boolean contains(Object o) : 특정 요소(o)가 컬렉션 객체에 포함되어 있는지 판별
System.out.println("Set 객체에 실수 3.14가 포함되는가? " + set.contains(3.14));
System.out.println("Set 객체에 정수 3이 포함되는가? " + set.contains(3));
// boolean remove(Object o) : 특정 요소(o)를 컬렉션 객체에서 제거
// => 삭제 성공 시 true, 실패 시 false 리턴
System.out.println("Set 객체 내의 실수 3.14 삭제 : " + set.remove(3.14));
System.out.println("Set 객체 내의 실수 3.14 삭제 : " + set.remove(3.14));
System.out.println("Set 객체의 모든 요소 : " + set);
// Object[] toArray() : 컬렉션 내의 모든 요소를 갖는 배열을 생성하여 리턴
Object[] objArr = set.toArray();
System.out.println(Arrays.toString(objArr));
// boolean addAll(Collection c) : 컬렉션 내의 모든 요소를 다른 컬렉션에 하나꺼번에 추가
// HashSet 객체 생성
Set set2 = new HashSet();
set2.add(9); set2.add(10); set2.add(1);
System.out.println("Set2 객체의 모든 요소 : " + set2);
System.out.println("Set2 객체에 set 객체 모두 추가 : " + set2.addAll(set));
// => 중복된 요소가 존재하지만 중복되지 않는 요소 추가가 가능하므로 true 리턴됨
System.out.println("Set2 객체의 모든 요소 : " + set2);
System.out.println("Set2 객체에 set 객체 모두 추가 : " + set2.addAll(set));
// => 추가할 모든 요소가 이미 존재하므로 추가 불가능하기 때문에 false 리턴됨
// clear() : 컬렉션 내의 모든 요소를 초기화(제거)
set2.clear();
System.out.println("Set2 객체의 모든 요소 : " + set2);
// HashSet 등 컬렉션 객체 생성 시 파라미터로 다른 컬렉션 객체를 전달하면
// 해당 컬렉션 객체의 요소를 갖는 새로운 컬렉션 객체가 생성됨
Set set3 = new HashSet(set);
// => 데이터가 저장된 주소를 공유하는 것이 아닌 실제 요소를 복사하여 전달하므로
// 저장된 요소는 갖지만 주소는 다르게 생성됨
System.out.println("Set3 객체의 모든 요소 : " + set3);
System.out.println("Set 객체의 모든 요소 : " + set);
System.out.println("Set과 Set3 객체는 동일한 주소값을 가지고 있는가? " + (set == set3));
// boolean equals(Collection c) : 컬렉션 요소가 동일한지 판별
System.out.println("Set과 Set3 객체는 동일한 객체인가? " + set.equals(set3));
System.out.println("==================================================");
// TreeSet 객체를 활용하면 같은 타입 데이터가 저장된 Set 객체 정렬 가능
// => 주의! 반드시 같은 타입 데이터만 저장해야한다!
// => 수치데이터는 수치의 크기 순으로 오름차순 정렬되며(0 -> 9)
// 문자 데이터는 문자 코드값의 크기 순으로 오름차순 정렬되므로
// 수치데이터와 문자데이터의 정렬 결과는 다를 수 있다!
Set set4 = new HashSet();
set4.add(100); set4.add(99); set4.add(500);
set4.add(2); set4.add(35); set4.add(999);
System.out.println(set4); // [2, 99, 35, 100, 500, 999] => 비정렬
Set set5 = new TreeSet(set4); // 기존 set4 요소를 그대로 set5 추가(자동 정렬됨)
System.out.println(set5); // [2, 35, 99, 100, 500, 999] => 항상 결과 같음(정렬)
System.out.println("==================================================");
/*
* Set 계열의 모든 요소를 반복문을 통해 출력
* => 인덱스 사용이 불가능하므로 일반 for문을 통해 접근 불가능
* => 대신, 향상된 for문을 통해 저장된 요소를 차례대로 접근 가능
*
* < 기본 문법 >
* for (요소를 꺼내서 저장할 변수 : 컬렉션객체) {}
* => 기본적인 요소의 타입은 Object 타입이므로 저장할 변수를 Object 타입으로 선언
*
*/
for (Object o : set5) {
// Object 타입 변수 o에 Set 객체의 요소가 하나씩 대입됨
System.out.println(o);
}
}
}