C#,Delphi,Oracle,MSSQL 개발자블로그

WinForm과 WPF 본문

Programming/C#

WinForm과 WPF

19760323 2018. 7. 12. 16:31

WinForm은 .Net 1.0 부터 지원되는 윈도우 기반 데스크탑 어플리케이션을 만들기 위한 프레임워크이다.

WPF는 .Net 3.0 부터 지원되는 프레임워크로서 이 또한 윈도우 기반 어플리케이션을 만들 수 있는 기능이 주다.

 

두 프레임워크 간의 차이를 살펴보면,

일단 WinForm은 컨트롤을 배치하면 자동으로 그 컨트롤을 생성하는 코드가 제너레이트 된다. 하지만 WPF는 XAML이라고 불리는 XML에 생성된다.(WPF도 XAML없이 코드 만으로 생성할 수도 있다.)

또 하나의 차이점이라면 WinForm은 순전히 운영체제에서 실행되는 어플리케이션이지만, WPF는 일반 어플리케이션으로 만들 수도 있고, 인터넷 익스플로러에서 실행되게 만들 수도 있다.

 

그러나 이런 차이점에도 불구하고 이 두 프레임워크 간의 기능이 중복되는 것 같은 느낌은 지울 수 없다.

Visual Studio를 사용해서 두 종류의 프로그램을 만드는 절차가 비슷하다. 화면에 버튼과 텍스트 박스 등의 컨트롤을 올려두고, 이벤트를 처리하고.

 

 WPF에는 XAML이 있지 않냐고 반문할 수도 있지만, 사실 단순히 XAML의 존재가 중요한 것이라면, XAML을 WinForm과 통합하는 것이 비용이 적게 들지 않겠는가? XAML로 WinForm의 컨트롤들을 생성하도록 하는 것 말이다.

그런데 살펴보면 WinForm은 클래스 들은 System.Windows.Forms 안에 들어 있고, WPF은 System.Windows에 있다.

이 말은 WPF은 WinForm을 이용하는 것이 아니라 완전히 새로 만들었다는 말이다. (예를 들어 WinForm의 Button은 System.Windows.Forms.Button이고 WPF의 Button은 System.Windows.Controls.Button이다.)

 

마이크로소프트는 왜 이런짓을 했을까? WinForm에 뭐가 아쉬워서 이렇게 새로운 프레임워크를 만들어 냈을까?

 

그럼 두 프레임워크가 만들어내는 윈도우 기반 어플리케이션이 정말 같을까?

일단 두 프레임워크가 만들어내는 어플리케이션을 Spy++로 살펴보자. 간단히 윈도우에 버튼과 텍스트 박스 하나씩 넣은 것이다.

 

우선 WinForm으로 만든 것이다.

 

그리고 WPF로 만든 것이다.

 

 

무엇이 다른지 알겠는가?

바로 버튼과 텍스트 박스가 자체적으로 윈도우이냐 아니냐의 차이다.

 

이 차이가 무엇을 의미하는지, 왜 중요한지 생각해 보자.

 

전통적으로 윈도우 기반 어플리케이션의 컨트롤들은, 그 자체적으로 또 하나의 윈도우다.

여기서 윈도우라고 하는 것은 Windows 운영체제가 관리하는 윈도우 객체로서, CreateWindow류 API를 통해 운영체제가 만들어 주고 관리하는 윈도우라는 말이다.

따라서 Spy++로 살펴보면 그런 컨트롤도 검색해 낼 수 있다.

 

WinForm으로 만든 어플리케이션의 Spy++ 정보를 살펴보면, WinForm 역시 내부적으로는, 컨트롤에 대해 CreateWindow를 호출하여 윈도우 객체를 생성하고 있다고 추정할 수 있다.

 

그러나 WPF는 가장 최상위의 윈도우만 나타난다.

그 말은 최상위 윈도우만 CreateWindow를 해서 윈도우 객체를 생성하고 나머지 컨트롤들은 WPF가 적접 그린다는 말이다. 버튼 부터 텍스트 박스 등등의 컨트롤들을 직접 그린다는 말이다. 또한 직접 그린 컨트롤이라고 하더라도 포커스나 마우스 이벤트, 키보드 이벤트에 대한 반응도 모두 구현되어 있다. 헉!

 

왜 마이크로소프트는 이런 걸 또 만들었을까?

 

다음 글에서 그 이유는 좀 더 생각해보자.

Comments