2-1(3) Set (인터페이스)

zhyun·2020년 9월 15일
0

HighJava

목록 보기
5/67

List와 Set의 차이점

  1. List
  • 입력한 데이터의 순서가 있다.
  • 중복되는 데이터를 저장할 수 있다.
  1. Set
  • 입력한 데이터의 순서가 없다.
  • 중복되는 데이터를 저장할 수 없다.
  • 그래서 있는 데이터를 add하면 false를 반환하고, 데이터는 추가되지않음.
  • Set에 데이터 추가할 때 add()메서드 사용
  • Set은 데이터의 순서가 없기 때문에 List처럼 인덱스로 데이터를 하나씩 불러올 수 없다.
  • 그래서, 데이터를 하나씩 가져오기 위해서는 Iterator로 처리해야 한다.
public class T06_SetTest {
	public static void main(String[] args) {
    
    	   Set hs1 = new HashSet<>();
    	   //Set에 데이터 추가할 때 add()메서드 사용		
    
            hs1.add("DD");
            hs1.add("AA");
            hs1.add(new Integer(2));
            hs1.add("CC");
            hs1.add("BB");
            hs1.add(new Integer(1));
            hs1.add(new Integer(3)); 

            System.out.println("Set 데이터: "+ hs1);
            //Set 데이터: [DD, AA, CC, BB, 1, 2, 3]
            System.out.println();
            
            //Set은 데이터의 순서가 없고, 중복을 허용하지 않는다.
  	  //그래서 이미 있는 데이터를 add하면 false를 반환하고, 데이터는 추가되지않음.
              boolean isAdd = hs1.add("FF"); // 중복을 허용하지 않기 때문에 boolean 확인 (C)
              System.out.println("중복되지 않을때:"+ isAdd);
              //중복되지 않을때:true
              System.out.println("Set 데이터:"+hs1);
              Set 데이터:[DD, AA, CC, BB, FF, 1, 2, 3]
              System.out.println();	
              
              isAdd = hs1.add("CC"); //(C)
              System.out.println("중복 될 때 : "+isAdd);
              //중복 될 때 : false
              System.out.println("Set 데이터: "+hs1);
              //Set 데이터: [DD, AA, CC, BB, FF, 1, 2, 3]
              System.out.println();	
              //Set의 데이터를 수정하려면 수정하는 명령이 따로 없기 때문에 해당자료를 삭제한 후 
              //새로운 데이터를 추가해 주어야 한다.
              
         	//삭제하는 메서드
		//1) clear() => Set 데이터 전체 삭제
		//2) remove(삭제할 자료) => 해당 자료 삭제
		//예) 'FF'를 'EE'로 수정하기

		hs1.remove("FF");//FF 자료 삭제 (D)
		System.out.println("삭제 후 데이터: "+hs1);
        	//삭제 후 데이터: [DD, AA, CC, BB, 1, 2, 3]
		System.out.println();
		
		hs1.add("EE");//EE 자료 추가 (C)
		System.out.println("Set 데이터: "+hs1);
        	//Set 데이터: [DD, AA, CC, BB, EE, 1, 2, 3]
		System.out.println();
        
   		System.out.println("향상된 for문: ");
		for(Object obj : hs1) {
                  System.out.print(" "+obj);
                  // DD AA CC BB EE 1 2 3
		}
		System.out.println();
        
   		hs1.clear(); // 전체 자료 삭제 (D)
		System.out.println("clear 후 Set 데이터: "+hs1);
                //clear 후 Set 데이터: []
		System.out.println("Set의 자료 개수: "+hs1.size());
                //Set의 자료 개수: 0
		System.out.println();
        
                //Set은 데이터의 순서가 없기 때문에 List처럼 인덱스로 데이터를 하나씩 불러올 수 없다.
                //그래서, 데이터를 하나씩 가져오기 위해서는 Iterator로 처리해야 한다.
                
              	//Set의 데이터를 가져오기 위해 Iterator객체를 얻어오기 
              	//=> Set의 iterator()메서드를 호출하면 된다.
                
                Iterator it = hs1.iterator(); // Iterator은 인터페이스 => 제공해주는 메서드 hasNext(),next() 
                
                //데이터 개수만큼 반복하기
                //hashNext()메서드 => 포인터 다음 위치에 데이터가 있으면 true, 없으면 false를 반환한다.
                while(it.hasNext()) {// 다음자료가 있는지 검사...
                    //next()메서드 => 포인터를 다음 자료위치로 이동하고, 이동한 위치의 자료를 반환한다.
                    System.out.println(it.next()); //next()메서드 이용해서 데이터를 꺼내온다.
                }
                
		//1~100사이의 중복되지 않는 정수 5개 만들기
		Set<Integer> intRnd = new HashSet<>();
		
		while(intRnd.size() < 5) { // Set의 데이터가 5개가 될때까지...(중복되는게 없을때까지 뺑뺑 돈다)
			int num = (int)(Math.random()*100+1);
			intRnd.add(num);
		}
		System.out.println("만들어진 난수들 : "+ intRnd);
       		 //만들어진 난수들 : [3, 19, 70, 24, 58]
		//Collection 유형의 객체들은 서로 다른 자료 구조로 쉽게 변경해서 사용할 수 있다.
		//다른 종류의 객체를 생성할 때 생성자에 변경할 데이터를 넣어주면 된다.
		
        	List<Integer> intRndList = new ArrayList<>(intRnd); // intRnd는 Set클래스 -> List에 담을때  경우
		System.out.println("List의 자료 출력...");
		for(int i=0; i<intRndList.size(); i++) {
			System.out.println(intRndList.get(i));
		}
		for(Integer num : intRndList) {
			System.out.println(num+" ");
		}                

	}
}
profile
HI :)

0개의 댓글