C의 struct와 C++의 class
이 레슨에서는 C의 struct와 C++의 class로 은행 계좌를 모델링해 두 방식의 차이를 알아봅니다.
소개
C의 struct는 관련된 데이터를 묶고, 그 데이터를 처리하는 함수는 따로 작성합니다. C++의 class는 데이터와 멤버 함수(member functions)를 하나의 타입으로 묶고, private으로 데이터를 숨겨 객체의 일관성을 지킬 수 있습니다.
핵심 정리
- 연산을 작성하기 전에 항상 참이어야 하는 조건(불변식)을 정하세요.
- 구조가 비어 있을 때, 가득 찼을 때, 메모리 할당에 실패했을 때를 처리하세요.
- 각 연산의 복잡도와 메모리 관리를 함께 따져 보세요.
C와 C++ 코드 예제
C
main.c
#include <stdio.h>
typedef struct {
const char *owner;
double balance;
} Account;
void deposit(Account *account, double amount) {
if (amount > 0) {
account->balance += amount;
}
}
int main(void) {
Account account = {"Ada", 100.0};
deposit(&account, 25.0);
printf("%s: %.2f\n", account.owner, account.balance);
return 0;
}
Ada: 125.00
C++
main.cpp
#include <iomanip>
#include <iostream>
#include <string>
#include <utility>
class Account {
std::string owner_;
double balance_;
public:
Account(std::string owner, double balance)
: owner_(std::move(owner)), balance_(balance) {}
void deposit(double amount) {
if (amount > 0) {
balance_ += amount;
}
}
void print() const {
std::cout << owner_ << ": " << std::fixed
<< std::setprecision(2) << balance_ << '\n';
}
};
int main() {
Account account("Ada", 100.0);
account.deposit(25.0);
account.print();
}
Ada: 125.00
C와 C++ 비교
C 버전의 deposit 함수는 struct Account를 가리키는 포인터를 받아 금액이 양수일 때만 더하지만, 어떤 코드든 balance를 직접 바꿀 수 있습니다. C++ 버전에서는 balance_가 public: 앞에 선언되어 기본적으로 private이므로 deposit() 같은 올바른 메서드로만 바뀝니다. 그래서 잔액이 아무렇게나 정해지는 것 같은 잘못된 상태가 되기 매우 어렵습니다.
C
데이터(struct)와 연산이 분리되어 있고, 메모리는 직접 할당하고 해제합니다.
C++
클래스와 컨테이너가 데이터의 일관성을 지키고 자원을 스스로 관리합니다.
연습 문제
두 버전을 모두 실행한 다음 코드를 바꿔 보면서 각 언어가 주는 안전성의 차이를 살펴보세요.
- 비어 있는 상태와 최대 용량에 이른 순간에 대한 테스트를 추가해 보세요.
- 메모리 해제 코드를 작성하고 누수가 없는지 확인해 보세요.
- 표준 라이브러리의 같은 역할을 하는 컨테이너와 복잡도를 비교해 보세요.
챌린지로 연습하기
이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.
모든 챌린지