글수 69
안녕하세요? 고슴도치입니다.
간만에 글 쓰네요..ㅋㅋ
C++은 타입을 값으로 쓸 수가 없기 때문에 타입을 이용한 로직 처리가 힘들었지요.. 이와 다르게 C#은 타입도 데이터로 처리가 가능해서 이를 이용해서 편리하게 코딩이 가능합니다.. 그 중 한가지를 소개할까 하는데요.. 우선 아래의 코드를 봅시다..
[code]
enum Cent
{
Penny = 1, Nickel = 5, Dime = 10, Quarter = 25, Dollar = 100
};
[/code]
아래와 같은 출력값도 한 번 살펴봅시다.
[code]
Peny = 1
Nickel = 5
Dime = 10
Quarter = 25
Dollar = 100
[/code]
위 코드는 C++에서도 C#에서도 잘 작동합니다. (단, C#에서는 마지막에 있는 세미콜론이 없어야겠죠.)
C++에서 위와 같은 결과값을 출력하려면 어떤 방법이 가장 쉬울까요?
간단히 생각하면 '하드코딩'만 떠오릅니다..=_ =;
저의 경우에는 C++에서 위처럼 출력하고 싶을 때에는 enum을 감싼 클래스를 대충 하나 만들곤 합니다.
(예외처리도 무시하고 몇 가지 기능이 생략된 코드입니다.)
[code]
class Cent
{
public:
enum _type
{
Penny = 1, Nickel = 5, Dime = 10, Quarter = 25, Dollar = 100
};
private:
_type value_;
public:
Cent() : value_(Penny) {}
Cent(const Cent& _2) : value_(_2.value_) {}
Cent(const Cent::_type& _2) : value_(_2) {}
Cent(int _2) { value_ = (_type)_2; }
int ToInt() const
{
return (int)value_;
}
std::string ToString() const
{
switch (value_)
{
case Penny: return "Penny";
case Nickel: return "Nickel";
case Dime: return "Dime";
case Quarter: return "Quarter";
case Dollar: return "Dollar";
default: return "";
}
}
static Cent GetCent(int index) const
{
switch (index)
{
case 0: return Penny;
case 1: return Nickel;
case 2: return Dime;
case 3: return Quarter;
case 4: return Dollar;
}
return Penny;
}
static int GetSize() const
{
return 5;
}
};
[/code]
위처럼 만들고..
[code]
void main()
{
for (int i = 0; i < Cent::GetSize(); i++)
{
Cent cent = Cent::GetCent(i);
cout << cent.ToString() << "\t= " << cent.ToInt() << endl;
}
}
[/code]
이런식으로 출력하지요..
C++에서는 열거형을 출력하기 위해서 하드코딩된 '무언가'를 만들지 않으면 안됩니다.. 위의 예제에서만 봐도 열거형에 새로운 데이터를 하나 추가하면 Cent::ToString(), Cent::GetCent(), Cent::GetSize()도 수정해줘야 하는 수고를 해야만 하지요.. '하드코딩'이니까요..
-----------------------------------------------
그럼 C#에서는 이를 어떻게 하는지 한번 봅시다..
C#에는 Enum이라는 클래스가 있습니다. 이 클래스의 역할은 enum 타입을 받아서 값을 열거하거나 값의 이름을 열거해주는 역할을 합니다. 즉, 위 C++ 코드에서 제가 하드코딩으로 만든 클래스의 역할을 해주는 것이지요..
바로 C# 코드를 봅시다.
[code]
namespace CentExample
{
class CentExample
{
enum Cent
{
Penny = 1, Nickel = 5, Dime = 10, Quarter = 25, Dollar = 100
}
static void Main(object[] args)
{
// Cent의 값목록을 배열로 받아옵니다.
Cent[] centValues = Enum.GetValues(typeof(Cent));
// 목록을 루프로 돌면서 하나씩 출력합니다.
foreach (Cent cent in centValues)
{
Console.WriteLine("{0}\t= {1}", cent.ToString(), (int)cent);
}
}
}
}
[/code]
아주 간단해지죠?
앞으로 C#에서 열거형을 쓸때에는 Enum 클래스를 적극 활용하시길 바랍니다..^ㅡ^
간만에 글 쓰네요..ㅋㅋ
C++은 타입을 값으로 쓸 수가 없기 때문에 타입을 이용한 로직 처리가 힘들었지요.. 이와 다르게 C#은 타입도 데이터로 처리가 가능해서 이를 이용해서 편리하게 코딩이 가능합니다.. 그 중 한가지를 소개할까 하는데요.. 우선 아래의 코드를 봅시다..
[code]
enum Cent
{
Penny = 1, Nickel = 5, Dime = 10, Quarter = 25, Dollar = 100
};
[/code]
아래와 같은 출력값도 한 번 살펴봅시다.
[code]
Peny = 1
Nickel = 5
Dime = 10
Quarter = 25
Dollar = 100
[/code]
위 코드는 C++에서도 C#에서도 잘 작동합니다. (단, C#에서는 마지막에 있는 세미콜론이 없어야겠죠.)
C++에서 위와 같은 결과값을 출력하려면 어떤 방법이 가장 쉬울까요?
간단히 생각하면 '하드코딩'만 떠오릅니다..=_ =;
저의 경우에는 C++에서 위처럼 출력하고 싶을 때에는 enum을 감싼 클래스를 대충 하나 만들곤 합니다.
(예외처리도 무시하고 몇 가지 기능이 생략된 코드입니다.)
[code]
class Cent
{
public:
enum _type
{
Penny = 1, Nickel = 5, Dime = 10, Quarter = 25, Dollar = 100
};
private:
_type value_;
public:
Cent() : value_(Penny) {}
Cent(const Cent& _2) : value_(_2.value_) {}
Cent(const Cent::_type& _2) : value_(_2) {}
Cent(int _2) { value_ = (_type)_2; }
int ToInt() const
{
return (int)value_;
}
std::string ToString() const
{
switch (value_)
{
case Penny: return "Penny";
case Nickel: return "Nickel";
case Dime: return "Dime";
case Quarter: return "Quarter";
case Dollar: return "Dollar";
default: return "";
}
}
static Cent GetCent(int index) const
{
switch (index)
{
case 0: return Penny;
case 1: return Nickel;
case 2: return Dime;
case 3: return Quarter;
case 4: return Dollar;
}
return Penny;
}
static int GetSize() const
{
return 5;
}
};
[/code]
위처럼 만들고..
[code]
void main()
{
for (int i = 0; i < Cent::GetSize(); i++)
{
Cent cent = Cent::GetCent(i);
cout << cent.ToString() << "\t= " << cent.ToInt() << endl;
}
}
[/code]
이런식으로 출력하지요..
C++에서는 열거형을 출력하기 위해서 하드코딩된 '무언가'를 만들지 않으면 안됩니다.. 위의 예제에서만 봐도 열거형에 새로운 데이터를 하나 추가하면 Cent::ToString(), Cent::GetCent(), Cent::GetSize()도 수정해줘야 하는 수고를 해야만 하지요.. '하드코딩'이니까요..
-----------------------------------------------
그럼 C#에서는 이를 어떻게 하는지 한번 봅시다..
C#에는 Enum이라는 클래스가 있습니다. 이 클래스의 역할은 enum 타입을 받아서 값을 열거하거나 값의 이름을 열거해주는 역할을 합니다. 즉, 위 C++ 코드에서 제가 하드코딩으로 만든 클래스의 역할을 해주는 것이지요..
바로 C# 코드를 봅시다.
[code]
namespace CentExample
{
class CentExample
{
enum Cent
{
Penny = 1, Nickel = 5, Dime = 10, Quarter = 25, Dollar = 100
}
static void Main(object[] args)
{
// Cent의 값목록을 배열로 받아옵니다.
Cent[] centValues = Enum.GetValues(typeof(Cent));
// 목록을 루프로 돌면서 하나씩 출력합니다.
foreach (Cent cent in centValues)
{
Console.WriteLine("{0}\t= {1}", cent.ToString(), (int)cent);
}
}
}
}
[/code]
아주 간단해지죠?
앞으로 C#에서 열거형을 쓸때에는 Enum 클래스를 적극 활용하시길 바랍니다..^ㅡ^

뭐 기본적으로 뭔가 TypeLib에 매여있지 않은 C++에서 열거형의 항목 이름은 사실상 일반 상수나 변수 이름처럼 소멸되는 정보니 C++에서는 갖은 삽질을 해야겠죠...
잡소리지만... C#은 열거형을 단순 숫자로 처리해서 편하더군요. 열거형의 항목이 아닌 것을 대입하거나, 서로 더한다거나... 이래도 아무 말 없이 넘어가서 좋습니다.
C++에서 비트 플래그를 열거형으로 만들었다가... 낭패 많이 봤네요. 쩝
BCB는 델파이의 set 기능 에뮬레이션 한다고 Set 같은 개념 클래스 하나 만들어 쓰던데... -_-