본문 바로가기

개발/Java

클래스, 인스턴스, 객체

  • 클래스(Class): 클래스란 어떤 특정 종류의 모든 객체들에 대해 일반적으로 적용할 수 있는 변수와 메소드를 정의하고 있는 소프트웨어적인 설계도(blueprint) 또는 프로토타입(prototype)이라 할 수 있습니다. 예를 들어, 실세계에 존재하는 자동차들인 아반떼, 누비라, 그랜저, 티코, 아토스, 봉고, 또는 버스 등의 자동차들이 가질 수 있는 상태 정보와 행동에 대하여 일반화시켜 정의해 놓은 것이 자동차 클래스가 될 수 있습니다. 다시 말해서, 실세계에 존재하는 객체들이 가질 수 있는 상태와 행동들에 대해 소프트웨어적으로 추상화(abstraction) 해 놓은 것이 클래스라는 것입니다. 이러한 클래스를 청사진이라 표현하기도 하고, 벽돌을 찍기 위한 하나의 틀로써 비유되기도 합니다.


  • 인스턴스(Instance): 자동차라는 클래스를 만들었다고 해서, 우리가 실제로 사용할 수 있는 것은 아닙니다. 자동차 클래스라는 것은 단지 자동차 객체가 가질 수 있는 상태 정보와 행동들에 대한 정의이기 때문입니다. 실제로, 자동차 클래스는 김대리가 가지고 있는 아반떼, 박실장이 가지고 있는 티코 등의 식으로 나타나야 합니다. 실제화되어야 합니다. 이렇게 클래스를 실제로 사용할 수 있도록 선언하는 것, 다시 말해서 클래스에 대한 변수를 선언하는 것을 “인스턴스를 생성한다(instantiate)”라 하고, 이렇게 생성된 변수를 인스턴스라 하며, 이 인스턴스는 메모리 공간을 차지하게 됩니다. 그리고, 인스턴스의 메소드를 이용하여 변수들의 값을 설정 및 변경할 수 있습니다. 인스턴스를 생성한다는 것은 벽돌 틀을 이용해서 벽돌을 찍는 것과 같다고 볼 수 있습니다.


  • 객체(Object): 객체지향 개념에 대하여 처음 접하게 될 때, 혼동되는 것 중 하나가 클래스, 객체, 인스턴스 등의 차이를 구분하는 것입니다. 물론, 그 구분이 명확하다면 다른 혼동에 빠져들어야 겠지요. 먼저, 클래스와 객체를 구분하는 것은 실세계를 살펴볼 때 좀 더 명확해 질 수 있습니다. 예를 들어, 자동차 클래스가 있으면, 아반떼, 누비라, 그랜저, 티코, 아토스, 봉고, 또는 버스 등을 실세계에 존재하는 객체라고 할 수 있습니다. 그리고 이를 소프트웨어적으로 추상화시켜 놓은 것을 클래스라 하고, 클래스를 실제 사용할 수 있도록 실제화시켜 놓은 것을 또는 클래스가 실제 값들을 가질 수 있도록 메모리 공간을 할당해 놓은 것을 인스턴스라 합니다. 이를 소프트웨어적으로 정리하자면, 클래스는 객체의 상태(또는 변수)와 행동(또는 메소드)을 정의하고 있는 설계도(blueprint) 또는 프로토타입(prototype)이고, 클래스를 실제 사용할 수 있도록 변수 선언한 것을 인스턴스이며, 이 인스턴스를 객체라 할 수 있습니다. 객체는 높은 모듈성(modularity)과 정보은닉(information hiding)의 장점을 제공해 줍니다. 클래스는 재사용성(reusability)의 장점을 제공해 줍니다. 자동차 공장에서는 하나의 자동차 설계도(클래스)를 이용하여 여러 대의 자동차(객체 또는 인스턴스)를 생산해 냅니다. 이렇듯 하나의 클래스를 선언해 놓으면 그 클래스를 여러 번 재사용할 수 있지요. 소프트웨어 개발자 역시 하나나 둘 이상의 또는 수 없는 인스턴스 또는 객체를 생성하기 위해 하나의 클래스를 수 없이 우려먹겠지요. 이러한 것이 가능한 것은 클래스가 제공해 주는 재사용성의 장점때문입니다.