struct Person
{
public string name;
public int age;
public Person(string name, int age)
{
this.name = name;
this.age = age;
}
public void displayField()
{
Console.WriteLine("name: " + name + " / age: " + age);
}
}
class Program
{
static void Main(string[] args)
{
Person person = new Person("마이콜", 20);
person.displayField();
}
}
위처럼 생성자를 만들 수 있고, new키워드를 이용해 인스턴스화 가능하다.
단점은 모든 필드에 값을 할당해야한다는 것
또 구조체는 상속을 진행할 수 없다
class Person
{
public string name;
public int age;
public Person(string name, int age)
{
this.name = name;
this.age = age;
}
public void displayField()
{
Console.WriteLine("name: " + name + " / age: " + age);
}
}
class Program
{
static void Main(string[] args)
{
Person person = new Person("마이콜", 20);
person.displayField();
}
}
클래스는 Heap영역에 할당되지만 구조체는 STack영역에 할당된다.
Heap영역은 Stack영역에 비해 크기가 크지만, Stack은 크기가 작고 한정적이다.
하지만 Stack의 경우 가비지 컬랙션에 의해 관리되지 않기 때문에 성능상 굉장한 이점이 있다다만! 구조체를 사용할때는 16비트를 넘기지 말자.
실제로 마이크로소프트에서 말한 class 권장 사용 경우를 보자
- 기본 형식(int, double등)과 유사한 단일 값을 논리적으로 나타냅니다.
- instance 크기는 16바이트 미만입니다.
- 변경할 수 없습니다.
- 자주 상자에 입력할 필요는 없습니다.(박싱)
16바이트를 명시한 이유가 있는데 너무 어려운 내용이라, 참조글로 대체하겠다왜 구조체는 16 바이트의 크기가 적합한가?
클래스와 구조체 간의 선택(MS)따라서 위 조건을 만족하지 않는이상 클래스를 사용하자!
참고로 클래스는 참조형식 이므로, 같은 객체를 사용하면ex) class Person { public string name; } class Program { static void Main(string[] args) { Person person1 = new Person(); person1.name = "둘리"; Person person2 = person1; person2.name = "마이콜"; Console.WriteLine("person1.name: " + person1.name); Console.WriteLine("person2.name: " + person2.name); } } 츌력 person1.name: 마이콜 person2.name: 마이콜
이런식으로 값이 변경된다
하지만 구조체는 값 형식이므로 값이 변경되지 않는다!