지우너
[C++] array, string, vector size 구하기 본문
vector.size()나 string.length()는 자주 써서 괜찮은데, 배열 길이는 정해져 있어서 숫자로 적고 말면 되니까 잘 안 쓰게 됐다...
무의식 중에 arr.size(), arr.length() 적었다가 에러가 날 때가 많아서 깔끔하게 적고 싶을 때 쓰려고 정리한다!
요약
// arrSize
int arr[6] = {1, 2, 3, 4, 5, 6};
int arrSize = sizeof(arr)/sizeof(int); //sizeof(array_name)/sizeof(type)
for(int i=0; i<arrSize; i++){
cout << arr[i] << " "; // 1 2 3 4 5 6
}
cout <<'\n';
//vectorSize
vector<int> vec(6);
int vecSize = vec.size();
for(int i=0; i<vecSize; i++){
cout << vec[i] << " "; // 0 0 0 0 0 0
}
cout <<'\n';
//stringSize
string str = "abcdef";
int strSize = str.length();
for(int i=0; i<strSize; i++){
cout <<str[i] << " "; // a b c d e f
}
cout <<'\n';
설명
string이나 vector는 클래스라서 클래스의 멤버변수로 size, length가 제공되지만, arr는 c스타일의 자료형이다. 고정된 크기를 가진 단순한 메모리블록이기 때문에 size()로 구할 수 없는 것이다.
좀 더 쉽게? 설명해보겠다. 위의 설명을 보면 array라는 자료형이 있다는 거야? 라고 생각이 들 것 같다. array라는 자료형이 따로 있는 것은 아닌 것 같다!
우리가 c스타일의 array를 선언할 때 "자료형 arrayName[size];" 라고 선언한다. 만약 int arr[6]이라고 했다면 int형 변수 6개를 연속된 공간에 사용하겠다고 선언하는 것이다. arr를 선언하면 arr에 int 6개의 공간을 할당해주지만, 6개가 저장되어 있다는 사실을 저장할 공간은 없다. class, struct 안에는 다양한 정보를 담을 수 있지만, int arr[6]에는 그런 정보를 담을 수 있는 공간이 없기 때문이다(단순히 int int int int int int 이렇게 할당된 곳의 첫번째 주소를 가리키고 있을 뿐이기 때문)
요약하자면, int arr[6]은 int 6개 만큼의 연속된 공간을 할당해주고, 그 첫 번째 주소를 가리키는 것에 불과하다. 그렇기 때문에 arr가 6개라는 것을 알기 위해서는 다른 방법이 필요한 것이다!
sizeof()를 이제 여기서 사용하게 되는데, sizeof()는 함수가 아니라 연산자라고 한다. sizeof 연산자는 키워드로 정의되어 있어서, 표준 라이브러리나 헤더 파일에 포함된 것이 아니며, 컴파일러가 직접 지원하는 연산자이다('>', '<', '=='과 같은 산술연산자도 컴파일러가 직접 지원하는 연산자이다).
즉, sizeof는 언어 자체의 일부로서, 컴파일 시점에 크기를 계산한다. sizeof 연산자는 특정 타입이나 객체의 크기를 바이트 단위로 반환하고, 컴파일러는 이 정보를 사용하여 메모리 크기를 계산한다.
아무튼 sizeof(arr)를 이용하면 arr가 차지하고 있는 메모리의 크기를 바이트 단위로 알려준다. arr는 int이기 때문에 sizeof(int)로 int가 몇 바이트인지(int는 4byte이다)계산한다. 그렇게 sizeof(arr)/sizeof(int)를 하면 int 몇 개로 이루어져있는지 나오게 되는 것(12개를 4개씩 묶으면 3묶음이 나옴-> int 3개로 이루어진 배열이라는 의미)
https://learn.microsoft.com/en-us/cpp/c-language/sizeof-operator-c?view=msvc-170
https://en.cppreference.com/w/cpp/language/sizeof
array.size()를 이용할 수 있는 방법
c++의 array 클래스를 이용하면 array.size()를 이용해 array의 size를 구할 수도 있다. #inclue <array>를 해줘야 사용할 수 있다.
#include <array>
#include <iostream>
int main() {
std::array<int, 6> array = {0, };
// 배열의 크기 구하기
std::cout << "Array size: " << array.size() << std::endl;
return 0;
}
개인적으로는 array클래스를 사용할 거라면, vector를 사용하는 것이 더 간편해보인다고 생각한다.
https://learn.microsoft.com/en-us/cpp/standard-library/array-class-stl?view=msvc-170
https://cplusplus.com/reference/array/array/size/
'Programming > C++' 카테고리의 다른 글
생성자(constructor)와 멤버 초기화 리스트(member initializer list) (0) | 2024.08.11 |
---|---|
C++ Set 사용하기 (0) | 2024.08.07 |
C++ 클래스(Class) (0) | 2024.05.30 |
C++ Sort()함수 (0) | 2024.05.28 |