반응형
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 : 양쪽에서 삽입과 삭제 가능.

반응형
'국비지원 > JAVA' 카테고리의 다른 글
| [JAVA] 22. API - I/O (InputStream/OutputStream) (0) | 2022.10.27 |
|---|---|
| [JAVA] 21. List(stack, queue, deque) / Set / Map (0) | 2022.10.26 |
| [JAVA] 21-1. API - java.util pkg (Array, Date, Calendar, Random) (0) | 2022.10.25 |
| [JAVA] 20. Wrapper class와 API - java.util pkg (java.util(API) Arrays와 sort, 객체 배열의 정렬 방법 까G) (0) | 2022.10.24 |
| [JAVA] 19. API (Application Programming Interface) (0) | 2022.10.18 |