본문 바로가기
컴퓨터 과학/데이터 구조

구조와 함수: 프로그래밍의 기본

by 그마곤 2023. 11. 26.
반응형

프로그래밍의 핵심인 구조와 함수에 대한 이해는 연결 리스트, 스택, 큐와 같은 주제를 다루기 위한 기반이 됩니다. 여러 글을 통해 구조와 함수의 복잡성과 핵심 개념을 다루며, 오늘은 Structures and Fuctions의 첫 부분을 다루겠습니다.

구조와 함수: 프로그래밍의 기본
구조와 함수: 프로그래밍의 기본

구조: 데이터의 묶음과 유연성

구조(Structure)는 프로그래밍에서 사용되는 중요한 개념 중 하나로, 서로 다른 데이터 유형의 요소들을 하나의 논리적인 단위로 묶을 수 있는 사용자 정의 데이터 형식입니다.

구조의 특징

  • 사용자 정의 데이터 형식: 개발자가 직접 정의하는 데이터 유형이며, 다양한 데이터 유형의 요소들을 통합하여 새로운 유형을 생성합니다.
  • 다양한 유형의 요소 묶기: 구조는 서로 다른 데이터 유형의 여러 요소들을 하나의 구조체로 묶을 수 있습니다. 예를 들어, 학생 정보를 나타내는 구조체는 이름(String), 나이(int), 학번(int), 성적(float) 등 다양한 유형의 요소를 포함할 수 있습니다.
  • 메모리 구조 유연성: 각 요소는 메모리에 연속적으로 배치되며, 이는 데이터의 효율적인 관리와 접근을 가능하게 합니다.

구조 사용 예시

C 프로그래밍에서의 구조체 사용 예시를 통해 구조의 실제 활용을 이해할 수 있습니다. 아래는 학생 정보를 저장하는 구조체의 예시입니다.

struct Student {
    char name[50];
    int age;
    int rollNumber;
    float marks;
};

위의 예시에서 struct Student는 학생 정보를 담는 구조체를 정의하고 있습니다. name은 문자열, age와 rollNumber는 정수, marks는 소수점을 가진 숫자를 저장하는 요소입니다.

구조의 활용성

구조는 프로그램에서 복잡한 데이터를 효과적으로 구성하고 관리하는 데 사용됩니다. 예를 들어, 데이터베이스에서 레코드를 표현하거나, 그래픽 프로그래밍에서 점이나 선 등의 요소를 표현할 때 구조체가 활용됩니다.
 

구조 멤버와 주소 전달: 유연성과 메모리 관리

구조 멤버와 주소 전달은 프로그래밍에서 데이터를 전달하고 처리하는 중요한 측면입니다. 이는 구조체의 멤버(요소)를 함수에 어떻게 전달하며, 이를 통해 주소를 활용하여 어떤 작업을 수행하는지에 대한 내용을 다루고 있습니다.

구조 멤버 전달

구조 멤버를 함수에 전달하는 것은 구조체 내의 특정 데이터를 함수에 넘겨주는 것을 의미합니다. 예를 들어, 학생 정보를 담은 구조체가 있다면, 이름, 나이, 학번, 성적과 같은 멤버를 함수에 전달하여 다양한 작업을 수행할 수 있습니다.

void printStudentInfo(char name[], int age, int rollNumber, float marks) {
    printf("Name: %s\nAge: %d\nRoll Number: %d\nMarks: %.2f\n", name, age, rollNumber, marks);
}

int main() {
    struct Student {
        char name[50];
        int age;
        int rollNumber;
        float marks;
    };

    struct Student student1 = {"John Doe", 20, 12345, 85.5};
    printStudentInfo(student1.name, student1.age, student1.rollNumber, student1.marks);

    return 0;
}

위의 예시에서 printStudentInfo 함수에 구조체 멤버들을 개별적으로 전달하여 학생 정보를 출력하고 있습니다.

구조 멤버의 주소 전달

구조 멤버의 주소를 전달하는 것은 해당 멤버의 메모리 주소를 함수에 전달하는 것을 의미합니다. 이는 함수가 해당 주소를 통해 구조체의 멤버에 직접 접근할 수 있게 합니다. 이는 데이터의 사본을 만들지 않고도 메모리 효율적으로 작업할 수 있는 장점을 제공합니다.

void modifyStudentAge(int* agePointer) {
    (*agePointer)++; // 학생의 나이를 1 증가시킴
}

int main() {
    struct Student {
        char name[50];
        int age;
        int rollNumber;
        float marks;
    };

    struct Student student1 = {"Alice", 22, 54321, 90.0};
    printf("Before: %s's age is %d\n", student1.name, student1.age);

    modifyStudentAge(&(student1.age));

    printf("After: %s's age is %d\n", student1.name, student1.age);

    return 0;
}

위의 예시에서 modifyStudentAge 함수는 학생의 나이를 변경하는데, 이를 위해 나이 멤버의 주소를 전달하고 있습니다.

주소 전달의 장점

구조 멤버의 주소를 전달하는 것은 메모리 효율성을 높여주고 함수 간 데이터 공유를 용이하게 만듭니다. 데이터의 복사 없이도 함수 간에 효과적인 데이터 교환을 가능케 하여 프로그램의 성능을 향상합니다.
 

마무리

구조는 데이터의 조직화와 유지보수를 용이하게 만들어주며, 프로그램의 가독성과 확장성을 향상하는 데에 핵심적인 역할을 합니다. 따라서 구조를 잘 다루는 것은 효과적인 프로그래밍 스킬의 일환입니다. 구조 멤버와 주소 전달은 데이터의 효과적인 다루임을 가능케 하는 중요한 프로그래밍 개념입니다. 이를 잘 이해하고 활용하면 메모리를 효율적으로 사용하며, 유연하고 효과적인 프로그래밍을 구현할 수 있습니다.
 

반응형