(자바) 새 노드를 만들어서 노드를 대입한 후에, 내용물을 꺼내보니 타입이 다릅니다.

하진호@Google의 이미지

더블리 링크드 리스트로 프리스토어를 시뮬레이션하는 프로그램을 만드는 과제 중인데요,

일단 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: 
첨부파일 크기
Image icon 더블리.png62.62 KB
...!의 이미지

지금 하신 질문이 답변 가능한 질문이라고 생각하시나요? 답을 얻고 싶으면 답을 얻을 수 있게 질문을 해야지요:) 같은 문제가 발생하는 가장 작은, 완결된 (즉 컴파일해서 실행가능한) 프로그램을 만들어서 그것을 가지고 질문하세요. 그런 프로그램을 만드는 과정에서 스스로 문제를 파악하게될 수도 있습니다. 그게 공부하는 과정이지요. 파악이 안되면 그 때 그 코드를 가지고 질문하는거구요.

하진호@Google의 이미지

일단 지금 만들고 있는 것의 알고리즘 자체는 다 써놓긴 했는데, current.item()이 내주는 결과만 생각했던 것 하고 달라서요.... 내용을 최대한 줄이려고 해도, 더블리 링크드 리스트 정의와 노드 정의 코드는 그럼 같이 올려야 할텐데, 그래도 되나요? 일단, 컴파일 해서 파악한 건 current.item()이 내주는 타입이 java.lang.object이고, string으로 변환해서.... 쓸 수는 있는데.... 이게 왜 원래 녀석이랑 타입이 달라지는 건지를....; 모르겠어요.

...!의 이미지

다시 말씀드리지만 가능한 한 작게 "다시" 만드세요. 같은 문제가 발생하는 가장 짧은 코드가 핵심입니다. 원래 의도하신 바를 달성하는 코드는 필요없어요. 문제를 재현하는 것이 목표입니다. 원래 코드에서 문제를 재현하는 데 필요없는 부분을 뺀다고 생각하지 마시고 완전히 새로 짧은 프로그램을 짜서 같은 문제를 발생시킬 수 있는 지 시도해보세요.

하진호@Google의 이미지

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 {
	public A() {
		size = 1;
	}
 
	public int size;
}
 
class B {
	public void set(Object a) {
		this.a = a;
	}
 
	public Object get() {
		return a;
	}
 
	private Object a;
}
 
class C<T> {
	public void set(T t) {
		this.t = t;
	}
 
	public T get() {
		return t;
	}
 
	private T t;
}
 
public class Test {
	public static void main(String[] args) {
		A a = new A();
 
		B b = new B();
		b.set(a);
		System.out.println(b.get() instanceof A);
		System.out.println(b.get() instanceof Object);
		//System.out.println(b.get().size); //compile error. cannot find symbol.
 
		C<A> c = new C<A>();
		c.set(a);
		System.out.println(c.get() instanceof A);
		System.out.println(c.get() instanceof Object);
		System.out.println(c.get().size);
	}
}

위 코드에서 본인이 겪은 문제가 재현되었고 또 해결되었다고 생각하시나요? 아니면 다른 문제라고 생각하시나요?

하진호@Google의 이미지

정말 이해하기 쉬운 답변입니다... 제가 너무 실력이 모자라네요....
감사합니다!!!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.