익명 형식과 딕셔너리는 비슷해 보이지만 서로 전혀 다른 용도로 사용 된다.
딕서너리 용도
: 딕셔너리는 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
--------------------
'언어 정리 > C# 개념 및 lib' 카테고리의 다른 글
예외처리, 검사 연산자 및 메서드 (0) | 2024.01.24 |
---|---|
예외처리 (0) | 2024.01.24 |
제네릭 클래스, Nullable(?), IEnumerator(이터레이터) (1) | 2024.01.23 |
vscode with c# in wsl (1) | 2024.01.23 |
참조자, static method, 오버라이딩, 오버로드 (1) | 2024.01.09 |
댓글