Java List - 직접 구현해보기 4
기존의 List 직접 구현한 것에서 Object 타입으로 입력을 받아 반환을 해왔다. Object 타입이 아무나 받을 수 있고 다운캐스팅으로 바운드하고 있었으므로 타입 안정성이 부족한 단점이 있었다.
CList list = new CList();
list.add(100);
list.add(200);
System.out.println(list);
// 다운캐스팅 발생
Integer num1 = (Integer) list.get(0);
System.out.println(num1);
[100, 200], size = 2, capacity = 10
100
- list 자료구조에는 숫자만 입력하기 바라나 Object 타입으로 받아 저장하므로 모든 타입을 저장한다. 숫자를 입력하다가 실수로 문자를 입력하여도 문제가 되지 않는다.
- 값을 꺼낼 때 Object 반환하므로 입력한 타입으로 받으려면 다운 캐스팅을 해주어야 한다. 데이터 타입을 정확하게 알고 있지 않으면 예외가 발생.
자료 구조에는 숫자와 문자와 같이 관계 없는 여러 데이터 타입을 섞어서 보관하지 않는다. 같은 데이터 타입을 보관하며 관리한다.
타입 안정성을 확보하고 여러 문제들을 해결할 수 있도록 제너럴을 도입한다.
CList
자료구조로 만든 CList 에서 제네릭으로 변경한다.
제네릭 타입 선언
public class CList<E> {
...
}
- 클래스 우측에 제네릭 타입을 선언한다.
참고로 데이터 보관하는 사용하는 elementData 배열은 Object[] 그대로 둔다.
메소드 파라미터 변경
public void add(E e) {
...
}
public void add(int index, E e) {
...
}
public Object set(int index, E element) {
...
}
public int indexOf(E o) {
...
}
- Object 타입으로 입력받도록 선언한 파라미터를 제네릭 E 으로 변경하였다.
메소드 반환 타입 변경하기
@SuppressWarnings("unchecked")
public E get(int index) {
return (E) elementData[index];
}
// 코드 추가
public E remove(int index) {
E oldValue = get(index);
shiftLeftFrom(index);
// 데이터 이동
size--;
elementData[size] = null;
return oldValue;
}
public E set(int index, E element) {
E oldValue = get(index);
elementData[index] = element;
return oldValue;
}
- 메소드 반환 부분에서 E 타입으로 변경하였다.
- return (E) elementData[index]; 캐스팅 경고가 발생한다. 보관하는 배열의 타입 문제가 생길 수 있다는 것이다. 지금은 @SuppressWarnings("unchecked") 어노테이션으로 경고를 무시하도록 한다.
- 자바 컴파일러가 애노테이션 주석으로 경고를 없애준다.
Object[] elementData 는 유지할 수 밖에 없다. new Object[int] 로 할당하고 있으므로 오브젝트 타입은 추후에 개선한다.
Main.class
CList<String> stringList = new CList<>();
stringList.add("a");
stringList.add("b");
System.out.println(stringList);
String str1 = stringList.get(0);
System.out.println(str1);
[a, b], size = 2, capacity = 10
a
CList<Integer> intList = new CList<>();
intList.add(100);
intList.add(200);
System.out.println(intList);
Integer int1 = intList.get(0);
System.out.println(int1);
[100, 200], size = 2, capacity = 10
100