안녕하세요 아즈라엘 입니다.
제가 영어가 취약하여.. 문맹률을 높이고 있습니다.
혹시
http://stackoverflow.com/questions/3826905/singletons-vs-application-context-in-android
의 이슈에 대해서 요약 자료로써 번역을 부탁드려도 될까요?
대충 발번역과 그에 맘먹는 구글 번역으로 돌려보면서 하기엔 정확하게 이해하기가 힘들어서 그러합니다.ㅋ

저든 Application이라는걸 써본적이 없어서
제 친구는 썻던것같은데
싱글톤이나 올 스테틱으로 해놓고 onPause onResume에서 관리해주는 식으로 하는데 괜찮은것 같아요.
멀티쓰레드 사용하실 것 아니면 싱글톤 편하게 사용하셔도 상관 없습니다만
멀티쓰레드의 경우에는 신경 많이 쓰셔야 합니다.
그리고 콘텍스트도 생명주기가 있는데요 콘텍스트의 경우 가급적이면 WeakReference에 넣어서 사용하시는 것이 좋습니다.
메모리는 가급적 필요한 곳에서만 짧게~
즉 함수 내 로컬 변수는 함수 끝에 가서 죽기는 하지만 빨리 죽도록 사용 범위를 { } 로 묶어 주는 것도 좋습니다.
static은 계속 살아있으므로 남발하는 경우 좋다고 할 수는 없겠지요.
빨리 죽이고 싶어서 굳이 gc()를 호출할 필요는 없구요.
한 가지 팁을 더 드리자면
PC에서의 자바와 달리 안드로이드에서의 자바는 효율성을 극대화해야 하는데
예를 들어 우리가 보통 자바를 배울 때는 가능한 부모의 타입, 즉 ArrayList 보다는 List로 레퍼런스 변수 타입을 정하는 게
유연성 측면에서 더 좋다고 배웠는데요. 예) List a = new ArrayList();
안드로이드에서는 유연성이 필요한 API가 아니라면 원래 객체의 타입, 즉 List 보다 ArrayList로 레퍼런스 변수 타입을 정하는 게 더 좋습니다. 예) ArrayList a = new ArrayList();
또한 안드로이드에서는 멤버 변수에 접근하는 데 비용이 듭니다.
따라서 함수 내에서 멤버 변수에 접근할 일이 많은 경우에는 로컬 변수를 두어 멤버 변수의 레퍼런스를 복사한 다음 로컬 변수로 접근하는 것이 더 좋습니다.
예) 멤버 변수 private ArrayList mArray = new ArrayList();
함수 내에서
ArrayList tmp = mArray;
tmp로 접근...
이제 자야 해서... ^^ 시간이 없어 대충 봤는데
Application에 데이터를 저장하는 게 좋다.... 싱글톤이 좋다..... 싸우고 있네요.
간략히 요약하자면
주장 1: 싱글톤은 전역 접근이므로 동기화가 안되면 악몽이 일어날 수 있다. (멀티쓰레드인 경우를 우려하는 듯) 늦게 초기화되면 예측불가능한 문제가 생긴다. 하지만 Application은 안드로이드 프레임워크에서 잘 관리해 주므로 괜찮다.
주장 2: 데이터를 한 곳에 때려 넣는 건 별로다. 싱글톤은 모듈화 측면에서 더 좋다. 안드로이드 프레임워크에서도 싱글톤 많이 쓴다.
싱글톤이 멀티쓰레드에 취약하다고 하지만 대부분은 메인 쓰레드에서 사용되므로 괜찮다.
리플 달린 거나 몇몇 부분에서는 틀리게 주장하는 것들도 있긴 한데.
뭐... 대충 이런 주장인데요....
제 개인적인 생각으로는 취향의 문제인 것 같네요. ^^
사실 두 방법 모두 잘 쓰면 상관이 없는데 문제는 잘 못쓰는 사람이 많다는 거죠.
음..... 쓰레드 수십 개 돌아가는 상태에서 동기화 제대로 할 줄 알면 S급 개발자이긴 하죠.
자.... 여러분의 생각은?
Application과 싱글톤의 장단점을 안펍에서 논의해도 좋은 주제일 듯 하네요.
저는 내일부터 출장 가므로 한동안 자리를 비웁니다요.
아... 저는 두 가지 모두 사용합니다. state와 관련된 건 Application에 넣어 두는 편이고,
그 외에 정말로 하나여야만 하는 객체(state의 성질을 갖지 않는 것)은 싱글톤으로 하는 편입니다.