1. 구조체의 정의와 typedef 선언
# 'struct' 키워드를 생략할 수 있게 해주는 'typedef'
구조체는 여러 개의 다른 종류의 데이터를 하나로 묶는 방법이다.
예를 들어 '강아지' 라는 구조체에는 푸들, 치와와, 말티즈 등이 포함될 수 있고
'고양이' 라는 구조체에는 러시안 블루, 터키시 앙고라, 브리티시 숏헤어 등이 멤버로 포함될 수 있다.
일반적으로 c언어에서 구조체를 사용하려면 'struct' 키워드를 사용해야 한다.
그러나 매번 'struct 강아지', 'struct 고양이' 라고 쓰기 불편고 귀찮을 때 이를 'typedef'가 해결해준다.
' typedef struct { ...} 강아지; ' 라고 선언하면, 그 다음부터는 '강아지'만 사용해도 된다.
# typedef 사용안할 때
struct 강아지 {
char 푸들이름[10];
char 말티즈이름[10];
char 치와와이름[10];
};
struct 강아지 강아지1; // struct 키워드 또 사용해야 함
# typedef 사용할 때
typedef 강아지 {
char 푸들이름[10];
char 말티즈이름[10];
char 치와와이름[10];
};
강아지 강아지1; // struct 키워드 없어도 됨
그렇다면 왜 사용할까?
1. 같은 타입의 변수를 여러 개 선언할 때 유용하다.
2. 코드의 가독성을 높힌다.
3. 타입을 변경할 때도 한 곳만 수정하면 되니 편리하다.
또한 typedef 선언에 있어 새로운 이름의 부여는 가장 마지막에 등장하는 단어를 중심으로 이루어진다.
예를 들어 typedef 강아지1, 강아지2, 강아지3; 에서 '강아지3' 이 강아지1, 강아지2 에 부여된 새로운 이름이 되는 것이다. (강아지3 = 강아지1,강아지2)
마지막으로 typedef로 정의되는 자료형의 이름은 대문자로 적어야 한다. (int 선언인지, typedef INT 인지 구분할 수 있어야 하기 때문이다.)
# 구조체 정의와 typedef 선언
typedef의 이름을 지을 때 struct 선언과 구조체의 이름을 중복해서 사용할 수 있다.
'income' 이라는 이름을 가진 구조체는 다음과 같이 정의할 수 있다.
struct income
{
int rentfee;
int groceryfee;
};
income 구조체을 선언하면 다음과 같다.
struct income fee;
'income' 이라는 이름을 가진 typedef를 선언할 수 있다.
typedef struct income Income ;
Income fee;
결론적으로
struct income fee; == Income fee;
위의 과정을 한번에 정리하자면 다음과 같다.
typedef struct income
{
int rentfee;
int groceryfee;
} Income;
typedef 를 사용하면 구조체의 이름을 써도 되고 안써도 된다. 그 의미가 무색하기 때문이다.
단지 차이점이라면 구조체의 이름을 생략하면 구조체의 변수를 선언할 수 없고 구조체의 이름을 넣으면 구조체의 변수를 선언할 수 있다. 이는 편한대로 선택해서 사용하면 된다.
2. 함수로의 구조체 변수 전달과 반환
# 구조체 변수와 int형 변수 모두 인자 전달과 변수 반환 방법은 동일하다.
'구조체 변수' 는 여러 정보를 한데 모아둔 상자 같은 것이고 'int형 변수'는 숫자를 저장하는 작은 상자와 같다. 택배를 받을 때 택배의 크기나 내용물이 달라도 택배를 주문하고 받는 방법은 같은 것처럼 구조체 변수를 함수의 인자로 전달하거나 함수 내에서 return 문을 통해 구조체 변수를 반환하는 방법은 일반적인 'int형 변수'의 그것과 동일하다.
# 구조체 변수의 연산은 한정되어 있다.
구조체 변수에서 사용가능한 연산은 아래와 같다.
가. 대입연산
나. 주소 값 반환을 목적으로 하는 &연산
다. 구조체 변수의 크기를 반환하는 sizeof 연산
만약 사칙연산이 필요하면 함수를 만들어서 구현해야 한다.
3. 구조체의 유용함에 대한 논의와 중첩 구조체
# 왜 구조체가 유용할까?
가. 구조체가 없으면 하나의 배열에 모든 데이터를 저장할 수 없게 된다.
나. 출력한 데이터의 종류만큼 매개변수가 선언되지 않아도 된다.
# 중첩된 구조체의 정의와 변수의 선언
구조체 변수가 구조체의 멤버로 선언되는 것은 '중첩된 구조체'라고 한다.
4. 공용체 (Union Type)
# 구조체는 '각방사용' 공용체는 '합숙생활'
구조체는 'struct' 로 정의하고, 공용체는 'union'으로 정의한다.
구조체는 멤버가 각자의 방(메모리)을 가지고 있다면 공용체는 크기가 가장 큰 멤버에게만 방이 주어지고,
그 방에 나머지 멤버들이 함께 들어가 생활하는 것과 같다.
이러한 특징으로 인해 공용체는 하나의 메모리 공간을 여러 방식으로 접근 할 수 있다는 특징이 있다.
# 열거형의 정의와 의미(Enumerated Type)
열거형이란, 변수에 저장이 가능한 값을 열거형으로 정해두는 것이다.
예를 들어 'rainbow 라는 이름을 가진 변수에는 1,2,3,4,5,6,7 만 저장이 가능하다' 라고 선언하고 싶을 때 다음과 같이 선언할 수 있다.
enum rainbow
{
red=1 , orange=2 ,yellow=3, green=4, blue=5, navy=6, purple =7
};
'red = 1' 의 의미는 다음과 같다.
'red' 를 정수 1을 의미하는 상수로 정의하겠다.
그리고 이 값은 rainbow형 변수에 저장이 가능하다.
만약 열거형 상수의 값을 명시하지 않으면 첫번째 값을 0부터 차례대로 할당한다.
enum rainbow
{
red, orange, yellow, green
};
//red=0, oragne =1, yellow=2, green =3 이 할당된다.
그런데 어떤 값은 상수를 명시하고 어떤 값을 명시하지 않았을 때 그 상수가 연속적이지 않다면 그 전 상수의 값을 이어서 할당한다.
enum rainbow
{
red=3 , orange ,yellow=7, green
};
//oragne = 4, green = 8 이 할당된다.
열거형은 서로 연관있는 이름을 동시에 상수로 선언할 수 있어 가독성에 도움이 된다.
'윤성우의 C Programming' 카테고리의 다른 글
Chapter 27. 파일의 분할과 헤더파일의 디자인 (0) | 2024.02.12 |
---|---|
Chapter 26. 매크로와 선행처리기 (Preprocessor) (1) | 2024.02.12 |
C언어에서의 지역 변수와 스택 메모리 (1) | 2024.02.11 |
#include <stdlib.h> (1) | 2024.02.11 |
Chapter 25 : 메모리 관리와 메모리의 동적 할당 (0) | 2024.02.11 |