관리 메뉴

쿰뱅이

Java에서 인스턴스(객체)를 만드는 다양항 방법 본문

자바/JAVA 입문

Java에서 인스턴스(객체)를 만드는 다양항 방법

주년 2012. 4. 10. 15:11
반응형

Java에서 인스턴스(객체)를 만드는 다양항 방법


Java에서는 다음과 같이 인스턴스(객체)를 만드는 방법이 있다.

 

new

일반적으로 인스턴스는 Java의 예약어 new를 사용해서 만든다. 다음과 같이 하면 Something 클래스의 인스턴스를 만들고 변수 obj에 대입할 수 있다.

--> obj라는 이름을 가지는 Something 클래스 타입의 객체를 가진다 라고 말할 수 있겠다.

 

  1. Something obj = new Something();

 

이 경우 클래스 이름(여기에서는 Something)을 소스 안에 기술할 필요가 있다.

 

clone

Prototype 패턴에서 등장했던 clone 메소드를 사용하면 이미 존재하는 인스턴스를 기초로 새로운 인스턴스를 만들 수 있다. 다음과 같이 하면 자신(this)을 기초로 새로운 인스턴스(객체)를 만들 수 있다(단, 생성자는 호출되지 않는다).

java.lang
클래스 Class<T>

          java.lang.Object 
상위를 확장 java.lang.Class<T>

java.lang
클래스 Object

          java.lang.Object
          

clone

          protected Object  clone()
throws CloneNotSupportedException

이 객체의 카피를 작성해, 돌려줍니다. 「카피」의 정확한 이유는, 객체의 클래스에 의해 다릅니다. 일반적으로는, 임의의 객체 x 에 대해, 다음의 식
           x.clone() ! = x
          
하지만 true 이며, 다음의 식
           x.clone(). getClass() == x.getClass()
          
도 true 인 것입니다만, 이것들도 절대적인 요건이 아닙니다. 또 다음의 식
           x.clone(). equals(x)
          
도 일반적으로 true 가 됩니다만, 이것도 절대적인 요건이 아닙니다.

일반적으로,super.clone 를 호출하는 것으로 반환되는 객체를 취득할 수 있습니다. 클래스 및 그 슈퍼 클래스 모든 것 (Object 를 제외한다)이 이 규칙에 따르는 경우,x.clone(). getClass() == x.getClass() 가 성립합니다.

일반적으로, 이 메소드에 의해 반환되는 객체는, 이 객체 (복제되고 있다)로부터 독립하고 있을 필요가 있습니다. 이 독립성을 달성하기 위해(때문에),super.clone 가 돌려주는 객체의 필드를 1 개 이상 (객체가 돌려주기 전에) 변경하는 것이 필요하게 되는 경우가 있습니다. 이것은, 일반적으로, 복제하는 객체의 내부 「심층 구조」를 구성하는 가변 객체의 카피, 및 이러한 객체에의 참조를 카피에의 참조에 옮겨놓는 것을 의미합니다. 클래스에 프리미티브(primitive) 필드 또는 불변 객체에의 참조만이 포함되는 경우, 일반적으로,super.clone 에 의해 반환되는 객체내의 필드를 변경할 필요는 없습니다.

Object 클래스의 clone 메소드는, 특정의 복제 처리를 실행합니다. 우선, 이 객체의 클래스가 Cloneable 인터페이스를 구현하고 있지 않는 경우는,CloneNotSupportedException 가 throw 됩니다. 배열은 모두, 인터페이스 Cloneable 를 구현하고 있는 것이라고 보여지는 것에 주의해 주세요. 구현하고 있지 않는 경우, 이 메소드는 이 객체의 클래스의 새로운 인스턴스를 생성해, 그 필드를 모두, 이 객체의 대응하는 각 필드의 내용으로 초기화합니다. 이것은 대입과 같아, 필드의 내용 자신이 복제되는 것은 아닙니다. 즉 이 메소드는, 객체의 「shallow 복사」를 생성합니다만, 「딥 카피」는 생성하지 않습니다.

Object 클래스 자체는,Cloneable 인터페이스를 구현하지 않기 때문에, 클래스가 Object 인 clone 메소드를 호출하면(자), 실행시에 예외가 throw 됩니다.

반환값:
이 인스턴스의 복제
예외:
CloneNotSupportedException - 객체의 클래스가 Cloneable 인터페이스를 지원하고 있지 않는 경우. clone 메소드를 오버라이드(override) 한 서브 클래스도, 인스턴스를 복제할 수 없는 것을 나타내기 위해서(때문에) 이 예외를 throw 하는 일이 있는
관련 항목:
Cloneable

JDK 1.6 API 상에 설명되는 clone() 메소드의 개요

 

  1. class Something {
        ...
        public Something createClone() {
            Something obj = null;
            try {
                obj = (Something)clone();
            } catch ( CloneNotSupportedException e ) {
                e.printStackTrace();
            }
            return obj;
        } 
    }

 

newinstance

java.lang.Class 클래스의 newInstance 메소드를 사용하면 Class의 인스턴스(객체)를 기초로 그 Class가 표시하고 있는 클래스의 인스턴스(객체)를 만들 수 있다(인수 없는 생성자가 호출된다).

newInstance

          public T  newInstance()
throws InstantiationException ,
IllegalAccessException
이 Class 객체가 나타내는 클래스의 새로운 인스턴스를 생성합니다. new 식에 빈 상태(empty)의 인수 리스트를 지정했을 경우와 같이, 클래스의 인스턴스가 생성됩니다. 클래스는, 초기화되어 있지 않으면 초기화됩니다.

이 메소드는 확인이 끝난 예외 등, 인수 없음의 생성자 에 의해 throw 된 예외를 보내는 것에 주의해 주세요. 이 메소드를 사용하는 것으로, 그 외의 경우에는 컴파일러에 의해 실행되는 컴파일시의 예외 확인을 효과적으로 우회도로 할 수 있습니다. Constructor.newInstance 메소드는, (확인 끝난) InvocationTargetException 의 생성자 에 의해 throw 된 예외를 랩 하는 것으로, 이 문제를 회피합니다.


반환값:
이 객체가 나타내는, 클래스의 새롭게 할당할 수 있었던 인스턴스
예외:
IllegalAccessException - 클래스 또는 그 인수 없음의 생성자 에 액세스 할 수 없는 경우
InstantiationException - 이 Class 가 abstract 클래스, 인터페이스, 배열 클래스, 원시형, 또는 void 를 나타내는 경우, 클래스가 인수 없음의 생성자 을 보관 유지하지 않는 경우, 혹은 인스턴스의 생성이 다른 이유로써 실패했을 경우
ExceptionInInitializerError - 이 메소드에 의한 초기화가 실패했을 경우
SecurityException - 시큐리티 매니저 s 가 존재해, 이하의 조건의 어떤 것인가가 채워지는 경우
  • s.checkMemberAccess(this, Member.PUBLIC) 의 호출이 이 클래스의 신규 인스턴스의 작성을 허가하지 않는다
  • 호출측의 클래스 로더가 같지 않은지, 현재의 클래스 로더의 상위 클래스 로더와 s.checkPackageAccess() 의 호출이 이 클래스의 패키지에의 액세스를 허가하지 않는다

다음은 newInstance의 예입니다. Something 클래스의 인스턴스 someobj가 있다면 다음 식에서 Something 클래스의 인스턴스를 새롭게 만들 수 있다.

  1. someobj.getClass().newInstance();

 

실제로 newInstance 메소드는 InstantiationException이나 IllegalAccessException을 예외로 제공하기 때문에 try{ } catch() {}로 묶든지 메소드에 throws을 선언해야 한다.


출처 : http://sunfuture.springnote.com/pages/3384377

반응형