구조체
- 클래스의 사촌
- 구조체의 필드를 public으로 선언
- 클래스는 실세계의 객체를 추상화함
- 구조체는 데이터를 담기 위한 자료구조 (굳이 은닉할 필요x)
특징 | 클래스 | 구조체 |
---|
키워드 | class | struct |
형식 | 참조 형식(힙에 할당) | 값 형식(스택에 할당) |
복사 | 얕은 복사 | 깊은 복사 |
인스턴스 생성 | new 연산자와 생성자 필요 | 선언만으로 생성 |
생성자 | 매개변수 없는 생성자 선언 가능 | 매개변수 없는 생성자 선언 불가능 |
상속 | 가능 | 값 형식이므로 상속 불가능 |
- 구조체 인스턴스는 스택에 할당되고 인스턴스가 선언된 블록이 끝나는 지점에서 메모리에서 사라짐
- 구조체의 각 필드는 CLR이 기본값으로 초기화
- 구조체는 모든 필드와 프로퍼티의 값 변경 불가능 구조체로 선언 할 수 있음, 이에 반해 클래스는 변경불가능을 선언할 수 없음
readonly struct 구조체 이름 {}
튜플
- 튜플도 여러 필드를 담을 수 있는 구조체
- 튜플은 형식 이름이 없음
- 튜플은 구조체이므로 값 형식
- 응용프로그램 전체에서 사용할 형식을 선언할 때가 아닌, 즉석에서 사용할 복합 데이터 형식을 선언할 때 적합
- 예시 코드
using System;
namespace Tuple
{
class MainApp
{
static void Main(string[] args)
{
var a = ("슈퍼맨", 9999);
Console.WriteLine($"{a.Item1}, {a.Item2}");
var b = (Name: "박상현", Age: 17);
Console.WriteLine($"{b.Name}, {b.Age}");
var (name, age) = b;
Console.WriteLine($"{name}, {age}");
var (name2, age2) = ("박문수", 34);
Console.WriteLine($"{name2}, {age2}");
b = a;
Console.WriteLine($"{b.Name}, {b.Age}");
}
}
}