Set이란? (집합, 주머니)
- 기본적으로 순서를 유지하지 않음
(index 없음! → get() 메서드가 없음)
- 중복 데이터 저장 X (같은 객체가 들어오면 덮어쓰기)
1) int size()
Set에 저장된 객체(참조 변수)의 수 반환
2) boolean remove(E e)
Set에 저장된 객체 중 같은 객체를 찾아 제거
제거 성공 : true / 없으면 : false
3) boolean contains(E e)
같은 요소가 있으면 true, 없으면 false
4) boolean isempty()
비어있으면 true, 아니면 false
5) void clear()
저장된 객체를 모두 제거
<Set 인터페이스의 자식 클래스>
1. HashSet (대표) : 처리 속도가 빠른 Set
2. LinkedHashSet : 순서를 유지하는 Set
3. TreeSet : 자동 정렬되는 Set
<Set에 저장된 객체를 꺼내는 방법>
1) Iterator(반복자) 이용
컬렉션에 저장된 요소를 하나씩 순차 접근하는 기능을 제공하는 인터페이스
- hasNext() : 다음 순차 접근할 요소가 있으면 true
- next() : 다음 요소가 있으면 꺼내와서 반환
→ 화살표(커서)를 한 칸 움직임
2) List로 변환
3) 향상된 for문 이용
#예제
[service]
public void test1() {
// HashSet 객체 생성
Set<String> set = new HashSet<String>();
// 1. boolean add(E e) : 요소 추가
set.add("네이버");
set.add("카카오");
set.add("라인");
set.add("쿠팡");
set.add("배달의 민족");
set.add("토스");
set.add("직방");
set.add("야놀자");
System.out.println(set); // set.toString()
//-> HashSet 순서 유지 X
// 중복 데이터 추가 후 결과 확인
set.add("배달의 민족");
set.add("배달의 민족");
set.add("배달의 민족");
set.add("배달의 민족");
set.add("배달의 민족");
System.out.println(set); // 중복 허용 X
// null (참조하는 객체가 없음) 중복 안됨을 확인
set.add(null);
set.add(null);
set.add(null);
System.out.println(set);
// 2. int size() : Set에 저장된 객체(참조 변수)의 수 반환
System.out.println("Set.size() : " + set.size());
// 3. boolean remove(E e) :
// Set에 저장된 객체 중같은 객체를 찾아 제거
// 제거 성공 : true / 없으면 false
System.out.println("쿠팡 제거 : " + set.remove("쿠팡"));
System.out.println("삼성 : " + set.remove("삼성"));
System.out.println(set);
// 4. boolean contains(E e)
// 같은 요소가 있으면 true, 없으면 false
System.out.println("네이버 있음 ? " + set.contains("네이버"));
System.out.println("KT 있음 ? " + set.contains("KT"));
// 5. boolean isempty()
// 비어있으면 true, 아니면 false
// 6. void clear()
// 저장딘 객체를 모두 제거
System.out.println("비어있음? : " + set.isEmpty());
set.clear();
System.out.println("모두 제거 완료");
System.out.println("비어있음? : " + set.isEmpty());
// Set
// - index가 없음
// -> index를 활용하는 메서드가 없다
// -> 원하는 요소 하나만을 꺼낼 수 없다!
// - 순서 유지 X
// -> 중복 허용 X
}
[run]
package set.Run;
import set.service.SetService;
public class SetRun {
public static void main(String[] args) {
SetService service = new SetService();
service.test1();
}
}
#결과

#예제 1. Iterator(반복자) 이용
[service]
public void test2() {
Set<String> snackSet = new HashSet<String>();
snackSet.add("포카칩");
snackSet.add("새우깡");
snackSet.add("홈런볼");
snackSet.add("꼬깔콘");
snackSet.add("프링글스");
snackSet.add("빈츠");
snackSet.add("쿠크다스");
/* 1. Iterator(반복자) 이용*/
// - 컬렉션에 저장된 요소를
// 하나 씩 순차 접근하는 기능을 제공하는 인터페이스
// hasNext() : 다음 순차 접근할 요소가 있으면 true
// next() : 다음 요소가 있으면 꺼내와서 반환
// -> 화살표(커서)를 한 칸 움직임
Iterator<String> it = snackSet.iterator();
System.out.println("[Iterator]");
while(it.hasNext()) {
String snack = it.next();
System.out.println(snack);
}
/* 2. List로 변환*/
// List 객체 생성자 매개변수로 Set을 추가
List<String> snackList = new ArrayList<String>(snackSet);
System.out.println("--------------------------------------");
for (int i = 0 ; i< snackList.size() ; i++) {
System.out.println(snackList.get(i));
}
/*향상된 for문*/
System.out.println("---------------------------------");
System.out.println("[향상된 for문]");
for(String snack : snackSet) {
System.out.println(snack);
}
}
#결과

#예제 2. List로 변환 / 3. 향상된 for문
[service]
/* 2. List로 변환*/
// List 객체 생성자 매개변수로 Set을 추가
List<String> snackList = new ArrayList<String>(snackSet);
System.out.println("--------------------------------------");
for (int i = 0 ; i< snackList.size() ; i++) {
System.out.println(snackList.get(i));
}
/*3. 향상된 for문*/
System.out.println("---------------------------------");
System.out.println("[향상된 for문]");
for(String snack : snackSet) {
System.out.println(snack);
}
#결과

#예제 Hash가 포함된 컬렉션을 이용하는 방법
[service]
/**
* Hash가 포함된 컬렉션을 이용하는 방법
* ex) HashSet, LinkedHashSet, HashMap, HashTable 등
*
* 1. Object.equals() 오버라이딩 하기
*
* 2. Object.hashCode() 오버라이딩 하기
*
* *** 1,2 둘다 수행해야만 함! ***
*
* -> Java는 동일한 객체임을 비교하는데 있고
* 동등 / 동일 모두 true여야지만 동일한 객체로 인식한다
*/
public void test3() {
Person p1 = new Person("홍길동", 25, '남');
Person p2 = new Person("홍길순", 22, '여');
Person p3 = new Person("짱구", 5, '남');
// 중복된 필드를 가진 Person 객체 2개 생성
Person p4 = new Person("유리", 5, '여');
Person p5 = new Person("유리", 5, '여');
// HashSet에 p1 ~ p5 추가
Set<Person> set = new HashSet<Person>();
set.add(p1);
set.add(p2);
set.add(p3);
set.add(p4);
set.add(p5);
// 향상된 for문으로 하나씩 출력
// [key point!]
// - p4/p5가 중복된 데이터로 인식되서
// 한 번만 출력되는지 확인
// 확인 1 (equals, hachCode 오버라이딩 X)
// -> 유리가 중복되서 출력됨
for(Person p : set) {
System.out.println(p);
}
System.out.println("-------------------------------------");
// equals 오버라이딩 확인 == 동등 비교 (동명이인 개념)
System.out.println(p4.equals(p5)); // true
System.out.println(p4.equals(p1)); // false
// hashCode 오버라이딩 확인
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
System.out.println(p3.hashCode());
System.out.println(p4.hashCode());
System.out.println(p5.hashCode());
}
#결과

#예제 TreeSet
[service]
public void test4() {
// 로또 번호 생성기
Random random = new Random();
Set<Integer> lotto = new TreeSet<Integer>();
while(lotto.size() < 6) {
lotto.add(random.nextInt(45) + 1 ); // 1 ~ 45 난수를 TreeSet에 추가
}
System.out.println(lotto);
}
#결과

#예제
| 로또 번호 생성기 - 금액을 천원 단위로 입력 받아 천원당 1회씩 번호를 생성해서 List에 저장한 후 생성 종료되는 시점에 한 번에 출력 단, 5회 출력 시 마다 구분선 추가 금액 입력 : 6000 1회 : [1, 2, 3, 4, 5, 6] 2회 : [12, 13, 14, 21, 22, 34] 3회 : [17, 33, 35, 41, 42, 45] 4회 : [17, 33, 35, 41, 42, 45] 5회 : [17, 33, 35, 41, 42, 45] -------------------------------- 6회 : [17, 33, 35, 41, 42, 45] |
public void lottoNumberGenerator() {
Scanner sc = new Scanner(System.in);
// 생성된 로또 번호(1회)를 저장할 List 생성
List<Set<Integer>> lottoList
= new ArrayList<Set<Integer>>();
System.out.println("금액 입력 : ");
int price = sc.nextInt();
Random random = new Random();
// 입력된 금액 천원당 1회 반복
for(int i = 0 ; i < price/1000 ;i++) {
// 1회치에 해당되는 로또 번호 생성
Set<Integer>lotto = new TreeSet<Integer>();
while(lotto.size()<6) {
lotto.add(random.nextInt(45) + 1);
}
// lottoList에 추가
lottoList.add(lotto );
}
// 제시된 형태에 맞게 출력
for(int i = 0 ; i<lottoList.size(); i++) {
// 6/11/16/... 출력 전에
// if(i%5==0) {
// System.out.println("------------------------------");
// }
System.out.printf("%d회 : %s \n" , i+1, lottoList.get(i).toString());
// 5/10/15/... 출력한 후에
if(i+1 %5 == 0) {
System.out.println("---------------------");
}
}
}'BackEnd > Java' 카테고리의 다른 글
| [Java]컬렉션(collection) String 불변성 (0) | 2024.08.12 |
|---|---|
| [Java]컬렉션(collection) Map (0) | 2024.08.12 |
| [Java]컬렉션(Collection) 참조 변수를 부모 타입으로 작성하는 이유 (0) | 2024.08.12 |
| [Java]컬렉션(collection) Wrapper (0) | 2024.08.12 |
| [Java]컬렉션 (0) | 2024.08.12 |