티스토리 뷰
<구조체(struct)> #구조체 개념 # 구조체 사용법 # typedef
wisecow 2017. 8. 9. 14:38배열(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;
이번에는 위에서 생성된 person1과 person2을 비교할 상황이 주어졌다고 생각해보자. person1과 person2가 같으면 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번 써주면 된다.
'Develop Story > Data Structure & Algorithm' 카테고리의 다른 글
<사고력 훈련 문제 #4>: 배열 뒤집기 문제 (0) | 2017.08.11 |
---|---|
<공용체(union)> #공용체 개념 (0) | 2017.08.09 |
<2차원 배열>: 기본 개념과 동적 할당 예제 코드 (0) | 2017.08.09 |
<Dijkstra의 최단 경로 알고리즘> 기본개념과 알고리즘 (5) | 2017.08.08 |
<사고력 훈련 문제 #3>: 집합 S의 멱집합(부분 집합들의 집합) 구하기 (0) | 2017.08.07 |
- Total
- Today
- Yesterday