액션: C#에서 제공하는 미리 사용하기 쉽게 만들어진 델리게이트.
람다 함수: 마치 오브젝트를 탄생시키듯 코드 도중에 이름이 없는 함수를 탄생시키고 마치 변수에 값을 넣어주듯 여기저기 줄 수 있음.
액션: 입력과 리턴값이 없는 형태의 함수를 대행하는 델리게이트를 작성할 일이 많으니까 처음부터 그러한 형태의 델리게이트를 C# 내부에 타입을 선언해놓음.
using Systyem을 추가하면 Work work; 를 Action work; 로 바꿀 수 있음
이 Action은 리턴값이 없고 입력값이 없는 델리게이트 타입임.
람다함수: 이름이 없는 함수를 즉석으로 만들어내는 것
man이라는 친구를 대상으로 하는 함수 + 실제 구현
man이라는 입력을 받아 그걸 어떻게 사용하는지 만듦. 함수이면서 오브젝트
화살표연산자는 입력이 들어와서 가리키는 쪽으로 간다고 보면 됨.
부르는 이름이 없다면 그 함수를 마치 오브젝트 혹은 값처럼 다른 변수들에게 던져놓을 수 있지 않을까?
이름이 없는 친구를 만들면 그게 미리 등록된 함수가 아니라 이리저리 전달하고 저장할 수 있는 값이 됨.
함수 이름 자체를 날려버리고 실시간으로 만들어낼 수 있는 값처럼 이름을 없애버리고 다룰 수 있다는 얘기.
오브젝트처럼 여기저기 주고받고 변수에 저장할 수가 있음.
바디 안에 한줄이 아니라 두줄 이상 들어갈 때는 중괄호로 표현할 수도 있음
C#에서 메서드는 람다 식으로 다시 표현될 수 있습니다.
특히 메서드가 한줄에서 두줄 정도의 문장으로 구성된 경우, 동일한 작업을 하는 코드를 매우 간결하게 표현할 수 있다는 장점이 있습니다.
다음과 같은 코드가 있다고 가정해 봅시다.
private int health = 0;
public void RestoreHealth(int amount) {
health += amount;
}
public bool IsDead() {
return (health <= 0);
}
위 코드에서 RestoreHealth() 메서드는 입력 받은 amount 값 만큼 체력 health를 증가시킵니다.
IsDead() 메서드는 체력 heath가 0보다 작거나 같다면, true를 반환합니다.
private int health = 0;
public void RestoreHealth(int amount) => health += amount;
public bool IsDead() => (health <= 0);
읽는 법
- RestoreHealth(int amount)는 health += amount 으로 대응된다
- IsDead()는 heath <= 0 으로 대응된다.
물론 표현 방법만 달라졌을뿐, 처리 방식은 100% 동일합니다.
변수처럼 동작하는 메서드인 프로퍼티도 람다 식으로 표현할 수 있습니다.
다음과 같은 프로퍼티가 존재한다고 가정해 봅시다.
private int health = 0;
public int Health {
get { return health; }
set { health = value; }
}
public bool IsDead {
get { return (health <= 0); }
}
프로퍼티 Health의 get, set 접근자는 위에 있는 int health 변수를 한번 감싸는 역할을 합니다. IsDead 프로퍼티는 체력이 0보다 작다면 true, 크다면 false를 반환합니다.
위 프로퍼티들을 다음과 같이 람다 식으로 다시 표현할 수 있습니다.
private int health = 0;
public int Health {
get => health;
set => health = value;
}
public bool IsDead => (health <= 0);
여기서 주목할 점은 IsDead 처럼 get만 존재하는 프로퍼티의 경우 극단적으로 짧게 같은 코드를 표현할 수 있다는 것입니다.
메서드나 프로퍼티를 람다 식으로 표현하는 것은 어디까지나 개인적인 선택입니다.
단, 다음 상황에서는 클린 코드를 구현하기 위해 람다 식을 적극 활용하는 것을 추천합니다.
- 한 두줄로 이루어진 메서드 또는 프로퍼티
- 특히 한줄로 이루어진 get 프로퍼티가 존재하는 경우
댓글