객체의 배열
1. 객체의 배열을 선언과 초기화
각 요소를 객체로 가지고 있는 객체의 배열도 만들 수 있습니다. 배열은 메모리를 연속적으로 할당할 수 있기 때문에 iterator로 반복 연산을 간단하게 해줍니다. 그렇기 때문에 객체도 배열을 사용하면 for문과 같은 연산을 쉽게 할 수 있습니다.
객체의 배열은 선언 후 초기화도 가능하고 선언과 동시에 초기화도 가능합니다.
① 선언 후 초기화
Circle Array[3];
Array[0] = Circle();
Array[1] =Circle(4);
Array[2] = Circle(5);
② 선언과 동시에 초기화
Circle Array[3] ={Circle(),Circle(4),Circle(5)}; //익명객체 사용
Circle c1,c2(4),c3(5);
Circle Array[3] ={c1,c2,c3};
2. 객체 배열의 사용
다른 배열들이 그러하듯 객체의 배열도 인덱스를 사용하여 각 요소에 접근할 수 있습니다.
for(int i=0;i<3;i++){
cout << " 반지름 "<< Array[i].getRadius() << endl;}
와 같은 코드를 작성할 수 있습니다.
실습)
#include <iostream>
using namespace std;
#include "Circle.h"
void printCircle(Circle circleArray[], int size)
{
for (int i = 0; i < size; i++)
cout << " 반지름 " << circleArray[i].getRadius()
<< " 인 원의 면적은: " << circleArray[i].getArea() << endl;
}
int main()
{
const int SIZE = 4;
Circle cArray[SIZE]; // 원 4개짜리 배열 생성
printCircle(cArray, SIZE); //함수호출
for (int i = 0; i < SIZE; i++) //원의 반지름을 2,3,4,5로 바꿈
cArray[i].setRadius(i + 2);
printCircle(cArray, SIZE); //함수호출
Circle cArray2[SIZE] = {Circle(), Circle(4), Circle(6), Circle(8)};
cArray2[1].setRadius(5);
printCircle(cArray2, SIZE);
return 0;
}
3. 함수로 배열 전달
배열도 함수의 매개변수로 전달할 수 있습니다. 하지만 배열의 이름 그자체가 주소를 뜻하기 때문에 인자로 사용할 때는 배열의 이름을 전달하고 함수를 선언 할 때 적는 매개변수에는 배열의 형태([])가 들어갑니다.
void printArray(int p[], int arraySize); //함수원형
int main()
{
int list[6] = {11, 12, 13, 14, 15, 16};
printArray( list, 6); //함수 호출
return 0;
}
void printArray(int p[], int arraySize)
{
for (int i = 0; i < arraySize; i++)
cout << p[i] << " ";
}
const 멤버 함수
1. const 멤버 함수
변수나 매개변수를 const(상수)로 설정할 수 있는 것처럼 멤버 함수도 const로 설정할 수 있습니다. 이것이 중요한 것이 객체를 const로 받는 함수를 작성할 때, 멤버 변수를 바꾸지 않는 멤버 함수들은 무조건 const로 작성해야 오류가 나지 않습니다.
1)const 객체는 멤버 함수중 const로 지정된 멤버함수만 호출할 수 있습니다.
2) static 멤버함수는 const로 지정할 수 없습니다.
//Circle.h
#ifndef CIRCLE_H
#define CIRCLE_H
class Circle {
public:
Circle();
Circle(double);
double getArea() const ; //const
double getRadius() const ; //const
void setRadius(double);
private:
double radius;
}; //세미콜론 주의
#endif
//Circle.cpp
#include "Circle.h"
Circle::Circle() {
radius = 1;
}
Circle::Circle(double newRadius){
radius = newRadius;
}
double Circle::getArea() const { //const
return radius * radius * 3.14159;
}
double Circle::getRadius() const { //const
return radius;
}
void Circle::setRadius(double newRadius) {
radius = (newRadius >=0)?newRadius:0;
}
//TestCircle.cpp
#include <iostream>
using namespace std;
#include "Circle.h"
void printCircle(const Circle& c) //const
{
//getRadius()와 getArea()가 const로 정의되지 않은 경우 에러
cout << " 반지름 " << c.getRadius() << " 인 원의 면적은: "<< c.getArea() << endl;
}
int main()
{
Circle c1;
Circle c2(3.0);
printCircle(c1);
printCircle(c2);
return 0;
}
인스턴스 멤버 vs 정적 멤버
1. 정적 멤버 변수
정적 멤버함수와 정적 멤버 변수는 동일한 클래스의 모든 객체들이 공유하는 함수와 변수입니다.
정적 변수(static member variable)은 heap(메모리에서 안정한 영역, 프로젝트가 끝날 때까지 사라지지 않음)에 만들어져 1) 모든 객체가 공유할 수 있고 프로그램이 끝날 때까지 남아 있습니다.
2) 또, static 멤버는 객체를 만들기 전에 부를 수 있습니다.(프로그램을 시작할 때 초기화하고 시작)
3) 하지만 헤더에서는 초기화할 수 없고 반드시 미리 초기화해야 합니다.
이와 달리 인스턴스 멤버 변수는 다른 일반적인 멤버 변수를 뜻하고 const로 정의할 수 있고 객체 생성 전에는 부를 수 없습니다. 인스턴스 멤버함수에서는 얼마든지 정적변수에 접근할 수 있지만, 정적 멤버함수에서는 인스턴스 변수에 접근할 수 없습니다.
2. 정적 멤버 함수
private한 정적변수를 다루기 위해 정적 함수를 제공하기도 합니다.
정적변수가 그런 것처럼 정적 함수도 객체를 만들기 전에 부를 수 있습니다.
정적함수는 const로 정의할 수 없습니다.
//Circle.h
#ifndef CIRCLE_H
#define CIRCLE_H
class Circle {
public:
Circle();
Circle(double);
double getArea()const;
double getRadius()const;
void setRadius(double);
static int getNumberOfObjects(); //정적 함수
private:
double radius;
static int numberOfObjects; //정적 변수
}; // 세미콜론 주의
#endif
//Circle.cpp
#include "Circle.h"
int Circle::numberOfObjects = 0; //초기화
Circle::Circle() {
radius = 1;
numberOfObjects++; // 변수 변화
}
Circle::Circle(double newRadius){ // 변수 변화
radius = newRadius;
numberOfObjects++;
}
double Circle::getArea()const{
return radius * radius * 3.14159;
}
double Circle::getRadius()const{
return radius;
}
void Circle::setRadius(double newRadius)
{
radius = (newRadius >=0)?newRadius:0;
}
int Circle::getNumberOfObjects(){ //정적 함수
return numberOfObjects;
}
3. 정적 멤버 호출
정적 멤버를 호출하는 방법은 두 가지가 있습니다.
1) 클래스명을 앞에 붙인다
Circle::getNumberOfObjects()
2) 객체명으로 멤버 접근 연산자를 사용한다.
c1.getNumberOfObjects()
가독성이 높기 때문에 첫번째 방법을 추천합니다.
//TestCircle.cpp
#include <iostream>
using namespace std;
#include "Circle.h"
int main(){
cout << "원의 개수: "<< Circle::getNumberOfObjects() << endl;
Circle c1;
cout << "c1의 반지름: " << c1.getRadius() << endl;
cout << "원의 개수: "<< c1.getNumberOfObjects() << endl;
Circle c2(5.0);
cout << "c2의 반지름: " << c2.getRadius() << endl;
cout << "원의 개수: "<< Circle::getNumberOfObjects() << endl;
const int SIZE = 10;
Circle cArray[SIZE];
cout << "원의 개수: "<< Circle::getNumberOfObjects() << endl;
cout << "원의 개수: "<< cArray[0].getNumberOfObjects()<< endl;
return 0;
}
'대학강의정리 > 24.1 고급 c++' 카테고리의 다른 글
4주차 10장 객체 지향 개념 3,4,5 예상문제 (0) | 2024.04.18 |
---|---|
3주차 10장 객체 지향 개념 1,2 예상문제 (0) | 2024.04.15 |
3주차 10장 객체 지향 개념 1,2 (0) | 2024.04.05 |
2주차 9장 객체와 클래스 3,4,5 연습문제 (0) | 2024.04.05 |
2주차 9장 객체와 클래스 3,4,5 (0) | 2024.03.18 |