구조체 & 클래스

정제로·2023년 8월 15일
0

C#

목록 보기
16/30

구조체 & 클래스

구조체

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: 마이콜

이런식으로 값이 변경된다
하지만 구조체는 값 형식이므로 값이 변경되지 않는다!


profile
초보자입니다.. 잘못된 정보, 달게 받겠습니다..

0개의 댓글

관련 채용 정보