본 게시글은 C++ 기초 플러스 책을 읽고 제가 필요할때마다 직접 읽어보려고 매우 대충 정리한 글입니다. (진짜 개인공부용 글임) 따라서 다른 분들이 읽으려면 읽기 어려울 수 있음 주의 ㅎㅎ
4. 복합 데이터형
복합 데이터형은 기본 정수형과 부동 소수점형으로부터 만들어진다.
4.1 배열
배열은 데이터형이 같은 여러 개의 값을 연속적으로 저장할 수 있는 데이터 구조다
배열에서 각 값은 배열 원소라는 개별 공간에 저장된다.
원소들은 메모리에 연속적으로 배치한다.
선언 방법
자료형 이름[크기];
int arr[3];
이런식으로 쓴다.
배열의 각 원소는 개별적으로 간단한 변수처럼 취급할 수 있다.
즉, 개별적으로 접근이 가능하다.
접근하려면 인덱스를 사용해야하며, C++에서 배열의 인덱스는 항상 0부터 시작한다. 그래서 마지막 원소는 항상 크기-1 이다.
- 배열의 초기화
배열의 초기화 형식은 배열을 정의하는 곳에서만 할 수 있다.
배열을 다른 배열에 통째로 대입하는 것은 불가능하다.
int arr[3] = {1, 2, 3}; //순서대로 1, 2, 3이 대입된다.
인덱스를 이용해 배열 원소에 개별적으로 값을 대입하는 것은 언제든 가능하다.
배열을 부분적으로 초기화하면 나머지 원소들은 모두 0으로 설정된다.
배열을 선언할때 []를 비워두고 초기화하면 초기화 값의 개수대로 원소개수가 정해진다.
int arr[] = {1, 2, 3, 4};
이런식으로 쓰면 원소는 4개로 만들어진다.
배열을 초기화할 때 = 부호를 사용하지 않아도 된다.
double e[4] {1.2e4, 1.6e4, 1.1e4, 1.7e4};
int arr[3] = {}; //0으로 초기화
int c[10] {};
4.2 문자열
문자열이란 메모리에 바이트 단위로 연속적으로 저장되어 있는 문자들이다.
C스타일 문자열
char형의 배열에 저장된다.
문자열을 구성하는 각 문자들은 배열의 원소에 하나씩 저장된다.
모든 문자열의 마지막 문자는 null 문자여야 한다.
널문자는 ₩0로 쓴다.
cout으로 출력하면 널문자를 만날때까지 계속해서 출력한다.
char형 배열에 문자열을 넣는 방법은 큰따옴표로 묶어서 작성하면 된다.
char fish[] = "Bubbles";
'S'와 "S"는 다르다. ""로 묶여있는 것은 문자열이기때문에 널문자를 포함하고있어서 전혀 다르다.
또한 "S"는 내부적으로 그 문자열이 저장되어 있는 메모리 주소를 나타낸다.
(배열의 이름은 배열의 시작주소)
큰따옴표로 묶인 두 문자열을 하나로 결합할 수 있다.
빈칸, 탭, 캐리지 리턴과 같은 화이트스페이스로 분리된 두 개의 문자열 상수는 하나의 문자열 상수로 결합된다.
cout << "Hi, I'm Hyewon!" "반갑순";
cout << "Hi, I'm Hyewon!반갑순";
cout << "Hi, I'm Hyewon!"
"반갑순";
세개 다 출력결과는 동일하다.
첫 번째 문자열의 널문자는 두 번째 문자열의 첫 문자로 대체된다.
- cin.getline() //사용자에게 직접 입력받는 함수임
ㄴ 이 함수는 개행 문자를 끝으로 간주하여 한 행 전체를 읽는다.
한계 이전이더라도 개행문자를 만나면 읽기를 중단한다.
ㄴ 이 함수는 두 개의 매개변수를 사용한다.
첫 번째 매개변수는 입력한 행을 저장할 배열의 이름
두 번째 매개변수는 입력받을 문자들의 한계
한계가 20이면 19개까지 문자들을 입력받을 수 있다.
개행문자는 저장하지 않는다. (널문자로 대체된다)
- cin.get() 함수
ㄴ getline과 비슷한데, 개행문자를 입력 큐에 그대로 남겨 둔다.
cin.get(name, ArSize);
cin.get(dessert, ArSize);
이렇게 호출하게되면, 첫 번째 호출이 입력 큐에 개행 문자를 그대로 남겨 두기 때문에, 두 번째 호출은 그 갷애 문자를 첫 문자로 만나게 되어, 곧 바로 행의 끝에 도달했다고 결론을 내린다.
cin.get(name, ArSize);
cin.get();
cin.get(dessert, ArSize);
이렇게 작성하면 해결된다.
get함수의 또 다른 사용법은 두 개의 클래스 멤버 함수를 결합하여 사용하는 것이다.
cin.get(name, ArSize).get();
이렇게 하면 cin.get(name, ArSize)가 cin 객체를 리턴하고, 리턴된 cin 객체는 뒤에 결합된 get() 함수를 호출하는 객체로 사용된다.
간단히 보면, get()을 쓰는 이유는 옛날 버전에는 getline()이 없기 때문이다.
또한, getling 함수는 사용이 편리하고, get함수는 에러체킹이 쉽다.
- string 클래스
string.h 헤더파일을 포함시켜야 한다.
string 클래스는 std 네임 스페이스에 속해있다.
해당 클래스는 문자열을 일반 변수처럼 취급할 수 있게 해준다.
C스타일 문자열로 string 객체를 초기화할 수 있다.
cin을 사용하여 string 객체에 키보드 입력을 저장할 수 있다.
cout을 사용하여 string 객체를 디스플레이 할 수 있다.
배열 표기를 사용하여 string 객체에 저장되어 있는 개별적인 문자들에 접근할 수 있다.
string 으로 선언된 문자열은 입력 받을 때 문자열의 크기를 입력에 맞게 자동으로 조절한다.
C스타일 문자열은 하나의 배열을 다른 배열에 대입할 수 없으나 string은 간단히 대입이 가능하다.
+연산자를 사용하여 string 객체를 하나로 결합할 수 있고, +=연산자를 사용해 기존의 string객체의 끝에 또 다른 string 객체를 덧붙일 수 있다.
(+=연산자는 왼쪽의 피연산자에 오른쪽 피연산자를 더한 후, 그 결괏값을 왼쪽의 피연산자에 대입함)
string 클래스는 필요하면 크기를 자동으로 조절하여 목적지 배열이 너무 작아 정보를 모두 담을 수 없는 상황에서 발생하는 오류를 방지한다.
string의 크기를 알 수 있는 함수는 str1.size();
초기화되지 않은 string 객체는 자동으로 크기가 0으로 설정된다.
4.4 구조체
모든 정보를 하나의 단위로 묶을 수 있는 데이터 형식이다.
구조체는 사용자가 정의할 수 있는 데이터형이다.
데이터형의 특성을 정의하는 구조체 선언이 필요하다. 정의한 뒤로는 그 데이터형의 변수를 생성할 수 있다.
struct human
{
int age;
string name;
}
이런식으로 구조체를 선언할 수 있다.
선언한 구조체로 변수를 생성하고자 한다면
human me;
me.age = 26;
me.name = "김승희"
이런식으로 해당 구조체의 멤버변수에 값을 지정해줄 수 있다.
멤버변수에는 다른 구조체를 넣을 수도 있고, 배열을 넣을 수도 있고, 클래스를 넣을수도 있고 제약이 없다.
- 구조체 초기화
구조체를 초기화 하는 방법은 아래의 방법이 있다.
human you =
{
23,
"박나나"
};
(콤마로 구분한다)
human who = {};
human who {};
이렇게 아예 빈값으로 초기화할 수 있다.
구조체는 사용자가 지정해서 만든 자료형이라고 볼 수 있다. 따라서 함수에 매개변수로 전달할 수도 있고, 리턴값으로 사용할 수도 있다.
대입 연산자를 통해 대입도 가능하다.
구조체 템플릿의 정의와 구조체 변수 생성을 하나로 결합할 수 있다.
그렇게 하려면 닫는 중괄호 뒤에 변수 이름을 둔다.
struct perks
{
int key_number;
char car[12];
} mr_smith, ms_jones;
struct perks
{
int key_number;
char car[12];
} mr_smith =
{
7, "Packard"
};
이렇게 초기화까지 한번에 할 수도 있긴하다만, 분리해두는게 보기 편하다.
데이터형 이름이 없는 구조체를 생성할 수도 있다. 이것은 태그 이름을 생략하고 템플릿과 변수를 동시에 생성하는 것이다.
struct
{
int x;
int y;
} position; //이 구조체를 가지는 변수를 바로 선언하는 것이라고 보면 된다.
데이터형 이름이 없기 때문에 이후에 같은 형의 다른 변수를 생성할 수 없다.
구조체는 배열을 포함할 수도 있고, 구조체로 배열을 만들 수도 있다.
- 구조체 안의 비트 필드
구조체의 기능 중에서 많이 사용하지 않지만, 정수형 데이터를 비트 단위로 나누어서 사용할 수 있는 기능을 제공합니다. 이를 구조체의 bit field라고 한다.
구조체 멤버들이 각각 일정 비트 수를 차지하도록 지정할 수 있다.
이것은 어떤 하드웨어 장치에 들어 있는 레지스터에 대응하는 데이터 구조를 만들 때 매우 편리하다. 필드형은 정수형이나 열거자여야 한다.
사용할 비트 수는 콜론을 찍고 그 뒤에 적는다. 이름이 없는 필드를 사용하여 간격을 줄 수도 있다. 이러한 각 멤버를 비트 필드라 한다.
struct torgle_register
{
unsigned int SN : 4; //SN값 4비트
unsigned int : 4; //사용하지 않음 4비트
bool goodIn : 1; //유효한 입력 1비트
bool goodTorgle : 1; //토클에 성공 1비트
};
일반적인 방법으로 필드들을 초기화할 수 있다. 구조체 표기 방법을 그대로 사용하여 비트 필드에 접근한다.
- 4.5 공용체
공용체는 서로 다른 데이터형을 한 번에 한 가지만 보관할 수 있는 데이터 형식이다.
구문은 구조체와 같지만 의미가 다르다.
union one4ball
{
int int_val;
long long_val;
double double_val;
};
one4ball 변수는 int, long, double을 보관할 수 있지만, 어느 한 시점에 어느 한 가지만 보관할 수 있다.
one4ball pail;
pail.int_val = 15; //int형 저장
cout << pail.int_val;
pail.double_val = 1.38; //double형 저장, int형은 소실됨
cout << pail.double_val;
pail은 어떤 경우에는 int형 변수처럼 행동하고, 또 어떤 경우에는 double형 변수처럼 행동한다. 공용체는 한 번에 하나의 값만 보관할 수 있으므로, 가장 큰 멤버를 보관할 수 있을 만큼의 공간이 필요하다. 따라서 공용체의 크기는 가장 큰 멤버의 크기가 된다.
여러 가지 데이터형을 사용할 수는 있지만 이들을 동시에 사용할 수 없을 때, 공용체를 사용하면 메모리를 절약할 수 있다.
4.6 열거체
enum을 사용하는 구문은 구조체 구문과 비슷하다.
enum spectrum
{
red, orange, yellow, green, blue, violet, indigo, ultraviolet
};
이렇게 선언하여 사용한다.
위 구문은 spectrum을 새로운 데이터형의 이름으로 만든다. (enum형 변수를 열거체라고 부른다)
red부터 마지막인 ultraviolet까지 0~7까지의 정수 값을 나타내는 기호 상수로 만든다. (열거자라고 부른다)
기본적으로 0부터 순서대로 대입이된다. 하지만 정수값을 명시적으로 대입하면 기본값은 무시된다.
enum spectrum
{
red, orange, yellow,
green = 10, blue, violet, indigo, ultraviolet
};
이렇게 쓰면 green부터 10, 11, 12 이런식으로 매겨진다.
- 특징
열거체 변수는 그 데티어형을 정의하는 데 사용된 열거자 값만 대입할 수 있다.
즉, spectrum로 선언된 변수에는 red, orange, yellow, green, blue, violet, indigo, ultraviolet 중 하나만 대입이 가능하다.
열거체는 대입 연산자만 사용하도록 정의되어 있다. 특히, 산술 연산이 허용되지 않는다.
열거자들은 정수형이며, int형으로 승급될 수 있다. 그러나 int형이 자동으로 열거체로 변환되지는 않는다.
int color = blue; //가능
spectrum band = 3; //불가능
color = 3 + red; //가능
즉, int형으로는 알아서 바뀌지만 spectrum에는 int를 걍 냅다 넣을 수 없다.
형변환을 해주자. (열거체에 없는 값으로 형변환을하면 값이 미확정값으로 나올 수도 있기 때문에 그런짓은 하지말자)
4.7 포인터와 메모리 해제
데이터를 저장할 때 컴퓨터 프로그램이 알아야 할 세 가지가 있다.
어디에 저장할 것인지,
어떤 값이 저장되는지,
어떤 종류의 정보인지.
프로그램은 그 값을 저장하기 위한 메모리를 대입하고 그 위치를 내부적으로 추적한다.
포인터는 이런 메모리 주소를 저장하는 변수이다.
일반적인 변수의 메모리 주소를 아는 방법은 변수의 앞에 &를 붙이면 된다.
int a = 0;
&a; 이런식으로 하면 주소를 알 수 있다.
메모리를 나타내는 가장 일반적인 방법은 16진수로 나타낸다.
포인터는 어떤 값의 주소를 저장한다. 포인터로 선언한 변수 자체는 어떤 값의 주소를 나타낸다.
간접 참조 연산자라고 부르는 *를 포인터 이름 앞에 붙이면 그 주소에 있는 저장되어 있는 값이 된다.
int* name = &a;
이렇게 작성하고
*name을 출력한다면 a의 값인 0이 출력된다.
name을 출력하면 a의 주소값이 출력된다.
*name = 5; 이런식으로 대입하면 a의 값이 변경된다.
포인터형을 선언할 때는
데이터형 * 변수명;
이런식으로 선언하는데,
int* b;
int *b;
int * b;
어떻게 써도 상관은 없다. (C++에서는 보통 int* b 이런식으로 쓴다)
int* p1, p2; 이렇게 선언해버리면 p1은 포인터 변수로 p2는 int형 변수로 생성된다. 둘 다 포인터로 생성하고자 한다면 변수 이름 앞에 * 연산자를 따로 사용해야한다.
char* a;
double* g;
서로 가리키는 데이터형의 크기는 다르지만 a와 g의 크기는 같다. 주소만을 담기때문!
이렇게 포인터를 생성하면 컴퓨터는 주소를 저장하기 위한 메모리를 대입한다. 이것은 그 포인터가 지시하는 데이터를 저장하기 위한 메모리 대입과는 다르다. 데이터를 저장하기 위한 메모리를 대입하는 것은 아예 다른 단계이다.
long* fellow;
*fellow = 23;
이렇게 저장한다면, fellow 포인터가 어디를 지시하는지 주소를 대입하는 단계가 없기때문에 값은 메모리의 어디에 저장되었는지는 알 수 없다.
그러므로 사용 시 주의해야한다.
- new를 사용한 메모리 대입
어떤 데이터형의 메모리를 원하는지 new 연산자에게 알려 주면, new연산자는 그에 알맞은 크기의 메모리 블록을 찾아내고 그 블록의 주소를 리턴한다. 이 주소를 포인터에 대입하여 사용할 수 있다.
int* pn = new int;
new int부분은 int형 데이터를 저장할 새로운 메모리가 필요하다고 프로그램에 알리고, new연산자는 뒤따르는 데이터형을 보고 몇 바이트가 필요한지 파악한다.
new로 할당한 메모리는 delete로 해제가 가능하다.
해제한 메모리는 다시 가져다 쓸 수 있으므로, 더 이상 필요하지 않은 메모리는 꼭 해제해야한다. 안그러면 메모리 누수가 발생할 수 있다.
일반 변수의 주소를 대입한 경우는 delete로 해제할 수 없다.
- new를 사용한 동적 배열의 생성
배열을 그냥 선언하는 것은 정적 바인딩이라고 할 수 있다. 정적 바인딩은 프로그램을 작성할 때 배열의 크기를 미리 정해두고 사용할 수 있다.
하지만 new를 이용해 동적 바인딩을 한다면 프로그램이 실행되는 동안에 배열의 크기를 정할 수 있다.
- 동적 배열의 생성
배열 원소의 데이터형과 개수를 new에 알려 주면 된다.
int* arr = new int[10];
new 연산자는 그 블록의 첫 번째 원소의 주소를 리턴한다. 위 귀문에서는 포인터 arr에 블록의 첫 번째 원소의 주소가 대입된다고 보면된다.
new를 사용하여 생성도니 메모리 블록은 프로그램이 사용을 끝낸 후에 반드시 delete로 해제해 주어야 한다.
delete [] arr;
이렇게 해제할 수 있다.
new를 대괄호 없이 사용했다면 해제할 때도 대괄호 없이 사용해야하고, 반대의 경우도 마찬가지다.
정리하자면
ㄴ new로 대입하지 않은 메모리는 delete로 해제하지 않는다.
ㄴ 같은 메모리 블록을 한번 이상 delete하지 않는다.
ㄴ new [] 로 메모리를 대입한 경우에는 delete [] 로 해제한다.
- 동적 배열의 사용
int* psome = new int [10];
10개의 int형 값을 넣을 수 있는 블록과, 그 블록의 첫 번째 원소를 지시하는 psome 포인터를 생성한다. 이 원소들 중 어느 하나에 접근하려면 배열의 인덱스처럼 접근이 가능하다.
즉, 첫 번째 원소는 psome[0], 두 번째 원소는 psome[1] 이런식으로 접근이 가능하다.
이렇게 사용이 가능한 이유는 C++가 배열을 구현할 때 내부적으로 포인터를 사용하기 때문이다.
포인터와 배열의 차이는 배열 이름의 값은 변경할 수 없지만, 포인터는 변수이기 때문에 값을 변경할 수 있다.
즉, 포인터형으로 선언된 변수에 +1 을 하면 그 다음 원소를 가리킨다
int* arr = new int [3];
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
arr += 1;
이렇게해버리면, arr[0]을 출력했을때 0이 아닌 1이 출력된다는 말이다.
arr -= 1; 이렇게하면 원래대로 돌아온다.
arr[0]을 출력하면 0이 출력될 것이다. (지정된 범위 밖으로 포인터를 변경한 뒤 출력하면 당연히 안된다.)
4.8 포인터, 배열, 포인터 연산
포인터와 배열 이름의 동등성은 C++가 내부적으로 배열을 처리하는 방법과, 포인터 연산으로부터 온다.
우선 포인터 연산에 대해 알아보자.
정수형 변수에 1을 더하면 값이 1만큼 증가한다. 그러나 포인터 변수에 1을 더하면 값이 그 포이너가 지시하는 데이터형의 바이트 수만큼 증가한다.
즉, double형이 8바이트인 환경에서 double형을 지시하는 포인터에 1을 더한다면 그 포인터의 수치 값에 8바이트를 더하는 것과 같다.
대부분의 상황에서 C++는 배열 이름을 그 배열의 첫 번째 원소의 주소로 해석한다.
double wages[3] = {};
이런 배열이 있을 때
double* pw = wages;
double* pw = &wages[0];
둘 다 같은 주소가 대입된다.
결론적으로 arr[1] 은 *(arr + 1)과 동등하게 취급된다. 그러므로 포인터 이름과 배열 이름을 같은 방식으로 사용할 수 있다. 한 가지 차이점은 배열 이름은 상수인 반면, 포인터는 값을 변경할 수 있는 변수라는 점이다.
또 다른 점이 하나 있는데, 배열은 배열 이름에 sizeof 연산자를 적용하면 배열의 크기가 얻어지지만, 포인터에 sizeof 연산자를 적용하면 배열을 지시하고 있더라도 포인터의 크기가 얻어진다.
배열 이름은 배열의 첫 번째 원소의 주소이지, 배열 전체의 주소가 아니다.
배열 전체의 주소는 &arr 처럼 작성해야 가져올 수 있으며 이렇게 가져온 주소는 해당하는 배열의 전체 메모리 블록의 주소이다.
- 포인터와 문자열
char flower[10] = "rose";
cout << flower << "s are red\n";
이때 배열 이름은 첫 번째 원소의 주소이므로 r이 들어있는 원소의 주소이다.
cout 객체는 그 주소를 문자열의 주소라고 간주하고 해당 원소를 출력한 뒤 널 문자를 만날 때까지 계속해서 문자들을 출력한다. 즉, cout에 문자의 주소를 넘겨 주면 그 문자로부터 시작해서 널 문자를 만날 때까지 계속해서 출력한다고 볼 수 있다.
여기서 중요한 것은 flower이 배열 이름이 아니라 char형의 주소처럼 행동한다는 것이다. 이것은 cout의 매개변수로 char형을 지시하는 포인터 변수를 사용할 수 있음을 의미한다.
큰 따옴표로 둘러싸인 문자열은 그 문자열의 첫 번째 문자의 주소를 나타낸다.
char형의 배열에 저장된 문자열, 큰따옴표로 둘러싸인 문자열 상수, 포인터로 참조되는 문자열이 모두 동등하게 취급된다. 이들은 모두 하나의 주소를 통해 전달된다. 문자열을 구성하는 각각의 문자들을 전달하는 것 보다 수월하다.
- new를 사용한 동적 구조체의 생성
컴파일 시간보다는 실행 시간에 배열을 생성하는 것이 훨씬 유리하다는 것을 알았다. 이는 구조체에도 그대로 해당된다. 구조체도 마찬가지로 new를 사용할 수 있다. new를 이용하여 동적 구조체를 생성할 수 있으며, 동적이라는 이야기는 컴파일 시간이 아닌 실행 시간에 메모리를 대입받는다는 것을 뜻한다. 지금 하는 내용은 클래스에서도 동일하게 적용할 수 있다. (구조체와 클래스는 유사한 점이 많다)
구조체를 생성하려면 구조체형 앞에다 new를 붙인다.
inflatable* ps = new inflatable;
멤버에 접근하는 방법은 -> 을 이용할 수 있다.
ps->name;
이런식으로 접근이 가능하다.
(구조체 식별자가 구조체의 이름이면 도트 멤버 연산자를 사용, 포인터면 화살표 멤버 연산자를 사용)
- 자동 공간, 정적 공간, 동적 공간
C++에서는 데이터를 저장해 두기 위한 메모리를 대입하는 방법에 따라 자동 공간, 정적 공간, 동적 공간으로 구분한다. 동적 공간은 힙이라고도 부른다.
각각의 메모리 공간에 대입된 데이터 객체는 수명이 서로 다르다.
자동 공간
자동 변수들이 저장되며, 자동 변수들은 자신이 정의되어 있는 함수가 호출되는 순간에 자동으로 생겨나 그 함수가 종료되는 시점까지만 존재한다.
(지역변수 ㅇㅇ)
지역 변수는 스택에 저장된다. (후입선출, LIFO)
정적 공간
프로그램이 실행되는 동안에 지속적으로 존재하는 공간.
변수를 정적으로 만드는 방법은 함수의 외부에서 변수를 정의하는 것 (글로벌 변수)과 static이라는 키워드를 붙이는 것.
정적 변수는 프로그램이 실행되는 동안에 지속적으로 존재하고, 자동 변수는 특정 함수나 블록이 실행되는 동안에만 존재한다.
동적 공간
자유 공간(힙) 이라 불리는 메모리 풀, 프로그램의 수명이나 함수의 수명에 얽매이지 않는다. new로 할당하는 것들이 저장된다고 볼 수 있다.
4.10 배열의 대안
- Vector 템플릿 클래스
프로그램이 실행되는 동안 vector 객체의 크기를 세팅할 수 있고, 새로운 데이터를 마지막에 추가하거나 중간에 데이터를 삽입할 수도 있다.
실제로 vector클래스는 new와delete를 사용하지만, 사용자가 직접 사용하지는 않고 자동으로 되게끔 되어있다.
vector를 사용하기 위해서는 vector.h 헤더 파일을 포함해야 하며, 네임스페이스를 포함해야한다. (std 네임스페이스를 사용해야함)
vector<자료형> 배열이름;
이렇게 사용한다.
베거 객체는 값을 삽입하거나 더할 때 자동으로 크기를 조정한다.
-array 템플릿 클래스
사용자가 고정된 크기의 배열만 필요하다면 내재 배열 형이 유리하다. 하지만 그럴 경우 안전성과 편리성은 다소 줄어들 수 있다. array템플릿 클래스를 더해 줌으로써 이러한 경우에 대한 해결 방안을 제시하고 있다. 이는 std 네임 스페이스를 사용한다.
array객체는 자유 저장 대신에 고정된 크기와 고정 메모리 대입을 사용하여 내재 배열이 지닌 것과 동일한 수준의 효율성을 지닌다.
array 객체를 생성하기 위해서는 헤더파일을 포함시켜야한다.
array<자료형, 개수> 변수명;
이렇게 사용하며, 개수 부분에는 변수가 들어갈 수 없다.
- 배열, vector, array 객체 비교
ㄴ 표준 배열 표식을 사용할 수 있다.
ㄴ array객체는 동일한 지역이 메모리를 사용한다. (스택영역)
ㄴ vector는 다른 지역에 저장된다 (자유저장, 힙영역)
ㄴ 하나의 array 객체를 또 다른 array 객체에 대입할 수 있다.
'프로그래밍 > C++' 카테고리의 다른 글
[정리] C++ for문에서의 콤마 연산자 (0) | 2022.12.01 |
---|---|
[정리] C++ 증감연산자와 포인터 (0) | 2022.12.01 |
[정리] C++ 데이터 처리 (0) | 2022.11.30 |
메모리 구조 (0) | 2022.11.22 |
[정리] C++ 시작하기 (0) | 2022.11.21 |
댓글