본문 바로가기

카테고리 없음

java의 스택과 힙

class A;
class B;

A a = new A();
B b = new B();

a = b;


여기서 무슨 일이 일어날까요

new를 통해서 A클래스의 객체와 B클래스의 객체가 각각 생성되었고 이를 A와 B라고 부릅시다.

A와 B는 힙 영역에 있습니다.

그리고 a와 b는 스택영역에 있습니다.

a와 b에 저장되어 있는 값은 단지 주소입니다.

그 주소가 각각 A와 B를 가리키고 있는 것이죠

a=b 연산을 통해 a변수에 (객체가 아니라 단지 포인터 변수일뿐입니다.) b의 주소가 할당됩니다.

그럼 더이상 A객체에 접근을 할 수가 없게되죠

C 혹은 C++에서는 이런 현상을 메모리 누수 현상이라고 합니다.


하지만 자바는??

자바는 VM안에 환경미화원이 계시죠

garbage collection이 사용하지 않는 객체를 찾아내서 지우게 됩니다. 백그라운드로 쓰레드로 돌면서 말이죠

쉬지 않고 일하십니다.

만약에 a=b 이런식으로 A에 대한 참조를 잃게 되는 순간 환경미화원이 그 A객체를 찾아내어 지워버리게됩니다.

이런식으로 자바에서는 메모리 누수현상이 생기지가 않죠

흠 어떻게 보면 좋다고도 할 수 있지만  이는 아무래도 '느린 속도'를 가지고 오겠죠


언젠가 외국의 자바 프로그래머가 자바가 왜 느리냐 ! 빠르다!  라는 글을 보았는 데

저는 아직까지는 신빙성이 안가네요  

자바는 좀 느려요 ㅋ

하지만 확실히 '편한' 언어임에는 틀림이 없습니다.

물론 저도 객체지향 프로그래밍을 좋아하고 편하다고 생각하고 웬만해선 프로그램을 그렇게 짜고 있습죠

네 여기서 알아야 할 건  스택과 힙에 대한 완벽한 이해입니다.

여러 언어를 사용함으로써 그 차이를 명백히 알 수 있는 거죠

어떤 언어든 

배우고 보라!


p.s  위와 같은 현상 때문에

자바에서는 delete가 필요 없습니다.

하지만 
환경미화원에게 여기 쓰레기 있습니다.  라고 알려주면 더 빨리 청소하겠죠?

A a = new A();
a = null;
이렇게 하면 바로 찾아서 청소합니다.