.NET2009/03/19 18:07

C# 3.0이 제공하는 새로운 기술이 참 많은데 그 중 가장 많이 거론 되는 내용이 LINQ기술일 것이다. 하지만 LINQ보다 도 코딩 시 더 유용한 기술이 있어 소개해보려 합니다.

Extension Method

구글에서 “Extension Method” 이라고 검색해보면 꽤나 많은 글들이 올라오고 사용방법에 대해서 자세히 설명하고 있으니 관련 글을 찾아봐도 되겠지만 간략히 이해 하고 싶은 분들은 아래 글을 참고해주세요. 제가 쓰는 글보다는 구글에 올라온 글이 백번 낫겠지만^^;

Extension Method
는 말 그대로 메서드를 확장해서 사용하는 기술입니다. 예제를 보면서 설명 하도록 하겠습니다.

public static class EMClass
{
    public static int ToInt32Ext(this string s)
    {
        return Int32.Parse(s);
    }
    public static int ToInt32Static(string s)
    {
        return Int32.Parse(s);
    }
}
class Program
{
    static void Main(string[] args)
    {
        string s = "9";
        int i = s.ToInt32Ext();              // 확장 메서드
        int j = EMClass.ToInt32Static(s);    // 일반 적으로 사용하는 방법

    }
}


소개하려는 메서드는 문자를 숫자로 바꿔주는 소스입니다
. 함수를 바로 사용하기 위해서 static을 많이 사용합니다. 그리고 위의 소스처럼 함수 인자에 뭔가를 넣겠죠.

int j = EMClass.ToInt32Static(s);    // 일반 적으로 사용하는 방법

이렇게 말입니다.

 

일단 static을 사용했으니 인스턴스 객체를 만들지 않고 바로 메서드를 사용할 수 있으니 간단하죠. 그런데 그 아래 확장 메서드라는 라인을 보면 string 클래스에 ToInt32Ext()메서드가 있는것처럼 바로 접근해서 사용하는 것을 볼 수 있습니다. 최소한 가독성이나 사용 면에서는 확장 메서드가 사용상 용이해 보입니다.

딱히 필요성을 모르겠다는 분들을 위해 다른 소스를 예제로 보여드리겠습니다.

우선 오늘 날짜에서 특정 일을 빼주는 함수를 만든다고 가정 하겠습니다.

그럼 보통 이런 함수를 구상 하시리라 예상됩니다.

 

public static DateTime MinusDay(DateTime dt, int days)

{

DateTime d = dt.AddDays(-days);

return d;

}

 

날짜 파라메터, 지정 날짜 파라메터 그리고 아래 처럼 사용할 것입니다.

 

DateTime current = DateTime.Now;

DateTime dt1 = DateTimerHelper.MinusDay(current, 3);

 

하지만 확장 메서드를 사용하면 마치 DateTime MinusDay라는 메서드가 있는 것 처럼 사용할 수 있습니다.

 

public static DateTime EX_MinusDay(this DateTime dt, int days)

{

    DateTime d = dt.AddDays(-days);

    return d;

}
 

DateTime dt2 = current.EX_MinusDay(3);

소스입니다.
 

public static class DateTimerHelper
{
    public static DateTime MinusDay(DateTime dt, int days)
    {
        DateTime d = dt.AddDays(-days);
        return d;
    }

    public static DateTime EX_MinusDay(this DateTime dt, int days)
    {
        DateTime d = dt.AddDays(-days);
        return d;
    }
}
class Program
{
    static void Main(string[] args)
    {
        DateTime current = DateTime.Now;
        DateTime dt1 = DateTimerHelper.MinusDay(current, 3);    //일반적으로 사용하는 방법

        DateTime dt2 = current.EX_MinusDay(3);    //확장 메서드를 사용하는 방법           
    }
}


확장 메서드(Extension Method)를 사용하기 위해서는 몇가지 조건이 필요합니다. 확장 메서드는 static class에 static method로 선언 하여, instance메소드를 호출 하듯이 사용하면 됩니다.



 

Posted by Jake Kim
기술정보2009/03/13 17:33

구분: 엑셀
설명: 각 필드의 값을 비교하여 특정 값을 복사하기

엑셀을 사용 하다 보면 두 필드의 값을 비교하여 그 값이 일치 한다면 특정 필드의 값을 복사해 올 일이 종종 있다. 이럴 때 사용할 수 있는 유용한 엑셀 함수가 VLOOKUP이다.

VLOOKUP의 함수 인자를 살표보면 VLOOKUP(LOOKUP_VALUE, Table_array, Col_index_num,Range_lookup) 이와 같다.

Lookup_value: 비교값
Table_array: 찾을 대상 목록
Col_index_num: 찾을 대상 목록에서 복사해올 인덱스
Range_lookup: 정확도

함수에 관한 세부 설명은 엑셀에서 직접 참고 하기 바라며, VLOOKUP을 통해 어떻게 일을 편하게 할 수 있는지 알아보자.



A데이터와 B데이터의 코드명을 비교하여 2자리가 같으면 대분류, 3자리가 같으면 중분류, 5자리가 같으면 소분류로 나누려고 한다.

이때 비교 대상의 코드명을 2자리,3자리, 5자리로 분류하고 이 값을 VLOOKUP을 사용하여 비교하면 간단히 해결 할 수 있다.

1.먼저 코드명 나누기는 자리수로 =LEFT(대상,자리수)로 D번과 같이 나눈다.
2.=VLOOKUP을 사용하여 나눠진 코드명을 비교대상 테이블에서 찾는다.

=VLOOKUP(J2, $A:$B,2,FALSE): 비교값, 대상테이블, 대상테이블의 복사위치, 정확도
이때 중요한 것은 대상 즉 J2는 드래그할 때 마다 셀위치가 바껴야 하고 대상 테이블은 그대로 있어야 한다. 이따 대상테이블의 주소를 고정으로 둘 수 있는데 셀주소 앞에 $를 붙이면 된다.
 

Posted by Jake Kim