마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

setcontentview 에 관한 질문입니다.

0 추천

안녕하세요. 이제 막 안드로이드 공부를 시작한 초심자입니다.

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    MyView vw = new MyView(this);

    setContentView(vw);

}

 

보통 커스텀 뷰를 이용하여 액티비티를 구성할 때 위와같이 커스텀 뷰의 인스턴스를 setContentView 의 인자로 하여 구현하는 경우를 많이 보았습니다.

제 짧은 소견으로는 MyView 인스턴스 vw가 onCreate 의 지역변수로 되어 있으면 onCreate 가 리턴됨과 동시에 사라져서 화면에 나타나면 안 될 것 같습니다. 게다가 MyView에서 onDraw를 구현하는 등 인터랙티브한 동작에서도 onCreate 리턴되는 이후에도 계속 커스텀 뷰가 유지되는데 그 이유가 궁금합니다. 기초적인 자바 문법인것 같은데 도움 주시면 감사하겠습니다^^

익명사용자 님이 2013년 12월 27일 질문

2개의 답변

+2 추천
자바의 메모리 구조를 공부하시면 됩니다.

라고 한줄만 달면 너무 무책임한 답변이겠조...

주요한 메모리 구조중 님이 질문한것과 관련이 있는 힙메모리와 스택 메모리 중점으로 설명드리겠습니다.

heap 메모리는 new 연산자로 인스턴스를 생성하면 할당이 되고 스택 메모리는 함수안에 선언될때 할당되는

메모리입니다.

onCreate에서 new MyView()로 new 연산자가 생성되었으므로 힙메모리에 메모리가 할당됩니다.

그 크기는 MyView에 선언된 인스턴스 멤버 크기만큼 할당됩니다.

그리고, vw 변수에 할당을 했는데, vw는 로컬 변수가 되고 위에서 new MyView()로 생성된 메모리 주소값이

할당됩니다. 4바이트겠조.

즉 로컬 변수 vw는 MyView의 인스턴스를 가르키는  4바이트 메모리 주소값을 갖게 됩니다.

그리고, 이 로컬 변수의 4바이트 메모리주소는 onCreate 가 종료되면 사라집니다.

그러면 heap 메모리에 할당된 메모리는 언제 사라지는가? 인데  사라지는 시점은 가비지 컬렉터가

언제 가비지 컬렉션을 수행하느냐의 문제이며, 이 메모리 주소값을 참조하는 놈이 하나도 없을때

가비지 컬렉션의 대상이 됩니다.

만일 다른 코드가 없고 저 onCreate 함수만 있다고 가정한다면,

onCreate 에서 new MyView로 힙 메모리 할당된후 해당 인스턴스의 메모리 주소를 vw에 담은후에

setContentView(vw)에 넘기면 해당 인스턴스의 메모리를 참조해서 화면에 그리는 렌더링을 하게 됩니다.

다 그리게 되면 onCreate가 종료되고 vw 는 로컬 변수이니까 당연히 스택메모리에서 사라지고,

힙메모리는 참조하는 변수가 없다면 가비지 컬렉션의 대상이 됩니다.

setContentView( new MyView(this) );

이렇게 선언 했다고 생각하지면 편하조...
이스트플랙 (2,510 포인트) 님이 2013년 12월 29일 답변
와 친절한 답변 정말 감사드립니다!
자바의 메모리 구조를 공부하시면 됩니다.
라고 한줄만 달면 너무 무책임한 답변이겠조...

이스트플랙 님의 자세한 설명에 몬?가 평소 부족했던 부분을 채우고 지나칩니다.
고맙네요. 애써 로긴해서 추천 던지?고 지나쳐 사라집니다. ^^
0 추천

vw 참조변수에 저장된 "new를 통하여 생성된 MyView 객체의 참조 값"이 setContentView 메서드에 참조값 복사 전달되었기 때문입니다.

자바 관련 내용에서 정적메모리, 동적메모리, 참조변수 등에 대하여 참고하시기바랍니다.

광휘 (860 포인트) 님이 2013년 12월 27일 답변
빠른 답변 감사드립니다^^
...