반응형
  구조체랑 상수, 열겨형에 대해 좀 살펴보자.

  구조체는 전에도 잠시 나왔지만, 클래스 비슷한 녀석인데 값타입의 특성을 녀석인거 기억나지? 좀 정리해 보면, 
"하나의 데이터 타입에 2개 이상의 변수를 담을 수 있는 사용자 정의 데이터 타입으로 값타입의 특성을 갖는다" 뭐 이정도면 얼추 될것 같다.

  그런데 이 구조체는 C/C++과는 약간의 차이점이 나타난다.
우선 c/c++

struct sSample
{
     sSample();
     sSample(int a);

     int a;
};

sSample ss;
sSampe ss(1);

모두 가능하지만,

C# 에서는
struct sSample2
{
    sSample2();
    sSample2(int a);
    
    int a;
};

하면 안된다.. 매개 변수가 없는 기본 생성자는 정의할 수 없게 되어 있다.. 즉,
struct sSample2
{
    sSample2(int a);
    
    int a;
};

위와 같이 하여야 한다. 이런 경우
sSample2 ss2;
하면 매개 변수가 없는 기본 생성자가 동작하게 되고, 매개 변수가 있는 생성자를 사용하기 위해선

sSample2 ss2 = sSample2(1);
과 같이 사용해야 한다.. 비록 new를 사용했지만, 값타입이다.

다음으로 const와 readonly키워드가 붙은 상수에 대해 알아보자.
const는 말 그대로 상수다. 

const int a = 4; 

라고 하는 순간 a는 4라는 상수가 되어 버린다..손도 못덴다.. 상수니까.. 게다가 const가 붙으면 static 속성을 갖게 된다. 인스턴스가 생성 안된 상태에서도 사용 가능하단 소리다.

!!! 생성과 동시에 초기화 해줘야 한다..

const int a;
a = 4; 

어림 반푼어치도 없는 짓이다..

반면 readonly는 const와 많이 비슷하지만, 결정적인 차이가 있다.. 우선 static키워드와 조합하여 사용할 수 있다. 즉, static속성을 안줄수도 있다는 이야기다. 그리고 const는 컴파일시 값이 결정되어 있어야 하지만, readonly는 런타임시 값이 결정된다는 차이점이 있다.. 둘다 값이 한번 결정되면 변경 불가란점은 동일하다.

예를 들어서 

public int function()
{
    return 100;
}
이 있다고 했을때,

const int a = function();
는 어림 반품어치도 없는 짓이되지만,

readonly int a = function();
는 가능하다는 소리다.

C/C++에서는 #define이나 const를 사용해서 상수를 정의해 사용했지만, readonly와 같은 기능을 하는 것은 없었던것 같다.. 가끔 어플 개발을 하다보면, 특정 동작이후 리턴되는 값을 상수화 시켜 사용하고 싶은 경우가 있었는데, 그런 경우 참 쓸만한 녀석인것 같다.

다음은 열거형 'enum' 키워드다.. 이놈? 이넘? 암튼 enumeration의 앞에 4글자만 떼서 사용하는 거다.. 어렵게 생각할 필요없이 값을 쫙 열거해 주는 거다..

예를 들어서 철수는 1번, 영희는 2번, 광수는 3번, 영수는 4번, 순자는 5번이라고 해보자.. 
가장 단순 무식한 방법으로
int 철수 = 1;
int 영희 = 2;
...
int 순자 = 5;
로 정의하는 방법이 있겠다. 하지만, 이런 경우 불편한 점들이 나타나기 시작한다.. 대표적인 예로 switch~case문이다..
위와 같은 경우에 switch ~ case를 쓰려면

switch(num)
{
   case 1 : // 철수
      break;
   ....
   case 5 : // 순자
     break;
}

와 같이 주석으로 표시하지 않으면 하나씩 되짚어봐야 한다.

하지만, enum을 사용하게 되면

enum Num{철수, 영희, 광수, ..., 순자};

...
switch(num)
{
    case Num.철수:
      break;
    ....
    case Num.순자:
      break;
}

와 같이 처리할 수 있다.. 어떻게 보면 상수 정의를 나열해 주는 효과라고도 할 수 있겠다. 아무런 표기를 하지 않으면 0부터 1씩 증가한다. 만약 '광수'부터는 4부터 시작해야 한다면,

enum Num{철수, 영희, 광수 = 4, ..., 순자};

와 같이 하면 된다.
반응형

+ Recent posts