본문 바로가기

JAVA/명품 자바 프로그래밍

자바 기초 문법 정리- 7장 제네릭

728x90

#명품 자바 프로그래밍 7장 제네릭 

#모든 코드와 사진은 <명품 자바 프로그래밍>

 

1. 컬렉션 (collection) : 요소 객체들의 저장소- 먼가 파이썬의 리스트와 비슷한 것 같다 

  1) 제네릭(generics) 기법으로 구현(여러 종류의 타입으로 변신할 수 있도록 클래스나 메소드를 일반화시키는 기법)

  2) 컬렉션 요소는 객체만 가능

  3) 고정 크기의 배열을 다루는 어려움 해소

 

tmil. 제네릭 <E>- element, <T>- type, <K>- key, <V>- value


2. Vector<E> 

  1) 여러 객체들을 삽입, 삭제, 검색하는 컨테이너 클래스

  2) Vector에 삽입 가능한 것- 객체, NULL

     - 기본 타입(ex: int)은 Wrapper 객체(ex: integer)로 만들어 저장

 

 - 주 메소드

add 요소 추가
addAll 컬렉션의 모든 요소를 벡터의 맨 뒤에 추가
get 인덱스 요소 리턴
elementAll 인덱스 요소 리턴
remove 인덱스 요소 삭제
removeAllElements 모든 요소 삭제, 크기 0으로
size 요소 개수 리턴
capacity 현재 벡터 용량 리턴

 


3. 컬렉션과 자동 박싱/언박싱

Vecrot<Integer> v = new Vector<Integer>();
v.add(Integer.valueOf(4));  //원래 컬렉션에는 기본 타입 삽입이 불가하니까 박싱을 해줘야 함
v.add(4);    //하지만 자동박싱이 되므로 2줄처럼 하지 않아도 됨

int k = v.get(0);  // Integer 타입을 int 타입으로 자동 언박싱, k=4

  


4. ArrayList<E> 

- 가변 크기의 배열 구현

- 벡터와 달리 스레드 동기화 기능 없음

 

 - Vector와 메소드 구성이 조금 다르다. 

  (1) capacity(배열의 용량 구하기) 없음

  (2) 모든 요소 삭제 

     vector : removeAllElements()

     arrayList : clear()


5. Iterator<E>

 - Vector, ArrayList, LinkedList가 상속받는 인터페이스 

boolean hasNext() 방문할 요소가 남아 있으면 true 리턴
E next() 다음 요소 리턴
void remove() 마지막으로 리턴된 요소 제ㅓ

 


6. HashMap<k,v> 

 - 특징

  1) key와 value의 쌍으로 구성되는 요소를 다루는 컬렉션 

  2) 키와 값이 한 쌍으로 삽입 

  3) 삽입(put), 삭제(remove), 검색(get)이 빠른 특징 

  4) 키로만 검색 가능 

 


7. LinkedList<E> 

 - 특징

  1) 요소 객체들은 양방향으로 연결되어 관리됨

  2) 요소 객체는 맨 앞, 맨 뒤에 추가 가능

  3) 요소 객체의 인덱스를 이요하여 중간에 삽입 가능

  4) 스택이나 큐로 사용 가능

 


8. collections 클래스 활용

 -특징

 1) 컬렉션에 대해 연산을 수행하고 결과로 컬렉션 리턴

 2) 모든 메소드는 static 타입 

sort() 컬렉션에 포함된 요소들을 정렬
reverse() 요소의 순서를 반대로
max(), min()  
binarySearch() 특정 값 검색 

9. 제네릭 만들기 

- 제네릭 만들기 

 1) 제네릭 클래스 작성- 클래스나 인터페이스 선언부에 일반화된 타입(Integer 등) 추가

public class MyClass<T>{
 T val;
  void set(T a){ val=a;}
  T get() {return val;}
  }

 2) 제네릭 클래스에 대한 레퍼런스 변수 선언

MyClass<String> s; //<T>를 String으로 구체화
List<Integer> li;  //<E>를 Integer로 구체화

 3) 제네릭 객체 생성- 구체화 -> 기본 타입은 사용 불가, 클래스 내 제네릭 타입의 객체 생성 불가

MyClass<String> s = new MyClass<String>();  //제네릭 타입 T를 String으로 구체화
s.set("hello");
System.outn.println(s.get());

MyClass<Integer> n = new MyClass<Integer>();  //제네릭 타입 T를 Integer으로 구체화

 

 

- 제네릭과 배열- 제네릭에서 배열의 제한

 1) 제네릭 클래스 또는 인터페이스 배열 허용x

G Stack<Integer>[] gs = new GStack<Integer>[10];   //불가

 2) 제네릭 타입의 배열 허용x

T[] = new T[10];  //불가

 3) 타입 매개변수의 배열에 레퍼런스는 허용

public void myArray(T[] a){    //가능

 

- 제네릭 메소드 

 : 제네릭 메소드를 호출할 때는 컴파일러가 메소드의 인자를 통해 이미 타입을 알고 있으므로 타입을 명시하지 않아도 됨.

 

 

- 제네릭의 장점

 1) 컴파일 시에 타입이 결정되어 보다 안전한 프로그래밍 가능

 2) 런타임 타입 충돌 문제 방지

 3) ClassCastException 방지