본문 바로가기

생각/넋두리

그냥 돌아가는 코드

최근에 generic 을 사용하는 유틸성 코드를 작성할 일이 있었습니다.

메소드에 어떠한 타입의 객체이든 인자로 받아야했으며 return type은

그 타입의 객체들이 n개 담겨있는 list 타입이어야했죠.


처음에는


public List getList(Class classType){

  List list = some(classType);

  return list;

}


이렇게 코드를 작성하였죠.

(some 메소드는 단순히 Class type을 받아서 리플렉션을 사용하여 객체생성후 list에 담아 return하는 코드입니다.

List some(classType){ // some logic }

위처럼 구현되어있죠.)


그러다 고민된게 getList 메소드에서는 class type이 명확하고 List에 담겨지는 객체들은

그 class type의 객체들인데 왜 최상위 클래스타입으로 정의해야하는가 고민이 되었죠.

코드는 잘 돌아갑니다.

그런데 이게 맞는건지 의문이 생겼죠.

그러다 제가 좋아하는 wild card로 타입을 정의 하였죠. (? <-- 요고)


그런데 이 또한 고민이 되는게 wild card를 작성하는 건

Collection 자료구조 객체의 data를 get할 때에 보다 타입안전성에 주의하고자 하며

동시에 어떠한 객체든 받기 위해 나온건데.... 라는 생각이 들더군요.


그래서 다시 타입 T를 생각하게 되었습니다.

제네릭 메소드란 개념으로 소개가 되어있습니다.

http://docs.oracle.com/javase/tutorial/extra/generics/methods.html

(headfirst java에서도 소개가 되었던거같은데 책이 옆에 없어서 확인이 안되네요 아 답답 ㅠ)


이전에 Object는 뭔가 좀 그랬고...

와일드카드는 여기에 쓸만한게 아닌 문법같고...

제네릭 메소드를 쓰니 코드가 무척 깔끔해 보여지고 뭔가 아 이게 맞는거다란 생각이 드네요.


public <T> List<T> getList(Class<T> classType){}


저만 느끼나요?


이전엔 그냥 돌아가는 코드였습니다. 어찌 되었거나 기능은 돌아갔죠.

그런데 어떠한 언어든 문법은 존재하고 그 문법이 존재하는 이유는 문법과 함께 존재합니다.

이전 코드들을 살펴보다보면 돌아가는 코드이지만 억지로 작성한 코드가 꽤 있습니다.

내가 아는 건 그 뿐이니깐 이란 자기위안으로 넘어간 코드들.


git같은 참조할만한 좋은 코드가 넘치는 세상에서 위같은 자기위안은 그만 둬야겠네요.

잠을 좀 설친 금요일 오전, 코드 하나로 여러 생각을 하는 불금의 오전이네요.