2017년 2월 20일 월요일

Thread.Sleep vs Task.Delay

Thread.Sleep은 해당 스레드를 차단하고 시간을 기다린다. (blocking)
Task.Delay는 해당 스레드에게 흐름을 넘기고 논리적으로 시간을 기다린다. (non-blocking)

간단한 예시
Thread.Sleep

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            p.Go();
        }
        void Method()
        {
            Thread.Sleep(3000);
            Console.WriteLine("Method()");
        }
        void Go()
        {
            Method();
            while (true)
            {
                Thread.Sleep(300);
                Console.Write("1");
            }
        }
    }
cs

0.3초마다 "1"을 출력하는 스레드에서 Thread.Sleep을 호출해보았다.
 다음과 같이 3초간 기다린후 "Method()" 호출이 된 이후에야 스레드가 진행되는 것을 확인 할 수 있다.









Task.Delay

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            p.Go();
        }
        async void MethodAsync()
        {
            await Task.Delay(3000);
            Console.WriteLine("MethodAsync()");
        }
        void Go()
        {
            MethodAsync();
            while (true)
            {
                Thread.Sleep(300);
                Console.Write("1");
            }
        }
    }
cs


반면 Task.Delay를 비동기적으로 실행해 주니 "1"을 출력하는 흐름을 막지 않고 3초가 지난 이후에 "MethodAsync()"가 출력되는 모습이 보인다.



















2017년 2월 18일 토요일

interface vs abstract class

인터페이스와 추상클래스의 차이점을 묻는 면접 문제를 접하게 되었다. 그리고 정말 처참히 몰랐다. 그래서 대충 얼버무리고 나오고 구글에서 검색을 해보니 대충 얼버무린 말이 너무 초라해졌다. 그래서 잠깐 정리...

우선 링크를 걸어놓겠다.

Interface
  • 상태(data members), 구현(methods)을 가질 수 없다.
  • 구현하는 클래스는 반드시 함수를 정의해 주어야 한다.
  • 다중 상속이 가능하다.
  • 클래스의 명세(specification)만 제공
Abstract Class
  • 상태, 구현을 가질 수 있다.
  • 다중 상속이 불가능 하다.
  • 클래스의 구체적인 modelling을 제공, 즉 구체적인 구현이 가능하다.

그니까 Interface는 상관 없는 클래스들에게 공통적인 능력(ability)를 부여하는 것이고.
Abstract Class는 연관 관계가 있는 클래스들에게 공통적인 뼈대를 제공하는 것이라고 보면 된다.

Interface와 상태, 구현이 없는 Abstract Class의 차이점

interface는 여전히 다중 상속이 가능하지만 Abstract Class는 다중 상속이 불가능 하다는 점. 그리고 Abstract Class는 반드시 abstract인 함수를 override해야한다는 점.