C#

class, struct 비교

잼잼재미 2023. 11. 2. 12:36

class와 struct(구조체)는 유사하지만 차이점이 있다.

클래스는 기본 생성자로 초기화 후, 대입하여 사용해야 한다.

 

● class

1. 데이터와 메서드를 하나로 묶은 사용자 정의 타입
2. 객체를 생성하기 위한 템플릿 또는 설계도 역할
3. 속성과 동작을 가짐
4. 클래스를 사용하여 인스턴스를 만듦
 * ex) 붕어빵틀 (클래스), 붕어빵(인스턴스, 객체)

 

● class의 구성요소

1. 필드
 - 클래스에서 사용되는 변수

class Player
{
    private string name;
    private int level;   
}


2. 메서드
 - 클래스에서 수행되는 동작, 함수

class Player
{
    public void Attac()
    {
    	// 공격 동작 구현
    }
{


3. 생성자
 - 객체를 초기화하는 역할
 - 객체가 생성될 때 자동으로 호출
 - 생성자는 클래스와 동일한 이름을 가지며, 반환 타입이 없음

 - 객체를 생성할 때 new 키워드와 함께 호출 됨

 - 생성자는 여러개 정의할 수 있으며 매개변수의 변수와 타입에 따라 다른 생성자를 호출함 (생성자 오버로딩)

 - 기본적으로 매개변수가 없는 디폴트 생성자가 클래스에 자동으로 생성, 사용자가 정의한 경우, 자동 생성 안됨

class Person
{
    private string name;
    private int age;

    public void PrintInfo()
    {
        Console.WriteLine($"Name: {name}, Age: {age}");
    }

    // 디폴트 생성자
    public Person()
    {
        name = "UnKnown";
        age = 0;
    }

    // 추가 생성자
    public Person(string newName, int newAge)
    {
        name = newName;
        age = newAge;
    }
}

static void Main(string[] args)
{
    Person person1 = new Person();
    Person person2 = new Person("Jhon", 25);
}

 * 생성자를 정의하지 않으면 디폴트 생성자가 자동으로 정의

 * 추가 생성자를 정의했다면, 디폴트 생성자를 직접 만들어야 함


4. 소멸자
 - 객체가 소멸될 때 호출하는 메서드
 - 메모리나 리소스의 해제 등 작업을 수행

 - 클래스와 동일한 이름을 가지며, 이름 앞에 ~를 붙여 표현
 - 소멸자는 반환 타입이 없고 매개변수를 가질 수 없음
 - C#에서는 가비지 컬렉터(Garbage Collector)에 의해 메모리 해제가 자동으로 되므로, 소멸자를 사용을 권장하지 않음

class Person
{
    private string name;
    private int age;

    public void PrintInfo()
    {
        Console.WriteLine($"Name: {name}, Age: {age}");
    }  
    
    // 소멸자
    ~Person()
    {
    
    }
}

 

● 공통점

1. 변수와 함수의 모음

2. 자료형을 새로 만들 때 사용

3. 사용자 정의 형식

 

● 차이점

특징 클래스 구조체
키워드 class struct
형식 참조형식 (Heap 할당) 값 형식 (Stack 할당)
인스턴스 생성 new 연산자와 생성자 필요 선언만으로 생성
상속 가능 불가능
메모리 사용방식 객체 중심 데이터 중심
예시 스크립트, Random 함수 Vector3

 

☞ 값형과 참조식 : https://kkln2486.tistory.com/73

 

값형과 참조형 (박싱과 언박싱)

● 값형과 참조형 1. 값형 - 변수에 값을 직접 저장 - 변수가 실제 데이터를 보유 - 해당 변수를 다른 변수에 할당하거나 전달할 때는 값이 복사 - 변수의 수정은 해당 변수의 값만 변경하므로 다

kkln2486.tistory.com

 

● 예시

// Class
public class ClassPos
{
    public int x;
    public int y;
    public int z;
    
    public void Show()
    {
        print (x + " " + y + " " + z);
    }
    
	// 추가생성자 정의
	public ClassPos (int xln, int yln, int zln)
    {
        x = xln;
        y = yln;
        z = zln;
    }
}


classPos cPos; // 레퍼런스 변수 생성 (실제 데이터를 가리킴)
cPos = new ClassPos(); // x, y, z 에 0이 대입되면서 cPos실데이터의 참조가 저장
cPos.x = 10;
cPos.y = 20;
cPos.z = 30;
// cPos = new ClassPos(10, 20, 30); 과 동일
// Struct
public struct StructPos
{
    public int x;
    public int y;
    public int z;

    public void Show()
    {
        print(x +"" + y + "" + z);
    }

    // 추가생성자 정의
    public StructPos(int xln, int yln, int zln)
    {
        x = xln;
        y = yln;
        z = zln;
    }
}

StructPos pos;
pos.x = 10;
pos.y = 20;
pos.z = 30;
// pos = new StructPos (10, 20, 30); 과 동일

 

'C#' 카테고리의 다른 글

C#의 특징  (0) 2023.11.06
데이터형식 범위  (0) 2023.11.03
전위연산자, 후위연산자 비교 (++i, i++)  (0) 2023.11.03
점프문 (break, return, continue) 비교  (0) 2023.11.03
foreach  (0) 2023.11.02