컬렉션 프레임워크

List, Set, Map 가운데

지난 List 내용 https://notion6780.tistory.com/64

⭐Set 계열을 알아본다.

주요 특징
1. 중복방지
2. 값의 유일성 보장

 

주요명령어
equals() hashcode()를 사용

 

👍'주머니' 키워드를 기억하면 좋다.

package _colloections;
import java.util.*;
/**
 5.7
 컬렉션프레임워크2
 Set 계열
 */
public class MySetTest {

    //main
    public static void main(String[] args) {

        //계층 구조 확인
        Set<Integer> mTestSet = new HashSet<>(); // 업캐스팅된 상태

        //사용방법
        /*
        해시셋
        HashSet
        중복된 요소를 허용하지 않고
        순서가 없는 자료구조다.
         */
        HashSet<Integer> numberSet = new HashSet<>();

        //요소 추가하기.. add
        numberSet.add(111);
        numberSet.add(111); // 중복값.. 추가되지 않는다.
        numberSet.add(222);
        numberSet.add(333);
        numberSet.add(444);

        System.out.println("추가후 요소크기:" + numberSet.size()); //4개

        //요소 제거하기.. remove
        numberSet.remove(1);
        /*
        1이라는 요소 자체를 삭제
        존재하지 않는 요소를 삭제해도 오류 발생 없다.
         */
        System.out.println("삭제후 요소크기:" + numberSet.size()); //4개
        System.out.println("===== ===== ===== ===== ");
        /*
        자료구조는 반복문과 함께 많이 사용된다.
        하지만 index 번호가 없으므로
        기존의 for 문은 사용할 수 없다.
        for (int i = 0; i < 10 ; i++) {}

        향상된 for문을 활용해야 한다.
        이를 통해 Set 요소를 순회시킬 수 있다.
         */
        for (Integer num : numberSet) {
            System.out.println("num 값:" + num);
        }
        System.out.println("===== ===== ===== ===== ");
        /*
        Set 계열을
        Iterator 타입으로 변환해서 순회시킬 수도 있다.
        다만 Iterator도 인덱스 개념이 없는데...
         */
        Iterator<Integer> iter = numberSet.iterator(); // Set 계열을 Iterator 계열로 형 변환

        while (iter.hasNext()) { // hasNest : 다음 요소가 있으면 true 반환
            System.out.println("값:" + iter.next());
        }
        System.out.println("===== ===== ===== ===== ");

        /*
        Set 계열 자료구조 선언
        정수값만 담을 수 있고 중복 불가
         */
        HashSet<Integer> lottoNumbers = new HashSet<>();
        while (lottoNumbers.size()<6) {
            lottoNumbers.add(getRandomNumber()); //로또함수호출
        }
        System.out.println("무작위로 선택된 로또번호 6개 "+ lottoNumbers.toString());
        System.out.println("===== ===== ===== ===== ");

        /*
        HashSet 데이터 타입을
        ArrayList 객체 생성시..
        즉, 생성자에 인자값을 넣을 수 있도록 설계

        List자료구조에서는 정렬이 편해진다.
         */
        ArrayList<Integer> sortedList = new ArrayList<>(lottoNumbers);

        Collections.sort(sortedList); //정렬하기

        System.out.println("정렬된 로또번호 6개 " + sortedList);
        System.out.println("===== ===== ===== ===== ");

    }//end of main

    //무작위 1부터 45까지 랜덤번호 생성 함수
    public static int getRandomNumber() {
        Random random = new Random();
        return random.nextInt(45) + 1;
    }

}//end of class

 

 

예제 CRUD 구현)

package _colloections;

import java.util.HashSet;
import java.util.Scanner;

/**
 * 5.7
 * 컬렉션프레임워크2
 * Set 계열
 */
public class UniqueUserIDSystem {

    /*
    요구사항
    사용자가 키보드로 입력한 ID 데이터를 다량 저장해야 한다.
    해당 데이터는 고유데이터
    해당 데이터는 메모리상에서 관리한다.
     */

    //member
    private HashSet<String> resiteredIDs;

    //constructor
    public UniqueUserIDSystem() {
        resiteredIDs = new HashSet<>();

        /*
        전체출력 테스트를 위한 샘플데이터 - 추후삭제
         */
        resiteredIDs.add("홍길동");
        resiteredIDs.add("임꺽정");
        resiteredIDs.add("장길산");
    }

    //사용자 ID등록
    public boolean addUserID(String userID) {
        return resiteredIDs.add(userID);
    /*
    저장되면 true 호출
    중복값이면 false 호출
     */
    }//

    /*
    사용자 ID 출력하는 메서드 만들어본다.
    리턴값은 필요없으므로 void
    매개변수 필요한가? No
     */

    public void showAll() {
        /*
        resiteredIDs를 순회해서 콘솔창에 출력하는 기능 필요
        for 구문이나 iterator 활용 가능
         */

        //hashSet 안에 요소가 없다면
        if (resiteredIDs.isEmpty()) {
            System.out.println("🤷‍♂️등록된 ID가 없음");
            return;
            //실행의 제어권 반납해 뒤 코드들이 의미없이 실행되는 것 방지
        }

        for (String id : resiteredIDs) {
            System.out.println("id: " + id);
        }
        System.out.println("총id수: " + resiteredIDs.size());

    }

    //시스템 실행
    public void start() {

        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("사용하고 싶은 ID를 입력하세요. " +
                    "종료하라면 'exit' 입력");

            String input = scanner.nextLine().trim(); // trim() 공백제거

            /*
            빈 입력 처리
            사용자가 키보드에서 값을 넣지 않고 엔터를 치는 경우
            방어코드를 짜본다.
             */
            if (input.isEmpty()) {
                System.out.println("ID를 입력해주세요.");
                continue;
            }

            if ("exit".equals(input)) {
                System.out.println("😎시스템 종료");
                break;
            }

            if ("show".equals(input)) {
                showAll();
            }

            boolean isRestered = addUserID(input);

            if (isRestered) {
                System.out.println("👍새로운 ID 등록");
            } else {
                System.out.println("💀이미 등록된 ID 입니다.");
            }

        }//while
        scanner.close();

    }//start

    //main
    public static void main(String[] args) {

        UniqueUserIDSystem idSystem = new UniqueUserIDSystem();

        idSystem.start();

    }//end of main
}//end of class

+ Recent posts