C++ 사용자라면, 매개변수를 받을때 참조(&)로 받는 것이 효율적이고 자주 사용한다는 것을 알 것입니다.
근데 배열은 어떤식으로 받아야 효율적일까요?
그 방법들을 소개하고자 합니다.
불가능한 방법
일단 이런 형식을 생각해 볼 수 있겠습니다. (받는 것이 10칸짜리 배열이라 가정)
void func(int &arr[10])
{
}
그냥 다른 참조 쓰듯이 똑같이 int &arr[10] 이런식으로 매개변수를 받을 수 있을까요?
정답은 불가능 입니다.
c++에서 위와같은 문법은 금지되어 있습니다.
[ ]의 연산 우선순위가 &보다 높기 때문에 괄호가 없다면 int &(ref[3]) 과 같이 선언되기 때문이라고 생각합니다.
포인터로 배열 받기
void func(int* arr)
{
}
위 방법은 가능합니다.
흔한 포인터를 사용한 방법입니다.
대신 배열의 범위를 벗어나지 않도록 주의해야겠습니다.
void func(int arr[100]) //int *arr 과 똑같다!!!!!
{
}
여기서 위와같이, 난 100칸의 배열을 인자로 받을테야!!
하고, int arr[100]을 매개변수자리에 쓸 수 도 있지만
사실 int* arr과 똑같은 처리입니다.
즉, 실은 포인터로 처리하고 있기때문에, 배열의 범위를 마찬가지로 신경써줘야 합니다.
(범위기반 for문도 쓰지 못합니다! 단순 포인터로 처리하기 때문에)
void func(int arr[]) //int *arr 과 똑같다!!!!!
{
}
그렇기 때문에 위처럼 [ ] 안의 숫자를 생략해도 됩니다. (마찬가지로 포인터와 같은 취급)
배열 참조
위에서 불가능한 경우에서 살짝만 신경써주면 가능합니다.
void func(int (&arr)[100])
{
}
바로 이런식으로 입니다.
아마, 연산자 우선순위로 인한 문제같은데 (&arr)을 묶어줌으로서 해결해줍니다.
포인터와의 차이점은 배열 참조의 경우 원소의 갯수도 타입으로 인정한다는 것입니다.
즉, 아래 코드를 참고해주세요!
void func(int (&arr)[100])
{
}
int main()
{
int arr[6]={1,2,3,4,5,6};
func(arr); //ERROR!!!!!!!!!!!!!!!!!!!
int arr2[100];
func(arr2); //OK
}
배열 원소 갯수도 타입으로 포함시켜서 처리하는 것을 알 수 있습니다.
이런 부분에서, 참조와 포인터의 차이가 나는 것 같습니다.
배열 참조(+템플릿 사용)
흠..여기서 더 유동적으로, 자유롭게 사용하고 싶은 생각이 듭니다.
C++은 그래서 우리에게 템플릿을 주었습니다!
template<typename T,size_t size>
void func(T (&arr)[size])
{
}
이런식으로 해준다면, 인자로 받을 배열의 타입과, 사이즈까지 알아서 처리가 됩니다!!!
ex)
template<typename T,size_t size>
void func(T (&arr)[size])
{
cout<<arr[3];
}
int main()
{
int arr[6]={1,2,3,4,5,6};
func(arr); //4출력됨
}
위와 같은 사용이 가능해집니다.
'C++ > 기타' 카테고리의 다른 글
[C++] 소숫점 고정해서 출력하기 (0) | 2022.09.05 |
---|---|
[C++] string의 신기한 사용법 (0) | 2022.09.04 |
friend 클래스와 함수 (0) | 2022.07.21 |
연산자 오버로딩(Operator Overloading)에서의 Const사용법 (0) | 2022.07.21 |