Class와 Instance의 차이

객체지향을 처음 공부할 때 항상 나오는 것은 클래스와 객체가 어떤 차이가 있는지 설명하는 것이다.

흔히, 면접때에도 많이 묻는 질문이다. 클래스는 그릇을 만드는 틀이고, 그 틀에서 만들어 낸 것이 객체(인스턴스)이다.

아마 많은 사람들의 기억속에는 마치 How are you? Fine, thank you, and you?처럼 단순하게 각인되어 있을 것이다.

해당 내용을 공부할 때 마다 떠오르는 의문점이 하나 있었다.

일반적으로 공학이란 굉장히 명확하고 실현가능한 구체적인 이론들이다.

그런데 왜 이렇게 모호하고 형이상학적인 개념을 가장 바닥에 깔아두고 설명하는 것일까.

이것을 이해하지 못하면 객체지향이라는 개념 자체를 이해하기가 어려웠다.

도대체 이 개념들이 어떤 것이기에 시작부터 철학적인 이야기로 시작하는 걸까?

 

그러다가 우연히 한글과 영어의 차이점에 대한 책(플루언트 : 영어 유창성의 비밀)1을 읽게 되었다.

거기에서는 동양과 서양의 철학 차이가 곧 언어에 차이를 가져온다고 이야기하고 있다.

특히나 관심이 갔던 부분은 관사에 대한 부분이었다.

영어에서는 a, an, the와 같은 관사를 사용하고 있다.

이 부분도 주입식(?) 교육에 대한 폐해로 인해, 1개 = a/an, 그것 = the로만 알고 있을 것이다.

그래서 an apple이라고 하면 특정하지 않은 사과 한 개를 의미하고, the apple이라고 하면 그 사과라고 한글로 해석하게 된다.

 

그렇다면 apple은 무엇인가?

사과이다. 어떤 사과?

서양에서는 아리스토텔레스 이후부터 형이상학적인 철학이 자리를 잡고 있다.

즉, apple이란 아주 추상적인 개념으로써의 사과를 의미한다.

형체는 없지만, 누구라도 사과라고 이야기했을 때 떠올리는 바로 그 잔상의 이미지를 말하는 것이 apple이다.

apple에 관사를 붙이게 됨으로써, 사과라는 구체적인 형상이 생기게 된다.

 

마치 김춘수 시인의 2이 연상된다.

내가 물체에 관사를 붙이기 전에는 다만 하나의 형상에 지나지 않았다.

내가 그 물체에 관사를 붙여주었을 때, 그것은 나에게로 와서 구체화되었다.

 

위의 책을 읽으면서 가장 먼저 떠올랐던 것이 바로 클래스와 객체라는 개념이었다.

즉, 클래스는 형이상학적이고 추상적인 어떤 개념으로써의 묶음을 의미한다.

Member라는 클래스가 있다면, 누구한테 이야기하더라도 name과 age를 가진 회원정보에 대한 어떤 묶음이라고 생각할 수 있을 것이다.

그것에 관사를 붙여서 형상화시키는 과정이 바로 인스턴스화이다.

(이 부분은 개인적인 것이지만, 인스턴스화에는 정관사의 개념은 없는 것 같다.
new Member(…)라는 것은 부정관사의 개념으로 생각된다)
-> 혹은 정관사는 부정관사로 생긴 인스턴스를 가리키는 변수 assign을 가리킨다고 볼 수도 있겠다.

 

동서고금을 막론하고 모든 것의 바닥에는 항상 철학이 깔려있다.

공학적인 개념에서 비유를 하자면, OSI 계층도에서 Physical Layer(1계층)으로 볼 수 있다.

철학이 사고방식을 만들고, 언어를 만들고, 문화를 만든다.

Programming이라는 문화도 (아쉽지만) 결국 서양의 철학을 바탕으로 만들어졌다.

그래서 서양의 사고방식 속에서 class와 instance의 차이는 그리 어렵고 복잡한 것이 아닐지도 모른다고 생각된다.

 

누군가에게 구체적으로 물으면 잘 대답하기는 어렵지만, 그냥 나도 모르게 대충 알고 있는 그 어떤 개념일 것이다.

그렇다면 객체지향에서 처음에 나오는 class와 instance라는 것은 추상적이고 어려운 개념이 아니라

그 문화권에서는 특별히 설명하지 않아도 대충 아는 그런 기초적인 내용일 것 같다.

한국인으로 치자면 같은 걸까? 설명하긴 쉽지 않지만, 대충 아는…

 

정리하면,

class는 추상적인 개념(사과라고 불리는 어떤 것)이고

instance는 형상화된 것(눈에 보이는 그 사과)이라고 생각할 수 있다.

더이상 클래스는 그릇을 만드는 틀이고, 그렇게 만들어진 그릇을 인스턴스라 부른다는 틀에 박힌 답변은 그만하도록 하자.

 

“Class와 Instance의 차이”의 4개의 댓글

  1. 안녕하세요.
    지나가다가 남깁니다..
    인스턴스는 클래스의 정보를 토대로 메모리상에 접근 가능한 형태로 생성되고 존재하게 되었을때 인스턴스라고 합니다.
    객체는 클래스화 시키기 전의 어떤 특정한 대상을 객체라고 하는 것이에요.
    프로그래밍 코드에서 Object라는 개념은 위의 객체라는 전체를 아루르는 개념과는 다른
    최상위 상속관계를 유지하기 위한 Object라는 개념이고 실제 전체적인 객체의 개념과 클래스 인스턴스는 각각의 명확한 의미가 있습니다.

    1. 좋은 댓글 감사합니다. 말씀하신 내용이 맞습니다.
      항상 영어와 한국어 사이에 매핑이 조금 어색하게 되어 혼용되는 경우가 많이 생기는 것 같습니다. instance와 object를 비슷한 의미의 ‘객체’로 표현해서 내용이 조금 혼란스러워 진 것 같습니다. 자바의 최상위 클래스인 Object를 말씀드린 것은 아니고, 클래스와 인스턴스가 실제 세상에서의 개념과 객체를 투영했다는 것과 그것을 우리가 이해하기 어려워하는 이유가 서양의 철학인 형이상학적인 측면에서 표현되기 때문이라는 제 의견을 공유하고 싶었던 글입니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다