요새 js를 천천히 공부하느라, 블로그에 글을 잘 못 쓰고 있습니다. 오랫만에 온 듯 싶네요. 오늘은 구조체에 대해서, 간단하게 알아보도록 하겠습니다. 어떤 상태가 있습니다. 그런데, 이것을 여러 속성으로 표현을 해야 할 때가 있어요. 예를 들자면, 현재 좌표를 표현하려고 할 때, 1차원이면 x 하나만 있으면 됩니다. 그런데, 2차원이면 x, y 두개가 있어야 하고, 3차원이면 x, y, z 이렇게 3개가 있어야 합니다.

 

 이들을 어떻게 잘 묶을 방법이 없을까요? 이를 위해서 구조체를 쓸 수 있어요.

 

 

 보통 이렇게 많이 씁니다. 이것만 보아서는 잘 이해가 가시지 않을 듯 싶으니, 백준에 있는 17143번, 낚시왕을 예로 들어서 설명해 보도록 하겠습니다.

 

 


 문제 상황은, 다음과 같습니다. 먼저, 낚시왕이 우측으로 한 칸 이동합니다. 그리고, 낚시왕은 열에 있는 상어 중, 가장 가까이에 있는 상어를 잡습니다. 다음에 상어가 이동합니다. 이 때, shark는 이동 방향과, 속도, 초기에 있었던 위치 등이 주어집니다. 크기도 주어집니다. 어떻게 설계하면 좋을까요?

 

 

 먼저, 상어가 가지는 특징들을 생각해 봅시다. 문제에 나온 것은, 먼저 위치가 있었습니다. 그리고 속도가 있었어요. 상어는 좌우, 혹은 상하로 움직이기 때문에, 위치 x, 위치 y로 표현할 수 있습니다.

 

 

 그런데, 상하로 움직이는지, 좌우로 움직이는지, 이에 대한 flag가 없어요. 그리고, 방향에 대한 처리도 없어요. 이걸 어떻게 할까요? 기준 방향을 각각 아래, 오른쪽으로 잡습니다. 상하로 움직이면 flag는 0, 좌우로 움직이면 1로 처리하면 됩니다. 그리고 기준 방향으로부터 다르게 움직이면, 속력에 (-1)을 곱하면 됩니다.

 

 

문제 상황을 그림으로 그려보면, x행 y열에 접근하기 위해서, arr[x][y]로 쓴다고 생각해 봅시다. 아랫쪽으로 갈수록, x 값이 증가하고, 우측으로 갈수록 y 값이 증가하는 것을 알 수 있어요. 그렇기 때문에, 우측 방향과 아랫쪽 방향을 기준으로 삼은 거에요. 그런데, 사실, x와 y를 그냥 shark에 넣어도 될 듯 싶어요.

 

 

 shark에 대한 정보를 모두 다 작성했습니다.

 

 

 이걸 그대로 코드에 옮기면 됩니다.

 

 


 조금 더 쉬운 예제를 하나 봅시다. 학생들을 생각해 봅시다. 성적을 관리하려고 해요. 그러면 어떻게 설계하면 좋을까요?

 

 

 학생의 이름을 저장할 것과, score를 저장할 것. 2개의 필드를 넣으면 됩니다. 5개의 과목에 대해서 넣어야 한다면, int score[5]가 될 거고요. 10개의 과목에 대해서 저장해야 한다면, int score[10]으로 선언하면 됩니다. 학생 이름의 최대 길이가 40이라면, 대략, char name[41]; 이렇게 저장하면 될 거고요.

 

 

 이것을 그대로 코드로 구현하면 다음과 같습니다. main 함수를 봅시다.

 

 

 구조체 변수가 있을 때, 필드로 접근하기 위해서, 구조체변수.필드 이름을 씁니다. 이 때, "."을 맴버 접근 연산자라고 합니다. 학생 배열 s가 선언되었습니다. 그러면 s[0]은 구조체 student의 변수입니다. s[0]의 맴버 요소 name에 접근하기 위해서, 어떻게 했나요? s[0].name을 썼습니다. score[0]에 접근하려면 어떻게 하면 될까요? s[0].score[0] 이렇게 쓰시면 됩니다.

 

 하나 궁금한 게 있습니다. 0번째, 1번째 과목은 알기 힘들지 않나요? 차라리 Math, English, ... 이런 식으로 지정해주면 조금 더 알아보기 쉬울 거 같은데요. Enum, 열거형을 이용하면 되는데요. 이것은 다음에 알아보도록 하겠습니다. 오늘은, 구조체가 무엇인지 정도만 아셔도 좋겠습니다.