열거형은 멤버 형식을 강력하게 지정하고 코드의 가독성을 향상시키는 데 유용한 상수 값의 집합을 제공합니다

열거형은 상수값의 집합을 제공 하므로 변수의 값을 강력하게 지정하고 코드의 가독성을 향상 시킨다. 일반적으로 열거형을 사용할 때 위의 두 가지 장점 때문에 사용하게 되는데 이번 글에서는 열거형을 사용할 수 있는 케이스에 대하여 알아 볼 것이다.

 

최근 프로젝트에서 UI에 스킨을 적용하게 되었다. 스킨 정보는 서트파티 컨트롤의 열거형으로 지정 되어 있었으며 UI상의 콤보박스에서 스킨이름을 선택하면 해당 스킨으로 화면의 디자인이 변경 되야 한다. 콤보박스에 스킨이름을 추가하고 싶은데 이것이 열거형으로 되어있으니 어떤 방식으로 데이터를 추가해야 할까?

 

다음 예제를 통해 열거형을 순회하고 그 이름을 가져오는 방법에 대해 알아 보겠다.

Enum 타입에는 GetNames()라는 메소드를 제공한다. 이 메소드는 지정된 열거형에서 상수 이름의 배열을 반환한다. 상수이름의 배열, String[]을 제공하기 때문에 이는 DataBoundControl DataSource가 될 수 있다
 

//열거형의 모든 텍스트를 불러와 DropDownList에 추가

ddlFontStyleList.DataSource = Enum.GetNames(typeof(FontStyle));

ddlFontStyleList.DataBind();


위의 예제 코드를 보면 FontStyle 열거형의 모든 상수 값을 읽어와 DropDownListDataSource로 추가하는 것을 볼 수 있다.

FontStyle의 모든 케이스를 직접 작성하여 추가지 않고 FontStyle 열거형의 정보를 읽어와 처리 할 수 있는 것이다.

실행 결과는 다음과 같다.

 



GetNames()
메소드가 String[]을 반환하기 때문에 당연히 foreach구문을 통해 접근하는 것도 가능하다. 다음 코드는 DropDownList에 해당 색상까지 적용된 KnownColor 정보를 추가한다.

 

//열거형(KnownColor)의 모든 텍스트를 불러와 실제 속성을 적용한 후 추가

foreach (string colorName in Enum.GetNames(typeof(KnownColor))) {

         ListItem item = new ListItem(colorName);

         item.Attributes.CssStyle.Add(HtmlTextWriterStyle.Color, colorName);

         ddlColorList.Items.Add(item);

}


다음은 위 코드에 대한 실행 결과다.

 



샘플이 Font와 관련된 열거형을 다루었기 때문인지는 몰라도 위의 코드들을 활용하여 에디터를 제작 해 보는 것도 좋을 것 같다는 생각이 든다.

 

오랜만에 하는 포스팅인데 글이 너무 빨리 끝나는 것 같다. 그래서 간단히 Enum 타입에 적용할 수 있는 확장메소드를 만들어 보도록 하겠다.

 

public partial class _Default : System.Web.UI.Page {

         protected void Page_Load(object sender, EventArgs e) {

                  Grade g1 = Grade.A;

                  Grade g2 = Grade.F;

                  Response.Write(g1.IsFailure().ToString());

                  Response.Write(g2.IsFailure().ToString());

         }

}

public enum Grade {

         A = 5, B = 4, C = 3, D = 2, F = 1

}

public static class TestExtension {

         //낙제 점수

         private static Grade failureGrade = Grade.F;

         //Grade Enum 타입에 대한 확장 메소드

         public static bool IsFailure(this Grade grade){

                  return grade <= failureGrade;

         }

}

 

위의 코드를 살펴보면 Grade라는 열거형이 있고 이는 A, B, C, D, F의 상수값으로 구성되어 있으며 그 값은 5, 4, 3, 2, 1로 되어 있다. 일반적인 열거형에 IsFailure()라는 확장메소드를 추가하였고 현재 열거형의 값이 낙제점 보다 클 경우 true를 반환하고 그렇지 않을 경우 false를 반환하게 된다. 작성 방법은 기존의 확장메소드를 작성할 때 와 동일하다. 이렇게 열거형에 확장메소드를 적용하여 다양한 상황에서 사용할 수 있다.

이번 포스트는 여기까지 입니다.^^
.


이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by kyeongkyun(kobukii) kyeongkyun
TAG c#, enum, 열거형
Convert.ToDateTime("2006-09-12").ToString("MMMM");

위와 같은 코드는 한글로 인코딩된 페이지에서
"9월" 이라는 결과를 반환한다.
하지만 난 "September"로 나타내고 싶다.
이럴경우 ToString에서는 IFormatProvider을 인자로 받는다.
다음과 같이 CultureInfo를 영문으로 생성한다.
System.IFormatProvider format = new System.Globalization.CultureInfo("en-US", true);

그런다음
Convert.ToDateTime("2006-09-12").ToString("MMMM", format);

위와같이 하면 원하는 결과가 나타난다.
이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by kyeongkyun(kobukii) kyeongkyun
Response.WriteFile()은 일반적으로 많이 사용된다. 하지만 맹점이 하나 존재하는데 이는 최초 파일을 읽어들여 모두 메모리 상에 로드 시킨다. 이때 문제가 발생하게 되는데 대용량의 데이터인 경우에는 메모리의 한계때문에 서버가 다운되는 현상까지 나타나게 되는 것이다.

ASP.NET 1.1 : 대용량 데이터 다운시 서버 다운까지 발생할 수 있는 위험한 코드(하지만 일반적인 방법)
Response.Clear();
Response.ClearHeaders();
Response.ClearContent();
Response.ContentType = "Application/Octet-Stream";
FileInfo objFileInfo = new FileInfo(path);
Response.AppendHeader("Content-Disposition", "Attachment; Filename="
           + Server.UrlEncode(objFileInfo.FullName).Replace("+", "%20"));
Response.AppendHeader("Content-Length", objFileInfo.Length.ToString());
Response.WriteFile(path);
Response.Flush();
Response.End();

ASP.NET 1.1 개선 : 메모리의 개선이 상당히 많이 이루어 지나 CPU의 자원을 많이 소비
Response.Clear();
Response.ClearHeaders();
Response.ClearContent();
Response.ContentType = "Application/Octet-Stream";
FileInfo objFileInfo = new FileInfo(path);
Response.AppendHeader("Content-Disposition", "Attachment; Filename="
  + Server.UrlEncode(objFileInfo.FullName).Replace("+", "%20"));
Response.AppendHeader("Content-Length", objFileInfo.Length.ToString());
int BUFFER_SIZE = 1024;
using (FileStream objFileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
  byte[] buffer = new Byte[BUFFER_SIZE];
  long remainder = objFileStream.Length;
  while (remainder > 0)
  {
       if (Response.IsClientConnected)
       {
           int readLength = objFileStream.Read(buffer, 0, BUFFER_SIZE);
           Response.OutputStream.Write(buffer, 0, readLength);
           Response.Flush();
           buffer = new Byte[BUFFER_SIZE];
           remainder = remainder - readLength;
       }
       else
           remainder = -1;
  }
}
Response.Flush();
Response.End();

ASP.NET 2.0 : CPU와 메모리의 자원을 가장 효율적으로 사용할 수 있음
Response.Clear();
Response.ClearHeaders();
Response.ClearContent();
Response.ContentType = "Application/Octet-Stream";
FileInfo objFileInfo = new FileInfo(path);
Response.AppendHeader("Content-Disposition", "Attachment; Filename="
  + Server.UrlEncode(objFileInfo.FullName).Replace("+", "%20"));
Response.AppendHeader("Content-Length", objFileInfo.Length.ToString());
Response.TransmitFile(path);
Response.Flush();
Response.End();
이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by kyeongkyun(kobukii) kyeongkyun
2006/09/23 21:39

정규표현식..
컴퓨터 공학과 커리큘럼에 포함되어있고.. 많은 시간을 할애햐여 배웠지만 정작 간단한 부분이외엔 사용하지 않고 있었다.

String클래스는 Replace  또는 Split를 지원한다. 하지만 이는 대소문자를 구분하여 사용할 방법이 존재하지 않는다.
Regex클래스 또한 Replace와 Split를 지원한다. 이는 정규표현식을 이용할 수 있고 대소문자 또한 구분이 가능하다. .NET에서 정규표현식을 사용하기 위해서는 System.Text.RegularExpressions네임스페이스를 참조한다.

정규표현식을 통한 Replace예제
주민등록번호 형태로 변환

Regex.Replace(txtSource.Text.Trim(), @"^(\d{6})(\d{7})$", "$1-$2", RegexOptions.IgnoreCase);

txtSource : 원본 텍스트이다. 공백을 제거하기 위해 Trim()호출-- 작은곳까지 신경쓰인 흔적..
RegexOptions.IgnoreCase : 대소문자 무시

Regex클래스의 유용한 메서드
Replace : 정규식에 해당하는 문자열을 대체 문자열로 변환
Split : 정규식에 해당하는 문자열을 구분자로 분할하여 string배열 반환
IsMatch : 정규식에 일치하는 문장이 있는지를 검사하여 bool값을 반환

예제

참조사이트 : http://regexplib.com

이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by kyeongkyun(kobukii) kyeongkyun
이전버튼 1 이전버튼