지식메모/안드로이드 Android

안드로이드 HashMap 을 이용한 이미지 세팅하기.

yonoo 2015. 6. 28. 16:09
반응형





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을 반환한다.


이렇게 되면 처음 한번만 실행되고 그 이후에는 갖다 쓰기만 하면 된다.


이런 방식을 싱글톤 방식?이 있다고 하는데 이것도 해당하는 건지 모르겟다.


그냥 이런 방법도 있구나 하고 알아볼 수 있는 시간이었다.




반응형