Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

WON.dev

chapter23 : Collection Framework 본문

JAVA

chapter23 : Collection Framework

GAWON 2023. 5. 16. 18:39
1.1 컬렉션 프레임워크 (Collection Framework)
 - 데이터를 다루기 위한 표준화된 구조  (모든 프레임 워크는 제네릭타입이 자동으로 들어가 있다.)
 - 핵심 구조

		Collection ─┬── List ──────┬── ArrayList
					│	     	   ├── LinkedList
					│	 		   └── Vector                          List, Set, Map 중요     
					│
				    └── Set ────────── HashSet

		Map ───────────────────────┬── HashMap
			   					   ├── SortedMap ─── TreeMap
			   	   				   └── HashTable
1.2 주요 인터페이스 분류
 - List(동적배열)
	1) 순서가 있는 데이터의 집합(배열)
	2) 중복 저장 허용
 - Set
	1) 순서가 없는 데이터의 집합(인덱스가 없다),(중복제거하는 알고리즘에 쓴다)
	2) 중복 저장 불가
★- Map 
★1) 키(key)와 값(value)의 쌍(pair)으로 이루어진 데이터
	2) 순서가 없는 데이터의 집합
	3) 키(key)는 중복 저장 불가
	4) 값(value)는 중복 저장 허용

 - 반복자 (Iterator)를 사용 할 수 있다.(값을 나열하고 싶을때)
 	1) Iterator 메소드
 		(1) hasNext()	: 다음 요소에 읽어 올 요소가 있는지 확인하는 메소드
 						  있으면 true 없으면 false 반환.
		(2) next()		: 다음 요소를 가져온다.
		(3) remove()	: next()로 읽어온 요소를 삭제한다.


		List<String> list = new ArrayList<>();
		Iterator itr = list.iterator();				// itr : 컬렉션의 요소를 꺼낼 수 있다.

		while(itr.hasNext()){
			itr.next();
		}


1.3 구현 클래스
 <List>
★- ArrayList(1번부터 중간에 1명이 빠지면 앞으로 채워가는것)
	1. 객체(인스턴스)를 여러 개 저장 할 수 있는 '배열'을 구현한 컬렉션이다.
	2. 가장 많이 사용하는 컬렉션이다.
	3. 기존엔 Vector를 많이 사용했다.(Vector는 ArrayList와 내부 구조가 같지만 멀티 스레드 지원x)
	4. 장점
		1) 구조가 단순하다.
		2) 읽어 들이는 속도가 빠르다.(순차적일때 :과정의 연산은 빠르다)
		3) 저장된 객체의 변화가 적은 경우에 사용하는 것이 좋다. (이미 저장된 것은 변화가 적다.)
	5. 단점
		1) 일단 만들고 나면 나중에 크기 변경이 어렵다.
		2) 처음부터 크게만들면 공간 낭비가 생긴다.
		3) 비순차적 접근이 느리다.
		4) 데이터의 중간 위치에 추가/제거가 어렵다. (<-> LinkedList : 추가/제거가 쉽다.)

 - LinkedList(앞쪽으로 바라보는 연결성이 중요)
 	1. ArrayList와 사용방법은 같지만 내부 구조가 다르다.
	1. 자신과 연결된 다음 요소에 대한 참조(다음데이터의 위치) + 데이터로 구성된다.
	2. 비연속적인 공간을 사용한다.
	3. 장점
		1) 추가/제거 작업이 빠르다.
		2) 잦은 추가/제거가 발생되는 경우에 사용한다.
	4. 단점
		1) 순차적인 순회가 느리다.
		2) 구현이 어렵고, 오류가 발생 할 가능성이 있다.

 <Set>
 - HashSet
	1. Set 인터페이스를 구현한 대표적인 클래스이다.
	2. 중복된 데이터는 저장되지 않는다.
	3. 중복된 데이터 판단 원리
		1) hashCode() 확인
			(1) 값이 같으면 equals() 호출해서 동등비교
			(2) 값이 다르면 다른 데이터로 판단
		2) equals() 확인 (값이 같을때)
	4. 사용자가 정의한 객체(인스턴스)를 저장하려면 hashCode(), equals() 를 
     오버라이드 해야한다.
	5. 저장 순서가 없다.	(add 한 순서대로 유지되지 않는다.)
★6. add 한 순서를 유지하려면 LinkedHashSet클래스를 사용한다.

 - TreeSet
 	1. 이진탐색트리(BinarySearchTree)의 형태로 데이터를 저장.
 	2. 데이터의 추가/삭제 시간이 걸리지만 검색과 정렬이 뛰어난 장점
 	3. 중복된 데이터는 저장되지 않는다.

 <Map>
 - HashMap
	1. 해시코드를 사용하는 Map 이다.(많은 양의 자료에 적합하다.)
	2. 키(key)와 값(value)의 조합으로 데이터를 저장한다.
	3. 키는 중복 저장될 수 없지만 값은 중복 저장될 수 있다.
	4. 기존 저장된 키와 동일한 키로 값을 저장하면 새로운 값을 덮어쓴다.
	5. HashTable과 동일한 구조를 가지고 있지만 멀티스레드로 동시에 실행할 수 없다.
Q1. Test01.java

게시물을 저장하는 Board 클래스를 정의하고, ArrayList를 이용하여 3개의 게시물을 저장하시오.
1~3번 게시물번호 중 하나를 입력 받아 해당 게시물을 삭제하시오.

class Board			필드 : String title, String content, Date register
							register -> 현재 날짜 자동 삽입
					메소드 : 생성자, toString()

package org.joonzis.test;

import java.text.SimpleDateFormat;
import java.util.*;


class Board{
	private String title, content;
	private Date register;
	public Board(String title, String content) {
		this.title = title;
		this.content = content;
		this.register = new Date();
	}
	@Override
	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("제목 : ").append(title).append("\n");
		sb.append("내용 : ").append(content).append("\n");
		sb.append("등록일 : ").
		append(new SimpleDateFormat("yyyy년 MM월 dd일 E요일").format(register)).append("\n");
		return sb.toString();
	}
}
public class Test01 {
	public static void main(String[] args) {
		
		List<Board> list = new ArrayList<Board>();
		
		list.add(new Board("1. 공지사항", "모든 회원 필독"));
		list.add(new Board("2. 알림", "관리자만 필독"));
		list.add(new Board("3. 요청", "모든 회원 필독"));
		
		for(int i=0; i<list.size(); i++) {
			System.out.println(list.get(i));
		}
		
		Scanner sc = new Scanner(System.in);
		System.out.print("삭제할 게시물 번호 (1~3) >> ");
		int num = sc.nextInt();
		
		list.remove(num-1);
		
		for(int i=0; i<list.size(); i++) {
			System.out.println(list.get(i));
		}
		
	}
}

Q2. Test02.java
로또 & 빙고 (빙고가 어려우면 로또부터 해보기)
Set을 이용하여 5 X 5 Bingo 배열을 생성하시오. (1 ~ 25)
Set에 랜덤 생성 -> Bingo 2차원 배열에 저장

package org.joonzis.test;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;

//Q2. Test02.java
//로또 & 빙고 (빙고가 어려우면 로또부터 해보기)
//Set을 이용하여 5 X 5 Bingo 배열을 생성하시오. (1 ~ 25)
//Set에 랜덤 생성 -> Bingo 2차원 배열에 저장 
public class Test02 {
	public static void main(String[] args) {
		
		/*
		 * HashSet으로 빙고 이용시 숫자 오름차순 정렬 증상
		 *  - set의 특성상 입력 순서가 출력 순서와 같은 것은 아님
		 *  - 적은 데이터가 일률적으로 들어갈 시 오름차순 정렬 증상 발생
		 *  - 로또의 경우 45개의 데이터 중 6개만을 입력하여 문제 x
		 *  - 빙고의 경우 25개의 데이터 중 25개를 그대로 사용하여 증상 발생
		 */
		
		
		
		// 1. 로또
		/*
		 * System.out.println("<LOTTO>");
		 * 
		 * Random ran = new Random(); Set<Integer> set = new HashSet<Integer>();
		 * 
		 * while(set.size() < 6) { set.add(ran.nextInt(45)+1); }
		 * 
		 * int[] lotto = new int[6]; Scanner sc = new Scanner(System.in); for(int i=0;
		 * i<lotto.length; i++) { System.out.print((i+1) + "번 숫자 입력 >> "); lotto[i] =
		 * sc.nextInt(); }
		 * 
		 * System.out.println("로또 번호 : " + set); System.out.println("선택한 번호 : " +
		 * Arrays.toString(lotto));
		 * 
		 * 
		 * int cnt = 0; String resultStr = ""; Iterator<Integer> itr = set.iterator();
		 * while(itr.hasNext()) { int tmp = itr.next(); for(int i=0; i<lotto.length;
		 * i++) { if(tmp == lotto[i]) { cnt++; resultStr += lotto[i] + " "; } } }
		 * 
		 * System.out.println("맞은 개수 : " + cnt); System.out.println("맞은 번호 : " +
		 * resultStr);
		 */
		
		// 2. 빙고
		System.out.println("<BINGO>");
		
		Random ran = new Random();
		Set<Integer> set = new LinkedHashSet<Integer>();
		while(set.size() < 25) {
			set.add(ran.nextInt(25)+1); 
		}
		
		int[][] bingo = new int[5][5];
		
		Iterator<Integer> itr = set.iterator();
		
		for(int i=0; i<bingo.length; i++) {
			for(int j=0; j<bingo[i].length; j++) {
				bingo[i][j] = itr.next();
				System.out.print(bingo[i][j] + "\t");
			}
			System.out.println();
		}
		
	}
}

'JAVA' 카테고리의 다른 글

chapter11-1 : reference-arry test  (0) 2023.05.16
chapter24 : io  (0) 2023.05.16
chapter22 : Generic  (0) 2023.05.16
chapter21 : thread  (0) 2023.05.16
chapter20 : api  (0) 2023.05.16