Skip to Content
💻 코리아IT아카데미 신촌 - 프로그래밍 학습 자료
C++ 프로그래밍Unit 10: 클래스와 객체Topic 1: 클래스의 탄생

Topic 1: 클래스의 탄생 - 구조체에서 클래스로 🚀

🎯 학습 목표

  • 구조체의 한계점과 클래스의 필요성을 이해할 수 있다
  • 클래스와 객체의 개념을 명확히 구분할 수 있다
  • 클래스를 선언하고 객체를 생성하는 방법을 익힐 수 있다
  • 구조체와 클래스의 차이점을 설명할 수 있다

🤔 구조체의 한계점

지난 시간에 배운 구조체, 기억나시나요? 구조체는 관련된 데이터를 묶어주는 훌륭한 도구였죠!

하지만 구조체에는 아쉬운 점이 있었어요:

struct BankAccount { string owner; double balance; }; int main() { BankAccount myAccount; myAccount.owner = "김철수"; myAccount.balance = 1000000; // 😱 문제점: 누구나 잔액을 직접 수정 가능! myAccount.balance = -999999; // 말도 안 되는 값! return 0; }

문제점들:

  • 🔓 데이터가 완전히 노출되어 있음
  • ❌ 잘못된 값을 막을 방법이 없음
  • 🤷 데이터를 처리하는 함수가 구조체와 분리되어 있음

🎨 클래스의 등장!

클래스는 구조체의 이러한 문제들을 해결하기 위해 탄생했습니다!

클래스는 데이터와 그 데이터를 처리하는 함수를 하나로 묶은 것입니다.

붕어빵 틀과 붕어빵 🍥

클래스와 객체의 관계를 이해하는 가장 쉬운 방법:

  • 클래스 = 붕어빵 틀 (설계도)
  • 객체 = 붕어빵 (실제 만들어진 것)
// 클래스 = 붕어빵 틀 class FishBread { // 붕어빵의 속성과 기능 정의 }; // 객체 = 실제 붕어빵 FishBread bread1; // 팥 붕어빵 FishBread bread2; // 슈크림 붕어빵 FishBread bread3; // 피자 붕어빵

📝 첫 번째 클래스 만들기

기본 문법

class 클래스이름 { public: // 공개 영역 // 멤버 변수 // 멤버 함수 private: // 비공개 영역 // 보호할 데이터 }; // 세미콜론 필수!

실습: 게임 캐릭터 클래스

#include <iostream> #include <string> using namespace std; // 게임 캐릭터 클래스 class GameCharacter { public: // 공개 영역 - 외부에서 접근 가능 // 멤버 변수 string name; int level; // 멤버 함수 void introduce() { cout << "안녕하세요! 저는 " << name << "입니다!" << endl; cout << "현재 레벨: " << level << endl; } void levelUp() { level++; cout << name << "의 레벨이 올랐습니다! 🎉" << endl; cout << "현재 레벨: " << level << endl; } }; int main() { // 객체 생성 (캐릭터 생성) GameCharacter hero; hero.name = "용사"; hero.level = 1; // 멤버 함수 호출 hero.introduce(); hero.levelUp(); hero.levelUp(); // 또 다른 캐릭터 생성 GameCharacter wizard; wizard.name = "마법사"; wizard.level = 5; wizard.introduce(); return 0; }

실행 결과:

안녕하세요! 저는 용사입니다! 현재 레벨: 1 용사의 레벨이 올랐습니다! 🎉 현재 레벨: 2 용사의 레벨이 올랐습니다! 🎉 현재 레벨: 3 안녕하세요! 저는 마법사입니다! 현재 레벨: 5

🔄 구조체 vs 클래스

개선된 은행 계좌 예제

#include <iostream> #include <string> using namespace std; // 클래스로 개선한 은행 계좌 class BankAccount { private: // 비공개 영역 - 직접 접근 불가! string owner; double balance; public: // 공개 영역 - 외부에서 사용 가능 // 계좌 개설 void createAccount(string name, double initialAmount) { owner = name; if (initialAmount >= 0) { balance = initialAmount; cout << owner << "님의 계좌가 개설되었습니다! 💳" << endl; } else { balance = 0; cout << "초기 금액이 잘못되었습니다. 0원으로 설정합니다." << endl; } } // 입금 void deposit(double amount) { if (amount > 0) { balance += amount; cout << amount << "원 입금 완료! 💰" << endl; } else { cout << "입금 금액이 잘못되었습니다! ❌" << endl; } } // 출금 void withdraw(double amount) { if (amount > 0 && amount <= balance) { balance -= amount; cout << amount << "원 출금 완료! 💸" << endl; } else { cout << "출금할 수 없습니다! ❌" << endl; } } // 잔액 조회 void checkBalance() { cout << owner << "님의 잔액: " << balance << "원" << endl; } }; int main() { BankAccount myAccount; // 계좌 개설 myAccount.createAccount("김철수", 10000); // 정상적인 거래 myAccount.deposit(5000); myAccount.checkBalance(); // 잘못된 거래 시도 - 클래스가 보호해줌! myAccount.deposit(-1000); // 거부됨 myAccount.withdraw(100000); // 거부됨 myAccount.checkBalance(); return 0; }

🎯 클래스의 장점

1. 📦 캡슐화 (Encapsulation)

데이터와 기능을 하나로 묶어서 관리합니다.

2. 🔒 정보 은닉 (Information Hiding)

중요한 데이터를 보호하고 안전한 방법으로만 접근하게 합니다.

3. 🎨 추상화 (Abstraction)

복잡한 내부 구현을 숨기고 쉬운 인터페이스만 제공합니다.

4. ♻️ 재사용성 (Reusability)

한 번 만든 클래스를 여러 곳에서 재사용할 수 있습니다.

💡 핵심 정리

  • 클래스: 객체를 만들기 위한 설계도 (틀)
  • 객체: 클래스로부터 만들어진 실체
  • 멤버 변수: 클래스 안의 데이터
  • 멤버 함수: 클래스 안의 함수
  • public: 외부에서 접근 가능
  • private: 클래스 내부에서만 접근 가능

✅ 실습 체크리스트

🚀 다음 시간 예고

다음 시간에는 캡슐화와 접근 제어에 대해 더 자세히 알아볼 거예요!

  • public, private, protected의 차이점
  • getter/setter 메서드 패턴
  • 왜 데이터를 숨겨야 하는지

“클래스는 객체지향 프로그래밍의 시작입니다! 🎯”

Last updated on