재밌고 어려운 IT를 이해해보자~!

컬렉션 프레임워크 본문

교육전 개인공부

컬렉션 프레임워크

언제나즐거운IT 2023. 10. 23. 12:01

배열을 통해 자료구조를 배웠었다.자료구조는 프로그램 실행 시 메모리에 자료를 유지하고 관리하기 위해 사용한다.

하지만 배열은 불편한점이 많기에 이를 해결하기 위해 필요한 자료구조를 미리 구현하여 만들어놨다.

java.util 패키지 에서 제공하며 이를 프레임워크라고 부른다.

컬렉션은 list, queue, tree등의 자료구조를 뜻하고 프레임워크는 클래스와 인터페이스를 묶어놓은 개념이다.

즉, 컬렉션 프레임워크란 기존에 존재했던 자료 구조에 인터페이스로 설계된 기능을 클래스를 통해 제공하여 데이터 관리에 용이한 자료구조 객체를 구조화한것을 말한다.

 

제네릭이란

클래스 다루어야할 데이터타입을 명시하는것. 내부가 아닌 외부로부터 받는다. -> 외부라는것은 객체를 선언할때 지정해서!

List -> class int long 저장 모두가능. 집어넣을땐 괜찮지만 꺼낼때 문제가 생긴다. 그때그떄 저장하고싶은 데이터를 list를 선언할때 제네릭을 통해 넣을 수 있다 list<integer> 으로 선언

컬렉션 프레임워크의 Datatype을 지정하기 위한기술 --> X

클래스가 다루어야할  객체 타입을 외부에서 지정하여 관리할 수 있는 기술 --> O

제네릭을 이용하여 컬렉션 프레임워크가 저장할 datatype을 지정

즉 컬렉션 프레임워크만을 위해서만 쓰는것은 아니다.

 

 

list 사용법!

package exam19;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Listexam {
	
	public static void main(String[] args) {
		
		//ArrayList<Integer>list01 = new ArrayList<>();
		//<Intger>처럼 꺽쇄안을 클래스형으로 쓰는이유는 기본형이 Object이기 때문에 우리가 쓰는 데이터타입도 Object 하위인 클래스형태가 되어야한다.
		//리스트는 이렇게 선언하지 않는다 모든 리스트는 인터페이스 리스트를 상속하고 구현하는 구현체이기때문에
		//선언할때는 다형성을 이용해 형변환을 이용. 부모타입으로 형변환.
		List<Integer> list = new ArrayList<>();
		//부모타입으로 선언하면 뒤가 바뀌어도 무넺가 안되고 부모 기능을 다 쓸 수 있다. 관리가 편하다.
		//자료형 int 가 아닌 클래스타입 integer로 스는 이유는 object라는 기본 데이터 타입을 쓰기 때문에 이 object를 변형하려면
		//object 하위인 클래스타입이 되어야한다.
		//그래서 제너릭에선 일반형으로 쓰지못하고 클래스타입 쓴다
	
		//추가
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		list.add(5);
	
		
		//중간삽입
		list.add(5,10);
		list.add(1,20);
		//중간에 삽입하면 한칸 씩 밀린다. 
		
		//치환  
		list.set(0, 5);
		list.set(4, 13);
		
		//삭제 -공간도 지워진다.. 하나씨 당겨짐.
		list.remove(4);
		list.remove(3);
		System.out.println(list);
		
		
		//출력
		for(int i =0; i< list.size(); i++ ) {
			System.out.print(list.get(i) + "\t");
		}
		
		System.out.println("\n----------------");
		
		for(int val : list) { // 향상된 포문
			System.out.print(val + "\t");
		}
		
		System.out.println("\n----------------");
		
		//배열같은곳에 내부를 순환하는 커서가 있다 이커서가 값드을 찔러서 val에 하나하나 던져주는 것이 있다.
		//그 커서를 iterator라고 부른다.
		
		
		//iterator 를 이용한 출력
		//리스트를 순회하는 인트형 이터레이터 -> 꺼내야하는 숫자 정수형
		Iterator<Integer> iter = list.iterator();
		//커서가 다음게 있다고 True를 주면 itor는 다음데이터를 찔러서 값을 주고 다음걸 봐서 true면 또 찌르고 false면 멈춤
		//이터레이터는 있는지 체크후 있으면 값을 반환 
		while(iter.hasNext()) {
			System.out.print(iter.next()+"\t");
		}
		 
	}
}

//총 정리~~~~~~~~
//컬렉션 프레임워크 :컬렉션 프레임워크는 데이터를 다룰 때 사용되는주요 자류구조를 말한다. 컬렉션은 기존의List, Map, Set등의 자료 구조를 뜻하고 프레임우커는 클래스와 인터페이스를 묶어놓은 개념.

//리스트 컬렉션 :배열과 비슷하게 index로 객체를 관리. 다만 배열과는 다르게 크기의 제한이 없으며 삽입,삭제,변경의 기능이 자유롭다.
//List에는 대표적으로 ArrayList와 LinkedList가 있다.
//ArrayList : 데이ㅓ를 순차적으로 저장. 데이터가 삽입 될때마다 크기가 증가하고 배열을 삭제하면 공간이 줄어듭니다.
//Index를 기준으로 값을 삽입하거나 추출한다.
//LinkedList : Node 객체를 기반으로 데이터를 저장합니다. Node 객체는 데이터와 자신 다음에 올 데이터의 주소를 값으로 가집니다.
//ArrayList는 데이터를 출력하거나 검색할 경우에, Linked List는 데이터의 삽입과 삭제가 빈번할 경우에 사용하면 더 좋은 성능을 보여준다!

set과 iterator

package study.code.set;

import java.util.HashSet;
import java.util.Set;

public class SetExam01 {
	public static void main(String[] args) {
	
		
		//set을 선언
		Set<Integer> set = new HashSet();
		
		//추가
		
		set.add(1);
		set.add(1);
		set.add(1);
		set.add(1);
		set.add(1);
		
		set.add(2);
		set.add(2);
		
		set.add(3);
		set.add(4);
		set.add(4);
		//set은 중복이 안된다.
		System.out.println(set);
		
		
		set.remove(3);
		System.out.println(set);
		//clear는 객체의형태는 남겨두고 내용(데이트)만 삭제한다.
		//set.clear();
		
	
		System.out.println("set의 크기 : " + set.size());
		System.out.println("set 안에 3 데이터 존재?   :"+ set.contains(3));
		
		
		
	}

}
package study.code.set;

public class TextMessage {

	
	private String msgNumber;
	private String message;
	
	public TextMessage(String msgNumber, String message) {
		//private 변수는 내부에서도 get/setter 이용 추천
		this.setMsgNumber(msgNumber);;
		
		this.setMessage(message);
	}
	public String getMsgNumber() {
		return msgNumber;
	}
	public void setMsgNumber(String msgNumber) {
		this.msgNumber = msgNumber;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	
	//데이터중복처리를위한 
	//hashCode 메서드 재정의
	@Override
	public int hashCode() { //hashCode는 int 타입 
		System.out.println("검색1");
		return this.getMsgNumber().hashCode(); // 식별데이터 MsgNumber
		//msgNumber가 string 이면 getMsgNumber()가 가지고있는 hashCode를 출력
	}
	//값이 같아야 하니까 
	//equals 메서드 재정의
	@Override
	public boolean equals(Object obj) {
		System.out.println("검색2");
		if(obj instanceof TextMessage) { // obj가 textmessage객체 타입이면
			TextMessage compare = (TextMessage)obj;
			
			if(this.getMessage().equals(compare.getMessage())) {
				return true;//빠른반환
			}
		}
		return false;
	}
	
}
package study.code.set;

import java.util.HashSet;
import java.util.Set;

public class TextExamMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		TextMessage msg1 = new TextMessage("1001", "좋은아침");
		TextMessage msg2 = new TextMessage("1001", "좋은아침");
		TextMessage msg3 = new TextMessage("1001", "좋은아침");
		TextMessage msg4 = new TextMessage("1002", "잘자요");
		// 검색1, 검색2로 어떻게 타는지 확인가능
		Set<TextMessage> txSet = new HashSet<>(); //일반 헤쉬셋은 순서가없다.
		//앞에다 set을 두는 이유는 뒤에애들 목적에 따라서 쉽게 바꿀수 있기 때문이다.
		
		txSet.add(msg1);
		txSet.add(msg2);
		txSet.add(msg3);
		txSet.add(msg4);
		
		System.out.println("Set 사이즈" + txSet.size()
		);
		
		//향상된 for문
		for(TextMessage msg : txSet) {
			System.out.println("==========================");
			System.out.println("메세지 번호 : " + msg.getMsgNumber());
			System.out.println("메세지 내용 :");
			System.out.println(" " + msg.getMessage());
			System.out.println("==========================");
		}
		
		
	}

}
package study.code.iter;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class IteratorTest {

	public static void main(String[] args) {
		
		List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4)
				); //바로 값줄때 asList사용
		Set<Integer> set = new HashSet<>(list);
		
		//list 를 iterator 이용하여 출력
		Iterator<Integer> intIter = list.iterator();
		//Iterator 자동임포트할떄 2개나오는데 우리가 사용하는것은 util쪽에 있다
		
		while(intIter.hasNext()) {
			System.out.println(intIter.next());
	
		}
		
		//set을 iterator를 이용해서 출력
		Iterator<Integer> setIter = set.iterator();
		
		while(setIter.hasNext()) {
			System.out.println(setIter.next());
		}
	}
}

Map

package sutdy.code.map;

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

public class MapExam {

	public static void main(String[] args) {
		
		Map<String, Integer> map = new HashMap<>();
		
		//입력
		map.put("one", 1);
		map.put("two", 2);
		map.put("two", 22);
		map.put("three", 3);
		map.put("four", 4);
		map.put("five", 5);
		//맵은 키중복이 일어나면 값을 치환한다.
		//지금 two 에는 22가 들어가있음
		System.out.println("map 의 사이즈:" + map.size());
	
		map.remove("five");
		System.out.println("map 의 사이즈:" + map.size());
		
		System.out.println("map has that key name is one : " + map.containsKey("six"));
		System.out.println("map has that key name is one : " + map.containsValue(22));
		
		//출력형태
		// key를 이용한 출력
		Set<String> keySet = map.keySet();
		
		for(String key : keySet) {
			System.out.println("key : " + key +", value : " + map.get(key));
		}
		
		System.out.println("============================");
		//Entry 를 이용한 출력
		//Entry 가 더 복잡하당......
		Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
		
		for(Map.Entry<String, Integer> en : entrySet) {
			System.out.println("key : " + en.getKey() +", value : " + en.getValue());
		//map은 다른거에비해 삽입삭제가느린대신 검색이 훨씬 빠르다 key를 이용해서 ..
			//아니면 분류할때
		}
	}
}
package sutdy.code.map;

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

public class MapExam02 {
	public static void main(String[] args) {
		
		String[] flowers ={"백합","장미", "안개꽃", "튤립", "장미", "백합", "튤립", "안개꽃"};
		
		//꽃별로 몇개씩 사왔는지 확인.
		Map<String, Integer> flMap = new HashMap<>();
		int count = 0;
		for(int i=0; i < flowers.length ; i++) {
			String flower = flowers[i];
			//꽃이름과 동일한 key를 가지고 있다면
			if(flMap.containsKey(flower)) {
				//현재 개수에 한개를 더한다
				count = flMap.get(flower) +1;
				//맵에 치환 - key중복 치환 이용
				flMap.put(flower,  count);
			}else {
				//중복이 없다면 맵에 등록
				flMap.put(flower, 1);
	
			}
		}
		//출력을 위해 keyset가져오기
		Set<String> KeySet = flMap.keySet();
		
		for(String key : KeySet) {
			System.out.println("꽃 :" + key + ", 개수 : " + flMap.get(key));
		}
	}
}

'교육전 개인공부' 카테고리의 다른 글

쓰레드  (0) 2023.10.26
정렬, 비교, 람다  (0) 2023.10.25
기본 API클래스4 -Wrapper  (1) 2023.10.23
기본 API클래스3 - String  (0) 2023.10.22
기본 API 클래스2 -java.lang 패키지  (0) 2023.10.20
Comments