Menu
Coddy logo textTech

구조체 임베딩

Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 28번째.

C++ 또는 Java와 같은 객체 지향 언어에서 상속을 사용하면 클래스가 부모 클래스의 속성을 획득할 수 있습니다. C에는 기본 제공 상속이 없지만, 한 구조체를 다른 구조체 안에 배치하는 컴포지션이라는 기법을 사용하여 이를 시뮬레이션할 수 있습니다.

아이디어는 간단합니다. ChildParent의 모든 속성이 필요하다면, 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로 임베드하면, 다음 강의에서 살펴볼 강력한 기법을 활용할 수 있습니다.

challenge icon

챌린지

쉬움

C에서 상속의 기반인 구조체 임베딩을 보여 주는 간단한 employee 관리 시스템을 만들어 보겠습니다.

EmployeePerson을 포함하는 계층 구조를 만들게 됩니다. 이는 상속이 작동하는 방식을 보여 줍니다. employee는 추가적인 직무 관련 information을 가진 "is a" person입니다. Person struct를 Employee 내부에 임베드하면 person의 모든 속성과 employee별 필드를 얻을 수 있습니다.

코드를 세 개의 파일로 구성합니다.

  • types.h: 여기에서 include guard와 함께 두 struct를 Define합니다. 먼저 두 개의 필드를 가진 Person struct를 만듭니다. 필드는 name(50개의 character로 이루어진 characters array)과 age(integer)입니다. 그런 다음 Person을 첫 번째 member로 임베드하고 employee_id 필드(integer)를 추가하는 Employee struct를 define합니다.
  • types.c: Employee에 대한 pointer를 받아 해당 employee의 information을 출력하는 print_employee라는 FunctionImplement합니다. 학습한 연결된 dot/arrow 구문을 사용하여 임베드된 person의 data에 Access합니다.
  • main.c: Employee variable을 만들고 임베드된 person의 nameage를 포함한 모든 필드를 Populate한 다음, Print function을 사용하여 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;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C 컴파일러