Java/Data Structure(자료구조)

Set 인터페이스

개발자공부 2024. 5. 24. 16:14

Java에서 Set 인터페이스는 java.util 패키지의 일부이다. 중복을 허용하지 않는 유일한 요소들을 저장하는데 사용된다. 이 인터페이스는 컬렉션 프레임워크의 일부이며, 순서에 의존하지 데이터 집합을 관리하기 위해 설계되었다.

 

Set 주요 특징

중복 허용 불가 : 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();

반환값 : 세트가 비어 있으면 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.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 < set1.size(); i++) {
			// 횟수 만큼 반복은 한다. 
			// set1[i] ==> set 계열은 인덱스 개념이 없다. 
		}
		
		// for 활용 
		for (Integer mI : set1) {
			System.out.println("요소 값 추출 : " + mI);
		}
		
		//		while(set1.size() < 10) {
		//		// set에 어떻게 접근하지??? 
		//		set1.get()
		//	}
		// 반복자를 활용해서 요소 순회를 할 수 있다. 
		
		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());
			whileCount++;
		}
		
		System.out.println(lottoNumbers);
		System.out.println("반복 횟수 : " + whileCount);

	} // 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 

}

 

풀이

// 시스템 실행 
public void run() {
	// 동작 - 스캐너 활용 
	// 실행 흐름 만들기 --> while , if 
	// 결과 -> 정상 유저 등록 
	//      -> 이미 등록된 사용자 입니다. 
	Scanner scanner = new Scanner(System.in);
	while (true) {
		System.out.println("사용자 아이디를 입력 하세요");
		String input = scanner.nextLine(); // String 값 입력 받기 
		if("exit".equals(input)) {
			System.out.println("시스템을 종료 합니다.");
			break; // while 종료 
		}
		boolean isRegistered = registerUserID(input);
		if(isRegistered) {
			System.out.println("새로운 사용자가 등록 되었습니다" + input);
		} else {
			System.out.println("이미 등록된 사용자 입니다" + input);
		}
	}
	scanner.close();
	 
}