안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요.
안드로이드의 소스 보다보면 좀 의아한 부분들이 있는데요.
동작에는 이상이 없겠지만 왜 이렇게 했을 까 하는 것이 있습니다.
class 의 멤버 변수를
private WeakReference<Launcher> mLauncher;
이렇게 선언 하고,
생성자에서 혹은 멤버함수에서
void setLauncher(Launcher launcher) {
mLauncher = new WeakReference<Launcher>(launcher);
}
이렇게 설정합니다.
정작 이 변수를 사용하는 곳에서
if (mLauncher != null) {
final Launcher launcher = mLauncher.get();
if (launcher != null) {
launcher.loadWallpaper();
}
}
위와 같이 사용하던데요.
mLauncher 가 Launcher 클래스의 인스턴스 인데요. 이것 WeakReference 라서 이렇게 쓰는 것인가요?
if (mLauncher != null) {
mLauncher.loadWallpaper();
}
이렇게 수정하면 문제가 되나요?
이렇게 수정하면
대입 연산 하나 줄고, get() 함수 호출 줄고, 비교문 하나 줄기 때문에
실제로는 더 빠른 수행이 가능한거 아닌가요?
이런식의 코딩이 java의 특징인지요?
감사합니다.
안드로이드의 소스 보다보면 좀 의아한 부분들이 있는데요.
동작에는 이상이 없겠지만 왜 이렇게 했을 까 하는 것이 있습니다.
class 의 멤버 변수를
private WeakReference<Launcher> mLauncher;
이렇게 선언 하고,
생성자에서 혹은 멤버함수에서
void setLauncher(Launcher launcher) {
mLauncher = new WeakReference<Launcher>(launcher);
}
이렇게 설정합니다.
정작 이 변수를 사용하는 곳에서
if (mLauncher != null) {
final Launcher launcher = mLauncher.get();
if (launcher != null) {
launcher.loadWallpaper();
}
}
위와 같이 사용하던데요.
mLauncher 가 Launcher 클래스의 인스턴스 인데요. 이것 WeakReference 라서 이렇게 쓰는 것인가요?
if (mLauncher != null) {
mLauncher.loadWallpaper();
}
이렇게 수정하면 문제가 되나요?
이렇게 수정하면
대입 연산 하나 줄고, get() 함수 호출 줄고, 비교문 하나 줄기 때문에
실제로는 더 빠른 수행이 가능한거 아닌가요?
이런식의 코딩이 java의 특징인지요?
감사합니다.
2009.10.30 11:10:29
제가 많이 알고 있는건 아니지만 제가아는 상식선에서 몇자 적어봅니다. ^^;
우선 전체코드 ( 클래스들이 어떻게 사용되는지 ) 를 볼수가 없어서 적확히는 답변을 드리기 어렵지만
두가지정도로 요약 해보면 되겠습니다.
첫번째 final 이라는 키워드 인데요 final이라는 키워드는 한번생성되면 그값을 수정할수 없는 특징이 있죠....
해서 변수에 final 이라는 키워드를 사용한것 같구요.
두번째 걍 맴버 변수를 사용하는게 빠르다고 생각하시는데요....
이건 C언어와 java가 같은지는 모르겠습니다만 맴버변수를 참조하는것 보단 지역변수를 참조하는게 더 속도는 빠릅니다.( 이부분 설명하려면 어셈까지 설명을 해야되기 때문에 생략하겠습니다. )
그속도라는것이 어플리케이션 프로그래머들이 느끼는 정도로 많은것은 아니지만 예시된 코드를 작성하신분의 습관or본능? 같은
것이 라고 보시는게 좋을듯 합니다. 그럼 수고하세요~~~
우선 전체코드 ( 클래스들이 어떻게 사용되는지 ) 를 볼수가 없어서 적확히는 답변을 드리기 어렵지만
두가지정도로 요약 해보면 되겠습니다.
첫번째 final 이라는 키워드 인데요 final이라는 키워드는 한번생성되면 그값을 수정할수 없는 특징이 있죠....
해서 변수에 final 이라는 키워드를 사용한것 같구요.
두번째 걍 맴버 변수를 사용하는게 빠르다고 생각하시는데요....
이건 C언어와 java가 같은지는 모르겠습니다만 맴버변수를 참조하는것 보단 지역변수를 참조하는게 더 속도는 빠릅니다.( 이부분 설명하려면 어셈까지 설명을 해야되기 때문에 생략하겠습니다. )
그속도라는것이 어플리케이션 프로그래머들이 느끼는 정도로 많은것은 아니지만 예시된 코드를 작성하신분의 습관or본능? 같은
것이 라고 보시는게 좋을듯 합니다. 그럼 수고하세요~~~
2009.10.30 12:44:12
그냥 질문내용에서 'mLauncher 가 Launcher 클래스의 인스턴스 인데요' 라고 하셨는데 mLauncher는 WeakReference의 Instance입니다. WeakReference는 해당 오브젝트의 메모리 관리를 원하는데로 하기 위해서 사용하는거구요. 1초에 수백번 이상 실행되는 코드가 아닌 이상 콜하나 더 들어갔다고 전체 성능에 미치는 영향은 1 만분의 1도 안될겁니다. 그 대신 좀더 메모리 사용을 최적화하는 게 이득이라고 생각해서 위와 같은 코드를 작성한것으로 생각됩니다. 모든 경우에서 속도가 최우선은 아니라는 거지요.
실행을 해서 비교를 해봐야 될거 같네요..값도 넣어보구요.
만약에 WeakReference 이 클래스 때문에 그런것이 아니라면 님 코드대로 하는게 더 좋네요.
예제 소스를 보다보면 그냥 알아보기 쉽게 할려고 한번 더 코드를 적어주는 게 많거든요.
사람의 코딩 스타일이라서 자바의 특성이라고 볼 수는 없을 것 같네요.
직접 값을 넣어서 해보세요.ㅎㅎ