티스토리 뷰



List of All New Features in C# 6.0: Part 2


마이크로 소프트는 Visual Studio 2015에서 사용되는 C# 6.0에 대한 새로운 키워드와 기능들을 발표하였습니다. 



이 글에서는 아래의 주제를 다루도록 할것입니다. 


  • nameof 표현방식
  • Exception 필터
  • Catch-Finally 블록에서의 기다림


테스트를 위해서 VS 2015를 시작하고 프로젝트를 생성하십시오. 콘솔 어플리케이션을 선택하고 프로젝트를 생성합니다. 



OK 버튼을 누르고, Solution Explorer을 확인합니다. Program.cs를 통해서 앞으로의 내용을 테스트 해볼 것입니다. 



4. nameof 키워드


nameof는 C# 6.0의 새로운 키워드입니다. 이 키워드는 개발자가 프로퍼티나, 메소드 혹은 데이터 멤버의 이름을 사용하고자 할 때 하드 코딩된 이름을 사용할 필요가 있습니다. nameof를 사용하게 되면 프로퍼티 또는 메소드에 대한 이름을 문자열로 사용할 수 있습니다. nameof가 없는경우 프로그램상에서 이름으로 사용된 수많은 개체를 사용자가 일일이 바꿔야 하는 문제점을 가지고 있었습니다. 이는 개발자에게 많은 부하를 제공하였으며, 또한 소스코드에서 수많은 케이스를 통해서 이름을 사용하기 때문에 수정에 대한 문제가 발생을 하면 모든 내용을 수정하기는 어렵습니다. 


C# 6.0에서는 이러한 부분을 따로 구현하지 않아도 nameof를 통해서 함수, 프로퍼티, 데이터 멤버에 대한 이름을 사용할 수 있습니다. 

아래와 같은 Employee 클래스가 있다고 가정을 해 보겠습니다. 



C# 6.0에서는 하드코딩된 이름이 아닌 nameof 키워드를 사용하여 이름을 출력할 수 있습니다. 아래는 이름을 출력하기 위한 예입니다. 



[출력 결과]



[Code]


using System;  

using System.Collections.Generic;  

using System.Linq;  

using System.Text;  

using System.Threading.Tasks;  

using System.Console;  

namespace Project4  

{  

    class Program  

    {  

        static void Main(string[] args)  

        {  

            Employee emp = new Employee();  

            WriteLine("{0} : {1}", nameof(Employee.Id), emp.Id);  

            WriteLine("{0} : {1}", nameof(Employee.Name), emp.Name);  

            WriteLine("{0} : {1}", nameof(Employee.Salary), emp.Salary);  

            ReadLine();  

        }  

    }  

    class Employee  

    {  

        public int Id { get; set; } = 101;  

        public string Name { get; set; } = "Nitin";  

        public int Salary { get; set; } = 9999;  

    }  

}   


5. Exception(예외) 필터


예외 필터는 C# 6.0에서 새로이 제안된 컨셉입니다. 이는 Visual Basic 컴파일러에서는 지원이 되었고, C# 6.0에서 사용을 할 수 있습니다. 예외 필터는 catch 블록에서의 조건을 정의할 수 있습니다. 따라서 이 조건이 만족할 때만 예외를 실행하게 할 수 있습니다. 이 컨셉은 C# 6.0의 가장 필수적인 요소로써, 많은 양의 코드에서 예외를 필터를 쉽게 처리할 수 있도록 제공합니다. 예를 한번 살펴보겠습니다. 




[Code]


using System;  

using System.Collections.Generic;  

using System.Linq;  

using System.Text;  

using System.Threading.Tasks;  

using System.Console;  

namespace project5  

{  

    class Program  

    {  

        static void Main(string[] args)  

        {  

            int val1 = 0;  

            int val2 = 0;  

            try  

            {  

                WriteLine("Enter first value :");  

                val1 = int.Parse(ReadLine());  

                WriteLine("Enter Next value :");  

                val2 = int.Parse(ReadLine());  

                WriteLine("Div : {0}", (val1 / val2));  

            }  

            catch (Exception ex) if (val2 == 0)  

            {  

                WriteLine("Can't be Division by zero ?");  

            }  

            catch (Exception ex)  

            {  

                WriteLine(ex.Message);  

            }  


            ReadLine();  

        }  

    }  

}  


[Output]


사용자에 의에 입력되는 값이 2이면 예외가 발생을 합니다. 




사용자가 나누기를 위한 값으로 0과 같이 잘못된 값을 입력하게되면, Exception Filtration에 의해 처리되는 예외를 던지게 됩니다. 이 예외는 catch 구문 뒤에 쓰여진 if 구문에 맞게 처리됩니다. 


6. Catch-Finally 블록에서의 기다림


이 내용은 C# 6.0에서 새로이 처리되는 개념으로 Catch나 Finnaly 구문 내에서 비동기 메소드(Async Method)를 호출할 수 있게 합니다. 비동기 메소드를 사용하는 것은 매우 유용합니다. 프로그램을 처리하면서 비동기적으로 함수를 호출할 수 있기 때문에 Aync 함수를 기다리면서 Catch, Finally 문에 추가적인 코드를 넣을 수 있습니다. 비동기 메소드를 호출하고 Try-Catch-Finally 구문이 있다고 가정을 해봅시다. 예외가 호출될 때 이는 Catch구문을 실행할 것입니다. 이에 대한 Log를 저장하거나 서버에 예외에 대한 정보를 전송하고 할 때 비동기 함수를 호출할 수 있습니다. 


클래스내에 비동기 함수가 있다고 생각을 해보겠습니다. 사용자는 이 함수를 호출하기 위해서 2개의 파라미터를 이용해야 하고, 만약 예외가 발생을 한다면 예외가 호출이 될 것이며 Catch 블록으로 들어가 비동기 함수를 호출할 것입니다. 이 비동기 함수는 호출하고, 동시에 Finally 구문을 호출할 수 있습니다. 


비동기 함수란?

비동기는 응용 프로그램이 웹에 액세스하는 경우와 같이 차단 가능성이 있는 작업에 반드시 필요합니다. 웹 리소스에 대한 액세스는 때때로 속도가 느려지거나 지연됩니다. 동기 프로세스 안에서 이러한 활동이 차단되면 전체 응용 프로그램이 기다려야 합니다. 비동기 프로세스에서 응용 프로그램은 잠재적인 차단 작업이 완료될 때까지 웹 리소스에 의존하지 않는 다른 작업을 계속 수행할 수 있습니다.


기존에 비동기 함수는 Delegate를 이용하여 많이 사용되었다. 




테스트코드의 Main 함수에서 예외가 비동기로 처리되는 div 함수를 호출합니다.




[Code]


using System;  

using System.Collections.Generic;  

using System.Linq;  

using System.Text;  

using System.Threading.Tasks;  

using System.Console;  

namespace project6  

{  

    class Program  

    {  

        static void Main(string[] args)  

        {  

            MyMath obj = new MyMath();  

            obj.Div(12, 0);  

            ReadLine();  

        }  

    }  

    public class MyMath  

    {  

        public async void Div(int value1, int value2)  

        {  

            try  

            {  

                int res = value1 / value2;  

                WriteLine("Div : {0}", res);  

            }  

            catch (Exception ex)  

            {  

                await asyncMethodForCatch();  

            }  

            finally  

            {  

                await asyncMethodForFinally();  

            }  

        }  


        private async Task asyncMethodForFinally()  

        {  

            WriteLine("Method from async finally Method !!");  

        }  

  

        private async Task asyncMethodForCatch()  

        {  

            WriteLine("Method from async Catch Method !!");  

        }  

    }  

}  


[Output]


예외가 발생하지 않으면, Finally 구문만 호출됩니다. 





예외가 발생하면 아래와 같이 처리가 됩니다. 


at the time of exception



이 글은 c-shartcornet.com의 글을 한글 번역한 내용입니다. 

List of All New Features in C# 6.0: Part 1 [링크]


이 글에서는 C# 6.0의 변경 사항 중 4) nameof 명령어, 5) 예외 필터, 6) 예외에서 비동기 함수 호출에 대해서 알아보았습니다.


이 글이 도움이 되셨나요?

그렇다면 아래의 그림을 클릭해주세요.



댓글