힙과 스택

Helog·2020년 2월 21일
6

IT기술면접

목록 보기
1/4

1. 스택 vs 힙

(1) 스택 : 그림과 같이 메모리 크기가 정해져 있다 (정적 메모리 할당/불변)

int, boolean, double 등

-> 장점 : 액세스가 매우 빠름 / 변수를 명시적으로 할당, 해제 필요 없음

  • 힙과 비교했을 때 빠른 것이다. 아래에서 보겠지만 힙은 스택의 주소를 이용하여 액세스를 한다. 힙은 스택을 거쳐가야 하기 때문에 상대적으로 느린 것이다.

-> 단점 : 메모리 크기를 변경할 수 없다.(불변)

  • 아래 예를 통해 보여주겠다.
string a="hel";
string b="lo";
string c=a+b;

읭..? 내가 넣었던 hel, lo는 없어지지 않는다. 즉 불변이라는 것이다.
무분별하게 +,concat을 했다간 메모리효율이 떨어진다는 것을 알 수 있다.
그래서 String보다 StringBuffer, StringBuilder 사용을 추천한다. (바로 다음에서 설명하겠다 / 예고 : 동적할당임)

(2) 힙 : 메모리 크기가 정해져 있지 않다 (동적 메모리 할당/가변)

String, Object, Array 등 (String은 특이하게 heap의 스트링풀 영역에 담긴다.)

-> 장점 : 메모리 크기를 변경할 수 있다(효율적)

-> 단점 : 상대적으로 느린 액세스

  • 같은 예를 들어보겠다.
string a="hel";
string b="lo";
string c=a+b;

드디어 내 생각대로 되었다.
그림만 봐도 힙이 메모리 효율이 좋다는 것을 알 수 있다.
하지만 무조건적으로 힙이 좋다는 것은 아니다. 일을 혼자하는 것보다 둘이 하는게 효율적이듯, 스택과 힙 각 부분의 역할에 맞게 사용하면 효율을 극대화시킬 수 있다.

  • 참고로 C와 다르게 Java에서는 스택은 해당 함수 종료시, 힙은 가비지컬렉터가 알아서 메모리할당을 해제한다. Java는 꿀이다!
  • 스택에는 주소가, 힙에는 값이 들어간다고 보면 된다.
profile
Hello gaebalja

2개의 댓글

comment-user-thumbnail
2020년 2월 21일

회사에서 작성하시다니 여유있어보이셔서 부럽습니다~

답글 달기
comment-user-thumbnail
2020년 3월 4일

소개글의 내용 너무 궁금해요! 짤렸네요...

답글 달기