ITEM 40 :: EFFECTIVE C#
안녕하세요, 40번째 시간입니다.
이번 챕터는 지연 수행과 즉시 수행을 구분하라, 입니다. 예전에 봤던 단어가 또 나왔네요. 지연 수행과, 즉시 수행 아마도, 이 두 방식에 대한 장단점과 사용해야 할 때에 대해서 서술되었을 것 같네요.
설명
-
선언적 코드는 해설적이며 무슨 작업을 해야 하는지를 정의한다.
-
명령형 코드는 어떻게 작업을 수행해야하는지에 대한, 단계별로 세분화 되게 작성한다.
-
이 두 개발 방법 모두 흔히 사용하는 방법이지만, 이 둘을 섞어서 사용하는 경우 예기치 않은 결과가 발생할 수도 있다.
-
결과적으로 명령형 모델은 메서드를 호출하고 그 결과를 다른 메서드에 전달하지만, 선언적 모델은 메서드를 호출할 수 있는 델리게이트를 매개변수로 전달한다는 점에서 큰 차이가 있다.
-
데이터와 메서드의 차이는 데이터는 사용하기 전에 반드시 그 값이 확정돼야 하는 반면 메서드는 지연 평가가 가능하다는 점이다. 반드시 데이터의 값이 사전에 확정되어야 한다면, 함수형 접근 방식에 근거하여 메서드를 데이터로 대체하기 보다는 메서드를 미리 호출하여 그 결과값을 미리 얻어오는 방법을 사용해야 한다.
-
둘 중 어떤 방식을 사용하는 것이 좋을지는 함수의 본문내에서 부수효과가 발생할 가능성이 있는지와 함수의 반환값을 수정할 수 있는가 하는 점이다. 함수의 부수효과를 유발하는 경우 함수를 언제 호출하느냐에 따라 프로그램의 동작이 달라진다.
-
매개변수가 필요한 메서드를 지연 평가와 즉시 평가 어떤 방식으로 호출해도 그 결과가 동일하도록 보장하려면 매개변수를 변경 불가 타입으로 제한해야 한다.
-
어떤 방식을 사용하면 좋을지는 해당 메서드가 어떤일을 하느냐에 따라 갈린다. 따라서 어떤 수행 방식을 사용하는 것이 효과적인지를 평가할 때 흔히 이야기하는 몇가지 쟁점 사항이 존재한다. a. 첫 번째 쟁점은 입출력을 위해 사용하는 공간 비용과 출력을 만들기 위핸 계산 비용간의 관계이다. 즉, 이 예는 극단적인 예인데, 공간 비용과 계산 비용간의 적절한 타협점을 찾아 비용의 절감을 노리는 게 중요하다. b. 두 번째 쟁점은 메서드의 반환값을 어떻게 사용할 것인지에 대해서다. 일부 상황에서는 쿼리 표현식 을 즉시 수행하는 것이 합당한 경우도 있으니까. 하지만, 이 경우 다른 용도로 사용할 가능성이 거의 없는 중간 결과물이 생성되는 단점이 있다.(즉, 재사용할 수 없는 결과물이다.) 만약, 코드가 어떠한 부수효과도 유발하지 않아서 지연 수행이나 즉시 수행 어떤 식으로든 제약 없이 사용할 수 있다면 둘다 사용해보고 그 차이를 비교한 뒤 더 나은 결과를 보이는 방버을 선택하면 된다. c. 세 번째 쟁점은 이 두 가지 방법을 섞어서 (지연, 즉시 평가) 최상의 결과를 얻을 수 있는 경우에 대해서다.
결론
결론적으로 지연 수행과 즉시 수행 (평가) 를 사용할 때에 대한 구분을 아는 것이 중요하다. 이는 어떤 프로그램을 작성하더라도 어떤 방법을 사용하느냐에 따라 프로그램의 비용절감도 있을 수 있으며 더 효율적인 방법으로 개선할 수도 있기 때문이다. 어떤 때에 어떤 방법을 사용하는지에 대해 알 수 있도록 많은 경험이 필요할 것 같다.