• 검색 결과가 없습니다.

일반적으로 프로그램의 실행에 필요한 메모리(변수, 배 열

N/A
N/A
Protected

Academic year: 2022

Share "일반적으로 프로그램의 실행에 필요한 메모리(변수, 배 열"

Copied!
16
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)
(2)

 정적 메모리 할당(Static memory allocation)

일반적으로 프로그램의 실행에 필요한 메모리(변수, 배 열, 객체 등)는 컴파일 과정에서 결정되고, 실행파일이 메 모리에 로드될 때 할당되며, 종료 후에 반환됨

 동적 메모리 할당(Dynamic memory allocation)

프로그램의 실행 중에 필요한 메모리를 할당받아 사용 하고, 사용이 끝나면 반환함

- 메모리를 프로그램이 직접 관리해야 함(포인터 사용) - 메모리를 할당받으면 명시적으로 반환해야 함

- 메모리를 효율적으로 사용할 수 있음

(3)

 동적 메모리의 할당 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>

(4)

// 동적 메모리 관리 프로그램

#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;

}

(5)

 객체도 포인터를 사용할 수 있음

- 객체의 생성시 정적 메모리 할당 또는 동적 메모리 할당 을 할 수 있으며, 동적 메모리 할당은 포인터를 사용

- 포인터를 통하여 객체 멤버를 접근하는 경우는 -> 사용 예) Animal a; // 정적 메모리 할당

Animal *pa = &a;

Animal *pb = new Animal(); // 동적 메모리 할당 pa->Cry(); // pa 포인터에 의한 멤버 접근 pb->Cry(); // pb 포인터에 의한 멤버 접근

(6)

 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를 나타냄

(7)

 멤버변수에 붙이는 const

- 멤버변수에 const를 붙이면 상수가 됨

- 멤버변수에 저장된 초기값이 바뀌지 않는 경우에 사용 (생성자의 멤버 초기화 목록으로 초기화함)

 멤버함수에 붙이는 const

- 멤버함수에 const를 붙이면 이 함수에서 멤버변수에 저 장된 값을 바꾸지 않는 경우에 사용

예)class Animal{

void Cry( ) const; // 상수 멤버 함수 const int sp_code; // 상수 멤버 변수 };

(8)

 객체에 붙이는 const

- 객체에 const를 붙이면 이 객체에서는 멤버변수의 값을 바꾸지 않는다는 것을 나타냄

- 상수멤버함수가 아닌 함수는 호출할 수 없음 예)const Animal a(10, 20, “발발이”);

cout << a.get_name( );

// get_name()이 const 함수이면 가능 a.set_name(“똘똘이”);

// 불가능(컴파일 에러 발생)

(9)

#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;

}

(10)

 객체도 함수의 인자로 사용 가능함 - 함수의 매개변수로 전달 가능

(call-by-value : 멤버변수가 복사됨) - 함수의 반환 값으로 객체 사용 가능

- 객체의 포인터를 함수의 매개변수로 전달 가능 (call-by-address : 객체의 주소가 전달됨)

- 객체의 참조자를 함수의 매개변수로 전달 가능 (call-by-referecce : 객체의 별명이 전달됨)

(11)

 지역 변수 : 일반적인 변수, 자동변수

- 블록 내부에서 선언되며 블록 내부에서만 사용 가능함 - 블록이 실행될 때 생성되고, 블록 실행 종료시 제거됨

※ 블록이란 { }로 둘러쌓인 범위를 말함

 전역 변수

- 함수 외부에서 선언되며 소스파일 전체에서 사용 가능함 - 프로그램의 실행 시작시 생성되어 프로그램 실행 종료까 지 존재함

※ 외부변수 : 다른 소스파일에서 선언된 전역변수를 사용 할 경우에는 외부 변수로 선언해야 함

예) extern int no;

(12)

 정적 지역 변수

- 블록 내부에서 선언되며 블록 내부에서만 사용 가능함 예) static int count;

 정적 전역 변수

- 함수 외부에서 선언되며 선언된 소스파일에서만 사용 가 능함(다른 소스파일에서 외부변수로 사용할 수 없음)

※ 정적변수는 프로그램의 실행 시작시 생성되어 프로그램 실행 종료까지 존재하며, 초기화는 1번만 이루어지고 초기값 이 주어지지 않으면 0또는 NULL 값이 저장됨

(13)

// 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; //정적지역변수 } :

(14)

 정적 멤버 변수

- 클래스의 멤버 변수를 정적 변수로 선언하면, 오직 1개의 메모리를 모든 객체가 공유함

※ 멤버변수의 초기화는 생성자에서 하지 않고, 클래스 외 부에 별도로 정의함

 정적 멤버 함수

- 클래스의 멤버 함수를 정적 함수로 선언하면, 오직 1개의 함수를 모든 객체가 공유함

※ 정적멤버함수의 호출은 객체명을 사용하지 않고, 클래스 명으로 호출함, 따라서 객체가 생성되기 전이라도 호출될 수 있음

(15)

// 정적 멤버 프로그램

#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;

}

(16)

 정적 상수

- 상수를 클래스의 정적 멤버로 선언하면, 하나의 상수를 모든 객체가 공유함

- 정적 상수는 클래스에서 선언과 동시에 초기화할 수도 있 음(※ 정수형만 가능한 컴파일러도 있으므로 실수는 외부초 기화를 권장함)

예) static const int count = 0;

static const double pi = 3.141592;

참조

관련 문서

카세트 메모리 기능이 있는 디지털 비디오 카메라 녹화기로 녹화된 테이프에 녹화할 때, 카세트 메모리 기 능이 없는 디지털 비디오 카메라 녹화기를 사용하면

[r]

- 한국의 대미 수출 비중은 지속적으로 감소하고 있으나 미국경제의 성장 둔화가 세계경제 전체로 확산될 경우를 대비. ㆍ미국경제는 전세계

연속확률 변수 x의 평균이 25이고, 표준편차가 4일 때, 다음 x값 또는 범위를 z로 바꾸고 그 면 적을

아울러 리더는 전략을 수립하면서 조 직이 목표를 달성하는 데 필요한 업무를 수행할 능력이 있는지, 그리고 어떤 방식으로 수행할 것인지를 규명해야 한다.. 계획은

Ø 객체 또는 클래스명을 통해 접근 가능 (단, public인 경우에 한함) Ø 변수 생성을 위해서는 초기화 과정 필수. n

실행 중인

All Rights Reserved... All