[자바] Collection Framework - Set 계열

Gammi·2023년 3월 25일
0

JAVA

목록 보기
34/35

📙 Collection Framework - Set


  • 데이터의 저장되는 순서 유지 및 중복이 불가능한 구조

    -> 매우 효율적인 중복 제거 수단으로 사용 가능

  • 인덱스 사용 X

  • 구현체 클래스 : HashSet, TreeSet 등





🔗 참고

HashSet

  • 객체 생성 : HashSet set = new HashSet();
  • Set 인터페이스 구현체이므로 주로 업캐스팅을 활용하여 사용
  • Set 계열 메서드 사용



✔ Set 계열 메서드


boolean isEmpty() : 컬렉션 객체가 비어있는지 여부를 리턴함

Set set = new HashSet();
set.isEmpty();

int size() : 컬렉션 객체에 저장된 요소(데이터, 객체) 개수를 리턴함

  • 배열의 배열명.length()와 같은 개념
set.size();

boolean add(Object o) : 컬렉션 객체에 요소(o, 데이터)를 추가함

  • 파라미터가 Object 타입이므로 모든 타입 데이터를 추가할 수 있음

  • 리턴타입이 boolean이므로 요소 추가 성공 여부 리턴 (중복 시 추가 X)

set.add(1); // int형 추가 (int -> Integer -> Object로 변환되어 저장)
set.add("TWO"); // String -> Object로 변환되어 저장
set.add(3.14); // double -> DOouble -> Object로 변환되어 저장
System.out.println("실수 3.14 추가 가능? " + set.add(3.14)); 
// 이미 위에서 3.14를 추가했기 때문에 false가 리턴됨

boolean contains(Object o) : 컬렉션 객체 내의 요소 o의 포함 여부 리턴함

System.out.println("실수 3.14가 존재하는가? " + set.contains(3.14));
// true 리턴됨
System.out.println("정수 4가 존재하는가? " + set.contains(4));
// false 리턴됨

boolean remove(Object o) : 컬렉션 객체 내의 요소 o 삭제 (결과 리턴됨)

set.remove(3.14);
System.out.println("실수 3.14 삭제 : " + set.remove)); 
// 위에서 이미 삭제했기 때문에 false 리턴됨

void clear() : 컬렉션 요소 초기화

set.clear();

Object[] toArray() : 컬렉션을 배열로 변환

Object[] oArr = set.toArray();





✔ Set 또는 List 계열 객체 특징


  • 객체 생성 시 객체 데이터 복사 가능

    -> Set set2 = new HashSet(set);

  • 복사된 객체의 요소를 삭제하더라도 다른 객체의 요소에 영향을 미치지 않음

  • 객체 생성 후 addAll() 메서드를 이용해 데이터를 한번에 추가하는 것도 가능함


  • TreeSet 객체를 활용하면 같은 타입 데이터가 저장된 Set 객체를 정렬할 수 있음

    -> 같은 타입 데이터만 정렬 가능하며 다른 타입일 경우 예외 발생

    -> 수치데이터는 숫자 크기 순으로 오름차순 정렬되며, 문자는 문자 코드값 기준으로 오름차순 정렬됨

    • TreeSet treeSet = new TreeSet(set);







➕ Set 계열 객체를 활용해서 로또 번호 생성기 만들기


Set<Integer> thisWeekLotto = new TreeSet<Integer>(Arrays.asList(7, 8, 11, 13, 5, 23));
// 로또 1등 당첨 번호 저장

Set<Integer> myLotto = new TreeSet<Integer>(); // 정렬을 위해서 TreeSet 사용
Random r = new Random(); // 1 ~ 45 사이의 난수가 필요하기 때문에 Random 클래스 사용

while(myLotto.size() < 6) { // 로또 번호 6개니까 6개만 저장
	myLotto.add(r.nextInt(45) + 1); // 1 ~ 45까지 난수 중에서 myLotto에 저장
}

int count = 0; // 같은 숫자 몇 개인지 저장할 변수

for(int num : myLotto) {
	if(thisWeekLotto.contains(num)) { // thisWeekLotto에 myLotto와 같은 번호가 있으면
    	count++; // count 증가
    }
}

switch(count) {
	case 6 : System.out.println("1등"); break;
    case 5 : System.out.println("2등"); break;
    case 4 : System.out.println("3등"); break;
    default : System.out.println("꽝"); 
}



🔗참고

Arrays.asList()

  • new ArrayList() 대신 사용
  • java.util.ArrayList 클래스와는 다른 클래스
  • set(), get(), contains() 메서드를 가지고 있지만 원소 추가 메서드는 없음
    -> 사이즈 변경 불가능
profile
개발자가 되었어요⭐️

0개의 댓글