구조체

강성현
∙∙조회 10
구조체

1. 구조체란?

구조체(struct)는 관련 있는 값 여러개를 묶어 하나의 형식으로 만드는 문법입니다.

데이터 단위를 묶어서 다룰 때 사용한다.

 

문법형식 :

public struct <구조체 이름>

{

public <자료형> <필드 이름>;

}

  • 구조체는 값타입, 클래스는 참조타입입니다.
  • 구조체 내에 들어가는 값들을 필드(field)라고 합니다.

 


1-1) 생성자

구조체를 만들 때 필드를 채워주는 특별한 함수입니다.

 

역할 : 데이터를 대입할때 한줄로 줄어들고,

사용자가 실수로 데이터를 깜박하고 누락시키는 것을 방지하기 위해서이다.

csharp
public class Program  
{  
    public static void Main()
    {
        // 생성자를 사용하였을 때
        UserData userData = new UserData("강성현", "전사", 28, 1) ;
        
        // 생성자를 사용하지 않았을 때
        userData.Name = "강성현";
        userData.GameClass = "전사";
        userData.Age = 28;
        userData.Level = 1;
    }
}

public struct UserData
{
    public string Name;
    public string GameClass;
    public int Age;
    public int Level;

    public UserData(string  name, string gameClass, int age, int level)
    {
        Name = name;
        GameClass = gameClass;
        Age = age;
        Level = level;
    }
}

 


1-2) 구조체의 복사

csharp
int[] original = {10, 20, 30};
int[] copy = original; 

copy[0] = 999;
Console.WriteLine(original[0]); // 999 - 원본도 바뀐다.


UserData userData = new UserData("전사", 120, 30);
UserData copy = userData;

copy.Hp = 999;
Console.WriteLine(userData.Hp); /// 120 - 원본은 그대로이다.

앞에서 언급했듯이 구조체는 값타입 이기 때문에 위와 같은 결과가 나옵니다.

 


1-3) 구조체를 함수에 넘겼을 때

표기구조체를 넘겼을 때배열을 넘겼을 때
(없음)필드 전체가 복제됩니다. 원본은 안 바뀝니다관계만 복제됩니다. 요소를 고치면 원본도 바뀝니다
ref원본을 직접 다룹니다. 고치면 밖에도 반영됩니다가리키는 대상 자체를 갈아 끼울 수 있습니다
out함수 안에서 만들어 채워 돌려줍니다함수 안에서 새 배열을 만들어 돌려줍니다
in복제 없이 원본을 보되 고칠 수 없습니다가리키는 대상을 갈아 끼울 수 없습니다
csharp
public static void Main()
    {
        PartyMember archor = new PartyMember("궁수", 120, 30);
        PartyMember warrior = new PartyMember("전사", 120, 30);
        
        Damage(archor);
        Console.WriteLine(warrior.Hp); // 출력 : 120 -> 값이 바뀌지 않음
        
        Damage(ref warrior);
        Console.WriteLine(warrior.Hp); // 출력 : 70 -> 값이 바뀜
    }

    static void Damage(PartyMember member)
    {
        member.Hp -= 50;
    }
    static void Damage(ref PartyMember member)
    {
        member.Hp -= 50;
    }