CSharp 변수

양승준·2025년 3월 26일

CSharp

목록 보기
3/20
post-thumbnail

변수


변수란 무엇일까? 변수는 학교 수학 시간에 들어봤을 것이다. 하지만 수학에서의 변수와 컴퓨터 프로그래밍적 변수는 같지만 다른 의미를 가지고 있다.

  • 수학적 변수 의미

    어떤 정해지지 않은 임의의 값을 표현하기 위해 사용된 '기호'이다. 또는 '변하는 숫자'

  • 컴퓨터 프로그래밍적 변수 의미

    특정 값을 저장하는 메모리 공간을 뜻한다.

위 와 같이 다른 의미를 가지고 있다. 그리고 이 글에서는 컴퓨터 프로그래밍적 변수의 의미를 사용한다고 이해 해주면 읽기 편할 것이다.

변수에는 어떤 값들을 담을 수 있을까?

변수에 담길 수 있는 값들은 여러가지가 존재한다. 그래서 프로그래밍직 변수에서는 그 것들의 형태를 몇가지로 정해서 자료형이라고 부른다.
자료형 아이콘

어떠한 변수의 형태들이 존재하는가?

byte, bool, char, short, int, float, double... 등등 의 형태들이 존재합니다. 이 타입들을 크게 나누라고 하면 값 타입참조 타입 으로 나눌 수 있다.

값 타입(Value Types)


값 타입 변수란, 값 자체를 저장하며, 스택에 저장되는 변수입니다. 또는 값을 복사하려고 하면 값 자체가 복사된다는 특징을 가지고 있다.

🔹 숫자형

자료형크기범위예시
byte1B0 ~ 255byte b = 100;
sbyte1B-128 ~ 127sbyte sb = -10;
short2B-32,768 ~ 32,767short s = 12345;
ushort2B0 ~ 65,535ushort us = 60000;
int4B약 ±21억int x = 1000;
uint4B0 ~ 약 42억uint ux = 3000000000;
long8B매우 큼long l = 9999999999;
ulong8B0 ~ 매우 큼ulong ul = 12345678901;
float4B소수점 7자리 정밀도float f = 3.14f;
double8B소수점 15~16자리double d = 3.14159265;
decimal16B금융 계산용 (고정소수점)decimal m = 1000.99m;

🔹 기타 기본 타입

자료형설명예시
char유니코드 문자 (1개)char c = 'A';
bool논리값 true/falsebool isReady = true;

🔹 열거형 & 구조체

자료형설명예시
enum열거형enum Day { Mon, Tue, ... }
struct구조체 (사용자 정의 값 타입)struct Point { int x, y; }



참조 타입(Reference Types)


참조 타입 변수란, 값 자체를 저장하는 것이 아닌 값이 저장된 곳의 주소를 가지고 있다. 또 복사 시 참조하는 주소만 복사가 된다는 특징을 가지고 있습니다.

🔹 문자열 & 객체

자료형설명예시
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 -> f
  • double -> d
  • decimal -> 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번의 수정으로 출력되는 것들을 편하게 수정을 했다.

profile
지모창말, 미모창.

0개의 댓글