Learning
When: 1학년 7월 16일
How:
람다식에 대해 쓰다 보니 분량도 너무 많아지고 시간도 너무 많이 들어서 2개로 나눠 올리게 되었습니다.
Understanding:
- 람다식은 왜 이름이 없을까? :
람다식은 () => (로직) 이런 식으로 이루어져 있는데, 여기엔 이 코드를 뜻하는 이름이 없습니다. 즉 외부에서 이 람다식을 사용할 방법이 없는 것이죠. 왜 람다식은 이름이 없어도 사용할 수 있을까요? 그 이유는 람다식의 특징과 목적을 생각해 보면 알 수 있습니다. 람다식의 특징에는 짧은 코드로 만들 수 있다, 간단한 로직을 구현할 때 사용된다 등 쉽고 간단하게 '코드를 줄이는 것'에 초점이 맞춰져 있습니다. 그리고 람다식이 이러한 특징을 갖는 이유는 최종적으로 메서드의 인수나 대리자 변수에 따로 메서드를 만들지 않고도 한 줄만으로 로직을 만들어서 넣을 수 있게 하기 위함입니다. 그리고 무언가에 이름은 붙이는 행위는 프로그래밍에선 따로 만든 무언가를 나중에 사용할 수 있게 하기 위함인데, 람다식과 거의 완전히 반대된다고 볼 수 있습니다. - 람다식은 어떻게 쓸까? :
지금까지 람다식에 대한 설명만 하고 코드를 어떻게 짜야하는지 자세한 설명을 하지 않았는데, 제가 머리가 나빠서 그런 것일지도 모르지만, 람다식을 봐도 이런 기본적인 지식이 없으면 머릿속에서 '이게 어떻게 되는거지?' '이러면 어떻게 되지?' 이런 의문이 계속 들었기 때문에 코드를 짜는 설명은 조금씩만 하고, 나중에 한 번에 자세히 설명하려고 계획했었습니다.
참고로 람다식은 기본적으로 (인수) => 식; 이런 구조로 되어 있다는 것은 알아 두셔야 합니다. 사실 다양한 람다식이 있긴 하지만, 구조에 큰 변화가 있지는 않고, { }(중괄호)를 넣어 여러줄을 쓸 때는 return을 생략할 수 없는 등 작은 변화들이기 때문에 (인수) 부분과 (식) 부분에 여러 변경 가능한 부분들을 설명해보겠습니다. 아래에 예시 코드가 있습니다. - (인수) 부분
- 람다식의 인수는 타입을 생략할 수 있습니다. 왜냐하면 람다식은 이미 틀이 다 잡혀있는 대리자 형식에서 사용할 메서드만 만드는 것이기 때문에 Action<string> 처럼 "string 형식의 인수를 받아서 아무 값도 반환하지 않는" 메서드만 들어갈 수 있는 대리자 변수에는 그냥 (x) 를 인수로 설정해도 컴파일러가 "string 밖에 못 받으니까 string이겠구만" 이런 식으로 유추할 수 있기 때문입니다. 하지만 예외도 있습니다.
- var lambda = x => x * x; 이 코드에선 lambda가 어떤 타입인지 알 수 없기 때문에 (int x)이렇게 타입을 명시해주어야 합니다.
- 2개 이상의 인수를 사용할 때, 하나의 인수에만 타입을 명시해주면 안 됩니다. (int x, y) 이렇게 하면 유추가 안되진 않지만 가독성 부분에서 상당히 떨어지기 때문에 막은 것이라고 생각하고 있습니다.
- 2개 이상의 인수를 사용할 때는 ( )괄호가 있어야 합니다. x => x; 이건 되지만 x, y => x * y; 이렇게 하면 안 되고 (x, y) 이런 식으로 묶어주어야 합니다.
- (식) 부분
- 람다식의 식 부분도 { }(중괄호)의 유무, return의 유무 등 람다식을 만들 때 알아두어야 할 규칙이 있습니다. 인수 부분에서 말했지만 "어 이거 명시 안 했는데 왜 컴파일 오류가 안 나지" 하는 부분은 컴파일러님께서 다 유추했기 때문에 오류가 나지 않은 것입니다. 람다식은 대리자에 쓰이는데 (메서드의 인수로 쓰는 것도 대리자입니다! 대리자 변수 대신에 괄호 안에서 람다식을 즉석으로 만들 수 있어 대리자를 따로 만들지 않아 햇갈릴 수 있습니다.) 대리자에는 여러 정보들이 있으니까요.
- { }(중괄호)와 return은 짝꿍입니다. 중괄호를 넣을 때는 return을 꼭 넣어야 하고, 중괄호가 없을 때는 return도 없습니다. 중괄호도 마찬가지로 return이 있을 때만 사용할 수 있습니다. (반환 값이 있을 때 입니다. 반환 값이 없을 때는 당연히 return이 필요 없습니다.)
- 람다식에 하나의 문을 사용할 때는 상관없지만, 2개 이상의 문을 사용할 때는 중괄호가 있어야 하고, 중괄호가 있다면 return도 같이 필요하게 됩니다. x *= x; return x > 10; 여기서 세미콜론(;)이 2개죠? 이건 문이 2개인 것이기 때문에 중괄호가 있어야 하고, 반환 값이 있다면 return도 있어야 합니다.
- 참고로 "줄일 수 있는 것은 무조건 줄여라!" 이것이 아니라 가독성을 위해 형식이나 return 등을 사용할 수도 있으니 그것도 생각하시면서 코드를 짜시면 좋을 것 같습니다.
Action<string> action;
action = x => Console.WriteLine(x);
action += Console.WriteLine;
action += WriteConsole; //이 3개의 코드가 전부 같은 역할을 합니다.
void WriteConsole(string x)
{
Console.WriteLine(x);
}
Func<int, int, int> func;
func = (x, y) => x * y;
func = (x, y) => { return x * y; };
List<int> ints = new List<int>();
ints.Find(x => x > 10);
Result: 람다식은 더욱 코드를 줄이고 편하게 쓸 수 있게 return이나 인수의 형식 등을 뺄 수 있게 해 주었는데, 그냥 전부 선언해도 오류가 나진 않겠지만 쓸데없이 코드를 늘리는 것은 가독성에도 좋지 않으니 람다식을 사용할 때의 규칙에 대해 알아보면 더욱 좋은 코드를 짤 수 있어 좋은 것 같습니다.
'C#' 카테고리의 다른 글
| [C#] in 키워드 (0) | 2025.07.18 |
|---|---|
| [C#] 람다식(3) (0) | 2025.07.17 |
| [C#] 람다식(1) (2) | 2025.07.15 |
| [C#] Action, Func (0) | 2025.07.14 |
| [C#] List (1) | 2025.07.13 |