'NET 3.0'에 해당되는 글 1건

  1. 2008/03/29 글뻥 LINQ에 대한 기록 - 2

흠... 좀 길었다. linq에 대한 기록중 약속한 첫번째 C# 3.0의 변화 부분을 살펴 보자.
(컴파일러는 .NET Framework 3.5 로 테스트하였다.)

1. "var" (Local Variable Type Inference) 변수 지원
var는 정말 불확실성때문에 꺼려지는 문법중하나이다. 그러나 MS가 누구인가?
VB부터 줄곧 따라다니던 VAR를 포기하나 했더니 결국 집어 넣고 말았다.

//여기서부터
using System;
class Test {
  public static void Main() {
    var a = "12345";
    Console.WriteLine (a);
    var b = 123456;
    Console.WriteLine (b.ToString());
  }
}

컴파일 부터 실행까지 아무런 문제 없이 실행된다. -_-
단, var를 실행되는 런타임이 결정하는 것이 아니라 컴파일하는 컴파일러가 결정한다.
따라서 null을 넣게 되면?
"test.cs(4,9): error CS0815: 암시적으로 형식화된 지역변수에는 <null>을 할당 할 수 없습니다."라는 메시지를 보게될 것이다.
이부분이 가장 중요한 부분이다. 왜냐면 다른 특징들은 모두 var를 지원함으로써 얻어지는 것이기 때문이다.

2. 자동화된 get/set
클래스의 특징을 설명하며 클래스의 값을 주고 받을 때 어떻게 하는지 인터페이싱을 어떻게 해야하는지에 대해 설명할때 다른 언어와의 차별점으로 OOP에서는 GET/SET명령을 통해 인터페이스 한다고 아주 오래전에 설명한적이 있다. 그런데 이게 사실 꽤나 노가다 이다.
* 예전글은 여기서 : http://www.wolfpack.pe.kr/73

using System;
class Test {
  public static void Main() {
    a ar = new a();
    ar.AA="abcdef";
    Console.WriteLine ("인터페이스결과:"+ar.mthod());
  }
}

public class a{     //GET; SET; 사용을 자세히 보자     public string AA{ get; set; }      public string mthod(){         return AA;     } }


"바로 여기를 어쩌구 저쩌구 줄었다!"라는 부분을 보면 클래스의 Entity AA 선언자체가 get/set 딱 1줄로 팍 줄어 있다. 이전 버전에서라면 이렇게 길었는데 말이다.
//참고용으로 .NET Framework 2.0 이전 버전임
public class a{
    private string aa;
    
    public string AA{
      get{
          return aa;
      } 
      set{
          aa = value;
      } 
    } 

    public string mthod(){         return aa;     } }


* 참고로 Readonly선언의 경우는 set 을 private로 변경해준다.
예 : public string AA{ get; private set; }

3. 객체 / 배열 인스턴스의 변경
다음의 코드는 "2번"항목의 코드를 C# 3.0의 변화에 맞게 수정한 것이다.

using System;
class Test {
  public static void Main() {
    a ar = new a { AA="abcdef" };
    Console.WriteLine ("인터페이스결과:"+ar.mthod());
  }
}
public class a{
    public string AA{ get; set; } 
    public string mthod(){
        return AA;
    }
}

즉, 기존에 인스턴스화할때 다음과 같이 하던 부분을 선언과 동시에 값을 넣을수 있도록 변경되었다.
//2.0용
a ar = new a();
a.AA="abcdef";

//3.0용 a ar = new a { AA="abcdef" };

또한 배열도 마찬가지로 이렇게 사용하는 것이 가능하다.

int[] scores = new int[] { 97, 92, 81, 60 };

4. 배열, XML, DB 등 데이터를 가져오는 것이 하나의 방법으로 통한다.
바로 이부분이 LINQ의 능력이다.
배열이나 XML, DB등 데이터를 가져와서 핸들링 할때 데이터를 가져오는 부분이 모두 달랐다.
XML을 파싱해서 각각의 변수에 넣었다가 핸들링하고 다시 집어 넣고 노가다 였는데 모든 것을 Linq 한방에 핸들링 할 수 있다는 것이다.

using System;
using System.Linq;

class Test {   public static void Main() {       int[] scores = new int[] { 97, 92, 81, 60 };

      var scoreQuery =  from score in scores                                where score > 80                                select score;

      foreach (int i in scoreQuery)       {           Console.Write(i + " ");       }              } }


배열인 scores에 대해 80점 이상인 놈만 가져오자. 이런거 할려면 if문 넣어서 뺑뺑이 돌리던 기억이 엇그제 같은데 LINQ로 한방에 끝나버린다.

5. Anonymous Type을 지원한다.
다음의 황당한 코드 함 보자.

using System;

class Test {   public static void Main() {       var user = new { Name = "vicviper", Age = 35 };       Console.WriteLine (user.Name);   } }


무엇이 황당한가? 분명 2.0대에서는 user라는 클래스를 만들고 Name과 Age를 인터페이스 선언하여야 정상 작동하던 코드였다. 그러나, 우리의 C# 3.0 컴파일러는 이렇게 단순한 놈은 자동으로 생성해버린다.
따라서, 컴파일러 오류도 없고 정상작동되는 것이다. 심지어 이런것도 가능하다.
using System;

class Test {   public static void Main() {       var family1 = new { Name = "papa", Age = 35 };       var family2 = new { Name = "mama", Age = 35 };       Console.WriteLine (family1.Age + family2.Age);   } }

마치며.
결론적으로 C# 3.0은 코딩량을 줄여준다는 점에서 점수를 줄만하다.
그러나 OOP가 아니었다면 원래 안해도 되는 일을 OOP의 논리때문에 코딩량이 는것아닌가?
아마도 OOP원리주의자들이 이러한 C# 3.0의 변화를 본다면 분명 이게 무슨 OOP냐고 되물을 것이다. 그러나, 프로그래머도 인간이다.
인간이기에 편해지려는 노력을 하는 것이고 편해지기위해 새로운 방법을 찾는다.
현재로써는 C# 3.0은 당연히 되어야 하는 부분을 하나씩 지원해주는 느낌이다.


2008/03/29 16:15 2008/03/29 16:15