"인스턴스화"와 "초기화"의 차이점은 무엇입니까?


105

VB.NET에 대한 Microsoft 자습서에서 사용되는이 두 단어를 들었습니다. 변수와 관련하여 사용될 때이 두 단어의 차이점은 무엇입니까?

답변:


142

가치 기준 참조 유형

C #의 변수 는 두 그룹 중 하나에 있습니다. 유형 또는 참조 유형. int및 같은 유형 DateTime 유형입니다. 반대로 생성하는 모든 클래스는 참조 유형입니다. C # 문자열도 참조 유형입니다. .NET 프레임 워크의 대부분은 참조 유형입니다.

변수의 일부

변수 이름이 있고 value 입니다. 두 부분 .

변수의 이름 은 사용자가 선언 한 것입니다. 값은 당신이 무엇을 할당하는 그것.

변수가 초기화 됨

모든 변수는 변수가 선언 되는 시점에서 항상 초기 값이 주어집니다 . 따라서 모든 변수가 초기화 됩니다.

들어 유형처럼 int그렇게 명시 적으로하지 않으면 컴파일러 그들에게 올바른 가치를 제공 할 것입니다. int의는 초기화 기본적으로 제로로, DateTime의는 초기화DateTime.MinValue기본적으로.

참조 유형 변수 는 사용자가 제공 한 객체로 초기화 됩니다. 그렇지 않으면 컴파일러는 객체 (즉, 유효한 값)를 할당 하지 않습니다. 이 경우 값은 null-없음입니다. 그래서 우리는 참조가 null 로 초기화 되었다고 말합니다 .

개체가 인스턴스화됩니다.

인간이 태어났습니다. 개체가 인스턴스화됩니다. 아기는이다 예를 인간의 객체는이다 예를 몇 가지 클래스의.

클래스 의 인스턴스 를 만드는 행위를 인스턴스화 (Ta-Da!)라고합니다.

따라서 다음 과 같이 선언 , 초기화인스턴스화 가 함께 제공됩니다.

MyClass myClassyReference = new MyClass();

위에서 "... 객체 의 인스턴스를 생성하는 중 ..."이라고 말하는 것은 잘못된 것입니다 .


편집-댓글 토론에서 영감을 얻음

별개의 용어를 사용하여 위의 세 가지 별개의 작업이 진행되고 있으며 해당 용어는 서로 바꿔서 사용할 수 없습니다.

  1. 참조 변수가 선언되었습니다. MyClass myClassyReference
  2. 객체가 인스턴스화됩니다 (... 주어진 클래스 에서 / 내포 됨)-new MyClass()
  3. 개체가 변수에 할당됩니다. =.

사실을 다시 말함 :

  1. 참조 유형 변수는 단순히 "참조"라고도합니다. "값 유형 변수"는 참조가 아닙니다.

  2. 이것은 "objectA는 객체의 인스턴스입니다"는 완전히 잘못되었습니다. objectA가 "objectB의 인스턴스"였다면 objectA는 objectB의 유형 (어떤 것이 든 현재 상태)으로 생명을 시작해야합니다. objectB가 변경되면 개체 D, E 및 F를 만드는 것은 어떻습니까? 아니, 아니! "objectA는 클래스의 인스턴스"라는 개념적이고 기술적 인 경우입니다. "Instantiation"및 "instance of"는 정확한 의미를 갖습니다. 객체는 클래스에서 유형, 정의 및 값을 가져옵니다.

  3. MyClass myClassyReference = null 일반적으로 우리는 "변수가 null에 할당 됨"이라고 말하지 않고 "변수가 null을 참조합니다"라고 말하지 않습니다. 대신 "변수가 null입니다"라고 말합니다. 또는 "변수가 아무것도 참조하지 않습니다."또는 "참조가 null입니다."

실용적인 응용 프로그램:

  • 나는 당신의 코드에 손가락을 대고 "이 인스턴스에는 유효하지 않은 속성이 있습니다. 이것이 루프가 실패하는 이유입니다. 인스턴스화하는 동안 매개 변수를 검증해야합니다."라고 말합니다. (즉, 생성자 인수).

  • 나는 당신의 코드에서 이것을 본다.

    MyClass myClassyReference;
    myClassyReference.DoSomething();

    "변수를 선언했지만 할당하지 않았습니다. null이므로 아무 것도 참조하지 않습니다. 이것이 메서드 호출에서 예외가 발생하는 이유입니다."

편집 종료


참을 수없는 존재의 가벼움

기준 입력 변수의 이름과 값은 독립적으로 존재한다. 그리고 나는 독립을 의미합니다.

인스턴스 객체에 대한 참조도있을 수도 있고 없을 수도 있습니다.

인스턴스 객체는 많은 참조가있을 수 있습니다.

A는 선언 참조 수도 있고되지 않을 수도 를 가리키는 객체.


완벽한 설명!
M. Fawad Surosh

"... 객체의 인스턴스를 만드는 중 ..."이라고 말하는 것이 잘못된 경우, 무엇을 말해야합니까? "... 객체를 인스턴스화하고 그것에 대한 참조를 할당하는 중 ..."?
아론 다케

또는 "... 객체를 인스턴스화하고 그 참조에 대한 변수를 초기화"하는 것은 어떻습니까? 여기에는 두 단어가 모두 포함되어 있으며 다소 긴 방식으로 철자하는 것 같습니다. 어떻게 생각해?
아론 다케

... 어떻게 말해야합니까? '... 객체'가 아니라 '클래스의 인스턴스 만들기'라고 말합니다. 그리고 "변수를 참조에 대한 인스턴스화"는 이중 대화이며 두 가지 방식으로 잘못되었습니다. (1) 객체 만 인스턴스화됩니다. (2) 객체를 '가리키는'변수는 참조 변수이거나 간단히 말해서 변수가 참조입니다. 다르게 말하겠습니다. "참조 유형"변수는 참조입니다. 그것은 객체를 의미하거나 가리 킵니다.
radarbob 19

40

변수는 값으로 초기화된다. 객체는 메모리가 그것을 위해 할당되고 그것의 생성자가 실행되었을 때 인스턴스화됩니다.

예를 들어 다음은 변수입니다.

Dim obj as Object

이 변수는 초기화 되지 않았습니다 . obj변수에 값을 할당 하면 변수가 초기화됩니다. 다음은 초기화의 예입니다.

obj = 1
obj = "foo"

인스턴스화는 매우 다른 것이지만 인스턴스화는 일반적으로 초기화가 뒤 따르기 때문에 관련이 있습니다.

Dim obj As New Object()

앞의 코드 라인에서, obj변수되고 초기화 새에 참조로 Object한 것 인스턴스화 . 우리 Object는 새 인스턴스를 만들었 기 때문에 새 인스턴스가 생성되었다고 말합니다.

이제 저는 VB.NET이 위의 코드에서 할당이 발생하고 있다는 것이 명확하지 않기 때문에 C #보다 훨씬 더 혼란스러워한다고 생각합니다. C #에서는 인스턴스의 인스턴스화와 변수의 초기화가 모두 있다는 것이 훨씬 더 분명합니다.

Object obj = new Object();

@Andrew 개체 obj = 1; 초기화 및 객체 obj = new object () /는 인스턴스화 및 초기화입니다. 이제 두 가지를 묻고 싶습니다. 1. 이것은 무엇입니까? 개체 obj; ? 2. 객체 obj; ??를 사용할 때 메모리가 할당 되었습니까? 또는이 코드 객체 obj = 1로 초기화 할 때 할당됩니다. ?
kashif 2013 년

"object obj"는 선언이며 메모리가 아직 할당되지 않았습니다. 또는 "null"값을 보유하기에 충분한 메모리 만 있습니다. 변수의 실제 메모리는 초기화 된 값에 따라 할당됩니다.
아론 다케

14

무언가 를 초기화하는 것은 초기 값으로 설정하는 것입니다. 무언가 를 인스턴스화 하는 것은 인스턴스를 만드는 것입니다.

종종 이것은 다소 같은 것입니다. 이:

SqlConnection conn = new SqlConnection();

인스턴스화SqlConnection 개체를 초기화conn 인스턴스로 설정 변수.

객체의 생성자는 객체의 속성도 기본값으로 설정하기 때문에 객체를 인스턴스화하면 초기화된다고 말하는 것이 올바른 경우가 많습니다. (오해의 소지가 있습니다. 개체가 인스턴스화 한 후 초기화하기 위해 명시 적으로 호출해야하는 메서드를 노출하는 경우도 있습니다.)


4

* Instantiation은 클래스 또는 객체에 대한 인스턴스를 생성하는 것을 의미하며, 초기화는 * 어떤 목적 으로든 동일한 객체 또는 클래스를 시작하는 것을 의미합니다. **


3

인스턴스화 됨은 개체의 인스턴스가 생성되었음을 의미합니다. Initiated는 동일한 객체가 일부 초기화를 수행했음을 의미합니다.


2

클래스 나 객체를 인스턴스화 할 때 새 인스턴스를 만들거나 하나를 "보유"하기 위해 메모리를 할당합니다. 해당 개체를 초기화하는 것은 인스턴스화 중에 수행되는 명령입니다.


2

인스턴스화는 클래스의 인스턴스를 만들 때입니다. 그러면 해당 인스턴스가 개체가되고 속성을 설정하거나 메서드를 호출하여 작업을 수행 할 수 있습니다.

시작은 무언가에 대한 일련의 초기 조건을 설정하는 것입니다. 그 무언가는 객체 일 수도 있고, 스스로 시작하라고 지시하는 객체 일 수도 있고, 값을 할당하는 변수 일 수도 있습니다.

객체는 다른 것을 초기화하거나 시작의 일부로 다른 객체를 인스턴스화 할 수도 있습니다.

차이점은 인스턴스화는 무언가를 할 수있는 것의 생성이라는 것입니다. 입문은 완료되는 일입니다.


1

Java 문서 참조 : https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

" Point originOne = new Point (23, 94);

Declaration: The code set in bold are all variable declarations that associate a variable name with an object type.
Instantiation: The new keyword is a Java operator that creates the object.
Initialization: The new operator is followed by a call to a constructor, which initializes the new object."

1

이런 식으로 볼 수 있습니다. 아래 코드 줄 :

var p = new Person();

위의 줄은 다음 두 가지 방법으로 읽을 수 있습니다.

  1. 변수 p는 사람 클래스 로 초기화 되었습니다.
  2. Person 클래스는 변수 p에서 인스턴스화 되었습니다.

참조 주제 또는 문맥이 중요합니다. 변수 와 관련하여 말할 때 우리는 initialize 라는 단어를 사용합니다 . class / type 측면에서 말할 때 우리는 instantiate 라는 단어를 사용합니다 .


0

인스턴스화는 클래스의 인스턴스를 만들기위한 메모리 할당을 의미하는 반면 초기화는 해당 인스턴스에 변수 이름을 할당하여 해당 인스턴스의 이름을 지정하는 것을 의미합니다.

예 : SqlConnection conn = new SqlConnection();

다음 new은 인스턴스에 메모리를 할당하는 키워드이며 conn해당 인스턴스에 할당 된 변수 이름입니다.


0

다른 사람들이 차이점을 설명 했으므로 자세히 설명하지 않겠습니다. 그러나 인스턴스화가 개체를 제대로 초기화하지 못하는 경우가 있습니다. 개체를 인스턴스화 할 때 일부 데이터로도 초기화합니다. 클래스 / 유형에는 초기화 논리가있는 반면 인스턴스화 논리는 일반적으로 new키워드 (기본적으로 메모리 할당, 참조 복사 등)에 의해 수행됩니다 . 그러나 인스턴스화는 객체가 uninitialzed 라고 말할 수있는 객체에 대해 반드시 유효한 상태가 될 필요는 없습니다 . 다음은 개체를 인스턴스화 할 수 있지만 초기화 할 수없는 실제 예제입니다 (예 : C #에서 미안함).

class P { string name = "Ralf"; }

WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null

GetUninitializedObject 생성자를 호출하여 개체를 인스턴스화하지 않습니다 (그러나 내부 마법).

또한 값 유형이 인스턴스화되지 않고 초기화 될 때 새 할당이 필요하지 않기 때문에 초기화 new..만한다고 주장 할 수 있지만 이는 인스턴스화 정의에 달려 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.