(자바) 새 노드를 만들어서 노드를 대입한 후에, 내용물을 꺼내보니 타입이 다릅니다.
글쓴이: 하진호@Google / 작성시간: 일, 2017/03/26 - 5:24오후
더블리 링크드 리스트로 프리스토어를 시뮬레이션하는 프로그램을 만드는 과제 중인데요,
일단 heap은 더블리 링크드 리스트이고, .getFirst()는 그 첫번째 노드입니다.
heap에 있는 노드를 순서대로 돌아가면서 그 내용물을 비교하려고 Node current를 만들어서 대입하였는데,
.getItem()으로 내용물을 살펴보니, 노드에 원래 들어있던 Blcok이라는 타입(따로 만든 타입입니다.)이 아니라 java.lan.object 타입으로 바뀌는데요.
블록의 코드는 이렇습니다.
class Block {
public int size;
public int start;
public int end;
public Block(int size, int start, int end) {
this.size = size;
this.start = start;
this.end = end;
}
@Override
public String toString() {
return "(" + size +", " + start + ", " + end + ")";
}
}
왜 current로 내용물을 불러오면 blcok이라는 타입을 유지할 수 없나요?
File attachments:
첨부 | 파일 크기 |
---|---|
![]() | 62.62 KB |
Forums:
지금 하신 질문이 답변 가능한 질문이라고 생각하시나요
지금 하신 질문이 답변 가능한 질문이라고 생각하시나요? 답을 얻고 싶으면 답을 얻을 수 있게 질문을 해야지요:) 같은 문제가 발생하는 가장 작은, 완결된 (즉 컴파일해서 실행가능한) 프로그램을 만들어서 그것을 가지고 질문하세요. 그런 프로그램을 만드는 과정에서 스스로 문제를 파악하게될 수도 있습니다. 그게 공부하는 과정이지요. 파악이 안되면 그 때 그 코드를 가지고 질문하는거구요.
일단 지금 만들고 있는 것의 알고리즘 자체는 다
일단 지금 만들고 있는 것의 알고리즘 자체는 다 써놓긴 했는데, current.item()이 내주는 결과만 생각했던 것 하고 달라서요.... 내용을 최대한 줄이려고 해도, 더블리 링크드 리스트 정의와 노드 정의 코드는 그럼 같이 올려야 할텐데, 그래도 되나요? 일단, 컴파일 해서 파악한 건 current.item()이 내주는 타입이 java.lang.object이고, string으로 변환해서.... 쓸 수는 있는데.... 이게 왜 원래 녀석이랑 타입이 달라지는 건지를....; 모르겠어요.
다시 말씀드리지만 가능한 한 작게 "다시" 만드세요.
다시 말씀드리지만 가능한 한 작게 "다시" 만드세요. 같은 문제가 발생하는 가장 짧은 코드가 핵심입니다. 원래 의도하신 바를 달성하는 코드는 필요없어요. 문제를 재현하는 것이 목표입니다. 원래 코드에서 문제를 재현하는 데 필요없는 부분을 뺀다고 생각하지 마시고 완전히 새로 짧은 프로그램을 짜서 같은 문제를 발생시킬 수 있는 지 시도해보세요.
package test.assignment2;
package test.assignment2;
import test.assignment2.DLinkedList;
/* Block will be used as a type argument */
class Block {
public int size;
public Block(int size, int start, int end) {
this.size = size;
}
@Override
public String toString() {
return "(" + size + ")";
}
}
public class MemoryManager {
private DLinkedList heap = new DLinkedList<>();
public MemoryManager(int capacity) {
Block first_value = new Block(capacity, 0, capacity - 1);
heap.addFirst(new Node<>(first_value, null, null));
}
public Block malloc(int size) {
Node current = heap.getFirst();
System.out.println(current.getItem() instanceof Block);
System.out.println(heap.getFirst().getItem() instanceof Block);
//아이템의 내용이 블록인지 확인해보니 둘다 트루임.
int a = current.getItem().size;
int b = heap.getFirst().getItem().size;
//둘다 블록이기 때문에 .size를 하면 int값이 나와야하는데, 첫번째 때문에 컴파일 되지 않음.
return heap.getFirst().getItem();}
public static void main(String... args) {
MemoryManager mem = new MemoryManager(2024);
mem.malloc(120);
}
}
최대한 줄여보려고 했는데, 더블리 링크드 리스트로 되지 않게는 재현을 못하겠네요. (일반적인 더블리 링크드 리스트와 노드 구현인데.... 어떻게 할수가...)
그리고 좀 ; 이상한게 다시 한번 해보니까 이번에는 또 current.getItem()이 블록이 맞다며 컴파일은 되는데, 여전히 그것의 size를 찾으려고하니까.
Error:(39, 34) java: cannot find symbol
symbol: variable size
location: class java.lang.Object
라는 에러가 떠서 컴파일이 되지 않습니다. 결국 current.getItem()은 Block 개체가 아니라, lang.object 객체로 바뀐 것 같은데. 왜 둘 이 같은 값임에도, current만 getItem()하면 타입이 유지가 안될까요?
class A {
위 코드에서 본인이 겪은 문제가 재현되었고 또 해결되었다고 생각하시나요? 아니면 다른 문제라고 생각하시나요?
정말 이해하기 쉬운 답변입니다... 제가 너무 실력이
정말 이해하기 쉬운 답변입니다... 제가 너무 실력이 모자라네요....
감사합니다!!!
댓글 달기