클래스
클래스는 객체를 생성하기 위한 설계도 또는 도구이다.
-
본질: 소프트웨어 세계에서 구현할 대상의 추상적인 명세이자, 연관되어 있는 변수와 메소드의 집합이다.
-
메모리: 클래스는 프로그램이 로드될 때 메소드 영역에 저장되며, 그 자체로는 데이터를 저장하는 공간이 아니다.
-
역할: 객체를 만들 수 있는 타입을 정의한다.
객체
객체는 소프트웨어 세계에 구현할 대상 그 자체이며, 클래스에 선언된 모양 그대로 생성된 실체이다.
-
본질: 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.
-
관점: OOP 관점에서 특정 클래스의 타입으로 선언되었을 때, 이를 객체라고 부른다.
-
특징: 현실 세계의 실체에 가장 가까운 개념이다.
인스턴스
인스턴스는 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체이다. 즉, 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부른다.
-
본질: 객체를 소프트웨어에 실체화하면 인스턴스가 된다.
-
메모리: 실체화된 인스턴스는 힙 영역에 할당된다.
-
관점: 추상적인 개념(클래스)과 구체적인 객체 사이의 관계에 초점을 맞출 때 주로 사용되며, 보통
-의 인스턴스형태로 쓰인다.-
객체는 클래스의 인스턴스이다.
-
실행 프로세스는 프로그램의 인스턴스이다.
-
클래스, 객체, 인스턴스 관계 요약
클래스와 객체 그리고 인스턴스의 관계를 요약한 표는 다음과 같다.
| 비교 대상 | 설명(정의) | 관점 | 메모리 할당 |
|---|---|---|---|
| 클래스 | 객체를 만들기 위한 설계도 또는 명세 | 추상적인 개념 | 메소드 영역 |
| 객체 | 설계도로 구현한 모든 대상을 포괄하는 의미 | 현실 세계의 실체 | (할당 시)힙 영역 |
| 인스턴스 | 메모리에 할당되어 실제 사용되는 구체적인 실체 | 관계(-의 인스턴스) |
힙 영역 |
-
클래스는 설계도에 비유되며, 객체는 그 설계도로 구현한 모든 대상을 포괄적으로 의미한다.
-
객체는 클래스 타입으로 선언되었을 때 부르는 이름이라면, 인스턴스는 그 객체가 new 연산자를 통해 메모리에 할당되어 실제 사용될 때 부르는 이름이다.
public class Animal {}
public class Main {
public static void main(String[] args) {
Animal cat; // cat은 Animal 타입으로 선언된 '객체' (선언)
// 인스턴스화
cat = new Animal(); // cat은 Animal 클래스의 '인스턴스' (메모리 할당)
// cat은 Animal 클래스의 인스턴스이면서, 동시에 객체이기도 하다.
}
}