안드로이드 HashMap 을 이용한 이미지 세팅하기.
if문이 자꾸 늘어나고 또 나중에 수정할 때 건드리는 부분이 많아져서 어떻게 할까 고민하던 중
Map을 이용하여 하는 방법에 대해 알게 되었다.
즉 이러한 if 문을
public static BitmapDrawable getSeasonBitmapDrawble(Context context, String str_season){ BitmapDrawable img_season = null; if(str_season.equals("13")){ img_season =BitmapDrawable)context.getResources().getDrawable(R.drawable.year13); }else if(str_season.equals("15")){ img_season =BitmapDrawable)context.getResources().getDrawable(R.drawable.year15); }else if(str_season.equals("여름")){ img_season =BitmapDrawable)context.getResources().getDrawable(R.drawable.summer); }else if(str_season.equals("봄")){ img_season =BitmapDrawable)context.getResources().getDrawable(R.drawable.spring); } return img_season; }
Map의 key, value를 사용하여 바꿔보는 것이었다.
살펴보니
img_season =BitmapDrawable)context.getResources().getDrawable(R.drawable.year13);
이 부분이 반복적이었다.
그리고 하나 새로운 사실을 알게 되었는데
R.drawable.year13
이 이미지 값이 int 형이었다는 것이다. 그냥 보고 String 인 줄 알았었다.
그래서 HashMap 선언시 <String, Integer>로 해주었다.
<13,R.drawable.year13>
이런 식으로 저장하기 위함이었다.
일단 값들을 HashMap에 넣어놓았다.
static HashMap<String, Integer> map = new HashMap<String, Integer>(); //HashMap 선언 public static HashMap getMap() { map.put("Special", R.drawable.special); map.put("봄", R.drawable.spring); map.put("여름", R.drawable.summer); map.put("가을", R.drawable.fall); map.put("겨울", R.drawable.winter); map.put("09", R.drawable.year09); map.put("10", R.drawable.year10); map.put("11", R.drawable.year11); map.put("12", R.drawable.year); map.put("13", R.drawable.year13); map.put("14", R.drawable.year14); map.put("15", R.drawable.year15); return map; }
그리고 이미지 세팅을 위한 코드
public static BitmapDrawable getSeasonBitmapDrawble(Context context, String str_season){ BitmapDrawable img_season = null; img_season = (BitmapDrawable)context.getResources().getDrawable(getMap().get(str_season)); return img_season; }
img_season = (BitmapDrawable)context.getResources().getDrawable(getMap().get(str_season));
getMap().get(str_season) 이 부분으로 Map에서 str_season로 들어온 key 값을 찾아 int 형 value 값을 불러오도록 하였다.
하지만 값이 몇백 몇천개로 늘어났을 경우
이렇게 바꾼다고 해서 전보다 깔끔하고 보기 편해지긴 했지만 성능적인 면에서 더 좋아지는 건지에 대한 의문이 들었다.
어차피 이미지 세팅 할 때마다 getMap()을 거쳐야 하기 때문이다.
좀 더 좋은 방법이 없을까 찾아보았는데
private static HashMap<String, Integer> map; public static HashMap getMap() { if (map == null) { map = new HashMap<String, Integer>(); map.put("Special", R.drawable.special); map.put("봄", R.drawable.spring); map.put("여름", R.drawable.summer); map.put("가을", R.drawable.fall); map.put("겨울", R.drawable.winter); map.put("09", R.drawable.year09); map.put("10", R.drawable.year10); map.put("11", R.drawable.year11); map.put("12", R.drawable.year); map.put("13", R.drawable.year13); map.put("14", R.drawable.year14); map.put("15", R.drawable.year15); } return map; }
이렇게 해주면 처음 값이 불릴 때 map이 null 이기 때문에 map.put 이 실행되고
다음에 다시 값이 불릴 때는 map에 값이 들어있기 때문에 if( map == null) 을 실행하지 않고 바로 map을 반환한다.
이렇게 되면 처음 한번만 실행되고 그 이후에는 갖다 쓰기만 하면 된다.
이런 방식을 싱글톤 방식?이 있다고 하는데 이것도 해당하는 건지 모르겟다.
그냥 이런 방법도 있구나 하고 알아볼 수 있는 시간이었다.