본문 바로가기

JAVA

[JAVA] 3주차(2) | 제네릭(Generic), Collection, ArrayList

1. 제네릭(generic)

제네릭(generic)이란 class, interface, method 등을 특정 타입(class)에 종속되지 않고 여러 다른 타입에 적용될 수 있도록 일반화된 타입 매개 변수를 말한다.

 

예를 들어 문자열인 멤버 id와 정수인 멤버 value가 있다. 만약 value가 정수가 아닌 문자열인 객체를 생성하고 싶다면 새로운 class를 만들어야 할 것이다. 혹은 id를 정수로 하고 싶은 경우나 id와 value를 모두 정수로 하고 싶은 경우에도 각각 새로운 class를 생성해야 할 것이다. 이러한 상황에서 같은 변수의 타입을 필요에 따라 변경 가능하도록 해주는 것이 generic 이다. 

③ class 이름 뒤에 가 있음을 유의해 보라. Sample class 내에서 사용되는 두 가지 타입 A와 B에 대해 사용자가 임의로 지정할 수 있도록 해주겠다는 의미이다. 또한 멤버 변수 id는 A 타입으로, value는 B 타입으로 선언되었다. id는 사용자가 지정한 타입 A로 생성하고, value는 사용자가 지정한 타입 B로 생성한다는 의미이다.

 

1.1 제네릭 스택 만들기 예제

public class GenericStack<T> {
	int tos;
	Object[] stack;
	int size;
	
	public GenericStack(int size) {
		tos = 0;
		this.size = size;
		stack = new Object[size];
	}
	public void push(T item) {
		if(tos == this.size) {
			return;
		}
		stack[tos++] = item;
	}
	public T pop() {
		if(tos==0) {
			return null;
		}
		tos--;
		return (T)stack[tos];
	}
	public int size() {
		return tos;
	}
}
public class GenericStackApp {

	public static void main(String[] args) {
		System.out.println("String Stack");
		GenericStack<String> stringStack = new GenericStack<String>(3);
		
		stringStack.push("Seoul");
		stringStack.push("Busan");
		stringStack.push("Daegu");

		int size = stringStack.size();
		for(int n=0; n<size; n++) {
			System.out.print("Stack size:" + stringStack.size());
			System.out.println(" -> pop(): " + stringStack.pop());
			}
		System.out.println("Integer Stack");
		GenericStack<Integer> intStack = new GenericStack<Integer>(3);
		
		intStack.push(1);
		intStack.push(3);
		intStack.push(5);

		for(int n=0; n<size; n++) {
			System.out.println(intStack.pop());
		}
		System.out.println("intStack size: " + intStack.size());
		
	}

}

1.2 제네릭 메소드

리턴 타입 앞에 타입 파라미터를 선언.

public <타입파라미터> 리던타입 메소드명(매개변수, ...) {

}

리턴 타입은 제네릭 메소드의 매개변수 타입에 따라 결정됨.

public <T> Box<T> boxing(T t) {...}

이렇게 Generic 객체 Box<T>를 만들었으면 매개변수 타입 T가 Box<T>의 리턴 타입을 결정.

Box<Integer> box1 = boxing(100); // 매개변수 (100)에 의해 <T>는 Integer로 유추

Box<String> box2 = boxing("홍길동");

 

1.3 제한된 타입 파라미터

타입을 제한할 수도 있음.

public <T extends 상위타입> 리턴타입 메소드명(매개변수, ...){

}

 

2. Collection

제네릭 기법으로 구현되어 있는데 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 만들어 놓은 java.util 패키지이다.

컬렉션의 요소는 객체만 가능하다. (기본 타입은 boxing, unboxing) 기법으로 객체로 자동 변환

 

2.1 List

객체를 인덱스로 관리하며, 인덱스로 객체를 검색, 삭제할 수 있는 기능 제공.

구현 클래스: ArrayList, Vector, LinkedList

- 순서를 유지하고 저장

- 중복 저장 가능

 

2.1.1 ArrayList

ArrayList<E>는 가변 크기 배열을 구현한 클래스이다.

객체의 번지를 저장한다.

빈번한 객체의 삽입, 삭제는 LinkedList를 사용하는 것이 적당하다.

 

2.2 Set

수학의 집합 개념.

구현 클래스: HashSet, TreeSet

- 순서를 저장하지 않음

- 중복 저장 안됨

2.3 Map

key와 value의 쌍으로 구성된 엔트리 객체를 다루는 컬렉션.

구현 클래스: HashMap, Hashtable, LinkedHashMap, Properties, TreeMap

- 키와 값으로 구성된 엔트리(쌍) 저장

- 키는 중복 저장 안됨