객체, 클래스, 인스턴스의 차이점은?

2013-04-04 09:35

slipp.net을 개발하면서 즐거운 점의 하나는 조금씩 개선해 나가는 모습을 보는 것이다. 운영하면서 느끼는 즐거움은 다른 개발자들과 온라인 상으로 수 많은 논의를 하면서 나 또한 성장하는 것을 느낀다는 것이다.

오늘 아침은 가볍다면 가볍고, 무겁다면 무거운 주제로 시작을 해보려 한다. 강의 준비를 하다보니 그 동안 깊이 있는 고민없이 사용하던 용어 하나, 기능 하나에 궁금증이 생기고, 많은 질문 꺼리가 생긴다. 끊임 없는 질문을 통해 성장한다고 생각한다.

오늘의 질문꺼리는 객체 지향 프로그래밍을 하는 개발자들이 가장 많이 사용하는 용어인 객체, 클래스, 인스턴스의 차이점에 대해 이야기해보자. 대부분의 개발자들을 보면 클래스와 인스턴스의 차이는 명확하게 이해하고 있는 것으로 생각된다. 그렇다면 "객체와 인스턴스의 차이점은?", "객체와 클래스의 차이점은?"은 뭘까? 보통 인스턴스를 객체로 생각하는 경우도 많다. 그렇다면 정말 객체와 인스턴스는 같은 개념인가?

"객체와 인스턴스의 차이"로 검색을 해보면 이에 대한 질문이 많다는 것을 알 수 있다. 개발자들도 혼란스러워하고 있다는 것이다.

구글에서 "객체와 인스턴스의 차이"로 검색해보면 제일 먼저 나오는 글들이다.

철 지난 질문일지 모르겠지만 다시 한번 질문해 보고 싶다. 객체와 인스턴스의 차이점은 뭘까?

1개의 의견 from FB

BEST 의견 원본위치로↓
2013-04-04 23:34

추상화 기법의 하나로 분류/인스턴스화(classification/instantiation)라는 개념이 있습니다. 분류는 실재하는 객체들을 공통적인 속성을 공유하는 범주 또는 추상적인 개념으로 묶는 것을 의미합니다. 인스턴스화는 분류의 반대 개념으로 범주나 개념으로부터 실재하는 객체를 만드는 과정을 의미합니다. 인스턴스화는 예시(exemplification)라고도 부르죠.

결론적으로 인스턴스라는 말은 추상적인 개념(또는 명세)과 구체적인 객체 사이의 관계에 초점을 맞출 경우에 사용하는 것이 올바른 용법입니다.

예를 들면: * 객체는 클래스의 인스턴스다. * 객체 간의 링크는 클래스 간의 연관관계의 인스턴스다. * 실행 프로세스는 프로그램의 인스턴스다.

위 예에서 알 수 있는 것처럼 추상적인 개념(또는 명세)과 구체적이고 실재적인 것사이의 관계에 초점을 맞추는 경우 "~의 인스턴스"라는 형식으로 사용하게 되죠.

따라서 인스턴스라는 용어를 반드시 클래스와 객체 사이의 관계로 한정지어서 사용할 필요는 없습니다.

원칙적으로는 "인스턴스"라는 단어만 단독으로 사용하는 것은 문제의 소지가 있지만 문맥상으로 그 의미를 유추할 수 있을 경우 인스턴스라는 말이 클래스의 인스턴스인 객체를 지칭하는 말로 많이 사용되는 것 같습니다.

정확한 용법 보다는 의미 전달이 중요하겠죠. ^^

5개의 의견 from SLiPP

2013-04-04 09:58

위 링크들 보고 나름 정리해 이해해보려고합니다.

  • 객체는 식별가능한 그 무엇을 말하고 인스턴스는 클래스를 통해 생성된 객체

  • 고로 인스턴스는 객체 이지만 모든객체가 인스턴스일 필요는없다.

생각해 볼수있어 좋네요.

2013-04-04 10:24

음 객채와 클래스 그리고 인스턴스의 차이라...

간단히 비유해보면 이 질문에서 질문이라는 클래스에서 넌 '객체, 클래스, 인스턴스의 차이점은 무었인가요?'라는 질문의 인스턴스를 만든것이고 그리고 질문을 한 너, 답변을 한 나, 질문, '객체, 클래스, 인스턴스의 차이점은 무었인가요?'라는 질문까지도 모두 객체이다.

좀더 쉽게 비유 하자면

집을 지을때 그 집을 집기위한 설계도를 class라 할수있고 그 설계도를 보고 만든 집을 instance라 보면될듯 하다. 그리고 그 설계도나 만들어진 집, 만든 사람 모두 객체인거구...

(물론 OOP에서의 구분이다.)

2013-04-04 13:48

저는 이렇게 생각합니다. 용어분류로 * 클래스, 객체 * 클래스, 인스턴스 로 묶어서 커뮤니케이션하면 될 듯 합니다.

어떤 추상적인 컨셉에 대해서 논할 때는 클래스 + 객체로 이야기하고, 프로그램의 컴파일 레벨 아래쪽을 이야기 할 때는 클래스 + 인스턴스로 이야기하면 될 듯 합니다.

결국은 혼돈에 이유가 하나의 상황에 유사 단어 2개를 사용하기 때문이라 생각합니다.

2013-04-04 23:34

추상화 기법의 하나로 분류/인스턴스화(classification/instantiation)라는 개념이 있습니다. 분류는 실재하는 객체들을 공통적인 속성을 공유하는 범주 또는 추상적인 개념으로 묶는 것을 의미합니다. 인스턴스화는 분류의 반대 개념으로 범주나 개념으로부터 실재하는 객체를 만드는 과정을 의미합니다. 인스턴스화는 예시(exemplification)라고도 부르죠.

결론적으로 인스턴스라는 말은 추상적인 개념(또는 명세)과 구체적인 객체 사이의 관계에 초점을 맞출 경우에 사용하는 것이 올바른 용법입니다.

예를 들면: * 객체는 클래스의 인스턴스다. * 객체 간의 링크는 클래스 간의 연관관계의 인스턴스다. * 실행 프로세스는 프로그램의 인스턴스다.

위 예에서 알 수 있는 것처럼 추상적인 개념(또는 명세)과 구체적이고 실재적인 것사이의 관계에 초점을 맞추는 경우 "~의 인스턴스"라는 형식으로 사용하게 되죠.

따라서 인스턴스라는 용어를 반드시 클래스와 객체 사이의 관계로 한정지어서 사용할 필요는 없습니다.

원칙적으로는 "인스턴스"라는 단어만 단독으로 사용하는 것은 문제의 소지가 있지만 문맥상으로 그 의미를 유추할 수 있을 경우 인스턴스라는 말이 클래스의 인스턴스인 객체를 지칭하는 말로 많이 사용되는 것 같습니다.

정확한 용법 보다는 의미 전달이 중요하겠죠. ^^

2017-04-19 01:05

@Eternity 안녕하세요. 구글링을 하다 우연히 글을 보게되는 대학생입니다. 저는 기계공학을 전공하고 컴퓨터에 관심을 갖고 공부하고 있는데요. 혹시 해당 개념들은 학과 과정중 어느 단계에서 배우는 지식인가요? 또 관련하여 추천해 주실만한 책이 있으신가요? 감사합니다.

의견 추가하기

연관태그

← 목록으로