티스토리 뷰
Stack를 구현하던 도중 다음과 같은 에러가 발생했다 왜 이런 오류가 발생했을까? 자세한 코드는 다음과 같다.
import java.util.EmptyStackException;
public class ListStack<E> {
private Node<E> top;
private int size;
public ListStack(){
top = null;
size = 0;
}
public int size() {
return size;
}
public boolean isEmpty(){
return size == 0;
}
//push() , pop() , peek()
public E peek(){
if(isEmpty()) {
throw new EmptyStackException();
}
return top.getItem();
}
public <E>E push(E item){
Node<E> newNode = new Node<>(item);
newNode.setNext(top);
top = newNode;
size++;
return newNode.getItem();
}
}
public class Node<E> {
private E item;
private Node<E> next;
public Node(E item) {
this.item = item;
this.next = null;
}
public E getItem() {
return item;
}
public void setItem(E item) {
this.item = item;
}
public Node<E> getNext() {
return next;
}
public void setNext(Node<E> next) {
this.next = next;
}
}
문제를 보던 도중 답을 찾으면서 처음 들었던 생각이 아 각기 다른 클래스에서 제네릭<E>가 설정되면서 충돌이 일어난건가? 그러면 Node<E>를 Node<T>로 바꿔주면되나? 였는데 사실 바꿔도 동작은 하는데 문제는 그렇게되면 Stack 클래스의 타입과 Node 클래스의 타입이 다르게 되면서 구현이 더 복잡해지는 듯 하다
그렇게 생각하다가 gpt에게 이 문제에 대해서 물어봤다.
아! 보면서 들었던 생각이 클래스에 선언된 E 타입은 클래스 메모리에 저장이 되고 메서드 시그니처에 있던 <E> E 타입은 힙 메모리에 저장이 되게 되면서 동일한 패키지 내에있는 클래스명을 어디서 호출해와야 할지 알수없는 문제가 생기기 때문에 문제가 발생하구나! 라는 생각이 들었다.
사실 답이 정확하게 맞는지는 더욱 공부해 봐야 할 수 있을 것 같다.
'공부 > TIL' 카테고리의 다른 글
Redis (0) | 2025.06.12 |
---|---|
refusing to merge unrelated histories (0) | 2023.08.30 |
정처기 - 2 (0) | 2023.07.06 |
정처기 정리 (0) | 2023.07.05 |
바이트코드, 바이너리코드 (0) | 2023.06.30 |
댓글