C++에 패배하기 (1) - 포인터/구조체

유사인간·2023년 4월 18일
0

C++을 왜 하니?

기본적으로 이 velog를 시작하게 된 계기는 바로 내가 꿈꾸는 반도체 개발/설계자가 되기 위해 공부한 글을 정리하면서부터이다. 하지만 그 전에도, 나는 컴퓨터 프로그래밍 언어에 대해서 지대한 관심이 있어서 스스로 독학으로 C/C++을 공부했었는데, C언어는 verilog와 유사점이 많아서 배워 놓았던 것이 많은 도움이 되었지만, C++의 특성도 포함하고 있다고 해서 verilog 초심자인 나로써는 그것이 무엇인지 궁금하기도 하고, 예습하고 싶기도 해서 C++에 대해서 공부해보기로 하였다.

포인터

포인터란 호출의 또 다른 내부 개념이다. 언어를 처음 배우면 알아야 하는 자료형을 살펴보자. int, char, long 등의 X비트 XX형 자료형들이다. 각기 다른 크기와 다른 정보 유형을 담고 있다. 예를 들어 살펴보자.

위 이미지는 각기 다른 자료형들이 점유하고 있는 크기이다. 단위는 바이트로써 각 바이트는 8비트를 가지고 있으므로 8을 곱해주어야 한다. 예를 들어, int형 자료형은 32비트를 점유하고 있다.

우리는 비트마다 최대 2가지의 경우의 수를 표현한다고 알고 있다. 이 비트들이 조합되면 2배씩 표현할 수 있는 수가 늘어난다. 그런데 우리가 이렇게 저장한 비트들의 일부나, 규정한 자료형을 넘어선 양의 비트들을 불러와야 할 경우가 있다. 이럴 때 구조체를 사용하며, 포인터는 이런 비트들의 주소들을 불러올 때 사용한다. 포인터의 사용 예를 한번 보자.

int* a = 0; // 아무렇게나 주소를 저장
int b;		// 빈 값인 b 생성
a = &b;		// b의 주소를 할당
*a = 5;		// 주소에 가서 적힌대로 5 삽입

printf("%d\n", a);			// 허가받지 않은 주소라서 에러가 남 (X)
printf("%d\n", (int)a);		// 주소의 값을 정수로 출력함		(O)

주소를 생성하는 것은 비유하자면 사람들이 사는 아파트를 짓는 것이다. 이 아파트는 엄청 가볍고 손 몆번만 휘두르면 생겨나지만 엄청 튼튼한 아파트이다. 이 아파트는 기본적으로 8층이며(정해줄 수 있다), 1층마다 반드시 8명이 살 수 있는 호수가 있다. 사람들은 아주 빠르게 나갔다가 들어올 수 있으며, 물리적으로 층수에 따라서 제약은 없고 호수마다 순서만 있는 아파트이다.


이런 아파트를 뚝딱하고 맨손으로 만들어낼수 있다고 생각해보자. 이 아파트에는 한 층에 8명만 산다.
 
 
 

우리가 어떤 자료형을 선언할 때, 그 아파트에 존재하는 호수의 사람들이 어떤 식으로 휴식하고 있는지 (7번째와 3번째에 사람이 있다면 => 01000100= 68) 주목하고 아파트의 호수(이름)만 주목하지 그 자료가 어딘가에 어떤 아파트 단지에 저장되어 있는지는 관심을 두지 않았다. 그런데 컴퓨터는 이런 자료들을 따로 구별하지 않고 한 스토리지에 쭉 이어서 저장한다. 예를 들면 다음과 같다.

 
이렇게 자료형을 입력받은 순서대로 마구 저장한다. 누군가 이런 형식의 데이터를 본다면 "?" 모양이 머리 위에 띄워질 것이다. 근데 이런 덩어리에서 어디서 어디까지 추출해서 사용해본다고 하자. 마치 아파트 단지에서 주소로 어느 동의 어느 호수부터 어느 동의 어느 호수의 사람들의 거주 정보를 얻어낼 수 있는것이다. 이것이 포인터이다.

위에서 썼던 코드를 가져와 본다면, int형 포인터 a에 int형 b를 넣어서 아파트 이름을 a아파트, 내부에 사는 사람들의 형태를 b, 즉 10진수 형태로 입력하여 8바이트 자료형이라면 2^64가지의 숫자를 표현할 수 있는 것이다. (실제로는 signed, unsigned형의 차이와 소숫점 등의 표현방식 때문에 더 적다)

구조체

그렇다면 구조체란 무엇일까? 구조체는 자료형의 한계를 넘겨주는 형태이다. 구조체를 구성할 때, 언급했던 컴퓨터가 데이터를 저장하는 방식, 즉 넘겨받은 대로 비트에다가 마구 순서대로 경계선 없이 저장해버리는 기법이다. 따라서 정리하면, 사용자 지정 자료형이라고 말할 수 있다.

struct Score{
    char name[10];
    int people; 
    int i; 
    int hello; 
}S;

//선언한 구조체를 초기화하는 방법
struct Score s1 = {"quesiman", 3, 83, 10};

 struct Score s2;
    strcpy(s2.name, "quseiman");
    s2. = 3;
    s2. = 83;
    s2. = 10;

    return 0;
}

구조체를 사용하면 좋은 이유는 사용자가 기본 자료형만을 가지고 표현할 수 없는 자료형을 새로이 만들어내서 똑같은 변수의 사용을 줄여 코드를 줄여주고, 복잡한 데이터를 줄여서 한 묶음으로 표현해줄 수 있다.

profile
유사 인간에 주의하세요.

0개의 댓글