본문 바로가기

개발이야기/Effective Java

[Effective Java]가능하면 제네릭 자료형으로 만들 것

컬렉션 객체 선언을 제네릭화 하거나, JDK가 제공하는 제네릭 자료형과 메서드를 사용하는 것은 일반적으로 어렵지 않다. 그러나 제네릭 자료형을 직접만드는 것은 어렵지만 그래도 배워둘만한 가치가 있다.


1. 제네릭을 사용하지 않고 Object class를 활용하여 만든 Stack class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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) {...}
 
    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        Object result = elements[--size];
        elements[size] = null
        return result;
    }
}
cs


2. 제네릭을 사용하여 만든 최초 Stack class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Stack<E> {
    private E[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;
 
    @SuppressWarnings("unchecked")
    public Stack() {
        elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
    }
 
    public void push(Object e) {...}
 
    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        Object result = elements[--size];
        elements[size] = null;
        return result;
    }
}
cs


3. elements class자체를 변경하여 만든 최종 Stack class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Stack<E> {
    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(E e) {...}
 
    public E pop() {
        if (size == 0)
            throw new EmptyStackException();
 
        @SuppressWarnings("unchecked")
        E result = (E) elements[--size];
        elements[size] = null
        return result;
    }
}
cs

End of Document