in 내가 보는 세상, 소프트웨어 개발, 일기

오브젝트와 인스턴스의 차이

OOP에서 오브젝트 Object와 인스턴스 Instance는 비슷한 의미로 사용되지만, 무의식적으로 분류를 하고 사용하고 있었습니다. 문제는 둘다 실제로 존재하는 사물을 의미하기 때문에 명확하게 둘의 차이점을 설명하기 힘들었어요.

내가 써온 용법

  • 오브젝트: 인스턴스화를 통해 만든 모든 실체.
  • 인스턴스: 코딩을 할때 (코딩하고 있는 현재 스코프내에서) 동적 생성하고 변수로 레퍼런스를 챙긴 오브젝트를 특정하여 가리킬때.

그러니까 오브젝트를 오브젝트라고 불러도 되지만, 런타임 도중에 현재 스코프내에서 즉석 생성됬다는 의미를 강조할때는 인스턴스라고 부르는 방식을 사용했습니다.

하지만 결국 오브젝트도 클래스를 통해 생성하지 않나?

정확한 차이

정확한 차이점을 명확하게 말하지 못하다가 스택오버플로에서 힌트를 얻었습니다.

https://stackoverflow.com/questions/3323330/difference-between-object-and-instance

클래스는 집의 설계도다. 오브젝트는 설계도로 지은 모든 집이다. 인스턴스는 주어진 집이다

인스턴스와 레퍼런스를 혼동 시킬 여지가 있지만, 내가 들어온 가장 직관적이고 명쾌한 설명이라 생각해요.

결론

결론 부터 말하면 오브젝트는 실체, 인스턴스는 (원본과의) 관계에 집중한 용어입니다.

오브젝트와 인스턴스는 같은 단어로 취급될때가 있고, 다른 단어로 취급될때도 있습니다. 둘의 중심 의미를 구분할 수 있는 문장으로 이런 예를 들 수 있을 것 같네요.

“제민은 지구상의 오브젝트다” (실체)

“제민은 아버지의 인스턴스다” (복제-생성, 원본과의 관계)

또한, 아래 용어도 성립합니다.

“객체는 클래스의 인스턴스다” (객체는 클래스를 원본으로 생성한 복제본)

 

일단, 둘을 같은 의미로 사용할때는 둘다 실체를 가리키는 의미로 사용합니다. 이건 이해하기 쉽네요.

그런데 둘을 구분하여 사용할때는 강조하는 의미가 다릅니다. 아래는 둘을 구분할때 가지는 의미입니다.

  • 인스턴스는 어떤 원본으로부터 생성되었다는 의미가 내포된다.

~의 인스턴스라고 하면, 그것으로 부터 만들어 진것, 좁은 의미로는 파생 복제본이라는 의미가 됩니다.

예를 들어, 단순히 ‘사람의 인스턴스’라고 하는 것만으로도, 사람(원본)으로 부터 생성된 복제본이란 의미가 내포됩니다.

나는 사람의 인스턴스다.

또다른 예로는 유니티의 Instantiate( ) 함수가 있습니다.

인스턴스화 그 자체를 의미하는 Instantiate() 함수는 어떤 원본을 넘겨주면, 해당 게임 오브젝트를 복제한 클론을 생성해줍니다. (참고로 이 함수에 원본을 넘겨줄때, 대부분의 경우에서 클래스가 아닌 특정 오브젝트를 원본으로 사용합니다.)

물론 인스턴스 자체가 ‘생성된 실체’이기 때문에 인스턴스는 오브젝트입니다.

  • 오브젝트는 클래스의 복제본이라는 의미보다, 실체라는 의미에 집중합니다.

나는 사람 오브젝트다.

이때는 사람 타입으로서, 실제로 존재하는 사물(실체)가 하나 있다는 의미가 됩니다.

사람 클래스를 원본으로 생성됬다는 것은 당연히 추측 가능합니다. 그런데 인스턴스화를 명시적으로 알리고 싶다면, 생성이라는 단어를 따로 명시 해야겠죠.

나는 사람 클래스를 바탕으로 만든 사람 오브젝트다.

 

중요한 것은, 둘을 구분하는 완벽한 가이드라인이 (제가 알기로는) 없다는 것이에요.

개인적으로는, 대부분의 실체는 오브젝트라는 단어로 표현하면 충분하고, 무언가로 부터 (복제)생성됬다는 의미가 내포되야 한다면 인스턴스로 표현하면 된다고 생각합니다.

부가 설명

일단 인스턴스는 실체이므로 오브젝트가 맞습니다. 그리고 대부분의 경우, 오브젝트도 무언가로부터 생성을 해야 하므로 인스턴스가 맞습니다.

오브젝트

사실 오브젝트라는 것은 클래스라는 개념이 없어도 존재가능해요.

프로그래밍의 과정을 생각하지 않고, 현실에서의 물건들이 그냥 처음부터 있었다는 것을 생각해 봅시다. 오브젝트는 클래스와 관련 있지만, 클래스를 배제해도 성립가능한 개념입니다.

이때 오브젝트는 실제로 존재하는 물건이라는 의미로서 사용 되겠죠. 즉, 오브젝트의 원본 타입에 관한 내용이 배제되어도 오브젝트 개념은 성립합니다.

다시 말해, 아래 문장은 제대로 성립합니다.

제민은 오브젝트다. 단일 사물로서 현실에 존재하니까.

인스턴스

일단, 인스턴스 또한 실체라서 인스턴스는 오브젝트가 맞습니다.
그런데 인스턴스는 어떤 것으로부터 생성되었다는 의미에 집중합니다.

일단 인스턴스를, 인스턴스의 원형(클래스)를 언급하지 않고 같은 문장을 말해봅시다.

제민은 인스턴스다. 단일 사물로서 현실에 존재하니까.

어색한 것을 알 수 있습니다. 이번에는 이렇게 바꿔 볼게요.

제민은 사람의 인스턴스다. 사람으로부터 만든 것이니까.

즉 인스턴스를 언급할때는, 객체의 추상을 같이 언급하는 것이 어색하지 않게 들립니다.

이번에는 같은 내용을 반대 예로 다시 생각해 볼게요.

일단 프로그래밍의 세상에서 오브젝트는 클래스로 부터 파생되는 것이 맞기에 아래 형식은 성립합니다.

사람을 인스턴스화 한것은 사람 오브젝트다.

하지만 아래 표현은 어색하네요.

제민은 사람의 오브젝트다.

 

정리

결국 인스턴스와 오브젝트 둘다 아래 의미를 내포합니다.

  1. 실체다.
  2. 무언가로부터 생성됬다. (관계)

하지만 오브젝트는 1, 인스턴스는 2에 무게가 실려있습니다. 그래서 이 두 문장에서 어색함을 느낀 것 입니다.

제민은 인스턴스다.

사람을 인스턴스화 한 것이 사람 오브젝트다.

첫 문장에서는 인스턴스가 관계한 대상(인스턴스의 원본이자 객체의 추상)에 대해 언급하지 않았습니다.

두번째는 오브젝트를 실체라는 의미보다 추상으로부터 객체가 생성되었다는 의미에 좀더 무게를 두었습니다.

하지만 인스턴스는 실체라는 의미도 내포하고 있으며,  OOP에서는 대부분의 경우 오브젝트를 클래스로 부터 생성할 수 있다는 전제를 깔고 있습니다.

따라서 어색할뿐 문장이 성립합니다. 이게 인스턴스와 오브젝트가 혼용되는 이유가 아닐까 생각하네요.

(물론 클래스가 아닌 오브젝트를 클론해서 새로운 오브젝트(=인스턴스)를 만들거나, 역직렬화로 바이트에서 오브젝트를 만드는 경우도 있구요.)

최종 결론

코딩을 할때 ‘방금 인스턴스화 하여 레퍼런스를 할당한’ 오브젝트는 인스턴스라고 말하는 경향이 있는 이유는, 무의식적으로 무언가로부터 생성되었다는 의미를 좀더 부여하여 말하기 때문이라 봅니다.

하지만 진짜 결론은 오브젝트와 인스턴스가 혼용되는 이유는 인스턴스화를 거쳤다는 의미를 부여하는 정도가 상황마다 다르기 때문이며, 따라서 엄격하게 둘을 나누어 쓸 필요는 없다는 것 같네요.