정적 메모리 할당(Static memory allocation)
일반적으로 프로그램의 실행에 필요한 메모리(변수, 배 열, 객체 등)는 컴파일 과정에서 결정되고, 실행파일이 메 모리에 로드될 때 할당되며, 종료 후에 반환됨
동적 메모리 할당(Dynamic memory allocation)
프로그램의 실행 중에 필요한 메모리를 할당받아 사용 하고, 사용이 끝나면 반환함
- 메모리를 프로그램이 직접 관리해야 함(포인터 사용) - 메모리를 할당받으면 명시적으로 반환해야 함
- 메모리를 효율적으로 사용할 수 있음
동적 메모리의 할당 new 연산자를 사용함
(할당된 메모리 번지를 반환, 할당되지 못하면 null 반환) 예)int *pti = new int;
int *pti = new int(10); // 초기화
double *ptd = new double[10]; // 동적 배열
동적 메모리의 사용
포인터 변수에 메모리의 번지를 저장하여 사용
동적 메모리의 반환
delete 연산자를 사용함 예) delete pti;
delete[] ptd;
※ C언어 함수 할당 : malloc() 반환 : free()
헤더파일<stdlib.h>
// 동적 메모리 관리 프로그램
#include <iostream>
using namespace std;
int main() { int n;
cout << “정수의 수는 : “;
cin >> n;
int *data = new int[n];
cout << n << “개 정수입력 : “;
for(int i=0; i<n; i++) cin >> data[i];
cout << “< 입력정수 >\n”;
for(int i=0; i<n; i++){
cout << hex << data+i;
cout << “ 번지 : “;
cout << dec << data[i];
cout << endl;
}
delete[ ] data;
return 0;
}
객체도 포인터를 사용할 수 있음
- 객체의 생성시 정적 메모리 할당 또는 동적 메모리 할당 을 할 수 있으며, 동적 메모리 할당은 포인터를 사용
- 포인터를 통하여 객체 멤버를 접근하는 경우는 -> 사용 예) Animal a; // 정적 메모리 할당
Animal *pa = &a;
Animal *pb = new Animal(); // 동적 메모리 할당 pa->Cry(); // pa 포인터에 의한 멤버 접근 pb->Cry(); // pb 포인터에 의한 멤버 접근
this 포인터는 자신을 가리키는 객체 포인터임
- this 포인터는 컴파일러에 의하여 자동생성되므로 별도로 선언할 필요없이 사용하면 됨
- 주로 매개변수와 멤버변수를 구분하기 위하여 사용하며, 객체 자신의 주소를 반환하는 함수에서 사용함
예) void Animal::set_sp_code(int sp_code) { this->sp_code = sp_code;
return;
// = 왼쪽 this->sp_code는 멤버변수 sp_code,} // 오른쪽 sp_code는 매개변수 sp_code를 나타냄
멤버변수에 붙이는 const
- 멤버변수에 const를 붙이면 상수가 됨
- 멤버변수에 저장된 초기값이 바뀌지 않는 경우에 사용 (생성자의 멤버 초기화 목록으로 초기화함)
멤버함수에 붙이는 const
- 멤버함수에 const를 붙이면 이 함수에서 멤버변수에 저 장된 값을 바꾸지 않는 경우에 사용
예)class Animal{
void Cry( ) const; // 상수 멤버 함수 const int sp_code; // 상수 멤버 변수 };
객체에 붙이는 const
- 객체에 const를 붙이면 이 객체에서는 멤버변수의 값을 바꾸지 않는다는 것을 나타냄
- 상수멤버함수가 아닌 함수는 호출할 수 없음 예)const Animal a(10, 20, “발발이”);
cout << a.get_name( );
// get_name()이 const 함수이면 가능 a.set_name(“똘똘이”);
// 불가능(컴파일 에러 발생)
#include <iostream>
#include <string>
using namespace std;
class Car{
const string model;
bool power;
double speed;
public:
Car(string m, bool p=false, double s=0.0):model(m), power(p), speed(s){};
void set_power();
void set_speed(bool);
double get_speed() const;
};void Car::set_power()
{ power = !power;
return;
}void Car::set_speed(bool a) { if(!power)return;
if(a)
speed += 0.1;
elsespeed -= 0.1;
return;
}double Car::get_speed() const
{ return speed;
}
int main()
{ Car car1("소나타");
car1.set_power();
car1.set_speed(true);
cout << car1.get_speed() << endl;
return 0;
}
객체도 함수의 인자로 사용 가능함 - 함수의 매개변수로 전달 가능
(call-by-value : 멤버변수가 복사됨) - 함수의 반환 값으로 객체 사용 가능
- 객체의 포인터를 함수의 매개변수로 전달 가능 (call-by-address : 객체의 주소가 전달됨)
- 객체의 참조자를 함수의 매개변수로 전달 가능 (call-by-referecce : 객체의 별명이 전달됨)
지역 변수 : 일반적인 변수, 자동변수
- 블록 내부에서 선언되며 블록 내부에서만 사용 가능함 - 블록이 실행될 때 생성되고, 블록 실행 종료시 제거됨
※ 블록이란 { }로 둘러쌓인 범위를 말함
전역 변수
- 함수 외부에서 선언되며 소스파일 전체에서 사용 가능함 - 프로그램의 실행 시작시 생성되어 프로그램 실행 종료까 지 존재함
※ 외부변수 : 다른 소스파일에서 선언된 전역변수를 사용 할 경우에는 외부 변수로 선언해야 함
예) extern int no;
정적 지역 변수
- 블록 내부에서 선언되며 블록 내부에서만 사용 가능함 예) static int count;
정적 전역 변수
- 함수 외부에서 선언되며 선언된 소스파일에서만 사용 가 능함(다른 소스파일에서 외부변수로 사용할 수 없음)
※ 정적변수는 프로그램의 실행 시작시 생성되어 프로그램 실행 종료까지 존재하며, 초기화는 1번만 이루어지고 초기값 이 주어지지 않으면 0또는 NULL 값이 저장됨
// source1.cpp
#include <iostream>
using namespace std;
int no; // 전역변수
static int s_no; // 정적전역변수 int main()
{ extern int no; //외부변수 : (생략가능) }int sub1()
{ int l_no; //지역변수 } :
// source2.cpp
#include <iostream>
using namespace std;
int sub2()
{ extern int no; //외부변수(가능) int m_no; //지역변수
} :
int sub3()
{ extern int s_no; //외부변수(불가) static int n_no; //정적지역변수 } :
정적 멤버 변수
- 클래스의 멤버 변수를 정적 변수로 선언하면, 오직 1개의 메모리를 모든 객체가 공유함
※ 멤버변수의 초기화는 생성자에서 하지 않고, 클래스 외 부에 별도로 정의함
정적 멤버 함수
- 클래스의 멤버 함수를 정적 함수로 선언하면, 오직 1개의 함수를 모든 객체가 공유함
※ 정적멤버함수의 호출은 객체명을 사용하지 않고, 클래스 명으로 호출함, 따라서 객체가 생성되기 전이라도 호출될 수 있음
// 정적 멤버 프로그램
#include <iostream>
using namespace std;
class Animal{
public:
Animal();
void Cry();
static int get_count();
~Animal();
private:
int sp_code;
int origin_code;
string name;
static int count;
};
Animal::Animal() { sp_code = 0;
origin_code = 10;
name = “발발이”;
}
int Animal::count = 0;
int main()
{ Animal a, b, c;
a.Cry();
cout << Animal::get_count();
return 0;
}
정적 상수
- 상수를 클래스의 정적 멤버로 선언하면, 하나의 상수를 모든 객체가 공유함
- 정적 상수는 클래스에서 선언과 동시에 초기화할 수도 있 음(※ 정수형만 가능한 컴파일러도 있으므로 실수는 외부초 기화를 권장함)
예) static const int count = 0;
static const double pi = 3.141592;