final int j = i;
textViews1[j].setOnCIickListener(new View.OnCIickListener() {
@Override
public void onCIick(View v) {
if (textViews2[j].getVisibility() == View.VISIBLE) {
textViews2[j].setVisibility(View.INVISIBLE);
}else{
textViews2[j].setVisibility(View.VISIBLE);
}
}
});
for(i~) 루프 안임
이런 식으로 무명 클래스 메서드 정의할 때 클래스가 정의되는 시점은 for 바깥이기 때문에 상수가 필요하다는 점은 이해함
근데 j조차도 원칙적으로는 반복문이 1회 돌면 사라지는 휘발하는 변수 아닌가 해서요
그럼 j는 정적 메모리에 들어가는 건가? 실질적으로 메모리의 어느 공간을 차지하고 있어?
저기서 final이 의미하는건 j변수가 어디 메모리스택에 저장되느냐가 아닌 const속성때문에 쓰는거다. 나 tizen native할때도 저런식으로 클릭이벤트쓰면 const쓰라고 함. 중요한건 내부 for문을 돌면서 특히 클릭이벤트 적용시키다가 j가 변하면 안되는 상황에서 저렇게쓰임
나도 자바지식이 얇아서 final변수가 스텍인지 텍스트영역인지 힙영역인지 정확히 어디에 할당이되는진 모르겠는데 결국 저기 for문안에 j도 결국 GC에의해서 메모리가 해제되겠지
그걸 묻는 게 아니야 기계어 흐름을 봤을 때 상수가 실질적으로 어떤 값을 말하는지 어떤지 궁금한 거임
질문의 요지가 굉장히 이상한데 정확히 뭐가 궁금한거야 기계어 상에서 상수가 어떤식으로 처리되는지가 궁금한거야?
정적영역은 C++및 C에서는 원칙상 자동해제가안됨 final이 만약 힙같은 정적영역에 할당된다면 C나 C++에 malloc에서처럼 똑같은 곳에 위치는하겠지 근데 JAVA에서는 GC가 참조되지않은 변수에대해서 알아서 해제해주니까 자동으로 메모리 해제가 될꺼임 대신 C++이나 C같은데서는 delete나 free로 메모리해제를 해줘야겠지
자바에서는 메모리에 대한 참조가 없으면 자동적으로 메모리해제가됨 자바에서 메모리누수가 나는경우는 해제되야할 혹은 이제 더이상 안쓰는 오브젝트에 참조가 먹혀서 GC가 작동안하는경우가 대부분이징