본문 바로가기
C#/Effective C#

[Effective C#] Item 31 시퀀스에 사용할 수 있는 조합 가능한 API를 작성하라.

by 코모's 2022. 11. 7.
반응형

반복 구문이 필요한 경우 주로 foreach, for, while 등이 주로 많이 사용된다. 일반적으로 반복 구문을 포함하는 메서드를 작성할때 매개변수로 컬렉션을 받아와서 컬렉션에 포함된 요소를 살펴보거나, 내용을 수정하거나, 혹은 그중 일부만 필터링해서 또 다른 컬렉션에 그 결과를 저장한 후 반환하는 식의 코드를 작성하게 된다.

 

이와같은 작업은 효율성에 문제가 있다. 

전체 컬렉션을 대상으로 하나의 작업만을 수행하는 경우는 거의 없다.

최초 원본 컬렉션에 대해 다양한 작업을 여러 단계에 걸쳐 수행하는 경우가 대부분이다.

여러 단계를 거치는 동안 중간 결과를 저장하기 위해서 추가적으로 컬렉션(아마도 매우 큰)이 필요한 수 도 있다.

첫번째 작업을 전체 컬렉션이 모두 완료하기 전까지 두번째 작업을 시작할 수 없다. 

 

대안으로 개별 요소에 대해 수행할 모든 작업을 메서드로 분리한 후 루프 내에서 호출하는 방법이 있을 수 있다.

이렇게하면 성능이 개선되고 메모리도 적게 사용되지만 메서드의 재사용 가능성이 낮아진다.

 

이터레이터는 결과가 필요한 시점에 맞춰 메서드가 수행되도록 할 수 있다.

이터레이터 메서드는 단일 시퀀스(IEnumerable <T> 로 표현되는)를 입력으로 취하고 결과도 단일 시퀀스를 반환하는 메서드를 말하는데, 이러한 메서드를 작성할 때 yield reutnr을 사용하면 개별 요소를 저장하기 위한 저장소를 마련할 필요가 없다. 왜냐면 정확히 값이 필요한 시점에 입력 시권스 상에서 다음요소를 가져오고, 출력 결과가 필요한 시점에 출력 시퀀스를 결과로 내보내기 때문이다.

 

이와같이 정의하면 상당히 많은 이점이 있다.

다양한방식으로 조합하여 사용할 수 있는 아록리즘 빌딩 블록이 만들어 지므로 재사용정이 좋다.

이렇게 작성된 여러 메서드를 하나로 조합하면 전체 시퀀스르 한번만 순회하면서 런타임 효율이 개선된다.

지연 수행 모델 덕분에 반드시 필요한 추가 저장소를 사용하지 않을 수 있으며, 각 메서드가 구현하고 있는 알고리즘의 조합 가능성도 높아진다.

제네릭 메서드로 변경하기에도 용이하여 재사용성이 더욱 좋아진다.

반응형