C++에서 클래스와 객체의 세계로 여러분을 초대합니다! 이 챕터에서는 객체지향 프로그래밍의 기초를 배우며, 클래스의 정의와 객체 생성의 기본을 탐구합니다. 실용적인 예제로 C++의 핵심을 익혀봅시다!
#include <iostream>
using namespace std;
// 클래스 정의
class Car {
private:
string color; // private 변수, 클래스 외부에서 직접 접근 불가
int speed; // private 변수
public:
// 생성자
Car(string c, int s) {
color = c;
speed = s;
}
// 색상 값을 반환하는 public 메소드
string getColor() {
return color;
}
// 속도 값을 반환하는 public 메소드
int getSpeed() {
return speed;
}
// 속도를 설정하는 public 메소드
void setSpeed(int s) {
speed = s;
}
};
int main() {
// 객체 생성
Car myCar("Red", 0); // "Red" 색상과 초기 속도 0으로 myCar 객체 생성
// 객체의 메소드 사용
cout << "My car's color is " << myCar.getColor() << endl;
cout << "My car's speed is " << myCar.getSpeed() << " km/h" << endl;
// 객체의 속도 변경
myCar.setSpeed(60); // myCar의 속도를 60km/h로 설정
cout << "My car's new speed is " << myCar.getSpeed() << " km/h" << endl;
return 0;
}
주요 부위 설명(클래스와 객체)
- 클래스 정의 (
class Car
):Car
라는 이름의 클래스를 정의합니다. 이 클래스는 자동차 객체를 표현합니다.- 클래스 안에는 데이터(색상, 속도)를 저장하는 변수(
color
,speed
)와 이 데이터를 처리하는 함수(메소드)들이 포함됩니다.
- 접근 제어자 (
private
,public
):private
접근 제어자: 클래스 내부에서만 접근 가능한 변수를 정의합니다.public
접근 제어자: 클래스 외부에서도 접근 가능한 메소드를 정의합니다.
- 생성자 (
Car(string c, int s)
):Car
클래스의 객체가 생성될 때 호출됩니다.- 초기 색상과 속도를 설정하는 역할을 합니다.
- 메소드 (
getColor
,getSpeed
,setSpeed
):getColor
와getSpeed
는 각각 자동차의 색상과 속도를 반환합니다.setSpeed
는 자동차의 속도를 설정하는 데 사용됩니다.
- 객체 생성 및 사용 (
main
함수 내):Car myCar("Red", 0);
:Car
클래스의 인스턴스인myCar
객체를 생성합니다.myCar
객체의 메소드를 호출하여 색상과 속도를 조회하고, 속도를 변경합니다.
이 예제는 객체지향 프로그래밍의 기본 개념인 클래스와 객체를 소개하는 간단한 예시입니다. 클래스는 객체의 청사진을 제공하며, 객체는 클래스의 실제 인스턴스입니다. 클래스의 메소드를 통해 객체의 내부 데이터를 안전하게 접근하고 수정할 수 있습니다.
접근 제어자(클래스와 객체)
C++에서 접근 제어자는 클래스의 멤버(변수와 함수)에 대한 접근 권한을 제어하는 키워드입니다. 주로 사용되는 접근 제어자는 public
, private
, protected
세 가지가 있습니다. 이들의 사용 방법과 각각의 특징을 아래에 자세히 설명하고 예를 들어 설명하겠습니다.
1. Public 접근 제어자
public
으로 선언된 멤버는 클래스의 외부에서도 접근할 수 있습니다.- 주로, 외부에서 접근해야 하는 메소드나, 변수에 사용됩니다.
class ExampleClass {
public:
int publicVar; // public 변수
void publicMethod() { /* ... */ } // public 메소드
};
예시: ExampleClass
객체를 생성한 후, publicVar
에 접근하거나 publicMethod()
를 호출할 수 있습니다.
2. Private 접근 제어자
private
으로 선언된 멤버는 클래스의 외부에서 접근할 수 없습니다.- 주로, 클래스 내부에서만 사용되는 데이터나 함수에 사용됩니다.
class ExampleClass {
private:
int privateVar; // private 변수
void privateMethod() { /* ... */ } // private 메소드
};
예시: privateVar
나 privateMethod()
는 ExampleClass
의 외부에서 직접 접근할 수 없습니다. 이를 사용하기 위해서는 public
메소드를 통해 간접적으로 접근해야 합니다.
3. Protected 접근 제어자
protected
로 선언된 멤버는 해당 클래스 내부와 상속받은 파생 클래스에서 접근할 수 있습니다.- 주로, 상속받은 클래스에서도 사용할 수 있어야 하는 멤버에 사용됩니다.
class BaseClass {
protected:
int protectedVar; // protected 변수
};
class DerivedClass : public BaseClass {
void useProtectedVar() {
protectedVar = 5; // 상속받은 클래스에서 protected 멤버에 접근 가능
}
};
예시: DerivedClass
는 BaseClass
로부터 상속받아 protectedVar
에 접근할 수 있습니다. 그러나 BaseClass
의 객체로는 protectedVar
에 직접 접근할 수 없습니다.
class Person {
private:
string name; // 외부에서 직접 접근할 수 없음
public:
Person(string n) { name = n; } // 생성자는 public
void printName() { cout << "Name: " << name << endl; } // 외부에서 호출 가능한 메소드
};
- 예제에서
name
변수는private
으로 선언되어Person
클래스 외부에서 직접 접근할 수 없습니다. 하지만printName
메소드는public
으로 선언되어 외부에서 호출할 수 있으며, 이 메소드를 통해 간접적으로name
변수의 값을 확인할 수 있습니다.
이처럼 접근 제어자는 클래스의 캡슐화를 보장하고, 객체의 데이터와 메소드에 대한 접근을 제어하는 중요한 역할을 합니다. 이를 통해 객체의 데이터를 보호하고, 외부 인터페이스를 명확하게 정의할 수 있습니다.
생성자(Constructor)와 소멸자(Destructor)는 객체의 생명 주기를 관리(클래스와 객체)
C++에서 생성자(Constructor)와 소멸자(Destructor)는 객체의 생명 주기를 관리하는 특별한 함수들입니다. 이들은 객체가 생성되고 소멸될 때 자동으로 호출되며, 각각 객체의 초기화와 정리 작업을 담당합니다. 이들의 역할과 사용 방법에 대해 자세하게 설명하고, 예를 들어 설명하겠습니다.
생성자 (Constructor)
- 객체가 생성될 때 자동으로 호출되는 멤버 함수입니다.
- 주로 객체의 초기 상태를 설정하는 데 사용됩니다.
- 생성자는 클래스 이름과 동일하며 반환 타입을 가지지 않습니다.
- 여러 형태의 생성자가 있습니다: 디폴트 생성자, 매개변수가 있는 생성자, 복사 생성자 등.
class Car {
public:
// 디폴트 생성자
Car() {
cout << "Car created with default constructor" << endl;
}
// 매개변수가 있는 생성자
Car(string model) {
cout << "Car created with model: " << model << endl;
}
};
Car
클래스에는 두 개의 생성자가 정의되어 있습니다: 하나는 매개변수가 없고, 다른 하나는 string
타입의 model
을 매개변수로 받습니다.
소멸자 (Destructor)
- 객체가 소멸될 때 자동으로 호출되는 멤버 함수입니다.
- 객체가 사용한 자원을 해제하거나 정리하는 데 사용됩니다.
- 소멸자는 클래스 이름 앞에 물결표(
~
)가 붙으며 반환 타입을 가지지 않습니다. - 각 클래스에는 하나의 소멸자만 정의할 수 있습니다.
class Car {
public:
// 생성자
Car() {
cout << "Car created" << endl;
}
// 소멸자
~Car() {
cout << "Car destroyed" << endl;
}
};
Car
클래스에는 생성자와 소멸자가 정의되어 있습니다. 객체가 생성될 때 “Car created”가 출력되고, 객체가 소멸될 때 “Car destroyed”가 출력됩니다.
생성자와 소멸자의 작동 방식
int main() {
Car myCar; // Car 생성자 호출
Car anotherCar("BMW"); // Car 매개변수가 있는 생성자 호출
// 함수가 종료될 때 myCar, anotherCar 객체의 소멸자가 호출됨
}
main
함수에서Car
객체 두 개를 생성합니다:myCar
는 디폴트 생성자를 사용하고,anotherCar
는 “BMW” 모델을 매개변수로 받는 생성자를 사용합니다.- 함수가 종료될 때, 생성된 객체들의 소멸자가 자동으로 호출되어 객체가 소멸됩니다.
생성자와 소멸자는 객체의 안정적인 생성과 소멸을 보장하는 중요한 구성 요소입니다. 생성자는 객체의 초기 상태를 설정하고, 소멸자는 객체가 더 이상 필요 없을 때 자원을 정리하는 역할을 합니다. 이를 통해 메모리 누수와 같은 문제를 방지하고, 프로그램의 안정성을 높일 수 있습니다.
결론
C++에서 접근 제어자는 클래스 멤버의 접근성을 관리하는 역할을 하며, public
, private
, protected
세 가지 유형이 있습니다. public
멤버는 외부에서 접근 가능하고, private
멤버는 클래스 내부에서만 접근 가능합니다. protected
멤버는 상속받은 클래스에서 접근할 수 있습니다. 이는 데이터 캡슐화와 보안을 강화하는 데 중요합니다. 반면, 생성자와 소멸자는 객체의 생명주기를 관리합니다. 생성자는 객체가 생성될 때 호출되어 초기화를 담당하고, 소멸자는 객체가 소멸될 때 자원을 해제합니다. 여러 형태의 생성자(디폴트, 매개변수가 있는, 복사 생성자 등)가 존재하며, 각각 특정 상황에 맞게 객체를 초기화합니다. 이러한 기능들은 C++의 객체지향 프로그래밍에서 핵심적인 요소로, 객체의 안전한 생성, 관리, 소멸을 보장하며 프로그램의 구조를 효율적으로 관리하는 데 중요한 역할을 합니다.