2009. 4. 9. 13:51

유니코드 변경

유니코드를 한자로 변경

name_h = Encoding.UTF8.GetString(Convert.FromBase64String(name_h));


한자를 유니코드로 변경

name_h = Convert.ToBase64String(Encoding.UTF8.GetBytes(name_h));

2009. 3. 5. 15:40

[C#] 추상클래스, 추상메서드 예제

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; 

// 구현 코드를 가지지 않는 메서드가 있는데 이런 메서드를 추상 메서드라고 한다.
// 추상메서드는 abstract 지정자를 붙이는데 인수 목록과 리턴 타입은 가지지만
// 본체는 가지지 않으며 세미콜론 하나로 끝난다.
//
// 다음이 그 예이다.
// public abstract int MoMo(int a, double b);
//
// 추상 메서드는 너무 일반적이기 때문에 코드를 정의할 수 없으며
// 파생 클래스에서 재정의해야만 호출 가능한 메서드가 된다.
// 파생 클래스에서 반드시 재정의해야 하므로 virtual을 붙이지 않아도 자동으로 가상이다.
//
// 추상 클래스는 너무 일반적이어서 인스턴스를 생성할 수 없는 클래스이다.
// 클래스 선언문에 abstract 지정자를 붙이면 이 클래스는 추상 클래스가 된다.
//
// 추상 메서드가 하나라도 선언되어 있는 클래스는 역시 추상이어야 한다.


namespace Abstract
{
    abstract class Animal   // 동물들은 울수 있지만 동물 그 자체는 우는 방식을 결정할 수 없는 것이다.
    {
        public abstract void Sound();   // 그래서 Animal의 Sound 메서는 본체를 가지지 않는 추상 메서드로 정의
    }                                   // 동물은 분명히 울기는 우는데 어떻게 우는지는 Animal 단계에서 결정할 수
                                        // 없고 Dog, Cow로 내려가 봐야 아는 것이다.

    class Dog : Animal
    {
        public override void Sound()
        {
            Console.WriteLine("멍멍");
        }
    }

 

    class Cow : Animal
    {
        public override void Sound()
        {
            Console.WriteLine("음메");
        }
    }

 

    class Cat : Animal
    {
        public override void Sound()
        {
            Console.WriteLine("야옹");
        }
    }

 

    class Program
    {
        static void Main(string[] args)
        {
            Animal A;
            A = new Dog(); A.Sound();
            A = new Cow(); A.Sound();
            A = new Cat(); A.Sound();
        }
    }
}

출처: 가메출판사, 닷넷 프로그래밍 정복, 김상형 저
2009. 3. 5. 15:18

[ C# ] Virtual , Override, New 의 관계...

 Virtual , Override, New 의 관계...

 

Virtual : 하위 클래스에서 재정의 해서 사용하겠다..

Override: 상위 클래스에서 vitual 로 표시된 메서드를 재 정의 할때,

New: 상위 클래스의 메서드는 무시..

2009. 3. 5. 15:12

c#에서 override키워드의 의미

    class Father
    {
        public virtual void TestPrint()
        {
            Console.WriteLine("father's TestPrint");
        }
        public virtual void TestPrintOverride()
        {
            Console.WriteLine("father's TestPrintOverride");
        }
    }

    class Sun : Father
    {
        public void TestPrint()
        {
            Console.WriteLine("son's TestPrint");
        }
        public override void TestPrintOverride()
        {
            Console.WriteLine("son's TestPrintOverride");
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Sun test = new Sun();
            test.TestPrint();
            test.TestPrintOverride();
            Console.WriteLine();
            Father test2 = new Sun();
            test2.TestPrint();
            test2.TestPrintOverride();
            Console.Read();
        }
    }


결과:

son's TestPrint
son's TestPrintOverride

father's TestPrint
son's TestPrintOverride

2009. 3. 4. 13:46

주석을 달아주는 편리한 Visual Studio Addin. Comment Helper v1.0 정식 버젼 (VS2005/2008 Addin)

2009. 2. 27. 11:44

String 과 StringBuilder의 차이점

출처:데브피아~~~~~~~
 

String 개체는 문자열을 빼거나 더할 때 새로운 String 개체를 생성합니다.
그러나 StringBuilder는 한번 생성되면 다시 생성되지 않습니다.
자체적으로 Buffer를 가지고 있기 때문에 문자열을 더하거나 뺄 때 이 Buffer를 이용
하기 때문이죠.
그래서 문자열의 연산이 많을 때는 StringBuilder를 이용하는 게 훨씬 효율적이라고 
온라인 문서와 MSDN의 기사에 나와 있더군요.
저도 그렇게 믿고 10번 정도의 문자열 연산을 하는 것은 StringBuilder를 사용하도록 
했습니다.
그런데 방금 테스트해본 결과 100번 정도의 작업은 String이 훨씬 빠르고 1200번 정
도 후에는 String이 기하급수적으로 느려지는 걸 발견했습니다.
하지만 베타 버전이라 느릴 수 있다는 생각이 드므로 일단은 StringBuilder를 이용해 
계속 함수를 만들 생각입니다.
다음은 테스트하는 데 쓰인 소스입니다. Len 인수의 값을 작게 하면 할수록 String이 
빠르고 많게 하면 할수록 StringBuilder가 빨라집니다.

public static void Main(string[] args)
{
    long Start = 0;
    long Duration = 0;
    string s = "";

    Start = System.DateTime.Now.Ticks;
    s = StringBuilderTest(10000);
    Duration = System.DateTime.Now.Ticks - Start;
    Console.WriteLine("StringBuilder: " + Duration.ToString()); //200290, 300435

    Start = System.DateTime.Now.Ticks;
    s = StringTest(10000);
    Duration = System.DateTime.Now.Ticks - Start;
    Console.WriteLine("string: " + Duration.ToString()); //20629870, 21130590

    Console.ReadLine();
}

public static string StringTest(int Len)
{
    string s = "";

    for (int i = 0; i < Len; i++)
    {
        s += i.ToString();
    }
    
    return s;
}

public static string StringBuilderTest(int Len)
{
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < Len; i++)
    {
        sb.Append(i.ToString());
    }
    
    return sb.ToString();

    }


2009. 2. 25. 10:02

Visual Studio 2008 이 삭제시 에러가 발생할 경우...

이미지를 클릭하면 더 잘 보임니다~~


2009. 2. 23. 14:54

C# 제네릭

제네릭 클래스 및 메서드를 사용하면 제네릭이 아닌 형식에서는 불가능한 방식으로 재사용성,형식 안전성 및 효율성을 동시에 달성할 수 있습니다. 제네릭은 컬렉션 및 컬렉션을 다루는 메서드에서 가장 일반적으로 사용됩니다. .NET Framework 클래스 라이브러리 버전 2.0에서는 System.Collections.Generic 이라는 새로운 네임스페이스를 제공하며 이 네임스페에스에는 새로운 제네릭 기반 컬렉션 클래스가 여러 개 있습니다.
버전 2.0을 대상으로 하는 모든 응용 프로그램에서는 이전의 ArrayList 같은 제네릭이 아닌 형식 대신 새로운 제네릭 컬레션 클래스를 사용하는 것이 좋습니다.
물론 사용자 고유의 형식 안전적이고 효율적인 일반화 솔루션 및 디자인 패턴을 제공하기 위해 사용자 지정 제네릭 형식 및 메서드를 만들 수 있습니다.

Ex-1) 예제에서는 이해를 돕기 위해 간단한 제네릭 연결 리스트 클래스를 보여 줍니다.
대부분의 경우에는 사용자가 이러한 클래스를 직접 만들기 보다 .NET Framework 클래스 라이브러리에서 제공하는 List<T> 클래스를 사용하는 것이 좋습니다.

목록에 저장되는 항목의 형식을 지정하기 위해 일반적으로는 구체적인 형식이 사용될 여러 위치에 형식 매개 변수 T가 사용되고 있습니다. 구체적으로는 다음과 같이 사용되고 있으니 참고하시기 바랍니다.

AddHead 메서드의 메서드 매개 변수 형식
공용 메서드인 GetNext의 반환 형식 및 중첩 Node 클래스의 Data 속성
중첩 클래스에 있는 전용 멤버 데이터의 형식 

*  주목

중첩 Node 클래스에서도 T를 사용할 수 있다.
GenericList<int>와 같이 GenericList<T>를 구체적 형식을 사용하여 인스턴스화하면 모든 T가 int로 대체됩니다.

Ex-1)

 // type parameter T in angle brackets
public class GenericList<T>
{
    // The nested class is also generic on T
    private class Node
    {
        // T used in non-generic constructor
        public Node(T t)
        {
            next = null;
            data = t;
        }
        private Node next;
        public Node Next
        {
            get { return next; }
            set { next = value; }
        }

        // T as private member data type
        private T data;
        // T as return type of property
        public T Data  
        {
            get { return data; }
            set { data = value; }
        }
    }

    private Node head;
    // constructor
    public GenericList() 
    {
        head = null;
    }
    // T as method parameter type:
    public void AddHead(T t) 
    {
        Node n = new Node(t);
        n.Next = head;
        head = n;
    }

    public IEnumerator<T> GetEnumerator()
    {
        Node current = head;
        while (current != null)
        {
            yield return current.Data;
            current = current.Next;
        }
    }
}

다음 코드 예제에서는 클라이언트 코드에서 제네릭 GenericList<T> 클래스를 사용하여 정수 목록을 만드는 방법을 보여 줍니다.
형식 매개 변수를 변경하는 간단한 방법으로 아래 코드를 문자열이나 기타 사용자 지정 형식의 목록을 만들도록 쉽게 변경할 수 있습니다. 

class TestGenericList
{
    static void Main()
    {
        // int is the type argument
        GenericList<int> list = new GenericList<int>();
        for (int x = 0; x < 10; x++)
        {
            list.AddHead(x);
        }

        foreach (int i in list)
        {
            System.Console.Write(i + " ");
        }
        System.Console.WriteLine("\nDone");
    }
}

제네릭 - 장점 : 제네릭 기능을 사용하면 제네릭 클래스나 메서드에 의해 사용되는 특정 형식을 지정할 수 있으므로 형식 안전성에 대한 작업을 컴파일러에서 담당하게 됩니다. 컴파일 타임에 형식 안전성이 적용되므로 올바른 데이터 형식을 테스트하기 위해 코드를 작성할 필요가 없습니다. 형식 캐스팅의 필요성과 런타임 오류의 가능성이 줄어듭니다.
제네릭은 여러 구현의 오버헤드 없이 형식 안전성을 제공합니다. 예를 들어, 다음 변수 선언과 함께 연결된 문자열 목록을 만들 수 있습니다. 

C#

LinkedList<string> llist = new LinkedList<string>();

기본 형식에서 상속하고 멤버를 재정의하지 않아도 됩니다. 연결된 목록은 바로 사용할 수 있습니다.
.NET Framework에서 제공하는 제네릭 컬렉션 형식은 System.Collections.Generic 및  system.Collections.ObjectModel을 참조하시면 됩니다.
형식 안전성 외에, 일반적으로 제네릭 컬렉션 형식은 값 형식을 boxing하지 않아도 되므로 값 형식을 효율적으로 저장하고 조작할 수 있습니다.


출처 >> 데브피아 강도욱
       >>http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNo=8&no=1357&ref=1357

2009. 2. 19. 11:41

갑자기 애매모호해서 정리쫌...

1. 클래스와 객체의 정의와 용도

클래스란 '객체를 정의해놓은 것.' 또는 클래스는 '객체의 설계도 또는 틀'이라고 정의할 수 있다. 클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성된다.

클래스의 정의 - 클래스란 객체를 정의해 놓은것이다.
클래스의 용도 - 클래스는 객체를 생성하는데 사용된다.

객체의 사전적인 정의는, '실제로 존재하는 것'이다. 우리가 주변에서 볼 수 있는 책상, 의자, 자동차와 같은 사물들이 곧 객체이다. 객체지향이론에서는 사물과 같은 유형적인 것뿐만 아니라, 개념이나 논리와 같은 무형적인 것들도 객체로 간주한다.
프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.

객체의 정의 - 실제로 존재하는것. 사물 또는 개념
객체의 용도 - 객체가 가지고 있는 기능과 속성에 따라 다름

유형의 객체 - 책상, 의자, 자동차, TV와 같은 사물
무형의 객체 - 수학공식, 프로그램 에러와 같은 논리나 개념

클래스와 객체의 관계를 우리가 살고 있는 실생활에서 예를 들면, 제품 설계도와 제품과의 관계라고 할 수 있다. 예를 들면, TV설계도(클래스)는 TV라는 제품(객체)을 정의한 것이며, TV(객체)를 만드는데 사용된다.
또한 클래스는 단지 객체를 생성하는데 사용될 뿐이지 객체 그 자체는 아니다. 우리가 원하는 기능의 객체를 사용하기 위해서는 먼저 클래스로부터 객체를 생성하는 과정이 선행되어야 한다.
우리가 TV를 보기 위해서는, TV(객체)가 필요한 것이지 TV설계도(클래스)가 필요한 것은 아니며, TV설계도(클래스)는 단지 TV라는 제품(객체)을 만드는데만 사용될 뿐이다. 그리고 TV설계도를 통해 TV가 만들어진 후에야 사용할 수 있는 것이다.
프로그래밍에서는 먼저 클래스를 작성한 다음, 클래스로부터 객체를 생성하여 사용한다.

[참고]객체를 사용한다는 것은 객체가 가지고 있는 속성과 기능을 사용한다는 뜻이다. 


클래스를 정의하고 클래스를 통해 객체를 생성하는 이유는 설계도를 통해서 제품을 만드는 이유와 같다. 하나의 설계도만 잘 만들어 놓으면 제품을 만드는 일이 쉬워진다. 제품을 만들 때마다 매번 고민할 필요없이 설계도 대로만 만들면 되기 때문이다.
설계도 없이 제품을 만든다고 생각해보라. 복잡한 제품일 수록 설계도 없이 제품을 만든다는 것은 상상할 수도 없을 것이다.
이와 마찬가지로 클래스를 한번만 잘 만들어 놓기만 하면, 매번 객체를 생성할 때마다 어떻게 객체를 만들어야 할지를 고민하지 않아도 된다. 그냥 클래스로부터 객체를 생성해서 사용하기만 하면 되는 것이다.


2. 객체와 인스턴스

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다.

예를 들면, Tv클래스로부터 만들어진 객체를 Tv클래스의 인스턴스라고 한다. 결국 인스턴스는 객체와 같은 의미이지만, 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있으며, 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 갖고 있다.
예를 들면, '책상은 인스턴스다.'라고 하기 보다는 '책상은 객체다.'라는 쪽이, '책상은 책상 클래스의 객체이다.'라고 하기 보다는 '책상은 책상 클래스의 인스턴스다.'라고 하는 것이 더 자연스럽다.

인스턴스와 객체는 같은 의미이므로 두 용어의 사용을 엄격히 구분지을 필요는 없지만, 위의 예에서 본 것과 같이 문맥에 따라 구별하여 사용하는 것이 좋다. 


다시 정리를 하니깐 정확하게 기억이 돌아오는듯 ㅎㅎㅎ

2009. 1. 8. 14:38

실버라이트2 둘러보기

실버라이트는 그동안은 런타임조차 설치를 안했을 정도로 관심이 없었고, 그저 플랙스 비슷한 것이 있나 보다 하고 생각하고 있었습니다.

그러다가 갑자기 호기심이 생겨 이제서야 실버라이트 개발환경을 만들어 보고 잠깐 살펴보았습니다. 실버라이트2는 MS에서 나온 RIA(Rich Internet Application)로, 자세한 설명은 MSDN의 실버라이트 한글문서에 잘 나와 있습니다.

* 참조 사이트
아래의 사이트들에서 개발에 필요한 메뉴얼과 샘플을 얻을 수 있습니다.

  • Silverlight Lean - 실버라이트 공식홈페이지로 다양한 문서들과 동영상 강좌, 튜토리얼등이 있습니다.  
  • MSDN Silverlight - MSDN의 실버라이트 색션입니다. 원하는 항목을 쉽게 찾을 수 있고, 항목별로 간단한 샘플등을 확인할 수 있씁니다.

관련 사이트외에도 CHM버젼의 SDK 도움말도 다운로드 받아 사용하실 수 있습니다.


1. 개발환경 설치
설치는 실버라이트의 공식 홈페이지에서 Get Started 문서를 참조하였습니다. 해당 페이지에는 아래와 같이 관련링크와 함께 간단한 설명이 되어 있어 쉽게 설치를 할 수 있습니다. 



1) Silverlight Tools for Visual Studio 2008 SP1
실버라이트 툴즈를 설치하기 위해서는 먼저 Visual Studio 2008 SP1과 Visual Web Developer Express with SP1가 설치되어 있어야 합니다. 이 패키지는 SDK와 개발 런타임, Visual Studio에 관련 기능과 C#/Visual Basic에서 사용할 수 있는 템플릿들을 설치합니다.

저는 일단 권장하는데로 모두 설치를 하였지만 막상 사용을 해보니, 이 패키지 하나만 설치를 하면 기본적인 실버라이트의 개발은 가능할 것 같습니다.

2) Microsft Expression Blend 2 + SP1
60일 트라이얼 버젼을 설치하여 잠시 실행해 보았습니다. UI를 디자인하고 타임라인등의 용어가 있는 것으로 보아 애니메이션을 제작하는 툴 같습니다. 아마 어도비의 플래쉬와 비슷한 개념의 툴인 것 같습니다.


3) Deep Zoom Composer
이미지 관련툴인 것 같은데 사용해보지는 않았습니다.

4) Silverlight Toolkit
실버라이트 어플리케이션에서 사용할 수 있는 콘트롤, 컴퍼넌트, 유틸리티등이 있다고 하는데 역시 사용해 보지는 않았습니다.

2. 테스트 드라이브
1) 동영상 플레이어
동영상을 플레이, 일시중지, 중지를 할 수 있는 간단한 어플리케이션을 만들어 보았습니다. 이런 개발툴에서는 기본기능의 동영상 플레이어는 간단하게 만들어 볼 수 있기 때문입니다.


2) 프로젝트 생성
VS의 New Project에서 프로젝트 템플릿을 아래와 같이 C# / Silverlight / Siverlight Application으로 선택합니다.
 

그런데 프로젝트를 생성하지 못하고 오류가 발생하였습니다. 검색을하여 보니 관련 내용이 있어  아래와 같이 명령 프롬프트에서 실행하고 해결하였습니다.

C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.com /resetskippkgs  

3) 소스코드 수정
레이아웃을 지정하는 xaml과 동작을 실행하는 C# 소스파일에 아래와 같이 내용을 추가합니다.

* Page.xaml
<UserControl x:Class="SilverlightMovieTest.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" Height="330">
    <Canvas x:Name="LayoutRoot" Background="White">
<MediaElement AutoPlay="False" x:Name="mediaPlayer"
Source="[동영상 URL]"
Width="400" Height="300"></MediaElement>

<Button x:Name="btnPlay" Canvas.Top="310" Content="Play"
Width="60" Height="20"/>

<Button x:Name="btnStop" Canvas.Top="310" Canvas.Left="64"
Content="Stop" Width="60" Height="20"/>

</Canvas
</UserControl>
[동영상 URL] 부분에 해당 동영상의 URL을 입력합니다.

* Page.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SilverlightMovieTest
{
    public partial class Page : UserControl
    {
        bool isPlay = false;

        public Page()
        {
            InitializeComponent();

            /* 버튼 이벤트 핸들러 설정 */
            btnPlay.Click += new RoutedEventHandler(PlayButtonClicked);
            btnStop.Click += new RoutedEventHandler(StopButtonClicked);
           
            btnStop.IsEnabled = false;
        }

        /** Play 버튼 클릭 시 */
        void PlayButtonClicked(object sender, RoutedEventArgs e)
        {
            if (isPlay == false)
            {
                mediaPlayer.Play();

                btnPlay.Content = "Pause";
                btnStop.IsEnabled = true;
                isPlay = true;
            }
            else
            {
                mediaPlayer.Pause();

                btnPlay.Content = "Play";
                btnStop.IsEnabled = false;
                isPlay = false;
            }
        }

        /** Stop 버튼 클릭 시 */
        void StopButtonClicked(object sender, RoutedEventArgs e)
        {
            if (mediaPlayer.CurrentState == MediaElementState.Playing)
            {
                mediaPlayer.Stop();
                               
                btnPlay.Content = "Play";
                btnStop.IsEnabled = false;
                isPlay = false;
            }
        }
    }
}


실행을 해보면 아래와 같이 인터넷 익스플로어에서 구동되는 모습을 확인할 수 있습니다.



3. 배포
빌드를 하면 프로젝트명.xap 파일이 생성됩니다. 확장자명을 보면 IIS에서만 실행될 것 같은 느낌이 들지만, 플래쉬의 swf와 같이 로컬의 런타임에서 실행되기 때문에 웹서버와는 상관이 없습니다.

웹사이트에서 실버라이트를 실행하기 위해서는 아래와 같이 HTML을 작성합니다. 자세한 내용은 MSN의 Add Silverlight to Web Page by Using HTML 문서에 잘 나와있습니다. 

<object width="400" height="300" data="data:application/x-silverlight-2," type="application/x-silverlight-2">
    <param name="source" value="./SilverlightMovieTest.xap"/>
 
    <!-- Display installation image. -->
    <a href="http://go.microsoft.com/fwlink/?LinkID=124807"
        style="text-decoration: none;">
        <img src="http://go.microsoft.com/fwlink/?LinkId=108181"
            alt="Get Microsoft Silverlight"
            style="border-style: none"/>
    </a>
</object>  

<!-- Display installation image. --> 아래 있는 HTML은 실버라이트 런타임이 설치되지 않았을 경우에는 우측과 같은 이미지와 링크를 제공합니다.


사실 간단히 맛만 봐서 '실버라이트2 맛보기'란 제목으로 넣고 싶었는데, 맛보기란 제목이 들어가면 제 의도와는 다른 검색어로 들어 오는 분들이 많으셔서 그냥 둘러 보기로 했습니다.

그동안 몇몇 다른 개발툴들에 대해서 '맛보기' 형식으로 쓴 적이 있는데, MS의 개발툴에 관련된 내용은 처음으로 올리는 것 같습니다. 아무래도 블로그 제목대로 맥을 기반으로한 프로그래밍에 관해 다루어야 한다는 생각이 있었던 것 같은데, 이제부터 관심있는 부분은 가리지 않고 올려 볼려고 합니다.

'C# .NET' 카테고리의 다른 글

C# 제네릭  (1) 2009.02.23
갑자기 애매모호해서 정리쫌...  (0) 2009.02.19
인터프리터의 역할  (0) 2009.01.08
■ 값타입과 참조타입의 메모리 형성의 차이 ■  (0) 2009.01.08
XAML은...  (0) 2008.12.23