본문으로 바로가기



Object 와 instance 의 차이점


처음 Object 를 공부할 때 Object 와 인스턴스에 대한 개념이 어렵게 느껴집니다.

오브젝트가 인스턴스이고 인스턴스가 오브젝트가 아닌가? 하고 말이죠.

오브젝트를 사용하여 오브젝트를 생성하면 Object 가 반환된다. 이때 반환된 Object 를 인스턴스(instance)라고 부른다.

ES5 명세서에도 인스턴스로 표기하고 있다.

new 연산자를 사용하여 오브젝트를 생성하여 변수에 할당할 수 있으며 변수에 할당된 오브젝트가 인스턴스인 것이다.




다음의 아래 코드를 보자.


//  new 연산자를 사용하여 Object를 생성
var obj = new Object();

// 변수 obj에 오브젝트를 생성한 것을 할당
// 이렇게 변수에 할당,반환된 오브젝트가 인스턴스이다.

console.log(obj)
// Object {}

// 객체 리터럴 방식을 사용하여 오브젝트 생성
var obj2 = {}
// 변수 obj2 가 인스턴스

console.log(obj2);
// Object {}


그렇다면 변수에 할당,반환된 오브젝트가 인스턴스라고 표기하고 있는데 인스턴스를 생성하는 이유는 무엇일까?


계속해서 다음의 코드를 보겠습니다.


// 생성자 함수를 사용
function OriginObject() {
this.name = 'javascript'
}

var obj = new OriginObject();
obj.name = 'jQuery';
console.log(obj.name); // jQuery

var obj2 = new OriginObject();
console.log(obj2.name) // javascript

console.log(origin)


가령 원본 오브젝트에 name 프로퍼티가 있다고 한다면, 위의 코드처럼 name 프로퍼티에 'javascript'란 값을 설정하면 모든 인스턴스는 같은 값을 갖게 됩니다. 하지만 생성한 인스턴스에 name 프로퍼티에 값을 다시 설정하면 인스턴스마다 name 프로퍼티는 다른 값들을 가질 수 있다. 그렇다고 인스턴스의 name 프로퍼티를 바꿨다고 해서 원본 오브젝트의 값이 바뀌지는 않습니다.

그래서 위의 코드의 obj1 인스턴스에서 name프로퍼티를 다시 설정했다고 하여 obj2 인스턴스의 name 프로퍼티가 'jQuery'로 출력되지 않고 obj2.name을 바꾸지 않았으므로 원본 오브젝트의name 프로퍼티를 그대로 가지게 되는 것입니다.

이처럼 인스턴스마다 다른 값을 유지,제어하기 위해서 인스턴스를 생성하는 것입니다.




ex) 레포트를 복사기로 복사한 것과 같음. 복사한 레포트에 메모를 하더라도 원본은 그대로 유지되기 때문에 다시 복사를 했을 때 

    원본 그대로 내용이 복사된다.

   원본이 오브젝트이고 복사한 레포트가 인스턴스인 것이다. 




■ note

"인스턴스(instance)" 라는 용어는 "객체(object)" 와 유사하다. 다만, 의미상으로 "객체"는 좀 더 일반적인 의미인 반면 "인스턴스" 라고 표현하면 "현재 생성된 바로 그 객체" 라는 인스턴트(instant)한 뉘앙스를 더 짙게 표현할 수 있습니다.


■ 인스턴스 멤버

인스턴스 멤버란 객체(인스턴스)마다 가지고 있는 필드(변수)와 메소드를 말합니다.

이들은 각각 인스턴스 필드(변수), 인스턴스 메소드라고 부릅니다.

인스턴스 멤버는 객체에 소속된 멤버이기 때문에 객체가 없이는 사용할 수가 없습니다.






instanceof

모든 객체는 Object의 인스턴스입니다.

즉, Object는 객체 클래스 중 최상위 클래스입니다.


  obj instanceof 객체클래스


객체클래스(객체를 초기화하는 생성자 함수에서 정의된다. 즉, 우변은 함수가 되어야 한다.)


instanceof 의 문제점

instanceof  의 문제는 오른쪽 인자로는 이미 알려진 생성자도 사용할 수 있다는 것입니다.

따라서 instanceof 를 사용하는 경우 Object 와 사용자 정의 생성자를 구분할 수가 없습니다.




Jaehee's e-room