'Generics'에 해당되는 글 1건

  1. 2009/03/05 .NET2.0 에서 Generics 이란? (2)

Generics 이란?

JAVA를 주로 사용했던 이유로 범용 메소드를 만들 때면 object로 저장 하는 방법을 많이 이용했다. 이렇게 하면 데이터 타입에 연연하지 않고 파라메터로 넘길 수 있기 때문이다. 물론 동일한 이름의 메소드를 만들 때 파라메터에 의해 결정되는 오버로딩 방법도 있지만 단순히 범용 메소드를 만들 때면 object를 보내는 방법을 선호 했다.

지금까지 object는 가장 상위에 있기 때문에 모든 개체를 받을 수 있고 활용할 수 있기 때문에 편리하다고만 생각 했지 이를 사용함으로써 발생되는 문제는 생각해보지 않았다. 특히 C++의 템플릿방식이 더 귀찮다고 생각 했는데 C#을 배우면서 C++의 템플릿 방법에 대해 다시 한번 생각 해보게 되었고 그 이유로 이 글을 작성한다.

참고로 JAVA에도 Generics라는 기능이 있다. 다만 1.5버전 부터 추가된 기능으로 1.3부터 자바를 써왔던 나는 Generics라는 기능에 대해 깊이 고민해 본적이 없다. 어찌 되었든 C#에서도 Generics라는 기능이 추가 되었고 이 부분은 한번쯤 짚고 넘어 가는게 좋을듯 하다.

우선 C# 2.0에서 가장 기대 되는 기능 중 하나가 Generics라고 한다. JAVA에 저 Generics라는 기능이 나왔을때 말이 많았는 C#에서 조차 이 기능이 추가된걸 보면 C++의 템플릿 기능이 프로그래밍에 여러모로 도움이 되나 보다.

Generics를 사용하는 이유?

MSDN에 따르면, generics를 사용하면 실제 데이터 형식을 커밋 하지 않고도 형식이 안전한 데이터 구조를 정의할 수 있고, 형식별 코드를 복제하지 않고도 데이터 처리 알고리즘을 다시 사용할 수 있기 때문에 성능이 크게 향상되고 코드의 품질이 높아진다고 한다. 개념적으로 generics는 C++ 템플릿과 비슷하지만 구현 및 성능 면에서는 크게 다르다고 하는데 그 부분에 대해서는 설명할 부분이 너무 많아 지기 때문에 여기서는 설명 하지 않도록 하겠다.

자 그렇다면 여기서 말하는 중복을 피하고 성능이 올라가고 코드의 품질이 올라간다는 말은 무엇일까? C++을 해봤다면 알겠지만 템플릿은 꽤나 유용하다. 무형의 데이터 타입을 정의하고 컴파일 할 때 구현되도록 함으로써 소스코드의 중복을 피하고 코드 품질이 좋아진다고 볼 수 있다. 하지만 여기서 말하는 성능이란 무엇일까? 사실 나는 object로 처리 하는 게 낫다고 생각 했는데 MSDN을 보니 여기도 문제가 있는 것 같다.

우선 기본적으로 개체 기반 솔루션에는 두 가지 문제가 있다고 한다. 첫 번째는 성능이다. 값 형식을 지정하지 않고 object로 처리 할 경구 힙의 부담이 늘어나고 성능에 좋지 않은 영향을 주는 가비지컬렉터의 증가로 이루어진다는 것이다. 또한 값 형식 대신 참조 형식을 사용하는 경우에도 개체에서 상호 작용하고 있는 실제 형식으로 캐스팅해야 하고 캐스팅에 따른 추가 작업이 필요하므로 성능이 저하 된다고 한다.

나는 지금까지 JAVA의 가비지컬렉터를 너무 맹신했는지 모르겠다. 물론 지금까지 해왔던 모든 코딩을 하나로 합친다고 하더라도 큰 무리는 없겠지만 앞으로는 이런 부분까지 고려 해야 할 듯 하다.

참고로 잘 이해가 되지 않는 분들은 DB의 TABLE을 설계 할 때 각각의 타입을 정하고 그 크기까지 정확하게 맞춰서 생성하는 것과 같은 맥락이라고 보면 쉽게 이해 될 것이다.
(사실 TABLE 설계도 숫자랑 문자랑 구분 짓고 그냥 냅다 255자까지 들어 가게 해버린 나를 생각 하면 object를 쓰면서 힙을 생각 한다는 게 더 이상했는지도 모르겠다.)




사실 이런 부분을 피하기 위해 각각의 메서드를 만들어 구현할 수 있지만 이렇게 될 때 중복되는 코드가 많아진다는 것이다. C++을 제대로 공부 해봤다면 C#의 generics을 바로 이해 했겠지만, 이제 서야 generics의 기능을 알게 되었다.


C# Generics
참고: http://msdn.microsoft.com/ko-kr/library/ms379564(VS.80).aspx

사실 제 글을 보는 것 보다 MSDN을 보는 게 훨씬 나을 듯 합니다. 글 재주도 없고 본래 있는 글을 다시 풀어서 설명하다 보니 누락 되거나 잘못 언급 된 곳도 있으리라 생각합니다.
어찌 되었든 C#의 generics 기능을 사용하여 구조체를 만들어 자신만의 타입을 사용할 때는 꽤나 강력한 기능이 될 것 같습니다. 거기다 LINQ를 통한 프로그래밍 자체의 SQL문을 사용할 수 있으니 배열 처리시 정렬 등에 굉장히 효과가 있을 듯 합니다.
Java Generics
참고: http://today.java.net/pub/a/today/2003/12/02/explorations.html

Posted by Jake Kim
TAG ,