Activity를 인자로 넣어주는 것이 메모리 상으로 문제가 될 수 있을까요?(Java 객체, 주소값 전달 관련)


제가 연습으로 메모장을 만들어보고 있는데 Activity를 인자로 넣어서 다른 클래스,객체에 전달해주고 있습니다.

public class MemoAdapter extends RecyclerView.Adapter<MemoAdapter.ViewHolder> {

    private ArrayList<MemoItem> memoItems;
    private MainActivity mactivity;
    private Context mContext;

    public static class ViewHolder extends RecyclerView.ViewHolder {

        public ItemView itemView;

        public ViewHolder(View view, Context context, MainActivity activity) {
            super(view);
            itemView = new ItemView(context, activity);
            itemView.textView = (TextView) view.findViewById(R.id.list_item_title);
            itemView.textView.setClickable(true);
            itemView.textView.setOnClickListener(itemView);
            itemView.textView.setOnLongClickListener(itemView);

            ViewParent parentView = itemView.textView.getParent();
            View parent = (View) parentView;
            parent.setOnClickListener(itemView);
            parent.setOnLongClickListener(itemView);
        }

     public MemoAdapter(ArrayList<MemoItem> memoItems, MainActivity activity, Context context) {
        this.memoItems = memoItems;
        this.mactivity = activity;
        this.mContext = context;
    }

........

이건 RecyclerView에 들어가는 Adapter의 코드중 일부입니다. 위에 변수(필드...라고 하던가요..)로 MainActivity를 가지고 있고 생성자에서 MainActivity를 받아와서 저장하는 코드입니다.

(MainActivity 클래스 파일 내부) 

mMemoAdapter = new MemoAdapter(mArrayList, this, getApplicationContext());

이 코드는 MainActivity 내부에서 Adapter를 생성자를 이용하여 객체를 생성하는 부분입니다. 여기서 MainActivity를 인자로 this로 설정하여 자신을 넣어서 Adapter 객체를 생성합니다. 제가 자바에 대해서 완전히 익힌 것은 아니지만, 자바에서 객체의 참조?(전달?)은 그 객체가 메모리상에 있는 주소를 보낸다고 알고있는데, 주소값만 보낼경우는 메모리상에 문제가 크게 되지 않을 것이라고 생각되긴 합니다만, 만약 그것이 아니고 MainActivity 객체를 새로 만들어서 전달한다면 그건 문제가 될것 같네요.....

이게 혹시 메모리상에서 문제가 될 수 있을까요? 제가 말을 잘 못해서 질문이 이해가 안되실 수도 있을것 같습니다 ㅠ 질문이 이해 안되시면 댓글 달아주시면 감사하겠습니다 ㅠ


조회수 253


1 답변


좋아요
3
싫어요
채택취소하기

메모리 문제가 생길 수 있습니다. ItemView클래스에서 어떠한 작업을 하는지는 모르겠지만 Context나 Activity를 넘기고 화면 방향전환과 같이 Activity 재생성이 일어나는 경우 관련된 모든 객체들의 참조를 끊지 않으면 메모리릭(Memory Leak)이 발생하여 문제가 될수 있습니다. 그래서 웬만하면 Activity를 인자로 넘기지 않습니다.

관련된 설명글이 있어서 첨부해봅니다.

안드로이드 메모리릭 피하기

번역글

안드로이드 디벨로퍼 블로그에 있는글을 간단히 요약하면 결국 메모리릭을 피하기 위해서는

  • 메모리릭을 피하기 위해서는 Activity의 context가 아닌 Application의 context를 이용하세요.

  • 만일 Activity의 내부클래스를 정의하여 사용한다면, 내부클래스에서 상위 Activity를 참조하는 경우를 되도록 만들지 마세요. 대신 내부클래스를 static으로 정의하고 해당 클래스가 Activity와 WeakReference 를 갖도록 하세요.

조금이라도 도움이 되셨으면 좋겠습니다.

  • 2016년 04월 12일에 작성됨
    안드로이드, 루비온레일즈

  • 감사합니다!    TuTanKhamen   2016.4.12 10:46     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close