ArrayAdapter의 인자값은 객체 배열이 아닌 Collection 으로 던져주자!

안드로이드에서 Adapter중 가장많이 쓰는 ArrayAdapter는 객체배열이 아닌 Collection이 구현이 된 객체를 인자값으로 던져주는게 훨씬 컨트롤 하기 편합니다. 이게 무슨말이냐 하면 일단 이유를 들기위해 오늘 제가 코딩을 해야할 부분에 대해서 코딩으로 설명을 해보겠습니다. 

상황 : ArrayAdapter에 문자열이 저장이된 String[]배열을 인자값으로 던져주고 동적으로 그 배열값을 수정 및 추가를 해야되는 작업입니다. 

위의 상황을 객체배열과 Collection 구현이된 List 인터페이스가 구현이된 객체로 두가지 코딩을 한번 해보겠습니다. 

1. 객체배열코딩법
1 final String[] items = new String[] { "A" "B" "C" };
2 ArrayAdapter<string> adapter = new ArrayAdapter<string>( this , android.R.layout.simple_list_item_1 , items);
3 adapter.add("D");
4 </string></string>

2. List 코딩법 
1 final List<string> items = new ArrayList<string>();
2 items.add("A");
3 items.add("B");
4 items.add("C");
5 ArrayAdapter<string> adapter = new ArrayAdapter<string>( this , android.R.layout.simple_list_item_1 , items);
6 adapter.add("D");
7 </string></string></string></string>

위의 코딩법이 언뜻보면 똑같은 코딩이라 똑같은 결과가 나올것이라고 생각되는데 막상 컴파일을 해보면 2번코딩법은 정상적으로 동작을 하는데 비해 1번코딩법은 에러가 발생합니다. 도대체 무슨이유지 하는 고민에 빠져서 ArrayAdapter의 소스를 분석해나갔습니다. 

3. 소스 분석 및 결론

소스를 분석도중 ArrayAdapter의 인자값으로 객체배열로 던졋을시는 Arrays.asList를 이용하여 처리를 해주고 있습니다. 하지만 Arrays.asList는 객체배열을 Collection으로 변경시켜주는 메소드인데 안될이유가 없는데 ? 하고 생각을 했지만 여기서 웹서핑중 중요한 사실을 하나 알게됩니다. Arrays.asList로 리턴해주는 객체는 변경이 불가능 하다는 점입니다. 
또 여기서 궁금증이 도지게 됬습니다. 그래서 또 Arrays클래스에 asList메소드의 구현부분을 찾아가게됬는데 일반적으로 ArrayList를 인스턴스화 후 리턴하게 코딩이 되어있습니다. 그런데 자세히 보니 ArrayList가 java.util.ArrayList가 아닌 Arrays객체 안에 있는 static 키워드로 구성이된 내부클래스 였습니다. 그 내부 클래스를 보니 ArrayList객체상태가 변경이 되는 메소드는 모두 구현이 안되어있습니다. 이러한 설계이유는 지금의 저의 레벨에서는 전혀 짐작이 가지 않습니다. 하지만 이것만 게속 분석하면 정확한 답은 아니더라도 분명 어느정도의 예상을 하게되지만 지금의 시기에서는 비효율적인거 같습니다. 지금은 객체의 내부보다는 올바른사용법을 익히는것이 더 중요하다고 생각합니다. (시간을 많이 투자하면 그만큼의 결과가 나오기마련이지만 객체의 갯수는 상상을 초월하고 그 이해력의 수준은 너무 낮다고 생각합니다. 객체를 분석도 좋지만 그것외에 공부해야하는것이 너무나도 많기때문입니다.)
나중에 내공이 많이 쌓이면 다시 한번 봐야되겠습니

+ Recent posts