본문 바로가기

개인공부/C#

[C#] 구조체(Struct), 튜플(Tuple)

 

 

■ 구조체(Struct) :

 - 구조체(Struct)는 값 형식이다.

 - int, double, bool 등과 같은 값 형식의 기본 Data Type은 Struct로 정의되어 있다.

 

 

■ 클래스, 구조체 비교

특징 클래스(class) 구조체(struct)
형식 참조
복사 얕은 복사(Shallow Copy) 깊은 복사(Deep Copy)
인스턴스 생성 new 연산자와 생성자 필요 선언만으로도 생성
생성자 매개변수 없는 생성자 선언 가능 매개변수 없는 생성자 선언 불가능
상속 가능 불가능

* 구조체는 값 형식이기 때문에 구조체의 인스턴스는 스택에 할당되고 인스턴스가 선언된 블럭이 끝나는 지점의 메모리에서 즉시  제거,

  가비지 컬렉터를 호출하지 않아서 클래스에 비해 시간적 낭비가 적어 속도가 빠르다

 

 

■ Example

struct User
{
    public int _id;
    public string _name;
    public User(int id, string name)
    {
        _id = id;
        _name = name;
    }
}

class Member
{
    public int _id;
    public string _name;
    public Member(int id, string name)
    {
        _id = id;
        _name = name;
    }
}
class Program
{
    static void Main(string[] args)
    {
        // struct는 값 형식
        User user = new User(10, "memoo");            
        Console.WriteLine($"[Struct] user._id = {user._id}, user._name = {user._name}");
        User user02 = user;
        user02._id = 20;
        user02._name = "memooooo";
        Console.WriteLine($"[Struct] user._id = {user._id}, user._name = {user._name}");
        Console.WriteLine($"[Struct] user02._id = {user02._id}, user02._name = {user02._name}");
        Console.WriteLine() ;

        // class는 참조 형식
        Member member = new Member(100, "메무");
        Console.WriteLine($"[Class] member._id = {member._id}, user._name = {member._name}");
        Member member02 = member;
        member02._id = 200;
        member02._name = "메무우우우";
        Console.WriteLine($"[Class] member._id = {member._id}, member._name = {member._name}");
        Console.WriteLine($"[Class] member02._id = {member02._id}, member02._name = {member02._name}");
    }
}

 

user는 구조체(값)이기 때문에 user02를 수정해도 user가 변하지 않지만, member는 클래스(참조)이기 때문에 member02를 수정하면 member도 변한다.

 

■ 튜플(Tuple) :

 - C# 7.0부터 사용할 수 있는 데이터 구조

 - 여러 필드를 담을수 있는 구조체(Struct)

 - 임시적으로 복합 데이터 형식을 선언할 때 적합

 

 - 명명되지 않은 선언

 - 명명된 선언

 

■ Example

// 명명되지 않은 tuple
var tuple = (100, 200);
Console.WriteLine($"tuple.Item1 = {tuple.Item1}, tuple.Item2 = {tuple.Item2}");

// 명명된 tuple
var tuple02 = (Num: 100, Name: "Memoo");
Console.WriteLine($"Num = {tuple02.Num}, Name = {tuple02.Name}");


// tuple 분해
var (Num, Name) = tuple;
Console.WriteLine($"Num = {Num}, Name = {Name}");

var (Number, _) = tuple;    // Name 필드 무시
Console.WriteLine($"Number = {Number}");

 

Example 결과