자바의 메모리 구조
프로그램이 실행되면 프로세스의 형태로 메모리에 로드되고 이를 cpu가 실행함
프로그램의 구동을 위해서는 운영체제가 메모레 (RAM)에 공간을 할당하고 이 공간에 프로세스가 로드되어 프로그램이 실행됨
메모리공간은 크게
1. 스태틱영역
2. 스택영역
3. 힙 영역 으로 나뉘고 데이터 타입에 따라서 해당공간에 할당됨
// 먼저 잠깐 변수정리!
선언위치에 따른 분류 - 멤버변수 / 지역변수
멤버변수 : 클래스변수(인스턴수 변수앞에 static,) + 인스턴스변수( 필드내에 선언, 인스턴스 생성시 만들어짐 )
지역변수 : 메소드 내에서 선언되는 변수
데이터 타입에따른 분류 - 기본형변수 / 참조변수
기본형변수 : 자료의 실제값을 저장 ( 8개 타입 )
참조변수 : 값이 저장되어있는 주소값을 갖는다 ( string, 배열, 열거, 클래스, 인터페이스 등등, 사용자가 만들어낸 클래스타입만큼 즉 무한대)
1. 스태틱영역 : 필드부분에서 선언된 변수( 전역변수 = 인스턴스 변수) 와 static이 붙은 변수 ( 정적멤버변수 = 클래스 변수 )가 스태틱 영역에 데이터를 저장함. 프로그램의 시작과 종료까지 계속 메모리에 남아있음
2. 스택영역 : 메소드 내에서 정의하는 지역변수의 데이터값이 저장되는 공간 , 메소드가 호출될때 메모리에 할당되고 종료되면 메모리가 해제됨 ( LIFO의 형태를 갖는다 )
또한 참조타입의 변수는 스택영역에서 생성되는데 이때 값이 아니라 힙 영역에 있는 해당 주소값을 갖는다!!
문자열의 경우 리터럴로 생성된 객체는 동일한 주소를 참조하지만, new연산자로 객체를 새로 생성할경우 같은 문자열이라도 다른 주소를 참조함
3. 힙메모리영역 : 참조의 데이터 타입을 갖는 객체, 배열은 힙영역에 데이터가 저장됨. 이때 변수는 스택공간에서 실제 데이터가 저장된 힙 영역의 참조값을 new연산자를 통해 리턴받는다!!
즉, 실제 데이터를 갖고있는 힙 영역의 참조값을 스택영역의 객체가 갖고있다.