💡 해당 글은 『자바의 신 3판』을 복습하며 도서의 내용과 본인의 주관적인 생각을 정리한 글입니다.
☁️ 내용정리
변수 (variable)
변수는 프로그램에서 사용될 데이터를 담는 공간
이다.
자바에는 네 가지 변수가 존재한다.
지역 변수
: 코드 블럭{ }
내에서 선언되고 사용할 수 있는 변수, static 블록 포함매개 변수
: 메서드에 전달하는 변수. 메서드 내에서만 유효하다.인스턴스 변수
: 인스턴스 필드에 선언된 변수. 인스턴스의 생명 주기와 같다.클래스 변수
: 클래스 필드에 static으로 선언된 변수.
전 포스팅에서 객체의 상태라고 표현한 변수는 인스턴스 변수이다.
변수 명명 규칙
- 변수의 가장 앞 문자는 유니코드 문자, 알파벳, $(달러), _(언더 스코어)만 올 수 있다. (필수)
- 변수명은 의미가 잘 전달되도록 명사로 작성한다. (클린 코드)
- 상수는 대문자 + 스네이크케이스, 그 외의 변수는 소문자 시작 + 카멜 케이스로 작성한다. (클린 코드)
Primitive Type 과 Reference Type
자바에서는 크게 두개의 자료형(type)이 존재한다.
- 원시(
primitive
) 타입: boolean, byte, short, int, long, float, double, char - 참조(
reference
) 타입: 인스턴스가 저장되는 공간
원시타입의 표현범위
byte(1바이트, 8비트)
8비트로 표현할 수 있는 수는 512개 이다.
하지만 가장 첫 번째 비트는 부호비트로 사용되기 때문에 -128 ~ 127 까지 표현이 가능하다.
☁️ 내 생각
변수의 생명주기와 call by value에 대해
변수는 데이터를 담는 공간
이다.
따라서 변수의 생명 주기는 공간의 생명 주기
이지, 데이터의 생명 주기
가 아니다.
이는 primitive type
(원시 타입)변수와 reference type
(참조 타입)변수를 통해 확인할 수 있다.
매개변수가 원시타입인 경우를 생각해보자. 원시타입은 변수 공간에 값이 할당된다.(엄밀히 말하면 주소 값이지만 편의 상 값이라 칭한다.) 따라서 해당 공간의 생명 주기가 끝난다면 값도 사라지게 된다.
매개변수가 참조타입인 경우를 생각해보자. 참조타입은 변수 공간에 힙 영역의 주소 값이 할당된다. 따라서 해당 공간의 생명 주기가 끝난다면 참조 주소 값이 사라진다. 참조하고 있는 인스턴스가 사라지는 것이 아니다.
이 인스턴스가 모든 스레드의 Stack Frame
으로부터의 참조가 끊기게 된다면 GC
에 의해 수거된다.
이렇게 자바는 매개변수 공간에 값
을 담아서 전달하기 때문에 call by value
만 지원한다는 것이다.
오직 데몬 스레드만이 참조하고 있는 인스턴스는 GC에 의해 수거될 것인가?
GC는 루트 참조(roots)에서부터 도달가능한(reachable) 인스턴스를 찾고 도달이 불가능한(unReachable)한 인스턴스 메모리를 수거한다.
루트는 각 스레드의 Stack Frame
, 전역 변수
, 상수 풀
, JNI
(Java Native Interface)가 될 수 있다.
한글 정보는 없고, 해외 정보도 찾기가 힘들어서 GPT에게 물어봤다. (너무 편리하다)
(확실하지는 않은 정보이다. 추후 업데이트하겠다.)
Q. 결국 데몬스레드만이 참조하고 있는 인스턴스는 unreachable한 객체라고 판단되어 GC에 의해 수거된다는 게 맞는가?
A. 네, 맞습니다. 만약 어떤 객체가 데몬 스레드만이 참조하고 있고, 그 객체에 대한 참조가 다른 곳에서는 존재하지 않는다면, 해당 객체는 도달 가능한(reachable) 객체로 간주되지 않습니다. 가비지 컬렉터는 도달 가능하지 않은 객체를 식별하고 이를 수거합니다. 이 경우에는 GC에 의해 해당 객체가 수거될 수 있습니다.
데몬 스레드도 독자적인 Stack Frame을 가지지만, 데몬 스레드의 스택 프레임은 roots가 될 수 없다고 한다.
신기하다.
GPT의 정보는 신뢰도가 좀 떨어져서 스스로 생각을 해봤다.
만약에 내가 만든 모니터링 스레드가 A 인스턴스를 주시하고 있다고 가정했을 때, A 인스턴스가 모니터링 스레드 외의 모든 일반 스레드로부터의 참조가 끊겼다고 가정해보자.
이런 상황에서 모니터링 스레드가 A 인스턴스를 주시하고 있다는 이유 때문에 A 인스턴스에 대한 메모리 수거가 이루어지지 않는건 비효율적이라고 생각한다.
☁️ 질문
'JAVA > 자바의 신' 카테고리의 다른 글
6장. 내가 조건을 좀 따져요 (0) | 2024.01.04 |
---|---|
5장. 계산을 하고 싶어요 (1) | 2024.01.04 |
3장. 자바를 제대로 알려면 객체가 무엇인지를 알아야 해요 (0) | 2024.01.03 |
2장. Hello God Of Java (1) | 2024.01.03 |
1장. 프로그래밍이란 무엇인가? (2) | 2024.01.03 |