[42seoul] CPP module

tpwhzla·2023년 8월 23일

42Seoul

목록 보기
6/16

CPP module 시작 전 준비운동

클래스와 객체의 차이

클래스

  • 정의 : 클래스는 객체를 생성하기 위한 템플릿, 또는 설계도와 같은 것으로 객체의 속성(attributes)와 메소드(methods)를 정의하는 코드의 블록이다.

  • 예시 : 자동차라는 클래스가 있다면 클래스의 속성은 브랜드, 색상, 모델 등이 있고, 메소드는 주행, 정지 가속 등이 있을 수 있다.

객체

  • 정의 : 객체는 클래스에서 정의된 내용을 기반으로, 메모리에 생성된 실체이다. 클래스를 기반으로 만들어진 인스턴스를 이야기한다.
  • 위의 예시를 기반으로, '붉은색 테슬라 모델 S'가 객체가 된다.

자동차는 자신의 상태를 알려주는 변수와, 본인이 하는 행동인 메소드로 이루어져 있을 것이다.

추상화

이 때, '붉은색 테슬라 모델 S'라는 객체가 현실 세계에 존재하는 것을 나타내기 위해서는 추상화(abstraction)라는 과정이 필요하다.

자동차가 주행, 정지하는 것은 <자동차가 하는 것> 이므로 <자동차가 하는 것> 이라는 함수로 추상화가 가능하다.

자동차의 속력, 마력, 엔진 출력 등은 <변수> 로 추상화 가능하다.

인스턴스

이러한 객체나 함수의 변수 들을 보통 인스턴스 변수로 부른다.
쉽게 생각하여, '인스턴스 메소드' 는 객체 안에 정의되어 있는 함수이다.

외부에서는 어떠한 객체의 인스턴스 변수의 값을 바꿀 수 없으며, 객체 내부의 인스턴스 함수를 통해서만 바꿀 수 있다.
( 사용자가 조절 가능 )

car.speed += 100; // car라는 생성된 객체의 속도에 직접 100을 더했기 때문에 실행되지 않는다.
car.increaseSpeed(100) // car라는 생성된 객체 내부에 있는 속도 증가 함수를 이용하여 100에 접근했기 때문에, 실제 speed가 변한다.

Private, Public

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가지 함수를 모두 정의해야 한다는 규칙이다.

profile
DevOps / Infrastructure / Cloud Native / Platform Engineering

0개의 댓글