
- 제네릭(Generic)
클래스나 메소드에서 사용할 데이터의 타입을 컴파일 시에 미리 지정하는 방법이다.
- 제네릭을 사용하는 이유
- 다양한 타입의 객체의 재사용을 높일 수 있다.
- 클래스에서 사용할 타입을 외부에서 설정할 수 있다.
- 반복적인 코드, 불필요한 코드를 사용하지 않도록 한다.
- 강제적인 형변환을 발생시키지 않는다.
- 제네릭 타입
타입 | 의미 |
<T> | Type |
<E> | Element |
<K> | Key |
<V> | Value |
<N> | Number |
✔️ Object 클래스
자바의 모든 클래스의 최상위 조상 클래스이다.
모든 타입은 Object 클래스로 객체화시킬 수 있다.
기본 데이터 타입을 객체화 시킨 래퍼 타입으로 대입받을 수 있다.
제네릭 사용해보기!
package day08;
public class Generic1<K,V> {
private K key;
private V value;
public void set(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public V getValue() {
return value;
}
public void setValue(V value) {
this.value = value;
}
}
메인 메소드
package day08;
public class GenericTest {
public static void main(String[] args) {
Generic1<String, Integer> generic = new Generic1<>();
generic.set("백", 100);
System.out.println("Key : " + generic.getKey());
System.out.println("Value : " + generic.getValue());
System.out.println("K 타입 : " + generic.getKey().getClass().getName());
System.out.println("V 타입 : " +generic.getValue().getClass().getName());
}
}
- 컬렉션 프레임 워크(Collection FrameWork)
여러 가지 데이터를 메모리에 쉽고 효과적으로 처리할 수 있도록 제공하는 클래스들의 집합이다.
자료구조를 구현한 클래스들의 모음
✔️ 자료구조
데이터를 효율적으로 관리할 수 있는 데이터 구조를 의미한다.
데이터의 특성에 따라 체계적으로 구조화된다.
✔️ 알고리즘
어떤 문제를 풀기 위한 절차 및 방법을 의미한다.
어떤 문제에 대해 입력을 넣으면 원하는 출력을 얻을 수 있도록 만드는 프로그래밍이다.
- 컬렉션 프레임 워크의 종류
인터페이스 | 의미 |
List 인터페이스 | 순서가 있는 데이터의 집합 데이터 중복 허용 ⭕ |
Set 인터페이스 | 순서가 없는 데이터의 집합 데이터 중복을 허용하지 않음❌ |
Map 인터페이스 | 키와 값을 한 쌍으로 이루어지는 데이터의 집합 순서가 없음 키는 중복 ❌, 값은 중복 ⭕ |
- List 인터페이스 종류
Vector, ArrayList, Queue, Stack, LinkedList
- Vector 클래스
동적인 길이로 여러 데이터형을 저장하기 위해 사용한다.
자바 1.0부터 존재하는 레거시 클래스이다.
배열과 동일하게 정수 인덱스를 이용하여 액세스를 할 수 있다.
동기화되어 있으며, 한 번에 하나의 스레드만 벡터의 메소드를 호출할 수 있다.
Vector 사용해보기!
package day08;
import java.util.Vector;
public class Vector1 {
public static void main(String[] args) {
Vector<String> vector = new Vector<>();
System.out.println("BEFORE");
System.out.println("벡터 데이터의 길이 : " + vector.size());
System.out.println("벡터 크기 : " + vector.capacity());
System.out.println("-----------------------------------------");
vector.addElement("김사과");
vector.addElement("오렌지");
vector.addElement("반하나");
vector.addElement("이메론");
vector.addElement("이체리");
vector.addElement("배애리");
vector.addElement("반하나");
vector.addElement("이메론");
vector.addElement("배애리");
vector.addElement("오렌지");
vector.addElement("레몬");
System.out.println("AFTER");
System.out.println("벡터 데이터의 길이 : " + vector.size());
System.out.println("벡터 크기 : " + vector.capacity());
System.out.println("-----------------------------------------");
for(int i = 0; i < vector.size(); i++) {
System.out.print(vector.get(i) + " " );
}
System.out.println();
System.out.println("-----------------------------------------");
vector.removeAllElements();
System.out.println("REMOVE");
System.out.println("벡터 데이터의 길이 : " + vector.size());
System.out.println("벡터 크기 : " + vector.capacity());
}
}
요소를 추가하기 전에 벡터의 크기가 기본적으로 10으로 되어있으며, 10 이상의 요소를 넣게 되면 크기가 커지는 것을 확인할 수 있다. 또한, 요소 전체를 다 삭제해도 커진 크기는 줄어들지 않는다.
- Vector 메소드
add(), addElement() : 두 메소드는 동일, 하지만 addElement는 벡터만 존재, 데이터 추가
size() : 저장된 값의 개수를 반환
capacity() : 현재 배열의 크기를 반환
remove() : 특정 인덱스의 데이터 삭제
removeAllElements() : 전체 데이터 삭제
clear() : 전체 데이터 삭제
- ArrayList 클래스
동적인 길이로 여러 데이터형을 저장하기 위해 사용한다.
배열과 동시에 정수 인덱스를 이용하여 액세스를 할 수 있다.
비동기식을 사용하며 멀티스레드를 지원한다. (벡터 클래스와의 차이점)
✔️ 동기식
프로그램을 차례(순서)대로 처리한다.
✔️ 비동기식
여러 개의 프로그램을 동시에 처리한다. 시간이 오래 걸리면 다음 문장으로 이동 후 동작하는 방식이다.
ArrayList 사용해보기!
package day08;
import java.util.ArrayList;
public class ArrayList1 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
System.out.println("list 사이즈 : " + list.size());
list.add(80);
list.add(90);
list.add(65);
list.add(70);
list.add(99);
list.add(100);
System.out.println("list : " + list);
System.out.println("list 사이즈 : " + list.size());
System.out.println("반복문");
for(int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
System.out.println();
System.out.println("--------------------------------------");
list.remove(2);
System.out.println("삭제 후 : " + list);
list.set(2, 56);
System.out.println("2번 인덱스에 새로운 값 : " + list);
}
}
Vector와는 다르게 값을 추가하기 전에는 사이즈가 0인 것을 확인할 수 있다.
- ArrayList 메소드
add() : 순서대로 데이터 추가
get(index) : 특정 인덱스의 데이터를 반환한다.
set(index, value) : 특정 인덱스의 데이터를 변경할 수 있다.
remove(index or value) : 특정 인덱스 나 데이터를 삭제한다.
clear() : 모든 데이터 삭제한다.
isEmpty() : list가 비었으면 true, 하나의 데이터라도 있으면 true 반환
- Queue 클래스
FIFO (First IN First OUT) 방식
큐의 한쪽 끝을 프런트로 정하여 삭제 연산만 수행한다.
다른 한쪽 끝을 리어로 정하여 삽입 연산만 수행한다.
푸시 메시지, 운영체제의 스케줄러에 쓰인다.
- Queue 클래스의 구조
Queue 사용해보기!
import java.util.LinkedList;
import java.util.Queue;
public class Queue1 {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(10);
queue.offer(20);
queue.offer(50);
queue.offer(80);
queue.offer(70);
queue.offer(90);
System.out.println("Queue : " + queue);
System.out.println("첫 번째 데이터 : " + queue.peek()); // 첫 번째 데이터를 반환
System.out.println(queue);
System.out.println("첫 번째 데이터 : " + queue.poll()); // 첫 번째 데이터를 반환 후 삭제
System.out.println(queue);
queue.clear();
System.out.println("CLEAR" + queue);
}
}
Queue라는 클래스가 존재하지 않기 때문에 LinkedList 클래스 생성자를 통해 객체를 생성한다. 이는 다형성 때문에 가능하다.
- Queue 메소드
offer() : 주어진 객체 삽입
성공 : true 반환, 실패 : false 반환
add() : 주어진 객체 삽입
성공 : true 반환, 실패 : 예외 발생
peek() : 첫 번째 객체 반환
element() : 첫 번 째 객체 반환
poll() : 첫 번째 객체 반환 후 삭제
remove(E e) : 특정 객체 삭제
clear() : 전체 삭제
- Stack 클래스
LIFO(Last IN First OUT) 방식
한쪽 끝에서만 자료를 넣고 뺄 수 있는 형식의 자료구조
브라우저의 뒤로 가기, 앞으로 가기 버튼에 쓰인다.
- Stack 구조
Stack 사용해보기!
package day08;
import java.util.Stack;
public class Stack1 {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(50);
stack.push(100);
stack.push(70);
stack.push(80);
stack.push(60);
stack.push(20);
System.out.println("Stack : " + stack);
System.out.println("마지막 데이터 : " + stack.peek()); // 마지막에 들어온 데이터를 반환
System.out.println(stack);
System.out.println("마지막 데이터 : " + stack.pop()); // 미지막에 들어온 데이터를 반환 후 삭제
System.out.println(stack);
}
}
- Stack 메소드
push(value) : 데이터 추가
clear() : 전체 데이터 삭제
peek() : 마지막 데이터 반환
pop() : 마지막 데이터 반환 후 삭제
-LinkedList 클래스
각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식이다.
ArrayList에 비해 데이터의 추가나 삭제가 빠르다.
인덱스가 없기 때문에 특정 요소에 접근이 느리다.
탐색 속도가 떨어진다.
LinkedList 사용해보기!
package day08;
import java.util.LinkedList;
public class LinkedList1 {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("김사과");
linkedList.add("오렌지");
linkedList.add("이메론");
linkedList.add("반하나");
linkedList.add("배애리");
linkedList.add("이체리");
System.out.println("LinkedList : " + linkedList);
System.out.println("first : " + linkedList.peek()); // 첫 데이터 반환
System.out.println(linkedList);
System.out.println("first : " +linkedList.poll()); // 첫 데이터 반환 후 삭제
System.out.println(linkedList);
linkedList.remove("오렌지"); // 특정요소 삭제
System.out.println("REMOVE : " + linkedList);
}
}
- LinkedList 메소드
add() :객체를 추가
clear() : 모든 요소 삭제
peek() : 첫 번째 요소 반환
poll() : 첫 번째 요소 반환 후 삭제
remove(value) : 특정 요소 삭제
❗Iterator 인터페이스
컬렉션 프레임워크 인터페이스에서는 Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 iterator() 메서드를 정의하여 각 요소에 접근하도록 설계되어있다.
자바의 컬렉션에 저장되어 있는 요소들을 읽어오는 방법이다.
컬렉션으로부터 정보를 얻어내는 방법이다.
iterator의 장단점
- 장점 : 컬렉션 프레임워크 종류에 관계없이 일관성 있게 프로그래밍을 할 수 있다.
- 단점 : size 메소드를 얻어와서 반복 처리하는 것보다 속도가 좋지 못하다.
'국비 > JAVA' 카테고리의 다른 글
DAY 09 - 1: 중첩 클래스, 예외 처리 (0) | 2022.10.12 |
---|---|
DAY 08 - 2 : 컬렉션 프레임워크 (Set, Map) (0) | 2022.10.12 |
DAY 07 : Wrapper Class, static, 추상 클래스, 인터페이스, 패키지 (1) | 2022.10.11 |
DAY 06 : 객체의 배열, Object 클래스, 상속, 업캐스팅과 다운캐스팅, instanceof 연산자 (0) | 2022.10.05 |
DAY 05 : 메소드, 객체지향 프로그래밍, 클래스, 생성자 (0) | 2022.10.04 |