* 블로그에 작성된 따라배우는 C++ 관련 모든 코드와 사진들의 저작권은 강의의 저자이신 홍정모 교수님께 있습니다.
인프런 사이트(www.inflearn.com)의 '홍정모의 따라하며 배우는 C++' 유료강좌를 실제로 구매하였고
강의를 수강하며 제 스스로 복습 및 내용 정리를 위해
강의에 나오는 코드들을 따라친 코드와 교수님의 말씀, 그리고 강의에 나오는 사진들을
활용하였음을 미리 알립니다.
마지막으로, 좋은 강의를 제작해주신 홍정모 교수님께 감사드립니다.
______________________________________________________________________________________________
배열은 기본적인 자료구조이다.
자료들을 일렬로 배열한 것이다. 그리고 이를 index로 각 원소에 접근이 가능하다.
배열의 크기를 미리 정해놓고, 원소들을 초기화를 할 수도 있고
원소들만 초기화하고, 컴파일러에게 배열의 길이를 알아서 넣어달라고 할 수도 있다.
최근엔 = 말고 {} 스타일로도 초기화한다.
처음 프로그래밍을 배울 때 많이 경험하는 일인데, 배열의 크기를 사용자에게 입력받고,
이에 해당하는 배열을 초기화하고 싶은데 문제가 생긴다.
C에서 배열을 선언하면 그 이후 배열의 길이를 변경하기 위해선 다시 새로운 배열을 선언해서 값을 옮기거나
다른 함수를 사용한다. 하지만 핵심은 배열의 길이를 바로 변경할 순 없다는 것.
그래서 const 값으로 배열의 길이를 입력받는다.
만약 사용자에게 배열의 길이를 입력받고 싶다면, 지금 하고 있는 정적배열이 아닌
추후에 배울 동적할당을 주로 사용해야한다.
중요한 개념.
배열을 함수의 인자로 받을 때 이는 배열 전체를 받는 것이 아닌, '포인터'로 받는다.
dosomething 함수의
(size_t)&students_scores와
(size_t)&students_scores[0]의 차이를 비교해보자.
전자의 경우, students_scores는 배열이 아닌 '배열을 받은 포인터'이다.
후자의 경우, [0], 즉 해당 포인터를 *처럼 direct?한 것이므로 배열의 0번째 값이다.
doSomething함수의 students_scores는 포인터이므로 주소값을 담는 변수, 즉 포인터의 크기이므로 8로 나왔다.
배열의 길이 = sizeof(배열 전체) / sizeof(해당 배열의 자료형) 으로 자주 사용된다. 암기라기보단, 당연스레 이해가 되고 사용하면 된다.
반복문을 이용해, 전체 인덱스들을 한번씩 보면서 max와 min의 값을 찾고 있다.
배열에서 반복문을 사용하긴 매우 용이한데, 그 이유는 배열의 길이를 안다면 while문이나 for문을 활용해 인덱스들을 순차적으로 접근이 가능하기 때문이다.
배열을 출력하는 함수를 보통 구현할 때, 단순히 배열의 포인터만 주는 것은 부족하다.
왜냐하면 포인터만 가지고는 배열이 어느 정도의 크기인지 파악이 불가능하기 때문이다.
배열 크기 이후의 값이 쓰레기 값이거나 기존의 어떤 자료값을 가지고 있는데, 접근해버리면 문제가 되겠지.
그래서 배열의 포인터와 함께 배열의 크기(길이)를 같이 함수의 인자로 주는 것이 일반적이다.
이번 예제의 경우 선택정렬(selection sort)를 간단히 사용해봤는데
원리는 간단하다.
첫 인덱스의 원소와 나머지 원소들을 다 비교해서 해당하는 값과 swap한다.
그러면 첫 인덱스엔 목표하던 값이 있으므로 첫 인덱스의 원소는 볼 필요없이
바로 두 번째 인덱스로 넘어가서 그 값과 나머지 원소의 값들을 비교하며 쭉 진행하면 된다.
swap의 경우 저렇게 해도 되고, std::swap() 함수를 이용해도 된다.
정적 다차원 배열이다.
보통 쓰이는 건 2차원, 3차원까지 주로 쓰이며, 물론 맘 먹으면 4차 5차 그 이상도 가능하다.
핵심적으로 알고 가야할 건, 2차원이든 3차원이든 다차원배열도 결국엔 메모리 상에는 1차원 배열로 저장된다는 것이다.
문자열은 내가 입력하지 않아도 마지막에 null character(\0)이 붙는다.
말 그대로 메모리상에서 문자열의 끝을 알려줌으로써 구분하기 위해 붙이는 것이다.
컴퓨터는 \0으로 문자열의 끝을 판단하기에 문자열 도중에 \0을 넣어주면 끝으로 인식하게된다.
문자열을 사용자로부터 입력받고 싶을 때 주로 cin을 사용했다. 근데 cin의 경우 빈칸이 있을 경우 거기를 끝으로 인식해서 문제가 된다.
해결책은 getline함수를 이용해 준 사이즈만큼은 다 line을 받아오게 하면 된다.
null character을 만날때까지 문자열을 출력하게 구현할 수 있음.
알아야할 건 스페이스바도 null이 아닌 아스키 값을 가지고 있는 문자라는 것!
strcpy, string copy 함수는 사용할 때 source의 크기만큼은 충분히 줘야하니 사이즈에 주의를 기울여야 함.
문자열을 복사하는 함수를 구현해보면 알겠지만, 반복문으로 문자를 하나씩 하나씩 넘겨줘야함.
그거 귀찮아서 함수 쓰는 거다.
strcmp, 즉 string compare함수는 말 그대로 문자열들을 비교해 같은지 다른지를 확인한다.
문자열이 같을 경우 0을 반환한다. 이거 매우 주의해야한다.
평소에 0이 false라고 생각하기에, 주의주의!
포인터를 배우면서 많이 헷갈릴 수 있는 부분이다.
int* ptr이라 할 때 ptr은 말 그대로 주소값을 저장하는 변수이다.
그리고 주소값의 크기는 은 내가 32비트를 사용할 것인가, 64비트를 사용할 것인가에 따라 달라지겠지.
지금의 경우 64비트(8바이트)를 사용하고 있기에 8로 사이즈가 찍힌다.
지금 something 구조체의 크기는 16인데, 구조체 포인터 변수는 8이 찍힌 것도 같은 원리지.
함수의 인자로 받을 때 이것이 그냥 값인지, 포인터인지, 참조인지에 따라서 많은 것들이 바뀐다.
어떻게 보면 이게 처음 프로그래밍을 배울 때 난관이지 않을까 싶다.
정말 단순히 값으로만 생각하다가 포인터를 만났을 때의 그 당황스러움..
하지만 다시 기초로 심플하게. 포인터는 주소값을 저장하고 그 주소값에 해당하는 값으로 접근!
'C++(따라하며 배우는 C++)' 카테고리의 다른 글
Chapter 7-(4). 함수 (0) | 2021.09.07 |
---|---|
chapter 7-(3). 함수 (0) | 2021.09.06 |
chapter 7-(2) . 함수 (0) | 2021.09.04 |
Chapter 7-(1). 함수 (0) | 2021.09.02 |
chapter 6-(2). 행렬, 문자열, 포인터, 참조 (0) | 2021.08.31 |