컬렉션 (Collection) - 2

DONI·2021년 10월 9일
0

Java

목록 보기
42/46
post-thumbnail

🏹 Set 인터페이스

저장 순서가 유지되지 않으며 중복 객체를 저장할 수 없는 자료구조
중복 데이터 확인을 위해 equals( ) 메서드가 오버라이딩 되어야 하며,
null도 중복을 허용하지 않는다.

  • HashSet 클래스
    해시함수를 이용하여 데이터를 저장하는 Set
    처리 속도가 빨라 빠른 검색이 가능하다.
    동일 객체뿐만 아니라 동등 객체도 중복하여 저장하지 않는다.

        ⭐ HashSet 사용 선행조건
             저장하려는 객체에 반드시 equals( ), hashCode( )
             오버라이딩 되어있어야 한다!

       🌼 해시함수 : 입력된 단어를 지정된 길이의 문자열로 변환하는 함수
       🌼 hashCode( ) : 데이터가 다르면 중복되지 않는 숫자를 만드는 메서드

  • TreeSet 클래스
    이진트리를 구조를 이용해 데이터를 저장하는 Set
    TreeSet의 객체는 저장과 동시에 자동으로 오름차순 정렬이 이루어진다.

🏹 Set 계열 주요 메서드

  • add(E e) : Set의 맨 끝에 객체 추가
    set.add(new Food("닭떡볶이"));

  • iterator( ) : 저장된 객체를 하나씩 가져오는 반복 접근자

  • isEmpty( ) : 컬렉션이 비어있으면 true, 아니면 false 반환

  • size( ) : Set에 저장된 객체 수 반환


🏹 Map 인터페이스

키(key)값(value)으로 구성되어 있는 데이터를 모아둔 객체
key는 중복을 허용하지 않으며 순서가 유지되지 않는다. (= Set)
value는 key에 의해 서로 구분되기 때문에 중복이 가능하다. (= List)

  • HashMap 클래스가장 기초가 되는 Map 클래스
    HashSet과 마찬가지로, key에 해당하는 객체는 반드시
    equals( ), hashCode( )가 오버라이딩 되어있어야 한다.
    Map<K, V> map = new HashMap<K, V>();

  • Properties 클래스
    K(key), V(value)가 모두 String으로 제한된 Map
    프로퍼티(*.properties) 파일을 읽어올 때 주로 사용하며,
    파일 입출력에 특화되어 있다.


🏹 Map 계열 주요 메서드

  • put(K key, V value) : 주어진 키와 값을 추가
    map.put("LACHIA", new Dancer("가비", 93));

  • entrySet( ) : 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 set에 담아서 리턴

  • get(Object key) : 주어진 키의 값을 리턴
    list.get("YGX")

  • isEmpty( ) : 컬렉션이 비어있으면 true, 아니면 false 반환

  • keySet( ) : 모든 키를 Set 객체에 담아서 리턴

  • size( ) : 저장된 키의 총 개수를 리턴

  • values(Object key) : 저장된 모든 값을 Collection에 담아서 리턴


🚩 소스코드1

간이 로또번호 생성기 : Set에 저장된 값을 하나씩 반복 접근

  • 첫 번째 방법 : Iterator 인터페이스
public void example1() {
	Set<Integer> lotto = new HashSet<Integer>();

	while (true) {
		int random = (int)(Math.random() * 45 + 1);
		lotto.add(random);

		if (lotto.size() == 6) break;
	}
	
	// Iterator : 컬렉션에 저장된 객체를 순서대로 하나씩 접근하는데 사용하는 인터페이스
	Iterator<Integer> it = lotto.iterator();
	// -> lotto 집합(Set)에 저장된 내용들을 하나씩 꺼내올 수 있는 형태로 변환됨
	
	System.out.print("생성된 번호 : [ ");
	
	while (it.hasNext()) { // hasNext() : 다음 꺼내올 값이 있으면 true
		int num = it.next(); // next() : 다음 값을 얻어옴
		System.out.print(num + " ");
	}
	
	System.out.print("]");
}
  • 두 번째 방법 : 향상된 for문
public void example2() {	
	Set<Integer> lotto = new HashSet<Integer>();
	
	while (true) {
		int random = (int)(Math.random() * 45 + 1);
		lotto.add(random);
		
		if (lotto.size() == 6) break;
	}

	System.out.print("생성된 번호 : [ ");

	// for (하나씩 꺼내어 저장할 변수 : 컬렉션 또는 배열명)
	for (int num : lotto)
		System.out.print(num + " ");
	
	System.out.print("]");
}

🚩 소스코드2 - List + Set

천 원 단위로 돈을 입력 받아 로또 번호를 자동으로 생성하여 List에 저장 후 출력하기

public void example4() {
	Scanner sc = new Scanner(System.in);
	
	// 자동 생성된 번호들을 저장할 List 생성
	List<Set<Integer>> list = new ArrayList<Set<Integer>>();
	// -> Integer만 저장하는 Set을 저장하는 List 생성
	
	System.out.print("금액 입력(천 원 단위) : ");
	int price = sc.nextInt();
	
	for (int i = 0; i < price / 1000; i++) {
		// 1) 로또 번호를 생성 (Set)
		Set<Integer> lotto = new HashSet<Integer>();

		while (true) {
			int random = (int)(Math.random() * 45 + 1);
			lotto.add(random);
			
			if (lotto.size() == 6) break;
		}
		
		// 2) 생성된 로또 번호를 List에 추가
		list.add(lotto);
	}
	
	// 3) 향상된 for문으로 List에 저장된 데이터 순서대로 출력
	for (Set<Integer> lotto : list)
		System.out.println(lotto);
	
	sc.close();
}
profile
틀린 내용이 있다면 댓글 또는 이메일로 알려주세요 ❤ꔛ❜

0개의 댓글