[Java] Method,Stack,Heap 와 New연산자
Java 클래스는 크게 세가지로 구성되어 있다. 필드(field), 생성자(constructor), 메소드(method)
Method(메서드 영역)
-클래스 정보
클래스의 실행 코드,필드,메서드와 생성자 코드등 모든 실행 코드가 존재한다.
-상수 풀
리터럴 문자가 있으면 문자를 공통으로 묶어서 관리한다.
-Static(스태틱 메모리 영역,메서드 영역)
필드 부분에 생성된 전역 변수와 정적 멤버 변수(static 멤버 변수(클래스 변)+ static 멤버 함수), 클래스 정보들을 포함하 고 있다.
프로그램 시작부터 종료까지 메모리에 저장되어있으므로, 프로그램 동작 과정에서 언제든 사용이 가능하다.
따라서 무분별한 사용을 할 경우 메모리가 많이 소비되어 좋지 않다.
클래스 안에 있는 메서드는 공유되기 때문에 인스턴스화 시켜도 메서드 코드는 메서드 영역에서 공통으로 관리되고 실행된다.
Stack(스택 메모리 영역)
기본 자료형의 지역 변수의 데이터 값,메서드 저장된다. 메소드가 할당 될 때 생성하고 종료될시 해제 된다.
스택 구조를 가지며 변수에 새로운 데이터가 할당 되면 기존 데이터는 지워지게 된다.
즉 메서드 단위의 변수값들에 대한 메모리를 저장할 때 사용된다.
자바 실행 시 , 하나의 실행 스택이 생성된다. 각 스택 프레임은 지역 변수,중간 연산 결과,메서드 호출 정보등을 포함한다.
스택 프레임:스택 영역에 쌓이는 네모 박스 하나가 스텍 프레임이며,메서드를 호출할 때 마다 하나의 스택 프레임이 쌓이고 메서드가 종료되면 해당 스택 프레임이 제거된다.
쓰레드 수 만큼 스택 영역이 생성된다.
Heap(힙 메모리 영역)
참조형의 데이터 타입을 가지는 객체들 ,즉 new로 생성된 인스턴스들에 대한 값들이 저장되는 영역이다.
new로 해당 인스턴스를 생성하게 되면 요청한 영역 만큼의 공간을 할당해주게 된다. 힙 공간에 존재하는 인스턴스들을 핸들하기 위해서는 힙 공간의 주소를 가진 객체를 통해서만 다룰 수 있다.
이때 힙 공간의 주소를 가진 객체는 Stack 메모리 영역에 존재한다. 만약 어떤 Stack공간에서의 객체가 Heap메모리 공간의 데이터를 참조하고 있지 않다면 자동으로 가비지 컬렉터(GC)에 의해 해제된다.
New 연산자
클래스 형식의 인스턴스를 생성해준다. 이때 해당 필요한 영역 만큼 Heap메모리 공간에서 영역을 받고 해당 클래스의 생성자를 만들고 이를 실행한다.
리턴 값으로는 해당 객체의 참조값, 즉 주소값을 반환해주게 된다.
*별도
멤버 변수의 종류
-인스턴스 변수:
static이 붙지 않은 멤버 변수는 인스턴스를 생성해 사용할 수 있고, 인스턴스에 소속되어 있다.따라서 인스턴스 변수라고 한다. 힙 메모리에서 생성되고 사라진다.
-클래스 변수:
static이 붙은 멤버 변수
클래스 변수,정적 변수,static변수 등으로 불린다. 인스턴스와 무관하게 사용될 수 있다.
메서드 영역중 static 영역에서 생성되고 사라진다.
-메서드 변수,매개 변수:
스택 메모리에서 생성되며 메서드가 스택에서 종료될때 사라진다.
궁금증
1. int[] numbers = new int[5]; 처럼 간단히 배열을 만들때 필요한 영역의 할당된 공간만큼 new해주는 개념으로 알고 있었는데, new는 클래스 형태의 인스턴스화를 해주는 것이면, int[] 배열 구조가 클래스 형태인 것인가?
즉, 배열 구조가 클래스 형태라고 생각하는 것이 맞는지 헷갈린다.
아니면 단순히 new로 Heap 공간 할당 이후 생성자 실행이 있었기에 이를 클래스 객체화로 말하는 것이였는지가 궁금하다.
--->공부해본 클래스 객체와 배열은 다른 개념인 것. 힙 영역에 둘다 저장이 되는 것이다.