씹어먹는 c++에서는 스타크래프트 프로그램을 만들어가며 c++을 설명해주고 계신데..
본인은 스타크래프트를 한번도 안해봤고, 내용도 모르고, 관심도 없기 때문에 그냥 내식대로 공부하려 한다 ㅎㅎ
재미가 없어진다는 단점은 있겠지만, 빨리 마스터하고 백준을 풀어야겠따...(근데 지금까지 한 내용이 너무 적어서 진도를 빨리 빼야겠다고 생각했다.)
2주안에 끝낼게요.. 네.. 8월 7일까지요..
일단 그런 경우가 있다. c언어에서도 다룬 내용이지만 많은 학생의 정보를 다루고 싶은데 사용자가 몇명의 학생을 다룰 것인지 정해버리지도 못하는 경우가 있다.
이럴때 student1, student2 .... 이렇게 선언하다가는 학생이 1235명이면 정말 끔찍하다. 이 해결책이 배열로 정해버리면 된다는 것이다.
Student *student[1000];
student[0]=new Student(100,100,100);
...
이런식으로 선언해버리면 된다. 저기 100 100 100은 국어 영어 수학 점수라고 하자
new는 객체를 동적으로 생성하면서 자동으로 생성자도 호출해준다는 특징이 있다.
주의할 점은 포인터 배열이기 때문에 메소드를 호출할 때는 student[0]->show_status();
이런식으로 화살표를 사용해줘야 한다는 것이다.
메모리 해제는 뭐 delete student[0]; 이런식으로 하면 되겠죠? 많으면 반복문 써도 되구..!
그런데 학생 한명한명에 이름 변수를 추가하고 싶어서 char *name; 이런걸 만들었다고 하자. 그러면 여기서 새로 new를 이용하여 동적할당을 하여 문자열을 만들텐데, 이 char배열에 대한 delete를 언제 할것인가!
이런 문제가 발생한다.
우리가 delete 어쩌고 하지 않는 이상 자동으로 delete되는 경우가 없다. 계속해서 메모리 공간에 존재한다는 뜻이다. 이게 천개 백만개 십억개 생기면 메모리 누수가 발생하게 된다.
main함수 끝에서 student가 삭제될 때 자동으로 생성했던 객체들도 소멸됐으면 좋겠다~~ 이런 생각이 드는데요?
그것이 바로 소멸자이다. C++에서는 지원하고 있다고 한다.
메인함수의 밖이면서 클래스의 밖인 곳에서
Student::~Student(){
if(name!=NULL) { //동적으로 할당된 경우
delete[] name;
}
}
이런식으로!
앞에 ~만 붙이면 된다
소멸자는 인자를 아무것도 갖지 않는다는 특징이 있다. 소멸자는 오버로딩도 안된다.
객체가 다른 부분에 영향을 끼치지 않도록 깔끔하게 소멸하는 일은 중요하다. 하지만 소멸자가 필요 없는 클래스라면 굳이 써줄 필요는 없다!
복사 생성자
어떤 클래스 T가 있으면 T(const T& a); 이렇게 정의된다.
다른 T의 객체 a를 상수 레퍼런스로 받는다는 의미이다. a는 const이기 때문에 복사 생성자 내부에서 a의 데이터를 변경할 수 없고 복사 '만' 할 수 있다. 복사 생성자 내부의 인스턴스 변수에 접근해서 초기화를 하는 것은 가능하지만 const로 정의한 a를 바꿀 수는 없다는 소리다.
바꿀일이 없으면 const를 붙이는게 좋다. 그러면 이후에 발생하는 실수들을 효과적으로 막을 수 있다.
복사 생성자는 생성 시에 호출된다는 특징이 있다.
Student S2=S1;
이거랑
Student S2;
S2=S1;
이거는 다른 거다. 위에 것은 복사 생성자가 1번 호출되는 것이고
이레 것은 생성자가 1번 호출되고 S2=S1; 명령이 실행되는 것이기 때문이다.
'CODING > C++ STUDY' 카테고리의 다른 글
C++ 독학 8일차 - String class(insert, erase, find 등) (0) | 2021.07.29 |
---|---|
C++ 독학 7일차 - 디폴트 복사 생성자, 생성자 초기화 리스트, const, static, this 포인터 (0) | 2021.07.28 |
C++ 독학 5일차 - 객체 지향 프로그래밍, 함수의 오버로딩 (0) | 2021.07.23 |
C++ 독학 4일차 - 레퍼런스 후반부, new와 delete (0) | 2021.07.22 |
C++ 독학 3일차 레퍼런스 도입 (0) | 2021.07.20 |