티스토리 뷰

※ 주의 사항 ※

  • 이 글의 목적은 '지식의 전달'이 아닌 '학습의 기록'입니다.
  • 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
  • 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.

 

C++에서 사용하는 데이터 타입은 C언어에서 사용하는 기본 데이터 타입과 객체 지향 언어로부터 도입한 클래스가 공존합니다. 그로 인해 C++에는 객체 지향 언어와 절차 지향 언어 등의 이질적인 문법으로 인해 변수를 선언하고 동시에 초기화시키는 다양한 방법이 존재합니다. 그러나 초기화 방법이 많다는 것인 변수 선언과 함께 클래스나 템플릿을 작성하는 데 에 어려움이 많다는 것을 의미합니다. 개발자가 예상하지 못한 에러가 발생할 확률이 많다는 의미입니다.

 

우선 정수 타입을 기준으로 기본 타입의 변수를 초기화시키는 방법들을 알아보겠습니다. 아래는 그 예제입니다.

#include <iostream>

int main()
{
	int a = 10;
	std::cout << "a : " << a << std::endl;

	int b(20);
	std::cout << "b : " << b << std::endl;

	int c{ 30 };    //C++11부터 추가된 초기화 방식
	std::cout << "c : " << c << std::endl;

	int d = int(40);    //무명 변수를 이용한 초기화
	std::cout << "d : " << d << std::endl;

	int e = int();    //디폴트 생성자를 이용한 초기화, 0으로 초기화 됨
	std::cout << "e : " << e << std::endl;

	int f = { 50 };
	std::cout << "f : " << f << std::endl;

	int* g = new int();    //포인터가 가리키는 메모리는 자동으로 0으로 초기화
	std::cout << "*g : " << *g << std::endl;

	int* h = new int(60);
	std::cout << "*h : " << *h << std::endl;

	return 0;
}

/*
실행 결과

a : 10
b : 20
c : 30
d : 40
e : 0
f : 50
*g : 0
*h : 60

*/

 

만약 다음과 같은 초기화를 시도한다면 에러를 발생시키게 됩니다.

int a();             //초기화 값이 없는 초기화
int* b = new int;    //생성자를 호출하지 않는 초기화

 

하지만 앞선 예제에서도 보았듯이 다음과 같은 초기화는 가능합니다.

int a = int();
int* b = new int();

 

위 예제에서 보인 int()는 '무명 변수'라고 합니다. 그리고 디폴트 초기화 값이 존재합니다. 정수는 0, 실수는 0.0, 불리언은 false, 문자는 '\0'로 초기화됩니다. 그리고 이런 무명 변수는 한 번 사용되고 바로 메모리에서 삭제됩니다. 같은 것을 다른 이름으로 부르는지는 모르겠으나 '임시 객체'도 이와 똑같이 동작합니다.

 

 

변수는 선언과 동시에 초기화하는 것이 좋습니다. 만약 다음과 같이 변수의 선언과 초기화가 분리되어 있다면,

int i;
...
i = 10;

 

프로그램을 유지 보수하는 과정에서 문장을 수정하거나 복사하고 다른 위치로 이동할 경우, 개발자의 실수에 의한 에러가 발생할 소지가 증가하게 됩니다. 이는 객체에 대해서도 마찬가지입니다.

 

다음은 구조체나 클래스의 변수 혹은 객체를 초기화시키는 예제입니다.

#include <iostream>

struct Data
{
	std::string name;   //이름
	int age;            //나이
	int balance;        //잔액

	//생성자
	Data() : name("\0"), age(0), balance(0) {}
	Data(const char* name, int age, int balance) : name(name), age(age), balance(balance) {}

	void print()
	{
		std::cout << "name : " << name << ", age : " << age << ", balance : " << balance << std::endl;
	}
};

int main()
{
	Data user1("이순신", 32, 20000);    //생성자가 있는 경우 가능한 초기화 방법
	user1.print();

	Data user2{ "안중근", 46, 456000 };    //생성자가 없어도 가능한 초기화 방법
	user2.print();

	Data user3 = Data("이성계", 45, 6000);    //임시 객체를 이용한 초기화 방법, 생성자 필요
	user3.print();

	Data user4 = Data();    //생성자가 없으면 각 데이터 타입에 맞는 디폴트 값으로 초기화
	user4.print();

	Data user5 = { "홍길동", 22, 321646500 };    //나열된 값을 변수에 순서대로 할당하여 초기화
	user5.print();

	Data* user6 = new Data();
	user6->print();

	return 0;
}

/*
실행 결과

name : 이순신, age : 32, balance : 20000
name : 안중근, age : 46, balance : 456000
name : 이성계, age : 45, balance : 6000
name : , age : 0, balance : 0
name : 홍길동, age : 22, balance : 321646500
name : , age : 0, balance : 0

*/

 

구조체와 클래스에 대해 잘 알고 있다면 위 예제에 대한 별도의 설명은 필요없을 것 같습니다. 지금 이를 이해하지 못해도 상관없습니다. 나중에 구조체와 클래스에 대해 배우면서 이해하게 될 것입니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함