[기술면접] 메모리 영역 / 스택(Stack) vs 힙(Heap)

송현진·2023년 7월 29일
0

CS공부

목록 보기
5/5
post-thumbnail

데이터 영역

  • 프로그램이 구동되는 동안 항상 접근 가능한 변수가 저장된다
  • 전역(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 - 접근 제한이 없음(프로젝트 내 어디서든 사용 가능)

참고
데이터, 스택, 힙 영역 자료

profile
개발자가 되고 싶은 취준생

0개의 댓글