본문 바로가기

데이터구조

데이터구조 8차시: 구조체와 typedef

반응형
SMALL


구조체 (Struct)

C언어에서 구조체를 이용하면,

데이터형이 다른 여러 데이터를 묶어서

새로운 데이터형을 만들 수 있다.


예를들어, 

int와 char 데이터를 하나씩 묶어서

새로운 데이터 타입을 만드는 것은

아래와 같이 할 수 있다.

struct A

{

   int a;

   char c;

};


이렇게 하면, 

새로운 데이터형 struct A가

생겨나게 된다.


이를 사용하는 방법은 다음과 같다.

struct A x;

x.a = 10;

x.c = 'h'; 

sturct A가 데이터형이므로,

x는 struct A형의 변수가 된다.

그리고,

x 안에는 int를 저장하는 a가 있고,

또 char를 저장하는 c가 있는 것이다.

따라서,

각각을 x.a와 x.c로 부르고,

그곳에 값을 넣거나, 읽는 것은 일반 변수와 

똑같이 하면 된다.


구조체변수 대입( Assignment)

여기까지는 일반적인

구조체 정의와 사용법에 대한 얘기이니

별로 새롭지는 않다.

그런데, 아래 프로그램은 조금 생소할 수도 있다.


line 11:

구조체 변수 m과 n을 만들었다.

line 12-13.

m에 데이터를 채워넣는다. n에는 아무 것도 안 들어간 상태이다

line 14:

m을 그대로 n에 대입하면, 구조체 속의 a는 a로, 

c는 c로 자동 대입된다.

line 15:

대입된 결과를 n을 출력해 봄으로써 알 수 있다.


구조체변수 비교 (Comparison): 이건 불가능

대입(assignment)는 당연하게 느껴지겠지만,

비교도 당연히 되리라고 생각해서는 안된다.

아래 프로그램을 보자.

구조체 변수 m과 n이 서로 같은지 

line 16에서 비교하려고 하고 있다.

그런데, 컴파일 과정에서 "이러시면 안됩니다."하고 오류 메시지가 발생한다.


구조체변수끼리의 비교를 하려면,

멤버변수 별로 해야 한다.

아래 프로그램처럼 말이다.

line 16을 보면

구조체 변수 n과 m이 서로 같은지를 비교하기 위해

멤버 a는 a끼리,

멤버 c는 c끼리 비교하고 있다.


자기참조 구조체 (Self Referential Struct)

이것이 무엇인고,

말도 안되는 거 하나를 보자.

struct A

{

   int k;

   struct A a;

};

무엇이 이상한가 하면,

struct A를 정의하고 있는데,

그 안에 자기자신을 포함하고 있다.

아직 자기자신이 다 생기지도 않았는데, 

자기자신이 그 안에 들어있으면,

어쩌라는 말이냐,, 이건 마치 무한 recursion과 같은 일이다.

결론부터 말하면, 이런 구조체는 생길 수가 없다.


그런데,,,

,,,

,,, 기대하시라,,

이런 건 가능하다.

struct A

{

   int k;

   struct A *a;

};

무엇이 달라졌는가?

자기자신을 포함하는 대신에,

자기자신처럼 생긴 것에 대한 주소를 저장하고 있다.

즉,

변수 a는 포인터다.

struct A 타입의 데이터가 저장된 곳의 주소를 저장하는 포인터 변수이다.

갑자기 철학적 질문이 된다.

나는 나를 품지 못하되,

나처럼 생긴 애가 어디있는지 가리키는 손가락은 가질 수 있구나.

이런 것을 소위

자기참조 구조체 (Self referential struct)라고 한다.

이것은 앞으로 데이터구조에서

아주 많이 사용되니 개념을 잘 이해하고 넘어가야 한다.


혹시 이해에 도움이 될까 싶어,

발로 그린 그림이지만, 올려본다.

포인터 변수 a가 다른 struct A형의 데이터의 주소를 가리키는 것을 보여준다.



구조체에 대해서 설명합니다.



반응형
LIST