Language/C++

[C++] CH4 객체 포인터, 배열, 동적 할당 (2)

nowkoes 2023. 2. 3. 16:30

객체와 객체 배열의 동적 생성 및 반환

 

// 예제 4-7
#include <iostream>
using namespace std;

class Circle
{
    int radius;

public:
    Circle(); // default constructor
    Circle(int r); // constructor
    ~Circle(); // destructor
    void setRadius(int r) { radius = r; } // Inline function
    double getArea() { return 3.14 * radius * radius; } // Inline function
};

Circle::Circle() : radius(1) {}
Circle::Circle(int r)
{
    radius = r;
    cout << "생성자 실행 radius = " << radius << endl;
}
Circle::~Circle() { cout << "소멸자 실행" << endl; }

int main()
{
    Circle* p, * q; // 포인터 객체 선언
    p = new Circle; q = new Circle(30); // 동적 할당

    cout << p->getArea() << endl << q->getArea() << endl;

    delete p; delete q; 
}

객체의 동적 생성 및 반환

  • 동적 생성: 클래스 크기의 메모리를 할당받아 객체를 생성
<클래스이름> *<포인터변수> = new <클래스이름>; // 기본 생성자 호출
<클래스이름> *<포인터변수> = new <매개변수>; // 매개 변수 있는 생성자 호출
  • 객체 반환: 동적으로 할당받은 객체 반환.
    • 이때 <포인터변수>는 반드시 new를 이용해 동적 할당받은 메모리의 주소여야 한다.
    • 객체를 반환하기 전에 객체 소멸자가 먼저 실행된다.
delete <포인터변수>

 

// 예제 4-9
#include <iostream>
using namespace std;

class Circle
{
    int radius;

public:
    Circle(); // default constructor
    Circle(int r); // constructor
    ~Circle(); // destructor
    void setRadius(int r) { radius = r; } // Inline function
    double getArea() { return 3.14 * radius * radius; } // Inline function
};

Circle::Circle() : radius(1) {}
Circle::Circle(int r)
{
    radius = r;
    cout << "생성자 실행 radius = " << radius << endl;
}
Circle::~Circle() { cout << "소멸자 실행 radius = " << radius << endl; }

int main()
{
    int arraySize = 3;
    Circle* pArray = new Circle[arraySize]; // 객체 배열의 동적 생성

    for (int i = 0; i < arraySize; i++)
    {
        pArray[i].setRadius(10 * (i+1));
        cout << pArray[i].getArea() << endl;
    }

    Circle* p = pArray; // 포인터 p에 배열의 주소값 저장

    for (int i = 0; i < arraySize; i++)
    {
        cout << p->getArea() << endl;
        p++; // 다음 주소
    }

    delete[] pArray; // 객체 배열 반환
}

객체 배열의 동적 생성 및 반환

  • 동적 생성: 각 객체에 대해 기본 생성자를 호출한다. 매개 변수 있는 생성자를 직접 호출할 수 없지만, 배열을 각 원소 객체로 초기화할 수 있다.
<클래스이름> *<포인터변수> = new <클래스이름> [배열 크기];
<클래스이름> *<포인터변수> =
  new <클래스이름> [배열 크기] { <클래스이름>(매개변수), <클래스이름>(매개변수)};
// 매개변수 있는 생성자 호출 방법
  • 객체 배열 반환: 소멸자의 실행 순서는 생성의 역순.
delete [] <포인터변수>;
  • 객체 배열의 사용
    • 동적으로 생성된 객체 배열은 보통 객체 배열처럼 사용한다.

 

힙(heap): 응용프로그램들이 실행 중에 할당받아 사용하는 시스템 메모리

  • 동적으로 할당받은 메모리는 메모리 누수가 발생할 수 있으므로 필요 없을 때 힙에 반환하여 메모리 공간을 여유롭게 하는 것이 바람직하다.
    • 메모리 누수(memory leak): 동적으로 할당받은 메모리의 주소를 잃어버려 힙에 반환할 수 없을 때 발생하는 것.
  • new를 이용하여 할당받은 메모리는 프로그램이 종료할 때 자동으로 힙에 반환한다.

 

요약

동적 생성 및 객체 반환
1. 정의: 클래스 크기의 메모리를 할당받아 객체를 생성하는 것을 동적 생성이라 하고, 이를 해제하는 것을 객체 반환이라 한다.
2. 특징
 a. C++의 경우 newdelete 연산자를 이용해 이를 수행한다.
 b. 객체 배열의 경우, 각 객체에 대한 기본 생성자를 호출한다. 이때 매개변수 있는 생성자를 직접 호출할 순 없다.

힙(Heap)
1. 정의: 응용 프로그램들이 실행 중에 할당받아 사용하는 시스템 메모리
2. 특징
 a. 동적으로 할당받은 메모리는 메모리 누수(memory leak) 방지를 위해 필요 없을 땐 힙에 반환
 b. new를 이용하여 할당받은 메모리는 프로그램이 종료할 때 자동으로 힙에 반환

this 포인터

 

this: 객체 자신에 대한 포인터 변수

  • 객체의 멤버 함수가 호출될 때, 컴파일러에 의해 묵시적으로 삽입되어 보이지 않게 전달되는 객체에 대한 주소.
  • this가 필요한 경우
    • 멤버 변수의 이름과 동일한 이름으로 매개 변수 이름을 지을 때
    • 객체의 멤버 함수에서 객체 자신의 주소를 반환할 때 (후에 연산자 중복을 구현할 때 자주 사용)
  • 제약 사항
    • 클래스의 멤버 함수에서만 사용 가능
    • static 멤버 함수에서는 사용 불가능 (객체가 생성되기 전 호출될 수 있고, 실행되는 시점에서 현재 객체가 존재하지 아니할 수 있음)

 

요약

this
1. 정의: 객체 자신에 대한 포인터 변수로서, 객체에 대한 주소.
2. 특징
 a. 컴파일러에 의해 묵시적으로 삽입되어 보이지 않게 전달
 b. 멤버 변수의 이름과 동일한 이름으로 매개 변수를 짓거나 객체 자신의 주소를 반환할 때 사용
3. 제약사항
 a. 클래스의 멤버 함수에서만 사용 가능
 b. static 멤버 함수에서는 사용 불가능

string class를 이용한 문자열 사용

 

// 예제 4-11
#include <iostream>
#include <string> // string 클래스 사용
using namespace std;

int main()
{
    string str; // 스트링 객체 생성
    string address("서울시 성북구 삼선동 389");
    string copyAddress(address); // address를 복사한 스트링 객체 생성

    char text[] = { 'L', 'O', 'V', 'E', '\0' }; // c string
    string title(text); // 문자 배열을 가진 스트링 객체 생성

    cout << str << endl;
    cout << address << endl;
    cout << copyAddress << endl;
    cout << title << endl;

}

string 객체 생성 및 출력

  • 생성자를 이용해 다양한 문자열을 생성할 수 있다.
  • 이때 cout 등을 이용해 화면에 출력할 수 있다.
  • new / delete 연산자를 이용해 동적 생성 및 반환이 가능하다.
  • 문자열의 크기에 맞추어 스스로 메모리를 조절한다.

 

생성자 설명
string() 빈 문자열을 가진 스트링 객체 생성
string(string& str) str을 복사한 새로운 스트링 객체 생성
string(char* s) c-string s의 문자열을 복사해 스트링 객체 생성
string(char* s, int n) 문자 배열 s에서 n개의 문자를 복사해 스트링 객체 생성

 

string 객체의 주요 멤버 함수

  • append, insert, size, length, capacity, erase, clear, empty, at, find, rfind, compare, substr, swap ...

 

요약

string 클래스
1. 정의: C++에서 제공하는 문자열의 크기에 맞추어 스스로 메모리를 조절하는 문자열 클래스
2. 특징
 a. 생성자를 이용해 다양한 문자열을 생성할 수 있음
 b. new / delete 연산자를 이용한 동적 생성 및 반환이 가능

문제풀이: GitHub - maloveforme/Cpp

반응형