학습
C++ 클래스와 객체
C++ 클래스와 객체 — 중급
클래스와 객체
1. 도입 (왜 배워야 하는가)
C++에서 클래스와 객체는 객체 지향 프로그래밍(OOP)의 핵심 구성 요소입니다. OOP는 실제 세계의 사물과 개념을 프로그래밍적으로 모델링할 수 있게 해주어 복잡한 소프트웨어를 더 쉽게 관리하고 이해할 수 있도록 합니다.
클래스를 사용하면 데이터와 그 데이터를 처리하는 메서드를 하나의 단위로 묶을 수 있습니다. 이를 통해 코드의 재사용성과 유지보수성을 높일 수 있으며, 실무에서 복잡한 시스템을 설계하고 구현할 때 필수적인 기술입니다. 만약 클래스와 객체를 제대로 이해하지 못한다면, 복잡한 프로그램을 구현하는 데 어려움을 겪게 되고, 코드의 중복과 비효율성이 발생할 수 있습니다.
2. 핵심 개념 설명
- 클래스: 객체를 생성하기 위한 설계도입니다. 클래스는 객체의 속성(데이터)과 행동(메서드)을 정의합니다.
- 객체: 클래스의 인스턴스이며, 클래스에서 정의한 속성과 행동을 실제로 구현한 것입니다.
비유하자면, 클래스는 집을 설계하는 청사진과 같고, 객체는 그 청사진을 바탕으로 실제로 지어진 집입니다. 청사진이 없으면 집을 지을 수 없듯이, 클래스 없이 객체를 만들 수 없습니다.
용어 정리
| 용어 | 정의 |
|---|---|
| 클래스 | 객체를 생성하기 위한 설계도 |
| 객체 | 클래스의 인스턴스, 실제로 구현된 것 |
| 메서드 | 객체가 수행할 수 있는 행동 |
| 속성 | 객체가 가지는 데이터 |
3. 기본 코드 예제
다음은 클래스를 정의하고 객체를 생성하는 기본적인 예제입니다.
#include <iostream>
using namespace std;
// 클래스 정의
class Car {
public:
string brand; // 속성
int year; // 속성
// 메서드
void display() {
cout << "차량 브랜드: " << brand << ", 연식: " << year << endl;
}
};
int main() {
// 객체 생성
Car myCar;
myCar.brand = "현대";
myCar.year = 2021;
// 메서드 호출
myCar.display(); // 차량 브랜드: 현대, 연식: 2021
return 0;
}
실행 결과
차량 브랜드: 현대, 연식: 2021
코드 동작 설명
#include <iostream>: 입출력 스트림을 사용하기 위한 헤더 파일을 포함합니다.class Car:Car라는 이름의 클래스를 정의합니다.public:: 이 뒤에 오는 속성과 메서드는 클래스 외부에서 접근할 수 있도록 합니다.string brand;와int year;:Car클래스의 속성을 정의합니다.void display():Car클래스의 메서드를 정의합니다. 이 메서드는 차량의 브랜드와 연식을 출력합니다.int main(): 프로그램의 시작 점입니다.Car myCar;:Car클래스의 객체인myCar를 생성합니다.myCar.brand = "현대";와myCar.year = 2021;:myCar의 속성을 초기화합니다.myCar.display();:myCar객체의display()메서드를 호출하여 차량 정보를 출력합니다.- 잘못된 코드
- 올바른 코드
- 잘못된 코드
- 올바른 코드
- 클래스는 객체를 생성하기 위한 설계도이며, 객체는 그 설계도를 기반으로 만들어진 인스턴스입니다.
- 메서드와 속성을 통해 객체의 행동과 데이터를 정의할 수 있습니다.
- OOP를 활용하면 코드의 재사용성과 유지보수성을 높일 수 있습니다.
- 다음 단계로는 상속, 다형성 등을 학습하면 좋습니다. 이러한 개념은 클래스와 객체를 더욱 효과적으로 활용할 수 있게 도와줍니다.
4. 실전 활용 예제
예제 1: 쇼핑몰 장바구니 구현
쇼핑몰에서 장바구니 기능을 구현할 때, 각 상품을 나타내는 클래스를 만들고 장바구니를 구현할 수 있습니다.
#include <iostream>
#include <vector>
using namespace std;
class Product {
public:
string name;
double price;
Product(string n, double p) : name(n), price(p) {} // 생성자
};
class ShoppingCart {
private:
vector<Product> items; // 상품 목록
public:
void addProduct(Product p) {
items.push_back(p); // 상품 추가
}
void showCart() {
for (const auto& item : items) {
cout << "상품명: " << item.name << ", 가격: " << item.price << endl;
}
}
};
int main() {
ShoppingCart cart;
cart.addProduct(Product("신발", 50000));
cart.addProduct(Product("셔츠", 30000));
cart.showCart();
return 0;
}
상황 설명: 쇼핑몰에서는 사용자가 장바구니에 상품을 추가하고, 장바구니에 담긴 상품 목록을 확인할 수 있는 기능이 필요합니다. 위 코드는 이를 구현한 예입니다.
예제 2: 학생 관리 시스템
학생 정보를 관리하는 시스템을 구현할 때, 학생을 나타내는 클래스를 정의하고 여러 학생 객체를 관리할 수 있습니다.
#include <iostream>
#include <vector>
using namespace std;
class Student {
public:
string name;
int id;
Student(string n, int i) : name(n), id(i) {} // 생성자
};
class School {
private:
vector<Student> students;
public:
void addStudent(Student s) {
students.push_back(s); // 학생 추가
}
void showStudents() {
for (const auto& student : students) {
cout << "학생 이름: " << student.name << ", 학생 ID: " << student.id << endl;
}
}
};
int main() {
School school;
school.addStudent(Student("홍길동", 1001));
school.addStudent(Student("김철수", 1002));
school.showStudents();
return 0;
}
상황 설명: 학생 관리 시스템에서는 학생 정보를 추가하고 조회할 수 있어야 하며, 위 코드는 이를 효과적으로 구현합니다.
5. 흔한 실수와 주의사항
실수 1: 클래스의 접근 제어
class Car {
string brand; // public이 아니기 때문에 외부에서 접근 불가
};
class Car {
public:
string brand; // public으로 접근 가능
};
주의사항: 속성과 메서드는 기본적으로 private이며, 외부에서 접근하려면 public으로 선언해야 합니다.
실수 2: 객체 생성 시 초기화
Car myCar;
myCar.brand = "현대"; // brand가 private이면 오류 발생
class Car {
public:
string brand;
Car(string b) : brand(b) {} // 생성자를 통해 초기화
};
Car myCar("현대");
주의사항: 생성자를 통해 초기화하는 것이 더 안전하고 유용합니다.