공부해보잠
변수 본문
변수의 개요
변수는 컴퓨터가 명령을 처리하는 도중 발생하는 값을 저장하기 위한 공간으로, 변할 수 있는 값을 의미한다.
즉, 프로그램 실행 중 데이터를 저장하고 필요할 때 값을 변경하거나 사용할 수 있도록 하는 메모리 공간의 식별자이다.
변수의 특징
- 메모리 공간을 차지함 → 변수를 선언하면 특정 메모리 공간이 할당됨
- 값을 변경할 수 있음 → 실행 중에도 새로운 값을 할당 가능
- 자료형(데이터 타입)이 있음 → 저장하는 값의 유형(정수형, 실수형, 문자형, 포인터형 등)에 따라 구분됨
- 이름을 통해 접근 가능 → 변수에 할당된 값은 변수명을 통해 사용됨
- 초기화 후 사용해야 함 → 선언된 변수는 값을 할당(초기화)한 후 사용해야 함
변수의 역할
- 데이터 저장 : 연산, 비교, 출력 등을 위해 데이터를 저장하는 역할
- 유지 및 변경 가능 : 프로그램 실행 중 값을 유지하거나 변경할 수 있음
- 가독성 향상 : 명확한 변수명을 사용하여 코드의 의미를 쉽게 이해할 수 있음
- 메모리 관리 : 프로그램이 실행되는 동안 메모리를 효과적으로 관리
변수의 종류 (저장하는 값에 따른 분류)
구분 | 설명 | 예시 |
정수형(Integer Type) | 정수 값을 저장하는 변수 | int num = 10; |
실수형(Floating Point Type) | 소수점이 포함된 값을 저장하는 변수 | float pi = 3.14; |
문자형(Character Type) | 하나의 문자를 저장하는 변수 | char letter = 'A'; |
문자열형(String Type) | 여러 개의 문자를 저장하는 변수 | string message = "Hello"; |
포인터형(Pointer Type) | 변수의 주소 값을 저장하는 변수 | int* ptr = # |
변수명 작성 규칙
프로그래밍에서 변수명을 작성할 때 반드시 지켜야 하는 규칙이 있습니다. 올바른 변수명을 사용하면 코드의 가독성이 좋아지고, 오류를 방지할 수 있습니다.
변수명 작성 규칙 정리
규칙 | 설명 | 올바른 예시 | 잘못된 예시 |
사용 가능한 문자 | 영문자(A-Z, a-z), 숫자(0-9), 언더바(_) 사용 가능 | myVariable, count_1, _tempValue | num#1, var name, 1stNumber |
첫 글자 제한 | 영문자 또는 _(언더바)로 시작해야 하며, 숫자로 시작할 수 없음 | _privateVar, userCount | 1number, 123value |
특수문자 사용 불가 | *, +, -, / 등 특수문자 및 공백 사용 불가 | my_value, number1 | my value, num+total |
대소문자 구분 | Number와 number는 서로 다른 변수로 인식됨 | count, Count (다른 변수로 취급됨) | |
예약어 사용 불가 | int, return, if 등 예약어 사용 불가 | return_value, countIf | int, return, if |
세미콜론(;) 필수 (C, C++ 등) | 문장 끝에 ; 추가해야 함 | int num = 10; | int num = 10 |
헝가리안 표기법 사용 가능 | 변수명 앞에 데이터 타입을 명시하여 가독성 향상 | nCount, fValue, cLetter | count, value |
- 헝가리안 표기법 (Hungarian Notation)
- 변수명 앞에 데이터 타입을 명시하는 방식
- 예시: nCount (n = 정수형 int), fValue (f = 실수형 float), bIsTrue (b = 불리언 bool)
- 예약어(키워드)란?
- 프로그래밍 언어에서 특별한 의미를 가지는 단어로, 변수명으로 사용할 수 없음
구분 | C 예약어 | JAVA 예약어 | Python 예약어 |
제어문 | if, else, switch, case | if, else, switch, case, default | if, elif, else |
반복문 | for, while, do | for, while, do | for, while |
분기문 | break, continue, return, goto | break, continue, return | break, continue, pass |
논리 연산 | &&, ` | , !` | |
자료형 | char, int, float, double, short, long, void | byte, short, int, long, float, double, char, boolean | int, float, complex, bool, str, list, tuple, set, dict |
클래스 관련 | - | class, interface, enum, extends, implements | class, self |
객체 관련 | - | new, this, super, instanceof | - |
예외 처리 | - | try, catch, finally, throw, throws | try, except, finally, raise, assert |
접근 제어자 | - | public, private, protected | - |
기타 제어자 | const, volatile, extern, static, register, auto | static, final, abstract, synchronized, volatile, transient | del, global, nonlocal |
패키지/모듈 | - | package, import | import, from, as |
메모리 관련 | malloc, free, sizeof | new, finalize() | del |
기타 | typedef, struct, union, enum | void, assert, native, strictfp, goto(사용되지 않음), const(사용되지 않음) | True, False, None, with, async, await |
사용되지 않는다는 의미
- goto(Java) → C에서는 사용되지만, Java에서는 권장되지 않으며, 공식적으로 지원되지 않음.
- const(Java) → Java에서는 final을 사용하여 상수를 선언하므로 const는 의미가 없음.
변수명은 알기 쉽고 가독성이 좋은 이름을 사용하는 것이 중요합니다.
언어별 변수명 규칙을 준수해야 오류를 방지할 수 있습니다.
헝가리안 표기법을 사용하면 변수의 데이터 타입을 쉽게 파악할 수 있습니다.
변수를 상수로 만들어 사용하기
프로그래밍에서는 보통 변수를 사용하여 값을 저장하고 변경할 수 있습니다. 하지만 프로그램 실행 중 값이 절대 바뀌지 않아야 하는 경우, 변수를 상수(Constant) 로 선언할 수 있습니다.
예를 들어, 원주율(π) 값은 항상 3.1415927이므로 프로그램이 실행되는 동안 바뀌면 안 됩니다. 이때 상수를 사용하면 실수로 값을 변경하는 것을 방지할 수 있습니다
상수를 만드는 방법
C언어에서는 두 가지 방법으로 변수를 상수로 만들 수 있습니다.
const 예약어 사용하기
const 키워드를 사용하면 변수를 상수로 만들 수 있습니다.
예제 코드
#include <stdio.h>
int main() {
const float PI = 3.1415927; // 상수 선언
float radius = 5.0;
float area = PI * radius * radius; // 원의 넓이 계산
printf("원의 넓이: %f\n", area);
// PI = 3.14; //const로 선언된 값은 변경할 수 없음(오류)
return 0;
}
const를 사용하면 프로그램 실행 중 PI 값을 변경할 수 없습니다.
#define 전처리기 사용하기
#define을 사용하면 특정 값을 이름으로 정의할 수 있습니다.
컴파일할 때 PI를 3.1415927로 치환하는 방식입니다.
예제 코드
#include <stdio.h>
#define PI 3.1415927 // 전처리기 상수
int main() {
float radius = 5.0;
float area = PI * radius * radius; // 원의 넓이 계산
printf("원의 넓이: %f\n", area);
return 0;
}
#define은 값이 고정되며, 메모리에 저장되지 않고 코드에 직접 치환됩니다
const와 #define의 차이점
비교 항목 | const 사용 | #define 사용 |
처리 시점 | 컴파일 단계 | 전처리 단계 (컴파일 전에 치환) |
타입 검사 | 있음 | 없음 (값이 단순 치환됨) |
메모리 사용 | 변수로 저장됨 | 메모리를 사용하지 않음 |
디버깅 | 가능 | 어려움 (컴파일 후 원래 값이 사라짐) |
const는 타입 검사와 디버깅이 가능하여 일반적으로 더 안전합니다.
#define은 메모리를 사용하지 않지만, 디버깅이 어렵습니다.
상수와 리터럴(Literal)의 차이
리터럴이란 그 자체로 변하지 않는 값을 의미합니다.
float pi = 3.1415927; // 3.1415927 자체가 "리터럴"
위 코드에서 3.1415927은 리터럴이고, pi는 변수입니다.
하지만 아래처럼 선언하면 pi도 변경할 수 없는 상수가 됩니다.
const float pi = 3.1415927; // pi는 변경할 수 없는 상수
언제 const와 #define을 사용할까?
- 변수를 사용할 때 타입 검사와 디버깅이 필요하면 const 사용
- 간단한 숫자 상수(예: 원주율, 최대값)를 정의할 때는 #define 사용
요약
- const와 #define을 사용하면 변수 값을 변경할 수 없도록 상수화할 수 있다.
- const는 타입 검사 가능, #define은 컴파일 전에 값이 치환됨
- 상수를 사용하면 프로그램이 실수로 값을 변경하는 문제를 예방할 수 있다
C 언어의 기억 클래스(Storage Class)
프로그래밍에서 변수를 선언하면 메모리 내에 값을 저장할 공간(기억영역) 이 할당됩니다.
이때, 변수가 저장될 위치, 사용 범위, 생존 기간 등을 결정하는 것이 기억 클래스(Storage Class) 입니다.
C 언어에서는 다음과 같이 5가지 종류의 기억 클래스를 제공합니다.
기억 클래스 종류 및 특징 정리
기억 클래스기억영역예약어생존 기간사용 범위특징
기억 클래스 | 기억영역 | 예약어 | 생존 기간 |
사용 범위 |
특징 |
자동 변수 | 메모리(스택) | auto (기본값) | 일시적 | 지역적 | - 함수나 블록 { } 내에서 선언됨 - 실행되는 동안만 존재하며, 블록을 벗어나면 자동 소멸됨 - 초기화하지 않으면 쓰레기 값(Garbage Value)이 저장됨 |
레지스터 변수 | 레지스터 | register | 일시적 | 지역적 | - CPU 내부 레지스터에 저장되어 빠른 속도로 접근 가능 - 함수나 블록 실행 동안만 존재하고, 종료되면 소멸됨 - 레지스터 개수가 제한되어 있으면 메모리에 할당됨 - 변수의 메모리 주소를 가질 수 없어 & 연산자 사용 불가 |
정적 변수 (내부) | 메모리(데이터) | static | 영구적 | 지역적 | - 함수나 블록 { } 내에서 선언하지만, 프로그램 종료까지 값 유지 - 함수가 여러 번 호출되어도 기존 값을 유지함 - 초기화는 한 번만 가능하며, 생략하면 자동으로 0으로 초기화됨 |
정적 변수 (외부) | 메모리(데이터) | static | 영구적 | 전역적 | - 함수 밖에서 선언되며, 파일 내부에서만 접근 가능 (파일 범위 제한) |
외부 변수 | 메모리(데이터) | extern | 영구적 | 전역적 | - 다른 파일에서 선언된 변수를 참조할 때 사용 - 함수 외부에서 선언됨 - 함수가 종료된 뒤에도 값 유지됨 - 초기화 생략 시 자동으로 0으로 초기화됨 |
가비지 콜렉터(Garbage Collector)란
- 프로그래밍에서 변수를 선언하면 메모리 공간이 할당됩니다.
- 하지만 사용하지 않는 변수가 계속 남아 있으면 메모리가 낭비될 수 있습니다.
- 이런 사용되지 않는 메모리(쓰레기 메모리) 를 자동으로 해제하여 다른 프로그램이 사용할 수 있도록 정리하는 과정을 가비지 콜렉션(Garbage Collection) 이라고 합니다.
- 이 작업을 수행하는 프로그램을 가비지 콜렉터(Garbage Collector, GC) 라고 합니다.
왜 가비지 콜렉터가 필요할까?
- 프로그램에서 더 이상 사용하지 않는 메모리가 있으면 자동으로 정리
- 메모리 누수(Memory Leak) 방지
- 프로그래머가 직접 메모리를 해제하지 않아도 됨 (편리함)
변수의 선언
변수를 선언(Declaration)한다는 것은 프로그램에서 사용할 변수를 정의하고, 메모리에 저장할 공간을 예약하는 과정입니다.
자료형 변수명 = 값;
int a = 5; // 정수형 변수 a 선언 및 초기화
- 자료형(Data Type): 변수에 저장될 데이터의 형식을 지정
- 변수명(Variable Name): 사용자가 원하는 이름으로 변수 지정 (규칙에 맞아야 함)
- 값(Value) [선택사항]: 변수 선언과 동시에 초기화할 값 (지정하지 않아도 가능)
변수 선언 예제 및 설명 정리 표
변수 선언 시 올바른 자료형을 사용하지 않으면 오류가 발생할 수 있습니다.
아래 표는 변수 선언 예제와 함께, 각 변수의 동작 방식과 오류 발생 이유를 정리한 것입니다.
올바른 변수 선언 예제
변수 선언 | 설명 |
int a = 10; | 정수형 변수 a를 선언하고 값 10을 저장 |
float pi = 3.14; | 실수형 변수 pi를 선언하고 값 3.14를 저장 |
char grade = 'A'; | 문자형 변수 grade를 선언하고 문자 'A'를 저장 |
double d = 1.23e-2; | 배정도 실수형 변수 d를 선언하고 값 1.23 × 10⁻²를 저장 |
short s = 32767; | short의 최대값(32767)까지 정상적으로 저장 가능 |
int num = '5'; | 문자 '5'를 저장하면 ASCII 코드 값(53) 으로 변환되어 저장됨 |
char ch = 100; | 정수 100을 저장하면 ASCII 코드 기준으로 'd' 로 해석됨 |
float f = 'A'; | 문자 'A'의 ASCII 코드 값(65.0)이 float로 저장됨 |
char str[] = "hello"; | 문자열 "hello"를 저장할 수 있는 char 배열 선언 |
잘못된 변수 선언 예제 및 수정 방법
잘못된 변수 선언 | 오류 설명 | 올바른 선언 |
short s = 32768; | short형은 최대값이 32767이라서 초과됨 | int s = 32768; |
int num = "5"; | 정수형 변수에 문자열을 저장할 수 없음 | char num = '5'; |
char ch = 10.5; | char는 정수형이므로 실수를 저장할 수 없음 | float ch = 10.5; |
float f = "3.14"; | float에는 문자열을 저장할 수 없음 | float f = 3.14; |
double d = "hello"; | double에는 문자열 저장 불가 | char str[] = "hello"; |
long long a = 1.5784E300L; | long long은 정수형이라서 실수 저장 불가 | long double a = 1.5784E300L; |
char a = 10; | char에 숫자를 저장하면 ASCII 문자로 해석됨 | int a = 10; |
- 변수 선언 시 자료형에 맞는 값을 저장해야 함
- char에는 반드시 한 글자의 문자만 저장 가능 ('A', '5' 등)
- 정수형(int, short)에는 실수를 저장할 수 없음
- 실수형(float, double)에는 문자열을 저장할 수 없음
- 문자열을 저장하려면 char 배열을 사용해야 함
출저 및 참고
정보처리 산업기사 기본서(시나공)