C++로 Array, Structure, Pointer, Function 관련해서 정리를 해보았다.
Array란?
배열(Array)은 하나의 자료구조로 "연속적인" 자료구조이다. 그게 무슨 말이냐 하면, 메모리에 저장될때 순서대로 물리적인 공간 상에 저장된다는 말이다.
예를 들어..
int foo [5] = { 16, 2, 77, 40, 12071 }; // 초기화
16, 2, 77, 40, 12071은 모두 메모리상에 실제로 순서대로 저장된다. 하지만 이건 언어들에 따라 다르다. 아마 Python같은 언어들은 이미 List같은 자료형들이 Linked List같은 형태로 되어있는걸로 알고있다. Linked List는 참고로 하나의 자료구조로 각 요소들이 주소로 연결되어있는 연속적인 자료구조이다.
C++에서 Array의 요소에 접근할때는 index로 접근이 가능하다, 다른 언어들처럼.
foo[1] // 16
초기화하지 않은 요소들은 모두 0으로 초기화된다
int main() {
int foo[5] = {1,2,3};
for(int i : foo)
{
cout<<i<<endl;
}
return 0;
}
위 코드의 출력화면은 다음과 같다.
1
2
3
0
0
Structure란?
영어로는 Structure, 한국어로는 구조체이다.
C언어에서는 Class가 없기 때문에 구조체로 객체와 비슷하게 만들어서 사용할 수 있는데 C++에서도 C언어의 기능을 사용할 수 있다. struct
라는 키워드를 사용해서 선언한다.
struct Circle
{
double x; // 좌표점 x
double y; // 좌표점 y
double radius; // 반지름
};
Circle이라고 하는 구조체의 예시.
그럼 구조체를 정의했으니 구조체 하나를 선언후 값들을 출력해보자.
int main() {
struct Circle c = { 0, 0, 5}; // 선언과 동시 초기화
cout<<c.x<<endl<<c.y<<endl<<c.radius<<endl;
return 0;
}
출력 결과는 다음과 같다.
0
0
5
만약 우리가 Circle c의 area값을 출력하고 싶다면 3.14를 곱해서 할 수 있다.
cout<<c.radius*c.radius*3.14<<endl;
Pointer란?
포인터라는 개념은 C,C++에서 가장 중요한 개념이다. 사실 이걸 배우기 위해서 Reference라는 개념도 배우고 문자열, Stack, Heap이라고 하는 단어들을 알고 있어야 한다. 그래서 혹시 용어들을 모른다면 반드시 Reference, Stack, Heap에 대해서 검색하고 찾아봐라.
포인터란 주소 변수로 메모리 주소에 들어가있는 실제 데이터를 저장하지 않는다. 즉, 메모리 주소만 저장하는 변수이다.
포인터는 데이터를 직접적으로 접근하지 않을때 사용하고 또한 유용하다. 특히, Heap영역에 있는 데이터에 접근할때 포인터가 사용된다.
int main() {
int num1 = 100;
int arr[5] = {10, 20, 30, 40, 50};
int *p1; // p1라고 하는 포인터 변수 선언
int *p2; // p2 포인터 변수 선언
p1 = arr; // arr변수의 주소를 p1에 할당
p2 = &num1; // num1의 주소를 p2에 할당
cout<<p1<<endl; // arr의 첫번째 메모리 주소가 출력됨.
return 0;
}
위의 예시에서 arr
는&
를 앞에 붙이지 않았는데 이건 배열의 경우 arr가 이미 주소를 담고 있기 때문에 그렇다. 그래서 p2에 num1의 주소를 할당할때는 int형 num1변수의 주소를 참조(reference)하기 위해서 &(주소연산자)를 넣어준다.
결국 메인메모리 바깥에 접근하기 위해서는 포인터를 사용할 수 밖에 없다.
구조체와 포인터
struct Rectangle r = {10, 5};
struct Rectangle *p;
p = &r; // 0x7ffd1fdb4970 메모리 주소
r.length = 15;
p->breadth = 20;
cout<<p<<endl<<p->length<<endl<<p->breadth<<endl;
위의 출력 결과는
0x7ffd1fdb4970
15
20
이다
메모리 접근 ->
문법은 익숙해져놓는게 좋다.
Function
함수는 가장 기본적인 형태의 모듈로 어떠한 값을 return하는 구조이다. 코드를 작은 단위로 쪼갤때 사용하고 function을 사용해서 각 코드의 기능을 작게 나누는건 좋은 코딩습관이다.
int add(int a, int b) {
return a + b;
}
int main() {
int x = 5;
int y = 10;
printf("%d", add(x, y));
return 0;
}