클래스, 객체, 인스턴스의 차이에 대하여 여러번 들어도 헷갈리는 경우가 많다.
이 세개의 차이를 C++의 예제로 알아보자.
상식적으로 접근하자. 클래스라는 말은 일상의 용어이기도 하다. class room 할 때의 class, 101 class의 class 어떤 사회 계층을 말하는데도 class (e.g. working class) 를 사용하고 어떤 일이나 직업에 숙련된 사람을 high class 라는 말도 쓴다. 온라인 게임에서는 class change 라는 말도 쓴다. (업그레이드 된다는 뜻)
- 영어의 의미는?
a set or category of things having some property or attribute in common and differentiated from others by kind, type, or quality.
* 공통적인 속성을 가진 집단으로 모아서 다른 종류와 구분하는 것이다.
객체지향언어에서의 의미는 객체의 설계도이다. type(타입) 이라고도 한다.
예를 들어 자동차의 설계도가 있다. 지금 자동차는 완성되지 않았지만 앞으로 이 설계도를 기초로 똑같은 자동차를 만들어 낼 것이다.
이해를 돕기 위해 과도하게 생략해서 Car 클래스를 만들어 본다. 차에는 브랜드와 색상, 최대 탑승인원이 있다. 이게 자동차의 설계도라 치면 다른 설계도와 차이가 있다. 예를 들어 트럭이나 오토바이의 설계도와는 다를 것이다. 구체적으로 어떻게 다르냐 하는 것은 세부적으로 들어가야 할 문제이고 여기서는 자동차와 오토바이의 설계도는 다르다(!)는 것을 알 수 있다.
class Car
{
public:
std::string brand;
std::string color;
int maxPerson;
};
'클래스는 객체의 설계도이다.'
자동차라는 설계도가 있는데 실제 만들지 않으면 그 차를 볼 수 없고 운전할 수 없다. 설계도를 들고가서 공장에서 만들어야 차가 나온다. 설계도는 종이에 그릴 수 있지만 설계도의 내용은 순전히 사람이 가진 개념안에 있다. 최고의 자동차를 만드는 회사의 신차도 처음에는 그 차를 개발하는 사람들의 머리와 마음속에 있던 것이다. 그 내용을 구체화 하면 설계도가 된다. 여기에는 수많은 연구와 시행착오가 들어가는 것은 당연한 일이다. 마찬가지로 객체를 설계하려는 사람, 즉 프로그래머가 클래스를 만드는 것도 구현하는데 차이가 있으나 머리속에서는 똑같은 과정을 거친다.
머리속에서 클래스 설계가 안되면 실제 구현도 불가능한 것이다. 물론 모두 머리속에서 할 필요는 없다. 유능한 프로그래머 중에는 공책에 설계도를 그리는 사람이 많다. 혹은 알고리즘을 이용해 플로우차트를 짜면서 만들어도 되고 혼자서 한다면 방법과 순서는 중요하지 않다. 설계도를 짜는 것은 발명에 속하는 일이니까... 보통 만드는 일에 특출난 사람이 잘한다.
설계를 끝내는 것은 IDE와 함께 컴파일러가 담당하는 일이다. 컴파일러가 클래스를 작성한 소스코드의 오류를 체크하고 기계어로 번역한다. 기계어 파일을 묶어서 링크를 실행하면 운영체제에서 단독으로 실행가능한 파일이 만들어진다. 그 다음에 release 판을 build 한다. 이 시점에서 Car 클래스는 파일안에 저장되어 있을 것이다.
프로그램이 실행되면 Car 클래스에 대한 정보가 메모리에 로드된다. 그리고 new 란 키워드로 드디어 Car가 생성된다. 독립된 데이터 공간(변수)을 실제 메모리상에 가지는 실체화가 된다. 이것을 인스턴스라고 한다. (instance)
인스턴스는 실세계에서는 실제 존재하는 하나하나의 자동차를 말한다. 우리집의 자동차, 이웃의 자동차가 모두 인스턴스이다. 컴퓨터 상에서는 메모리에 올라와 있는 데이터를 인스턴스라고 한다. 클래스 설계도의 값을 바꿀 수 없지만, 인스턴스는 바꿀 수 있다. 설계도는 하나이지만 인스턴스는 0개부터 무한대로 가질 수 있다.
대표적인 예는 인간 클래스이다. 인간의 설계도인 DNA는 거의 무한에 가깝게 복제하고 있다. 이런 경우 설계도인 DNA 구조가 클래스 이고 사람은 인스턴스다. 사람들은 키 몸무게 나이 등 속성을 가지고 걷기 달리기 공부하기 등의 메소드를 가지고 있다. 여기서 약간 깊게 생각하면 인간은 동물의 하위 클래스이기 때문에 이종간의 동물과 인터페이스를 가질 수 있다. 예를 들어 먹는 것은 인간만의 특징이 아니다. 포유류가 공유하는 성질이다. 이런 것은 인터페이스로 여러 동물의 종에게 적용시킬 수 있다.
'인스턴스는 클래스를 실제 구현한 것이다. (설계도에 따라 작성한 것이다)'
마지막으로 객체다. 객체가 가장 난해하다.
단어 자체가 객체.... 어려운 단어다. 주로 작용의 대상, 상대방, 목적물 같은 의미가 담겨 있다.
Oxford Languages 정의
객체, 客體
(명사)
1.
`객지에 있는 몸'이라는 뜻으로, 편지에서 상대방의 안부를 물을 때 쓰는 말. 여체(旅體).
2.
철학
작용의 대상이 되는 쪽.
3.
법률•법학
의사나 행위가 미치는 목적물. 물격.
4.
언어학
문장에서 동사의 행위가 미치는 대상. ↔주체(主體).
인스턴스와 같은 맥락에서 종종 사용되는데 객체지향언어에서의 의미는 복잡하게 가져갈 필요가 없다. 객체(Object)는 객체지향언어할 때의 그 객체고 보통 코드를 설명할 때의 객체는 인스턴스 중의 하나를 가리키는 것으로 보면 된다.
인스턴스를 한 10개 만들어 놓고 보면 인스턴스 1, 2, 3, 4, 5... 이렇게 이야기 하는 것 보다는 '지금 선택한 객체를 가지고 OO한다' 라고 말한다.
Object 객체라는 말이 헷갈려서 많이 안 쓸 것 같은데 많이 사용한다. 또 '객체지향 프로그래밍을 설계한다' 처럼 사용하기도 한다. 객체라는 말이 나왔을 때 무엇을 설명하는 건지 잘 모르겠으면 맥락을 파악해보자.