본문 바로가기
언어 정리/C# 개념 및 lib

익명 형식 vs 딕셔너리, 가변인자

by 알 수 없는 사용자 2024. 1. 24.

익명 형식과 딕셔너리는 비슷해 보이지만 서로 전혀 다른 용도로 사용 된다.

 

 

딕서너리 용도 

 : 딕셔너리는 key와 value 를 저장하는 데 사용되며, 주로 빠른 검색, 삽입, 삭제를 위해 사용됩니다. 예를 들어, 사용자 이름과 사용자 정보를 연결하거나, ID를 사용하여 매핑하는 등의 작업에 적합합니다.

  : python 딕셔너리랑 같은 용도 but 딕셔너리에 들어가는 key 값과 value 값의 자료형이 전부 동일해야 한다.

ex)

Dictionary<string, int> ageDictionary = new Dictionary<string, int>
{
    { "Alice", 30 },
    { "Bob", 25 }
};

foreach (KeyValuePair<string, int> kvp in ageDictionary)
{
    Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");
}

 

익명형식 용도

  : 익명형식은 주로 LINQ 쿼리에서 임시 결과를 생성하거나 메서드에서 많은 값을 반환할 때 사용됩니다. 익명형식은 클래스를 정의하지 않고 생성할 수 있도록 하는 것으로, 주로 소수의 데이터를 다루기 위해 사용됩니다. --> 컬렉션의 일부로 사용 된다 )

    - get set 성질을 가진 변수들을 가진 클래스

  : key,value 의 자료형이 달라도 상관 없다,

ex)

var people = new[]
{
    new { Name = "Alice", Age = 30 },
    new { Name = "Bob", Age = 25 }
};

foreach (var person in people)
{
    Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
}

 

 

차이점

딕셔너리의 경우에는 GetEnumerator 가 정의 되어 있어 Iterable 하지만,

익명형식은 GetEnumerator 가 정의 되어 있지 않아 Iterable 하지 않아 foreach 문을 쓸 수 없다.

 

 


딕셔너리

딕서너리 예제 코드

namespace c__test;

class Program
{
    static void Main(string[] args)
    {

    Console.WriteLine("----------------------------------__-----");

    /* Dictionary 선언방법 1*/
    Dictionary<string, int> ex_1 = new Dictionary<string, int>();
    /* Dictionary 선언방법 2*/
    Dictionary<string, int> ex_2 = new Dictionary<string, int>()
    {
        ["t1"] = 1,
        ["t2"] = 2,
    };
    /* Dictionary 선언방법 3*/
    Dictionary<string, int> ex_3 = new Dictionary<string, int>()
    {
        { "liam", 31 },
        { "gen", 20 },
    };

    // 값 추가 1
    ex_3.Add("Alice", 30);
    // 값 추가 2
    ex_3["Bob"] = 25; 

    // 값 꺼내오기
    Console.WriteLine(ex_3["Alice"]); // 출력: 30

    // Key 검사 1
    if (ex_3.ContainsKey("Bob"))
    {
        Console.WriteLine($"Bob is exist : {ex_3["Bob"]}");  // 출력: Bob is exist : 25
    }
    // Key 검사 2
    if (ex_3.TryGetValue("Bob", out var bobAge))
    {
        Console.WriteLine($"Bob is exist : {bobAge}");  // 출력: Bob is exist : 25
    }

    // 값 업데이트
    ex_3["Alice"] = 31; // Alice의 나이를 31로 업데이트

    // 값 삭제
    ex_3.Remove("Bob"); // Bob의 키와 값을 삭제

    // Dictionary 내용 출력
    foreach (KeyValuePair<string, int> pair in ex_3)
    {
        Console.WriteLine($"Name: {pair.Key}, Age: {pair.Value}");
        /*  Name: liam, Age: 31
            Name: gen, Age: 20
            Name: Alice, Age: 31    */
    }

    }
}

 

익명 형식

만약 익명형식을 파이썬 처럼 for k,v in dict_1 하고 싶으면

foreach (var prop in dict_1.GetType().GetProperties())

{

    var k = prop.Name;

    var v = prop.GetValue(v, null);

}

이런식으로 애둘러야함. 익명형식은 Iterable 하지 않기 때문이다.

따라서 GetType().GetProperties() 메서드를 통해 PropertyInfo 배열을 반환받아서 사용 해야한다.

namespace practice;
using System;


class Program
{
    static void Main()
    {
        var v = new { Amount = 108, Message = "Hello" };

        Console.WriteLine($"0 : {v.Amount} , {v.Message}");       // 출력값 > 0 : 108 , Hello
        Console.WriteLine($"1 : {v.Amount + v.Message}");         // 출력값 > 1 : 108Hello
        Console.WriteLine($"2 : {v}");                            // 출력값 > 2 : { Amount = 108, Message = Hello }
        Console.WriteLine($"3 : {v.GetType()}");                  // 출력값 > 3 : <>f__AnonymousType0`2[System.Int32,System.String]
        Console.WriteLine($"4 : {v.GetType().GetProperties()}");  // 출력값 > 4 : System.Reflection.PropertyInfo[]

        foreach (var prop in v.GetType().GetProperties())
        {
            string name = prop.Name; // 프로퍼티 이름
            var value = prop.GetValue(v, null); // 프로퍼티 값
            Console.WriteLine("{0}: {1}", name, value); // 출력값 : Amount: 108
        }                                               // 출력값 : Message: Hello
    }

}

 


가변인자

가변인자는 2가지 종류가 있다.

1. 특정한 데이터타입의 종류만 받는 인자

  - ex) public static void PrintNumbers(params int[] numbers)

2. 데이터 타입과 무관하게 전부 받는 인자

  - ex) public static void PrintContainer(params object[] numbers)

 

" params 변수타입[] " 이 가변인자 키워드이다.

[] 를 붙이는 이유는 실제로 다중 인자가 들어올 경우 배열로서 받기 때문이다.

namespace c__test;
using System;


class Program
{
    public static void PrintNumbers(params int[] numbers) 
    {
        /* (특정한 데이터 타입 지정) */
        Console.WriteLine($"- {numbers} -");
        foreach (var number in numbers) {
            Console.WriteLine(number);
        }
        Console.WriteLine("--------------------");
    }

    public static void PrintContainer(params object[] numbers) 
    {
        /* (최상위 타입 object 지정) << 인자의 타입이 여러종류여도 된다. */
        Console.WriteLine($"- {numbers} -");
        foreach (var number in numbers) {
            Console.WriteLine(number);
        }
        Console.WriteLine("--------------------");
    }

    /*
    "dotnet run -- 인수" 로 실행시 "인수"라는 인수를 string[] args 로 받아진다.
    */
    static void Main(string[] args)
    {
        Console.WriteLine("==== 실행시 인수 값 전달 방법 ====");
        Console.WriteLine($"args {args}");          //  args System.String[]
        string arr_to_str = "";
        foreach (var item in args)
        {
            Console.WriteLine(item);                // 인수
            arr_to_str = arr_to_str + item;
        }
        Console.WriteLine($"res : {arr_to_str}");   // res : 인수

        Console.WriteLine("=========특정한 데이터 타입 지정==========");
        PrintNumbers(1);
        PrintNumbers(1, 2);
        PrintNumbers(1, 2, 3);
        int[] numbers = { 1, 2, 3 };
        PrintNumbers(numbers);   
        Console.WriteLine("=========최상위 타입 object 지정==========");
        PrintContainer(1);
        PrintContainer(1,2);
        PrintContainer(1,"2","3","aaa");
    }

}

 

출력 값 :

==== 실행시 인수 값 전달 방법 ====
args System.String[]
인수
res : 인수
=========특정한 데이터 타입 지정==========
- System.Int32[] -
1
--------------------
- System.Int32[] -
1
2
--------------------
- System.Int32[] -
1
2
3
--------------------
- System.Int32[] -
1
2
3
--------------------
=========최상위 타입 object 지정==========
- System.Object[] -
1
--------------------
- System.Object[] -
1
2
--------------------
- System.Object[] -
1
2
3
aaa
--------------------

 

 

 

 

 

댓글