티스토리 뷰

컬렉션 ( Collection ) 이란 ?

목록성 데이터를 처리하는 자료구조들의 집합

 

  • 배열은 처음 만들 때 크기가 고정되지만, 컬렉션은 크기가 가변입니다!

  • 또한, 배열은 객체를 삭체하는 경우 해당 인덱스가 비게 되고, 저장할 때 비어있는 곳을 일일이 검색해야합니다.

  • 따라서 컬렉션을 이용하면 객체들을 효율적으로 추가, 삭제, 검색할 수 있게됩니다.

 

컬렉션 인터페이스는 크게 Set, List, Queue로 분류됩니다.

Map은 컬렉션 인터페이스를 상속받고 있지 않지만 컬렉션으로 분류됩니다.

 

1. List

객체를 일렬로 늘어놓은 구조

  • 순서가 있고, 중복이 가능합니다.

  • 객체를 저장하면 자동으로 인덱스를 부여하며, 객체를 인덱스로 관리합니다.

  • 인덱스를 이용해 객체를 검색, 삭제, 수정합니다.

 

ArrayList

  • JAVA에서 가장 많이 사용되는 자료구조입니다.

  • 단방향 포인터 구조

  • 일반 배열과 같이 인덱스로 객체를 관리하지만, ArrayList는 용량이 가변입니다.

  • 특정 인덱스에 객체를 삽입하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩 밀려납니다. ( 비효율적 )

  • 특정 인덱스의 객체를 삭제하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨지면서 빈 인덱스를 채웁니다.

  • 데이터의 조회가 빈번한 경우 데이터에 대한 인덱스를 가지고 있어 유용합니다.

 

생성

List<String> list = new ArrayList<String>();

 

추가

list.add("아이언맨");
list.add("닥터스트레인지");
list.add("스파이더맨");
list.add("토르");

 

수정

list.set(list.indexOf("토르"), "헐크");

 

삭제

list.remove("아이언맨");
list.remove(0);

 

검색

list.get(0);

 

 

List 사용해보기

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

public class ListTest01 {

	public static void main(String[] args) {

		List<String> list = new ArrayList<String>();

		list.add("홍길동");
		list.add("이순신");
		list.add("강호동");
		list.add("이수근");
		list.add("은지원");
		list.add("조규현");
		list.add("송민호");
		list.add("표지훈");
		list.add("유재석");
		list.add("조세호");
		list.add("신동엽");

		prn(list);
		transElement(list);
	}

	public static void prn(List<String> list) {

		System.out.println(list);

		System.out.print("{ ");
		for (int i = 0; i < list.size(); i++) {
			if (i < list.size() - 1)
				System.out.print(list.get(i) + ", ");
			else
				System.out.println(list.get(i) + " }");
		}
	}

	public static void transElement(List<String> list) {

		// 1. 홍길동을 김길동으로 바꾸자
		int index = list.indexOf("홍길동");
		list.set(index, "김길동");
		System.out.println(list);

		// 2. "신"으로 끝나는 객체를 찾아서, 만일 있다면 신->자 로 바꾸자
		for (int i = 0; i < list.size(); i++) {
			if (list.get(i).endsWith("신")) {
				list.set(i, list.get(i).replace("신", "자"));
			}
		}
		System.out.println(list);

		// 3. "호"로 끝나는 객체를 찾아서, 만일 있다면 삭제하자
		for (int i = 0; i < list.size(); i++) {
			if (list.get(i).endsWith("호")) {
				list.remove(i);
			}
		}
		System.out.println(list);
	}
}

 

실행 결과

 

Vector

  • ArrayList와 동일한 내부 구조 ( ArrayList의 구버전)

  • 잘 쓰이지 않습니다.

 

LinkedList

  • ArrayList와 사용방법은 같지만, 내부 구조가 전혀 다릅니다.

  • 양방향 포인터 구조

  • 위치 정보만 가지고 있으며, 체인처럼 관리합니다. ( 한 인덱스는 다음 인덱스의 주소값을 가지고 있습니다. )

  • 데이터의 삽입, 삭제가 빈번한 경우 데이터의 위치 정보만 수정하면 되기 때문에 유용합니다.

ArrayList 와 LinkedList에서 데이터를 삭제했을 때

 


 

2. Set

  • 집합

  • 저장 순서가 유지되지 않고, 객체를 중복해서 저장할 수 없습니다.

  • 인덱스로 관리하지 않기 때문에 인덱스를 파라미터로 갖는 메소드가 없습니다.

  • 전체 객체를 대상으로 한 번씩 반복해서 가져오는 Iterator(반복자)를 제공합니다.

 

HashSet

  • 일반적인 경우

  • 데이터의 순서가 중요하지 않은 경우

  • 동일한 객체는 중복 저장하지 않습니다.

 

TreeSet

  • 순서가 중요한 경우

 

LinkedHashSet

  • 입력 순서가 중요한 경우

 

Set 사용해보기

SetTest01.java

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

public class SetTest01 {

	public static void main(String[] args) {
		
		Set<String> set = new HashSet<String>();
		
		set.add("1");
		set.add("5");
		set.add("2");
		set.add("7");
		set.add("4");
		set.add("4");
		set.add("3");
		
		System.out.println(set); 	// 중복이 안됨, 자동 정렬됨
		
		setFind(set, "5");
		setDelete(set, "5");
		
		System.out.println(set);
	}
	
	
	public static void setDelete(Set<String> set, String del) {
	
		for(String d : set) {
			if(d.equals(del)) {
				set.remove(del);	// ConcurrentModificationException
				System.out.println(d + " 지웠당!");
				break;
			}
		}
	}
	
	public static void setFind(Set<String> set, String find) {
		
		for(String f : set) {
			if(f.equals(find)) {
				System.out.println(f + " 찾았당!");
			}
		}
	}
}

 

실행 결과

 

Set에 있는 데이터를 출력하는 방법

Score.java

package com.score;

public class Score {

	private String name;
	private int kor;
	private int eng;
	private int math;
	
	public Score() {
		
	}
	
	public Score(String name, int kor, int eng, int math) {
		this.name = name;
		this.kor = kor;
		this.eng = eng;
		this.math = math;
	}
	
	public String getName() {
		return this.name;
	}
	
	public void setName(String name) {
		this.name = name;
	}

	public int getKor() {
		return kor;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public int getEng() {
		return eng;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	public int getMath() {
		return math;
	}

	public void setMath(int math) {
		this.math = math;
	}
	
	public int getSum() {
		return kor+eng+math;
	}
	
	public double getAvg() {
		return getSum() / 3.0;
	}
	
	public String getGrade() {
		
		switch((int) getAvg() / 10) {
		
		case 10: case 9:
			return "A";
		case 8:
			return "B";
		case 7:
			return "C";
		case 6:
			return "D";
		default:
			return "F";
		}
	}
	
	@Override
	public String toString() {
		return "이름 : " + name + "\n국어 : " + kor + " 영어 : " + eng + " 수학 : " + math + " 총점 : " + getSum() + " 평균 : " + getAvg() + " 등급 : " + getGrade() + "\n";
	}
}

 

SetTest02.java

package com.test03;

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

import com.score.Score;

public class SetTest02 {

	public static void main(String[] args) {

		Score sc01 = new Score("홍길동", 100, 45, 67);
		Score sc02 = new Score("이순신", 95, 100, 75);
		Score sc03 = new Score("김선달", 61, 89, 100);
		
		Set<Score> set = new HashSet<Score>();
		
		set.add(sc01);
		set.add(sc02);
		set.add(sc03);
		set.add(new Score("조세호", 100, 100, 100));
		
		transElement(set, "조세호", 0);
	}
	
	
	// Set에 있는 데이터 출력하기
	public static void prn(Set<Score> set) {
		
		// 1.
		for(Score sc : set) {
			//System.out.println(sc);
		}
		
		
		// 2.
		Object[] arr = set.toArray();
		for(int i=0; i<arr.length; i++)
			//System.out.println(arr[i]);
		
		for(Object o : arr) {
			//System.out.println(o);
		}
		
		for(Object o : arr) {
			if(((Score)o).getName().equals("조세호")) {	// downcasting
				//System.out.println(((Score)o).getName() + " : " + ((Score)o).getAvg());
			}
		}
		
		
		// 3. Iterator : 컬렉션 저장 요소를 읽어오는 표준화된 방법
		Iterator<Score> ir = set.iterator();
		while(ir.hasNext()) {
			System.out.println(ir.next());
		}
	}
	
	
	public static void transElement(Set<Score> set, String name, int kor) {
		
		// Iterator를 사용하여 set 안의 객체 중 이름이 조세호인 객체를 찾아서 해당 객체의 국어 점수를 파라미터 값으로 바꾸고 전체 출력하자.
		Iterator<Score> ir = set.iterator();
		while(ir.hasNext()) {
			Score s = ir.next();
			if(s.getName().equals(name)) {
				s.setKor(kor);
			}
		}
		
		prn(set);
	}
}

 

실행 결과

 

 


 

3. Map

  • 데이터를 삽입할 때 <Key, Value> 형태로 삽입됩니다.

  • Key로 객체들을 관리합니다.

  • Key는 중복 불가능 / Value는 중복 허용

 

HashMap

  • Map 인터페이스를 구현한 대표적인 Map 컬렉션

  • Key 타입은 주로 String을 많이 사용합니다.

 

 

 

생성

Map<String, Integer> map = new HashMap<String, Integer>();

 

삽입

map.put("백", 100);
map.put("백", 101);	// Key는 중복 불가 -> "백"이라는 Key의 Value가 101로 바뀜 
map.put("백하나", 101);	// Value는 중복 가능

 

삭제 : 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴합니다.

System.out.println(map.remove("백"));	// 101

 

검색 : Key 값으로 Value 값을 리턴합니다.

System.out.println(map.get("백하나"));	// 101

 

주어진 Key 또는 Value가 존재하는 지의 여부 (boolean)

System.out.println(map.containsKey("백하나"));	// true
System.out.println(map.containsValue(100));	// false

 

 

 

Map 사용해보기

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

public class MapTest01 {

	public static void main(String[] args) {
		
		Map<Integer, Integer> map = new HashMap<Integer, Integer>();

		for(int i=111; i<116; i++) {
			map.put(i, i+1000);		// 순서가 없음
		}
		
		map.put(112, 1113);	// 중복이 안됨
		
		System.out.println(map);
		System.out.println(map.get(112));
		
		prn(map);
	}
	
	
	public static void prn(Map<Integer, Integer> map) {
		
		// Entry : key 따로 value 따로 접근할 수 있음
		Set<Map.Entry<Integer,Integer>> entrySet = map.entrySet();
		
		/*
		for(Entry<Integer, Integer> entry : entrySet) {
			if(entry.getValue() == 1113) {
				System.out.println(entry.getKey());
			}
		}
		*/
		
		// Iterator를 사용해서 위의 forEach문과 같은 결과를 출력하자.
		Iterator<Entry<Integer,Integer>> entryIt = entrySet.iterator();
		
		while(entryIt.hasNext()) {
			Entry<Integer, Integer> m = entryIt.next();
			
			if(m.getValue() == 1113) {
				System.out.println(m.getKey());
			}
		}
	}
}

 

실행 결과

최근에 올라온 글
«   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
Total
Today
Yesterday