티스토리 뷰

 배열(Array)은 같은 타입의 데이터를 한 데 묶어 관리하게 해주는 자료구조라면, 구조체(Struct)는 서로 다른 타입의 데이터를 한 데 묶어 관리할 수 있게 해주는 자료구조다. 구조체(struct)는 다른 프로그래밍 언어에서 레코드(record)라고 불리기도 한다. 구조체의 예를 한 번 살펴보자.

struct {
	char name[10];
	int age;
	float salary;
} person;

구조체 문법을 통해 3개의 항목(fields)를 가지는 변수(variable) person을 만들었다. 구조체가 있기 전에는 변수라 하면, int형 혹은 float형 등 단일 변수를 의미했지만 이제는 다양한 자료를 한 데 묶어 하나의 변수로 취급할 수 있게 됐다. 위 구조체 변수 person이 가지는 3개의 항목은 각각 아래와 같다.

  • 사람의 이름이라는 의미로 쓰일 name이라는 char 배열

  • 사람의 나이라는 의미로 쓰일 age라는 int 값

  • 사람의 월급으로 사용될 salary라는 float 값 

     위의 각 필드에 대해 값을 할당하는 방법은 구조체 멤버 접근 연산자(structure member operator)인 .(comma)를 사용하는 것이다.  이 연산자를 사용하여 각 항목(fields)에 값을 할당해보면 아래와 같다.

    void main()
    {
    	strcpy(person.name, "sam");
    	person.age = 10;
    	person.salary = 35000;
    
    	printf("person.name = %s\n", person.name);
    	printf("person.age = %d\n", person.age);
    	printf("person.salary = %f\n", person.salary);
    }
    

    실제로 구조체를 선언하고 값을 출력하면 화면에 잘 찍히는 걸 알 수 있다. 구조체를 사용하는 방법에는 typedef 를 사용해서 사용자가 직접 자신만의 구조체를 만들 수 있는 방법도 존재한다. 사용자 정의라고도 하는데, typedef의 사용은 아래와 같다.

    typedef struct {
    	char name[10];
    	int age;
    	float salary;
    } human;
    

     typedef를 사용함으로써 알 수 있는 건 human구조체로 정의된 자료형이며 human을 이용해 변수를 생성할 수 있게 됐다는 점이다.


    human person1, person2;


     이번에는 위에서 생성된 person1person2을 비교할 상황이 주어졌다고 생각해보자. person1person2가 같으면 TRUE를 반환하고 다르면 FALSE를 반환하는 프로그램을 짜야하는데, 어떤 문장을 사용해야할까? if (person1 == person2) 와 같이 비교할 수 있는지에 대해 먼저 살펴보자. 결론부터 말하면 불가능하다.


     비교를 하기 위해서는 각각의 필드 값을 비교하는 수밖에 없다. 이름을 비교하는 경우라고 가정해보면,


    if (strcmp (person1.name, person2.name))

    printf("두 명의 사람의 이름이 같습니다.");

    else

    printf("두 명의 사람의 이름이 다릅니다.");


     와 같이 사용할 수 있다. 구조체 변수간의 직접적인 비교연산은 불가능하지만, 대입연산(assignment)은 가능하다. person1 = person2 와 같이 문장을 사용하면, person2에 있는 모든 필드의 값을 person1의 각 필드에 복사한다는 뜻이다. ANSI C 에서는 이처럼 구조체 대입연산을 허용하고 있다.


     구조체를 직접적으로 비교하는 것이 불가능하기에, 우리는 별도로 비교를 해줄 필요가 있다. 아래에 구조체를 비교하는 예시 함수를 작성해보았다.

    /*************************************************
     ** 구조체 비교 함수 struct compare function
    *************************************************/
    
    #define TRUE 1
    #define FALSE 0
    
    int humanEqual(human person1, human person2)
    {
    	/* 만약 두 명의 사람이 같은 사람이라면 TRUE를 아니면 FALSE를 리턴한다. */
    	
    	// strcmp는 두 개의 문자열이 같을 경우 0을 반환한다.
    	if (strcmp(person1.name, person2.name))
    		return FALSE;
    	
    	if (person1.age != person2.age)
    		return FALSE;
    	
    	if (person1.salary != person2.salary)
    		return FALSE;
    	
    	return TRUE;
    }
    
    /*************************************************
     ** End Line
    *************************************************/
    

     위에서 살펴본 구조체의 기능에 더해, 구조체 안에 구조체를 포함시키는 것도 가능하다. 아래와 같이 사용하면 된다.

    typedef struct {
    	int month;
    	int day;
    	int year;
    } birth;
    
    typedef struct {
    	char name[10];
    	int age;
    	float salary;
    	birth date;
    } human;
    

     만약 이렇게 구조체 안의 구조체를 포함시키지 않았다면, 너무 많은 변수가 한 구조체 안에 나열되어 있어 가독성이 떨어졌을 것이다. 구조체를 중첩해서 만들어낸 변수를 사용할 때는 아래와 같이 사용하면 된다.

    human person1, person2;
    	person1.date.month = 6;
    	person1.date.day = 16;
    	person1.date.year = 1993;
    

    구조체 멤버접근연산자를 2번 써주면 된다.

    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday