평화로운 월요일 이력서를 제출하고 쉬고 있던 찰나에 개발자 방에 이런 질문이 올라왔다.
질문

클래스 안에서 재할당이 왜 안 되나요?
어 저거?
처음 봤을 땐 코틀린이라 생각해 전역 변수 immutable 한 변수를 변경하려고 해서 오류가 떴구나 생각했다.
근데 자바네?
토론
처음 저 문제를 봤을 때 접근제어자가 없어서 default 접근제어자가 문제라고 생각했다.
다시 생각해보니 어차피 클래스 내부에서 동작되는 건데 접근제어자 필요 없잖아....
다른 개발자 친구랑 저 문제에 대해서 토론을 해봤는데 일단 메모리 관련 문제인 건 확신했다.
뭐가 안되면 대부분 메모리 때문이니까
이 와중 잊고 있던 사실, 전역 변수는 C, 자바는 클래스 변수, 인스턴스 변수, 지역변수
일단 해결책은 클래스의 인스턴스 변수를 재할당하고 싶으면 생성자를 쓰거나 초기화 블록을 쓰면 되는 것을 찾았다.
그래서 왜??
일단 친구와 내가 헷갈린 이유는 C의 이론으로 자바를 보고 있었기 때문이었다. C는 선언과 동시에 메모리에 적재되는 게 맞다. 포인터 생각하면 편하다. 따라서 저렇게 써도 된다
근데 자바의 인스턴스 변수는 인스턴스 생성 시 메모리에 적재가 되므로 저 상태에선 실체가 없기 때문에 재할당이 안 되는 것이다.
그럼 메서드에선 왜 써지지?
변수의 종류 | 선언위치 | 생성시기 |
---|---|---|
클래스 변수 | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수 | 클래스 영역 | 인스턴스 생성시 |
지역변수 | 메서드 영역 | 변수 선언문 수행시 |
메서드는 클래스의 인스턴스가 생성된 뒤 호출되는 것이기 때문에 절차상으로 메모리에 변수가 존재하기 때문에 가능하다.
인스턴스가 메모리에 적재되는 순간은 new 연산자에 의해 생성자가 호출되야한다. 또는 초기화 블록은 생성자보다 우선순위가 낮아 먼저 호출되므로 어찌 됐건 인스턴스가 생성될 시점에 메모리에 적재되기 때문에 문제가 없다.
느낀 점
오래간만에 자바 책을 다시 폈다.
'CS 지식' 카테고리의 다른 글
블록, 논 블록, 동기, 비동기 (0) | 2022.06.28 |
---|---|
Monolithic vs MicroService(MSA) (0) | 2022.06.13 |
객체와 클래스, 인스턴스 (0) | 2022.06.13 |