C++
: 객체지향 프로그래밍(oop)
<oop의 가장 큰 특징>
: 컴파일 시간(프로그램이 코드를 읽는시간)이 아닌 실행 시간에 어떠한 결정을 내릴 수 있음
- 배열 생성
재래적 절차적 프로그래밍
: 배열의 크기가 미리 결정(컴파일시간에)객체지향 프로그래밍
: 배열의 크기를 실행 시간에 결정할 수 있음
포인터
: 사용할 주소에 이름을 붙인다.
즉, 포인터는 포인터의 이름이 주소를 나타냄
간접값 연산자, 간접 참조 연산자* 기호
로 나타냄
#include <iostream>
using namespace std;
int main() {
// 포인터 선언 방법
int *a; //c style
int* b; //c++ style (어떤 방법도 상관없음)
int* c, d; //c는 포인터 변수로 선언되고, d는 int형 변수로 선언됨
return 0;
}
int a = 6;
int* b; // 포인터변수 b 선언. b는 그 자체로 주소를 나타냄
//정수는 수, 포인터는 위치를 나타냄
b = &a; // b에다가 a의 주소값 넣음
cout << "a의 값 " << a << endl;
cout << "*b의 값 " << *b << endl;
cout << "a의 주소 " << &a << endl;
cout << "*b의 주소 " << b << endl;
*b = *b + 1;
cout << "이제 a의 값은 " << a << endl;
/*
[결과]
a의 값 6
*b의 값 6
a의 주소 00000067FAEFFA64
*b의 주소 00000067FAEFFA64
이제 a의 값은 7
*/
new 연산자
어떤 데이터형을 원하는지 new 연산자에게 알려주면,
new 연산자는 그에 알맞은 크기의 메모리 블록을 찾아내고
그 블록의 주소를 리턴함
int* pointer = new int; // int는 4byte (windows 기준)
new int 부분은 int형 데이터를 지정할 수 있는 새로운 메모리가 필요하다고 알려주게 되는 것.
new 연산자는 뒤의 데이터형을 확인하고 몇바이트가 필요한지 계산함
4byte를 저장할 수 있는 메모리 블록을 찾아서 그 주소를 포인터에게 리턴해서 초기화 해줌
delete 연산자
사용한 메모리를 다시 메로리 폴로 환수
환수된 메모리는 프로그램의 다른 부분이 다시 사용
int* ps = new int; // new를 통해 ps 변수 선언
// 메모리 사용
delete ps;
/* ps에 할당된 메모리를 다시 프로그램에 다른 부분이
이 메모리를 사용할 수 있도록 프로그램에 반환해줌
new를 사용하면 반드시 delete를 사용해주어야 함 */
delete를 사용하는 4가지 규칙
1. new로 대입하지 않은 메모리는 delete로 해제할 수 x
2. 같은 메모리 블록을 연달아 2번 delete로 해제할 수 x
(한 번 선언된 포인터 변수는 delete를 한 번만 해야함)
3. new[ ]로 메모리를 대입할 경우 delete[ ]로 해제한다. (배열)
4. 대괄호([ ])를 사용하지 않았다면 delete도 대괄호를 사용하지 x