Skip to Content
💻 코리아IT아카데미 신촌 - 프로그래밍 학습 자료
C++ 프로그래밍Unit 9: 구조체와 사용자 정의 타입Topic 1: 구조체 기초

Topic 1: 구조체 기초 🏗️

🎯 학습 목표

  • 구조체의 개념과 필요성을 이해할 수 있다
  • 구조체를 선언하고 멤버에 접근하는 방법을 익힐 수 있다
  • 구조체를 활용한 실제 프로그램을 작성할 수 있다
  • 구조체와 기본 타입의 차이점을 설명할 수 있다

🤔 구조체가 왜 필요할까요?

학생의 정보를 저장한다고 생각해보세요. 이름, 나이, 성적을 각각 다른 변수로 관리한다면 어떨까요?

// ❌ 비효율적인 방법 string student1_name = "김철수"; int student1_age = 20; double student1_grade = 3.8; // 학생이 여러 명이라면...? string student2_name = "이영희"; int student2_age = 19; double student2_grade = 4.2;

문제점: 관련된 데이터가 흩어져 있어 관리하기 어려워요!

해결책: **구조체(struct)**로 관련된 정보를 하나로 묶어서 관리할 수 있습니다! 📦

📚 구조체란 무엇인가?

구조체는 서로 다른 타입의 데이터들을 하나로 묶어서 새로운 자료형을 만드는 것입니다.

비유로 이해하기: 📦 택배 상자처럼 생각해보세요!

  • 택배 상자 = 구조체
  • 상자 안의 각 물건 = 멤버 변수
  • 물건의 실제 내용 = 데이터

하나의 상자에 이름표, 주소, 전화번호를 함께 넣어두면 관리가 쉬워지죠!

🔧 구조체 선언하기

기본 문법

struct 구조체이름 { 데이터타입 멤버변수1; 데이터타입 멤버변수2; // ... }; // 세미콜론 필수!

간단한 예제: 학생 정보 구조체

#include <iostream> #include <string> using namespace std; // 학생 정보를 담는 구조체 정의 struct Student { string name; // 이름 int age; // 나이 double grade; // 학점 }; int main() { // 구조체 변수 만들기 Student student1; student1.name = "김철수"; student1.age = 20; student1.grade = 3.8; // 정보 출력 cout << "이름: " << student1.name << endl; cout << "나이: " << student1.age << "세" << endl; cout << "학점: " << student1.grade << endl; return 0; }

🎨 구조체 초기화 방법들

1. 개별 대입

Student s1; s1.name = "김철수"; s1.age = 20; s1.id = "2024001"; s1.grade = 3.8;

2. 중괄호를 이용한 초기화

// 순서대로 한번에 초기화 Student s2 = {"이영희", 19, 4.2}; // 일부만 초기화 (나머지는 기본값) Student s3 = {"박민수", 21}; // grade는 0.0으로 초기화

🏪 실전 예제: 상품 정보 관리

구조체 없이 상품을 관리한다면?

// ❌ 흩어져 있는 정보들 string product_name = "노트북"; int product_price = 800; bool product_available = true;

구조체로 깔끔하게!

struct Product { string name; int price; bool available; }; // ✅ 관련된 정보를 하나로 묶음 Product laptop = {"노트북", 800, true}; Product mouse = {"마우스", 30, false};

구조체 함수 활용 패턴

// 구조체를 받는 함수 void displayProduct(const Product& p) { // 참조로 받기 (효율적) cout << p.name << ": " << p.price << "만원" << endl; } // 구조체를 수정하는 함수 void applyDiscount(Product& p, double rate) { // 참조로 받아서 수정 p.price *= (1.0 - rate); // 할인 적용 } // 구조체를 반환하는 함수 Product createProduct(string n, int s, double p) { Product newProduct = {n, s, p, true}; return newProduct; // 구조체 전체를 반환 }

왜 이것이 중요한가?

🔗 관련 데이터를 묶어서 실수를 줄입니다
📦 하나의 단위로 쉽게 전달하고 저장할 수 있습니다
🔧 유지보수가 쉬워집니다 - 새 필드 추가도 간단!
📖 코드 가독성이 향상됩니다 - 의미가 명확해집니다

🎮 구조체 설계 원리: 게임 캐릭터

좋은 구조체 설계란?

게임 캐릭터를 예로 구조체 설계 원리를 알아보겠습니다:

// 기본 캐릭터 정보 struct Character { string name; // 이름 int level; // 레벨 int currentHP; // 현재 체력 int maxHP; // 최대 체력 int attack; // 공격력 int defense; // 방어력 };

구조체 설계 원칙

1. 관련있는 데이터끼리 묶기

// ❌ 관련없는 것들을 섞으면 안됨 struct BadExample { string playerName; int score; string weatherToday; // 게임과 무관한 데이터! double playerHeight; }; // ✅ 관련있는 캐릭터 정보만 struct Character { string name; int level; int hp; int attack; };

2. 의미있는 이름 사용

// ❌ 의미없는 이름 struct Data { int a, b, c, d; }; // ✅ 명확한 의미 struct Character { string name; int level; int health; int mana; };

3. 적절한 데이터 타입 선택

struct Character { string name; // 문자열: 이름 int level; // 정수: 레벨 (1, 2, 3...) double healthPercent; // 실수: 체력 비율 (0.0~1.0) bool isAlive; // 불린: 생존 여부 };

구조체로 함수 개선하기

// 구조체 없이 (복잡함) void attackMonster(string name, int& hp, int& attack, int damage) { // 여러 매개변수 관리가 복잡 } // 구조체 사용 (깔끔함) void takeDamage(Character& player, int damage) { player.currentHP -= damage; if (player.currentHP < 0) { player.currentHP = 0; } }

🤔 생각해보기

왜 구조체가 필요할까요?

  1. 데이터 정리: 흩어진 변수들을 하나로 모음
  2. 실수 방지: 관련 데이터를 빼먹을 가능성이 줄어듦
  3. 코드 재사용: 같은 구조를 여러 곳에서 사용 가능
  4. 유지보수: 구조 변경이 한 곳에서만 이루어짐

간단한 실습

#include <iostream> using namespace std; struct Book { string title; string author; int pages; double price; }; int main() { // 여기에 코드를 작성하세요 // 1. Book 구조체 변수를 하나 만들기 // 2. 적절한 값으로 초기화하기 // 3. 책 정보를 출력하기 return 0; }

💡 구조체 사용 시 주의사항

1. 세미콜론 필수

struct Student { string name; int age; }; // ← 이 세미콜론을 잊지 마세요!

2. 멤버 접근 연산자

Student s; s.name = "김철수"; // 점(.) 연산자 사용

3. 초기화되지 않은 멤버

struct Test { int a; int b; }; Test t; // a, b는 쓰레기 값을 가질 수 있음 cout << t.a; // ❌ 위험한 코드! // ✅ 올바른 방법 Test t2 = {0, 0}; // 또는 Test t3{}; // 기본 초기화

🧪 퀴즈 타임!

🤔 퀴즈 1: 다음 구조체 선언에서 잘못된 점은?

struct Book string title; int pages; double price; }

정답: 중괄호 뒤에 세미콜론(;)이 없습니다!

struct Book { string title; int pages; double price; }; // ← 세미콜론 필수!

🤔 퀴즈 2: 다음 코드의 출력 결과는?

struct Point { int x; int y; }; Point p = {10, 20}; cout << p.x + p.y;

정답: 30

p.x는 10, p.y는 20이므로 10 + 20 = 30이 출력됩니다.

🤔 퀴즈 3: 부분 초기화의 결과는?

struct Data { int a; int b; int c; }; Data d = {5, 10}; cout << d.a << " " << d.b << " " << d.c;

정답: 5 10 0

a는 5, b는 10으로 초기화되고, c는 명시되지 않아 0으로 기본 초기화됩니다.

🎯 연습 문제

연습 1: 도서 관리 시스템

책의 정보(제목, 저자, 페이지 수, 가격)를 담는 구조체를 만들고, 3권의 책 정보를 입력받아 출력하는 프로그램을 작성하세요.

💡 힌트

  • Book 구조체를 정의하세요
  • 배열이나 vector를 사용해서 여러 책을 저장하세요
  • 반복문을 사용해서 입력과 출력을 처리하세요

연습 2: 성적 관리 프로그램

학생의 정보(이름, 국어, 영어, 수학 점수)를 저장하는 구조체를 만들고, 총점과 평균을 계산하여 출력하는 프로그램을 작성하세요.

💡 힌트

  • 구조체에 총점과 평균을 계산하는 멤버를 추가하거나
  • 별도의 함수를 만들어서 계산하세요

연습 3: 직원 정보 시스템

직원의 정보(이름, 부서, 입사년도, 연봉)를 관리하는 구조체를 만들고, 근무 년수를 계산하여 표시하는 프로그램을 작성하세요.

💡 힌트

  • 현재 년도에서 입사년도를 빼면 근무 년수를 구할 수 있습니다
  • ctime 라이브러리를 사용하면 현재 년도를 얻을 수 있습니다

🎉 마무리

구조체는 C++에서 데이터를 효율적으로 관리하는 핵심 도구입니다!

오늘 배운 내용:

  • 🏗️ 구조체의 개념과 필요성
  • 📝 구조체 선언과 초기화 방법
  • 🔧 멤버 접근 연산자 사용법
  • 💻 실전 프로그래밍 예제들

다음 단계:

  • Topic 2에서는 구조체 배열과 포인터를 학습합니다
  • 구조체를 더 효율적으로 다루는 방법을 배우게 됩니다
  • 동적 메모리 할당과의 조합도 살펴볼 예정입니다

구조체를 잘 이해했다면, 이제 더 복잡한 데이터 구조를 다룰 준비가 된 것입니다! 💪

Last updated on