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;
이렇게 하면 바로 찾아서 청소합니다.