구조체 임베딩
Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 28번째.
C++ 또는 Java와 같은 객체 지향 언어에서 상속을 사용하면 클래스가 부모 클래스의 속성을 획득할 수 있습니다. C에는 기본 제공 상속이 없지만, 한 구조체를 다른 구조체 안에 배치하는 컴포지션이라는 기법을 사용하여 이를 시뮬레이션할 수 있습니다.
아이디어는 간단합니다. Child에 Parent의 모든 속성이 필요하다면, Parent 구조체를 Child의 멤버로 포함합니다.
typedef struct {
int id;
char name[50];
} Parent;
typedef struct {
Parent parent; // 내장 구조체
int grade;
} Child;여기서 Child에는 Parent가 가진 모든 것이 포함되며, 여기에 자체 grade 필드가 추가됩니다. 이것이 컴포지션입니다. 자식은 부모 "이다"라기보다 부모를 "가진다"고 할 수 있지만, 그 효과는 상속과 유사합니다.
자식 인스턴스를 통해 부모의 member에 access하려면 dot 연산자를 두 번 사용합니다:
Child c;
c.parent.id = 101;
c.parent.name[0] = 'A';
c.grade = 5;이 패턴은 C에서 타입 계층 구조를 구축하기 위한 토대를 형성합니다. base 구조체를 first member로 임베드하면, 다음 강의에서 살펴볼 강력한 기법을 활용할 수 있습니다.
챌린지
쉬움C에서 상속의 기반인 구조체 임베딩을 보여 주는 간단한 employee 관리 시스템을 만들어 보겠습니다.
Employee가 Person을 포함하는 계층 구조를 만들게 됩니다. 이는 상속이 작동하는 방식을 보여 줍니다. employee는 추가적인 직무 관련 information을 가진 "is a" person입니다. Person struct를 Employee 내부에 임베드하면 person의 모든 속성과 employee별 필드를 얻을 수 있습니다.
코드를 세 개의 파일로 구성합니다.
types.h: 여기에서 include guard와 함께 두 struct를Define합니다. 먼저 두 개의 필드를 가진Personstruct를 만듭니다. 필드는name(50개의character로 이루어진charactersarray)과age(integer)입니다. 그런 다음Person을 첫 번째member로 임베드하고employee_id필드(integer)를 추가하는Employeestruct를define합니다.types.c:Employee에 대한 pointer를 받아 해당 employee의information을 출력하는print_employee라는Function을Implement합니다. 학습한 연결된 dot/arrow 구문을 사용하여 임베드된 person의 data에Access합니다.main.c:Employeevariable을 만들고 임베드된 person의name과age를 포함한 모든 필드를Populate한 다음,Printfunction을 사용하여information을 표시합니다.
세 가지 입력을 받습니다. employee의 name(string), age(integer), 그리고 employee ID(integer)입니다.
여러분의 print_employee function은 다음 형식으로 employee의 information을 출력해야 합니다.
Employee: Alice
Age: 28
ID: 1001여기서 Alice는 name, 28은 age, 1001은 입력으로 받은 employee ID입니다.
임베드된 struct의 멤버에 parent member를 통해 Access해야 한다는 점을 기억하세요. 예를 들어 name에 접근하려면 먼저 person member를 거쳐야 합니다.
직접 해보기
#include <stdio.h>
#include <string.h>
#include "types.h"
int main() {
// 입력 읽기
char name[50];
int age;
int employee_id;
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = '\0'; // 개행 제거
scanf("%d", &age);
scanf("%d", &employee_id);
// TODO: Employee 변수 생성
// TODO: 포함된 person의 name과 age 채우기
// Hint: name에는 strcpy를 사용하고, employee.person.name으로 접근
// TODO: employee_id 설정
// TODO: employee에 대한 포인터로 print_employee 호출
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러