본문 바로가기
42seoul/circle-4

[ CPP01 ] 0. 과제 이해하기

by saniii 2022. 7. 28.

 

This module is designed to help you understand the memory allocation, reference, pointers to members and the usage of the switch in CPP.

메모리할당, 참조, 멤버포인터, switch 에 대해 알아보자..!

 

 

ex00

 

- 먼저 Zombie 클래스를 생성하고 private string name을 가진다.

- announce 함수를 좀비 클래스에 만들고 좀비들이 자신의 이름을 스스로 말하도록 하기

 

다음의 두 함수를 만들어라

- newZombie : 좀비를 생성하고 이름을 붙이고 반환하여 함수밖에서 사용할 수 있도록 해라

- randomChump : 좀비를 만들고 이름을 붙이고 announce 함수를 실행하도록 해라

 

- 좀비를 stack에 할당하는 것이 더 나은지, heap에 할당하는 것이 더 나은지 생각해봐라

 

- 좀비는 프로그램이 끝날때 삭제되어야하며 소멸자는 디버깅을 위해 메세지를 출력해야한다


c++          stack vs heap

https://boycoding.tistory.com/235

 

newZombie의 경우 좀비를 생성하여 반환한 후 newZombie의 밖에서도 생성한 좀비 객체가 살아있어야하므로 new를 이용하여 heap에 할당한 후 사용이 끝나면 delete하여 소멸시킨다. 

 

randomZombie의 경우 random안에서 좀비를 생성하고, 동작시키고자 하는 모든 동작을 실행시키며 함수자체도 반환값을 가지지 않기때문에 굳이 heap에 할당하여 따로 delete할 필요없이 randomZombie의 호출이 끝나면 자동으로 소멸되도록 stack에 할당될 수 있도록 한다. 

 

  • stack
    • 함수 안의 변수, 
    • 선언했던 함수의 동작이 끝나면 함수의 동작 동안 선언되었던 변수들이 자동으로 소멸한다. 
  • heap
    • ㅇㄹ
    •  

 


 

 

ex01

horde of Zombies(좀비 떼거리)를 만들차례!

zombieHorde 함수를 만들어라

- (파라미터로 받은 n ) n개의 좀비 객체를 만들고 (배열) 좀비를 초기화해라(파라미터로 받은 이름을 전달하기)

- 함수는 첫번째 좀비의 주소를 반환한다.

- 이 함수가 잘 작동하는 것을 보여줄 test를 만들어라

     - 각 좀비들이 announce를 작동하도록 해라

 

- 메모리 누수 안나게 delete하는거 잊지말고

 


new는 heap으로부터 메모리를 할당받고 delete는 할당받은 메모리를 heap에 반환한다. 

  • new
    • heap메모리가 부족하면 null을 반환한다. 
    • 메모리를 할당 받을 때 초깃값을 설정하여 초기화할 수 있다. 
    • 클래스 *변수명 = new 클래스[N]; 과 같이 선언하여 배열을 할당받으면 클래스의 기본생성자가 호출된다. 뒤에 {}로 각각 원하는 생성자를 호출할 수도 있다. 

 

  • this
    • 객체 자신에 대한 포인터 
    • 객체의 멤버함수가 호출될 때 컴파일러에 의해 객체 또한 전달되는데 이 객체의 주소를 가리키는 것이 this이다. 
    • 멤버 변수와 동일한 이름을 가진 파라미터를 만들었을 때 사용하거나 객체의 멤버함수가 자신의 주소를 리턴을 하고자 할 때(연산자 중복 구현) 사용한다. 
    • 클래스의, static으로 선언되지 않은 멤버함수에서만 사용할 수 있다. 
    • 컴파일러는 this를 사용하는 멤버함수가 있는 클래스를 컴파일 할 때 this를 사용하는 멤버 변수의 선언에서 자동적으로 (클래스 *this)라는 파라미터를 추가한다. 따라서 this는 매개변수로서 동작할 수 있다. 

 


 

ex02

 

 

HI THIS IS BRAIN 이라고 초기화된 스트링변수를 만들고

stringPTR : string을 가리키는 포인터

stringREF : string을 가리키는 참조

 

string변수의 메모리 주소를 출력하고

stringPTR이 가리키는 메모리 주소 출력

stringREF가 가리키는 메모리 주소 출력

 

그리고 string 변수의 값을 출력

stringPTR, stringREF가 가리키는 값을 출력

 

 


 

 

  • 값에 의한 호출
    • 전달하고자 하는 값을 매개변수에 복사하여 넘김
    • 어떤 함수의 매개변수에 값에 의한 호출로 넘겼을 때 전달받은 함수에서 변수값을 변경하여도 전달한 함수의 변수에는 영향이 가지 않는다. (매개변수 객체에 변화가 일어나도 원본 객체는 변하지 않는다.)
    • 생성자보다 소멸자가 많이 실행되는 비대칭 구조가 발생
      • 이미 생성자를 통해서 생성된 객체를 매개 변수로 복사하여 전달되었기 때문에 매개 변수 객체는 생성자를 실행하지 않지만 (매개변수를 전달받은)함수가 소멸되면 매개변수로 받은 객체의 소멸자는 실행된다.
        • 이 문제는 복사 생성자를 통해서 해결할 수 있다. ㅎㅎ
  • 주소에 의한 호출
    • 객체의 주소를 전달
    • 원본 객체(변수)의 주소를 가리키고 있기 때문에 주소를 전달받은 객체에서 변수값을 변경하면 원본 객체도 변경된다. (의도하지 않게 원본 객체를 훼손할 수 있음)
    • 원본 객체를 복사하지 않아도 되므로 시간낭비가 없다. 
    • 생성자 , 소멸자 비대칭의 문제가 없다. 
  • 참조 (reference)
    • 이미 선언된 변수의 별명
    • 선언할 때 원본 변수로 초기화해야한다. 
    • 타입 &변수명 = 원본변수;  로 선언
    • 주소에 의한 호출은 주소를 저장하기 위한 공간이 할당되지만 참조는 원본 객체 자체를 가리키는 또다른 이름이기 때문에 따로 공간이 할당되지 않는다. 참조변수의 주소를 찍으면 원본변수의 주소가 나온다. 
    • 참조변수의 배열은 만들 수 없다. 
    • 참조 변수에 대한 참조 변수는 선언할 수 있다. -> 원본 변수의 별명이 2개인 셈
  • 참조에 의한 호출
    •  

 

 

 

 

 

 

 


ex03

 

Weapon class 

- private string 변수 type을 가진다.

- type의 const reference 를 반환하는 getType() 멤버 함수

- setType()

 

참조자는 생성초기에만 정의될 수 있다. 

A는 Weapon을 가진채로 생성이 되어야하므로 -> 상관없으므로 참조자 

B는 포인터

 

 const가 함수 뒤에 명시되면 해당 함수에서 클래스 변수를 변경할 수 없다. 

 

const 참조 

https://velog.io/@appti/CPP-Module-01-ex03

 

 

humanA 와 humanB는 두가지의 사소한 다른점이 있다.

- A는 그의 생성자에 weapon을 가지고 있지만 B는 아니다.

- B는 항상 무기를 가지고 있지 않지만 A는 항상 무기를 가지고 있다. 

 


 

ㄷㅌ04

 

세개의 파라미터를 가진 프로그램을 만들어라 : filename, s1, s2

filename이름의 파일을 열어서  그 내용을 복사하고 새 파일 filename.replace에 넣어라. 넣을 떄 s1의 문자열은 s2로 치환해서 저장한다. 

 

std::string의 모든 멤버 함수를 사용할 수 있다. replace 빼고!!!

 

물론 입력 에러에 대한 것을 핸들링 해야한다. 

 

과제물이 잘 작동하는지 검사하기 위한 test도 만들어야한다. 

 

 

 


ex05

Harl 는 4단계로 분류된다.

 

  • DEBUG 
    • 디버그 메시지는 문장으로된 정보를 담고 있다. 문제 진단을 위해 주로 쓰인다. 
    • Example: "I love having extra bacon for my 7XL-double-cheese-triple-pickle-specialketchup burger. I really do!"
  • INFO
    • 이 메세지는 확장된 정보를 담고 있다. 
    •  

 

 

 

 

 

 

 

 

 

ex05

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'42seoul > circle-4' 카테고리의 다른 글

[ CPP04 ] 0. 과제이해하기  (0) 2022.08.02
[ CPP03 ] 0. 과제이해하기  (0) 2022.08.01
[NetPractice] 01. need to know  (0) 2022.07.31
[ CPP02 ] 0. 과제이해하기  (0) 2022.07.30
[ NetPractice ] NetAnswer  (0) 2022.07.12

댓글