■ 구조체(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}");
}
}
■ 튜플(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}");
'개인공부 > C#' 카테고리의 다른 글
[C#] 프로퍼티(Property) (0) | 2022.09.21 |
---|---|
[C#] 인터페이스(Interface), 추상클래스(Abstract class) (0) | 2022.09.19 |
[C#] IS, AS (0) | 2022.09.10 |
[C#] 중첩 클래스(Nested Class), 분할 클래스(Partial Class) (0) | 2022.09.08 |
[C#] 상속(Inheritance) (0) | 2022.09.07 |