ITEM 29 :: EFFECTIVE C#


안녕하세요, 29번째 시간입니다. 새로운 챕터 LINQ의 시작입니다.


이번 챕터는 컬렉션을 반환하기보다 반복자(Iterator) 를 반환하는 것이 낫다, 입니다. LINQ라고 하는 C#만의 기능 하나가 또 나왔네요. 이는 실무에서도 자주 사용되고, 그 사용법도 그리 어렵지 않아 사람들이 자주쓰는 기능 중 하나라, 시간이 난다면 꼭 익혀보길 바랍니다. 아래의 내용은 LINQ의 기본적인 기능이 아니라, 개념적인 팁에 가깝다는 것을 알아주셨으면 합니다.

설명

  1. LINQ 란 : C# 3.0에 추가된 기능이며, 데이터에 질의한다는 의미의 기능이며, 다양한 데이터 저장소에 대해 쿼리(SQL과 비슷하다)를 수행하고, 그에 대한 통합 구문을 제공한다.

  2. 메서드를 작성하다보면 단일의 객체를 반환하기보다 일련의 시퀀스를 반환해야 하는 경우가 종종있다. 이런 경우에는 시퀀스를 반환하는 메서드를 작성해야한다면, 컬렉션을 반환하기보다는 반복자를 반환하는 것이 좋다. 이를 통해 다양한 작업을 좀 더 수월하게 할 수 있다.

  3. 반복자 메서드가 호출되면 컴파일러가 생성한 객체가 인스턴스화 된다. 이 후 시퀀스 내에 포함된 항목을 요청할 때 시퀀스가 생성되게 된다. (여기서 시퀀스란 IEnumerable 인터페이스 또는 IQueryable 인터페이스를 구현하는 형식의 개체를 의미한다)

  4. 반복자 메서드는 시퀀스를 생성하는 방법을 알고 있는 객체를 생성하고, 그 객체는 실제 시퀀스에 대한 접근이 이루어지는 경우에만 사용된다는 것이다.

  5. 시퀀스는 첫 번째 요소가 요청될 때까지 매개변수의 값이 유효한지 확인하는 코드가 수행되지 않는다. 따라서, 이를 방지하기 위해서는 인자에 대한 유효성 검사를 수행하는 부분과 실제로 시퀀스를 생성하는 부분을 분리해야 한다.

  6. 결론적으로 반복자 메서드를 작성할 때, 여러 변수에 대해서 대응하기 어려우므로, Ienumerable와 같은 인터페이스를 반환하도록 메서드를 작성하는 편이 편리하다고 한다. 이는 필요할 때마다 항목을 생성할 수도 있고, ToList()나, ToArray()를 이용하여 전체 시퀀스가 저장된 컬렉션을 생성할 수도 있기 때문이다.

결론

사실 LINQ를 자주 사용하지는 않아 이에 대한 정확한 이해는 조금 어려운 부분이 있다. 다만, 몇 개 추려보자면 아래와 같다.

  1. 챕터의 제목대로, 시퀀스를 반환하는 메서드를 작성할 때 컬렉션 자체를 반환하기보다는 그 컬렉션에 접근할 수 있는 반복자를 반환하는 것이 좋다.

  2. 반복자 메서드를 사용함으로써, 시퀀스를 생성하는 방법을 알고 있는 객체를 생성하고, 이 객체는 실제 시퀀스에 대한 접근이 이루어지는 경우에만 사용되므로 오용 방지가 가능하다. 또한 내부적으로 효율도 좋을 것으로 보인다.(컬렉션 자체를 반환하게되면 그만큼의 메모리를 잡아먹기 때문이다.)

  3. IEnumerable 혹은 IQueryable 인터페이스를 반환하게 메서드를 작성하면 좋다. 이는 필요할 때마다 단일적인 항목을 생성할 수도 있고, ToList(),나 ToArray()를 이용하여 전체 시퀀스가 저장된 컬렉션을 생성할 수도 있기 때문이다.