자바에서 객체를 생성할 때 다음 두 가지 경우의 차이점은?

2013-03-12 14:35

jpa에서 unknown entity 에러가 발생하는 이유는?(http://www.slipp.net/questions/103)) 질문에 대한 해결책을 찾았다. 그런데 해결책에 대한 질문을 찾아보니 그 동안 아무 생각없이 사용하던 객체를 생성하던 부분이 다른 부분이 있구나라는 생각을 해봤다. 아직 정확히 어떤 차이가 있고 어떤 부분을 주의해서 사용해야하는지 방법을 찾지 못했다. 이 질문을 통해서 정확한 차이를 이해했으면 좋겠다.

질문은 다음 코드와 같이 객체를 생성할 때 두 가지 방식으로 생성하 수 있다.

public class ObjectCreator {
    public void create1() {
        HelloWorld hw = new HelloWorld();
    }
    
    public void create2() {
        HelloWorld hw = new HelloWorld() {
        };
    }
}

create1 메소드는 이미 생성되어 있는 HelloWorld() 클래스를 직접 생성하는 것이고 create2 메소드는 HelloWorld 클래스를 상속하는 새로운 객체를 생성하는 것이다. 그런데 이와 같이 생성해 사용할 경우 둘 사이의 동작은 같으리라 생각했다. 그런데 jpa에서 unknown entity 에러가 발생하는 이유는?(http://www.slipp.net/questions/103)) 질문에서 발생하는 현상을 보면 둘 사이의 동작이 다르다는 것을 알 수 있다. 이 둘 사이에 어떤 차이로 인해 이 같은 에러가 발생할까? 문제를 해결하기는 했지만 아직 정확한 원인을 찾지 못했다.

위 소스 코드에 대한 바이트코드를 javap로 보면 둘 사이가 다르게 동작하는 것을 알 수 있다.

Compiled from "ObjectCreator.java"
public class ObjectCreator {
  public ObjectCreator();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return


  public void create1();
    Code:
       0: new           #2                  // class HelloWorld
       3: dup
       4: invokespecial #3                  // Method HelloWorld."<init>":()V
       7: astore_1
       8: return


  public void create2();
    Code:
       0: new           #4                  // class ObjectCreator$1
       3: dup
       4: aload_0
       5: invokespecial #5                  // Method ObjectCreator$1."<init>":(LObjectCreator;)V
       8: astore_1
       9: return
}

0개의 의견 from FB

4개의 의견 from SLiPP

2013-03-12 14:41

create2에서 생성되는 클래스명으로 추측해 봤을 때 이 같은 에러가 발생한 이유는 HelloWorld 클래스를 생성했지만 HelloWorld 클래스가 아니라 ObjectCreatore의 Inner Class처럼 생성되었기 때문으로 생각된다.

jpa에서 unknown entity 에러가 발생하는 이유는?(http://www.slipp.net/questions/103)에서에서) 발생한 에러도 Question을 생성했는데 Question 객체가 아니라 QuestionBuilder로 인식했기 때문에 jpa Entity로 인식하지 못하는 이슈가 발생한 것이라는 생각이 이 질문을 올리고 생성된 클래스명을 보는 순간 들었다.

2013-03-12 15:58

해당클래스를 상속받은 이름없는 클래스가 인스턴스가 되었을텐데요.

aop가 적용되기 위하여.

이 이름없는 클래스의 자식 클래스가 cglib으로 만들어지고 이 녀석이 이름없는 클래스를 가지는 관계가 되다보니 꼬여서 문제가 발생할듯 한데요

엉뚱한 답변이면 어떻게하지.

의견 추가하기

연관태그

← 목록으로