일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- #리사이클러뷰 어댑터
- 키스토어
- 클린아키텍쳐
- 구글맵안돼요
- 리사이클러뷰 체크박스
- 안드로이드 익명클래스
- #ContentProvider #App DataShare
- 안드로이드 메모리릭
- 메모리릭
- zeplin
- #안드로이드 개발자 #안드로이드 신입 #개발자 이직 #안드로이드 면접 #신입 개발자
- retrofi
- 사용법
- #SMS API #안드로이드 SMS #SMS Retriever
- #android #안드로이드 #glide #gif #이미지다운로드
- #안드로이드
- 안드로이드
- #리사이클러뷰
- 안드로이드해상도
- 안드로이드 아키텍쳐
- retrofit
- 빗버킷 #bitbucket #authorization failed #깃
- retrofit2
- 제플린
- MVVM
- 레트로핏
- Today
- Total
땀이 삐질삐질 나는 개발 일기
RecyclerView Adapter에서 ViewHolder를 Nested Static Class 로 사용하는 이유. 본문
안녕하세요. 삐질삐질 개발하는 개발자 삐질입니다.
오늘 포스팅에서는 우리가 안드로이드 개발을 할때 대부분 사용되는 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의 객체를 새로 인플레이트 하더라도
쓸데없는 메모리 할당을 피할 수 있게 됩니다.
이렇게 부모의 인스턴스에 접근할 수 없게됩니다.
이로 인해서 우리는 리사이클러 뷰를 사용함에 있어서 효율적으로 메모리를 사용할 수 있게 됩니다.
'개발 Tip' 카테고리의 다른 글
Glide 4.x 버전 이상에서 Gif 및 이미지 다운받아 파일로 저장 (2) | 2019.10.22 |
---|---|
Android Alarm Manager 반복 설정 시 생길 수 있는 문제 (1) | 2019.08.01 |
Retrofit2 기본 사용법 (4) | 2019.07.19 |
FindViewById() 대체제 Databinding (0) | 2019.07.19 |
Recyclerview와 ViewHolder의 개념 (2) | 2019.07.15 |