A. 변수(variable)
1. 변수 기초
a. 변수란?
🌟 가변적인 데이터(data)를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간
b. 변수의 선언
🌟 변수를 사용하기 전에 반드시 먼저 해당 변수를 저장하기 위한 메모리 공간을 할당받는 것
선언되지 않은 변수는 컴파일러 오류를 만들어냄
1) 변수의 선언방법 : 변수의 선언만 하는 방법
📘 문법
자료형(타입) 변수이름;
변수를 선언하여 메모리 공간만을 할당 후 나중에 변수를 초기화
👉 같은 타입의 데이터만 넣기, 다른 타입의 데이터를 저장할 경우에는 저장된 데이터에 변형 및 손실
🧡 변수의 초기화
해당 변수를 사용할 수 있도록 초기값을 설정하는 행위
초기화되지 않은 변수에는 아무런 의미 없는 값인 쓰레깃값이 있음
🤓 예제 : 쓰레기값 출력하기
int num;
printf("%d", num);
✨ 실행결과
C 컴파일러는 오류를 발생시키지는 않겠지만, 프로그램은 사용자가 의도하지 않은 결과를 출력
초기화되지 않은 변수는 절대로 사용해서는 안됨
2) 변수의 선언과 동시에 초기화하는 방법
변수는 선언과 동시에 그 값을 초기화할 수 있음
+ 선언하고자 하는 변수들의 타입만 같다면 여러 변수를 동시에 선언 (다르면 🚫)
🤓 예제
int num01, num02; //동시선언
double num03 = 1.23, num04 = 4.56; //동시선언, 초기화
💥 선언하고자 하는 변수의 타입이 서로 다르면 동시에 선언 불가
c. 변수의 이름 생성 규칙
자유롭게 지을 수 있지만, 해당 변수에 저장될 데이터의 의미를 잘 나타내도록 지어야 함
- 영문자(대소문자), 숫자, 언더스코어(_)로만 구성
- 숫자로 시작 ❌
- 이름 사이에는 공백 ❌
- 대소문자를 구분 (int aaa, int AAA는 다른 변수)
- 변수 이름의 길이에는 제한이 없음
- C언어에서 미리 정의된 32개의 키워드(keyword)와 같은 이름 ❌
auto | beak | case | char | const | continue | default |
do | double | else | enum | extern | float | for |
goto | if | int | long | register | return | short |
signed | sizeof | static | struct | switch | typedef | union |
unsigend | void | volatile | while |
2. 변수와 메모리
a. 비트(bit)와 바이트(byte)
컴퓨터는 모든 데이터를 2진수로 표현하고 처리
- 비트(bit) : 컴퓨터가 데이터를 처리하기 위해 사용하는 데이터의 최소 단위(2진수의 값(0과 1)을 단 하나만 저장)
- 바이트(byte) : 비트가 8개 모여서 구성되며, 한 문자를 표현할 수 있는 최소 단위
b. 변수와 메모리의 관계
변수의 역할 👉 메모리의 주소(메모리 공간에서 정확한 위치 식별을 위한 고유 주소) 기억
변수를 참조 👉 메모리의 주소를 참조 ❌ 해당 주소에 저장된 길이와 형태에 관한 데이터를 참조 ⭕
✔ 하나의 메모리 공간에는 8개의 비트로 이루어진 1바이트의 데이터가 저장
✔ 메모리의 주소 또한 1바이트씩 증가되며, 낮은 주소부터 차례대로 데이터가 저장
✔ 변수의 이름은 첫 번째 메모리 주소인 0x10만을 가리킴
c. 프로그램 실행 순서와 메모리의 구조
먼저 프로그램이 실행되는 과정은 아래와 같음
위와같이 프로그램을 실행하게 되면 운영체제가 메모리(RAM)에 공간을 할당함
1) 코드 영역 : 소스코드가 들어가는 부분 = 텍스트 영역
2) 데이터 영역 : 프로그램 시작 = 할당 / 프로그램 종료 = 소멸
3) 힙 영역 : 프로그래머가 할당( = 동적 할당) / 해제 (자바에서는 가비지 컬렉터가 자동 해제) 하는 메모리 공간
클래스, 클로저가 이 부분에 해당, 런타임 시에 크기가 결정
4) 스택 영역: 프로그램이 자동으로 사용하는 임시 메모리 영역
힙 영역과 스택 영역이 서로 같은 공간을 공유하지만, 메모리 주소의 할당 방향이 다름
가끔 침범하는 일이 생기면, 그걸 HEAP OVERFLOW, STACK OVERFLOW 라고 칭함
👉 조금더 자세히 공부하려면
3. 변수의 종류
변수는 아래 두가지 방법으로 나눌 수 있음
a. 자료형에 따른 변수의 종류
1) 숫자 표현에 관련된 변수 : short형, int형, long형, float형, double형, char형 등
2) 나열, 공백과 관련된 변수
3) 포인터 변수 : 데이터가 저장된 메모리의 주소를 저장하고 처리하는 변수
4) 사용자 정의 구조체 변수 : 관련된 정보를 한 번에 묶어서 처리하는 변수
b. 선언 위치에 따른 변수의 종류
변수의 선언 위치에 따라 (1) 유효범위 (2) 메모리 반환 시기 (3) 초기화 여부 (4) 저장되는 장소 등이 달라짐
위의 특징들을 바탕으로 아래의 4가지 변수로 나눌 수 있음
1) 지역 변수
🌟 함수 / 블록 내에서 선언된 변수
- 키워드 : auto
- 유효범위 : 변수가 선언된 블록 내에서만 유효
- 메모리 반환 시기 : 블록 종료
- 저장되는 장소 : Stack 영역
- 기본 초기화 값 : 초기화 되지 않음
👉 지역변수 특징
- 대표적 지역 변수 : 함수의 매개변수
- 지역 변수끼리라도 변수의 이름으로 같은 이름을 여러 번 사용하는 것 ❌
- 한 블록 내 같은 이름의 변수 중복 💥 컴파일러 오류 💥
2) 전역 변수
🌟 함수의 외부에서 선언된 변수
- 키워드 : extern
- 유효범위 : 프로그램의 어디에서나 접근 (외부지만 전체에서 접근 가능함)
- 메모리 반환 시기 : 프로그램 종료
- 저장되는 장소 : 데이터(data) 영역
- 기본 초기화 값 : 0 (자동 초기화)
- 전역 변수와 같은 이름으로 지역 변수를 선언 ❌ (지역이 전역을 덮어써서 함수 내에서 접근할 수 없음)
- 여러 개의 파일로 구성된 프로그램에서 외부 파일의 전역 변수를 사용하기 위해서는 extern 키워드를 사용해 다시 선언
3) 정적 변수
🌟 함수 / 블록 내에서 static 키워드로 선언된 변수
- 키워드 : static
- 유효범위 : 변수가 선언된 블록 내에서만 유효
- 메모리 반환 시기 : 프로그램 종료
- 저장되는 장소 : 데이터(data) 영역
- 기본 초기화 값 : 단 한 번만 초기화 0 (자동 초기화)
🤓 예제
#include <stdio.h>
void local(void);
void staticVar(void);
int main(void)
{
int i;
for (i = 0; i < 3; i++)
{
local();
staticVar();
}
return 0;
}
void local(void)
{
int count = 1;
printf("local() 함수가 %d 번째 호출되었습니다.\n", count);
count++;
}
void staticVar(void)
{
static int static_count = 1; //①번 라인의 코드는 최초로 실행될 때 단 한 번만 수행
printf("staticVar() 함수가 %d 번째 호출되었습니다.\n", static_count);
static_count++;
}
✨ 실행결과
local() 함수가 1 번째 호출되었습니다.
staticVar() 함수가 1 번째 호출되었습니다.
local() 함수가 1 번째 호출되었습니다.
staticVar() 함수가 2 번째 호출되었습니다.
local() 함수가 1 번째 호출되었습니다.
staticVar() 함수가 3 번째 호출되었습니다.
📝 예제 설명
- ①번 라인의 코드는 최초로 실행될 때 단 한 번만 수행
- static_count는 전역 변수와는 달리 자신이 선언된 staticVar() 함수 이외의 영역에서는 호출 X
4) 레지스터 변수
🌟 함수 / 블록 내에서 register 키워드로 선언된 변수
- 키워드 : register
- 유효범위 : 변수가 선언된 블록 내에서만 유효
- 메모리 반환 시기 : 블록 종료
- 저장되는 장소 : CPU의 레지스터(register) 영역
- 기본 초기화 값 : 초기화 되지 않음
- CPU의 레지스터 영역에 저장되어 빠르게 접근 가능
- 레지스터 크기가 매우 작아 선언이 어려울 떈 그냥 지역변수로 선언함
💙 총정리
변수 종류 | 키워드 | 선언 위치 | 유효 범위 |
지역 변수 | auto | 함수/블록의 내부 | 함수/블록의 내부 |
전역 변수 | extern | 함수의 외부 | 프로그램 전체 |
정적 변수 | static | 함수/블록의 내부 | 함수/블록의 내부 |
레지스터 변수 | register | 함수/블록의 내부 | 함수/블록의 내부 |
변수 종류 | 메모리 소멸 시기 | 초깃값 | 저장 장소 |
지역 변수 | 함수 종료시 | 초기화되지 않음. | 스택(stack) 영역 |
전역 변수 | 프로그램 종료시 | 0으로 초기화됨. | 데이터(data) 영역 |
정적 변수 | 프로그램 종료시 | 0으로 초기화됨. | 데이터(data) 영역 |
레지스터 변수 | 함수 종료시 | 초기화되지 않음. | CPU의 레지스터(register) |
http://www.tcpschool.com/c/c_datatype_variable
'프로그래밍 언어 > C' 카테고리의 다른 글
C 연산자 총정리 -2 (비교, 논리, 비트, 기타 등) (0) | 2023.08.16 |
---|---|
C 연산자 총정리 -1 (산술, 대입, 증감) (0) | 2023.08.16 |
[자료형(data type)] 기본형 총정리 (0) | 2023.08.16 |
C 상수 총정리 (0) | 2023.08.16 |
C언어와 프로그램의 이해 (0) | 2023.08.16 |