cpp 01

jiwoo·2022년 12월 22일
0

cpp

목록 보기
2/9

CPP 01

생성일: 2022년 11월 29일 오후 11:08
최종 편집 일시: 2022년 12월 6일 오후 9:17
태그: cpp
cpp notion

CPP MODULE 01

  • Memory allocation, pointers to members, references, switch statement
  • 동적할당, 레퍼런스, 멤버함수포인터, 스위치에 대해 살펴본다.

notion links

ex00 BraiiiiiiinnnzzzZ

new 와 delete 를 사용한 동적할당을 접하고 정적할당과 정적할당의 소멸자가 불러오는 시점을 확인 할 수 있다.

ex01 Moar brainz!

new[] 와 delete[] 를 사용하여 배열 동적할당을 접한다.

ex02 HI THIS IS BRAIN

pointer포인터와 reference참조자를 사용하고 차이를 알아본다.

ex03 Unnecessary violence

reference 참조자의 쓰임을 확인하고 생성자에 초기화리스트를 사용해보자.

ex04 Sed is for losers

파일을 읽고 문자열을 대치시키고 새로운 파일을 만들어 저장하는 것을 알아본다.

ex05 Harl 2.0

멤버 함수 포인터를 알고 함수포인터 배열을 사용하기

ex06 Harl filter

스위치문 사용하기 + break 가용 시점에 따른 실행도 확인하기


**ex00 BraiiiiiiinnnzzzZ**

new 와 delete 를 사용한 동적할당을 접하고 정적할당과 정적할당의 소멸자가 불러오는 시점을 확인 할 수 있다.

  • new 와 malloc
    • new 는 연산자(별도의 라이브러리 include가 불필요하다), malloc 은 함수
    • malloc 은 메모리를 할당하는 역할만 하기 때문에 형변환 캐스팅이 필요하다.
    • new는 내부적으로 malloc을 사용해 메모리를 할당하는 것 뿐만 아니라, 생성자 호출과 캐스팅까지 해준다. 또한 메모리 할당과 동시에 초기화가 가능하다. (생성자를 호출하기 때문에?)
    • https://flower0.tistory.com/500
    • https://woo-dev.tistory.com/123

**ex01 Moar brainz!**

new[] 와 delete[] 를 사용하여 배열 동적할당을 접한다.

  • new[]
    • Zombie *zhorde = new Zombie[N];
  • delete[]
    • delete[] zhorde;
  • new 와 new[] 차이
    • new[] 로 할당한 것은 반드시 delete가 아닌 delete[]를 사용하여 할당 해제 해야한다.
    • new 와 다르게 new[]는 할당할때 4바이트를 추가 할당하여 추가할당된 공간에 배열을 크기를 저장한다. 후에 delete[]를 불러 할당해제를 진행할 때 배열크기의 정보를 보고 각 class의 소멸자를 호출할 수 있다.
    • 타입이 class 가 아니라면 new, new[], delete, delete[] 를 혼용하여도 에러가 나지 않는다 한다.
    • https://m.blog.naver.com/hirit808/221420671055

**ex02 HI THIS IS BRAIN**

pointer포인터와 reference참조자를 사용하고 차이를 알아본다.

  • reference value 참조형 변수
    std::string	str = "HI THIS IS BRAIN";
    std::string &stringREF = str;
    
    std::string &a; // 누구의 참조인지 정해지지 않았다 error!
    • **레퍼런스는 반드시 처음에 누구의 별명(참조)이 될것인지 정해져야 한다.**
    • 참조가 정해지고 다른 이의 참조로 변경 될 수 없다.
    • 필요한 이유 ? 언제 쓰이는 가 …….. ?
      • 배열이 있고 그중 한 곳을 가리킬때 여기서 움지기이
      • 참조자를 리턴하는 경우의 장점이 무엇일까요? C 언어에서 엄청나게 큰 구조체가 있을 때 해당 구조체 변수를 그냥 리턴하면 전체 복사가 발생해야 해서 시간이 오래걸리지만, 해당 구조체를 가리키는 포인터를 리턴한다면 그냥 포인터 주소 한 번 복사로 매우 빠르게 끝납니다. 마찬가지로 레퍼런스를 리턴하게 된다면 레퍼런스가 참조하는 타입의 크기와 상관 없이 딱 한 번의 주소값 복사로 전달이 끝나게 됩니다. 따라서 매우 효율적이죠!
      • Call-by-Value, Call-by-Reference
  • https://modoocode.com/141

**ex03 Unnecessary violence**

reference 참조자의 쓰임을 확인하고 생성자에 초기화리스트를 사용해보자.

  • 클래스 생성자 초기화에는 2가지가 있다.
    1. 생성자 함수 블록 내에서 대입하여 초기화 하는 방법

    2. 초기화 리스트를 사용하여 초기화 하는 방법

      HumanA::HumanA(std::string set_name, Weapon &set_weapon) 
      	: name(set_name), weapon(set_weapon){ }
  • In which case do you think it would be best to use a pointer to Weapon? And a reference to Weapon? Why? Think about it before starting this exercise.
    • 포인터
      • Weapon *weapon;
    • 레퍼런스 (참조자)
      • Weapon &weapon;
  • 어떤 경우에 포인터를 쓰고 참조자를 써야 할까?
    • 참조자는 선언과 동시에 초기화 되어야 하기 때문에 NULL 을 가질 수 없다. 그렇기 때문에 NULL 포인터를 넘겨주고 반환할 때 필요하다면 포인터를 사용하고, 그렇지 않다면 참조자를 쓰는 것이 좋다.
    • 포인터를 이용하다가 엉뚱한 메모리를 수정하는 불상사를 막을 수 있다.
    • 또한 *arr[10] 이렇게 헷갈리게 접근하지 않고 arr[10] 으로 접근할 수 있어 코드가 깔끔해 진다.
    • https://lecor.tistory.com/39
  • 컴파일러, 최적화 옵션 등에 따라 참조자가 메모리에 존재하기도 존재하지 않기도 한다. 파라미터로 사용될 경우는 거의 대부분 공간이 할당된다고 한다.

**ex04 Sed is for losers**

파일을 읽고 문자열을 대치시키고 새로운 파일을 만들어 저장하는 것을 알아본다.

  • - ifstream ( input file stream) - ostream ( output file stream)
  • c스타일 char*로 문자열을 받아오는 ifstream 이 아닌, 문자열을 string으로 받아오는 <string>에 존재하는 getline함수를 쓰는 것이 좋다.

  • string::npos

    • 찾는 문자열이 없는 경우 반환되는 값
    • -1 의 값의 상수, size_t의 가장 큰 값을 가진다.
  • https://modoocode.com/215

  • https://blockdmask.tistory.com/322

  • ifstream class

  • getline() fail

  • instruction

    • Using C file manipulation functions is forbidden and will be considered cheating. All the member functions of the class std::string are allowed, except replace. Use them wisely!
    • Of course, handle unexpected inputs and errors. You have to create and turn in your own tests to ensure your program works as expected.

**ex05 Harl 2.0**

멤버 함수 포인터를 알고 함수포인터 배열을 사용하기

  • 함수 포인터 배열
    • void (Harl::*f[4])( void ) = {&Harl::debug, &Harl::info, &Harl::warning, &Harl::error};
    • http://aibaz.egloos.com/v/1646367 void (*p)(); // 서로 다른 의미의 선언 (외부 함수를 가르킬수 있는 포인터 변수) void (*A::p)(); // 참고로 이선언은 위의 void (*p)();의 선언과 동일합니다 아래와 혼동하지 마시길... void (A::*p)(); // 서로 다른 의미의 선언 (A클래스의 멤버 함수를 가르킬수 잇는 포인터 변수)

**ex06 Harl filter**

스위치문 사용하기 + break 사용 시점에 따른 실행도 확인하기

  • switch/case 문
    • 사용가능한 입력 변수의 타입은 byte, short, char, int

    • i와 일치하는 case 부터 시작하여 밑으로 차례대로 실행된다. 해당 case에 쓰여있는 부분만 실행되도록 하고 싶다면 break; 를 걸어주면 된다.

    • default 는 일치하는 값이 없다면 수행된다.

      switch (i)
      	{
      		case 0:
      			this->debug();
      		case 1:
      			this->info();
      		case 2:
      			this->warning();
      		case 3:
      			this->error();
      			break;
      		default:
      			std::cout << "[ Probably complaining about insignificant problems ]" << std::endl;
      			break;
       	}

0개의 댓글