본문 바로가기
프로그래밍/함수형 프로그래밍

문 스타일(statement style) vs 식 스타일(expression style)

by bantomak 2024. 3. 4.

문 스타일(statement style)

결과를 도출하기보다 행위를 정의하는 것은 명령형 프로그래밍(Imperative Programming) 기법의 하나다.

즉, 컴퓨터에게 무엇을 해야 할지 이야기하는 방식으로 소스 코드를 이 관점에서 설명해 보면, 컴퓨터에게 value 값과 0을 비교한 다음 posOrNeg 변수에 값을 할당하라고 지시하고 있다.

 

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine($"Sign of -15 is {GetSign(-15)}");
    }

    static string GetSign(int value)
    {
        string posOrNeg;

        if (value > 0)
        {
            posOrNeg = "positive";
        }
        else
        {
            posOrNeg = "negative";
        }

        return posOrNeg;
    }
 }

 

 

이 함수를 이제 함수형 접근 방식에 맞게 바꾸려면 식 스타일(expression style)로 수정해 볼 수 있다. C#에서 제공하는 삼항 조건 연산자를 이용해 보자.

 

식 스타일(expression style)

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine($"Sign of -15 is {GetSign(-15)}");
    }

    static string GetSign(int value)
    {
        return (value > 0) ? "posivie" : "negative";
    }
}

 

행위를 기술하기보다 결과를 묘사하는 것은 선언형 프로그래밍(Declarative Programming) 기법의 하나다.

똑같이 동작하지만 명령형 예제 코드에 비해 훨씬 간략하다. 게다가 사전에 변수를 준비하는 과정 없이 문자열 값을 반환하기 때문에 부작용(side effect)도 없다. 반면, 문 스타일에서는 posOrNeg 변수에 두 번의 할당이 필요했다. (식 스타일에서는 변수 선언 자체가 불가능하다.)

 

  • 결과를 어떻게 얻을 것인지를 지시하는 명령형 프로그래밍 (HOW  접근 방식)
  • 결과로 원하는 것이 무엇인지를 기술하는 선언형 프로그래밍 (WHAT 접급 방식)

 

N번째 요소를 찾는 코드

명령형과 선언형의 차이를 알 수 있는 예제를 작성해 보았다.

 

class Program
{
    static void Main(string[] args)
    {
        List<int> ints = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };

        var r1 = NthImperative(ints, 3);
        var r2 = NthFunctional(ints, 3);

        Console.Write("Imperative result :");

        foreach (int i in r1)
        {
            Console.Write(i + " ");
        }

        Console.WriteLine();

        Console.Write("Functional result :");

        foreach (int i in r2)
        {
            Console.Write(i + " ");
        }
    }

    static List<int> NthImperative(List<int> list, int n)
    {
        List<int> result = new List<int>();

        for (int i = 0; i < list.Count; i++)
        {
            if (i % n == 0)
            {
                result.Add(i);
            }
        }

        return result;
    }

    static List<int> NthFunctional(List<int> list, int n)
    {
        return list.Where((x, i) => i % n == 0).ToList();
    }
}

 

함수형 관련 코드가 이해가 되지 않는다면 아래의 글을 참고해 보자.

 

함께 읽으면 좋은 글

 

C# 람다(Lambda)에 대해서

람다(Lambda)란? 람다는 무명 메서드(annoymous method)와 비슷하게 무명 함수를 정의하기 위해서 사용된다. 람다는 두 가지 형태 중 하나의 형태를 가진다. 람다식 (Lambda Expression) (parameters) => expression //

jettstream.tistory.com

댓글