본문 바로가기

Study_C#

[C#] 자료형 정리

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가지 제약조건이 따른다
    1. Local Variable로만 사용 가능
    2. 선언과 동시에 초기화를 해야 함
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을 선언해줘야 함

List<T> Class에 포함되어 있는 IEnumerable Interface

 

  • 위 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을 반복할 수 있게 해줌
    1. 현재 위치 파악
    2. 다음 항목으로 이동
    3. 초기 위치로 이동

 

- 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인지 간에 사용될 수 있다

Object Class에 포함되어 있는 ToString Method

 

 

 

 

 

 

 

 


참고 자료 : 

https://learn.microsoft.com/ko-kr/dotnet/csharp/

 

C# 가이드 - .NET 관리 언어

C# 가이드에는 C#을 배우고 .NET 앱 작성을 시작하는 데 필요한 모든 것이 포함되어 있습니다. 프로그래밍 C# 알아보기 - 초보 개발자, C#을 처음 사용하는 개발자, 숙련된 C# / .NET 개발자용입니다.

learn.microsoft.com

 

https://m.blog.naver.com/inwoo772/221433645011

 

C# - List

List C#에서 List와 각 함수들 안녕하세요. 심개입니다. #List #Cs #프로그래밍 #Sort #Insert #Fi...

blog.naver.com

 

https://constructionsite.tistory.com/25

 

[C#] List 대입(복사)하기

List의 경우 참조 형식이다. 그래서 단순히 list1 = list2;와 같은 형식으로 대입한다면, list2의 주소 값만 list1에 대입되어 list1의 값이 변경되었을 때 list2의 값도 변경된다. using System.Linq; class Program {

constructionsite.tistory.com

 

https://greenchoco.tistory.com/108

 

C#기초 - 숫자, 문자열 사칙연산하기

1. 숫자 사칙연산 C#스크립트에서 사직연산 + , - , * , / 즉 덧셈, 뺄셈, 곱셈, 나눗셈을 사용할 수 있다. using System.Collections;using System.Collections.Generic;using UnityEngine;public class test : MonoBehaviour{ // Start

greenchoco.tistory.com

 

https://runtoyourdream.tistory.com/278

 

 

https://codinggom-daily.tistory.com/41

 

[C#]컬렉션(Collection)

서론 C++에 STL이 있다면, C#에서는 데이터 원소들을 저장, 관리하는 컬렉션이 있습니다. 이번 글에서는 C#의 데이터 저장과 처리를 위한 자료구조 컬렉션에 대해서 다뤄보려 합니다. 제네릭/논제

codinggom-daily.tistory.com

 

 

'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