▶ 들어가기 전에..

   컬렉션의 대부분의 내용은 자바의 정석 강의을 보고 공부하고 있습니다.
   영상 내용 중 중요한 것을 작성했으나 제가 쓴 부분이 오류가 있을 수 있으니 오류가 있으면 댓글 부탁드립니다.

 

1. 컬렉션 프레임웍(Collection Framework)의 이해

https://www.youtube.com/watch?v=z9GpUGoYCw4

■ 용어 

▶ 컬렉션 (모아놨다)

▶ 프레임웍(정형화된 틀) : 라이브러리 + 프로그래밍 방식

    *라이브러리 : 다른 사람이 이미 만들어 놓은 걸 모아논 곳(라이브러리=도서관). 기능만 제공한다(ex. JavaAPI)

▶ 컬렉션 프레임웍 : 다수의 객체를 다루기 위한 표준화된 프로그래밍 방식 

    *객체 = 데이터 

    - java.util 패키지에 포함. (JDK2.0부터)

▶ 컬렉션 클래스

 

■ 컬렉션 프레임웍의 핵심 인터페이스

공통 인터페이스 순서 중복
Collection List O O 대기자 명단(1.홍길동/2.김길동...)
Set(집합) X X 네 발 동물 집합, 양의 정수 집합 
- Map X 키X, 값O 우편변호, 지역변호(전화번호), 아이디/패스워드

 

2. Collection인터페이스의 메소드

https://www.youtube.com/watch?v=RscGmop2Bzo 

■ Collection 인터페이스 _ 검색/추가/삭제/기타

  메소드 설명
검색 boolean contains(Object o)
boolean containsAll(Collection c)
지정된 객체가 있는지 확인
지정된 컬렉션의 객체들이 있는지 확인
추가 boolean add(Object o)
boolean addAll(Collection c)
지정된 객체 추가
지정된 컬렉션의 객체들을 추가
삭제 boolean remove(Object o)
boolean removeAll(Collection c)
boolean retainAll(Collection c)
void clear()
지정된 객체 삭제
지정된 컬렉션에 포함된 객체들을 삭제
지정된 컬렉션 외의 객체를 삭제
컬렉션의 모든 객체 삭제
기타 int size()
boolean isEmpty()
Iterator iterator()
Object[] toArray()
Object[] toArray(Object[] a)
컬렉션에 저장된 객체의 갯수를 반환
컬렉션이 비어있는지 확인
컬렉션의 iterator를 얻어서 반환
컬렉션에 저장된 객체를 Object타입 객체배열로 반환
컬렉션에 저장된 객체를 저장해서 반환

 

■ List 인터페이스(순서O/중복O) _ 검색/추가/삭제/읽기/변경/추출/정렬

  메소드 설명
검색 int indexOf(Object o)
int lastIndexOf(Object o)
지정된 객체의 위치를 첫번째부터 찾아 반환
지정된 객체의 위치를 마지막부터 찾아 반환
추가 void add(int index, Object element)
boolean addAll(int index, Collection c)
지정된 위치에 객체를 추가
지정된 위치에 컬렉션에 있는 객체를 추가
삭제 Object remove(int index) 지정된 위치의 객체 삭제
읽기 Object get(int index) 지정된 위치에 있는 객체를 반환
변경 Object set(int index, Object element) 지정된 위치에 객체를 저장
추출 List subList(int fromIndex, int toIndex) 지정된 범위부터의 객체를 List로 반환
정렬 void sort(Comparator c) 지정된 비교자로 List를 정렬

 

■ Set 인터페이스(순서X/중복X)_메소드는 컬렉션과 동일+집합 관련 메소드

- addAll(Collection c) : boolean [합집합]

- containsAll(Collection c) : boolean [부분집합]

- removeAll() [차집합]

- retainAll() [교집합]

 

■ Map 인터페이스(순서X/중복-키X,값O)

  메소드 설명
검색 boolean containsKey(Object key)
boolean containsValue(Object value)
Object get(Object key)
key가 있는지 확인
value가 있는지 확인
key를 가진 객체 반환
추가 Object put(Object key, Object value)
void putAll(Map t)
Map에 value객체를 key객체에 맵핑해서 저장
Map에 모든 key-value쌍 추가
삭제 Object remove(Object key) key를 가진 key-value삭제
읽기 Set keySet()
Set entrySet()
Collection values()
모든 key객체 반환
모든 key-value쌍을 Map.Entry형식으로 하여 Set로 반환
모든 value객체 반환

 

1. 알고리즘이란?

https://why-dev.tistory.com/6?category=917883 

 

[컴퓨터 공학_복습] 알고리즘 정의, 검색과 정렬 알고리즘

▼ 부스트 코스의 컴퓨터 공학 내용을 복습 & 요약한 내용입니다. https://www.boostcourse.org/cs112 부스트코스의 컴퓨터 공학을 수강 중인데, 알고리즘 부분 내용이 잘 이해가 가지 않아서ㅠㅠ 스스로

why-dev.tistory.com

 

2. 정렬

- 정의 : 이름,학번,키 등 핵심항목(key)의 대소관계에 따라 순서대로 값을 나열하는 것

- 안정성 : 키값이 같은 요소의 순서가 정렬 후에도 유지되는 것

   (ex. 같은 점수를 지닌 두 학생에 대해 학번으로 순번을 지정)

- 내부 정렬과 외부 정렬 : 정렬할 모든 데이터를 하나의 배열에 저장할 수 있을 때에 내부 정렬을 사용한다. 

- 정렬의 속도 비교 : 

https://youtu.be/ZZuD6iUe3Pc

 

3. 버블정렬, 선택정렬, 삽입정렬

  - Big O는 셋 다 n^2이지만, 속도는 다르다.
  - (정렬이 안 된 자료들을 정렬할때) 버블정렬 보다는 선택정렬이 교환횟수가 적어서 상대적으로 더 빠르다. 
  - (이미 정렬이 어느 정도 된 경우) 삽입정렬을 쓰는 것이 좋다

 

1) 버블정렬 

원리 ) 안쪽에서 두개의 값을 비교한다 
       --> 한 줄 비교가 다 끝나면 마지막 값이 가장 큰 값(또는 가장 작은 값)
       --> 안 쪽은 n-1-i 만큼 두개씩 비교 & swap하면 된다.
       바깥쪽에서 이 과정을 n-1만큼 반복한다.

[코드]

package _02_정렬;

import java.util.Arrays;

public class _04_BubbleSort {

	public static void main(String[] args) {
		
		int[] arr = new int[10];
		
		random(arr);
		
		System.out.println(Arrays.toString(arr));
		
		//오름차순 버블 정렬을 구현하라
		int tmp;
		for (int i = 0; i < arr.length-1; i++) {
			for (int j = 0; j < arr.length-1-i; j++) {
				if (arr[j] > arr[j+1]) {
					tmp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = tmp;
				}
			}
		}
		System.out.println(Arrays.toString(arr));
		
		//내림차순 버블 정렬을 구현하라
		for (int i = 0; i < arr.length-1; i++) {
			for (int j = 0; j < arr.length-1-i; j++) {
				if (arr[j] < arr[j+1]) {
					tmp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = tmp;
				}
			}
		}
		System.out.println(Arrays.toString(arr));

	}
	
	public static int[] random(int[] arr) {
		
		OUTER :
		for (int i = 0; i < arr.length; i++) {
			
			arr[i] = (int)(Math.random()*10)+1;
			
			for (int j = 0; j < i; j++) {
				
				if (arr[j] == arr[i]) {
					i--;
					continue OUTER;
				}
			}
		}
		
		return arr;
		
	}

}

>> 결과

[10, 3, 8, 9, 4, 1, 7, 5, 2, 6]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

 

2) 선택정렬 

원리 ) i index를 min(or max)으로 지정하고, 나머지 값들을 하나씩 비교한 뒤, 교환한다.

[코드]

package _02_정렬;

import java.util.Arrays;

public class _05_SelectionSort {

	public static void main(String[] args) {

		int[] arr = new int[10];
		
		random(arr);
		
		System.out.println(Arrays.toString(arr));
		
		//오름차순 선택정렬을 구현하라
		int min, tmp;
		for (int i = 0; i < arr.length-1; i++) {
			min = i; // 하나의 요소를 min으로 선택(이 값보다 작은 값을 찾는다)
			for (int j = i+1; j < arr.length; j++) {
				if (arr[j] < arr[min]) {
					min = j;
				}
			}
			//i위치값과 min값을 swap
			tmp = arr[i];
			arr[i] = arr[min];
			arr[min] = tmp;
		}
		System.out.println(Arrays.toString(arr));
		
		//내림차순 선택정렬을 구현하라
		int max;
		for (int i = 0; i < arr.length-1; i++) {
			max = i;
			for (int j = i+1; j < arr.length; j++) {
				if (arr[j] > arr[max]) {
					max = j;
				}
			}
			//i위치값과 max값을 swap
			tmp = arr[i];
			arr[i] = arr[max];
			arr[max] = tmp;
		}
		System.out.println(Arrays.toString(arr));

	}
	
	public static int[] random(int[] arr) {
		
		OUTER :
		for (int i = 0; i < arr.length; i++) {
			
			arr[i] = (int)(Math.random()*10)+1;
			
			for (int j = 0; j < i; j++) {
				
				if (arr[j] == arr[i]) {
					i--;
					continue OUTER;
				}
			}
		}
		
		return arr;
		
	}

}

>> 결과

[2, 9, 8, 5, 10, 1, 6, 4, 3, 7]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

 

3) 삽입 정렬 (Insertion Sort)

- 거의 다 정렬된 상태의 데이터를 다시 정렬할 때, 가장 효과적인 알고리즘 (위 정렬 속도 비교 확인)

- 원리 : 아직 정렬되지 않은 부분의 첫번째 요소를 정렬한 부분의 알맞은 위치에 삽입한다.

- 장점 : 정렬이 되었거나 또는 그 상태에 가까우면 정렬 속도가 아주 빠름

- 단점 : 삽입할 곳이 멀리 떨어지면 이동(대입)하는 횟수가 많다

   (ex. 0~10까지 중 0제외 나머지는 정렬된 상태이나, 0값이 인덱스의 끝에 위치)

[코드]

package _02_정렬;

import java.util.Arrays;

public class _02_InsertionSort {

	public static void main(String[] args) {
		int[] arr = new int[10];
		
		random(arr);
		
		System.out.println(Arrays.toString(arr));
		
		//오름차순 삽입정렬을 구현하라
		int tmp;
		for (int i = 1; i < arr.length; i++) {
			tmp = arr[i];
			int j;
			
			for (j = i; j > 0 && arr[j-1] > tmp; j--) {
				arr[j] = arr[j-1];
			}
			arr[j] = tmp;	
		}
		System.out.println(Arrays.toString(arr));
		
		//내림차순 삽입정렬을 구현하라
		for (int i = 1; i < arr.length; i++) {
			tmp = arr[i];
			int j;
			for (j = i; j > 0 && arr[j-1] < tmp; j--) {
				arr[j] = arr[j-1];
			}
			arr[j] = tmp;
		}
		System.out.println(Arrays.toString(arr));
	}
	
	public static int[] random(int[] arr) {
		
		OUTER :
		for (int i = 0; i < arr.length; i++) {
			
			arr[i] = (int)(Math.random()*10)+1;
			
			for (int j = 0; j < i; j++) {
				
				if (arr[j] == arr[i]) {
					i--;
					continue OUTER;
				}
			}
		}
		
		return arr;
		
	}

}

>> 결과

[3, 1, 6, 4, 10, 2, 5, 7, 9, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

 

4. 셸 정렬 (Shell Sort)

 

 

[ 출처 ]

- 자바의 정석, 남궁성

- Do it! 자료구조와 함께 배우는 알고리즘 입문 [자바편], bogyoh shibata지음

- 기타 : 유투브

+ Recent posts