본문 바로가기
Language/Java

[Java] 자바기초 - 컬렉션(Collection)

by J4J 2020. 12. 31.
300x250
반응형

안녕하세요. J4J입니다.

 

이번 포스팅은 컬렉션에 대해 적어보는 시간을 가져보려고 합니다.

 

 

컬렉션이란?

 

컬렉션이라고 하는 것은 자바에서 데이터를 유용하게 담기 위해 만들어 둔 인터페이스로 컬렉션 프레임워크라고도 많이 부릅니다.

 

말 그대로 인터페이스이기 때문에 사용자들이 사용하기 위해서는 인터페이스를 상속받아 정의해 둘 필요가 있었고 정의된 클래스들을 자바에서 제공하여 언제 어디서든 사용할 수 있습니다.

 ※ 인터페이스에 대해 모르신다면? [Java] 자바기초 - 추상클래스와 인터페이스(abstract/interface)

 

 

종류

 

컬렉션의 종류는 List, Set, Map 총 3가지가 있습니다.

 

이 3개는 모두 인터페이스이기 때문에 위에 말씀드린 것처럼 해당 인터페이스를 상속받아 구현시켜둔 클래스들이 다양하게 존재합니다.

 

그중 자주 사용되는 몇 가지들만 소개해보겠습니다.

 

 

List

 

List를 상속받아 구현된 클래스 중 대표적인 것은 ArrayList와 LinkedList가 있습니다.

 

ArrayList는 크기가 정해지지 않은 배열로 배열처럼 선언할 때 크기를 정해두는 것이 아니어서 유동적으로 데이터를 집어넣고 빼고 할 수 있습니다.

 

LinkedList는 사람들이 손잡고 일렬로 나열한 것처럼 리스트에 저장되는 요소끼리 연결되어 있는 리스트입니다

 

주로 사용되는 메서드는 다음과 같습니다.

 

리턴 타입 메서드 설명
boolean add(E e) 요소를 추가한다.
E get(int index) index번째에 있는 요소를 탐색한다.
E remove(int index) index번째에 있는 요소를 삭제하고 반환한다.
void clear() 리스트에 있는 요소를 모두 삭제한다.
boolean contains(Object o) o라는 요소가 포함되어 있는지를 확인한다.
boolean isEmpty() 요소가 비어있는지 확인한다.
int size() 요소의 갯수를 구한다.
void sort(Comparator <? super E> c c의 요건에 맞게 리스트를 정렬한다.

 

 

표를 보시고 어? E라는 타입도 있었나? 라는 생각을 하시는 분들은 [Java] 자바기초 - 제네릭(Generic)를 방문하시면 됩니다.

 

그리고 표에 적어둔 메서드뿐만 아니라 유용한 메서드들이 더 많이 있으니 시간 나실 때 다른 메서드들을 확인하시고 유용하게 사용될 메서드를 찾아 사용하시는 걸 추천드립니다.

 

위의 메서드를 이용하여 간단히 List를 사용해보겠습니다.

 

package collection;

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

public class ListType {
	public static void main(String[] args) {
		List<Integer> integerList = new ArrayList<Integer>();
		integerList.add(3);
		integerList.add(4);
		integerList.add(5);
		integerList.add(6);
		System.out.println(integerList.remove(0)); // 3
		System.out.println(integerList.get(2)); // 6
		
		Queue<Double> doubleQueue = new LinkedList<Double>();
		doubleQueue.add(3.5);
		doubleQueue.add(5.3);
		System.out.println(doubleQueue.poll()); // 3.5, top 제거
		System.out.println(doubleQueue.peek()); // 5.3, top 제거되지 않음
		System.out.println(doubleQueue.isEmpty()); // false, 사이즈는 1
	}
}

 

 

코드를 보시면 ArrayList를 생성할 때 객체지향 프로그래밍의 특징 중 하나인 다형성을 이용하였고 제네릭도 사용되어 정수 값만 담을 수 있게 인스턴스를 생성했습니다.

 ※ 다형성에 대해 모른다면? [Java] 자바기초 - 객체지향(OOP) - 다형성(Polymorphism)

 

사용된 메서드는 add, remove, get이 있는데 add 같은 경우는 요소를 추가할 때 리스트의 맨 뒤에 추가하고 remove는 index에 맞는 값을 제거하며 리턴해주고 get은 index에 맞는 값을 찾아 리턴해줍니다. (index는 배열과 동일하게 맨 처음 index 값이 0입니다.)

 

메서드의 순서에 따라 그림으로 표현하면 다음과 같습니다.

 

 

 

그리고 추가적으로 Queue를 사용한 코드도 있는데 Queue도 인터페이스로 구현되어 있기 때문에 Queue를 상속받아 구현된 LinkedList를 이용하여 인스턴스를 생성할 수 있습니다.

 

사용된 메서드만 간단히 설명을 드리자면 add와 isEmpty는 ArrayList와 동일하고 poll은 top에 있는 값을 제거, peek은 top에 있는 값을 탐색합니다.

 

 

Set

 

 

728x90

 

 

Set을 상속받아 구현된 클래스 중 대표적인 것은 HashSet과 TreeSet이 있습니다.

 

HashSet은 Hashing을 이용하여 구현된 것이고 TreeSet은 Tree를 이용하여 구현된 것입니다.

 

Hash와 Tree는 사용할 때 별반 다를 것이 없지만 저 같은 경우는 Hash가 Tree보다 더 성능이 좋기 때문에 Hash를 보통 사용하는 편입니다.

 

그리고 Set에는 특이한 점이 있는데 요소를 저장할 때 중복 건에 대해서는 추가적인 저장을 하지 않습니다.

 

또한 리스트와 같이 요소를 추가할 때 맨 뒤에 추가되는 것이 아니라 사용하는 클래스마다 구현된 적재 방식에 따라 순서가 섞이며 저장됩니다.

 

주로 사용되는 메서드는 다음과 같습니다.

 

리턴 타입 메서드 설명
boolean add(E e) 요소를 추가한다.
boolean remove(Object o) o라는 요소가 있을 시 삭제한다.
void clear() 리스트에 있는 요소를 모두 삭제한다.
boolean contains(Object o) o라는 요소가 포함되어 있는지 확인한다.
boolean isEmpty() 요소가 비어있는지 확인한다.
int size() 요소의 개수를 구한다.

 

 

Set은 대표적으로 한 문장에서 문자열이 몇개 사용되었는지를 확인할 때 사용되는데 코드를 작성하여 보여드리겠습니다.

 

package collection;

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

public class SetType {
	public static void main(String[] args) {
		Set<String> hashSet = new HashSet<String>();
		String stringVal = "Hello This is Java Programming. Hello Hello really happy Java";
		
		String[] splitStr = stringVal.split(" "); // {"Hello", "This" ,"is", "Java", "Programming.", "Hello", "Hello", "really", "happy", "Java"}
		for(int i=0; i<splitStr.length; i++) {
			String str = splitStr[i];
			
			hashSet.add(str);
		}
		
		System.out.println(hashSet.size()); // 7
	}
}

 

 

코드를 보시면 split된 문자열은 총 10개 이지만 실질적으로 사용된 문자열은 "Hello", "This", "is", "Java", "Programming.", "really", "happy" 까지 총 7개 입니다.

 

적재된 건에 대한 추가 적재가 되지않는 Set의 특징 때문에 "Hello" 2개와 "Java" 1개에 대해서는 적재가 이루어지지 않는 것을 확인할 수 있습니다.

 

 

Map

 

Map을 상속받아 구현된 클래스 중 대표적인 것은 HashMap과 TreeMap이 있습니다.

 

Map도 Set과 동일하게 Hash와 Tree를 사용하여 만든 Map들이 있고 저는 Set과 동일한 이유로 HashMap을 자주 사용하는 편입니다.

 

Map만이 가지고 있는 특징은 key-value의 값을 저장한다는 것입니다.

 

Key와 Value에 들어가는 타입을 각각 지정하여 key에 맞는 value를 찾아내는 것을 목적으로 사용됩니다.

 

그리고 Set과 동일한 점은 요소를 추가할 때 순서대로 추가되지 않는 것이고 비슷한 점은 동일한 key값을 추가시킬 경우 새로운 value값이 이전의 value값을 덮어버린다는 겁니다.

 

주로 사용되는 메서드는 다음과 같습니다.

 

리턴 타입 메서드 설명
V put(K key, V value) 요소를 추가한다.
V get(Object key) key에 맞는 value값을 탐색한다.
V remove(Object key) key에 맞는 요소를 삭제하고 value를 반환한다.
void clear() 맵에 있는 요소를 모두 삭제한다.
boolean containsKey(Object key) key라는 요소가 Key에 포함되어 있는지 확인한다.
boolean containsValue(Object value) value라는 요소가 Value에 포함되어 있는지 확인한다.
Set<K> keySet() Key의 요소들만 추출한다.
boolean isEmpty() 요소가 비어있는지 확인한다.
int size() 요소의 개수를 구한다.

 

 ※ key는 변수값, Key는 Map에 들어있는 key전체를 의미. value와 Value도 동일

 

 

Map은 대표적으로 문자열의 갯수를 구할 때 사용되는데 코드로 보여드리겠습니다.

 

package collection;

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

public class MapType {
	public static void main(String[] args) {
		Map<String, Integer> hashMap = new HashMap<String, Integer>();
		String stringVal = "This is This that";
		
		String[] splitStr = stringVal.split(" "); // {"This", "is", "This", "that"}
		for(int i=0; i<splitStr.length; i++) {
			String str = splitStr[i];
			
			if(hashMap.containsKey(str)) { // Key로 포함되어 있던 값이면
				hashMap.put(str, hashMap.get(str)+1); // Key에 맞는 Value값에 1을 더한 뒤 다시 집어넣기
			} else { // Key로 포함되어 있지 않다면
				hashMap.put(str, 1); // Key에 맞는 Value를 1로 한 뒤 집어넣기
			}
		}
		
		System.out.println(hashMap.get("This")); // 2
		System.out.println(hashMap.get("is")); // 1
		System.out.println(hashMap.get("that")); // 1
	}
}

 

 

위의 코드에서 유심히 보셔야 될 부분은 if-else구문인데 그림으로 표현하면 다음과 같습니다.

 

Map 예시

 

 

처음 This가 들어올 때는 Map에 저장되어 있지 않아 value가 1인 값으로 저장이 되고 is가 들어올 때도 동일합니다.

 

하지만 다시 This가 들어올 땐 Map에 저장되어 있기 때문에 value값을 확인하고 value값에 1을 더해 다시 저장함으로 써 기존의 값을 덮어씌워 버리게 됩니다.

 

이후에 that이 들어올 때는 처음과 동일하게 value가 1인 값으로 저장이 됩니다.

 

이처럼 컬렉션은 각각의 특성들을 가지고 있고 또한 자바 프로그래밍을 할 때 많이 사용되는 것 중에 하나이기 때문에 제대로 이해하고 넘어가시는 것을 추천드립니다.

 

 

정리

 

컬렉션은 데이터를 유용하게 담기 위해 미리 구현해 둔 인터페이스
인터페이스를 상속받은 다양한 클래스들이 정의되어 있음
컬렉션의 종류는 List, Set, Map 총 3가지
List는 들어온 순서대로 적재되며 나열되는 특징이 있음
Set은 들어온 순서와 상관없이 적재되며 중복 건에 대해서는 적재되지 않음
Map은 key-value의 형태로 순서와 상관없이 적재, 중복건은 이전 데이터를 덮어씀

 

 

 

이상으로 컬렉션에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

728x90
반응형

댓글