티스토리 뷰

객체 포인터

- 객체에 대한 포인터이다.

- C언어의 포인터가 값의 주소값을 저장하듯, C++의 객체 포인터는 객체주소값을 가진다.

- '포인터'로 멤버에 접근 할 때, p -> 멤버 형식으로 접근한다.

 

객체포인터 선언 예.

<소스 코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
class Circle {
int radius;
public:
       Circle() { radius=1;}
       Circle(int r) {radius=r;}
       double getArea();     
};
 
double Circle::getArea() {
    return 3.14*radius*radius;      
}
 
int main(int argc, char *argv[])
{
    //객체 포인터 접근 예제
    //
    Circle donut;
    //1.객체 포인터 선언     
    Circle *p;
    //2. 초기값 지정 
    p = &donut; //donut 객체의 주소를 저장.
    
    //3. 포인터(p)를 이용해서 멤버 함수(getArea())에 접근.
    //기호는 -> 또는 (*p).멤버함수 
    cout  <<"donut의 넓이 : "<< p->getArea() << endl
    // cout << (*p).getArea() << endl;
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
cs

 

<실행 결과>

 

객체 배열

- 기본 타입(int, doube..) 배열 선언과 동일한 방식으로 선언한다.

 

*객체 배열 형식

int n[3]; // 정수형 배열 선언

Circle c[3]; // Circle 타입의 배열 선언

 

2. 객체배열 선언 예 (객체배열에서 생성자, 소멸자 실행 방법)

<소스 코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
class Circle {
int radius;
public:
       Circle() { radius=1;}
       Circle(int r) {radius=r;}
       void setRadius(int r){radius = r;} 
       double getArea();     
};
 
double Circle::getArea() {
    return 3.14*radius*radius;      
}
 
int main(int argc, char *argv[])
{
    //객체 배열 예제
    //1.객체 배열 선언(자료형 배열 이름[크기])
    Circle circleArray[3];
    
    //2.객체배열의 멤버에 접근
    circleArray[0].setRadius(10);
    circleArray[1].setRadius(20);
    circleArray[2].setRadius(30);
    
    //3개의 객체의 면적을 출력
    for(int i = 0; i < 3; i++)
        cout << "각 Circle "<< i << "의 넓이 : "<< circleArray[i].getArea() << endl;
 
    
    //포인터로 circle 배열에 접근해서 출력하는 코드
    //1.포인터 변수 선언.
    Circle *p;
    
    //2. 초기값 지정
    p = circleArray;//배열 이름 = 메모리의 시작주소이므로 &없이 주소저장(초기값)
    for(int i = 0; i < 3; i++){
        cout << "각 Circle "<< i <<"의 넓이: " << p->getArea() << endl;
        p++;
    } 
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
cs

 

<실행 결과>

 

<객체배열 선언 예2(초기화) 소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
class Circle {
 int radius;
public:
    Circle() {radius = 1;}
    Circle(int r) {radius = r;}     
    double getArea(){ return 3.14*radius*radius;  }     
};
 
 
int main(int argc, char *argv[])
{
    //반지름이 15인 waffle 객체 선언
    Circle waffle(15);
     
    //객체배열 선언 : 크기 3인 객체배열 CircleArray를 선언
    //Circle circleArray[3]; // 개게배열은 기본생성자를 호출한다. 기본생성자를 만들어 줘야 한다. 
    
    //객체배열의 초기화 : 생성자함수를 호출하여 지정한다. 
    Circle circleArray[3= {Circle(10), Circle(20), Circle()};
    
    //배열 출력
    for(int i = 0; i < 3; i++)
        cout << "Circle " << i << "의 면적은 " << circleArray[i].getArea() << endl;
        
    system("PAUSE");
    return EXIT_SUCCESS;
}
cs

 

<실행 결과>

 

 

 

소멸자

- 함수가 종료하면 함수 내에 선언된 배열도 소멸된다.

- 객체가 소멸될 때 각 원소 객체마다 소멸자가 호출된다.

 

 

 

동적메모리 할당 및 반환

 

(1) 정적 할당

- 변수 선언을 통해 필요한 메모리 할당한다.

- 메모리 낭비가 발생할 수 있다.

 

(2) 동적 할당

- new 연산자를 이용해 객체의 동적 생성 - 힙 메모리로부터 객체를 위한 메모리 할당 요청한다.

- 객체 할당 시 생성자 호출한다.

*new 사용 형식

데이터타입 *포인터변수 = new 데이터타입 ;
delete 포인터변수;

 

- delete 연산자를 이용해 new로 할당 받은 메모리 반환한다.
- 객체의 동적 소멸 - 소멸자 호출 뒤 객체를 힙에 반환한다.

* delete 사용 형식

int *pInt = new int; // int 타입의 메모리 동적 할당
char *pChar = new char; // char 타입의 메모리 동적 할당
Circle *pCircle = new Circle(); // Circle 클래스 타입의 메모리 동적 할당
delete pInt; // 할당 받은 정수 공간 반환
delete pChar; // 할당 받은 문자 공간 반환
delete pCircle; // 할당 받은 객체 공간 반환

 

<동적 메모리 할당 예제 소스 코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<iostream>
 
using namespace std;
//동적할당 예 : 힙영역에 입력받은 크기의 배열을 생성
int main() {
    cout << "입력할 정수의 개수 : ";
    int n;
    cin >> n;//heap 메모리 공간에 할당 받을 크기를 입력
    
    int *p;//할당 받은 메모리 주소를 담을 포인터 변수
    
    p = new int[n];//입력받은 크기로 배열을 사용.
 
    if (!p) {   //메모리 할당 받지 못했을 떄 !p 이다.
        cout << "메모리를 할당 할 수 없습니다.";
    }
 
    //heap에 할당 받은 배열의 내용을 입력
    for (int i = 0; i < n; i++) {
        cout << i << "번째 정수 : ";
        cin >> p[i];
    }
 
    //heap에 저장된 배열내용 출력
    for (int i = 0; i < n; i++) {
        cout << p[i] << " ";
    }
 
    delete[] p; // heap 공간을 반납
 
    return 0;
}
cs

 

<실행결과>

 

 

(3) <객체배열의 동적할당 예제 소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <cstdlib>
#include <iostream>
 
using namespace std;
//객체배열 생성, 소멸 예제 
class Circle {
    int radius; 
public:
    Circle(); 
    Circle(int r);
    ~Circle();
    void setRadius(int r) { radius = r; }
    double getArea() { return 3.14*radius*radius; }
};
 
Circle::Circle() {
    radius = 1;
    cout << "생성자 실행 radius = " << radius << endl;
}
 
Circle::Circle(int r) {
    radius = r; 
    cout << "생성자 실행 radius = " << radius << endl;
}
 
Circle::~Circle() {
    cout << "소멸자 실행 radius = " << radius << endl;
}
 
int main(int argc, char *argv[])
{
    //동적할당 : 객체배열생성 
    //*ppArray를 선언한 이유는 주소를 받는 포인터 변수가 필요하기 떄문. 
    Circle *pArray = new Circle[3]; //heap 영역에 3개의 객체 배열 생성
    
    //객체배열의 초기화
    int value = 10;
    for(int i = 0; i < 3; i++){
        value += i;
        pArray[i].setRadius(value); 
    }
    
    //heap의 객체배열내용 출력
    for(int i = 0; i < 3; i++){
        cout << pArray[i].getArea() << endl;
    } 
    
    delete[] pArray; //객체밸열 반환
     
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
cs

 

<실행 결과>

 

 

 

기본 자료형의 동적 할당

(1) 형식

int *p = new int;

delete p;

 

(2) 초기값

int *p = new int(20);

 

배열의 동적할당

(1) 형식

int *p = new int[5];

delete[] p;

 

(2) 초기값

int *p = new int[10](20)// 구문 오류

 

객체 동적 할당

(1) 형식

Circle *p = new Circle;

delete p;

 

(2) 초기값

Circle *p = new Circle(20);

 

(3) 소멸자

소멸자 : 순서에 상관 없이 실행

객체의 정적할당에서 소멸자 실행

 

배열의 동적할당

(1) 형식

Circle *p = new Circle[3];

delete[] p;

 

(2) 초기값

Circle *p = new Circle[3](30)// 구문 오류

 

댓글