item 29 : 이왕이면 제네릭 타입으로 만들라.
1. 기존 단순 스택 코드 뭐가 문제 일까? : 오브젝트 기반
import java.util.Arrays;
import java.util.EmptyStackException;
public class Stack {
private Object[] elements; // 스택 요소를 담을 배열
private int size = 0; // 스택의 현재 크기
private static final int DEFAULT_INITIAL_CAPACITY = 16; // 기본 초기 용량
// 기본 생성자: 초기 용량을 가진 배열 생성
public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
// 요소를 스택에 추가
public void push(Object e) {
ensureCapacity(); // 배열의 크기를 확인하여 필요 시 확장
elements[size++] = e; // 요소를 배열에 추가하고 크기 증가
}
// 스택에서 요소를 제거하고 반환
public Object pop() {
if (size == 0) {
throw new EmptyStackException(); // 스택이 비어 있을 경우 예외 발생
}
Object result = elements[--size]; // 스택의 마지막 요소 반환
elements[size] = null; // 사용이 끝난 참조 해제
return result;
}
// 스택이 비어 있는지 확인
public boolean isEmpty() {
return size == 0;
}
// 배열의 크기를 확장하여 용량을 보장
private void ensureCapacity() {
if (elements.length == size) {
// 배열의 크기를 2배 + 1로 확장
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}
}

2. 우선 object를 Generic으로 바꾸기
1) 제네릭 스택으로 가는 첫 단계 : Stack<E>로 제네릭 타입을 추가하여 스택의 요소 타입을 지정할 수 있도록 했다.
Stack<E>로 제네릭 타입을 추가하여 스택의 요소 타입을 지정할 수 있도록 했다.2) 우회 방법 1 : 제네릭 배열 생성을 금지하는 제약을 대놓고 우회


3) 우회 방법 2 : elements 필드의 타입을 E[] 에서 Object[]로 바꾸는 것

4) 위의 2가지 방법의 차이는?


3. 제네릭 타입 사용 시 주의점
4. 타입 매개변수 제약




한정적 타입 매개변수
5. 스터디에서 나온 질문
1. List<Number>
List<Number>2. List<E extends Number>
List<E extends Number>주요 차이점 요약
예제: 불공변성의 문제
요약
✨ 최종 정리
Last updated
