응애맘마조
230421 강의 본문
개강 이후로 처음으로 Visual Studio를 켜면서 수업을 진행했었습니다.
배열과 STL의 vector과 list를 비교했었습니다.
먼저 선언하는 방법부터 알아보겠습니다. 배열을 제외하고는 벡터와 리스트는 헤더파일을 추가하고 선언을 해야 됩니다.
배열과 벡터와 리스트에 대해서 작성해 보겠습니다.
먼저 배열은 vector처럼 연속된 데이터로써 각각의 데이터 위치에 원소 값을 지정할 수 있습니다.
주소 값을 출력하게 되면 배열의 시작 주소를 출력하게 됩니다.
int arr[5] = {0};
int arr[5] = { 0,1,2,3,4 };
int arr[3] = 1;
위의 코드에서 첫 번째 줄은 5개의 배열을 모두 0으로 초기화합니다.
두 번째 줄은 각각의 배열을 0, 1, 2, 3, 4로 초기화합니다.
세 번째 줄은 3번째 인덱스를 1로 초기화합니다.
여기서 전치와 후치 연산자를 사용해 보겠습니다.
전치 연산자로써는 가능하지만 후치 연산자로써는 lvalue라는 이름이 뜨면서 오류가 납니다.
value에는 수정할 수 있는 lvalue와 수정이 불가능한 rvalue가 있습니다.
이 둘에 대해서는 밑에 작성하겠습니다.
vector는 연속된 데이터로써 임의의 원소 값에 접근할 수 있습니다. 중간 삽입이 가능하지만 중간 삽입 이후 전체적인 데이터 이동이 필요해서 메모리 낭비가 심합니다.
list는 연속된 데이터는 아니지만 각각 연결된 구조를 가진 자료구조입니다. 시작 위치의 원소와 마지막 위치의 원소만 기억하기 때문에 임의의 원소 값에 접근할 수 없지만 중간 삽입이 가능하고 vector와 달리 데이터의 전체적인 이동이 필요하지 않습니다.
그럼 vector와 list를 이용하여 반복문을 사용했을 때를 알아보겠습니다.
먼저 vector입니다. 좌측과 우측 사진의 코드는 동일한 값을 출력하게 되는 반복문입니다. 물론 어느 쪽을 사용해도 상관은 없지만 차이는 정수의 접근 유무입니다.
첫 번째는 반복문의 끝까지 가기 위해 0부터 배열의 사이즈까지 1씩 더해가면서 올라가기 때문에 여러 번 정수에 접근해서 시간이 오래 걸리게 됩니다.
두 번째는 주소값으로 바로 접근합니다. 시작 인덱스부터 끝 인덱스까지 주소 값에서 더해지는 것이기 때문에 정수의 여러 번 접근하지 않고 빠른 속도로 사용할 수 있습니다. 임의 접근이 가능하기 때문에 it + 2 같이 원하는 인덱스로 넘어갈 수 있습니다.
다음은 list입니다. list도 주소 값으로 바로 접근합니다. 하지만 앞서 말한 대로 임의의 접근이 불가능하기 때문에 it + 2 같이 원하는 인덱스로 넘어갈 수 없습니다.
그림으로 간단하게 정리해보겠습니다.
정리하자면 연속적인 데이터에는 임의 접근이 가능하지만 연속적이지 않으면 임의 접근이 불가능하다는 것을 알 수 있습니다.
그럼 위에 언급한 대로 lvalue와 rvalue에 대해 작성해 보겠습니다.
lvalue가 왼쪽 값이고 rvalue가 오른쪽 값이고 대입연산자(=)를 기준으로 lvalue와 rvalue가 되는 것이 C에서는 맞는 말이지만 C++에서는 왼쪽 값과 오른쪽 값을 의미하지 않고 전혀 다른 의미로 사용됩니다.
먼저 lvalue는 간단하게 값이 변할 수 있는 객체를 말합니다. 따라서 할당 받아서 사용 이후에도 사라지지 않는 객체를 의미합니다. 대표적으로 변수를 lvalue라고 할 수 있습니다.
rvalue는 간단하게 표현식 이후에 사라지는 객체를 말합니다. 상수나 임시변수처럼 변하지 않는 값이고 벗어나게 되면 사라지는 임시적인 값입니다.
앞서 작성한 전치 연산자와 후치 연산자를 비교해보겠습니다.
(arr[3]++ = 3);
(++arr[3] = 3);
첫번째 줄에 있는 ++가 뒤에 있는 후치 연산자에는 먼저 반환되는 값이 있기 때문에 변하지 않는 값이 출력이 됩니다. 따라서 rvalue가 되고 임의의 값을 대입할 수 없습니다.
두번째 줄에 있는 ++가 앞에 있는 전치 연산자에는 먼저 반환되기 전이기 때문에 lvalue가 되고 반환되기 전에 먼저 증가를 하기 때문에 임의의 값을 대입할 수 있습니다.
다음은 lvalue와 rvalue의 reference에 대해 알아보겠습니다.
평상시 C++에서 쓰던 참조자(&)는 lvalue의 참조자입니다.
lvalue reference에 대해서는 https://keisukeaso.tistory.com/131 게시글을 참고해주시면 감사하겠습니다.
rvalue reference는 임시객체에 대해 참조할 수 있는 방법에 대해 알 수 있습니다.
rvalue에 대한 잠조자는 &를 2개 붙인 &&을 사용합니다.
사용하게 되는 이유는 변하지 않는 상수의 값을 다른 변수에 대입하거나 표현 이후에도 사라지지 않게 하도록 복사 생성자로써 비용을 절감하여 사용하기 위해서입니다.
읽어주셔서 감사합니다.