[11] C# 구조체와 클래스, 열거문 (SBS게임아카데미 9일차_230729_토)
[구조체와 클래스]
- 구조체는 값 형식을 기본으로 하고, 클래스는 참조를 기본으로 한다.
- 구조체는 heap 영역에 생성되지 않고, stack 영역에 할당이 된다.
- 구조체가 클래스 내에 쓰인다면 heap 영역에 할당이 된다.
- 클래스는 stack에 만들어지지만 heap 영역에 원본 주소값을 참조해서 가져온다.
- 구조체는 복사할 경우 값을 복사하고, 하나를 변경하면 원래의 것과 값이 다른 2개가 된다. (깊은 복사)
- 클래스는 복사할 경우 참조한 주소를 복사하고, 하나를 변경하더라도 참조한 원본을 변경한 것이기 때문에 2개가 모두 변경이 된다. (얕은 복사)
[구조체의 복사]
struct StudentStruct
{
//구조체. 값 형식.
//상태. 멤버변수. 필드
public string name;
public int num;
public int grade;
public StudentStruct(string _name, int _num, int _grade)
{
name = _name;
num = _num;
grade = _grade;
}
//기능. 함수
public void ShowInfo()
{
Console.WriteLine("이름:{0}, 번호:{1}, 성적:{2}", name, num, grade);
}
}
internal class Program
{
static void Main(string[] args)
{
StudentStruct s1 = new StudentStruct("루피", 20, 100);
StudentStruct s2 = s1;
s2.name = "샹크스";
s2.num = 30;
s2.grade = 95;
s1.ShowInfo();
s2.ShowInfo();
Console.WriteLine();
}
}
StudentStruck 이라는 구조체를 만들어서
s1에 루피의 이름, 번호, 성적을 대입하고,
s2를 만들어 s1의 값을 복사했다.
이후 s2의 값을 샹크스의 이름, 번호, 성적을 대입한 후
s1과 s2의 값을 출력하면 아래와 같이 나온다.
값을 복사하는 구조체의 특성 상 s1과 s2가 각각 다른 값으로 나온다 (깊은 복사)
[클래스의 복사]
internal class ClassStudent
{
public string name;
public int num;
public int grade;
public ClassStudent(string _name, int _num, int _grade)
{
name = _name;
num = _num;
grade = _grade;
}
public void ShowInfo()
{
//Console.WriteLine("이름:{0}, 번호:{1}, 성적:{2}", name, num, grade);
Console.WriteLine($"이름:{name}, 번호:{num}, 성적:{grade}");
}
}
internal class Program
{
static void Main(string[] args)
{
ClassStudent cs3 = new ClassStudent("조로", 50, 98);
ClassStudent cs4 = cs3;
cs4.name = "우솝";
cs4.num = 33;
cs4.grade = 90;
cs3.ShowInfo();
cs4.ShowInfo();
}
}
ClassStudent 라는 Class를 만들어서
s3에 조로의 이름, 번호, 성적을 대입하고,
s4를 만들어 s3의 값을 복사했다.
이후 s4의 값을 우솝의 이름, 번호, 성적을 대입한 후
s3과 s4의 값을 출력하면 아래와 같이 나온다.
참조 주소를 복사하는 클래스의 특성 상 s4를 변경하더라도 참조한 원본을 변경하여 s3와 s4가 같이 나온다 (얕은 복사)
[열거문 enum]
<도시 이름 예시>
public enum CITY
{
SEOUL, //0
BUSAN, //1
INCHEON, //2
DAEGU, //3
NEWYORK = 10, //10
JEJU //11
}
internal class Program
{
static void Main(string[] args)
{
CITY city1 = CITY.SEOUL;
Console.WriteLine("도시이름:{0}", city1);
city1 = CITY.BUSAN;
Console.WriteLine("도시이름:{0}", city1);
city1 = (CITY)11; //해당 인덱스가 있다면 형변환 가능
Console.WriteLine("도시이름:{0}", city1);
city1 = (CITY)5; //이렇게 쓰는 것도 가능하다는 것만 알고 있으면 됨. 보통은 CITY. 형태로 많이 쓰고 자동으로 뜨는 것 중에 선택.
Console.WriteLine("도시이름:{0}", city1);
}
}
<Job 예시. 열거문 + 함수>
public enum JOBS
{
NOVICE,
KNIGHT,
THIEF,
WARRIOR,
ARCHER,
MAGICIAN,
FIGHTER,
WIZARD
}
class Player
{
//public string job;
public JOBS job = JOBS.NOVICE;
public void SetJob(JOBS _job)
{
Console.WriteLine("직업변경:{0}->{1}", job, _job);
job = _job;
}
public void SetAge(int _age)
{
//age = _age;
}
}
internal class Program
{
static void Main(string[] args)
{
Player p1 = new Player();
p1.SetJob(JOBS.FIGHTER);
p1.SetJob(JOBS.WIZARD);
p1.SetJob(JOBS.KNIGHT);
p1.SetJob(JOBS.ARCHER);
}
}
[강의 내용]
https://www.notion.so/2023-07-29-4edfee40bfa248e289f5805e2fc189e7