본문 바로가기
C++/뇌를 자극하는 C++

[C++] 챕터 10 - 구조체 : 다양한 타입의 정보를 한 곳에 모으는 법

by Minkyu Lee 2023. 4. 27.

// 10-1 : 구조체의 정의

#include <iostream>
using namespace std;

// 구조체 정의
struct StudentInfo
{
    char bloodType; // 혈액형
    int stdNumber; // 학번
    float grade; // 평점
};

int main()
{
    // 구조체 타입의 '변수' 정의
    StudentInfo si1;
    StudentInfo si2;

    return 0;
}

/*
--- 결과 ---

------
구조체의 가장 중요한 목표는 여러가지 변수를 그룹처럼 만드는 것이다.
main함수 안에서도 정의할 수 있다.
그러나 밖에서 정의하는 것이 일반적이다.

구조체 정의는 붕어빵 틀이다.
구조체 변수 정의는 붕어빵이다.

구조체 정의시 별도 메모리 공간이 할당되지 않는다.
구조체 '변수' 정의시에 메모리 공간이 할당된다.

구조체는 사용자 정의 타입이다. (User Defined Type)
*/

 

// 10-2 : 구조체의 멤버에 접근하기

#include <iostream>
using namespace std;

// 구조체 정의
struct StudentInfo
{
    char bloodType; // 혈액형
    int stdNumber; // 학번
    float grade; // 평점
};

int main()
{
    // 구조체 타입의 '변수' 정의
    StudentInfo si1;
    StudentInfo si2;

    // 값 넣기
    si1.bloodType = 'O';
    si1.stdNumber = 20031128;
    si1.grade = 3.5f;

    si2.bloodType = 'A';
    si2.stdNumber = 19961219;
    si2.grade = 2.3f;

    // 출력
    cout << si1.stdNumber << "\n";
    cout << si1.grade << "\n";
    cout << si1.bloodType << "\n";

    cout << si2.stdNumber << "\n";
    cout << si2.grade << "\n";
    cout << si2.bloodType << "\n";

    return 0;
}

/*
--- 결과 ---
20031128
3.5
O

19961219
2.3
A

------
// 기초 설명
구조체에 담기는 변수들을
멤버 혹은 멤버변수 라고 부른다.

구조체 변수 이름 쓴 후 점(Dot)을 찍어 접근한다.

// 멤버 각각 출력한 이유
cout << si1 과 같이 출력하지 않는 이유는?
오류가 발생한다.
cout 객체가 si1을 어떻게 출력할지 모른다.

이것이 기본타입과 사용자 지정 타입의 차이다.
어떻게 출력할지 컴퓨터에게 방법을 알려주어야한다.
이 방법은 27장에서 다룬다.

*/

 

// 10-3 : 구조체의 초기화

#include <iostream>
using namespace std;

// 구조체 정의
struct StudentInfo
{
    char bloodType; // 혈액형
    int stdNumber; // 학번
    float grade; // 평점
};

int main()
{
    // 구조체 변수 정의
    StudentInfo si1 = { 'O', 20031128, 3.5f };
    StudentInfo si2 = { 'A', 19961219, 2.3f };

    // 값 출력
    cout << si1.stdNumber << "\n";
    cout << si1.grade << "\n";
    cout << si1.bloodType << "\n";

    cout << si2.stdNumber << "\n";
    cout << si2.grade << "\n";
    cout << si2.bloodType << "\n";

    return 0;
}

/*
--- 결과 ---
20031128
3.5
O

19961219
2.3
A

------
구조체의 초기화이다.
구초제의 변수를 정의하면서, 멤버의 값을 초기화하는 것을 말한다.
배열 초기화와 비슷하다.

변수를 정의할 당시 외에는 사용할 수 없다.
배열도 마찬가지이다.
*/

 

// 10-4 : 구조체의 대입

#include <iostream>
using namespace std;

int main()
{
    // 구조체 정의
    struct Point
    {
        int x;
        int y;
    };

    Point pt1 = { 30, 50 };
    Point pt2;
    pt2 = pt1;

    cout << pt1.x << pt1.y << "\n";
    cout << pt2.x << pt2.y << "\n";

    return 0;
}

/*
--- 결과 ---
3050
3050


------
main 함수 안에서도 구조체 정의가 가능하다.
약간의 차이는 있다. 뒤에서 설명한다.
구조체 대입은 변수의 대입과 사용법 동일하다.

*/

 

// 10-5 : 구조체와 변수의 정의를 동시에 하기

#include <iostream>
using namespace std;

int main()
{
    // 구조체 정의
    struct Point
    {
        int x;
        int y;
    } pt1 = { 30, 50 }, pt2; // 구조체의 정의와 구조체 변수의 정의를 한번에 한다.
    pt2 = pt1;

    cout << pt1.x << pt1.y << "\n";
    cout << pt2.x << pt2.y << "\n";

    return 0;
}

/*
--- 결과 ---
3050
3050


------
- 구조체 정의와 변수 정의 동시에 하는 경우가 많진 않다.

- 위 코드는 다음과 동일하다.
    struct Point
    {
        int x;
        int y;
    };
    pt1 = { 30, 50 }, pt2;

- 동시에 정의시 구조체 이름 생략 가능하다.
    struct
    {
        int x;
        int y;
    } pt1 = { 30, 50 }, pt2;
하지만 이후에 또 다른 구조체 변수를 만들 수 없다. 이름이 없기 때문이다.

- 구조체의 정의와 구조체 변수의 정의는 서로 다른 종류의 파일에 담는 것이 일반적이다.
*/

 

댓글