Set 인터페이스란?
Java에서 set 인터페이스는 java.util 패키지의 일부로, 중복을 허용하지 않는 유일한 요소들을 저장하는데 사용된다. 이 인터페이스는 컬렉션 프레임워크의 일부이며, 순서에 의존하지 않는 데이터 집합을 관리하기 위해 설계되었다.
주요 특징
중복 허용 불가 : set 에 같은 요소를 추가하려고 하면 추가가 되지 않는다. 즉, 모든 요소가 고유해야 하며 이미 존재하는 요소를 추가할 경우 무시된다.
순서를 보장 하지 않음 : set 은 요소들의 순소를 유지하지 않는다. 요소들이 내부적으로 어떻게 저장되고 관리되는지 set 을 구현하는 클래스에 따라 다르다. 따라서 요소들이 추가된 순서와 set 에서 요소를 순회할 때의 순서가 다를 수 있다.
값의 유일성 : set 은 각 요소의 유일성을 보장합니다. 이는 주로 요소의 equals() 와 hashCode() 메서드를 사용하여 결정된다. 두 객체가 같다고 판단되면, 둘 중 하나만 set에 저장된다.
사용 예시
아이디 목록 관리 : 사용자 아이디는 유일해야 하므로 set 을 사용하여 중복 없이 관리 할 수 있다.
주민등록번호 : 각 사람의 주민등록번호는 고유한 값이므로, 이를 set에 저장하여 중복 등록을 방지할 수 있다.
직원 번호 : 회사에서 각 직원에게 부여한 고유한 사번을 set 을 이용해 관리할 수 있다.
구현 클래스
Collection
|
└── Set
├── HashSet
├── LinkedHashSet
└── TreeSet
├── ...
주요 메서드
set 인터페이스는 Java Collection Framework 내에서 중복을 허용하지 않는 유니크한 아이템들을 저장하는데 사용된다.
1. add(E e) : 지정된 요소를 세트에 추가한다. 요소가 세트에 이미 존재하는 경우는 추가되지 않는다.
- boolean add(E e) ;
- 반환값 : 요소가 세트에 성공적으로 추가되면 true, 이미 존재하는 경우는 false를 반환한다.
2. remove(Object o) : 지정된 요소를 세트에서 제거한다.
- boolean remove(Object o);
- 반환값 : 요소가 세트에서 성공적으로 제거되면 true, 그렇지 않으면 false를 반환한다.
3. contains(Object o) : 세트가 지정된 요소를 포함하고 있는지 여부를 확인한다.
- boolean contains(Object o);
- 반환값 : 요소가 세트에 존재하면 true, 그렇지 않으면 false를 반환한다.
4. size(): 세트에 저장된 요소의 수를 반환한다.
- int size();
- 반환값: 세트에 있는 요소의 총 수를 반환한다.
5. isEmpty(): 세트가 비어 있는지 여부를 확인한다.
- boolean isEmpty();
- 반환값 : set가 비어있으면 true, 하나 이상의 요소가 있으면 false를 반환한다.
6. clear() : 세트에서 모든 요소를 제거한다.
- void clear();
- 이 메서드는 세트를 비워서 요소가 없는 상태로 만든다.
7. iterator() : 세트의 요소에 접근할 수 있는 반복자 (iterator) 를 반환한다.
- Iterator<E> iterator();
- 이 반복자를 사용하여 세트의 요소를 순차적으로 접근할 수 있다.
package structure.ch06;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class MySetTest {
public static void main(String[] args) {
// 계층 구조 확인
// 업 캐스팅 상태 - 컴파일 시점에는 Set 계열에 타입은 멤버들만 확인 가능
Set<Integer> mSet = new HashSet<Integer>();
HashSet<Integer> set1 = new HashSet<Integer>();
// 요소 추가 방법
set1.add(1);
set1.add(1); // 중복 값 발생
set1.add(2);
set1.add(3);
set1.add(3); // 중복 값 발생
System.out.println(set1.size());
// 요소 제거 (요소 -> 값을 넣음)
set1.remove(3);
System.out.println(set1);
// set 계열은 순서를 보장하지 않음
for (int i = 0; i < args.length; i++) {
// 횟수 만큼 반복은 한다.
// String string = args[i];
// set1[i] -> set 계열은 index 개념이 없다.
}
// for 활용
for (Integer mI : set1) {
System.out.println("요소 값 추출 : " + mI);
}
// while(set1.size() < 10) {
// // set에 어떻게 접근하지?
// set1.
// }
System.out.println("----------------------------------------");
// 반복자를 활용해서 요소 순회를 할 수 있다.
Iterator<Integer> iter = set1.iterator();
while(iter.hasNext()) {
System.out.println("값 확인 : " + iter.next());
}
}// end of main
}// end of class
package structure.ch06;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;
import java.util.Set;
public class MySetTest {
public static void main(String[] args) {
// 계층 구조 확인
// 업 캐스팅 상태 - 컴파일 시점에는 Set 계열에 타입은 멤버들만 확인 가능
Set<Integer> mSet = new HashSet<Integer>();
HashSet<Integer> set1 = new HashSet<Integer>();
// 요소 추가 방법
set1.add(1);
set1.add(1); // 중복 값 발생
set1.add(2);
set1.add(3);
set1.add(3); // 중복 값 발생
System.out.println(set1.size());
// 요소 제거 (요소 -> 값을 넣음)
set1.remove(3);
System.out.println(set1);
// set 계열은 순서를 보장하지 않음
for (int i = 0; i < args.length; i++) {
// 횟수 만큼 반복은 한다.
// String string = args[i];
// set1[i] -> set 계열은 index 개념이 없다.
}
// for 활용
for (Integer mI : set1) {
System.out.println("요소 값 추출 : " + mI);
}
// while(set1.size() < 10) {
// // set에 어떻게 접근하지?
// set1.
// }
System.out.println("----------------------------------------");
// 반복자를 활용해서 요소 순회를 할 수 있다.
Iterator<Integer> iter = set1.iterator();
while (iter.hasNext()) {
System.out.println("값 확인 : " + iter.next());
}
System.out.println("----------------------------------------");
// getRandomNumber() 메서드가 호출되면 데이터를 관리하고자 한다.
HashSet<Integer> lottoNumbers = new HashSet<Integer>();
int whileCount = 0;
while(lottoNumbers.size() < 6) {
lottoNumbers.add(getRandomNumber());
}
System.out.println(lottoNumbers);
System.out.println("반복 횟수 : " + whileCount);
// 반복된 숫자가 나올 수도 있음
// getRandomNumber();
// getRandomNumber();
// getRandomNumber();
// getRandomNumber();
// getRandomNumber();
// getRandomNumber();
}// end of main
public static int getRandomNumber() {
Random random = new Random();
return random.nextInt(45) + 1;
}
}// end of class
도전문제 : 고유 사용자 ID 관리 시스템
웹 사이트에 접속하는 사용자의 ID를 관리하는 시스템을 개발한다. 사용자 ID는 고유해야하며 중복을 허용하지 않는다. 시스템은 사용자가 로그인할 때 마다 ID를 체크하고, 새로운 사용자 ID를 등록할 때 중복을 방지한다.
스캐너로 입력 받고 자료구조에 ID를 저장하는 간단한 프로그램 작성(기본코드)
package structure.ch06;
import java.util.HashSet;
public class UniqueUserIDSystem {
private HashSet<String> userIDs;
public UniqueUserIDSystem() {
this.userIDs = new HashSet<String>();
}
// 사용자 ID 등록 기능
// 정상적으로 들어가면 true
// 중복 발생하면 false
public boolean registerUserID(String userId) {
return userIDs.add(userId);
}
// 시스템 실행
public void run() {
// 동작 - 스캐너 활용
// 실행 흐름 만들기 --> while , if
// 결과 -> 정상 유저 등록
// -> 이미 등록된 사용자 입니다.
}
// 코드 테스트
public static void main(String[] args) {
UniqueUserIDSystem system = new UniqueUserIDSystem();
system.run();
}// end of main
}// end of class
풀이1
package structure.ch06;
import java.util.HashSet;
import java.util.Scanner;
public class UniqueUserIDSystem {
private HashSet<String> UserIDs;
public UniqueUserIDSystem() {
this.UserIDs = new HashSet<String>();
}
public boolean registerUserID(String userId) {
return UserIDs.add(userId);
}
// 시스템 실행
public void run() {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("아이디를 입력해주세요.");
String scID = scanner.nextLine();
boolean flag = registerUserID(scID);
if (flag) {
System.out.println("아이디가 정상 등록되었습니다.");
System.out.println("프로그램이 종료됩니다.");
return;
} else {
System.out.println("등록된 아이디입니다. 다시 입력하세요.");
}
}
}
// 코드 테스트
public static void main(String[] args) {
UniqueUserIDSystem system = new UniqueUserIDSystem();
system.run();
}// end of main
}// end of class
풀이2
package structure.ch06;
import java.util.HashSet;
import java.util.Scanner;
public class REUniqueUserIDSystem {
private HashSet<String> UserIDs;
public REUniqueUserIDSystem() {
this.UserIDs = new HashSet<String>();
}
public boolean registerUserID(String userId) {
return UserIDs.add(userId);
}
// 시스템 실행
public void run() {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("아이디를 입력해주세요.");
String scID = scanner.nextLine();
boolean flag = registerUserID(scID);
if (flag) {
System.out.println("새로운 아이디가 등록되었습니다." + scID);
System.out.println("시스템을 종료합니다.");
break; // while 종료
} else {
System.out.println("이미 등록된 사용자입니다." + scID);
}
} // while end
}// run end
// 코드 테스트
public static void main(String[] args) {
REUniqueUserIDSystem system = new REUniqueUserIDSystem();
system.run();
}// end of main
}// end of class
'Java' 카테고리의 다른 글
Thread에 wait와 notify ( 프로듀서 - 컨슈머패턴 ) (0) | 2024.05.13 |
---|---|
Map 인터페이스 (0) | 2024.05.13 |
List 인터페이스 (0) | 2024.05.09 |
컬렉션 프레임워크 (Collection Framework) (0) | 2024.05.09 |
LinkedList 구현하기 (0) | 2024.05.08 |