내가 보려고 정리하는/JAVA

아니, 인터페이스는 <Set>도 있잖아!

보동이용용 2022. 12. 20. 11:12
반응형

List와 비슷하지만 차이점을 알아보자아아아!

 

- List와 Set의 차이점
1. List
  - 데이터의 순서(index)가 있다.
  - 중복되는 데이터를 저장할 수 있다.
2. Set
  - 데이터의 순서(index)가 없다.
  - 중복되는 데이터를 저장할 수 없다. 

그럼 이제 정말 그런지 사용법을 알아보자아아아!

 

// Set을 생성해보자!
HashSet hs1 = new HashSet();

// 자료를 추가해보자!
hs1.add("AA");
hs1.add(2);
hs1.add("CC");

음~ 정말 똑같네!

그럼 차이점을 해보자

 

boolean을 추가하여 반환값 true/false를 받는 것도 비슷하다.

boolean isAdd = hs1.add("FF");
System.out.println("중복되지 않을 때 : " + isAdd);  
System.out.println("set 데이터 : " + hs1);

<결과>

중복되지 않을 때 : true
set 데이터 : [DD, AA, CC, BB, FF, 1, 2, 3]

 

성공하면 true가 나온다. 

그럼! 지금 궁금했던 중복을 넣어보자!

똑같이 boolean을 넣어서 결과를 확인해보자.

 

isAdd = hs1.add("CC");
System.out.println("중복될 때 : " + isAdd);
System.out.println("set 데이터 : " + hs1);	
System.out.println();

<결과>

중복될 때 : false
set 데이터 : [DD, AA, CC, BB, FF, 1, 2, 3]

 

오오 안되는구나.

 

 

 

 

// 데이터 변경하기

그럼 List에서처럼 데이터를 변경할 수 있을까? 

Set은 인덱스가 없기 때문에 변경을 할 수 없다. 그럼 어떡할까?

해당 데이터를 삭제(remove)하고 다시 추가(add)하면 된다.

그럼 List에서 처럼의 결과를 얻을 수 있다.

 

		hs1.remove("FF");
//		System.out.println("삭제후 set => " + hs1);

		hs1.add("EE");
		System.out.println("set 데이터 : " + hs1);	
		System.out.println();

(( 주석을 친 이유는.... 변경처럼 보이게 하려고 해봤다 ㅎㅎ))

 

<결과>

set 데이터 : [DD, AA, CC, BB, FF, 1, 2, 3]    =>   set 데이터 : [DD, AA, CC, BB, EE, 1, 2, 3]

이렇게 변할 수 있다.

 

 

 

 

 

 

// 데이터 꺼내기

변경하기와 마찬가지로 인덱스가 없기에 꺼내기도 작업이 필요하다. 

두가지 방법이 있는데,

1. Iterator 사용하기. 
2. 향상된 for문 사용하기.

 

Iterator it = hs1.iterator();
while(it.hasNext()) {
	System.out.println(it.next());
}
System.out.println("----------------------------------");


System.out.println("향상된 for문 이용하기...");
for(Object obj : hs1) {
	System.out.println(obj);
}
System.out.println("----------------------------------");

<결과>

DD
AA
CC
BB
EE
1
2
3
----------------------------------

향상된 for문 이용하기...
DD
AA
CC
BB
EE
1
2
3
----------------------------------

 

그런데... 결과도 똑같고... for문이 나오기 전에 Iterator를 썼다고 하니... for문이 더 편할듯 하다. 내생각!

 

 

 

Set은 중복되지 않는 특징이 있기 때문에 랜덤으로 겹치지 않는 난수 뽑을 때 유용하다고 한다!

 

**1~25 사이의 중복되지 않는 3개의 난수를 뽑아보자!

		Random rnd = new Random();
		HashSet<Integer> testSet = new HashSet<Integer>();
		while(testSet.size()<3) {
			testSet.add(rnd.nextInt(25) + 1);
		}
		System.out.println("당첨자 번호 : " + testSet);

<결과>

당첨자 번호 : [18, 5, 11]

 

while문 안에서 중복되지 않는 결과가 나올 때까지 돌고 3개가 완성되면 빠져나오는 것이다.

 

 

 

 

 

// Set이 인덱스가 없어서 불편할 때 List로 변환하여 사용할 수 있다.

		ArrayList<Integer> testList = new ArrayList<Integer>(testSet);
		System.out.println("List 데이터 출력...");
		for(int i = 0; i < testList.size(); i++) {
			System.out.println(testList.get(i));
		}
반응형