이거 다음 면접문제인데요 JAVA 소스를 돌려봤는데 결과값을 이해 못하겠어요..

qkddnjs의 이미지


Document doc[] = new Document[3];
doc[idx++] = new MIMEDocument();
//doc[idx++] = new HTMLDocument();
//doc[idx++] = new XHTMLDocument();

여기서 궁금한건..

reference 의 시작값은 영이고

doc[0] = new MIMEDocument();

에서
MIMEDocument() {
super("MIME");
}
가 실행되고

doc[0]에 있는 Document 클레스의

Document("MIME") {
this.title = "MIME";
this.reference++;// 에서 reference=1
}

reference가 1이 되었다는 것은 알겠습니다.

실행값도
MIME - 1
이 나옵니다.

근데 문제는

//doc[idx++] = new HTMLDocument();
//doc[idx++] = new XHTMLDocument();
의 주석을 해제하면

MIME - 3
HTML - 1
XHTML - 1

가 됩니다.. 하나만 해제하면

MIME - 2
가 되고요...

왜 이런건가요 원리를 모르겠네요..

class Document {
protected String title;
protected static int reference;
Document() {
this("Document");
}
Document(final String title) {
this.title = title;
this.reference++;
}
}
interface Renderable {
public void render();
}
class MIMEDocument extends Document implements Renderable {
MIMEDocument() {
super("MIME");
}
public void render() {
System.out.println(String.format("%s - %d", title, reference));
}
}
class HTMLDocument extends Document implements Renderable {
int reference;
HTMLDocument() {
title = "HTML";
reference++;
}
public void render() {
System.out.println(String.format("%s - %d", title, reference));
}
}
class XHTMLDocument extends HTMLDocument {
XHTMLDocument() {
title = "XHTML";
}
}
public class DocumentManager {
public static void main(String args[]) {
int idx = 0;
Document doc[] = new Document[3];
doc[idx++] = new MIMEDocument();
//doc[idx++] = new HTMLDocument();
//doc[idx++] = new XHTMLDocument();
for (idx = 0; idx < doc.length; idx++) {
if (doc[idx] instanceof Document)
((Renderable)doc[idx]).render();
}
}
}

qkddnjs의 이미지

class HTMLDocument extends Document implements Renderable {
int reference;
HTMLDocument() {
title = "HTML";
reference++;
}
public void render() {
System.out.println(String.format("%s - %d", title, reference));
}
}

int reference;로 재정의 하기전에
reference++; 가 먼저 실행되는 건가?

그럼 왜 reference가 1이되는 거지??(HTML - 1에서)

cleansugar의 이미지

static 붙으면 부모나 자식 클래스 필드보다 먼저 호출됩니다.

이거 묻는 문제같네요.

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

towstock의 이미지

자식 class의 instance가 생성될 때마다 Document의 생성자가 호출되어 static reference의 값이 증가합니다.
그러므로 MIMEDocument, HTMLDocument, XHTMLDocument의 instance를 하나씩 생성했으니까 static reference의 값은 3입니다.

MIMEDocument는 render()method가 호출되었을 때 Document의 static reference를 참조하므로 3을 출력하죠.

하지만 HTMLDocument와 XHTMLDocument는 각각 local에 정의된 reference를 참조하므로 1을 출력합니다.

qkddnjs의 이미지

MIMEDocument에서 호출하는 생성자는
super(MIME)으로
Document("문자열") 아규먼트가 있는 생성자인데..

HTMLDocument, XHTMLDocument를 생성할 때마다 레퍼런스값이 증가하는 이유는 뭔가요?

기본값인 Document()를 불러온다고 하면 레퍼런스값이 증가하지 않는게 맞지 않나요?

자식클레스의 인스턴스가 생성될때 다큐먼트의 생성자를 호출한다면 따로 정의하지 않는한 기본값을 가져와야 하지 않나요?

qkddnjs의 이미지

아 Document() {
this("Document");
}

구나..... ㅡㅡ;;

헐 낚였네...

qkddnjs의 이미지

new 로 생성을 해도 하나의 스테틱변수를 여러개의 생성자가 공유하는 개념인가요?

Document a = new Document();
Document b = new Document();

에서 b의 스테틱변수를 바꾸면 a의 변수도 바뀌나요?

qkddnjs의 이미지

Document a=new Document();
a.reference=0;

((Renderable)doc[0]).render();

값값이 MIME - 0가 나오네요...

스테틱은 같은 클레스의 생성자에 new 를 이용해서 여러게 만들어도 하나의 변수만 공유하는듯

익명 사용자의 이미지

잘 보시면

class HTMLDocument extends Document implements Renderable {
int reference; // <<<<<<<<< 요기..
HTMLDocument() {
title = "HTML";
reference++;
}
public void render() {
System.out.println(String.format("%s - %d", title, reference));
}

그리고

XHTMLDocument 이놈은 다시 HTML 상속 받았구요..

세놈모두 생성 당시에 상속 받아 놓은 Document의 static int reference를 증가를 시킬 것입니다.

문제는 Render() 인데요..

MIMEDocument는 reference라는 변수가 Document의 것을 호출을 할 것이나

HTMLDocument, XHTMLDocument 경우는 HTMLDocument 가 선언을 해 놓은 reference를 참조하여 출력하겠네요..

(당연히 저게 다시 static 이라면 MIMEDocument-3 HTMLDocument-1 XHTMLDocument-2가 됐겠죠)

HTMLDocument 에서 선언 한 int reference;를 봤냐 못봤냐를 따지는 관찰력 문제 ㅡㅡ;

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.