본문 바로가기

ETC Programmings

[C#] 3.0 의 새로운 기능들

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
w4wawwwaaC# 에는 자바와는 다른 기능들이 많이 있다. 좀더 융통성있고 개발자 편의적인 부분이 있다. 그중에서 코드의 생산성을 높이고 조금 더 개발을 수월하게 해주는 C# 3.0의 새로운 기능들을 소개 하려고 한다.

1. 암묵적인 타입 : var

  1. var test = 1234;   
  2.             // test = "Hello";   
  3.             // 자바스크립트와는 달리 최초 선언된 형태의 변수로 쭉 간다. 다른 형태로 변경이 불가능하다.   
  4.             // 암묵적 타입을 헷깔리게 왜쓰나여? ---> LINQ에서 꼭 필요하기 때문이랍니다.   
  5.             Console.WriteLine("암묵적 타입 사용 : {0}", test);  
Javascript 의 var 와는 다르게 초기에 선언해준 인스턴스의 유형을 그대로 가져간다. 때문에 다른 타입의 인스턴스도 올 수 없다. 그럼 var 라는 키워드는 귀찮을때 쓴단 말인가? 기존의 문법을 다소 무시하는 불필요한 코드로 간주가 되지만 이는 LINQ에서 꼭 필요하기 때문에 추가가 되었다고 한다.

2. 자동완성 Property : 더 간결하게 선언
  1. class Student   
  2.     {   
  3.            
  4.         public string name {get; set;}   
  5.         public int age { get; private set; }   
  6.   
  7.         public Student()   
  8.         {   
  9.             Console.WriteLine(name);   
  10.         }   
  11.         public override string ToString()   
  12.         {   
  13.             return name;   
  14.         }   
  15.         // 위와 같은 코드를 사용해서 반복되는 코드를 보다 깔끔하게 할수 있겠죠?   
  16.     }  
기존 Property에서 get, set 부분을 채워줘야 했다면 get, set에 대한 기본적인 기능의 추가를 컴파일러에게 선언만을 통해 직접적인 구현은 제외함으로서 조금더 표현이 간결해 지게 되었다.

3. Collection 초기자

  1. private static void testCollectionInitializer()   
  2. {   
  3.     List<object> fruitList = new List<object>();   
  4.     fruitList.Add("사과");   
  5.     fruitList.Add("망고");   
  6.     fruitList.Add("감귤");   
  7.     fruitList.Add("수박");   
  8.     fruitList.Add(1234);   
  9.     fruitList.Add(new DateTime());   
  10.   
  11.     foreach (string s in fruitList)   
  12.     {   
  13.         Console.Write(s + " ");   
  14.     }   
  15.     Console.WriteLine();   
  16.   
  17.     // 더 간단하게 하려면?   
  18.     List<string> simpleFruitList = new List<string> { "배""밀감""딸기""파인애플" };   
  19.     foreach (var s in simpleFruitList)   
  20.     {   
  21.         Console.Write(s + " ");   
  22.     }   
  23.     Console.WriteLine();   
  24.   
  25.     // Student도 되나요?   
  26.   
  27.     List<Student> studentList = new List<Student>    
  28.     {    
  29.         new Student { name = "한산" },   
  30.         new Student { name = "두산" },   
  31.         new Student { name = "라산" }    
  32.     };   
  33.     foreach (var s in studentList)   
  34.     {   
  35.         Console.Write(s + " ");   
  36.     }   
  37.     Console.WriteLine();   
  38. }  
조금더 소스는 심플해졌고.. 줄어들었다. 선언과 동시에 변수 초기화도 할 수 있는 계기를 마련해 주었다. 때문에 여러줄을 반복하여 코딩해야하는 일이 줄어들었다. 이처럼 보면 최소한의 코딩을 하기 위한 부수적인 기능들이 늘었다.

4. 익명 타입

  1. var noname = new { name = "금동", age = 1, isMale = true };   
  2.             Console.WriteLine("{0}이는 {1} 고양이 입니다. 나이는 {2}살이구요..", noname.name, (noname.isMale ? "수컷" : "암컷"), noname.age);  

var가 가지고 있는 암묵적인 사용 이외에도 선언 자체에 클래스 타입을 받지 않는 위와 같은 소스가 나오게 된다. 이는 익명의 타입을 말한다. JSON의 key 와 value의 형식으로 되어있다.  1회성의 클래스를 만들때 유용하게 쓰일 것 같은 생각이다. 이 역시도 LINQ에서 응용이 된다고 한다.

5. 람다 표현식

  1. // 이건 보통의 방식   
  2. Student std = new Student { name = "한산" };   
  3. study doStudy = delegate(string name) { Console.WriteLine("{0} 님이 공부를 합니다.", name); };   
  4. doStudy(std.name);   
  5.   
  6. // 람다 표현식을 사용하면?   
  7. study studying = name => { Console.WriteLine("{0} 님이 공부를 합니다.", name);  };   
  8. studying(std.name);  
[ (인수) => 표현식 또는 명령문 ] 이라는 다소 생소한 문법을 가지고 표현을 한다. delegate 의 익명 메서드의 발전된 형태라고 볼수 있다. 람다 표현식은 LINQ 에서 더 자세하게 다뤄보도록 하겠다.


위에서 배운 C# 3.0 만의 문법은 지난날의 자바 프로그래밍을 했을때 보다 훨씬 더 머릿속을 혼동스럽게 한다. 뭐 위에 열거한 내용들이 좀 기존의 자바의 문법에서 조금 변형이 된것들이 많다. 이를테면 타입을 선언하지 않는다던가.. Object 이외에 var 라는 익명타입이라던가 하는 것들이 있어서 종래에 가지고 있던 문법적인 틀을 깨려는 시도가 어색하기만 하다.

처음 Generic 이나 예외처리 같은 다소 철학적인 문법을 공부할 때도 이와 마찬 가지였다. 숨어있는 철학을 이해하기 까지는 사실 문법은 문법 그대로를 보고 익혀야 할 뿐인 것이다. 실제로 코드를 사용하면서 다뤄보면서 습득하는 편이 더 빠를것 같다는 것이다.