22.12.28. (수) 상수, 열거형

김도익·2022년 12월 28일
0

C#

목록 보기
11/29

<22.12.28. (수) - 상수>

▶변수와 상수

  • 변수를 사용하면 값을 변경할 수 있습니다.
    int a = 10;
    a = 11; // 정상

  • 상수를 사용하면 값을 변경할 수 없습니다.
    const int b = 10;
    b = 15; // 오류

▶ 기호 상수

  • 상수는 데이터가 변경되는 것을 막고자 할 때 사용하면 되는데, 많이 쓴는 사례가 바로 기호 상수(symbolic Constant)입니다.

  • 어떤 의미를 가지는지 모르는 값을 마법의 숫자라고 하며 코드의 가독성을 매우 떨어뜨립니다. 따라서 되도록 마법의 숫자 대신 이름을 붙여 가독성을 높이도록 합니다. 이를 상수에 이름을 붙였다 하여 기호 상수라고 합니다.

▶const

  • 키워드 중에 '한정자'가 있습니다. 한정자를 붙이면 기능에 제한이 생깁니다. 상수를 만들때 사용하는 한정자는 const입니다.

  • const는 객체에만 사용할 수 있으며 타입 전에 붙이면 된다.
    const int kimdoikBirthday = 0516;

  • int kimdoikAge = 26;
    const int kimdoikAgeNextYear = kimdoikAge; // 오류입니다.
    const는 오직 상수만 가능합니다.

  • 상수식이 가능한 경우는 수, 문자열, 불리언, 널 이 있습니다.
    const int kimdoikBirthday = 0516;
    const stirng kimdoikname = "kimdoik"

▶열거형(enum)

  • 관련 있는 여러 기호 상수를 묶기 위한, 그룹화 시키는 도구입니다.

    const int DIRECTION_LEFT = 1; 
    const int DIRECTION_RIGHT = 2; 
    const int DIRECTION_UP = 3; 
    const int DIRECTION_DOWN = 4; 
    int playerDirection;
    
    playerDirection = DIRECTION_LEFT
    playerDirection = DIRECTION_RIGHT
    playerDirection = DIRECTION_UP
    playerDirection = DIRECTION_DOWN

    // 이렇게 저장되어 있는 기호상수를 enum으로 묶으면 편합니다.
    // 아래 예시를 보면 이해가 쏵 됩니다.

  • 열거형도 타입이기 때문에 객체의 타입으로 지정할 수 있습니다.
    예를 들어 범용적인 의미를 가진 int 대신 Direction이라는 타입으로 지정하면서 좀 더 구체적으로 데이터를 나타낼 수 있고, 저장할 수 있는 데이터가 정해져 있기 때문에 오류가 줄어듭니다.

    	enum Direction
    	{
    	  None,
    	  Left,
    	  Right,
    	  Up,
    	  Down
    	}
    
    	static void Main(){
    	Direction playerDirection = Direction.None;
    	}

TIP
enum은 타입입니다!! 무턱대고 비슷한 기호 상수가 있다고 묶는다면 오히려 가독성을 떨어뜨릴 수 있습니다.
타입은 int a = 10;에서 int가 타입입니다.
위에서 Direction playerDirection = Direction.None;에서 Direction은 enum의 타입입니다.
enum은 타입이라는 점을 절대 잊어선 안됩니다!!

  • 문법

    1. 내부 멤버의 값을 지정해주지 않으면 자동적으로 정해집니다.
      첫번째 멤버는 자동으로 0이 되고 다음 멤버는 +1 추가됩니다.

      		enum Color 
      		  { 
      			Red, // 첫 번째 멤버는 0이다. 
      			Green, // 두 번째 멤버부터는 이전 멤버의 값 + 1이다. 
      			Blue 
      				}
    2. 각 멤버마다 값을 따로 저장할 수 있습니다.

    3. 멤버 타입과의 변환이 가능합니다.
      암시적 변환이 불가능합니다.
      int playerDirection = (int)Direction.Left;
      만약 Limit.Map_Max_X가 byte형식으로 변환이 불가능하다. 라는 오류 메시지를 보면 (int)Limit.Map_Max_X으로 써주면 사용 가능하다.

▶비트 플래그

  • 어떤 비트가 1일 때의 의미를 나타내기 위한 상수의 모음을 비트 플래그라고 합니다.

  • 열거형으로 비트 플래그를 표현할 수 있습니다.

    		[Flags] // 이건 Attribute인데, 나중에 배운다. 
    		enum Days 
    		{ 
    			None = 0b_0000_0000, // 0 
    			Monday = 0b_0000_0001, // 1 
    			Tuesday = 0b_0000_0010, // 2 
    			Wednesday = 0b_0000_0100, // 4 
    			Thursday = 0b_0000_1000, // 8 
    			Friday = 0b_0001_0000, // 16 
    			Saturday = 0b_0010_0000, // 32 
    			Sunday = 0b_0100_0000, // 64 
    			Weekend = Saturday | Sunday, 
    			WeekDays = Monday | Tuesday | Wednesday | Thursday | Friday 
    		}

TIP
프로그래밍 언어 : 컴퓨터가 아닌 사람이 아닌 사람이 알아듣는 언어
Build : 프로그램을 만드는 과정. Build는 여러과정으로 나뉘는데 그 과정중 하나는 컴파일도 있다.

profile
고급 개발자가 되고 싶어요!

0개의 댓글