본문 바로가기
국비지원/JAVA

[JAVA] 21-2. API - java.util pkg (컬렉션 프레임워크)

by cosmog 2022. 10. 25.
반응형
API - java.util pkg(컬렉션 프레임워크)
Generic
  • Template Programming(일반화 프로그래밍)으로 동일한 알고리즘을 사용하는 method나 자료구조의 구현때문에 등장하였다. (요즘은 Template이라는 말을 사용하지 않고 Generic을 많이 사용한다.)
  • data type을 일반화(generalize)하는 것을 의미한다.
  • 형변환의 안정성을 높여주기 위해 사용한다.
  • 용도
    • 자료구조 클래스를 만들 때 모든 자료형의 데이터를 저장할 수 있도록 하기 위해서 사용한다.
    • 특정 자료형의 데이터만 대입받기 위한 용도로도 사용(이 경우는 대부분 템플릿에 인터페이스를 설정)

 

generic을 이용하여 class를 만들어주었다.

package cover;

public class ABC_g <T>{
	
	private T t;
	
	public void set(T t) {
		this.t = t;
	}
	
	public T get() {
		return t;
	}

}

'T'를 타입 변수(type variable)라고 하며, 임의의 참조형 타입을 의미합니다.

T가 아니라 어떠한 문자든 사용하던 상관없다. 여러개 타입 변수는 ,로 구분하여 사용가능하다.

 

//Main에서 generic class로 객체를 생성할 때에는 아래와 같이 사용한다.
Class 이름<data형 지정> 변수명 = new Class 이름<data형 지정>();
//자동으로 뒤에 data형은 앞을 따라가기 때문에 적지않아도 알아서 해준다.
Class 이름<data형 지정> 변수명 = new Class 이름<>();

 

아래와 같이 사용 (Generic 사용 예시)

package cover;

//자료형의 이름을 임시로 만들어두고 내부에서 임시로 만든 자료형을 사용한 후 
//인스턴스를 생성할 때 자료형을 결정하는 방식을 이용
//단 인스턴스를 만들 때 또는 method를 호출할 때 실제 자료형을 기재해야 한다.
//이 때 사용되는 자료형은 Object로 부터 상속받은 클래스의 자료형만 가능하다.
//int와 같은 primitive type의 경우는 Integer와 같은 Wrapper 클래스를 이용해야 한다.
//미지정 자료형의 개수는 제한이 없다.
//인스턴스를 만들 때 자료형을 설정핮 않으면 경고가 발생한다.

class Generics <T>{
	private T [] data;
	//...은 variable args로 개수에 상관없이 매개변수를 받고자 할 때 사용
	// 받은 매개변수들은 배열로 만들어 집니다.
	public Generics(T ... n) {
		this.data = n;
	}
	
	public void display() {
		for(T temp : data) {
			System.out.println(temp);
		}
	}
}

public class TemplateProgramming {

	public static void main(String[] args) {
		//Generic이 적용된 클래스의 인스턴스를 만들 때는 자료형을 기재해야 한다.
		//자료형을 기재하지 않으면 경고가 발생하고 Object타입으로 간주한다.
		
		Generics <String> g1 = new Generics<String>("Karina", "Suzi", "IU");
		g1.display();
		Generics <Integer> g2 = new Generics<>(100, 300, 200, 400);
		g2.display();
	}
}

 

Collection Framework
  • collection은 배열과 유사하지만 저장/조회/수정/삭제하는 작업을 쉽게 처리할 수 있고, 동적인 크기를 갖는다는 장점이 있다(차이점이기도 하다)
  • Set / List / Map등의 interface가 있다. 
  • collection은 자료구조이다.
  • collection (부모클래스)를 상속받는다 Set / List / Map (자식클래스)
List

리스트 구조 : 데이터를 순서대로 연속해서 저장하는 자료구조

1) Arrays(배열임) - List는 아니지만 비교를 위해

  • 크기가 고정인 List
  • 한번 만들면 크기를 변경할 수 없다.
  • 저장된 데이터를 변경하는 것은 가능하지만 데이터를 추가하거나 삭제하는 것은 안된다.
  • 데이터를 추가하거나 삭제를 하고자 하는 경우는 배열을 복사해서 작업을 수행하여야 한다.
  • 불필요한 공간이 없기 때문에 메모리 효율은 높다.
  • 데이터의 크기 변경이 없을 가능성이 높을 때 사용하는 것이 좋다.

2) 구 Vector, 현 ArrayList

  • 크기가 가변인 배열
  • 삽입과 삭제가 어려움
  • List 인터페이스를 구현한 클래스로 데이터를 연속해서 순서대로 저장하는 자료구조 클래스
  • 배열과 달리 크기가 가변이라 데이터를 추가하거나 삭제하는 것이 가능

💡 ArrayList와 Linked List는 장단점이 서로 반대이다
🔹 장점 

  • 데이터만 저장하기 때문에 Linked List보다는 메모리 효율이 좋을 수 있다.
  • 전체 데이터를 순회하는 속도가 Linked List보다는 빠름

🔹 단점 

  • 중간에 데이터를 삽입하거나 삭제할 떄 데이터의 복사 작업이 필요하기 때문에 속도가 느림
  • 연속된 공간이 없으면 생성이 불가


3) Linked List

  • 다음 데이터를 가리키는 구조
  • 순서대로 찾게 되면 포인터가 많아지기 때문에 느리다.
  • 포인터 때문에 메모리도 많이 사용되고, 포인터를 잃어버리면 문제가 발생하기 때문에 앞뒤로 링크를 붙여 더블링크를 사용한다. (메모리 낭비는 더 심해진다)
  •  List 인터페이스를 구현한 클래스로 데이터를 논리적인 순서(실제 연속해서 저장되는 것이 아니고 앞의 데이터가 뒤의 데이터를 가리키는 구조)대로 저장하는 자료구조 클래스
  • 링크가 1개이면 sing Linked List라고 하고 2개 (앞과 뒤 모두 가리키거나 트리 구조에서는 부모나 앞의 형제를 가리키고 다른 하나는 자식이나 형제를 가리킴)이면 Double Linked List라고 한다.

🔹 장점

  • 중간에 데이터를 삽입하거나 삭제할 떄 데이터의 이동없이 포인터만 이동하기 때문에 빠르게 작업이 가능
  • 포인터를 이용해서 데이터를 가리키는 구조이므로 연속된 빈 공간이 없어도 생성이 가능 

🔹 단점 

  • 데이터 이외의 포인터도 저장해야 하므로 메모리 효율이 ArrayList에 비해서 떨어질 수 있다.
  • 포인터를 따라다니므로 조회 속도가 느리다.

💡 조회를 주로 하는 작업에서는 (게시판) ArrayList를 이용하고 삽입과 삭제가 많은 게임같은 분야는 Linked List를 많이 사용한다. 

 

ArrayList와 LinkedList - 문자열 저장 속도 비교

package cover;

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

public class CollectionTest2 {
	
	public static void main(String[] args) {
		
		/* ArrayList와 LinkedList의 시간 비교 */
		
		//문자열을 저장하는 ArrayList 생성
		ArrayList <String> al = new ArrayList<>();
		
		al.add("One");
		al.add("Three");
		
		//1970년 1월 1일 자정부터 지나온 시간을 밀리초 단위의 정수로 가져오기
		long start = System.currentTimeMillis();
		//100000 데이터를 두번째에 추가
		for(int i = 0; i < 100000; i++) {
			al.add(1, "Two");
		}
		long end = System.currentTimeMillis();
		//걸린 시간 확인
		System.out.println("ArrayList : " + (end-start));
		
		
		//문자열을 저장하는 LinkedList 생성
		LinkedList <String> li = new LinkedList<>();
		
		li.add("One");
		li.add("Three");
		
		start = System.currentTimeMillis();
		for(int i = 0; i < 100000; i++) {
			li.add(1, "Two");
		}
		end = System.currentTimeMillis();
		System.out.println("LinkedList : " + (end-start));
	}

}

문자열을 저장하는것은  Linked List가 훨씬 빠르다 갯수가 많아지면 많아질수록 배이상의 차이가 나기 시작함.

ArrayList : 503
LinkedList : 5

 

 ArrayList와 LinkedList - Integer 조회시 속도 비교

package cover;

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

public class CollectionTest3 {
	
	public static void main(String[] args) {
		
		//100000 개의 데이터를 가진 ArrayList 와 LinkedList 생성
		ArrayList<Integer> al = new ArrayList<>();
		for(int i = 0; i<100000; i++) {
			al.add(i);
		}
		
		LinkedList<Integer> li = new LinkedList<>();
		for(int i = 0; i<100000; i++) {
			li.add(i);
		}
		
		/* 조회시 시간비교 */
		//ArrayList에서 100000 개의 데이터를 읽는데 걸리는 시간
		//데이터를 가져오는 메서드는 get
		//실행해서 가장 마지막에 나오는 숫자를 확인한 후 al을 li로 변경해서 실행하고 숫자는 확인
		
		long start = System.currentTimeMillis();
		for(int i = 0; i < 100000; i++) {
			al.get(i);
		}
		long end = System.currentTimeMillis();
		System.out.println("ArrayList : " + (end-start));
		
		start = System.currentTimeMillis();
		for(int i = 0; i < 100000; i++) {
			li.get(i);
		}
		end = System.currentTimeMillis();
		System.out.println("LinkedList : " + (end-start));
		
	}

}

조회를 하는것은  ArrayList가 훨씬 빠르다 갯수가 많아지면 많아질수록 배이상의 차이가 나기 시작함.

ArrayList : 2
LinkedList : 4128



4) Stack : Last In First out. (LIFO)

5) Que : First in First out (FIFO)

  • 스케줄링 시 전부 큐 사용.


6) DeQue : 양쪽에서 삽입과 삭제 가능.

 

반응형