08 상수

김민영·2023년 1월 5일
1

C# 기초 프로그래밍

목록 보기
7/18

⛳ 상수란

1. 변수와 상수

1) 변수(Variable): 값을 수정할 수 있는 객체
2) 상수(Constant): 값을 수정할 수 없는 객체

  • 상수의 값은 컴파일러에 의해 수정이 방지되기 때문에 수정을 시도할 시 컴파일 오류가 발생합니다.

  • 따라서 프로그램 실행 중 데이터가 변하면 안되는 경우 상수로 데이터를 저장합니다.

2. 상수의 선언

1) const

  • 상수를 선언하기 위해 사용하는 키워드
  • 기능을 제한하는 한정자 (modifier, 키워드의 일종)
  • 사용 방식
const int constantNumber = 0;

2) 상수식

  • 상수는 컴파일 타임에 평가가 이루어집니다.
  • 즉, 컴파일을 할 때 상수에 대입하려는 식의 계산이 이루어집니다. 따라서 컴파일 타임에 완전히 평가할 수 있는 식만이 상수식이 될 수 있습니다.

3) 상수식이 될 수 없는 예시

  • 변수를 상수에 대입하려는 경우

    → 변수는 런타임에 확정되는 값이기에, 컴파일 타임에 값을 알 수 없습니다.



→ 이와 같이 변수는 프로그램 상황에 따라 변경될 수 있는(런타임에 계산되는) 수이기 때문입니다.


→ 사람의 눈에는 변수에 저장하려는 10이라는 수가 확정된 수로 보이지만, 상수와 변수의 컴파일 방식 자체가 다르기 때문에 변수를 상수에 대입하는 것이 불가합니다.

4) 상수식이 될 수 있는 예시

  • 컴파일러가 할 수 있는 간단한 연산

    → num7과 같은 간단한 연산은 컴파일 수준에서 가능하기에 상수로 저장할 수 있다.
    → num8 또한 컴파일 타임에 계산 가능한 수를 대입하는 것이기에 가능합니다.

  • 숫자, 문자열, boolean, null

const int SPEED_OF_LIGHT = 299792458; // 수
const string WELCOME_MESSAGE = "Greetings!"; // 문자열
const bool IS_WINDOWS = true; // 불리언
const string NULL_OBJECT = null; // 널

→ 숫자뿐만 아니라 문자열, boolean, null 또한 상수로 사용할 수 있습니다.

3. 기호 상수 (Symbolic Constant)

▶ 마법의 숫자 (Magic Number)


1) 위와 같이 무엇을 의미하는지 명확하지 않은 데이터를 의미
2) 매직넘버는 코드를 보는 사람에 따라 해석이 달라질 수 있음
3) 매직넘버를 사용하는 것도 하드코딩의 일종으로, 매직넘버를 발견하고 그를 적절히 기호상수로 바꿀 수 있어야 함

▶ 기호 상수


1) 상수에 이름을 붙여 명확히 어떤 의미의 데이터인지 표시한 것
2) 예시의 상수로 저장된 수가 빛의 속도라는 것을 명확히 표시할 수 있음
3) 매직 넘버의 예시와 같은 수이지만, 코드를 확인하는 사람들이 다른 의미로 해석할 확률을 줄일 수 있음


⛳ 열거형

1. 열거형이란

1) 관련있는 여러 기호 상수를 묶는 타입
2) 범용적인 int 등의 타입 대신 열거형(그룹)의 이름으로 관리하기에 코드의 가독성을 높이고, 구체적으로 데이터를 나타낼 수 있음
3) 저장할 수 있는 데이터가 한정되어 있기에 오류가 감소

2. 열거형의 선언

enum 그룹의 이름
{
	// 그룹의 멤버
}

1) 멤버의 타입은 기본적으로 정수(int)

  • 사용하는 경우는 드물지만 변경할 수 있음
  • 따라서 기본적으로 열거형의 객체는 4byte
  • 멤버의 타입을 의도적으로 ushort로 변경한 예시

    → 이 경우 열거형 객체의 크기는 2byte
    → int로 사용하고 싶은 경우, 위의 예시에서 ushort를 생략하고 기본형식으로 선언

2) 멤버의 값

  • 멤버의 값을 지정하지 않으면 첫번째 멤버가 0, 그 이후는 (이전 멤버 + 1)이 됨

  • 값을 직접 지정할 수도 있음

    → 이 경우 지정하지 않은 값은 (이전 멤버 + 1)

3. 열거형의 사용


1) 멤버의 값을 int로 사용하기

  • Direction.LEFT는 Direction 타입이기에 int 타입의 변수에 바로 대입할 수 없다. (암시적 변환 불가)
  • (int)를 이용해 캐스팅하여 멤버의 값을 int 타입에 대입하여 사용할 수 있다.

2) int를 이용해 열거형 객체의 멤버 사용하기

  • (열거형의 이름)을 이용해 캐스팅하여 열거형 객체의 멤버를 사용할 수 있다.

4. 비트플래그

1) 특정 비트가 1일 때의 의미를 나타내기 위한 상수의 모음

  • 즉, 비트 하나 당 의미를 부여하여 사용

  • 멤버의 값인 이진수와 같은 형태를 사용하는 것보다 Monday 등을 사용하여 가독성 향상

2) 논리연산으로 다른 멤버를 선언할 수 있음

  • Saturday | Sunday 가 Weekend 라는 의미를 정의

0개의 댓글