멀티캠퍼스 백엔드 과정 19일차[6월 28일] - 컬렉션

GoldenDusk·2023년 7월 3일
0

컬렉션

1. 컬렉션 프레임워크

컬렉션 프레임워크

  • 널리 알려진 자료구조=컬렉션를 바탕으로 객체들을 효율적으로 추가, 삭제, 검색 할 수 있도록 관련 인터페이스와 클래스들을 포함
  • java.utill 패키지 포함⇒ (컬렉션 프레임워크) Collection(수집, 저장) + Framework(뼈대, 구조)
  • 주요 인터페이스 : List, Set, Map
    • Collection
      • List
        • 순서를 유지하고 저장
        • 중복 저장 기능
        • ArrayList, Vector, LinkedList
      • Set
        • 순서를 유지하지 않고 저장
        • 중복 저장 안됨
        • HashSet, TreeSet
    • Map
      • key, value 쌍(엔트리) 형태
      • value : 중복 허용, key 중복 불가

2. List 컬렉션

List 컬렉션

  • 객체를 인덱스로 관리하기 때문에 객체를 저장하고 인덱스가 부여되고, 인덱스로 객체를 검색 삭제할 수 있는 기능 제공

예제

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

public class BoardEx
{
	public static void main(String[] args) {
		// 게시물의 특성은 글쓴 일자/시간별로 순서대로 저장되므로 Borad(한 개의 글의 단위)저장 관리(수정, 검색, 삭제, 갱신, 추가) 제공
		List<Board> boardlist = new ArrayList<Board>();
		
		boardlist.add(new Board("제목1:컬렉션 프레임워크", "내용 : 자바의 자료 구조이다. 객체를 효율적으로 관리할 수 있다.", "sym"));
		boardlist.add(new Board("제목2:컬렉션 프레임워크", "내용 : 자바의 자료 구조이다. 객체를 효율적으로 관리할 수 있다.", "sym"));
		boardlist.add(new Board("제목3:컬렉션 프레임워크", "내용 : 자바의 자료 구조이다. 객체를 효율적으로 관리할 수 있다.", "sym"));
		boardlist.add(new Board("제목4:컬렉션 프레임워크", "내용 : 자바의 자료 구조이다. 객체를 효율적으로 관리할 수 있다.", "sym"));
		boardlist.add(new Board("제목5:컬렉션 프레임워크", "내용 : 자바의 자료 구조이다. 객체를 효율적으로 관리할 수 있다.", "sym"));
	
	
		// 전체 게시판(boardlist)의 글(Board) 목록 개수
		int size = boardlist.size();
		System.out.println("총 글목록 수 : " +size);
		
		// 특정 인덱스의 객체 가져오기(search : 조회)
		Board board = boardlist.get(2);
		System.out.println(board.getSubject() + " "+ board.getContent()+" "+ board.getWriter());
		
		// 모든 글(Board)를 하나씩 가져오기
		for(Board board1:boardlist) {
			System.out.println(board1.getSubject() +" "+board.getContent()+" "+board.getWriter());
	}
	System.out.println();
	boardlist.remove(2);
	
	// 인덱스 3 사라짐
	for(Board board1:boardlist) {
		System.out.println(board1.getSubject() +" "+board.getContent()+" "+board.getWriter());
}
}
}

ArrayList

ArrayList

  • ArrayList 객체를 추가하면 내부 배열에 객체가 저장되고 제한 없이 객체 추가 가능
  • 객체의 번지 저장, 동일한 객체를 중복 저장 시 동일한 번지 저장, null 저장 가능
  • ArrayList 컬렉션에 객체 추가 시 인덱스 0번부터 차례로 저장
    • 특정 인덱스의 객체를 제거하거나 삽입하면 전체가 앞/뒤로 1씩 당겨지거나 밀림
    • 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 바람직하지 않음

예제

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

public class ArrayListEx1
{

	public static void main(String[] args)
	{
		// 1. ArrayList 타입 list1을 생성하시오
		ArrayList<Integer> list1 = new ArrayList<Integer>();
		// 2. lis1에 1, 2, 3, 4, 5 값을 랜덤하게 추가해주세요.
		list1 .add(1);
		list1 .add(3);
		list1 .add(2);
		list1 .add(5);
		list1 .add(2);
		list1 .add(4);
		// 3, list1을 print()이용해서 출력
		//print(list1);
		
		// 4. ArrayList list2를 생성하는데. list1의 인덱스 1부터 3까지의 값을 가져와서 list2를 생성
		ArrayList<Integer> list2 = new ArrayList(list1.subList(1, 4));
		print(list1, list2);
		
		//5. 요소가 다 포함되어 있는지 확인 containsAll
		System.out.println("list1에 list2의 요소가 모두 포함되어 있나요? "+ list1.containsAll(list2));
		
		// 6. list1에서 list2와 겹친는 부분만 남기고 나머지는 삭제
		System.out.println("list1에 list2의 요소만 남기고 다른 요소 삭제 "+list1.retainAll(list2));
		print(list1, list2);
		
		// 7. list2에서 list1에 포함된 객체들을 삭제, 인덱스를 뒤부터 요소 검사하며 삭제
		for(int i = list2.size()-1; i>=0; i--) {
			if(list1.contains(list2.get(i))) {
				list2.remove(i);
			} //get(i) 하나씩 값을 뱉어줌
		} // list2는 빈리스트(empty 리스트)
		print(list1, list2);
	}
	
	static void print(ArrayList arr1, ArrayList arr2) {
		//ArrayList a1 = (ArrayList)arr1;
		System.out.println("list1 : "+arr1);
		System.out.println("list2 : "+arr2);
		//for(Integer i : a1) {
			//System.out.println(i);
		//}
	}

}

예제 2

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

public class ArrayListEx2
{

	public static void main(String[] args)
	{
		// 긴 문자열을 분리하는 기능을 이용하여 저장
		final int LIMIT = 10; //자르고자 하는 숫자 지정
		String source = "0123456789abcdefghiABCDEFGHIJ!@#$%^&()_";
		int length = source.length();
		List list = new ArrayList(length/LIMIT+10);
		System.out.println(list);
		
		for(int i = 0; i<length; i+=LIMIT) {
			if(i+LIMIT < length) list.add(source.substring(i, i+LIMIT));
			else list.add(source.substring(i));
		}
		for(int i=0; i<list.size(); i++) {
			System.out.println(list.get(i));
		}
		System.out.println(list.size()); // 4
		
		/*String source1 = "ABCDEFGHIJK";
		System.out.println(n); //아스키 코드 보는 법
		  for (int i = 0; i < list.size(); i++) {
			  if(i+LIMIT < length) list.add(source1.substring(i, i+LIMIT));
				else list.add(source.substring(i));
	        }

		  for(int i=0; i<list.size(); i++) {
				System.out.println(list.get(i));
			}*/
		
		// A부터 Z까지 10씩 출력해봄 
		source =" ";
		for (char ch = 'A'; ch <= 'z'; ch++) {
            source += ch;
        }
		
		length = source.length();
		 List<String> list1 = new ArrayList<>(length / LIMIT + 10);
		 
        for (int i = 0; i < length; i += LIMIT) {
            if (i + LIMIT < length) {
                list1.add(source.substring(i, i + LIMIT));
            } else {
                list1.add(source.substring(i));
            }
        }

        for (int i = 0; i < list1.size(); i++) {
            System.out.println(list1.get(i));
        }

    }
		
}

LinkedList

  • 인접 객체를 체인처럼 연결해서 관리하므로 객체 삭제와 삽입이 빈번한 곳에서 ArrayList보다 유리

예제

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class ArrayListLinkedTest
{

	public static void main(String[] args)
	{
		ArrayList array = new ArrayList(2000000);
		LinkedList link = new LinkedList();
		
		System.out.println("순차적으로 객체를 추가");
		System.out.println("array 추가 "+add1(array));
		System.out.println("link 추가 "+add2(link));
		System.out.println();
		
		System.out.println("== 중간에 추가하기 =="); // 값이 달라짐
		System.out.println("array 추가 "+add2(array));
		System.out.println("link 추가 "+add2(link));
		System.out.println();
	}
	
	static long add1(List array) {
		long start = System.currentTimeMillis();
		for(int i=0; i<1000000; i++) {
			array.add(i+" ");
		}
		long end = System.currentTimeMillis();
		return end-start;
	}
	
	static long add2(List link) {
		long start = System.currentTimeMillis();
		for(int i=0; i<1000000; i++) {
			link.add(500+"X");
		}
		long end = System.currentTimeMillis();
		return end-start;
	}

}

3. Set 컬렉션

Set 컬렉션

  • Set 컬렉션은 저장 순서가 유지되지 않음
  • 객체를 중복해서 저장할 수 없고, 하나의 null만 저장 가능(수학의 집합 개념)
import java.util.HashSet;
import java.util.Set;

public class HashSetEx
{

	public static void main(String[] args)
	{
		Set<String> set = new HashSet<String>();
		
		// 객체 저장
		set.add("Java");
		set.add("Java"); //중복객체이므로 저장하지 않음
		set.add("JDBC");
		set.add("JSP");
		set.add("Springboot");
		
		//저장된 객체 수 출력
		System.out.println(set.size() ); //4 => 동일 객체 저장 x

	}

}

HashSet

  • 동등 객체를 중복 저장하지 않음
  • 다른 객체라도 hasCode() 메소드의 리턴값이 같고, equals() 메소드가 true를 리턴하면 동일한 객체로 판단함

예제

  • iterator 중요!
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Member extends Object
{
	private String name;
	private int age;
	
	public Member() {};
	public Member(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public String getName()
	{
		return name;
	}
	public int getAge()
	{
		return age;
	}
	// Object 클래스의 hashCode() 재정의(name과 age값이 같으면 동일한 hasCode가 리턴되도록 한다. 
	// name.hasCode()+age 리턴
	@Override
	public int hashCode()
	{
		return name.hashCode()+age;
	}
	// //Object 클래스의 equals()	재정의 (name과 age값이 같으면 true 리턴되도록 합니다.)
	@Override
	public boolean equals(Object obj)
	{
		Member member = (Member) obj;
		if(name.equals(member.name)&&age==member.age) {
		return true;
		}
		return false;
		
		/*
		 * // 2, 번째 방법 if(obj instanceof Member target) {
		 *  returntarget.name.equals(this.name)&&(target,age==this.age); } 
		 *  else {return false;}
		 */
	}
	
public static void main(String[] args) {
		
		Set<Member> set = new HashSet<Member>();
		
		set.add(new Member("홍길동",30));
		set.add(new Member("홍길동",30));
		
		System.out.println(set.size());  
		// set은 인덱스가 존재하지 않기 때문에, get(i) 기능이 없다. 반복자 iterator
		
		//iterator 패턴 익히기!, set은 Member, get 안써도 괜찮음
		Iterator<Member> it = set.iterator();
		while(it.hasNext()) {
			Member element = it.next();
			System.out.println(element.getName()+" "+element.getAge());
		}
		
		for(Member m : set) System.out.println(m.getName()+" "+m.getAge());
	 	
		
	}
	
}

4. Map 컬렉션

Map 컬렉션

  • 키와 값으로 구성된 엔트리 객체를 저장
  • 키는 중복 저장할 수 없지만 값은 중복 저장 가능, 기존에 저장된 키와 동일한 키로 값을 저장하면 새로운 값으로 대치

예제

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

public class HashMapEx
{

	public static void main(String[] args)
	{
		// Map 컬렉션 생성
		Map<String, Integer> map = new HashMap();
		
		map.put("김진주", 90);
		map.put("이성민", 88);
		map.put("강진호", 70);
		map.put("박병호", 89);
		map.put("장지호", 70);
		map.put("장지호", 80); //key는 중복 허용하지 않음

		System.out.println("map 길이 : "+map.size());
		
		//키를 이용하여 값을 리턴
		String key = "박병호";
		int value = map.get(key);
		System.out.println(key+"학생의 점수는 "+value);
		System.out.println();
		
		// 키 set 컬렉션을 얻어와 map의 키 값을 얻기 iterator 사용하기
		Set<String> keySet = map.keySet(); 
		Iterator<String> keyIt = keySet.iterator();
		while(keyIt.hasNext()) {
			String k = keyIt.next();
			Integer v = map.get(k); //k(key)을 통해 값을 가져올 수 있다.
			System.out.println(k+" "+v);
		}
		System.out.println();
		
		// 엔트리 Set 컬렉션을 얻고, 반복해서 키와 값을 가져오기
		Set<Entry<String, Integer>> entrySet = map.entrySet();
		Iterator<Entry<String, Integer>> it = entrySet.iterator();
		while(it.hasNext()) {
			Entry<String, Integer> entry = it.next();
			String k = entry.getKey();
			Integer v = entry.getValue(); //k(key)을 통해 값을 가져올 수 있다.
			System.out.println(k+" "+v);
		}
	}

}

회고

뭔가... 컬렉션은 처음 배우는 기분 컬렉션은 앞단원이랑 이어지는 거라 몇 번 더 봐야 할 듯하다... 자바 배운지 2주인가? 밖에 안됐는데 벌써 내일부터는 오라클 sql 나간다고 한다. 학교에서는 자바만 1년 배운것 같은데 자바 잊지 않게 복습하자!!!

profile
내 지식을 기록하여, 다른 사람들과 공유하여 함께 발전하는 사람이 되고 싶다. gitbook에도 정리중 ~

0개의 댓글