실제 사물의 속성과 기능은 각각 변수와 메서드로 추상화되어 클래스에 정의된다. 각 클래스를 구체화한 것이 객체이다.
자주 나오는 예시로는 붕어빵 틀(클래스)과 붕어빵(객체)이 있다.
클래스와 객체(인스턴스)
| 클래스 | 객체(인스턴스) | |
| 정의 | 실제 사물의 속성과 기능을 추상화해 정의해 놓은 것 객체의 틀 역할을 함 |
실제로 존재하는 것 클래스에 정의된 대로 메모리에 생성됨 |
| 용도 | 객체를 생성하기 위해 사용 | 객체의 기능과 속성에 따라 다르게 사용 |
클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.
인스턴스와 객체는 같은 의미지만, 객체가 좀 더 포괄적인 느낌이라면, 인스턴스는 어떤 클래스부터 만들어진 객체인지 강조하는 구체적인 의미를 갖고 있다.
클래스의 정의

클래스를 정의할 때 사물의 속성은 멤버변수로, 기능은 메서드로 정의하게 된다. 또, 멤버변수와 메서드는 역할에 따라 두 가지로 나눠진다.
[멤버변수]
- 클래스 변수: 모든 객체가 파생된 클래스의 상태를 관리하는 변수
- static 키워드가 있고, 하나의 클래스에서 단 하나의 상태만을 유지함
- 인스턴스 변수: 객체의 상태를 관리하는 변수
- static 키워드가 없고, 각 인스턴스별로 다른 상태를 유지함
[메서드]
- 클래스 메서드: 클래스로서 수행하는 기능을 정의한 메서드
- static 키워드가 있고, 객체를 생성하지 않거나 객체의 상태와 상관없이 수행할 수 있는 기능을 정의함
- 인스턴스 메서드: 객체로서 수행하는 기능을 정의한 메서드
- static 키워드가 없고, 객체를 생성할 필요가 있거나 객체의 상태에 접근해서 수행할 수 있는 기능을 정의함
인스턴스의 생성과 사용
인스턴스가 생성될 때, 클래스에 정의된 대로 메모리에 생성된다.
JVM 메모리 구조 (JVM Runtime Data Area)
JVM은 인스턴스를 비롯해 프로그램을 수행하기 위해 필요한 메모리를 할당받고, 용도에 따라 영역을 나눠 관리한다.
3가지 주요 영역으로는 method area, heap, call stack이 있다.

- Method Area
- 프로그램 실행 중 클래스가 사용되기 전, 해당 클래스에 대한 정보를 로딩해 저장해 놓는 곳. 클래스 변수도 함께 저장됨
- JVM은 해당 클래스의 클래스파일(. class)을 읽어 분석해 클래스의 필드 및 메서드 정보, 타입 정보, 상수 등 클래스 변수와 같은 클래스 정보를 알아내 저장한다.
- Heap
- 인스턴스가 생성되는 공간. 스레드 간 공유됨
- 프로그램 실행 중 생성되는 인스턴스와 내부 인스턴스 변수는 이곳에 저장된다. 이때 생성된 인스턴스는 개발자가 직접 삭제할 수 없고, garbage collector가 알아서 제어한다.
- Call Stack (Method Stack)
- 메서드 실행 시 필요한 메모리 공간 제공. 스레드별 별도 관리됨
- 메서드 호출 순서대로 필요한 만큼 메모리가 할당되고, 메서드 실행 동안 사용되는 지역변수(매개변수 포함) 및 연산의 중간결과 또한 함께 저장된다. 메서드가 종료될 때, 할당되었던 메모리가 반환되고 스택에서 제거된다.
- Call stack 제일 위에 있는 메서드가 현재 실행 중인 메서드, 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.
인스턴스의 생성과 메모리 할당
일반적인 인스턴스 생성 방식은 다음과 같다.
Animal animal; // 클래스명 변수명
animal = new Animal(); // 변수명 = new 클래스명();
단계별로는 다음과 같이 메모리가 할당된다.
- 인스턴스 생성 전, 해당 클래스 정보를 Method Area로 로드한다.
- 클래스의 클래스 변수, 바이트 코드 등이 메모리에 올라가게 된다.
Animal animal;: Animal 클래스 타입의 참조변수animal선언- Heap에 참조변수를 위한 공간이 마련된다. 아직 인스턴스가 없기 때문에 뭘 할 수는 없다.
animal = new Animal();: 새로운 Animal 인스턴스 생성new로 heap에 Animal 클래스의 인스턴스를 생성한다. 클래스의 멤버 변수는 각 자료형 기본값으로 초기화된다.- 대입연산자
=로 객체의 주소값이 참조변수animal에 저장된다. 이제 참조변수를 통해 인스턴스를 다룰 수 있다.
참조변수 없이 인스턴스를 다룰 수 없으며, 이때 참조변수 타입은 인스턴스 타입과 일치해야 한다.
또, 클래스가 같더라도 각 인스턴스는 다른 메모리 공간에 생성되기 때문에 각 인스턴스의 멤버 변수는 서로 다른 값을 유지한다.
참고 자료
- JAVA의 정석 3판, Chapter 06 객체지향 프로그래밍 1
- 위키피디아: 자바 가상 머신
'Java > 자바의 정석' 카테고리의 다른 글
| [JAVA] 오버로딩(Overloading) (0) | 2023.07.15 |
|---|---|
| [JAVA] 변수와 메서드 (0) | 2023.07.14 |
| [JAVA] 객체지향 프로그래밍이란 (0) | 2023.07.06 |