" /> C++ 5주차 객체 포인터와 배열 | BlackWerf's Blog
포스트

C++ 5주차 객체 포인터와 배열

C++ 5주차 객체 포인터와 배열

객체 배열

선언 방법

클래스명 객체명[크기];

예시) Circle pizza[10];


사용 목적

  • 여러 객체를 하나의 이름으로 관리


생성자와 소멸자

  • 각각의 인자마다 생성자와 소멸자가 호출됨
  • 기본 생성자만 호출됨
  • 소멸자는 생성 된 순서의 반대로 소멸 됨
  • 호출 순서 예시 코드)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    class ArrayCircleClass{
    private:
        int radius;
    public:
        ArrayCircleClass() { radius = 1; }
        ArrayCircleClass(int r) { radius = r; }
          
        float GetArea();
          
        ~ArrayCircleClass() { cout << radius << " 크기의 원 제거됨." << endl; }
    };
      
    float ArrayCircleClass::GetArea() { return 3.14 * radius * radius; }
      
    int main()
    {
       ArrayCircleClass arrayCircle[3] = { ArrayCircleClass(), ArrayCircleClass(5), ArrayCircleClass(10)};
         
       for(int i=0; i< 3; i++)
            cout << " " << arrayCircle[i].GetArea() << endl;
    }
    

    결과

    1
    2
    3
    4
    5
    6
    
     3.14
     78.5
     314
    10 크기의 원 제거됨.
    5 크기의 원 제거됨.
    1 크기의 원 제거됨.
    

    예시 코드에서 생성자는 arrayCircle[0], arrayCircle[1], arrayCircle[2] 순서대로 호출됨

    소멸자는 생성자와 반대로 arrayCircle[2], arrayCircle[1], arrayCircle[0] 순서대로 호출됨


초기화

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

예시)

1
Circle circleArray[3] = [Circle(), Circle(10), Circle(20)];

이 예시에서 circleArray[0]인 Circle()은 기본 생성자를 호출한다.

circleArray[1], circleArray[2]는 매개 변수 전달 생성자를 호출하며, 각각 Circle(10), Circle(20)을 호출함


다차원 배열

선언 방법

클래스명 배열[크기 1][크기 2]


초기화

Image Alt 텍스트

예시

Image Alt 텍스트


멤버 접근 방법

객체명 [값1] [값2].메소드명;


예시

1
2
3
4
5
6
7
8
9
10
11
CircleMultiArray 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;

결과

1
2
3
4
5
6
Donut[0,0]의 면적은 3.14
Donut[0,1]의 면적은 12.56
Donut[0,2]의 면적은 28.26
Donut[1,0]의 면적은 50.24
Donut[1,1]의 면적은 78.5
Donut[1,2]의 면적은 113.04


동적 메모리

동적 메모리, 정적 메모리의 차이

동적 메모리:

  • 프로그램 작성 시, 고정된 크기의 메모리를 사용함

정적 메모리:

  • 실행 중에 필요한 메모리를 할당함(Heap 메모리)

동적 메모리 사용 방법

  • 할당: new

  • 반환: delete


  • 형식

    • 데이터 타입 *포인터변수 = new 데이터타입;
      • 배열의 경우 new 데이터타입[크기];으로 해야함
    • delete 포인터변수;
      • 배열의 경우 delete[] 포인터변수명;으로 해야함
  • 예시)

1
2
3
4
5
int pIntVar = new int; //int 타입의 메모리를 동적 할당
Circle *pCircleVar = new Circle; //CIrcle 클래스 타입의 메모리를 동적 할당

delete pIntVar; //할당 된 정수 공간을 반환
delete pCircleVar; //할당 된 객체 공간을 반환


자기 참조 포인터

this

  • 자기 자신을 가르키는 포인터로 멤버 함수 내에서만 사용됨

    • 예시)

      1
      
      Circle::Circle(int radius) { this->radius = radius; }
      
  • 다른 객체의 this와 공유되지 않음

  • 매개변수와 멤버 변수 이름이 동일할때 사용됨

  • 자기 객체 주소 리턴에 사용

  • static 멤버 함수에서는 사용이 불가능함


컴파일러에 의한 코드 변환

컴파일 전

1
2
3
4
5
6
7
class Circle{
    int radius;
public:
    Circle(int radius) { 
        this->radius = radius;
     }
};

컴파일 후

1
2
3
4
5
6
7
class Circle{
    int radius;
public:
    Circle(Circle* this, int radius){
        this->radius = radius;
    }
};
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
-->