C++ 클래스와 객체: 초보자 가이드

안녕하세요, 미래의 C++ 마エスト로! 여러분의 이 흥미로운 C++ 클래스와 객체의 세계로의 여정을 안내해 드리게 되어 기쁩니다. 여러년間 프로그래밍을 가르치고 있는 사람으로서, 이 주제는 LEGO 블록으로 만들어가는 것과 같다는 걸 말씀드릴 수 있습니다. 한 번 익숙해지면, 빨리 아름다운 것들을 만들어 낼 수 있을 거예요!

C++ Classes & Objects

클래스와 객체는 무엇인가요?

진짜 깊이 들어가기 전에, 간단한 비유로 시작해볼게요. 자동차를 설명하는 것을 상상해봅시다. 자동차는 특정한 성격(색상, 모델, 연식)을 가지고 있으며, 특정한 행동(시동, 정지, 가속)을 할 수 있습니다. C++에서는 클래스가 자동차의 블루프린트와 같이, 모든 자동차가 가져야 할 성격과 행동을 정의합니다. 그럼 객체는 그 블루프린트로 만들어진 특정한 자동차입니다.

이제 코드로 손을 더러워보죠!

C++ 클래스 정의

C++에서는 class 키워드를 사용하여 클래스를 정의합니다. 여기 기본적인 구조가 있습니다:

class Car {
// 클래스 멤버들이 여기 들어갑니다
};

하지만 그냥 빈 차고예요! 좀 더 자세한 것을 추가해봅시다:

class Car {
public:
string color;
string model;
int year;

void start() {
cout << "The car is starting!" << endl;
}

void stop() {
cout << "The car is stopping!" << endl;
}
};

이를 분석해봅시다:

  1. Car라는 클래스를 정의했습니다.
  2. 클래스 내에 데이터 멤버(color, model, year)와 멤버 함수(start(), stop())가 있습니다.
  3. public 키워드는 이 멤버들이 클래스 외부에서 접근할 수 있음을 의미합니다.

C++ 객체 정의

이제 자동차 블루프린트가 있으니, 실제로 자동차를 몇 대 만들어봅시다! 이곳에서 객체가 등장합니다:

int main() {
Car myCar;  // Car 클래스의 객체를 생성합니다
Car yourCar;  // 또 다른 Car 클래스의 객체입니다

return 0;
}

성공하셨습니다! 여러분은 그저 "생산한" 두 대의 자동차가 있습니다. 하지만 지금은 매우 픽셀적입니다 – 좀 더 개성을 더해보죠!

데이터 멤버에 접근하기

자동차의 속성값을 설정하거나 가져오기 위해, 점(.) 연산자를 사용합니다:

int main() {
Car myCar;

// 값 설정
myCar.color = "Red";
myCar.model = "Sportster";
myCar.year = 2023;

// 값 가져오기
cout << "My car is a " << myCar.color << " " << myCar.model << " from " << myCar.year << endl;

// 멤버 함수 호출
myCar.start();
myCar.stop();

return 0;
}

출력:

My car is a Red Sportster from 2023
The car is starting!
The car is stopping!

myCar 객체와 상호작용하는 방법을 보았죠? 우리는 그 색상, 모델, 연식을 설정한 후, 해당 값을 인쇄하고 마지막으로 그 멤버 함수를 호출합니다.

클래스와 객체에 대한 자세한 내용

기본 사항을 이해했으니, 좀 더 깊이 들어가보죠. C++에서 클래스는 주로 두 가지 주요 섹션으로 나뉩니다:

  1. 비공개 멤버: 이들은 클래스 내에서만 접근할 수 있습니다.
  2. 공개 멤버: 이들은 클래스 외부에서 접근할 수 있습니다.

다음은 우리의 Car 클래스의 개선된 버전입니다:

class Car {
private:
string color;
string model;
int year;
bool isRunning;

public:
// 생성자
Car(string c, string m, int y) {
color = c;
model = m;
year = y;
isRunning = false;
}

// 게터 메서드
string getColor() { return color; }
string getModel() { return model; }
int getYear() { return year; }

// 다른 메서드
void start() {
if (!isRunning) {
isRunning = true;
cout << "The " << color << " " << model << " is starting!" << endl;
} else {
cout << "The car is already running!" << endl;
}
}

void stop() {
if (isRunning) {
isRunning = false;
cout << "The " << color << " " << model << " is stopping!" << endl;
} else {
cout << "The car is already stopped!" << endl;
}
}
};

이 버전은 여러 새로운 개념을 도입합니다:

  1. 비공개 멤버: 우리는 더 나은 캡슐화를 위해 데이터 멤버를 비공개로 만듭니다.
  2. 생성자: 이 특수한 함수는 객체가 생성될 때 호출되며, 그 값을 초기화합니다.
  3. 게터 메서드: 이들은 우리의 비공개 데이터 멤버에 대한 통제된 접근을 허용합니다.
  4. 개선된 메서드: 우리의 start()stop() 메서드는 이제 자동차의 상태를 확인한 후 행동합니다.

이 개선된 클래스를 사용하는 방법을 보죠:

int main() {
Car myCar("Red", "Sportster", 2023);

cout << "My car is a " << myCar.getColor() << " " << myCar.getModel()
<< " from " << myCar.getYear() << endl;

myCar.start();
myCar.start();  // 다시 시작을 시도합니다
myCar.stop();
myCar.stop();  // 다시 정지를 시도합니다

return 0;
}

출력:

My car is a Red Sportster from 2023
The Red Sportster is starting!
The car is already running!
The Red Sportster is stopping!
The car is already stopped!

멋지지 않나요? 우리의 자동차는 이제 더 이상 실제 자동차처럼 행동합니다 – 이미 가동 중이면 시작할 수 없고, 이미 멈춰 있으면 정지할 수 없습니다.

메서드 표

다음은 우리의 개선된 Car 클래스의 메서드를 요약한 표입니다:

메서드 설명
Car(string c, string m, int y) 생성자: 새로운 Car 객체를 초기화합니다
string getColor() 자동차의 색상을 반환합니다
string getModel() 자동차의 모델을 반환합니다
int getYear() 자동차의 연식을 반환합니다
void start() 자동차가 아직 가동 중이지 않으면 시작합니다
void stop() 자동차가 현재 가동 중이면 정지합니다

그리고 이렇게 끝납니다! 여러분은 첫 번째 C++ 클래스를 만들고, 그 클래스에서 객체를 생성했습니다. 연습이 정신을 실려, 여러분만의 클래스와 객체를 실험해보세요. 아마 Garage 클래스를 만들어 여러 Car 객체를 저장할 수 있을까요?

코딩을 계속하고, 계속 배우며, 가장 중요한 것은 즐기세요! 알지 못하게 될 때까지, 여러분도 C++ 클래스와 객체의 기쁨을 다른 사람들에게 가르치게 될 거예요. 다음 번에 뵙겠습니다, 즐거운 코딩!

Credits: Image by storyset