개발공부/C#

[Effective C#] 아이템 31 : 시퀀스에 사용할 수 있는 조합 가능한 API를 작성해라

개발자 찐빵이 2021. 12. 7. 22:11
728x90

반복 구문이 필요한 경우

반복 구문이 필요한 경우는 대부분 여러 요소로 구성된 시퀀스를 처리하는 알고리즘을 작성하기 위한 경우이다.
이를 위해 foreach, for, while 등이 사용된다.

반복문의 효율성

반복문으로 컬렉션을 받아와서 요소를 살펴보는 경우, 효율성에 문제가 있다.
대부분 전체 컬렉션을 대상으로 여러 단계의 작업을 거친 후 원하는 결과를 얻을 수 있기 때문이다.

단계마다 전체 컬렉션을 순회해야 하기 때문에 수행 시간이 길어질 수밖에 없다.

대안

개별 요소에 대해 수행해야하는 모든 작업을 분리된 메서드로 작성한 후 루프 내에서 메서드를 호출할 수 있다.

장점

  • 컬렉션을 한 번만 순회하면 되므로 성능이 개선된다.
  • 중간 결과물을 저장하기 위한 컬렉션을 사용할 필요가 없기 때문에 메모리도 적게 사용한다.

단점

  • 메서드의 재사용 가능성이 낮아진다.

이터레이터 메서드

단일의 시퀀스를 입력으로 취하고 결과로 단일의 시퀀스를 반환하는 메서드.
이 메서드를 작성할 때 yield return을 사용하면 메서드 내에서 시퀀스 내의 개별 요소를 저장하기 위해 별도의 저장소를 마련할 필요가 없다.

정확히 값이 필요한 시점에 입력 시퀀스 상에서 다음 요소를 가져오고, 출력 결과가 반드시 필요한 시점에 출력 시퀀스로 결과를 내보내기 때문이다.

매개변수 타입과 반환 타입을 IEnumerable로 정의하는 방식

장점

  • 다양한 방식으로 조합하여 사용할 수 있는 알고리즘의 재사용성이 좋아진다.
  • 전체 시퀀스를 한 번만 순회하면 되므로 런타임 효율이 개선된다.
  • 각 메서드가 구현하고 있는 알고리즘 조합 가능성도 높아진다.

yield return 문 동작 방법

값을 반환한 후 내부적으로 사용하는 이터레이터의 현재 위치와 상태 정보를 저장한다.
전체 시퀀스에 대해 수행해야 할 메서드는 입력과 출력이 모두 이터레이터이다.
순회 과정은 내부적으로 입력 시퀀스의 현재 위치를 계속 갱신하면서 출력 시퀀스에 차례로 결과를 반환한다.

반응형