문 스타일(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();
}
}
함수형 관련 코드가 이해가 되지 않는다면 아래의 글을 참고해 보자.
함께 읽으면 좋은 글
'프로그래밍 > 함수형 프로그래밍' 카테고리의 다른 글
함수형 프로그래밍 관련 개념 정리 (0) | 2024.03.22 |
---|---|
재귀 vs 꼬리 재귀 (1) | 2024.03.15 |
C#으로 함수형 프로그래밍을 해보자 (0) | 2024.03.14 |
C# 함수형으로 구현한 팩토리얼 함수 (0) | 2024.03.04 |
부수 효과(Side Effect)와 참조 투명성(Referential Transparency)에 대해서 (0) | 2024.02.13 |
댓글