프로그래밍공부노트

Day 21 - JAVA(JCF, Set, List, Map) 본문

JAVA

Day 21 - JAVA(JCF, Set, List, Map)

SANGJIN-YU 2021. 3. 11. 21:44
반응형

Set(중복 없음, 순서 없음)

 - 자료구조에 넣으려고 HashCode를 확인하였는데 이미 자료구조에 같은 HashCode를 가진 값이 있다면 넣지 않을거야 왜냐하면 중복 안됨

 

 - add()를 통해서 집어넣고 꺼낼때는 iterator 인터페이스를 사용하여 꺼낸다. 객체가 갖고 있는 값에 의한 HashCode Overriding이 발생하고 이 HashCode를 통하여 같은 값인지 비교한다.

 

 - ** 자료구조는 주소전달이 아니라 값이 들어가 있는 것 (pass by reference와 다르다)

Set타입으로 우리가 사용을 하는 것이지 <Generic>으로 타입이 결정되는게 아님 오늘 헷갈렸다.

Generic은 그저 자료구조에 넣고 다시 추출할 타입을 정하는 것이다

 

 - remove() (자료구조 안에서 참조타입 삭제)

변수의 hashcode 값을 통해서 자료구조에 똑같은 hashcode 있는지 찾아서 삭제하고 그 값을 반환해줌

즉, 뭘 삭제했는지 반환해줌

 

- 출력 방법 2가지

   1) iterator 객체를 사용하자(while문 사용) : Set_Feature4 마지막 출력에 사용

 

 

 

import java.util.HashSet;

public class Set_Feature4 {

	public void set_Remove() {
		Set<String> sets = new HashSet<String>();
		sets.add("하늘"); //하늘 자료구조에 넣음 h01
		sets.add("바람"); //바람 자료구조에 넣음 h02
		sets.add("별");	// 별 자료구조에 넣음 h03
		String re = "하늘"; // String pool에 생성 하늘 h01
		String re2 = new String("하늘"); //heap에 생성 하늘 h01
		String re3 = "꿈"; // String pool에 생성 꿈 ho4
		
		//삭제하는 방법은 변수의 주소를 통해서 가지고 있는 값의 오버라이딩된 hashcode로 삭제함
		
		sets.remove("하늘"); 
        //  이 코드가 적용 된다면 "하늘"에 의해 Overriding 된 HashCode를 갖고 있는 객체를 지운다
		sets.remove(re); 
        // 이것 또한 String re = "하늘"이고 이 코드를 실행하면 역시 Overriding 된 HashCode를 갖고 있는 객체 지운다
		sets.remove(re2); 
        // 이것 또한 똑같다

		sets.add(re3); //  "꿈"을 자료구조에 넣음 h04
		re3 = "자바";// String re3을 "자바"라고 다른 값을 선언했어 h05
		
        sets.remove(re3);  
        // 여기서 re3을 지우면?"자바"에 의해 Overriding된 HashCode가 자료구조 안에 없어 삭제되는 것 없음
        
        	Iterator<String> iter =  sets.iterator(); // Iterator  사용 
		while (iter.hasNext()) { // while문을 통하여 값이 있다면(True) 계속 반복 , hasNext 값 있는지 T/F 반환
			String s = iter.next();// next() 값을 반환
			System.out.println(s);
			
		}
	}
}

 

 2) 기본배열로 만든 후에 출력하자

    - returnSet은 Set타입이야 Set는 interface야 그래서 최상위 클래스인 Object 클래스로 casting 한후  JCF를 기본배열로 만들어 주는 toArray 사용하여 기본배열 만들고 Object 타입으로 반환 후 Arrays.toString 사용하여 껍데기가 아닌 값을 출력

 

Object[] iArray = (Object[])returnSet.toArray();

List (순서 있음(index), 중복 가능)

 - 자료구조 add() 똑같음

 

 - remove()  Overloading된 함수중 index를 통해석 삭제 가능, 값을 통해서 삭제 가능(HashCode)

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javax.swing.event.ListSelectionEvent;

//Vector, ArrayList, LinkedList...
//값의 중복이 가능함
//값을 입력하면 자동으로 index를 부여해줌
//1[0],2[1],3[2] -> 2번의 값을 삭제하면 1[0],3[1]이 됨 
public class List_Feature {

	public void list_Check() {
		
		List<Integer> list = new ArrayList<Integer>();
//		Vector< Integer> v = new Vector<Integer>(5,5);
		int n1 = 10;
		int n2 = 20;
		int n3 = 30;
		Integer n4 = new Integer(30);
//		Integer n5 = 30;
		
		list.add(n1);
		list.add(n2);
		list.add(n3);
		
		for (int i = 0; i < list.size(); i++) { //size 3이야 3개 들어있어
			System.out.println(list.get(i));
		}
		
		//n3에 새로운 값을 입력
		n3 = 40;
//		n3의 값은 기본타입의 int 따라서 remove의 오버로딩된 함수 중 index를 통해서 삭제하는 함수를 실행
//		근데 현재 생성된 List 객체는 10[0] 20[1] 30[2]의 객체가 입력되어 있기 때문에 index 번호는 2를 넘을 수 없음
//		list.remove(n3);  -> list.remove(40);이라고 인식하여 indexOutyOfBoundaryException이 발생
		list.remove(n3);
		
		Integer r = 30; // 객체
		list.remove(r); // AutoBoxing과 AutoUnBoxing은 연산과 선언에서만 발생됨
		
		list.remove(new Integer(30)); //값의 hashcode 판단해서 30과 같은 hashcode니까 삭제 
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
	}
}

Map(Key, Value)

 - Map은 새로운 값을 넣으면 그값으로 대체 된다

 - Key를 통해서만 Value를 찾고 삭제 가능

 

 - 자료구조에 입력을 위해 add()가 아니라 put()을 사용, 삭제 remove()

 

 - value 갖고 삭제 할 수 없어요, key값으로는 가능함

 - contains 있는지 확인 key, value 둘다 확인 가능, 참조타입 value 확인시 HashCode로 확인함

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

//입력시 put이라는 명령어를 사용 get(키객체)
//key는 중복이 불가능하다
// 근데 key가 같으면서 값이 다른 객체는 어떻게 입력이 될까?
//pass by value 처럼 마지막 값을 입력 한다
public class Map_Feature {

	public void map_Check() {
		Map<String, Integer> map = new HashMap<String, Integer>();

		map.put("가", 10);
		map.put("나", 20);
		map.put("다", 30);
		map.put("다", 1000);
		
		System.out.println(map.get("다"));
	}
	
	public void mapUse() {
		Map<String, Integer> map = new HashMap<String, Integer>();

		map.put("가", 10);
		map.put("나", 20);
		map.put("다", 30);
		map.put("다", 1000);
		
		System.out.println("값을 가져오기");
		System.out.println("map.get(키) : "+map.get("가"));
		System.out.println("value를 가지고 삭제하기");
		Integer v = 10;
		System.out.println("map.remove(value)"+map.remove(v));
		
		System.out.println("key를 가지고 삭제하기");
		//map은 반드시 key를 통해서 삭제 가능하고 삭제하면 가지고 있는 value를 반환해준다.
		System.out.println("map.remove(key) : " + map.remove("가"));
		
		//가지고 있는 key와 value가 있는지 없는지 확인 contains
		System.out.println("key여부 확인 : "+ map.containsKey("나"));
		System.out.println("value 여부 확인 : " + map.containsValue(1000));
		int vv = 1000;
		Integer vI = vv;
		System.out.println("int 여부 확인 : "+ map.containsValue(vv));
		System.out.println("Integer 여부 확인 : " + map.containsValue(vI));
	
	

		}
	}
}

 

	public class Map_Feature {
        
       	public void mapUse() {
            
            
         //만약에 map에 있는 전체 값을 출력하고 싶다면
		//key만을 추출해서 Set 타입으로 만들고 Set타입을 다시 Iterator 타입으로 만들고 while 문을 통해 출력할때 key로 맵을 호출
        Set<String> keys = map.keySet();
		Iterator<String> iter = keys.iterator();
        
		while (iter.hasNext()) {
			String keyString = iter.next();
			System.out.println(keyString+" : "+map.get(keyString));
            }
          }
         }

keySet() 사용하여 Key만 추출하고 Set 타입으로 변환하여 Iterator 사용 값을 꺼냄 없을때까지 

반응형

'JAVA' 카테고리의 다른 글

Day 26 - Java(Cloneable)  (0) 2021.03.18
Day 24 - JAVA(야구게임)  (0) 2021.03.16
Day 20 - JAVA( JCF, SET)  (0) 2021.03.10
Day 19 - JAVA(Interface, Abstract Class)  (0) 2021.03.09
Day 18 - JAVA(예외 처리, Exception)  (0) 2021.03.08