'2017/11'에 해당되는 글 4건

Programming/.NET

흔히 문자열을 출력하는 경우를 보겠습니다.

 

string s = "guest";

Console.WriteLine("안녕하세요. {0}님", s);

 

여기서 문자열 보간기능을 하는 $문자를 사용하면 다음처럼 간단히 문자열 표현이 가능합니다.

 

string s = "guest";

Console.WriteLine($"안녕하세요. {s}님");

 

문자열 보간은 컴파일시에 단지 소스코드를 string.Format변환할 뿐이므로 string.Format형식에 맞는 포멧을 지정할 수 있습니다.

 

Console.WriteLine($"안녕하세요. {s.ToUpper()}님");

 

'Programming > .NET' 카테고리의 다른 글

[C#] Assembly  (0) 2017.12.13
[C#] LINQ  (0) 2017.12.05
[C#] 문자열 보간 ($)  (0) 2017.11.28
[C#] ArrayList  (0) 2017.11.14
[C#] 선택적 매개변수  (0) 2017.11.07
[C#] Task  (0) 2017.11.01
0 0
Programming/.NET

System.Collections.ArrayList를 사용하면 object형및 그와 호환가능한 모든 타입을 배열로 처리할 수 있습니다. 단순 배열이라면

 

string[] s = new string[10];

 

위와 같은경우 문자열만 담을 수 있지만 ArrayList는

 

System.Collections.ArrayList al = new System.Collections.ArrayList();
al.Add("abc");
al.Add(123);
al.Add(true);

 

예제와 같은 형태의 처리가 가능합니다. 다만 요소에 따라 박싱(Boxing)이 발생할 수 있기에 성능면에서는 약점이 있습니다.

 

또한 배열은 처음부터 크기가 정해져 있으나 ArrayList에서는 Add메서드를 호출하여 추가하는만큼 유동적으로 크기가 늘어날 수 있습니다. 물론 배열에서도 s = new string[20] 처럼 할 수는 있으나 기존 값을 유지하지는 못합니다.

 

ArrayList에서 요소삭제는 Remove() 메서드를 사용합니다.

 

al.Remove(123);

 

정렬은 Sort 메서드에서 수행할 수 있습니다.

 

al.Sort();

 

다만 Sort는 ArrayList의 내부요소가 모두 같은 타입이어야만 가능합니다. 그렇지 않은 상태면 예외가 발생합니다.

 

정렬하고자 하는 타입이 사용자 정의 형식이라면 IComparer 인터페이스를 구현해 Sort를 호출할때 인자로 전달하거나 정의형식을 만들때 IComparable을 상속하여 내부적으로 정렬메서드를 구현하면 됩니다.

 

public class Employee : IComparable
{
    public Employee()
    { }
    public Employee(string name, string department, int age)
    {
        Name = name;
        Department = department;
        Age = age;
    }

    public string Name
    {
        get;
        set;
    }

    public string Department
    {
        get;
        set;
    }

    public int Age
    {
        get;
        set;
    }

    public int CompareTo(object o)
    {
        Employee e = (Employee)o;

        if (this.Age > e.Age)
            return 1;
        else if (this.Age < e.Age)
            return -1;
        else
            return 0;
    }
}

 

IComparable을 상속하면 CompareTo메서드를 반드시 구현해야 하며 해당 메서드 안에서 어떤 기준으로 요소를 정렬할지에 대한 조건과 그 조건에 해당하는 반환값을 가지도록 하면 됩니다.

 

System.Collections.ArrayList al = new System.Collections.ArrayList();
al.Add(new Employee("hong", "it", 30));
al.Add(new Employee("choi", "it", 27));
al.Add(new Employee("kim", "it", 42));
al.Sort();

foreach (Employee e in al)
    Console.WriteLine(e.Age);

 

'Programming > .NET' 카테고리의 다른 글

[C#] LINQ  (0) 2017.12.05
[C#] 문자열 보간 ($)  (0) 2017.11.28
[C#] ArrayList  (0) 2017.11.14
[C#] 선택적 매개변수  (0) 2017.11.07
[C#] Task  (0) 2017.11.01
[C#] BigInteger  (0) 2017.10.24
0 0
Programming/.NET

메서드 구현시 매개변수에 값이 지정되지 않으면 미리 정해놓은 값을 사용하도록 하는 경우가 있습니다. 대부분 이렇게 하려면 메서드를 오버로드하는 것으로 해결하곤 합니다.

 

static void Main(string[] args)
{
    input_member("홍길동");
    input_member("홍길동", 30);
    input_member("홍길동", 30, "seoul");

    Console.Read();
}

static void input_member(string name)
{
    input_member(name, 30, "seoul");
}

static void input_member(string nameint age)
{
    input_member(nameage"seoul");
}

static void input_member(string nameint agestring address)
{
    //처리
}

 

하지만 선택적 매개변수를 사용하면 단 하나의 메서드로 위와 같은 기능을 구현할 수 있습니다.

 

static void Main(string[] args)
{
    input_member("홍길동");
    input_member("홍길동", 30);
    input_member("홍길동", 30, "seoul");

    Console.Read();
}

static void input_member(string nameint age = 30, string address = "seoul")
{
    input_member(name, 30, "seoul");
}

 

메서드를 호출할때도 특정 매개변수를 지정해 값을 전달할 수 있습니다. 이런 경우에는 매개변수의 순서를 무시할 수 있습니다.

 

input_member(age: 30, name"홍길동"address"seoul");

'Programming > .NET' 카테고리의 다른 글

[C#] 문자열 보간 ($)  (0) 2017.11.28
[C#] ArrayList  (0) 2017.11.14
[C#] 선택적 매개변수  (0) 2017.11.07
[C#] Task  (0) 2017.11.01
[C#] BigInteger  (0) 2017.10.24
[ASP.NET MVC] 다중 모델 사용하기 (Tuple)  (0) 2017.10.18
0 0
Programming/.NET

Task는 비동기 호출에 사용될 수 있습니다.

 

static void Main(string[] args)
{
    Task t = new Task(() => {
        getMyData();
    });
    t.Start();

    Console.WriteLine("현재 스레드 완료");
    Console.Read();
}

static void getMyData()
{
    using (FileStream fs = new FileStream("test.txt"FileMode.OpenFileAccess.ReadFileShare.None)) {
        byte[] b = new byte[fs.Length];
        fs.Read(b, 0, b.Length);

        string s = Encoding.UTF8.GetString(b);
        Console.WriteLine(s);
    }
}

 

Task는 Action타입의 델리게이트를 매개변수로 받으므로 여기에 작업항목을 지정하고 Start 메서드를 호출하면 ThreadPool의 여유스레드를 통해 내부 코드를 비동기로 수행하게 됩니다.

 

기본이 비동기이므로 작업진행과 완료가 따로 처리되겠지만 만약 완료시까지 다음 실행을 대기시켜야 한다면 Start 호출이 후 Wait 메서드를 호출해야 합니다.

 

static void Main(string[] args)
{
    Task<string> t = new Task<string>(() => {
        return getMyData();
    });
    t.Start();

    Console.WriteLine("현재 스레드 완료");

    Console.WriteLine(t.Result);
    Console.Read();
}

static string getMyData()
{
    using (FileStream fs = new FileStream("test.txt"FileMode.OpenFileAccess.ReadFileShare.None)) {
        byte[] b = new byte[fs.Length];
        fs.Read(b, 0, b.Length);

        string s = Encoding.UTF8.GetString(b);

        return s;
    }
}

 

Task는 반환값이 없는 경우 사용되며 특정 값을 반환받는 경우라면 Task<T>형식을 사용해야 합니다. 이때는 결과값을 갖는 Func 타입의 델리게이트를 매개변수로 넘겨야 합니다. 그리고 받은 값은 t.Result로 가져올 수 있습니다.

 

static void Main(string[] args)
{
    Task.Factory.StartNew(() => { getWebData();  });

    Console.WriteLine("현재 스레드 완료");
    Console.Read();
}

static void getMyData()
{
    using (FileStream fs = new FileStream("test.txt"FileMode.OpenFileAccess.ReadFileShare.None)) {
        byte[] b = new byte[fs.Length];
        fs.Read(b, 0, b.Length);

        string s = Encoding.UTF8.GetString(b);
        Console.WriteLine(s);
    }
}

 

Task는 일일이 객체를 생성할 필요없이 Factory의 StartNew메서드를 사용하여 작업을 비동기로 수행할 수 있습니다.

 

static void Main(string[] args)
{
    Task<string> T = Task.Factory.StartNew(() => { return getMyData();  });

    Console.WriteLine("현재 스레드 완료");

    Console.WriteLine(T.Result);
    Console.Read();
}

static string getMyData()
{
    using (FileStream fs = new FileStream("test.txt"FileMode.OpenFileAccess.ReadFileShare.None)) {
        byte[] b = new byte[fs.Length];
        fs.Read(b, 0, b.Length);

        string s = Encoding.UTF8.GetString(b);
        return s;
    }
}

 

물론 값을 가져오는 경우에도 구현이 가능합니다.

 

이렇게 Task를 사용해 비동기호출로 코드를 실행하는 방식은 심지어 비동기 호출에 사용되는 async / await를 지원하지 않는 메서드에도 async / await를 사용할 수 있는 방법을 제공합니다.

 

static void Main(string[] args)
{
    callMethod();
    Console.WriteLine("현재 스레드 완료");
    Console.Read();
}

static async void callMethod()
{
    string s = await getFileData();
    Console.WriteLine(s);
}

static Task<stringgetFileData()
{
    return Task.Factory.StartNew(() => { return getMyData()});
}

static string getMyData()
{
    using (FileStream fs = new FileStream("test.txt"FileMode.OpenFileAccess.ReadFileShare.None)) {
        byte[] b = new byte[fs.Length];
        fs.Read(b, 0, b.Length);

        string s = Encoding.UTF8.GetString(b);
        return s;
    }
}

 

async / await에서 await는 Task타입을 반환받는 메서드에만 사용할 수 있으므로 Task 형식을 반환하는 메서드를 임의로 구현한 뒤에 해당 메서드를 호출할때 await를 붙여주기만 하면 됩니다.

'Programming > .NET' 카테고리의 다른 글

[C#] ArrayList  (0) 2017.11.14
[C#] 선택적 매개변수  (0) 2017.11.07
[C#] Task  (0) 2017.11.01
[C#] BigInteger  (0) 2017.10.24
[ASP.NET MVC] 다중 모델 사용하기 (Tuple)  (0) 2017.10.18
[C#] dynamic 과 덕 타이핑(duck typing)  (0) 2017.10.10
0 0
1
블로그 이미지

클리엘