객체, 클래스, 인스턴스
객체
Object; 클래스에서 정의된 속성을 바탕으로 생성된 복제품
- 물리적으로 존재하거나, 개념적인 요소 중, 다른 것들과 식별 가능한 요소
- 객체는 상태(state)와 행동(behavior)을 가진다.
- Java에서는 이것을 각각 변수(variable), 그리고 메소드(method)로 정의한다.
- 객체는 클래스에 정의된 속성과 기능을 갖는 실체이다.
- 객체 지향 프로그래밍에서 객체는 현실 세계의 사물을 모델링하여 프로그램 내에서 사용할 수 있도록 하는 중요한 요소이다.
객체는 상태와 행동을 가지는 소프트웨어 세계에서의 구성 요소이다.
객체는 실세계의 사물이나 개념을 모델링한 것이다.
클래스
Class; 객체를 생성하기 위한 설계도(blueprint)
- 현실 세계의 개념을 대상으로 하여, 목적에 따라 멤버 변수(속성)와 메소드(행동)를 포함할 수 있다.
- 클래스는 특정 유형의 객체가 지닐 구조와 행동을 정의한다.
- 클래스 자체로는 어떤 상태를 갖지 않지만, 클래스를 통해 생성된 객체가 상태를 갖도록 구조와 기능을 정의한다.
- 예로, ‘자동차’ 클래스는 모든 ‘자동차’ 객체가 공통적으로 가질 속성과 메소드를 정의한다.
클래스 자체는 물리적인 형태가 존재하지 않는다.
클래스는 단지 객체를 생성하기 위한 템플릿으로써 존재한다.
인스턴스
Instance; 클래스의 정의에 기반하여 생성되어 실제로 메모리에 존재하는 객체
- 객체가 메모리에 할당되어 실제로 사용할 수 있는 상태를 인스턴스라고 한다.
- 하나의 클래스로부터 여러 개의 인스턴스를 생성할 수 있다.
- 각 인스턴스는 클래스가 정의한 구조를 따르지만, 인스턴스 별로 상태가 다를 수 있다.
- 예로, ‘자동차’ 클래스로부터 생성된 서로 다른 인스턴스 ‘소나타’와, ‘아반떼’는 거의 모든 것이 다르지만, ‘자동차’로써의 기능을 수행한다는 점은 동일하다.(바퀴를 이용해 이동 ..)
인스턴스는 클래스로부터 생성된 실제 객체를 의미한다.
각 인스턴스는 동일한 구조를 공유하지만, 서로 다른 상태를 가질 수 있다.
객체와 클래스, 인스턴스의 관계
클래스의 인스턴스화를 통해 객체가 생성된다.
클래스 ↔ 객체
- 클래스는 객체를 만들기 위한 설계도이다.
- 객체는 이 설계도를 바탕으로 생성된 실체이다.
객체 ↔ 인스턴스
- 객체는 클래스의 인스턴스이다.
- 객체가 생성되어 실제로 메모리에 할당되어 사용될 때 ‘인스턴스’라는 용어로 사용된다.
- 객체와 인스턴스는 거의 동의어처럼 사용되지만, 객체는 보다 일반적인 용어로,
클래스의 인스턴스 뿐만 아니라 모든 구체화된 사례를 의미한다.
클래스 ↔ 인스턴스
- 클래스에서 새로운 인스턴스를 만드는 행위를 인스턴스화라고 한다.
- 인스턴스화된 객체는 해당 클래스의 속성과 메소드를 가지며, 클래스에서 정의된 대로 생성되어 메모리 상에 할당된다.
정리하자면, 클래스는 설계도이고,
객체는 설계도에 따라 만들어진 구체적인 대상이며,
인스턴스는 그 구체적인 대상이 메모리에 할당되어 실제로 사용될 수 있는 상태를 의미한다.
객체의 인스턴스화 과정
(0). 클래스 로딩
- 우선, 해당 객체의 클래스가 아직 메모리에 로드되지 않았다면, JVM을 통해 클래스가 메모리에 최초로 로드된다.
- 이 과정에서 클래스에 정의된 모든 정적 변수와 정적 초기화 블록이 처리된다.
1. 메모리 할당
- 메모리에 클래스가 로드된 상태에서,
new 연산자가 호출되면, JVM은 객체를 저장하기 위한 메모리 공간을 힙(Heap) 영역에 할당한다.
- 힙은 런타임 데이터 영역 중 하나로, 동적으로 할당된 메모리(객체)를 저장하는 데 사용된다.
또한 Java의 메모리 관리(Garbage Collection)가 자동으로 이루어지는 영역이기도 하다.
2. 인스턴스 변수 초기화
- 할당된 메모리 공간에는 객체의 인스턴스 변수들이 저장되며, 이 변수들은 해당 클래스에 정의된 초기값이나 기본값으로 초기화된다.
3. 생성자 실행 및 인스턴스 생성
- 객체의 생성자가 호출되어 실행된다.
- 생성자는 객체의 초기 상태를 설정하는 데 사용되며, 필요에 따라 매개변수를 통해 다양한 초기화 작업을 수행할 수 있다.