C언어 필수 개념

권성현·2023년 5월 16일
0

업무

목록 보기
20/22
post-thumbnail

1. 형 변환

자동 형변환(암묵적•묵시적)

컴파일러가 자동으로 수행하는 형 변환은 언제나 데이터 손실이 최소화되는 방향으로 이루어진다. 따라서 자동 형변환에만 의존하면 프로그래머가 의도하지 않은 데이터의 손실이 발생할 가능성이 높아진다.
데이터 형식(Type)을 자동으로 변환해주는 것을 의미하며,
대입 연산자를 기준으로 오른쪽에서 왼쪽으로 자동 형 변환됩니다.
메모리 크기가 작은 자료형에서 큰 자료형으로 변환되는 것을 우선순위로 둡니다.

byte 크기
char(1) ← short(2) ← int(4) ← long(4) ← float(4) ← double(8) ← long double(8이상) →[float부턴 실수]

강제형 변환(명시적 형변환)

강제 형 변환은 개발자가 직접 형 변환을 요청하는 것을 의미. 이유는, 데이터 손실을 최소화하기 위함.
데이터 손실이 없는 경우(확장 변환, 프로모션(Promotion))
→ 작은 자료형에서 큰 자료형으로 전환될 경우 데이터 손실이 발생하지 않습니다.
Ex) int → double 손실 X
데이터 손실이 있는 경우(축소 변환, 디모션(Demotion))
→ 큰 자료형에서 작은 자료형으로 전환될 경우 데이터 손실이 발생합니다.
Ex) double → int 손실 O
강제 형 변환 형식
(바꿀 자료형) 변수;
Ex) (double)num;
→ 이처럼 바꿀 자료형을 강제로 () 괄호 안에 기입하게 됩니다.

2. malloc 동적 메모리

프로그램에서 값을 저장하기 위해 필요한 기억 장소를 확보하는 것을 메모리 할당이라 한다. 정적 할당과 동적 할당 두 가지가 있다.

정적할당

프로그램에 필요한 기억 장소를 확보하기 위해 지금까지 사용한 방식은 변수를 선언하는 것이었다. 자료형에 따라 메모리 크기가 정해지고, 이때 정해진 메모리 크기는 프로그램을 실행할 때마다 변하지 않는다. 
문제점
메모리 크기를 알아야함. 임의로 정한 메모리 크기보다 적은 메모리를 사용하게 되면 메모리 공간이 낭비된다. 메모리 크기보다 많은 메모리를 사용해야 된다면 다시 코드를 수정해야되므로 효율성이 떨어진다.

동적할당

동적할당은 상황에 따라 필요한 만큼의 메모리를 할당 받을 수 있어 유연한 프로그램을 작성하는 것이 가능하다. 
동적 할당에서는 직접 메모리를 할당하고 해제하는 과정을 코드로 직접 작성해야 한다. 그러기 위해서 먼저 할당과 해제하는 함수가 포함된 stdlib.h 헤더 파일을 포함해야한다.
동적 메모리를 할당하면 힙 메모리에 공간이 생성된다. 이 공간은 프로그램이 종료될 때까지 존재한다. 사용하지 않는 메모리는 free함수를 사용하여 꼭 회수해줘야 한다.
문제점
더 이상 사용하지 않을 때 명시적으로 메모리를 해제해 줘야한다.

3. 메모리 구조

코드 영역, 데이터 영역, 스택 영역, 힙 영역

코드(code) 영역

메모리의 코드(code) 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부릅니다.
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됩니다

데이터(data) 영역

메모리의 데이터(data) 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역입니다.
데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다.

스택(stack) 영역

메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역입니다.
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다.
스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출합니다.
스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하고 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.

힙(heap) 영역

메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역입니다.
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됩니다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.

📌4. 포인터(), 번지(&), 내용() 구분

포인터(→번지만 기억할 수 있다.)

포인터 변수 p는 int형 데이터의 주소 값을 보관할 수 있는 변수.

&의 의미
변수 이름 앞에 &를 붙이면 그 변수의 주소를 알려준다.

포인터 변수p는 int형 변수 a의 주소값을 저장한다.

*의 의미
& 연산자의 반대의 역할을 하는 연산자로 볼 수 있다. 포인터변수에 저장되어있는 주소가 가르키는 실제
데이터 값을 불러오는 연산자이다.

*연산자를 이용하여 포인터 p가 가르키는 데이터 a에 접근할 수 있다.

5. 2진수, 10진수, 16진수

2진법이란, 0~1까지의 2개의 숫자를 사용해서 수를 표현한다.
10진법이란,0~9 까지의 10개의 숫자를 사용해서 수를 표현한다.
16진법이란, 0~9 까지의 10개의 숫자를 사용하고 남는 자리는 A~F 까지 6개의 문자를 사용해서 수를 표현한다.

2진수→10진수로 변환

2진→16진수로 변환

4자리씩 끊어서 계산한다.

6. unsigned, signed

+ signed : 숫자의 양수, 음수 전부 표현 가능한 값 (부호를 가질 수 있어, 양수인지 음수인지 구분 O) 
+ unsigned : 숫자의 양수만 표현 가능한 값 (부호를 가질 수 없어, 양수인지 음수인지 구분 X)

unsigned

int 자료형 표현 값 범위 : –2,147,483,648 ~ 2,147,483,647

int 는 4byte 만큼의 메모리 공간을 차지하는 자료형. byte는 8개의 bite가 모여 형성되는 단위이므로, int는 32bite 자료형. int가 정수 0을 표현하고 때의 각 bite의 상태를 표현하면 아래와 같습니다.

=> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (32)

int가 차지하는 32개의 bite 중에서 가장 끝에 자리한 bite 하나는 부호를 담당하는 bite인 MSB입니다(맨 왼쪽에 따로 표시). 이 bite 가 0일 경우 해당 데이터가 표현하는 값은 양의 정수가 되고, 1일 경우 음의 정수가 됩니다. 
이렇듯 int의 32개 bite 중 하나의 bite 는 부호를 나타내는 용도로 사용되는데(int가 아닌 다른 자료형도 마찬가지입니다), 그러면 자연스럽게 int가 절대값을 표현할 수 있는 bite 의 개수는 31개가 됩니다. 결과적으로 int가 나타낼 수 있는 절대값의 범위는 최대 2의 31제곱까지입니다.

unsigned 자료형

자료형에 unsigned가 붙게 되면 부호가 없다는 의미가 되는데, 이는 곧 음의 부호(-)를 붙이지 않고 0 이상의 값만을 표현하겠다는 의미입니다. 앞서 int의 32개 bite 중 하나의 bite 가 부호를 나타내는데 사용된다고 했는데, unsigned가 붙게 되면 부호를 나타내는 bite 가 필요 없어집니다. 따라서 unsigned int는 32개의 bite 모두를 절대값(이 경우 양의 정수)을 나타내는데 사용합니다. 2의 32제곱이 unsigned int의 최대값이 되는 것입니다.

=> unsigned int 자료형이 표현할 수 있는 값의 범위 : 0 ~ 4,294,967,295

profile
개발일지

0개의 댓글