: CPP에서의 메모리 할당, 해제, 레퍼런스(reference), 스위치 구문 등을 연습하는 과제이다.
: const reference로 리턴을 하면 어떤일이 발생하는지에 대한 링크
링크 : https://lazymankook.tistory.com/11
: cpp에서 file 입출력을 어떻게 하는지에 대해서 나와있는 링크
링크 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=tkdldjs35&logNo=221308244184
: string의 다양한 멤버 함수들을 사용할 수 있도록 멤버 함수들의 리스트가 나와있다.
링크 : https://rebro.kr/53
: new, delete, 소멸자 호출 시기 등을 공부함
: 지역 변수는 해당 함수가 종료되면 소멸자가 호출되고, 포인터로 할당을 해주면 delete를 써서 해제를 시켜줘야 소멸자가 호출된다.
: 한번에 여러개의 클래스를 만드는 것을 공부함.
: 클래스 생성 >> 클래스 초기화 >> 포인터 할당 >> 외부에서 실행 >> delete []로 소멸자 호출 >> 종료
: 여러개의 클래스를 한꺼번에 delete할때는 delete옆에 []를 꼭 써야 한다.
: 포인터와 reference의 차이에 대해서 공부함
: 레퍼런스는 원본을 가르키는 것임. 선언 즉시 초기화 해야한다.
: 포인터는 주소를 기억할 공간을 따로 가지고 있지만 레퍼런스는 원본 그 자체이기 때문에 그런 공간이 없어서 메모리 절약이 가능하다.
잘 알고 쓰면 좋지만, 얕은 복사를 할 수 있기 때문에 적절히 활용을 하도록 한다.(추후에 과제로 나온다)
: Const Reference와 Constructor Initializer List(생성자 초기화)를 공부하게 된따.
Const reference를 쓰는 이유
1.깊은 복사가 안된다.(=클래스를 따로 하나 생성을 하지 않는다.)
: 그러니까 속도도 더 빨라진다.
2.안의 내용은 변경 못하게 한다.
: 해당 원본을 찾아서 접근한다.
: 값을 변경시킬 필요가 없을때는 굳이 복사를 하지 않고 레퍼런스를 쓰는 것이 빨라지니 좋다.
Constructor Initializer List
: 생성자 초기화 리스트, 그냥 영어로 말하는게 좋을거 같다. 형태는 아래와 같다. Class이름은 Test로 하겠다.
Class Test
{
Test() : _test("This is Test"), _test2(42)
{
}
private :
std::string _test;
int _test2;
}
위와 같이 중괄호 안에 쓰지 않고 밖에 콜론(:)과 더불어서 뒤에 써주면 된다. 저 내용은 아래와 같다.
Class Test
{
Test()
{
_test = "This is Test";
_test2 = 42;
}
private :
std::string _test;
int _test2;
}
그런데 굳이 저렇게 쓰는 이유가 있을까? 그냥 예쁘라고 하는 것일까?
문제는 이런 상황에서 나온다. 만약 해당 클래스에서 멤버 변수에 다른 클래스가 있다면? 그 클래스도 초기화가 필요하고, 해당 클래스가 먼저 초기화가 된 후에 이 클래스가 초기화가 되어야 한다. 이런 경우에는 initializer list를 해주면 이 부분부터 해주고 생성자의 초기화를 하로 들어가게 된다.
Class AnotherClass
{
AnotherClass(int a, int b)
{
_a = a;
_b = b;
}
private :
int _a;
int _b;
}
Class Test
{
Test() : _anotherClass(10,20), _test("This is Test"), _test2(42)
{
_test = "This is Test";
_test2 = 42;
}
private :
AnotherClass _anotherClass;
std::string _test;
int _test2;
}
이와 같이 Another Class를 먼저 초기화를 시켜준뒤에 Test를 초기화를 해줘야 에러가 발생하지 않는다.
: cpp에서의 file 입출력을 공부하게 되었고, string의 멤버함수들을 이용해서 string을 편집하는 것을 해보았다.
관련 링크는 위에 써놓았지만 다시 쓰겠다.
file 입출력관련 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=tkdldjs35&logNo=221308244184
string 멤버 함수 : https://rebro.kr/53
: 함수 포인터를 쓰는 법을 공부하게 된다. 또한 if문을 계속 적게 쓰게끔 유도를 한다. switch 구문을 활용하게 된다.
/* 함수 포인터 선언 */
[반환타입] (*[클래스명]::[멤버 함수 포인터명])([매개변수 목록]);
/* 함수 포인터에 함수를 할당. */
[멤버 함수 포인터명] = &[클래스명]::[멤버 함수명];
/* 함수 호출 */
// 클래스 내부에서 함수 호출
(this->*[멤버 함수 포인터명])([매개변수 목록]);
// 클래스 외부에서 함수 호출
[클래스명] [인스턴스명] = [생성자]; // 인스턴스 생성
([인스턴스명].*[멤버 함수 포인터명])([매개변수 목록]); // 인스턴스 생성 후, 인스턴스를 활용하여 함수 호출
: ex05와 마찬가지로 함수포인터 사용과 switch 구문을 활용하게 된다.
: 아무래도 오랜만에 보는 Class구조라서 그런지 너무 어려웠다. 하지만 전에 사용할때는 아무것도 모르고 따라 쳤다면, 이 과제를 하면서 그리고 이전에 C에서 구조체를 사용한 적이 있었기 때문에 점점 더 효율적으로 어떻게 발전했는지 알 수 있는 기회였다.
항상 malloc과 free에서 살았다면, 이제는 new와 delete가 함께 한다고 할 수 있다.
: 레퍼런스는 잘 사용하면 정말 좋은 기능인 것 같다. 그만큼 잘 활용을 못하거나 잘못 사용을 한다면 난리가 날 수 있는 기능이다. 자꾸 활용을 해보려고 했는지 쉽지 않은 대상이었다. 계속 getter를 사용할때는 레퍼런스를 사용하려고 했다.