1. 클래스와 인스턴스의 개념 이해

객체지향 프로그래밍에서 거의 반드시 등장하는 클래스라는 단어의 의미는 일반적으로 쓰이는 의미(계급, 집단, 집합)와 거의 흡사하다.

일반적인 개념으로 살펴보았을 때, 음식이라는 범주 안에는 고기, 채소, 과일 등등 다양한 것들이 들어갈 수 있다.

그리고 과일 범주 아래에는 , 사과, 바나나, , 오렌지 등이 포함된다.

여기서 , 사과, 바나나 등은 직접 만질 수도 볼 수도 있는 구체적이고 실존하는 사물에 해당한다.

반면, 음식이나 과일은 어떤 사물들의 공통 속성을 모아 정의한 것일 뿐 만질 수도 볼 수도 없는 추상적 개념이다.

음식은 과일과의 관계에서 상위 개념이고, 과일은 음식과의 관계에서 하위의 개념이다. 이를 그림으로 표현하면 아래와 같다.

위 그림에서와 같이 음식, 과일은 모두 집단, 즉 클래스이다.

음식은 과일보다 상위 클래스(superclass), 과일은 음식보다 하위 클래스(subclass)이다.

이때 과일 분류 하위에 또 다른 분류가 있을 경우에는 클래스 간 관계는 어떻게 될까?

음식은 과일의 superclass, 과일은 음식의 subclass이면서 귤류의 superclass, 귤류는 과일의 subclass이다.

클래스는 하위로 갈수록 상위 클래스의 속성을 상속하면서 더 구체적인 요건이 추가 또는 변경된다.

물론 하위 클래스가 아무리 구체화 되더라도 이들은 결국 추상적인 개념일 뿐이다.

한편 감귤, 자몽, 천혜향 등은 앞의 클래스들의 속성을 지니는, 실제로 먹을 수 있고 만질 수 있는 실존하는 개체이다.

이처럼 어떤 클래스의 속성을 지니는 실존하는 개체를 일컬어 인스턴스(instance) 라고 한다.

현실 세계에서는 개체들이 이미 존재하는 상태에서 이들을 구분짓기 위해 클래스를 도입한다. 이 때문에 하나의 개체가 같은 레벨에 있는 서로 다른 여러 클래스의 인스턴스일 수 있다.

반면 프로그래밍 언어상에서는 접근 방식이 정반대이다.