클래스
정의 : 클래스는 객체를 생성하기 위한 템플릿, 또는 설계도와 같은 것으로 객체의 속성(attributes)와 메소드(methods)를 정의하는 코드의 블록이다.
예시 : 자동차라는 클래스가 있다면 클래스의 속성은 브랜드, 색상, 모델 등이 있고, 메소드는 주행, 정지 가속 등이 있을 수 있다.
객체
자동차는 자신의 상태를 알려주는 변수와, 본인이 하는 행동인 메소드로 이루어져 있을 것이다.
이 때, '붉은색 테슬라 모델 S'라는 객체가 현실 세계에 존재하는 것을 나타내기 위해서는 추상화(abstraction)라는 과정이 필요하다.
자동차가 주행, 정지하는 것은 <자동차가 하는 것> 이므로 <자동차가 하는 것> 이라는 함수로 추상화가 가능하다.
자동차의 속력, 마력, 엔진 출력 등은 <변수> 로 추상화 가능하다.
이러한 객체나 함수의 변수 들을 보통 인스턴스 변수로 부른다.
쉽게 생각하여, '인스턴스 메소드' 는 객체 안에 정의되어 있는 함수이다.
외부에서는 어떠한 객체의 인스턴스 변수의 값을 바꿀 수 없으며, 객체 내부의 인스턴스 함수를 통해서만 바꿀 수 있다.
( 사용자가 조절 가능 )
car.speed += 100; // car라는 생성된 객체의 속도에 직접 100을 더했기 때문에 실행되지 않는다.
car.increaseSpeed(100) // car라는 생성된 객체 내부에 있는 속도 증가 함수를 이용하여 100에 접근했기 때문에, 실제 speed가 변한다.
42Seoul Cpp 과제에서는 반드시 Class를 개별 파일을 생성하여 만들어야 한다.
Car.cpp 파일을 만든다면
class car
{
private:
std::string brand;
std::string color;
std::string model;
public:
void setBrand(std::string NBrand)
{
brand = NBrand;
}
void setColor(std::string NColor)
{
color = NColor;
}
void setModel(std::string NModel)
{
model = Nmodel;
}
void printCarInfo()
{
std::cout << brand << " " << color << " " << model << std::endl;
}
}; // 세미콜론은 필수다.
int main()
{
car car;
car.setBrand("Tesla");
car.setColor("Red");
car.setModel("Model5");
car.printCarInfo();
return (0);
}
Tesla Red Model5
Private 키워드에 쓰인 std::string color, model, brand의 경우 클래스 Car의 멤버 변수로서,
멤버 변수들은 객체 내에서 보호되고 있다.
이러한 Private, Public을 '접근 지시자'라고 하며, Private 되고 있는 것들은 모두 자기 객체 내부에서만 접근할 수 있고 외부 객체에서는 접근이 불가능하다.
Class car 내에서 내가 위에 작성한 코드와 같이, std::string NColor를 받는 함수 setColor를 이용하여 멤버 변수 Color에 접근이 가능했으나,
이 객체 바깥에서는 private 상태인 멤버 변수에 접근할 수 없다 (컴파일 시 오류가 발생!)
키워드를 명시하지 않는 경우는 자동으로 private로 설정이 된다
42Seoul 과제에서는 C++ 98버전을 사용하기 때문에, Rule of Three 라고도 불리우는 오소독스 캐노니컬 폼을 적용한다.
생성자
객체가 처음 생성될 때 호출되며, 주로 멤버 변수들을 초기화 하는데에 사용한다. 명시적으로 정의하지 않으면 컴파일러가 기본 생성자를 자동으로 제공한다.
소멸자
~클래스
이 소멸자는 객체가 소멸될 때 호출되며, 동적 메모리 할당을 해제할 때(Delete) 소멸자 내에서 로직을 구현할 수 있다. 객체가 사라질 때 필요한 정리 작업을 수행하는데에 사용할 수 있다.
매개변수화 생성자
이 생성자는 매개변수를 받아 객체를 초기화하는데 사용한다.
오소독스 캐노니컬 폼은 클래스가 동적 메모리 할당 및 리소스 관련 작업을 수행하는 경우 복사 생성자, 복사 대입 연산자, 소멸자 3가지 함수를 모두 정의해야 한다는 규칙이다.