본문 바로가기
C#

액션 + 람다 함수

by imagineer_jinny 2021. 7. 21.

액션: 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 프로퍼티가 존재하는 경우

'C#' 카테고리의 다른 글

레이캐스트(Raycast)  (0) 2021.07.23
제네릭  (0) 2021.07.21
이벤트  (0) 2021.07.21
델리게이트  (0) 2021.07.20
유니티 이벤트  (0) 2021.07.20

댓글