땀이 삐질삐질 나는 개발 일기

RecyclerView Adapter에서 ViewHolder를 Nested Static Class 로 사용하는 이유. 본문

개발 Tip

RecyclerView Adapter에서 ViewHolder를 Nested Static Class 로 사용하는 이유.

삐질 2019. 7. 21. 00:48

안녕하세요. 삐질삐질 개발하는 개발자 삐질입니다.

 

오늘 포스팅에서는 우리가 안드로이드 개발을 할때 대부분 사용되는 Recyclerview(이하 "리사이클러뷰")의 

 

ViewHolder(이하 "뷰홀더")의 특징에 대해 알아보도록 하겠습니다. 

 

우리는 리사이클러뷰 어댑터 속에 뷰홀더 클래스를 작성할때 아래와 같이 하곤 합니다.

 

public class ItemViewHolder extends RecyclerView.ViewHolder{

    public ItemViewHolder(@NonNull View itemView) {
        super(itemView);
    }
}

이렇게요 ! 

 

 

.

.

.

.

.

.

.

 

 

그러나 이상한 부분을 혹시 느끼셨나요? 고의로 저는 한 가지 단어를 제외 했습니다.

제외 된 단어는 바로 public class 사이에 선언돼야 할 "static" 입니다.

 

오늘 말하고 싶은 가장 중요한 키워드는 static 입니다. 왜냐구요? (중요하니까요...)

 

사실 static(정적)의 키워드는 자바의 개념과 더 연관이 깊습니다.

 

자바에서 Nested 클래스는 크게 두가지로 나뉩니다.

 

1. InnerClass -> (Local Class , Anonymous class)

2. Static Nested Class

 

중첩클래스의 한 종유인 Static Nested Class로 선언하는 가장 큰 이유는 바로 , 부모의 멤버 인스턴스를 참조하지 않게 하기 위함입니다.

 

단순 InnerClass로 내부의 클래스를 선언 했다면, 리사이클러뷰에서 뷰홀더는  부모 클래스의 멤버 인스턴스에 대한 참조를 모두 가지고 있게 됩니다. 

 

예를들어 이런 모습입니다.

public class BasicAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    int a ;
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }

    public class ItemViewHolder extends RecyclerView.ViewHolder{

        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);
            a=0;
        }
    }
}

 

위 부모 클래스에서의 int a라는 변수를 뷰홀더에서 그대로 접근이 가능하게 됩니다.  이렇게 되면  안드로이드에서 리사이클러뷰를 사용할 때 필요한 만큼의 뷰홀더를 만들게 되는데 , 그때마다  메모리 힙 영역에  부모 멤버 인스턴스만큼의 메모리를 더 할당하게 됩니다.

 

따라서 클래스 선언에 static을 붙여주게되면 부모와 독립적으로 구분지어 지기 때문에 ViewHolder의 객체를 새로 인플레이트 하더라도 

쓸데없는 메모리 할당을 피할 수 있게 됩니다.

 

 

이렇게 부모의 인스턴스에 접근할 수 없게됩니다.

 

이로 인해서 우리는 리사이클러 뷰를 사용함에 있어서 효율적으로 메모리를 사용할 수 있게 됩니다.

 

 

안드로이드 초보 개발자를 위해 아래와 같은 카카오 오픈톡을 운영 중입니다

 

Comments