서노썬
sun noes sun
서노썬
전체 방문자
오늘
어제
  • 카테고리 (142)
    • Java (89)
      • Day1 (20)
      • Day2 (16)
      • Day3 (4)
      • Day4 (5)
      • Day5 (2)
      • Day6 (2)
      • Day7 (4)
      • Day8 (6)
      • Day9 (3)
      • Day10 (0)
      • Day11 (0)
      • Day12 (0)
      • Day13 (3)
      • Day14 (0)
      • Day15 (0)
      • Day16 (0)
      • Day19 (0)
      • Day20 (0)
      • Day21 (2)
      • Day22 (4)
      • Day23 (2)
      • Day24 (5)
      • Day25 (4)
      • Day27 (2)
      • Day28 (3)
      • Day29 (1)
      • Day30 (1)
      • Day31 (0)
      • Day32 (0)
      • Dat33 (0)
      • Day34 (0)
      • Day35 (0)
      • Day36 (0)
    • HTML (37)
      • Day36 (20)
      • Day37 (3)
      • Day38 (2)
      • Day39 (8)
      • Day40 (3)
    • SQL (4)
      • Day40 (4)
      • Day41 (0)
      • Day42 (0)
      • Day43 (0)
      • Day44 (0)
      • Day45 (0)
    • JSP (0)
      • Day46 (0)
      • Day75 (0)
    • PYTHON (0)
      • Day75 (0)
      • Day76 (0)
    • Photo (12)

블로그 메뉴

  • 홈
  • 방명록

인기 글

최근 글

태그

  • 자바continue
  • 논리연산자
  • 자바
  • 자바자료형
  • Java
  • java자료형
  • java메뉴입력
  • 자바연산자
  • 자바break
  • java데이터타입

티스토리

hELLO · Designed By 정상우.
서노썬

sun noes sun

Java/Day28

[Java] Generic 제네릭 개념

2021. 12. 12. 19:44

 Generic 제네릭 

1. 제네릭 

- 매개변수화된 자료형

- 클래스 / 인터페이스 / 메소드 적용

- 제네릭 클래스 / 제네릭 인터클래스 / 제네릭 메소드

 

2. 제네릭 클래스의 형태

- 클래스명<매개변수 타입 리스트> { ... }

- 클래스명<타입> 객체명 = new 클래스명<타입>();

 

3. 제네릭에 이용할 수 있는 자료형

- 제네릭으로 사용할 수 있는 자료형 : 레퍼런스 형

(int, double 같은 기본 자료형은 사용 불가 / 사용하려면 wrapper 클래스인 Integer, Double 이용해야 함)

 

4. 제한된 제네릭 타입

<T extends V>

- 이렇게 적으면 제네릭 T 자리에는 클래스 타입이 V이거나  V클래스의 하위 클래스 타입만 올 수 있다.

 

5. 와일드카드 인수

- 와일드카드 : '?' 로 나타낸다.

- 와일드카드 자리에는 어떤 클래스 타입도 올 수 있다.


 컬렉션 프레임워크(Collection Framework) 

배열 외에도 ArrayList, LinkedList, Stack 등 많은 데이터를 일정한 구조로 저장할 수 있도록 해주는 클래스들을 모아 '컬렉션 프레임워크'라고 한다. 이 때 메모리 공간에 어떤 객체라도 저장하려면 다양한 객체를 받을 수 있는 제네릭을 필요로 한다.

 

1. List

- 순서가 있는 데이터 집합으로 데이터 중복을 허용한다.

- 구현 클래스 : ArrayList / LinkedList, Stack, Vector 등

 

2. Set

- 순서가 없는 데이터 집합으로 데이터 중복을 허용하지 않는다.

- 구현 클래스 : HashSet / TreeSet 등

 

3. Map

- <key, value> 쌍으로 이루어진 데이터 집합으로 순서가 없다.

- key 중복불가 / value 중복가능

- 구현 클래스 : HashMap / TreeMap / Hashtable / Properties 등


 Collection 인터페이스의 주요 메소드 

컬렉션 프레임워크의 인터페이스 중 List, Set, Map 인터페이스가 특히 중요하다. 이들은 모두 Collection 인터페이스를 상속받기 때문에 Collection 인터페이스에서 많이 사용하는 메소드도 알아두어야 한다.

 

1. Collection에 객체 추가

boolean add(E e)

boolean addAll(Coolection<? extends E> c)

 

2. Collection에 저장된 모든 객체 삭제

void clear()

 

3. Collection에 객체 또는 다른 Collection이 포함되어 있는지 판단

boolean contains(Object o)

boolean containsAll(Collection<?> c)

 

4. Collection을 순환할 반복자(iterator)를 반환

iterator<E> iterator()

 

5. Collection에서 객체를 삭제

boolean remove(Object o)

boolean removeAll(Cooleantion<?> c)

 

6. Collection에 포함된 원소의 개수를 반환

int size()


 List 인터페이스 

▶▶▶ List<E> : 데이터 저장순서 유지 O / 동일한 인스턴스 중복저장 O
▶▶▶ Set<E> : 데이터 저장순서 유지 X / 동일한 인스턴스 중복저장 X

 

List인터페이스

- 객체가 저장되는 순서가 있고, 중복을 허용

- 하위 클래스 : ArrayList / Vector / LinkedList 등

 

1. ArrayList

- 저장소의 용량을 늘리는 과정에서 많은 시간이 소요된다.
- 데이터의 삭제에 필요한 연산과정이 길다.
- 데이터의 참조가 용이해서 빠른 참조가 가능하다.

 

배열은 크기를 늘리거나 줄일 수 없고, 더 많은 데이터를 넣으려면 배열을 새로 만들어야 한다. 그러나 ArrayList는 add 메소드를 이용하여 얼마든지 원하는만큼 데이터를 저장할 수 있다.

 

Collection 인터페이스에 있는 메소드들이 오버라이딩 되어 제공되기 때문에 add(), size() 등의 메소드를 바로 사용할 수 있다.

 

for-each 구문 & 반복자 iterator

for(String x : num)

      System.out.println(x);

 

for 반복문을 for-each 구문으로 해도 되지만, 배열처럼 루프를 수행 할 수는 없기 때문에 루프를 수행하려면 반복자 이터레이터(iterator)를 이용하여 자동으로 반복이 수행될 수 있도록 해야 한다.

 

2. LinkedList

- 저장소의 용량을 늘리는 과정이 간단하다.
- 데이터의 삭제가 매우 간단하다.
- 데이터의 참조가 다소 불편하다.

 

3. Stack

- 양쪽이 아닌 한 쪽 끝에서만 데이터의 추가/삭제가 일어난다.

- 먼저 들어간 데이터가 나중에 필요할 때 사용할 수 있다.

- 탑(top) : 데이터의 삽입/삭제가 일어나는 곳

 

(1) Stack 생성자

Stack() : 빈 스택을 생성함

 

(2) Stack 메소드

boolean empty() : 스택이 비었는지 판단

E peek() : 스택 탑에 있는 원소를 반환

E pop() : 스택 탑에 있는 원소를 삭제하고 반환

E push(E item) : 스택 탑에 원소 item 추가

int search(Object o) : 스택에서 객체 o를 찾아서 있으면 위치를 반환

 

4. Queue

- 한 쪽에서 데이터가 추가 / 반대쪽에서 데이터를 삭제

 

(1) Queue 메소드

boolean add(E e) : 원소 e를 큐에 추가 / 공간이 부족하면 IllegalStateException 발생

E element() : 큐의 헤드에 있는 원소를 반환 / 삭제 x

boolean offer(E e) : 원소 e를 큐에 추가

E peek() : 큐의 헤드에 있는 원소를 반환 / 삭제 x / 큐가 비었으면 null을 반환

E poll() : 큐의 헤드에 있는 원소를 반환 / 삭제 o / 큐가 비었으면 null을 반환

E remove() : 큐의 헤드에 있는 원소를 반환 / 삭제 o

 

5. Iterator & ListIterator

- Iterator 는 컬렉션 프레임워크에서 순환자 역할

- 자동으로 원소를 하나씩 순환해 나가는 특별한 인터페이스

- 재사용되지 않기 때문에 다시 사용하려면 이터레이터를 다시 얻어야 한다.

 

(1) Iterator 메소드(한방향 순환)

boolean hasNext() : 이후에 원소가 더 있는지 판단 / 더 있으면 true 반환

E next() : 다음 원소 반환

 

(2) ListIterator 메소드(양방향 순환)

boolean hasNext() : 이후에 원소가 더 있는지 판단 / 더 있으면 true 반환

boolean hasPrevious() : 이전에 원소가 있는지 판단 / 있으면 true 반환

E next() : 다음 원소 반환

E previous() : 이전 원소 반환


 Set 인터페이스 

▶▶▶ List<E> : 데이터 저장순서 유지 O / 동일한 인스턴스 중복저장 O
▶▶▶ Set<E> : 데이터 저장순서 유지 X / 동일한 인스턴스 중복저장 X

 

Set인터페이스

- 순서가 없는 데이터 집합으로 데이터 중복을 허용하지 않는다.

- 구현 클래스 : TreeSet / HashSet

 

1. TreeSet 

- 이진 트리 구조 형태 → 데이터를 저장하면서 자동으로 정렬의 형태를 취함

- TreeSet에 넣는 데이터는 대소 비교가 가능해야 한다.

(그래서 Comparable인터페이스이나 Comparator인터페이스 사용)

 

(1) Comparable 인터페이스

- 보통 기본 정렬기준을 구현할 때 사용

- wrapper (boolean제외), String, Date, File 클래스 등은 알아서 오름차순 정렬

- Test, Person 등과 같은 Comparable을 구현하지 않는 클래스는  TreeSet에 담으면 예외상황 발생

- 방법 : compareTo 메소드를 오버라이딩 해준다.

 

(2) Comparator 인터페이스

- 보통 기본 정렬기준 외에 다른 기준을 구현하고자 할 때 사용

- compare(Object o1, Object o2) 를 구현해준다.

- equals메소드 : Comparetor 를 구현하는 클래스는 오버라이딩이 필요할 수도 있음을 정의한 것(반드시 구현x)

interface Comparator {
	int compare(Object o1, Object o2);
 	boolean equals(Object obj);
}

 

2. HashSet 

- HashSet 구조 역시 Set의 일종

- 순서가 없는 데이터 집합으로 데이터 중복을 허용하지 않는다.

- 데이터의 중복 검사를 위해 equals메소드 & hashCode 메소드 오버라이딩 필수

(hashCode메소드의 반환값을 hash값으로 활용, equals메소드의 반환값을 이용해서 내용 비교)

public int hashCode() {
	reuturn 비교대상
}
public boolean equals(Object obj) {
	return true, false 비교식
}

 Set 인터페이스 

Map인터페이스

- <키, 값>의 쌍으로 한 개의 데이터를 구성하는 자료 구조 (키는 유일해야 하고, 값은 중복이 있을 수 있음)

- HashMap, TreeMap

 

1. HashMap 

- hash 함수 이용(키 값을 입력하면 hash값을 출력)

 

(1) HashMap 생성자

HashMap() : 빈 HashMap 생성

 

(2) HashMap 메소드

- void clear() : HashMap의 모든 데이터 삭제

- boolean containsKey(Object key) : key에 해당하는 키가 존재하는지 판단

- boolean containsValue(Objext value) : value에 해당하는 값이 존재하는지 판단

- Set<Map.Entry<K, V>> entrySet() : 모든 엔트리 반환

- V get(Object key) : key에 해당하는 값 반환

- Set<K> keySet() : key들의 집합 반환

- V put(K key, V value) : <key, value> 쌍을 HashMap에 추가

- V remove(Object key) : key에 해당하는 데이터 삭제

- int size() : HashMap의 크기 반환

 

 2. TreeMap 

- 키를 기준으로 정렬이 이루어짐

- 키에 해당하는 클래스를 Compareble 또는 Comparator 인터페이스로 구현해야 한다.

 

(1) TreeMap메소드

- void clear() : HashMap의 모든 데이터 삭제

- boolean containsKey(Object key) : key에 해당하는 키가 존재하는지 판단

- boolean containsValue(Objext value) : value에 해당하는 값이 존재하는지 판단

- Set<Map.Entry<K, V>> entrySet() : 모든 엔트리 반환

- V get(Object key) : key에 해당하는 값 반환

- Set<K> keySet() : key들의 집합 반환

- Collection values() : value들의 집합 반환

- V put(K key, V value) : <key, value> 쌍을 HashMap에 추가

- V remove(Object key) : key에 해당하는 데이터 삭제

- int size() : HashMap의 크기 반환

 

 

'Java > Day28' 카테고리의 다른 글

[Java] Generic 제네릭 예제  (0) 2021.12.13
[Java] Generic 제네릭 Step  (0) 2021.12.13
    'Java/Day28' 카테고리의 다른 글
    • [Java] Generic 제네릭 예제
    • [Java] Generic 제네릭 Step

    티스토리툴바