변수란 무엇일까? 변수는 학교 수학 시간에 들어봤을 것이다. 하지만 수학에서의 변수와 컴퓨터 프로그래밍적 변수는 같지만 다른 의미를 가지고 있다.
수학적 변수 의미
어떤 정해지지 않은 임의의 값을 표현하기 위해 사용된 '기호'이다. 또는 '변하는 숫자'
컴퓨터 프로그래밍적 변수 의미
특정 값을 저장하는 메모리 공간을 뜻한다.
위 와 같이 다른 의미를 가지고 있다. 그리고 이 글에서는 컴퓨터 프로그래밍적 변수의 의미를 사용한다고 이해 해주면 읽기 편할 것이다.
변수에 담길 수 있는 값들은 여러가지가 존재한다. 그래서 프로그래밍직 변수에서는 그 것들의 형태를 몇가지로 정해서 자료형이라고 부른다.

byte, bool, char, short, int, float, double... 등등 의 형태들이 존재합니다. 이 타입들을 크게 나누라고 하면 값 타입 과 참조 타입 으로 나눌 수 있다.
값 타입 변수란, 값 자체를 저장하며, 스택에 저장되는 변수입니다. 또는 값을 복사하려고 하면 값 자체가 복사된다는 특징을 가지고 있다.
| 자료형 | 크기 | 범위 | 예시 |
|---|---|---|---|
byte | 1B | 0 ~ 255 | byte b = 100; |
sbyte | 1B | -128 ~ 127 | sbyte sb = -10; |
short | 2B | -32,768 ~ 32,767 | short s = 12345; |
ushort | 2B | 0 ~ 65,535 | ushort us = 60000; |
int | 4B | 약 ±21억 | int x = 1000; |
uint | 4B | 0 ~ 약 42억 | uint ux = 3000000000; |
long | 8B | 매우 큼 | long l = 9999999999; |
ulong | 8B | 0 ~ 매우 큼 | ulong ul = 12345678901; |
float | 4B | 소수점 7자리 정밀도 | float f = 3.14f; |
double | 8B | 소수점 15~16자리 | double d = 3.14159265; |
decimal | 16B | 금융 계산용 (고정소수점) | decimal m = 1000.99m; |
| 자료형 | 설명 | 예시 |
|---|---|---|
char | 유니코드 문자 (1개) | char c = 'A'; |
bool | 논리값 true/false | bool isReady = true; |
| 자료형 | 설명 | 예시 |
|---|---|---|
enum | 열거형 | enum Day { Mon, Tue, ... } |
struct | 구조체 (사용자 정의 값 타입) | struct Point { int x, y; } |
참조 타입 변수란, 값 자체를 저장하는 것이 아닌 값이 저장된 곳의 주소를 가지고 있다. 또 복사 시 참조하는 주소만 복사가 된다는 특징을 가지고 있습니다.
| 자료형 | 설명 | 예시 |
|---|---|---|
string | 문자열 (immutable) | string s = "Hello"; |
object | 모든 타입의 최상위 부모 | object o = 5; |
| 자료형 | 설명 | 예시 |
|---|---|---|
class | 사용자 정의 참조형 | class Dog { ... } |
interface | 동작 규약 정의 | interface IDrawable { void Draw(); } |
delegate | 메서드 참조 타입 | delegate void MyHandler(); |
array | 배열 타입 | int[] arr = new int[5]; |
사용 방법을 정리하는 이유는 간단하다. 표로만 작성해 놓으면 작성자는 편하다. 하지만 만약 누군가가 보거나, 또는 내가 이 글은 보는 사람 되었다고 했을 때 사용 방법이 있으면 이해할 때 도움이 될 것이라고 생각하여 정리하는 것이다.
값 타입의 사용은 내가 담아줄 정보의 형태가 무엇인지 생각하고 그 형태에 맞는 자료형을 선정하여 변수를 선언해 주는 것이다. 수학에서도 비슷하다. f(x)에서 x 가 무엇인지 대입 시켜서 식을 풀어 나간다. 아래 코드에서는 integerNum 이라는 변수에 10이라는 값을 넣어주는 단순한 코드다.
namespace ValueTypeVariable
{
internal class Program
{
static void Main(string[] args)
{
// 넣을 값 10의 정수 숫자
// 정수 숫자는 byte, sbyte, short, ushort, int, uint...
// 그럼. 내가 이 변수에 넣어줄 값의 범위 선정 후. 자료형 선언(평균적으로는 int 사용)
// 정수 숫사 > int, 이름 지정, 값 넣기
int integerNum = 10;
}
}
}
이런 식으로 값을 변수에 담는 다는 행동을 수행하는 것이다. 그렇다면 이 것을 자리표시자를 사용하여 출력하면 어떻게 될까? 에초에 자리표시자 자리에 변수가 들어 갈 수 있을까?
정답은 True(진실 or 답)다. 그렇다면 어떤 식으로 활용될까?
namespace ValueTypeVariable
{
internal class Program
{
static void Main(string[] args)
{
int integerNum = 10;
Console.WriteLine("integerNum은 {0}입니다.", integerNum);
// 같은 기능
// Console.WriteLine("integerNum은 {0}입니다.", 10);
}
}
}
integerNum은 10입니다.
위 와 같이 자리표시자 0 위치에 ,를 사용하고 변수를 넣어주었더니, 해당 자리에 10이 들어간 것과 같은 효과를 내고 있다. 그럼 아래와 같은 응용이 가능해질 것이다.
namespace ValueTypeVariable
{
internal class Program
{
static void Main(string[] args)
{
int integerNum = 10;
Console.WriteLine("{0} x {0} = {1}", integerNum, integerNum * integerNum);
// 같은 기능
// Console.WriteLine("{0} x {0} = {1}", 10, 10 * 10);
}
}
}
10 x 10 = 100
여기에서 * 은 곱하기 연산자이다.
이러한 식으로 작성했을 때, 이점은 무엇일까?
전에는 자리표시자 위치에 맞는 값들을 하나하나 수정을 해야됐다면 변수가 사용해진 지금은 integerNum 의 값만 수정해도 전체가 수정되는 효과를 볼 수 있다. 그래서 나는 한 곳만의 수정으로 많은 곳에게 영향이 간다. 는게 변수의 이점이라고 생각한다.
간단한 사용 방법을 알았으니까. 여러 상황도 한번 보겠다.
namespace ValueTypeVariable
{
internal class Program
{
static void Main(string[] args)
{
// Multiplication table(구구단, 더 정확히는 곱셈표)
int danNum = 2;
Console.WriteLine("{0} x 1 = {1}", danNum, danNum * 1); // 1
Console.WriteLine("{0} x 2 = {1}", danNum, danNum * 2); // 2
Console.WriteLine("{0} x 3 = {1}", danNum, danNum * 3); // 3
Console.WriteLine("{0} x 4 = {1}", danNum, danNum * 4); // 4
Console.WriteLine("{0} x 5 = {1}", danNum, danNum * 5); // 5
Console.WriteLine("{0} x 6 = {1}", danNum, danNum * 6); // 6
Console.WriteLine("{0} x 7 = {1}", danNum, danNum * 7); // 7
Console.WriteLine("{0} x 8 = {1}", danNum, danNum * 8); // 8
Console.WriteLine("{0} x 9 = {1}", danNum, danNum * 9); // 9
}
}
}
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
위와 같이 구구단이 알맞게 출력이 되었다. 하지만 변수를 사용 하지 않았다면? 구구단에 단에 해당하는게 18번 쓰였으니까, 단 있는 곳의 값들을 변경하려면 18번의 수정 작업을 해야된다. 이러한 반복 작업을 변수는 대신해준다.
이와 같이 사용할 수 있고, 이제는 더 많은 값 형식의 보겠다.
namespace ValueTypeVariable
{
internal class Program
{
static void Main(string[] args)
{
// 🔹 1바이트 정수형
byte byteNum = 255; // 0 ~ 255
sbyte signedByteNum = -128; // -128 ~ 127
// 🔹 2바이트 정수형
short shortNum = -32768; // -32,768 ~ 32,767
ushort unsignedShortNum = 65535; // 0 ~ 65,535
// 🔹 4바이트 정수형
int integerNum = -2147483648; // -2,147,483,648 ~ 2,147,483,647
uint unsignedIntegerNum = 4294967295; // 0 ~ 4,294,967,295
// 🔹 8바이트 정수형
long longNum = -9223372036854775808; // -9경 ~ 9경
ulong unsignedLongNum = 18446744073709551615; // 0 ~ 18경
// 🔹 실수형
float floatNum = 3.1415927f; // 단정도 (소수점 7자리, 접미사 f 필수)
double doubleNum = 3.14159265358979; // 배정도 (소수점 15~16자리)
decimal decimalNum = 79228162514264337593543950335m; // 고정 소수점 (소수점 28~29자리, 접미사 m 필수)
// 🔹 기타
char character = 'A'; // 문자 (유니코드 1글자)
bool isTrue = true; // 논리값 true/false
// 구조체, 열거형 생략...
}
}
}
여기서 조심해야 될 것들은 실수형에만 있는 접미사이다. 접미사가 사용되는 자료형은 float, double, decimal 이다. 이들은 특이하게 접미사가 붙는다.
float -> fdouble -> ddecimal -> m그런데, double 은 위에 코드에서 왜 생략된걸일까? 그 이유는 실수형 숫자를 기입하면 기본적으로 double로 처리를 하기 때문이다. 그렇기 때문에 아래와 같이 작성하면 넣어주려는 값의 자료형이 알맞지 않아서 오류를 내는 것이다.
float floatNum = 12.12; // Error!! CS0664
CS0664:
double형식의 리터럴은 암묵적으로float형식으로 변환될 수 없습니다. 이 형식의 리터럴을 생성하려면 'F' 접미사를 사용하세요
float floatNum = 12.12f; // Clear!!
참조 타입은 보통 string, class 등등을 생각합니다. 하지만 여기에서는 string 만 다루겠다.
참조 타입의 string 은 어떻게 사용할까? 전 포스팅을 봤다면 이러한 코드를 본적 있을 것이다.
namespace ValueTypeVariable
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("{0} {1}!", "Hello", "World"); // 2
Console.WriteLine("{0} {0}!", "Hello", "World"); // 3
Console.WriteLine("{1} {1}!", "Hello", "World"); // 4
}
}
}
Hello World!
Hello Hello!
World World!
위와 같이 사용했는데 이 것을 string 변수를 사용해서 처리한다면?
namespace ValueTypeVariable
{
internal class Program
{
static void Main(string[] args)
{
string helloStr = "안녕";
string worldStr = "세상아";
Console.WriteLine("{0} {1}!", helloStr, worldStr);
Console.WriteLine("{0} {0}!", helloStr, worldStr);
Console.WriteLine("{1} {1}!", helloStr, worldStr);
}
}
}
안녕 세상아!
안녕 안녕!
세상아 세상아!
이와 같이 반복헤서 수정할 수 있는 것들 변수에 담아 연결해줘. 2번의 수정으로 출력되는 것들을 편하게 수정을 했다.