CodeGym /행동 /C# SELF /상수와 var 키워드

상수와 var 키워드

C# SELF
레벨 10 , 레슨 1
사용 가능

1. 상수

상수는 "마법 같은" 변수야. 한 번 선언하면 값을 바꿀 수 없고(그리고 바꿀 필요도 없어!). 네 머그컵에 "오직 차만"이라고 적힌 초강력 스티커를 붙인다고 생각해봐. 그런 스티커를 붙이면 더 이상 차를 커피로 바꿀 수 없어(적어도 C# 안에서는 말이지).


const int DaysInWeek = 7;
const string HelloMessage = "환영합니다!";
상수 선언하기

이 예제에서 DaysInWeek는 항상 7이고, HelloMessage는 변하지 않는 환영 메시지야. 상수의 값이 한 번 정해지면, 그 뒤로는 절대 바꿀 수 없어.

상수가 왜 필요할까?

  • 코드의 명확성: const double Pi = 3.14159;를 보면, 이게 누가 중간에 바꿀 수 있는 변수가 아니라 상수라는 걸 바로 알 수 있지.
  • 안전성: 아무도(심지어 몇 달 뒤의 너 자신도) 실수로 상수 값을 덮어쓸 수 없어.
  • 성능: C# 컴파일러가 상수 값을 코드에 직접 박아넣기 때문에 프로그램이 약간 더 빨라져.

선언 문법


const 타입 이름 = ;
상수 선언 문법
  • 타입 — 아무 primitive 타입(int, double, string, char, 그리고 enum, literal 등) 가능.
  • 이름CamelCasePascalCase 스타일을 주로 써. "매직" 상수는 가끔 대문자+언더스코어(DAYS_IN_WEEK)로 쓰기도 하는데, C#에서는 필수는 아냐.

예시:

const double GRAVITY = 9.81; // 자유 낙하 가속도, m/s^2
const char DELIMITER = ',';
const string DEVELOPER_NAME = "이반 페트로프";

상수의 특징과 제한

  • 값이 컴파일 타임에 정해져야 해. 즉, 프로그램 실행 중에 계산되는 값으로는 상수를 선언할 수 없어.
const int NowYear = DateTime.Now.Year; // 컴파일 에러!
  • 간단한 타입, string 또는 enum만 쓸 수 있어.
  • 배열, 객체, 메서드 호출 결과 등은 상수로 못 만들어.
  • 수학적으로 "간단해 보여도" 컴파일러가 계산할 수 없는 건 안 돼.

예를 들어, 이렇게는 안 돼:

const string FullGreeting = "안녕, " + userName; // userName은 변수라서 이렇게 못 써!

이렇게는 가능하고, 권장돼:

const string DefaultGreeting = "안녕, 사용자!";

상수는 주로 어디에 선언할까?

  • 클래스(혹은 파일) 맨 위, 메서드 위에.
  • 상수만 모아둔 전용 클래스(예: public static class Constants)에.
  • 클래스 레벨에, 그 클래스에만 관련된 상수라면.

우리 콘솔 앱 예시:

class Program
{
    const string Welcome = "우리 앱에 오신 걸 환영합니다!";
    static void Main(string[] args)
    {
        Console.WriteLine(Welcome);
    }
}

상수와 스코프(범위)

상수도 일반 변수처럼 스코프 규칙을 따라. 선언된 범위 안에서만 보여.

2. var 키워드

var 키워드는 새로운 변수 타입이 아니라, 컴파일러가 변수 타입을 자동으로 추론하게 해주는 편리한 방법이야.

이건 그냥 문법 설탕(syntax sugar)이야. 진짜 마법은 없고, 컴파일 후에는 평범한 타입이 돼.


var age = 23;      // 컴파일러가 age는 int라고 알아서 판단
var name = "안나"; // 컴파일러가 string이라고 판단
var price = 99.99; // 컴파일러가 double이라고 판단
var로 타입 추론하기

var가 왜 생겼을까?

  • 가독성: Dictionary<string, List<int>> 같은 긴 타입을 굳이 안 써도 돼.
  • 유연성: 오른쪽만 바꿔도 타입이 자동으로 맞춰져서, 타입 바꿀 때 편해.
  • 현대적 스타일: 요즘 C# 프로젝트는 타입이 명확할 때 var를 거의 다 써.

var를 언제(그리고 왜) 써야 할까?

  • 오른쪽만 봐도 변수 타입이 뭔지 확실할 때.
  • 타입이 명확할 때(var price = 100; — int라는 게 뻔하지).
  • 타입이 너무 길거나 복잡할 때(LINQ 결과 등).
var numbers = new int[] { 1, 2, 3, 4 };
var input = Console.ReadLine(); // input은 string(메서드가 string 반환)

var를 안 쓰는 게 나을 때

오른쪽만 봐서는 타입이 뭔지 감이 안 오면, 코드가 헷갈릴 수 있어. 한 달 뒤에 동료랑 봐도 무슨 타입인지 모를 것 같으면, 그냥 타입을 명시하는 게 좋아.

var mystery = DoSomethingVeryComplicated(); // 넌 누구냐, mystery???

여기선 타입을 명확히 쓰는 게 좋아:

string result = DoSomethingVeryComplicated();

황금률: var는 가독성을 해치지 않을 때만 쓰자!

var는 로컬 변수에서만!

var는 메서드 안에서만 쓸 수 있어. 아래에는 못 써:

  • 메서드 파라미터;
  • 클래스 프로퍼티;
  • 상수.

var가 "속에서" 어떻게 동작하는지

  • C# 컴파일러가 컴파일할 때 실제 타입으로 바꿔줘.
  • 컴파일 후엔 var라는 건 남지 않아.
  • 성능 손해 없음: 그냥 개발자 편의용이야.
var year = 2025; // 컴파일 타임에: int year = 2025;로 바뀜

var 쓸 때 흔한 실수

  • 초기화 안 한 변수:
var a; // 에러: 타입을 추론할 수 없어!
  • 애매한 초기화:
var list = null; // 에러: null 타입은 정해지지 않아!
  • 다른 타입으로 변수 재사용:
var value = 5; // value는 int
value = "다섯"; // 에러: value는 이미 int야!

비교: 명시적 타입 vs var

상황 명시적 타입 var
타입이 명확할 때
int age = 42;
var age = 42;
메서드가 복잡한 타입 반환
Dictionary<int, string> dict = SomeFunc();
var dict = SomeFunc();
배열
string[] names = ...
var names = ...
팁:

요즘 프로젝트에서는 로컬 변수엔 var를 거의 다 써. 파라미터, 프로퍼티, 상수에는 명시적 타입만 써.

3. 함정과 팁

C#에서는 종종 코드에 매직 넘버("7", "3.14159", "0.15" 등등)를 그냥 박아넣는 경우가 많아. 이건 별로야: 만약 값이 바뀌면 프로젝트 전체에서 다 찾아서 바꿔야 하거든. 상수를 쓰자! 너도 편하고, 동료들도 고마워할 거야...

var는 반대 극단이야: 코드 전체가 var로만 도배되어 있고, 타입이 뭔지 하나도 안 보이면 금방 헷갈려. 그러니까 var는 논리적이고 명확할 때만 쓰고, 나머지는 타입을 명시하는 걸 두려워하지 마!

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION