본문 바로가기
프로그래밍/C#

[C#] 딕셔너리를 이용한 조건문 리펙토링

by webcodur 2024. 4. 26.
728x90
반응형

 

목차

     

    다음 포스팅에서는 C# 프로그래밍 중 조건문을 만났을 때 어떻게 코드 가독성과 확장성을 향상시킬 수 있는지 살펴본다. 본 포스트는 전통적인 조건문 상황(if-else)에서 이를 개선하기 위해 딕셔너리와 람다식을 도입한 두 예제를 다루고 있다.

     

     

    1. 단순 값 반환 조건식 개선

    • 기존 방식(Calc1): 특정 연산(add, subtract, multiply)을 수행하기 위해 여러 if-else 문을 사용하여 각 조건에 따라 다른 연산을 수행한다.
    • 리팩토링 후(Calc2): 연산명을 키로, 해당 연산을 수행하는 람다 함수를 값으로 가지는 Dictionary를 구성한다. 이를 통해 필요한 연산을 딕셔너리에서 찾아 실행함으로써 코드의 유연성과 확장성을 대폭 향상시킨다. 이 접근법은 새로운 연산을 추가하거나 변경할 때 매우 간단하게 딕셔너리 엔트리를 수정하거나 추가함으로써 대응할 수 있다.
    using System;
    using System.Collections.Generic;
    
    public class Program
    {
        // 작업 수행
        public static void Main()
        {
            Console.WriteLine(GetWebsite1("네이버"));  // www.naver.com
            Console.WriteLine(GetWebsite1("구글"));    // www.google.com
    
            Console.WriteLine(GetWebsite2("네이버"));  // www.naver.com
            Console.WriteLine(GetWebsite2("구글"));    // www.google.com
        }
    
        // BEFORE REFACTORING
        public static string GetWebsite1(string name)
        {
            if (name == "네이버")
            {
                return "www.naver.com";
            }
            else if (name == "구글")
            {
                return "www.google.com";
            }
        }
    
        // AFTER REFACTORING
        static Dictionary<string, string> websites = new Dictionary<string, string>()
        {
            {"네이버", "www.naver.com"},  // 네이버
            {"구글", "www.google.com"}   // 구글
        };
    
        public static string GetWebsite2(string name)
        {
            return websites.ContainsKey(name) ? websites[name] : "Unknown";
        }
    }
    

     

     

    2. 함수형 작업 수행하는 조건식 개선

    • 기존 방식(GetWebsite1): 웹사이트의 이름(네이버, 구글)을 입력받아 각 이름에 맞는 URL을 반환하기 위해 if-else 문을 사용한다. 특정 이름에 대해 하드코딩된 URL을 반환한다.
    • 리팩토링 후(GetWebsite2): 웹사이트의 이름을 키로, 해당 웹사이트의 URL을 값으로 하는 Dictionary를 사용한다. 이 구조를 통해 이름에 해당하는 URL을 효율적으로 조회하고, 이름이 딕셔너리에 없는 경우에는 "Unknown"을 반환한다. 이 방법은 데이터의 추가나 수정이 간단해지며, 코드의 단순화 및 가독성이 향상된다.
    using System;
    using System.Collections.Generic;
    
    public class Program
    {
        // 작업 수행
        public static void Main()
        {
            Calc1("add", 5, 3);         // 8
            Calc1("subtract", 5, 3);    // 2     
            Calc2("add", 5, 3);         // 8
            Calc2("subtract", 5, 3);    // 2
        }
    
        // BEFORE REFACTORING
        public static void Calc1(string action, int x, int y)
        {
            if (action == "add")
            {
                Console.WriteLine(x + y);
            }
            else if (action == "subtract")
            {
                Console.WriteLine(x - y);
            }
            else if (action == "multiply")
            {
                Console.WriteLine(x * y);
            }
        }
    
        // AFTER REFACTORING
        Dictionary<string, Action<int, int>> actions = new Dictionary<string, Action<int, int>>()
        {
            { "", (a, b) => Console.WriteLine(a + b) }, 
            { "subtract", (a, b) => Console.WriteLine(a - b) }, 
            { "multiply", (a, b) => Console.WriteLine(a * b) }, 
        };
    
        public static void Calc2(string action, int x, int y)
        {
            if (actions.ContainsKey(action))
                actions[action](x, y);
        }
    }
    

     

    두 예제 모두에서 리팩토링은 코드를 더 단순하고 확장 가능하게 만든다. 딕셔너리를 사용하는 방식은 새로운 케이스를 추가할 때 매우 효율적이며, 람다식을 활용함으로써 간결하고 직관적인 코드 작성을 가능하게 한다.

    반응형