Stack
LIFO 순서로 동작하면서 원시타입의 데이터가 저장되면 stack에 직접 저장이 되고
참조타입의 데이터가 저장되면 heap의 위치를 가르키는 주소값이 저장됩니다.
여기서 LIFO는 Last In First Out의 약자로 후입선출이라고도 부릅니다
우리들이 흔히 쓰던 ctrl + Z 가 전형적인 후입선출의 예라고 볼 수 있습니다
Heap
참조타입의 객체들이 이 영역에 직접 저장이 됩니다.
이 메모리를 할당 받는 객체들이 많아지면 많아질수록 프로그램에 부하를 주게되는데
자바에는 이러한 메모리를 지워주는 라이브러리를 제공하지 않고 있습니다
이유는 heap 영역의 값은 참조하는 변수가 없다면 의미 없는 개체가 되어서
메모리를 낭비하게 되므로 JVM garbage Collector에 의해서 자동으로 삭제가 됩니다
즉 알아서 지워준다는 뜻인데 이 말은 하나의 변수가 a라는 객체를 참조하게 되었는데
그 뒤에 다시 b라는 객체를 참조하게 되었다면 a 객체는 garbage Collector의 대상이되고
jvm에서 자동으로 삭제되게 됩니다.
heap의 경우에서 특이한 경우는 바로 string의 경우인데 string타입은 참조타입이지만
예외적으로 리터럴을 허용해줍니다
하지만 문자열 리터럴이 동일하다면 string의 객체를 공유하게 되어 있어서
같은 힙 영역의 값을 가리키는 주소를 가지게 됩니다
a와 b는 같은 힙영역의 aaa를 가르키는 주소를 가지기에 주소값이 같게됩니다
그럴경우 비교연산자를 통해 확인을 하게 되면 true가 나오게 되는데
이게 a와 b가 가리키던 “aaa” 문자열값이 서로 각자 다른 위치에 있는 값이라고 생각하게되고
“aaa”가 같아서 true를 반환하는구나 라는 오류를 범하게 됩니다
하지만 이는 사실이 아니고 같은 주소를 가지고 있으므로 true가 나올뿐입니다
실제로 new 연산자를 통해 생성을 하게 된다면 각각 다른 주소를 가진 “aaa”가 생성되게 되고
비교연산자를 통해서 확인해봐도 false가 나오게 됩니다
고로 동일한 string 객체건 다른 sting 객체건 내부 문자열을 비교하려면 equals()함수를 사용해야합니다
static
프로그램이 시작함과 동시에 할당되어서 프로그램이 종료될때 소멸됩니다
우리가 인텔리제이를 켜고 자바의 메인함수를 적을때 static이 들어간 이유가 바로 이것입니다
자바의 메인이 되는 함수이기때문에 static으로 선언되는게 맞습니다
또다른 방식으로는 heap이 있는데 차이점이라하면 heap은 연산이 실행되는 순간 메모리에 할당이 되고
Garbage Collector에 의해 사라질 수도 있습니다
static은 모두가 공유 될 수 있다는 장점이 있지만
Garbage Collector의 영향을 받지 않기 때문에 계속 메모리에 할당된채로 존재하게 되고
성능에 악영향을 끼칠수도 있는 단점이 있습니다
'web > JAVA & Spring' 카테고리의 다른 글
리스코프 치환 법칙 (0) | 2022.12.31 |
---|---|
캡슐화 (0) | 2022.12.31 |
예외처리 (0) | 2022.12.24 |
Static / Stack / Heap (0) | 2022.12.10 |
객체지향의 4대 특성 (0) | 2022.12.06 |