- 컬렉션은 제네릭 기법으로 구현
- 컬렉션의 요소는 "객체"만 가능!!
특정 타입만 다루지 않고, 여러 종류의 타입으로 변신할 수 있도록 클래스나 메소드를 일반화 시키는 기법
STACK<E>
- E에 특정 타입으로 구체화
- 정수만 다루는 스택은 E자리에 Integer..
- java.util.Vector : E 대신 요소로 사용할 특정 타입으로 구체화 가능
- 여러 객체들을 삽입, 삭제, 검색하는 컨테이너 클래스!!
=> 배열의 길이 제한 극복!
=> 원소의 개수가 넘쳐나면 자동으로 길이 조절!!
타입 매개 변수 사용하지 않을 경우 경고가 발생한다.
Vector<Integer> v = new Vector<Integer>(7);
v.add(5); //삽입
v.add(4);
v.add(-1);
int n = v.size(); // 요소 개수 n = 3
int c = v.capcity(); // 용량 c = 7
v.add(2,100); // 인덱스 2에 삽입, v.size보다 큰 곳에서는 삽입 불가
Integer obj = v.get(1); // 1번째 요소 가져와서 정수로 바꾸기
int i = obj.intValue();
v.remove(1); // 1번째 인덱스 삭제
int last = v.lastElement(); // 마지막 요소 가져오기
v.removeAllElements(); // 모든 요소 삭제
- 기본 데이터 타입 데이터를 Wrapper 클래스를 이용하여 객체로 만들어 사용
Vector<Integer> v = new Vector<Integer>(); v.add(Integer.valueOf(4));
- 컬렉션으로부터 요소를 얻어올 때, Wrapper 클래스로 캐스팅 필요
Integer n = (Integer)v.get(0); int k = n.intValue(); // k = 4
- 자동 박싱/언박싱이 작동하여 기본 타입 값 사용 가능
Vector<Integer> v = new Vector<Integer> (); v.add(4); // 4 → Integer.valueOf(4)로 자동 박싱 int k = v.get(0); // Integer 타입이 int 타입으로 자동 언박싱, k = 4
- 제네릭 타입 매개 변수를 기본 타입으로 구체화할수는 없음.
Vector<int> v = new Vector<int> (); // 오류
예제 7-1 : 정수만 다루는 Vector< Ineger > 컬렉션 활용
// Integer 벡터를 매개변수로 받아 원소를 모두 출력하는 printVector() 메소드
public void printVector(Vector<Integer> v){
for(int i=0; i<v.size(); i++) {
int n = v.get(i); // 벡터의 i 번째 정수
System.out.println(n);
}
}
Vector<Integer> v = new Vector<Integer>();// Integer 벡터 생성
printVector(v); // 메소드 호출
// Java 7 이전
Vector<Integer> v = new Vector<Integer>();
// java 7 이후
// 컴파일러의 타입 추론 기능 추가
// 다이아몬드 연산자에 타입 매개변수 생략
Vector<Integer> v = new Vector<>(); // Java 7부터 추가, 가능
// java 10 이후
// var 키워드 도입
// 컴파일러의 지역 변수 타입 추론 가능
var v = new Vector<Integer>(); // Java 10부터 추가, 가능
동기화 기능 없는 것이 벡터와의 차이점인것 같다..
ArrayList<String> a = new ArrayList<String>(7);
a.add("Hello"); //삽입
a.add("hi");
a.add("JAVA");
int n = a.size(); // 요소 개수 n = 3
// capcity() method 없음
v.add(2,"chan"); // 인덱스 "chan"에 삽입, a.size보다 큰 곳에서는 삽입 불가
String str = a.get(1);
a.remove(1); // 1번째 인덱스 삭제
a.clear(); // 모든 요소 삭제
boolean hasNext() // 방문할 요소가 남아있으면 return true
E next() // return next elemenet
void removve() // last return element delete
Vector<Integer> v = new Vector<Integer>(); // 벡터 생성
Iterator<Integer> it = v.iterator(); // v의 iterator it생성
while(it.hasNext()) { //
모든 요소 방문
int n = it.next(); // 다음 요소 리턴
... }
HashMap<String, String> h = new HashMap<String, String>();
h.put("apple", "사과"); // "apple" 키와 "사과" 값의 쌍을 해시맵에 삽입
String kor = h.get("apple"); // "apple" 키로 값 검색. kor는 "사과“
HashMap<Stirng, String> h = new HashMap<String, String>(); // 해시맵 생성
h.put("baby","아기"); //삽입
h.put("love","사랑");
h.put("apple","사과");
String kor = h.get("love"); //key로 값 읽기
h.remove("apple"); // key로 요소 삭제
int n = h.size(); // 요소 개수 n = 2
public class MyClass<T> {
T val;
void set(T a) {
val=a; // T type value "a" => val save
}
T get() {
return val; // return T type value
}
}
MyClass<String> s;
List<Integer> li;
Vector<String> vs;
MyClass<String> s = new MyClass<String>(); // 제네릭 타입 T에 String 지정 s.set("hello");
System.out.println(s.get()); // "hello" 출력
MyClass<Integer> n = new MyClass<Integer>(); // 제네릭 타입 T에 Integer 지정 n.set(5);
System.out.println(n.get()); // 숫자 5 출력
타입 매개 변수에 기본 타입은 사용할 수 없음
제네릭에서 배열의 제한
class GenericMethodEx{
static <T> void toStack(T[] a, GStack<T> gs){
for(int i=0;i<a.length;i++){
gs.push(a[i]);
}
}
}
Object[] oArray = new Object[100];
GStack<Object> objectStack = new GStack<Object>();
GenericMethodEx.toStack(oArray, objectStack); // 타입 매개변수 T를 Object로 유추함