자바 개발자 양성 과정 4주차 - 2
[제네릭]
: 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법 <>
ex) ArrayList<String> list = new ArrayList<>();
이렇게 쓰면 list클래스의 자료형 타입은 String으로 지정돼서 String타입만 리스트에 적재가능해짐
# 변수를 선언할 때 변수의 타입을 지정해주듯 (int a=0;), 제네릭은 타입을 지정해주는 것이라고 보면 됨
List<T>
여기서 <> 안에 있는 T를 [타입 매개변수] 라고 한다.
제네릭에서 가장 중요하다고 보여지는 부분은 바로 다형성과의 연관성이다.
class Fruit { }
class Apple extends Fruit { }
class Banana extends Fruit { }
class FruitBox<T> {
List<T> fruits = new ArrayList<>();
public void add(T fruit) {
fruits.add(fruit);
}
}
public class Main {
public static void main(String[] args) {
FruitBox<Fruit> box = new FruitBox<>();
// 제네릭 타입은 다형성 원리가 그대로 적용된다.
box.add(new Fruit());
box.add(new Apple());
box.add(new Banana());
}
}
출처: https://inpa.tistory.com/entry/JAVA-☕-제네릭Generics-개념-문법-정복하기 [Inpa Dev 👨💻:티스토리]
해당 예제에서 FruitBox<T>{} 안에 있는 add()를 보면
매개변수가 T fruit로 부모클래스로 형변환해서 받을 수 있는데(업캐스팅)
이렇게 다형성을 이용한 부분을 이해하는 게 중요해보인다.
#보통은 매개변수에 object클래스를 넣어서 모든 클래스를 받을 수 있게 한다
[컬렉션]
그동안 사용했던 배열의 문제점은
1. 크기 변경(수정) 불가
2. 배열에 기록된 데이터에 대한 중간위치의 추가, 삭제 불편
3. 한 타입의 데이터만 저장이 가능
이 문제점들을 해결해줄 수 있는 게 컬렉션이다
컬렉션의 장점은
1. 저장하는 크기의 제약이 없다
2. 추가, 삭제, 정렬 등의 처리가 간단하게 해결된다
ㄴ 자료구조가 내장되어있어서 알고리즘 구현이 필요없음
3. 여러 타입의 데이터가 저장 가능하다.
컬렉션의 주요 인터페이스에는 3가지가 있는데
Collection으로 분류되는 List계열과 Set계열
그리고 컬렉션과는 별개의 Map계열이 있다.
<List 계열>
1. ArrayList<E>
장점
◾저장된 인스턴스의 참조가 빠르다(서로 붙어있음)
단점
◾ 저장공간을 늘리는 과정에서 시간 소요가 큼
2. LinkedList
◾ 저장된 인스턴스의 참조과정이 배열에 비해 복잡(느림)
ㄴ 서로 붙어있지 않고 서로를 참조하고 있기 때문
◾ 저장된 인스턴스의 삭제 과정이 단순(같은 이유)
<Set계열>
set
특징
◾ 저장 순서 유지 x
◾ 중복 객체 저장 x
구현 클래스 3가지(HashSet, LinkedSet, TreeSet)
Set에서 가장 중요한 점은 중복 객체 판별 방법인데
이를 object클래스의
equals() 와 hashCode()의 호출 결과를 기준으로 판별한다.
두 인스턴스가 hashCode메소드 호출 결과로 반환하는 값이 동일해야하고
또한 두 인스턴스를 대상으로 equals호출 결과가 true로 반환되면 동일 인스턴스로 판별함.
<Map계열>
Map
키(key)와 값(value)으로 구성되어 있으며 키/값은 모두 객체
키는 중복 저장을 허용하지 않고(set방식), 값은 중복 저장이 가능하다.(List방식)
# HashMap는 equals() 와hashCode()를 재정의해서 동등 객체가 될 조건을 정해야 한다.