자바에서 클래스는 객체를 정의하는 탬플릿이다
객체는 상태( State ) 와 행위( behavior )를 가지는데
클래스는 class
키워드를 사용해 선언한다.
객체는 new
키워드를 이용해 생성한다
클래스는 객체를 정의하는 탬플릿이라는 말이 핵심이다.
가장 유명한 예시인 Car Class는
자동차 라는 걔념 자체는 Class
투싼이라는 차 자체는 Object ( 객체 )라고 표현한다.
대표적으로 공통적인 요소들을 선언해 생성자를 통해 효율적으로 사용 할 수 있다.
여기까지가 책에서 간단하게 설명한 객체와 클래스 였다.
위의 내용들은 여러번 보고 알고 있었지만
이번에 다시 읽으면서 내가 궁금했던 점을 찾아보기로 했다.
객체가 생성될 때. heap 영역에 할당된다는건 들었는데
그렇다면 객체가 생성될 때. 알아내야하는 클래스의 정보는 어디에 저장될까?
으로 질문을 시작해 더 깊게 알고싶어 찾아보게 되었다.
Static 영역에 올라가게 되면 JVM의 생명주기에 따라 계속 유지되고 프로그램이 유지되는 동안은 메모리에 남아있다. 그래서 Static 영역에 정의된 클래스는 프로그램의 어느 위치에서든 접근이 가능한다
클래스가 해당 접근을 허용할지 말지는 구현의 차이
Static 클래스들이 올라가는 Static 영역은 Method Area에 속한다
물리적으로 static 영역이 나눠진게 아닌 Method Area 내부에 논리적으로 구분된 영역이다
참조 : Namjun님 블로그 , cho님 블로그
나는 static Area가 heap 과 동등하게 분리된 영역인줄 알았는데
Method Area 내부에 논리적으로 분리된 영역이였다.
Method Area의 클래스 정보를 참조해 객체를 생성할때 Stack , heap 에 값이 할당된다.
그렇다면
❕ Stack이 할당되는 순간은 메서드가 호출될때 할당되는 영역이다.
ex ) 프로그램이 동작 중, 로그인을 시도해 로그인메소드가 호출될때.
Class class = new Class();
class.method(); //이 때
호출되면 메소드의 지역 변수와 객체의 Reference를 의미한다.
우선적으로 Heap 영역에 객체의 데이터를 올려두고
그 중 Reference(포인터 같은거)가 Stack 에 할당되게 된다 ( Reference + 지역변수 )
여기가 중요한것 같은데 스레드는 하나의 Stack 영역을 할당 받는다
이부분은 나중에 Thread 에 대해 공부할 때 더 많이 찾아봐야겟다.
❕ heap이 할당되는 순간은 프로그램이 실행 중에 생성된 객체가 저장되는 영역이다.
new 연산자나 주입을 받으며 새로운 객체가 생성될때 메모리가 할당된다.
Class class = new Class();
이 순간 heap 영역에 할당된다.
클래스를 활용해 선언된 객체는 heap 영역에 인스턴스 변수 , 객체의 Reference 가 저장된다
인스턴스 변수는 각각의 객체마다 고유한 값을 가진다.
객체의 Reference(참조)는 객체 자체를 가르키는 포인터의 역할을 한다( 메모리주소)
public class methodArea {
public static void main(String[] args) {
ClassA objectA = new ClassA(); // heap 에 objectA가 호출된다.
objectA.methodA(); // 메소드가 호출되면서 이때 . Stack에 저장된다.
}
}
class ClassA {
int classVariableA = 10; // 클래스 변수임으로 new으로 생성되면서 같이 heap 저장된다.
public void methodA() {
int localVariableA = 20; //로컬변수는 메소드가 호출되는 동안 Stack에 저장된다
}
}
전체적으로 heap라는 영역이 있는 것만 알았지. 어느 순간 어디에 할당되고 하는 것들을 모르고 있었는데
알게된 순간이였던것 같다.😭