728x90
- List
- 여러 Data를 저장할 수 있는 Data Type
선언
- 아래처럼 'List' Keyword 사용 후 '< >' 사이에 원하는 Data Type을 입력
List<string> ExArray = new List<string>();
- 이후 'Add' 함수를 통해 해당 List에 지정한 Data Type 저장 가능
ExArray.Add("This is example code");
ExArray.Add("for study");
ExArray.Add("C#");
- 혹은 아래처럼 Add 함수를 사용하지 않고 '{ }' 사이에 초기화 할 값을 바로 입력할 수 있다
List<string> ExArray = new List<string>(){
"This is example code", "for study", "C#"
};
- List 내의 Data들은 아래와 같이 Array 형태로 저장된다
주의 사항
- List<T>의 경우 참조 형식이여서, 아래와 같은 식으로 대입을 한다면
list2의 주소값만 list1에 대입되어 list1의 값이 변경되었을 때 list2의 값도 변경된다
list1 = list2;
- 이 때 아래처럼 ToList() method를 사용하면 List 간에도 간단한 복사가 가능함
- 단 ToList()는 System.Linq에 정의되어있으므로 'using System.Linq' 필요
using System.Linq;
class Program
{
static void Main(string[] args)
{
List<int> list = new List<int> { 11, 10, 9, 15 };
List<int> listclone = list.ToList();
}
}
- var
- Data type을 지정해주지 않아도 변수에 따라 자동으로 Type을 인식하는 Data type
- var type variable 사용에는 아래의 2가지 제약조건이 따른다
- Local Variable로만 사용 가능
- 선언과 동시에 초기화를 해야 함
using System;
namespace Test
{
class Test
{
static void Main(string[] args)
{
var Stringvar = "This is test code";
var Intvar = 100;
var Floatvar = 100.123;
Console.WriteLine("{0}의 자료형 : {1}", "Stringvar", Stringvar.GetType());
Console.WriteLine("{0}의 자료형 : {1}", "Intvar", Intvar.GetType());
Console.WriteLine("{0}의 자료형 : {1}", "Floatvar", Floatvar.GetType());
}
}
}
- 위처럼 정의된 변수의 Type을 인식하여 자동으로 Data Type을 지정
- Collection
- Collection : 같은 성격을 띠는 데이터의 모음을 담는 자료 구조. 연관된 Object들을 저장하는 역할
(C#은 모든 요소를 Object로 다룸) - Generic / Non - Generic Collection으로 나뉨
1. Non-Generic Collection
- 어느 Type의 Object든지 저장 가능한 Collection
- 즉 Object Type을 받는 Collection
- Ex) ArrayList, Hashtable, Queue, Stack
- Non-Generic Collection에 저장된 값들은 추가될 때 Object 형식으로 'boxed', 검색될 때 원래 값으로 'unboxed' 됨
- 이는 Memory 사용 측면에서 비효율적일 수 있음
- 별도의 Compile - Time Type 확인 없이 다양한 Data Type의 내용들을 저장할 수 있다
2. Generic Collection
- 같은 Type의 값만 받는 Collection
- Ex) List<T>, Dictionary<TKey, TValue>, Queue<T>, Stack<T>
- Non - Generic Collection과 달리 값이 원래 형태로 저장되므로 boxing / unboxing을 사용하지 않음
- Non - Generic Collection에 비해 효율적으로 Memory 사용 가능
- Generic / Non - Generic Collection은 보통 같은 형식에 Generic을 지원하는지 여부로만 나뉨
- 예제 코드
using System;
using System.Collections;
using System.Collections.Generic;
class Program
{
static void Main()
{
ArrayList list1 = new ArrayList(); // Non-Generic Colleciton
list1.Add(100); // Integer
list1.Add("Hello, World!"); // String
list1.Add(100.123); // Float
Console.WriteLine("Non-Generic Collection");
foreach (object item in list1)
{
Console.WriteLine(item);
}
List<int> list2 = new List<int>(); // Generic Collection
list2.Add(100); // Only Integers
list2.Add(200);
list2.Add(300);
Console.WriteLine("\nGeneric Collection");
foreach (int item in list2)
{
Console.WriteLine(item);
}
}
}
- Non-Generic Collection인 list1에는 Integer, String, Float Type 저장
- Generic Collection인 list2에는 Integer Type만 저장
- IEnumerable
- Non-Generic Collection에 반복이 필요할 경우 사용하는 Interface
// COM의 interop와 Platform 호출 Service를 제공하는 광범위한 member를 제공하는 namespace를 포함
using System.Runtime.InteropServices;
namespace System.Collections
{
// COM 요소들이 'IEnumeerable' interface를 볼 수 있게 함
// COM 기반의 Application들과의 상호운용성에 있어 중요
[ComVisible(true)]
// Interface에 GUID(Globally Unique IDentifier) 할당. GUID는 COM interop에서 사용됨
[Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerable
{
// COM interop에서 method를 고유하게 식별하는데 사용하는
// DispID(Dispatch IDentifier)를 'GetEnumerator' method에 할당
[DispId(-4)]
// Collection의 요소에 반복적으로 접근할 수 있도록 하는 'IEnumerator' Object를 Return하는 Method
IEnumerator GetEnumerator();
}
}
- COM(Component Object Model) : MicroSoft에서 개발한 SW Component 규약
- 상호작용 가능한 Binary SW 요소를 만드는데 사용되는, Platform에 무관한 객체지향 System
- 다른 Programming 언어나 Platform에서 COM의 구성 요소를 사용할 수 있도록 하는 Interop 기술을 제공
- Component 규약 : Compiler의 종류에 관계없이 해당 File을 사용할 수 있도록 하는 규약
- Interop(상호작용) : 다른 Platform이나 Library 등을 사용할 수 있도록 하는 방법을 제공하는 기술
- 위 IEnumerable Interface는 Collection에서 기본적으로 포함하고 있으므로 따로 선언할 필요는 없음
- 단 사용자가 임의로 생성한 Collection의 경우에는 IEnumerable을 선언해줘야 함
- 위 Interface에 있는 유일한 Method인 'GetEnumerator()' 는 'IEnumerator' Object를 Return
- IEnumerator : Collection의 요소에 반복적으로 접근할 수 있도록 하는 Interface
- IEnumerator
#region Assembly mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\mscorlib.dll
#endregion
using System.Runtime.InteropServices;
namespace System.Collections
{
public interface IEnumerator
{
// 현재 Enumerator 위치에서의 Collection 내부의 요소인 Object를 Return
object Current { get; }
// Enumerator를 Collection 내의 다음 요소로 이동
// 성공적으로 이동했을 경우 true를, Collection의 끝부분에 도달했을 경우 False를 Return
bool MoveNext();
// Enumerator를 초기 위치로 이동
void Reset();
}
}
- .NET Framework의 Collection 관리에 필수적인 요소
- 아래의 3가지 동작을 통해 Non-Generic Collection을 반복할 수 있게 해줌
- 현재 위치 파악
- 다음 항목으로 이동
- 초기 위치로 이동
- IEnumerable<out T>
- Generic Collection에 반복이 필요할 경우 사용하는 Interface
- Non-generic interface인 IEnumerable를 Generic Interface로 확장한 형태
/* IEnumerable(Metadata) */
#region Assembly mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\mscorlib.dll
#endregion
namespace System.Collections.Generic
{
// 'System.SZArrayHelper' 상의 type dependency를 특정
// Array handling 관련 성능 최적화를 위해 .NET runtime에서 내부적으로 사용됨
[TypeDependencyAttribute("System.SZArrayHelper")]
public interface IEnumerable<out T> : IEnumerable
{
// Collection을 반복하는데 사용되는 IEnumerator<T> object를 Return
IEnumerator<T> GetEnumerator();
}
}
- IEnumerator<out T>
- IEnumerator<T> : Generic Colleciton에 대한 반복을 지원하는 Interface
- 지정된 Type(T)에서의 Collection의 간단한 반복을 지원
namespace System.Collections.Generic
{
public interface IEnumerator<out T> : IDisposable, IEnumerator
{
T Current { get; }
}
}
- 아래처럼 List 선언 시 Data Type을 지정한 후 그에 해당하는 값들만을 저장
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
// Using IEnumerable<T> with a foreach loop
foreach (int number in numbers)
{
Console.WriteLine(number);
}
}
}
- Type Conversion
object tmp_ob1 = 100;
object tmp_ob2 = 200;
string[] tmp_arr;
tmp_arr[0] = (string)tmp_ob1; // Direct Cast
tmp_arr[1] = tmp_ob2.ToString(); // ToString() Method
- Direct Cast 사용 시 object type이 변환하고자 하는 Type과 호환되는 Type이어야 함
- 위의 경우 Integer를 String으로 바로 바꾸는 것을 불가능하여 ' InvalidCastException' 발생
- ToString() Method는 'Object' Class의 base에 정의되어 있어 어느 object인지 간에 사용될 수 있다
참고 자료 :
https://learn.microsoft.com/ko-kr/dotnet/csharp/
https://m.blog.naver.com/inwoo772/221433645011
https://constructionsite.tistory.com/25
https://greenchoco.tistory.com/108
https://runtoyourdream.tistory.com/278
https://codinggom-daily.tistory.com/41
'Study_C#' 카테고리의 다른 글
[C#] Invoke, InvokeRequired, Delegate (0) | 2024.07.30 |
---|---|
[C#] Using의 2가지 사용법 (0) | 2024.07.30 |
[C#] 비동기 관련 (0) | 2024.07.06 |
Doridori C# 강의 정리 2. Data Type과 Overflow (0) | 2024.05.22 |
Doridori C# 강의 정리 1. String (4) | 2024.05.20 |