하나 이상의 서로 다른 종류의 연관된 변수들을 묶어서 새로운 데이터 타입을 정의하는 것
// 구조체 선언
struct 구조체 이름{
자료형 변수명;
자료형 변수명;
};
// 구조체 멤버 변수 접근
구조체 변수명.구조체 멤버
사용 예시
struct Student{
char name[10]; // 구조체 멤버 name
int age; // 구조체 멤버 age
int height; // 구조체 멤버 height
} s1, s2; // 구조체 변수 s1, s2 선언
struct Student s3; // 구조체 변수 s3 선언
s1.name = "kim"; // s1의 구조체 멤버 name에 "kim" 대입
가장 큰 변수 크기만큼 메모리 공간이 할당되고, 나머지 변수들은 앞에서부터 메모리를 공유
union unTemp
{
char a;
int b;
double c;
}un;
열거형은 데이터들을 열거한 집합 enumeration의 약자(enum)
컴파일러는 열거형 멤버들을 정수형 상수로 취급
enum Week
{
sun = 0
mon
tue
wed
thu
fri
sat
};
int main()
{
int day;
scanf("요일을 선택하세요 : %d", &day);
switch(day){
case sun:
printf("일요일");
break;
case mon:
printf("월요일");
break;
case tue:
printf("화요일");
break;
case wed:
printf("수요일");
break;
case thu:
printf("목요일");
break;
case fri:
printf("금요일");
break;
case sat:
printf("토요일");
break;
default:
printf("잘못 입력하셨습니다.\n");
break;
}
}
열거형의 멤버들은 각 요일을 나타내며, 첫번째 멤버 sun을 0으로 설정하면 다음 멤버 mon은 1씩 증가
정적 할당 : 프로그램이 시작되기 전, 컴파일 시점에 코드를 읽고 메모리 공간을 확보하는 것
동적 할당 : 컴파일 시점이 아닌 프로그램이 실행되는 중인 런타임에 필요한 만큼의 메모리 공간을 확보하는 것
void* malloc(size_t size);
전달인자 size는 바이트 단위로 입력
void*
타입이 지정되지 않는 포인터(원하는 메모리 크기만큼 할당)
#include <stdio.h>
int main()
{
int num;
int *student;
printf("학생수를 입력하세요 : ");
scanf("%d", &num);
student = (int*)malloc(sizeof(int) * num)
if(student == NULL){
printf("메모리가 할당되지 않았습니다.\n");
return 0;
}
printf("할당된 메모리 크기 : %d\n", sizeof(int)*num);
free(student);
return 0;
}
복잡한 내부 구현은 감추고, 실제로 노출되는 인터페이스를 단순화하는 것
데이터와 메서드를 하나의 단위로 묶는 것으로, 클래스의 내부 정의에 대해 외부에서 볼 수 없도록 함
-> 외부로부터 데이터를 조작할 인터페이스가 필요