내일배움캠프

내일배움캠프21: 람다식과 Func을 활용한 효율적인 코드 작성법

pracumj 2024. 10. 14. 21:42

오늘 공부한 내용📝

오늘은 람다식과 func을 활용하는 방법을 배웠다. 람다식과 func을 사용하면 특정 상황에서 유연하고 가독성 좋은 코드를 작성할 수 있다는 점을 알고 해당 내용을 가정을 통해 정리해봤다.

 특정 타입의 몬스터를 찾으려면?

enum SpartaMobType
{
    Sparta,
    TanTan,
    Nbcamp
}

enum Grade
{
    Normal,
    Uncommon,
    Epic
}

class SpartaMob
{
    public SpartaMobType SpartaMobType;
    public Grade Grade;

    public SpartaMob(SpartaMobType spartaMobType, Grade grade)
    {
        SpartaMobType = spartaMobType;
        Grade = grade;
    }
}

class Program
{
    static List<SpartaMob> spartaMobs = new List<SpartaMob>();

    static void Main(string[] args)
    {
        spartaMobs.Add(new SpartaMob(SpartaMobType.TanTan, Grade.Epic));
        spartaMobs.Add(new SpartaMob(SpartaMobType.Sparta, Grade.Uncommon));
        spartaMobs.Add(new SpartaMob(SpartaMobType.Nbcamp, Grade.Normal));
    }
}
 

위와 같은 코드에서 특정한 조건(예: Grade가 Epic인 Mob)을 만족하는 몬스터를 찾아내고 싶다고 가정해보자. 


1. 조건에 따른 메서드 작성

가장 먼저 특정 조건에 맞는 몬스터를 찾기 위해 조건마다 메서드를 따로 작성할 수 있을 것이다.
예를 들어, Epic 등급의 Mob을 찾는 메서드는 아래와 같이 작성할 수 있다.

static SpartaMob FindEpicMob()
{
    foreach (var mob in spartaMobs)
    {
        if (mob.Grade == Grade.Epic)
        {
            return mob;
        }
    }
    return null;
}

 

어렵지 않게 구현할 수 있지만, 다른 조건을 처리하려면 추가적인 메서드가 필요할 것이다. 조건이 많아지면 많아질 수록 

필요한 메서드를 점점 늘게 되고 코드의양이 감당할 수 없을 정도로 많아 질 것이다. 


2. 델리게이트와 메서드 사용

이를 개선하기 위해 델리게이트를 사용하면, 조건을 메서드 외부에서 전달하여 유연하게 처리할 수 있게된다. 

 

사용 방법

  1. 델리게이트 선언: SpartaMob을 받아 bool을 반환하는 델리게이트를 선언
  2. FindSpartaMob 메서드: 델리게이트를 인자로 받아, 해당 조건에 맞는 Mob을 반환
// 델리게이트 선언
delegate bool SpartaMobSelector(SpartaMob mob);

//조건을 검사하기 위한 메서드들
static bool IsEpicMob(SpartaMob mob)
{
    return mob.Grade == Grade.Epic;
}

static bool IsNormalMob(SpartaMob mob)
{
    return mob.Grade == Grade.Normal;
}


// 델리게이트를 활용한 Mob 찾기
static SpartaMob FindSpartaMob(SpartaMobSelector selector)
{
    foreach (var mob in spartaMobs)
    {
        if (selector(mob))
        {
            return mob;
        }
    }
    return null;
}


//사용 예시
static void Main(string[] args)
{
    spartaMobs.Add(new SpartaMob(SpartaMobType.TanTan, Grade.Epic));
    spartaMobs.Add(new SpartaMob(SpartaMobType.Sparta, Grade.Uncommon));
    spartaMobs.Add(new SpartaMob(SpartaMobType.Nbcamp, Grade.Normal));

    // Epic 등급의 Mob을 찾는 메서드를 델리게이트로 전달
    SpartaMob epicMob = FindSpartaMob(IsEpicMob);

    // Normal 등급의 Mob을 찾는 메서드를 델리게이트로 전달
    SpartaMob normalMob = FindSpartaMob(IsNormalMob);

}
 

이 델리게이트를 활용하면, 조건에 따라 다른 로직을 쉽게 추가할 수 있다. 하지만 아직도 조건을 사용하기 위해서는 메서드를 만들어줘야한다는 번거로움이 있다. 


3. 람다식을 통해 메서드 단순화 하기 

람다식이란?

일회용 함수를 만들기 위해 사용하는 문법으로 코드의 가독성을 높이고, 유지보수를 쉽게 할 수 있게 된다.

람다식 사용예시

static bool IsEpicMob(SpartaMob mob)
{
    return mob.Grade == Grade.Epic;
}

//람다식 표현
(SpartaMob mob) => mob.Grade == Grade.Epic;

 

이처럼 메서드를 만들지 않고도 람다식을 활용해 동일 기능을 수행할 수 있다. 


4. Func과 람다식 사용

Func 키워드란?

델리게이트는 사용자 정의 방식으로 메서드를 참조하는 기능을 제공하지만, 매번 새로운 델리게이트를 정의해야 하고, 매개변수와 반환형을 명시적으로 고정해야 하는 한다는 점에서 유연성이 부족하다.  예를 들어, 델리게이트를 제네릭 방식으로 선언하여 어느 정도 해결할 수 있지만 , 매개변수의 수가 바뀌게 된다면 그에 맞는 델리게이트를 새롭게 정의하거나 오버로드해줘야 한다. Func<T, TResult>을 사용하면 이러한 델리게이트의 유연성 부족을 보완해줄 수 있게된다.

 
static SpartaMob FindMob(Func<SpartaMob, bool> selector)
{
    foreach (var mob in spartaMobs)
    {
        if (selector(mob)) // Func를 통해 조건을 검사
        {
            return mob;
        }
    }
    return null;
}

static void Main(string[] args)
{
    // Func를 사용한 람다식으로 Epic 등급의 Mob 찾기
    SpartaMob epicMob = FindMob(mob => mob.Grade == Grade.Epic);
}


Func<SpartaMob, bool>는 SpartaMob을 입력받아 bool 값을 반환하는 델리게이트로, Mob을 찾는 조건을 전달하는 데 사용됩니다. 이 방식은 재사용성이 높은 코드를 작성하는 데 도움을 준다.

마무리

델리게이트와 람다식을 사용하면 메서드를 따로 정의하지 않고도 일회성 함수를 간결하게 정의할 수 있게 된다. 또한 델리게이트 대신 Func 키워드를 사용해 코드의 유연성을 증가해 줄 수도 있다. 다만,람다식을 남용하게 되면 코드의 가독성이 떨어질 수 있지만, 짧고 간단한 일회성 로직에서는 매우 효과적이며 상황에 맞게 적절히 사용하면 코드의 가독성을 높일 수 있을 것 같다. 앞으로 코딩을 하면서 기회가 된다면 func과 람다식의 콜라보를 잘 활용해봐야겟다!