1. 객체 배열 (object array)
class Account
{
private:
int ID=0;
char *name;
int amount=0;
public:
void LetAccount(int a, char *b, const int &c)
{
ID=a;
amount=c;
name=new char[strlen(b)+1];
strcpy(name,b);
}
}
const int NAME_LEN=20;
Accounts Account[NAME_LEN];
int acc=0;
void MakeAccount()
{
int a;
char b[NAME_LEN];
int c;
Account[acc].LetAccount(a,b,c);
acc++;
}
객체 배열은 클래스명 객체명 [크기] 와 같은 형식으로 선언되며 보기에는 구조체 배열의 선언과 차이가 없습니다.
위 예제는 Accounts 객체를 배열로 만들어 멤버 변수를 초기화하는 예제입니다.
Account 클래스에서 생성자 없이 LetAccount 함수로 초기화 하는것을 볼 수 있는데, 일반적인 객체 배열은 배열 생성 과정에서 생성자를 정의할 필요가 없습니다.
배열을 선언할때( Accounts Account[NAME_LEN] ) 비어있는 생성자가 알아서 호출되고 소멸되기 때문입니다. 하지만 이를 동적으로 할당하는 경우에는 생성자가 반드시 정의되어 있어야 하는데, 이를 객체 포인터 배열과 함께 살펴봅시다
2. 객체 포인터 배열 (object pointer array)
class Accounts
{
private:
int ID=0;
char *name;
int amount=0;
public:
Accounts(const int &ID, char *b, const int &amount) : ID(ID), amount(amount)
{
name=new char[strlen(b)+1];
strcpy(name,b);
}
}
const int NAME_LEN=20;
Accounts *Account[NAME_LEN];
int acc=0;
void MakeAccount()
{
Account[acc]=new Accounts(a,b,c);
acc++;
}
위 객체 배열과 다르게 Accounts 객체배열을 선언할때 포인터가 추가되었습니다. 이렇게 되면 클래스의 생성자가 반드시 필요합니다.
객체 배열에서는 Accounts Account[NAME_LEN]에서 생성자를 알아서 호출시키고 객체를 생성해서
별도 함수로 멤버를 초기화 할 수 있었지만,
Accounts *Account[NAME_LEN]문장은 단지 포인터 배열이라는 틀을 만든것 뿐이지 아무런 객체를 생성하지 않습니다.
따라서 클래스의 생성자가 반드시 필요합니다.
만약 생성자를 정의하지 않고 1번 예제와 같이 다른 함수로 초기화를 시도하면 어떻게 될까요?
3. 세그멘테이션 오류(segmentation fault)
세그멘테이션 오류 또는 세그멘테이션 결함(Segmentation Fault)은 컴퓨터 소프트웨어의 실행 중에 일어날 수 있는 특수한 오류이다. 세그멘테이션 위반, 세그멘테이션 실패라고도 하며, 세그폴트(Segfault)로 줄여서 쓰기도 한다. 세그멘테이션 오류는 프로그램이 허용되지 않은 메모리 영역에 접근을 시도하거나, 허용되지 않은 방법으로 메모리 영역에 접근을 시도할 경우 발생한다 - 위키백과
예제 1에서와 같은 방식으로 멤버의 값 변경을 시도하였는데 세그멘테이션 오류가 발생합니다.
이는 객체 포인터 배열의 선언이 포인터 배열이라는 틀만 만들어 놓았지 객체를 생성하지 않기 때문에 발생합니다.
생성되지 않은 상태로 허용되지 않은 메모리 영역에 접근을 시도하였기 때문입니다.
이를 해결하기 위해서는 동적으로 객체를 생성시키는 new와 생성자를 이용하여 멤버를 초기화시켜야합니다.
예제에 쓰인 전체 코드입니다.
https://amanteattirance.tistory.com/93
'Algorithm > C++' 카테고리의 다른 글
열혈 C++ 프로그래밍 OOP 단계별 프로젝트 06단계 (2) | 2023.09.09 |
---|---|
열혈 C++ 프로그래밍 OOP 단계별 프로젝트 04단계 (0) | 2023.08.05 |
열혈 C++ 프로그래밍 OOP 단계별 프로젝트 02단계 (0) | 2023.07.22 |
열혈 C++ 프로그래밍 문제 4-2 [다양한 클래스의 정의] (1) | 2023.06.08 |
열혈 C++ 프로그래밍 OOP 단계별 프로젝트 01단계 (1) | 2023.05.26 |
댓글