#5 [c++]객체배열, 동적메모리, 자기 참조 포인터

정상준·2022년 10월 27일
0

c++

목록 보기
2/25

객체 배열

  • 객체 배열의 선언
    • 변수의 배열과 동일
      • 클래스명 객체명[크기];
      • Circle donut[10];
  • 객체 배열 사용의 목적
    • 여러 객체를 하나의 이름으로 관리 (변수 배열과 동일)
  • 배열의 생성자 / 소멸자
    • 배열의 인자 마다 생성자 / 소멸자 호출
    • 기본 생성자만 호출됨
    • 소멸자는 생성 반대 순으로 소멸 됨

#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();
};

//원의 면적 return
double Circle::getArea() {
	return 3.14 * radius * radius;
	}


int main() {
	Circle donutArray[3];
	//배열을 이용한 객체접근
	donutArray[0].setRadius(10);
	donutArray[1].setRadius(20);
	donutArray[2].setRadius(30);

	for (int i = 0; i < 3; i++) {
		cout << "Donut" << i << "의 면적은" << donutArray[i].getArea() << endl;
	}
	//객체 포인터로 배열에 접근
	Circle* p;
	p = donutArray;
	for (int i = 0; i < 3; i++) {
		cout << "Donut" << i << "의 면적은" << p ->getArea() << endl;
		p++;
	}
}

객체 배열 초기화

  • 객체 배열의 생성자 지정 및 초기화

Circle donutArray[3] = [Circle(), Circle(10), Circle(20)];

donutArray[0] => 기본 생성자 호출 => Circle()호출
donutArray[1] => 매개 변수 전달 생성자 호출 => Circle(10)호출
donutArray[2] => 매개 변수 전달 생성자 호출출 => Circle(20)호출

#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();
};

//원의 면적 return
double Circle::getArea() {
	return 3.14 * radius * radius;
	}


int main() {
	Circle donutArray[3] = { Circle(), Circle(10), Circle(20) };

	for (int i = 0; i < 3; i++) {
		cout << "Donut" << i << "의 면적은" << donutArray[i].getArea() << endl;
	}
}

다차원 객체 배열

  • 2차원 배열의 선언

    • Circle donutArray[2][3];
  • 2차원 배열의 초기화

    • Circle donutArray[2][3] = {{Circle(), Circle(1), Circle(2)}, {Circle(3), Circle(), Circle(4)}};
#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();
};

//원의 면적 return
double Circle::getArea() {
	return 3.14 * radius * radius;
	}


int main() {
	Circle donutArray[2][3];

	donutArray[0][0].setRadius(1);
	donutArray[0][1].setRadius(2);
	donutArray[0][2].setRadius(3);
	donutArray[1][0].setRadius(4);
	donutArray[1][1].setRadius(5);
	donutArray[1][2].setRadius(6);

	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 3; j++) {
			cout << "Donut[" << i << "," << j << "]의 면적은" << donutArray[i][j].getArea() << endl;
		}
	}
}

동적 메모리

  • 정적 메모리와 동적 메모리의 차이

    • 정적 메모리 : 프로그램 작성을 할 때 고정된 크기의 메모리 선언
    • 동적 메모리 : 실행 중 필요한 메모리 할당(힙 메모리 사용)
  • C언어의 동적 메모리 사용

    • 할당 : malloc()
    • 반환 : free()
  • C++의 동적 메모리 할당

    • 할당 : new
    • 반환 : delete
  • 형식

    • 데이터 타입 *포인터 변수 = new 데이터타입;
    • delete 포인터변수;
#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();
};

//원의 면적 return
double Circle::getArea() {
	return 3.14 * radius * radius;
	}


int main() {
	int* p;
	p = new int; //힙 영역에 4byte 할당
	if (!p) { //할당 안되면
		cout << "메모리를 할당할 수 없습니다.";
		return 0;
	}

	*p = 5;
	int n = *p;
	cout << "*p = " << *p << endl;
	cout << "n = " << n << endl;
	delete p;
}

동적메모리 배열사용

#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();
};

//원의 면적 return
double Circle::getArea() {
	return 3.14 * radius * radius;
	}


int main() {
	cout << "입력 갯수는?";
	int n;
	cin >> n;
	if (n <= 0) return 0;
	int* p = new int[n];
	if (!p) { //할당 안 되면
		cout << "메모리를 할당할 수 없습니다.";
		return 0;
	}

	for (int i = 0; i < n; i++) {
		cout << i + 1 << "번째 입력: ";
		cin >> p[i]; //정수 입력
	}
	int sum = 0;
	for (int i = 0; i < n; i++) {
		sum += p[i];
	}
	cout << "총합 = " << sum << endl;
	delete[] p; //메모리 반환
}

객체의 동적 할당

#include <iostream>
using namespace std;

class Circle {
	int radius;
public:
	Circle() { radius = 1; }
	Circle(int r) { radius = r; }
	~Circle();
	void setRadius(int r) {
		radius = r;
	}
	double getArea();
};

//원의 면적 return
double Circle::getArea() {
	return 3.14 * radius * radius;
	}
Circle::~Circle() {
	cout << "소멸자 실행 radius = " << radius << endl;
}


int main() {
	Circle* p, * q;
	p = new Circle;
	q = new Circle(30);
	cout << p->getArea() << endl << q->getArea() << endl;
	delete p;
	delete q;
}

자기 참조 포인터

  • this
    • 객체 자신을 가르키는 포인터
    • 멤버 함수 내에서만 사용
    • 객체에 대한 포인터
    • 다른 객체의 this와 공유하지 않음
    • 매개변수와 멤버 변수의 이름이 같을 때 사용
    • 자기 객체 주소를 리턴 할 때 사용
    • static 멤버 함수에서는 사용 불가

-컴파일 전

class Circle {
    int radius;
public:
    Circle(int radius)
   {
   this -> radius = radius
   }
}

-컴파일 후

class Circle {
    int radius;
public:
    Circle(Circle* this, int radius) //매개변수에 Circle* this 생성
   {
   this -> radius = radius
   }
}
profile
안드로이드개발자

0개의 댓글