IMCAT.DEV
로그인 가입
C++ 중급 객체지향

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

    코드 동작 설명

    1. #include <iostream>: 입출력 스트림을 사용하기 위한 헤더 파일을 포함합니다.
    2. class Car: Car라는 이름의 클래스를 정의합니다.
    3. public:: 이 뒤에 오는 속성과 메서드는 클래스 외부에서 접근할 수 있도록 합니다.
    4. string brand;와 int year;: Car 클래스의 속성을 정의합니다.
    5. void display(): Car 클래스의 메서드를 정의합니다. 이 메서드는 차량의 브랜드와 연식을 출력합니다.
    6. int main(): 프로그램의 시작 점입니다.
    7. Car myCar;: Car 클래스의 객체인 myCar를 생성합니다.
    8. myCar.brand = "현대";와 myCar.year = 2021;: myCar의 속성을 초기화합니다.
    9. myCar.display();: myCar 객체의 display() 메서드를 호출하여 차량 정보를 출력합니다.
    10. 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: 클래스의 접근 제어

    11. 잘못된 코드
    12. class Car {
          string brand; // public이 아니기 때문에 외부에서 접근 불가
      };
    13. 올바른 코드
    14. class Car {
      public:
          string brand; // public으로 접근 가능
      };

      주의사항: 속성과 메서드는 기본적으로 private이며, 외부에서 접근하려면 public으로 선언해야 합니다.

      실수 2: 객체 생성 시 초기화

    15. 잘못된 코드
    16. Car myCar;
      myCar.brand = "현대"; // brand가 private이면 오류 발생
    17. 올바른 코드
    18. class Car {
      public:
          string brand;
          Car(string b) : brand(b) {} // 생성자를 통해 초기화
      };
      Car myCar("현대");

      주의사항: 생성자를 통해 초기화하는 것이 더 안전하고 유용합니다.

      6. 정리

    19. 클래스는 객체를 생성하기 위한 설계도이며, 객체는 그 설계도를 기반으로 만들어진 인스턴스입니다.
    20. 메서드와 속성을 통해 객체의 행동과 데이터를 정의할 수 있습니다.
    21. OOP를 활용하면 코드의 재사용성과 유지보수성을 높일 수 있습니다.
    22. 다음 단계로는 상속, 다형성 등을 학습하면 좋습니다. 이러한 개념은 클래스와 객체를 더욱 효과적으로 활용할 수 있게 도와줍니다.