변수와 객체와 메모리의 관계
어플리케이션이 실행될 때, 객체를 포함하여 데이터가 메모리에 어떻게 저장되는지 알아야
개발 중에 실수하지 않을 수 있고 어플리케이션의 성능과도 어떻게 연관있는지 이해할 수 있다.
어플리케이션은 어떻게 실행되는가?
- 어플리케이션 : 일반 사용자가 사용할 기능을 제공하는 컴퓨터가 실행할 수 있는 명령어들의 집합
- 메모리 : 실행된 어플리케이션이 상주하는 곳
- CPU : 명령어를 실행하는 주체
main 메소드를 실행시키면
a라는 변수에 7이라는 값을 대입하라는 명령어를 CPU에서 실행하게 됨
메모리 상에서는 a 7이라는 값이 저장됨, b와 c도 이런식으로 실행
메모리 구조
- 어플리케이션에 할당되는 메모리는 내부적으로 여러 영역으로 나뉨
- 그중에 stack 메모리와 heap 메모리가 있음
- stack 메모리 : 함수나 메서드의 지역 변수 (local variable)와 매개 변수 (parameter)가 저장되고
메서드가 호출될 때 마다 stack frame이 쌓임
- heap 메모리 : 객체가 저장됨
main 메소드가 실행되며 Stack 안에 stack frame이 생성됨 (아래 그림에서 노란색 박스)
아래 와 같은 코드가 실행되면
main 메소드에 의한 노란색 stack frame이 먼저 생성되고
그다음 wow 메소드에 의해 초록색 stack frame이 쌓임
이때 a=wow(a); 가 실행이 끝나면 a는 400으로 갱신되면서 초록색 stack frame은 제거가 됨
Stack 메모리 관리는 자바가 해줌!
하지만 재귀함수와 같이 계속해서 메소드를 호출하는 코드를 작성할 때는 주의해야함
계속 stack 메모리에 stack frame이 쌓이게되면 어플리케이션은 죽어버림
Heap 메모리
main메소드에의해 노란색 stack frame 생성 -> Counter 객체를 생성하면서 초록색 stack frame 생성
Stack 메모리에 c는 Counter 객체 자체가 저장되는 것이 아니라 Counter 객체를 가르키는 Heap 메모리 주소값이 저장됨
main메소드는 노란색 stack frame을 생성
Counter 객체는 heap 메모리에 생성이 되고 저장된 주소 값이 하늘색 stack frame을 생성
그뒤 다시 main 메소드로 돌아오고 오른쪽 그림 처럼 하늘색 stack frame은 제거가 됨
노란색 stack frame의 c 에 아까 생성된 Counter 객체가 생성된 heap 메모리 주소값이 들어가게 됨
two(c); 명령어가 실행되며 보라색 stack frame이 생성됨
첫번째 c.increment() 메소드가 실행되며 (왼쪽 그림)
두번째 c.increment() 메소드가 실행되며 주황색 stack frame 생성 (오른쪽 그림)
마지막 main 메소드 코드인 int count 실행되며 파란색 stack frame 생성
main 메소드가 전부 실행되면 아래 그림과 같이 stack 메모리 상태가됨
즉 !
호출된 메소드가 파라미터로 객체를 전달받아서 그 객체의 상태를 변경하게 됬다면,
그 메소드 종료 이후에도 그 객체는 변경된 상태 그대로 남아있음
쓰레기 객체 (garbage object)
아래와 같이 Counter 객체와 make메소드에 의해 객체가 heap 메모리에 저장되는데
하나는 접근할 수 없는 객체
이런 객체가 바로 쓰레기 객체!