데이터 영역
- 프로그램이 구동되는 동안 항상 접근 가능한 변수가 저장된다
- 전역(Global) 변수 / 정적(Static) 변수
- Read-Write
스택(Stack) 영역
- 값 형식을 저장하는 영역
- 지역변수와 매개변수가 저장되는 영역
- 코드 블록 안에서 생성된 변수들은 블록이 닫히면 메모리에서 제거된다
- 후입선출(LIFO, Last-In-First-Out) 방식
- 메모리의 높은 주소에서 낮은 주소의 방향으로 할당
장점
- 엑세스가 빠르다
- 변수를 명시적으로 할당 해제할 필요가 없다
단점
- 메모리 크기가 제한적이며 변경할 수 없다(컴파일 타임에 크기 결정된다)
- 무한 재귀문 등으로 정해진 스택의 제한량보다 많은 할당이 이루어지면 스택 오버플로우 발생
힙(Heap) 영역
- 참조 형식을 저장하는 영역
- 자동으로 제거되지 않으며, 메모리해제를 안할 경우 메모리 누수(leak)가 일어난다
- 가비지 컬렉터(GC)가 수거한다
- 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다
- 코드 블록이 사라지는 시점과 관계없이 데이터를 유지하고 싶을 때 사용한다
- 선입선출(FIFO, First-In-First-Out) 방식
- 메모리의 낮은 주소에서 높은 주소의 방향으로 할당
장점
- 메모리 크기를 동적으로 변경할 수 있다(런타임에 크기가 결정된다)
- 변수를 전역적으로 엑세스 가능
단점
String s = new String(""); 과 리터럴(String s = "";)의 차이
new String("")은 new 키워드로 새로운 객체를 생성하기 때문에 Heap 영역에 저장,
리터럴은 Heap 안에 있는 String Constant Pool 영역에 저장된다.
스택 vs 힙
| 스택 | 힙 |
---|
엑세스 속도 | 빠름 | 느림 |
스코프 | 로컬 | 글로벌 |
메모리 크기 | 불변 | 동적 |
메모리해제 | 블록이 끝나면 자동해제 | 수동으로 해제 |
접근 제한자(Access Modifier)
변수 또는 메서드의 접근 범위를 설정해주기 위해 사용하는 Java의 예약어
- private - 해당 클래스 내에서만 접근 가능
- (default) - 해당 패키지 내에서만 접근 가능
- protected - 해당 패키지 내, 다른 패키지에서 상속받아 자손 클래스에서 접근 가능
- public - 접근 제한이 없음(프로젝트 내 어디서든 사용 가능)
참고
데이터, 스택, 힙 영역 자료