C++ 4-1

BakJeonghyun·2022년 9월 19일
0

전공C++

목록 보기
8/20

[내용]

  • 객체 포인터
  • 객체 배열
  • 객체 동적 메모리 할당

4-1 객체 포인터 선언 및 활용

<실행 결과>
3.14
3.14
3.14
2826
2826

#include <iostream>
using namespace std;

class Circle {
	int radius;
public:
    Cicle() {radius = 1;};
    Circle(int r) {radius = r;};
    double getArea();
};
double Circle::getArea() {
	return 3.14*radius*radius;
}

int main() {
	Circle donut;
    Circle pizza(30);
    
    cout<< donut.getArea()<< endl;
    
    Circle *p;
    p = &donut;
    cout << p->getArea() << endl; 
    // (*p).getArea() = donut.getArea()
    
    p = &pizza;
    cout << p->getArea() << endl; // =pizza.getArea()
}

4-2 Circle 클래스의 배열 선언 및 활용

<실행 결과>
Circle 0의 면적은 314
Circle 1의 면적은 1256
Circle 2의 면적은 2826
Circle 0의 면적은 314
Circle 1의 면적은 1256
Circle 2의 면적은 2826

#include <iostream>
using namespace std;

class Circle {
	int radius;
public:
    Cicle() {radius = 1;};
    Circle(int r) {radius = r;};
    double getArea();
    setRadius(int r) {radius = r;};
};
double Circle::getArea() {
	return 3.14*radius*radius;
}


int main() {
	Circle array[3];
	Circle *p;
    *p = array;
    
    for(int i=0; i < n; i++) {
    	array[i].setRadius(10*(i+1));
    }
	for(int i=0; i < n; i++) {
    	cout << "cout << "Circle " << i << "의 면적은 " << array[i] << endl;
    }
	for(int i=0; i < n; i++) {
    	cout << "Circle " << i << "의 면적은 " << p[i]->getArea();
        p++;
    }
    
}

TIP

<객체 포인터를 사용하여 객체 배열을 다루는 다양한 사례>
객체 포인터를 이용하여 circleArray의 각 Circle 객체을 출력하는 코드를 다양하게 작성할 수 있다.
(1) 포인터 p를 이용하여 객체처럼 접근

	Circle *p = circleArray;
    for(int i=0; i<3; i++)
    	cout << (*p).getArray() << endl; // (*p) == circleArray

(2) 배열의 이름 circleArray를 포인터로 사용

	for(int i=0; i<3; i++)
    	cout << (circleArray+i)->getArray() << endl;

(3) 포인터 p의 정수 연산 이용

	Circle *p = circleArray;
    for(int i=0; i<3; i++)
    	cout << (p+i)->getArray() << endl;

4-3 객체 배열 초기화

<실행 결과>
Circle 0의 면적은 314
Circle 1의 면적은 1256
Circle 2의 면적은 3.14

#include <iostream>
using namespace std;

class Circle {
	int radius;
public:
	Circle() {radius = 1};
    Circle(int r) {radius = r};
    doble getRadius() {return 3.14*radius*radius;};
};

int main() {
	Circle a[3] = {Circle(10), Circle(20), Circle()};
    for(int i=0; i < 3; i++) {
    	cout << "Circle " << i << "의 면적은 " << a[i] << endl;
    }  
}

4-4 Circle 클래스의 2차원 배열 선언 및 활용

<실행 결과>
Circle [0,0]의 면적은 3.14
Circle [0,1]의 면적은 12.56
Circle [0,2]의 면적은 28.26
Circle [1,0]의 면적은 50.24
Circle [1,1]의 면적은 78.5
Circle [1,2]의 면적은 113.04

#include <iostream>
using namespace std;

class Circle {
	int radius;
public:
	Circle() {radius = 1};
    Circle(int r) {radius = r};
    doble getRadius() {return 3.14*radius*radius;};
};

int main() {
	Circle a[2][3] = { {Circle(), Circle(2), Circle(3)},
    				{Circle(4), Circle(5), Circle(6)} };
    for(int i=0; i<2; i++) {
    	for(int j=0; j<3; j++) {
        	cout << "Circle " << [i,j] << "의 면적은 " << a[i][j] << endl;
        }    	
    }  
}

CHECK TIME

  • 다음 클래스에 대해 물음에 답하여라.
class Sample {
	int a;
public:
	Sample() { a = 100; cout << a < ' ' ; };
    Sample(int x) { a = x; cout << a < ' ' ; };
    Sample(int x, int y) { a = x*y; cout << a < ' ' ; };
    int get() { return a; };
};

(1) Sample arr[3];이 실행될 때 출력되는 결과는?

	100 100 100

(2) Sample arr2D[2][2] = { {Sample(2, 3), Sample(2, 4)}, {Sample(5), Sample()} };이 실행될 때 출력되는 결과는?

	6 8 5 100

(3) 객체 포인터를 이용하여 (1)에서 선언된 arr의 모든 원소(a)의 합을 출력하는 for 문을 작성하라.

	int sum = 0;
	for (int i = 0; i < 3; i++) {
		sum += arr[i].get();
    }
    cout << "arr 원소의 합은 " << sum << endl;

(4) (2)에서 선언된 arr2D 배열 이름을 이용하여 모든 원소(a)의 합을 출력하는 for 문을 작성하라.

	int sum = 0;
	for (int i = 0; i < 4; i++) {
    	int a = (arr2D+i)->get();
        sum += a;
    }
    cout << "arr2D 원소의 합은 " << sum << endl; 

동적 메모리 할당

  • 정적~: 컴파일 시간에 할당된다.
  • 동적~: 실행될 때 할당된다.

동적 메모리 할당 및 반환 메커니즘

  • 사용자 마음에 달려 있는 응용프로그램, 실행 중에 필요한 만큼 메모리를 할당받고 필요엇을 때 반환한다.
  • C++에서는 new로 할당받고, delete로 반환한다.
  • 힙이라는 메모리 공간을 사용한다.

new와 delete 연산자

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

int *pInt = new int;	// 포인터변수: pInt, 데이터타입: int/ int 타입의 정수 공간 할당
char *pChar = new char;	// 포인터변수: pChar, 데이터타입: char/ char 타입의 문자 공간 할당
Circle *pCircle = new Circle();	// 포인터변수: pCircle, 데이터 타입: Circle()?/ Circle 클래스 타입의 객체 할당

delete pInt;	// 할당받은 정수 공간 반환
delete pChar;	// 할당받은 문자 공간 반환
delete pCircle;	// 할당받은 객체 공간 반환

힙 메모리가 부족하면 newNULL을 리턴하므로, new의 리턴 값이 NULL인지 검사하는 것이 좋다. 다음은 int 타입의 정수 공간 한 개를 할당받고 사용한 후 반환하는 코드이다.

	int *p = new int;	// 힙으로부터 int 타입의 정수 공간 할당
    
    if(!p) {	// if(p==NULL)과 동일. p가 NULL이면
    	return;	// 메모리 할당받기 실패
    }
    
    *p = 5;	// 할당받은 정수 공간에 5 기록
    int n = *p;	// 할당받은 정수 공간에서 값 읽기, n = 5
    delete p;	// 할당받은 정수 공간 반환
profile
I just got started a blog.

0개의 댓글