제네릭 (Generic)
제네릭(Generic)
- 타입을 구체적으로 지정라는 것이 아니라, 추후에 지정할 수 있도록 일반화해두는 것
- 즉, 작성한 클래스 또는 메서드의 코드가 특정 데이터 타입에 얽매이지 않게 해둔 것 필요성
- 코드는 동일하지만 다른 타입들의 필드, 메서드, 클래스들이 필요해지면 각 타입마다의 클래스를 다시 작성해야함
- 제네릭을 사용한다면 이런 번거로움이 줄어듦
제네릭 클래스 정의
제네릭 클래스 (Generic Class)
- 제네릭을 사용한 클래스
- 객체 생성 시 실제 타입 지정
- 단, 기본 타입 지정 불가. 래퍼클래스 사용해야함
- 다형성 적용 가능
제네릭 클래스 예시
public class 클래스명<타입_매개변수> { }
public class 클래스명<타입_매개변수1, 타입_매개변수2> { }
public interface 인터페이스명<타입_매개변수> { }
public interface 인터페이스명<타입_매개변수1, 타입_매개변수2> { }
-----------------------------------
class Flower {...}
class SunFlower extends {...}
class Cosmos extends Flower {...}
class Candy {...}
class Basket<T> {
private T item;
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
public static void main(String[] args) {
// 사용방법
// Basket<구체적_타입_명시> example = new Basket<구체적_타입_명시>();
// Basket<구체적_타입_명시> example2 = new Basket<>(); // new 뒤로는 구체적 타입 생략 가능
Basket<Flower> flowerBasket = new Basket<>();
flowerBasket.setItem(new SunFlower()); // 다형성 적용
flowerBasket.setItem(new Cosmos()); // 다형성 적용
flowerBasket.setItem(new Candy()); // 에러
제한된 제네릭 클래스
- 제네릭 클래스는 타입을 지정하는데에 어떠한 제한이 없음
- 타입 매개변수 선언 시 상속 혹은 구현받는 클래스 && 인터페이스만 지정할 수 있도록 제한 가능
extends
키워드 사용타입 매개변수
interface Plant {}
class Flower implements Plant {}
class SunFlower extends Flower {]
class Basket1<T extends Flower> {...} // 객체 생성시 Flower의 하위 클래스만 지정 가능
class Basket2<T extends Plant> {...} // 객체 생성 시 Plant 인터페이스를 구현한 클래스만 지정 가능
class Basket3<T extends Plant && Flower> {...} // 객체 생성 시 Flower의 하위클래스이면서 Plant 인터페이스를 구현한 클래스만 지정 가능
인자 | 의미 |
< T > | Type |
< E > | Element |
< K, V > | Key, Value |
< R > | Result |
< ? > | Wild Card. 제한을 두지 않는 기호 |
래퍼클래스 (Wrapper class)
- 기본타입에 해당하는 데이터를 객체로 포장해주는 클래스
- java.lang 패키지에 포함되어있음
기본타입 | 래퍼클래스 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
제네릭 메서드 (Generic Method)
제네릭 메서드 (Generic Method)
- 제네릭 타입을 선언한 메서드
- 호출되는 시점에서 실제 제네릭 타입을 지정
- 정의하는 시점에서는 실제 어떤 타입이 입력 되는지 알 수 없기 때문에 Object 클래스의 메서드만 사용가능
컬렉션 프레임워크 (Collection Framework)
컬렉션(Collection) : 여러 데이터들의 집합
컬렉션 프레임워크(Collection Framework)
- 컬렉션을 다루는데에 있어 편리한 메서드들을 미리 정의해놓은 것
- 특정 자료 구조에 데이터를 추가하고, 삭제하고, 수정하고, 검색하는 등의 동작을 수행하는 편리한 메서드 제공

- 주요 인터페이스 : List, Map, Set
- Collection 메서드는 List, Set에서 사용 가능
- Collection 인터페이스
기능 리턴타입 메서드 설명 객체 추가 boolean add(Object o) / addAll(Collection c) 객체 킻 컬렉션 객체들을 컬렉션에 추가 객체 검색 boolean contains(Object o) / containsAll(Collection c) 객체 및 컬렉션의 저장여부 리턴 - Iterator iterator() 컬렉션의 iterator 리턴 - boolean equals(Object o) 컬렉션 동일 여부 리턴 - boolean isEmpty() 컬렉션이 비어있는지 여부 리턴 - int size() 저장된 전 객체 수 리턴 객체 삭제 void clear() 컬렉션의 모든 객체 삭제 - boolean remove(Object o) / removeAll(Collection c) 객체 및 컬렉션 삭제 후 성공여부 리턴 - boolean retainAll(Collection c) 주어진 컬렉션 제외 모든 객체 삭제 후 컬렉션의 변화 여부 리턴 객체 변환 Object[] toArray() 컬렉션에 저장된 객체를 객체배열로 변환 후 리턴 - Object[] toArray(Object[] a) 배열에서 컬렉션의 객체를 저장 후 리턴
List
List < E >
- 배열과 같이 객체를 일렬로 늘어놓은 구조
- 객체 저장 시 자동으로 인덱스 부여
- 인덱스로 객체 검색, 추가, 삭제 등의 여러 기능 제공
- List Methods ArrayList
- List 인터페이스 구현 클래스
- 컬렉션 프레임워크에서 가장 빈번하게 사용
- 객체들이 저장용량을 초과해서 들어오면 자동으로 용량이 늘어남
- 데이터 연속적 존재
- ArrayList Methods LinkedList
- 데이터 효율적 추가, 삭제 변경 위해 사용
- 데이터가 불연속적으로 존재하지만 서로 연결(link)되어있음
- 각 요소들은 자신이 연결된 이전 요소 및 다음 요소의 주소값과 데이터로 구성
- LinkedList Methods
LinkedList와 ArrayList 차이
- | ArrayList | LinkedList |
데이터 추가 | 자동 인덱스 부여 | 데이터, 데이터와 연결된 요소의 주소값 저장 |
데이터 변경 | 다른 데이터를 복사 후 이동 | 추가,삭제에 따라 앞뒤 연결된 요소의 주소값 변경 |
데이터 검색 | 인덱스를 통해 접근 | 첫 요소부터 다음 주소값으로 순차적 검색 |
연속성 | 데이터 연속적 존재 | 데이터 불연속적 존재, 서로 연결되어있음 |
강점 | 데이터를 읽어들이는 경우 용이 | 데이터 변경에 용이 |
Iterator
Iterator
- 컬렉션에 저장된 요소들을 순차적으로 읽어오는 역할
- Iterator의 컬렉션 순회기능은 Iterator 인터페이스에 정의
- Collection 인터페이스에는 Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 메서드
iterator()
가 정의되어있음 - 정의된
iterator()
메서드를 호출하면 Iterator타입의 인스턴스 반환
- Collection 인터페이스에는 Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 메서드
- Collection 인터페이스를 상속받는 List와 Set에서도 사용 가능Iterator Method
메서드 설명 hasNext() 읽어올 객체가 남아 있으면 true를 리턴하고, 없으면 false리턴 next() 컬렉션에서 하나의 객체를 읽어옴. 이 때, next()를 호출하기 전 hasNext()를 통해 다음 읽어올 요소가 있는지 먼저 확인해야함 remove() next()를 통해 읽어온 객체 삭제. next()를 먼저 호출한 다음 remove()를 호출해야함
Set
Set < E >
- 요소 중복 허용 X, 저장 순서 유지 X
- 대표적인 Set 구현 클래스에는 HashSet, TreeSet
- Set MethodsHashSet
- Set 인터페이스를 구현한 가장 대표적인 컬렉션 클래스
- 중복 값 허용 X, 저장 순서 유지 X
- 중복 확인
- 저장하고자 하는 객체의 해시코드를 hashCode() 메서드를 통해 얻어냄
- Set이 저장하고 있는 모든 객체들의 해시코드를 hashCode() 메서드를 통해 얻어냄
- 저장하고자 하는 객체의 해시코드와 Set에 저장되어있던 객체들의 해시코드를 비교하여 같은 해시코드가 있는지 검사
3-1. 같은 해시코드가 있다면?
equals() 메서드로 두 객체 비교 후 true가 나오면 같은 값으로 판단 후 Set에 객체를 저장하지않음. add(Object o) 메서드가 false 반환
3-2. 같은 해시코드가 없다면?
Set에 객체가 추가되고 add(Object o) 메서드가 true 반환
- HashSet MethodsTreeSet
- 중복 값 허용 X, 저장 순서 유지 X
- 이진 탐색 트리(Binary Search Tree)로 데이터 저장
- Binary Search Tree?
- 하나의 부모노드가 최대 두개의 자식노드와 연결되는 이진트리의 일종.
- 정렬과 검색에 특화된 자료구조
- Binary Search Tree?
- 기본 정렬 : 오름차순
- TreeSet Methods
-
Map
Map < K, V >
- 키(key)와 값(value)로 구성된 객체를 저장하는 구조
- 키값 한 쌍을 Entry객체 라고 함
- 키와 값은 모두 객체이며, 기본타입일 수 없음
- 키는 중복 불가하지만, 값은 중복 가능
⇒ 키가 중복될경우 기존 값이 새로운 값으로 덮어씌워짐 - Map 인터페이스를 구현한 클래스에는 HashMap, HashTable, TreeMap, SortedMap 등이 있다
- Map Methods HashMap
- Map 인터페이스를 구현한 대표적인 클래스
- 해시 함수를 통해 키와 값이 저장되는 위치를 결정
- 사용자는 저장되는 위치를 알 수 없음
- 삽입 순서, 위치 또한 관계없음
- HashMap은 Hashing을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어 뛰어난 성능을 보임
- HashMap Methods
- Map은 키와 값을 쌍으로 저장하기 때문에 Set형태로 변환하여 출력해야함
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "apple");
System.out.println(map.get(1)); // apple 출력
map.put(1, "banana");
System.out.println(map.get(1)); // banana 출력
}

적절한 자료구조 사용
'Java' 카테고리의 다른 글
[Java-Effective] Annotation (0) | 2022.12.16 |
---|---|
[Java -Effective] Enum (0) | 2022.12.16 |
[Java] OOP 심화 (0) | 2022.12.16 |
[Java] OOP 기초 (0) | 2022.12.16 |
[Java] 기본 문법 (0) | 2022.12.16 |