[42Seoul] - CPP Module01

Joey·2022년 11월 3일
0

42 SEOUL

목록 보기
8/20



1.무엇을 하는 과제인가?

: CPP에서의 메모리 할당, 해제, 레퍼런스(reference), 스위치 구문 등을 연습하는 과제이다.




2.과제를 하면서 참고 했던 곳들

1)const reference

: const reference로 리턴을 하면 어떤일이 발생하는지에 대한 링크

링크 : https://lazymankook.tistory.com/11

2)file 입출력

: cpp에서 file 입출력을 어떻게 하는지에 대해서 나와있는 링크

링크 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=tkdldjs35&logNo=221308244184

3)string 멤버 함수들

: string의 다양한 멤버 함수들을 사용할 수 있도록 멤버 함수들의 리스트가 나와있다.

링크 : https://rebro.kr/53





3.과제를 하면서 공부했던 것들

1)ex00

: new, delete, 소멸자 호출 시기 등을 공부함
: 지역 변수는 해당 함수가 종료되면 소멸자가 호출되고, 포인터로 할당을 해주면 delete를 써서 해제를 시켜줘야 소멸자가 호출된다.



2)ex01

: 한번에 여러개의 클래스를 만드는 것을 공부함.
: 클래스 생성 >> 클래스 초기화 >> 포인터 할당 >> 외부에서 실행 >> delete []로 소멸자 호출 >> 종료
: 여러개의 클래스를 한꺼번에 delete할때는 delete옆에 []를 꼭 써야 한다.



3)ex02

: 포인터와 reference의 차이에 대해서 공부함
: 레퍼런스는 원본을 가르키는 것임. 선언 즉시 초기화 해야한다.
: 포인터는 주소를 기억할 공간을 따로 가지고 있지만 레퍼런스는 원본 그 자체이기 때문에 그런 공간이 없어서 메모리 절약이 가능하다.
잘 알고 쓰면 좋지만, 얕은 복사를 할 수 있기 때문에 적절히 활용을 하도록 한다.(추후에 과제로 나온다)





4)ex03

: 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를 초기화를 해줘야 에러가 발생하지 않는다.




5)ex04

: cpp에서의 file 입출력을 공부하게 되었고, string의 멤버함수들을 이용해서 string을 편집하는 것을 해보았다.
관련 링크는 위에 써놓았지만 다시 쓰겠다.

file 입출력관련 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=tkdldjs35&logNo=221308244184

string 멤버 함수 : https://rebro.kr/53




6)ex05

: 함수 포인터를 쓰는 법을 공부하게 된다. 또한 if문을 계속 적게 쓰게끔 유도를 한다. switch 구문을 활용하게 된다.

/* 함수 포인터 선언 */
[반환타입]	(*[클래스명]::[멤버 함수 포인터명])([매개변수 목록]);

/* 함수 포인터에 함수를 할당. */
[멤버 함수 포인터명] = &[클래스명]::[멤버 함수명];

/* 함수 호출 */
// 클래스 내부에서 함수 호출
(this->*[멤버 함수 포인터명])([매개변수 목록]);

// 클래스 외부에서 함수 호출
[클래스명]	[인스턴스명] = [생성자];		// 인스턴스 생성
([인스턴스명].*[멤버 함수 포인터명])([매개변수 목록]);	// 인스턴스 생성 후, 인스턴스를 활용하여 함수 호출

7)ex06

: ex05와 마찬가지로 함수포인터 사용과 switch 구문을 활용하게 된다.


4.회고

1)Class 구조가 어려웠다.

: 아무래도 오랜만에 보는 Class구조라서 그런지 너무 어려웠다. 하지만 전에 사용할때는 아무것도 모르고 따라 쳤다면, 이 과제를 하면서 그리고 이전에 C에서 구조체를 사용한 적이 있었기 때문에 점점 더 효율적으로 어떻게 발전했는지 알 수 있는 기회였다.

항상 malloc과 free에서 살았다면, 이제는 new와 delete가 함께 한다고 할 수 있다.

2)Reference의 사용

: 레퍼런스는 잘 사용하면 정말 좋은 기능인 것 같다. 그만큼 잘 활용을 못하거나 잘못 사용을 한다면 난리가 날 수 있는 기능이다. 자꾸 활용을 해보려고 했는지 쉽지 않은 대상이었다. 계속 getter를 사용할때는 레퍼런스를 사용하려고 했다.

profile
세상을 이롭게 하는 프로그램 만들기

0개의 댓글