Learning
When: 1학년 7월 15일
How:
C#에 대해 알아가면서 내용의 수준이 조금만 높아져도 람다식이 나왔는데, 람다식에 대해 모르니까 답답해서 '빨리 공부해야지'라고 생각하고 있다가 시간이 생겨서 공부하게 되었습니다.
Understanding:
- 정의 : 람다식은 즉석 메서드입니다. 그게 무슨 소리인가 하면, 일단 메서드는 호출하면 자신이 만든 로직이 한번 돌아가는 '함수'라고 볼 수 있는데, 람다식은 메서드를 극도로 줄여서 함수의 이름이나 접근 제한자, 반환 형식, 매개 변수의 타입, 중괄호, return, 매개변수 등(상황에 따라 못 빼는 것도 있음) 메서드를 만들 때 꼭 들어가야 할 것들을 우리가 만들지 않아도, 주문서를 내밀듯 우리가 원하는 로직만 전달하면 나머지는 컴파일러가 메서드를 만들어줍니다. 그것을 미리 거의 완성된 카레를 만들어 놓고 우리가 조금의 일만 해도 카레가 완성되는 즉석 카레와 비슷하다고 생각하기 때문에 이 예시를 들었습니다. 근육도 피부도 없지만 잘 움직이는 스켈레톤 같기도 하네요. 스켈레톤은 언뜻 보기엔 움직일 수 없는 것처럼 보이지만, 사실은 누군가가 마력을 부여하여 움직일 수 있게 되었다는 설정도 꽤나 있는 편입니다.
- 코드 설명: 사실 람다식을 처음 보면 어안이 벙벙할 수 있지만, 구동 방식만 깨우친 다음 계속 보다 보면 적응이 되는 것 같아서 일단 한번 보여드리면서 어떻게 이게 가능한 것인지 설명을 한 다음, 어떻게 될 수 있을지에 대해 설명해 보겠습니다. 일단 짧게 요약해보자면 아래의 코드는 action라는 Action<string> 대리자 타입의 변수를 만든 다음, 그 변수에 인수를 출력하는 람다식을 연결시킨 코드입니다. (Action에 대하여 : https://hwanji203.tistory.com/88)
대리자에는 메서드만 들어갈 수 있는데, 저건((x) => Console.WriteLine(x);) 메서드가 아닙니다. 하지만 우리의 컴파일러는 감사하게도 저 람다식을 아래에 있는 메서드처럼 바꾸어서 대리자 변수에 연결시켜 줍니다. 즉 저 아래의 메서드와 위의 람다식 2개는 같은 것이죠.
Action<string> action;
action = (x) => Console.WriteLine(x);
action += Console.WriteLine;
action += WriteConsole; //이 3개의 코드가 전부 같은 역할을 합니다.
action("Hello"); //Hello 출력
void WriteConsole(string x)
{
Console.WriteLine(x);
}
- 작동 원리 : 람다식은 아까 말하긴 했지만 기본적인 모양이 (매개 변수) => 실행할 코드; 이런 식으로 되어 있습니다. 그런데 여기서 이상한 점은 컴파일러가 모든 것을 아는 것도 아닌데, 메서드를 만들기 위해서 기본적으로 있어야 할 것들도 없다는 것입니다. (매개 변수의 타입도 없고, 이름도 없고, 반환 타입도 쓰여있지 않습니다.) 하지만 잘 살펴보면 람다식 밖에서 그것들을 찾을 수 있다는 것을 알 수 있습니다.
다시 말하지만, 위의 코드에서 WriteConsole이나 (x) => Console.WriteLine(x)이나 완전히 똑같은 일을 하는데, 메서드와 비교해 보면 람다식에서 빠진 것은 void, string, { }(중괄호)라는 것을 알 수 있습니다. 그리고 이것들을 하나씩 보면 다 외부에서 명시를 이미 해주어서 유추가 가능한 키워드, 한 줄만 있다고 가정하면 굳이 필요 없는 중괄호로 이루어져 있는 것을 확인할 수 있습니다.- void는 이미 Action이 void기 때문에 당연히 람다식의 반환값도 void일 것이기 때문에 필요하지 않습니다.
- string도 이미 Action<string>으로 어떤 타입의 인수를 받을 것인지 명시가 되어 있기 때문에 필요 없습니다.
- { }(중괄호)는 if문을 생각하시면 되는데, 그냥 한 줄만 있을 때는 중괄호가 필요 없습니다. 중괄호가 없어도 한 줄만 있다면 컴파일러가 알아들을 수 있기 때문이죠.(아까 제가 람다식을 즉석 메서드에 비유했는데,
- 즉석 카레를 만들 때도 우리는 원하는 종류의 고기를 준비하지 않습니다. 그저 만들기 전에 살 때 닭다리 카레, 쇠고기 카레 등의 제품을 고르면서 미리 원하는 종류의 고기를 포함한 제품을 사서 그것을 즉석으로 대펴 먹을 뿐이죠. 당연히 즉석 카레가 요리된 카레보다 맛이나 양 등 여러 면에서 밀립니다. 여기서 중요한 점은 람다식은 대체 불가능한 문법이 아니라는 것입니다. 조금이라도 복잡한 로직은 그냥 메서드로 구현하면 되고, 람다식은 편하고 빠르고 심지어 맛도 나쁘지 않은 즉석 카레처럼 사용하면 되는 것입니다.
Result: 결론
'C#' 카테고리의 다른 글
| [C#] 람다식(3) (0) | 2025.07.17 |
|---|---|
| [C#] 람다식(2) (1) | 2025.07.16 |
| [C#] Action, Func (0) | 2025.07.14 |
| [C#] List (1) | 2025.07.13 |
| [C#] event 키워드 (1) | 2025.07.09 |