• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

구조체(struct) 활용과 열거형(enum)과의 차이점

21.07.31 19:47 작성 조회수 2.18k

1

안녕하세요. 수업 잘 듣고 있습니다! 항상 감사드립니다.

이번 강좌에서 hp, attack 등 다양한 값을 일일이 입력하고 수정하기 귀찮기 때문에 구조체를 만들어서 값을 가져온다고 알려주셨는데

struct 함수와 enum 함수 사용에 어떤 차이가 있는지 알고 싶습니다. 검색해서 봤는데 enum은 순서대로 배열하고 struct는 일치되지 않은 여러 형태의 매개변수를 쓸 수 있는 것이 유용하다고 배웠습니다.

그런데 영상에서는 hp, attack은 int로 주고, player type은 player라는 새롭게 만든 함수로 줬고 그로 인해서 오류가 발생해서 player를 삭제하고 함수를 사용했는데

그렇게 되면 원래 일일이 인자를 넣어주던 거랑 어떻게 다른지 감이 오지 않아서요. 둘 다 인자 값을 하나하나 일치시키지 않으면 오류가 발생하는데 struct를 써야하는 이유가 따로 있는가?가 궁금해요.

그리고 저번 강의에서 C#은 인덱스를 불러올 때 전체를 다 불러오지 않고 일부만 지정해서 불러올 수 있다고 하셨는데, struct도 그런 식으로 일부만 지정해서 불러와서 쓰면 안 되는 건가요?

답변 1

답변을 작성해보세요.

2


완전 100% 개념과 사용법이 다릅니다.

struct는 일종의 모듬 세트라고 생각하시면 됩니다.

int hp; int mana; float speed; 세개를 따로 선언하지 않고
struct Stat { ... } 로 묶어주면, 앞으로 Stat만 선언해도 hp, mana, speed를 

동시에 선언한 효과를 볼 수 있겠죠.
어떤 함수의 인자를 Stat으로 받아준다면, 실질적으로 메모리 상으로도 역시나
hp, mana, speed를 다 묶어서 받아주기 때문에, hp+mana+speed의 크기 (12바이트)가 됩니다.

enum은 그런 개념이 아니고
그냥 [숫자에 별칭을 붙여주는] 개념이라고 생각하시면 됩니다.
가위/바위/보 게임을 만드는데,
0을 가위, 1을 바위, 2를 보로 사용하기로 했다고 가정해봅시다.

그렇다고 매 번 코드에서 if (choice == 1) 같은 형태로 쓰면,
도대체 이 1이 무엇을 의미하는지 알기가 힘들겠죠.
따라서 얼거형 타입
enum Choice
{
   Scissors = 0; ...
}

이런 식으로 만들어주면, Choice.Scissors는 0이라는 숫자를 사실상 의미하게 되는 것입니다.
물론 C++에선 enum이 사실상 int랑 완전 동일하지만,
C#에선 enum도 하나의 '타입'으로 간주하기 때문에
정수로 활용할거라면 (int)Choice.Scissors 요렇게 다시 변환을 해서 사용해주긴 해야 합니다.

결과적으로 

void Function(Stat stat); 이렇게 받아줄 경우, stat이 hp+mana+speed 모듬 세트
void Function2(Choice choice); 이렇게 받아줄 경우, choice 하나의 선택값(열거형).
단, Function2를 호출할 때는 Choice.Rock Choice.Paper, Choice.Scissors 중에
하나를 골라줘서 넘겨주는 개념이지

셋을 동시에 전달하는 개념이 아니게 되는거죠.

C#은 인덱스를 불러올 때 전체를 다 불러오지 않고 일부만 지정해서 불러올 수 있다고 하셨는데
음~ 이 부분은 어떤 상황을 말씀하시는건지 잘 기억이 안나는데요.
혹시 문맥상 선택 인자를 말씀하시는건가요? 
ex) void Func(int a, int b = 0, int c = 0)일 때, Func(10, c=10) 등으로 호출
위 상황을 말씀하시는거라면, struct는 무조건 모듬 세트라서
하나를 누락하고 선택해서 뭔가를 받아주는 개념이 아닙니다.

yunahyeri님의 프로필

yunahyeri

질문자

2021.08.01

친절하게 설명해주셔서 감사합니다!

직접 써보면서 익혀야지 어떤 상황에 뭐가 더 맞는지를 알겠네요...! ㅎㅎ

좋은 주말 보내세요! ^__^