ex00
new & delete
- new, delete keyword
- new가 malloc 역할. 다른 점은 new는
생성자를 호출
한다는 것. malloc으로 인스턴스를 할당하면 생성자가 호출되지 않아서 쓰레기 값이 들어가버림. new 키워드 자체가 malloc과 생성자 호출을 랩핑
한 형태라고 함
- new 키워드로 힙에 메모리를 할당해줬으면,
delete
로 해제해줘야 함.
- delete는
메모리해제와 소멸자 호출
이 같이 이루어짐.
ex01
new[] & delete[]
- new로 배열을 할당하고 싶을 때 : ex)
int *p = new int[n]
- 대신 new로 할당한 배열을 해제할 때는
delete[] p
이렇게 해제해 줘야 함.
ex02
pointer vs reference
- https://www.geeksforgeeks.org/pointers-vs-references-cpp/
- C에서는 메모리 공간에 하나의 이름만 부여할 수 있지만, C++ 에서는 메모리 공간에
여러 이름
을 부여할 수 있음. == reference로 같은 공간
을 다른 이름(별칭)
으로 접근 하는 게 가능
- pointer는 변수의 메모리 주소를 담음(간접 참조). reference는 alias. 별칭이라고 생각하면 됨(직접 참조).
- reference는 원본값과
동일한 메모리 공간
을 사용함
- pointer는 메모리 공간이 따로 할당 되고 그 안에 원본의 주소값을 담고 있음
- pointer는 선언 후 값을 줄 수 있지만 reference는
선언과 초기화가 동시
에 이루어져야 함. 선언 해놓고 나중에 값을 바꾸는 것 안 됨.
ex03
getter
- getter: private으로 멤버변수를 선언하게 되면 그 변수를 직접적으로 손 대지 못하니, getter라는 public 멤버함수를 만들어서 private 멤버변수를 읽어오는 것.
setter
- setter: 마찬가지. 이건 값을 직접 바꾸는 용도로 사용.
함수 인자로서 참조자
- 참조자를 함수 파라미터로 사용하게 되면 함수를 사용할 때 &기호를 붙이지 않아도 알아서 참조자로 전달. 이걸 함수 안에서 다시 &를 써서 메모리 주소를 포인터 변수에 연결시켜 놓으면 함수 안에서 값을 업데이트 시킨 것이 밖에서도 적용됨.
- (원래 c에선 포인터를 사용하지 않으면 무조건 변수가 복사 되어서 함수 안에서 지역변수로 사용이 되고 함수가 끝나면 사라져버렸음. 그래서 포인터 인자를 사용해서 애초에 함수에 &기호를 붙여서 메모리 주소로 전달해 줘야 했었는데 cpp에선 그냥 함수 인자를 참조자로 선언해놓으면 &기호 안 붙이고 전달해줘도 참조자로 전달.)
ex04
std::ifilestream, std::ofstream
std::getline()
std::string::find(), std::string::erase(), std::string::insert()
ex05
private member function
- 캡슐화, 은닉성과 관련이 있음
- 함수를 사용하지만 외부에서 사용할 일이 없는 경우 private으로 선언해 놓고 사용 가능.
function pointer
- [반환형] [변수명] [함수 인자] 꼴로 사용
void (Harl::*fptr)( void )
function pointer사용 오류
void (Harl::*fptr[])( void ) = {
&Harl::debug,
&Harl::info,
&Harl::warning,
&Harl::error
};
for (int i = 0; i < 4; i++)
{
if (level == levels[i])
*fptr[i]();
}
for (int i = 0; i < 4; i++)
{
if (level == levels[i])
(this->*fptr[i])();
}
if, else문 없이 함수포인터 사용하기 - 배열 사용하기
std::string levels[] = {
"debug",
"info",
"warning",
"error"
};
void (Harl::*fptr[])( void ) = {
&Harl::debug,
&Harl::info,
&Harl::warning,
&Harl::error
};
- map함수를 사용하면 더 쉽고 직관적이겠지만, cpp08 전까지는 STL 사용이 금지 되었기 때문에 각 배열을 따로 선언해주고 인덱스가 같게끔 해서 연결해주는 방법을 사용.