정적메모리할당 (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(); pb->cry(); // pa 포인터에의한멤버접근 // 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 public: const string model; bool power; double speed; 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; else speed -= 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;