Java

Set 인터페이스

ryeonng 2024. 5. 21. 17:42

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();
    • 반환값: 세트가 비어 있으면 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); // [1 , 2] ( 요소 3이 제거 됨 )

		// set 계열은 순서를 보장하지 않음
		for (int i = 0; i < set1.size(); i++) {
			// 횟수 만큼 반복은 한다.
			// set1[i] → set 계열은 인덱스 개념이 없어, 사용할 수 없다.
		}

		for (Integer mI : set1) {
			System.out.println("요소 값 추출 : " + mI);
		}

//		while(set1.size() < 10 ) {
//			// set에 어떻게 접근할 수 있는지?
//			set1.get()
//		}

		// 반복자를 활용해서 요소 순회를 할 수 있다.
		
		System.out.println("----------------------");
		Iterator<Integer> iter = set1.iterator(); // set1; → set1.iterator(); 로 형 변환 시켜주어야 함.

		while (iter.hasNext()) {
			System.out.println("값 확인 : " + iter.hasNext());
		}
		
		System.out.println("----------------------");

		// getRandomNumber() 메서드가 호출 되면 데이터를 관리하고자 한다.
		HashSet<Integer> lottoNumbers = new HashSet<Integer>();
		
		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를 등록할 때 중복을 방지한다.

 

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>();
	}
	
	// 사용자 ID 등록 기능
	// 정상적으로 들어가면 true
	// 중복 발생하면 false
	public boolean registerUserID(String userId) {
		return userIDs.add(userId);
	}
	
	// 시스템 실행
	public void run() {
		// 동작 - 스캐너 활용
		// 실행의 흐름 만들기 → while, if
		// 결과 → 정상 유저 등록
		//		→ 이미 등록 된 사용자 입니다. (ID가 존재합니다.)
		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();
	}
	
	// 코드 테스트
	public static void main(String[] args) {
		UniqueUserIDSystem system = new UniqueUserIDSystem();
		system.run();
		
		
	} // end of main
} // end of class

'Java' 카테고리의 다른 글

파일 입력 스트림(바이트 기반)  (0) 2024.05.23
Map 인터페이스  (0) 2024.05.23
List 인터페이스  (0) 2024.05.17
LinkedList 구현  (2) 2024.05.14
큐(Queue) 구현하기  (0) 2024.05.14