삽질의 현장/- .NET

#101_닷넷(.NET)_ WPF_ 개요

shovelman 2015. 11. 24. 14:03



안녕하세요 삽잡이입니다.


얼마나 내용들을 잘 설명했든지 안했는지 잘 모르겠지만...

벌써 닷넷으로만 101번째 시간을 가지고 있습니다.



WPF는 기존 GUI 프로그래밍 방식만을 고집한다면,

쉽게 포기할 수 있는 기술이라고 합니다.

열린 사고로써 모든 걸 포용할 수 있는 

마음을 가져보도록 합시다. 푸하하

   




이번 시간부터는 WPF에 대해서 알아보려고합니다.


WPF는 우선 Windows Presentation Foundation의 약자입니다.

이 WPF는 GUI 프로그램을 생산성 높고, 

효율적으로 만들어주기 위한 FrameWork입니다.


기존에 있던 Window API, MFC, Driect X, WinForm에 이은 GUI Library이지만, 

좀 더 한차원 높은 라이브러리이지요.


WPF의 핵심들은 한가지로만 요약할 수 없도록 여러가지의 요소들이 있습니다.

WPF는 게임 엔진 라이브러리 

즉, 3D 그래픽 프로그램을 위한 Direct X를 기반으로 하고 있습니다.

우리 눈에는 Driect X에 대한 기술을 확인할 수 없지만,

WPF라는 기술 자체가 Presentation Framework

즉, 어떻게 사용자에게 보여줄 것이냐에 대한 라이브러리입니다.


어찌됬건, WPF는 Direct X를 기반으로 라이브러리가 만들어졌습니다.

즉, WPF는 3D, 2D, 그래픽을 다루는 기술이 뛰어나다는 것입니다.

이렇게 그래픽과 관련된 내용 말고도

컨텐츠를 관리하는 모델, 레이아웃 시스템, 바인딩, 

스타일링, 리소스, XAML과 같은 선언언어를 사용한 프로그램이 가능하고,

확장 및 배포가 쉬운 장점이 있습니다.


WPF와 같은 개념을 가진 프로그램은 아직 없습니다.

WPF는 기존 GUI를 개발하며, 

또 다른 방식이 필요함을 느꼈기 때문에 만들어진것입니다.

그 만큼, 기존 기술과 다른 점들이 많다 이겁니다.


그렇다고 이전 기술들이 쓸모없다는 것이 아닙니다.

이전 기술이 없었다면 지금의 WPF와 같은 개념이 존재할 수 없기 때문이지요.


실제로, 기존의 기술을 가져다 쓸 수 있습니다.

그런데, 대부분 혹은 핵심적인 내용에 대해서 

WinForm 것만 가져다 쓰게 되면 WPF를 사용하는 의미가 없겠지요.


아무튼... WPF는 Windows 응용 프로그램을 통합한 

전혀 새로운 프레젠테이션 프레임워크입니다.


 .

기존에 WinForm에서는 

Apllication.Run() 메서드에 Main Form을 넘겼지요.

그러면, Run()이라는 정적메서드가 쓰레드를 띄워 실행을 하되,

Window Main Form으로 선택 된 놈

즉, Main Form으로 넘긴 인자의 윈도우를 Main 윈도우로 설정시켰습니다.


그런데 WPF에서는 그런 코드가 없습니다.

WinForm에서 사용하던 Application.Run() 이라는 정적 메서드와는 달리,

WPF에서는 Application 클래스를 상속 받은 객체를 통해 App 객체를 생성합니다.


Main Window의 경우 어디서든지 Run() 메서드를 수행하기 

직전에 윈도우를 만들어내면 그 윈도우들이 Main 윈도우로써 활동이 가능하지요.


app객체에 내부적으로 있는 StartUp은

윈도우가 시작될 때 발생하는 Event 핸들러를 등록하는 것입니다.

핸들러에서 윈도우 객체 생성 후, 

타이틀 객체를 만들어 윈도우를 보여주는 등의 동작을 합니다.

즉, 윈도우 시작되기 직전에 윈도우를 생성하고 Run() 메서드가 자동으로 호출됩니다.


왜 이렇게 만들어졌는지는 차차 알아보도록 하겠습니다.

윈도우 실행 방식이 이와 같은 방법만 있는 것은 아닙니다.


우선, Visual Studio에서 WPF를 한번 만들어보겠습니다.



WPF에 대한 프로젝트를 만들게되면,

.xaml 형식의 두가지 파일이 생성됩니다.



해당 파일들을 눌러보면 각각의 xaml과 관련된

.cs 파일들이 하나씩 존재하는 것을 확인할 수 있습니다.

해당 파일은 .xaml 파일 아래 cs이 아래 감춰져있다고 해서 

behind 파일이라고 부릅니다.


기본적으로 이 xaml이 두개라는건 cs가 두개라는거고

이 의미는 서로 다른 클래스가 두개 이상 존재한다는 것을 나타냅니다.


 

GUI 프로그램은

UI를 표현하는 영역과, 로직을 표현하는 영역이 있습니다.


로직은 일반적으로 프로그래머 작성하고,

UI는 디자이너, 그래픽 디자이너가 작성합니다.

WPF에서는 이 둘을 분리하는 영역을 사용하지요.


GUI 영역은 XAML 언어로 만들어지고,

로직 영역은 .NET 언어로 만들어져 있습니다.



아무튼, 위의 프로젝트르 생성했을때,

App객체와 Main Window 객체 두개가 생기는 것입니다.

Main Window객체는 사용자에게 보여주기 때문에 UI가 반드시 존재할 것입니다.

따라서, UI 영역을 XAML에서 담당해도 맞는 것입니다.


그런데, APP에는 UI가 있을까요?

APP은 어플리케이션 자체를 의미하고 프로그램 구조, 실행 및 메시지, 

이벤트 처리, 프로그램 동작, 쓰레드 동작등을 마련해줄 수 있는 기능이 존재합니다.


이를 통해서 알 수 있는 사실은,

XAML이 꼭 UI 만을 담당하지 않는다는 것입니다.


XAML은 Mark Up 언어로써, 선언 언어라고 부릅니다.

미리 무엇을 할지 보여주면서 작성하는 언어라는 것입니다.

참고로, 스크립트 언어를 모두 선언 언어라고 부르지요.

이에 Mark Up 언어들은 Text 기반으로 만들어져서 모두 읽을 수 있는 특징이 있습니다.


XAML은 신기하게도,

C#에서 수행할 수 있는 객체들을 모두 생성할 수 있습니다.

(XAML은 MS에서 만들었느니 당연한 소리일지도...)



이전에 보여드렸던 이와 같은 객체를

XAML이라는 언어를 통해 Text상에서도 만들 수 있다 이겁니다.



최종적으로는 로직영역의 .cs파일과 UI영역의 .xaml 파일은 모두 묶여서 

.exe 라는 실행파일로 만들어집니다.


그런데, 내부적으로 이 .xaml 파일은 .cs파일로 한번 컴파일이 되지요.

이게 핵심입니다.


왜 그러면 이렇게 나눠놨을까요?

단지 닷넷의 언어로써 사용하기 편한 것은 닷넷 언어로,

XAML 언어로써 사용하기 편한 것은 XAML 언어로 사용하려고 제공해주는 것입니다.


XAML 언어로 작성할 수 있는 것들은

100% 모두 C#으로 코드 작성이 가능합니다.

즉, 원래는 모두 C#으로 작성해야하지만,

디자인과 관련된 특히 UI와 관련된 것을 XML로 작성하는게 편하기 때문에 

XAML 언어로 작성하게 되는 것이라는 소리죠.


XAML은 로직으로 작성될 수 있는 일부의 코드라는 것입니다.

일부, 부분을 xaml로 작성할 수 있다는 것이죠.


여기서 일부, 부분은 거의 UI와 관련되있습니다.

이 외에 부분들은 C# 즉, 닷넷 언어로 작성하는것이 훨씬 편합니다.

UI와 관련되지 않은 부분은 XAML 언어를 사용하는게 더 어렵다는 것입니다.


UI에 관련된 부분은 디자이너를 위한 부분으로써,

XAML 언어를 통해 사용하기 쉽게 만들도록 제공해주는 것입니다.


다시한번 정리해봅시다.

언어가 다르기 때문에 각각의 영역에 맞게 작성하기 쉽겠지요.

참고로, XAML 코드는 이미지로도 그릴 수있고, C#으로도 구현이 가능합니다.


결론은 두 파일이 합쳐져서 최종적으로.exe파일이 만들어진다 이거죠.

XAML에 모두 다 디자인 콛, UI 코드만 들어있는 것이 아니고,

기본 생성자를 가진 모든 객체들 역시 XAML 코드에서 만들 수 있습니다.


주의해야할 점은

XAML 코드는 cs코드로 한번 더 만들어줘야하는데,

이는 컴파일 시간 때 만들어집니다.

따라서, XAML 코드는 정적인 코드만 담을 수 있다는 소리입니다.


Run Time 때 사용자의 Input을 받고 그에 맞는 행동을 취하고 싶다면?

사용자와 소통해야하는데 XAML에는 구현이 불가하다는 것입니다.


따라서, XAML은 정적인 개념, 

UI의 개념을 표현하기 위해 분류해놓은 것입니다.

로직은 행동, 동적인 개념을 표현하고 작성하기 위해 분류해놓은 것이구요.


어느 영역에서 뭘 해야할지에 대한 기준은

XAML에서 수행하는 것이 효율적이라면 XAML!

로직에서 수행하는 것이 효율적이라면 로직에서!

생각하고 어디서 뭘 어떻게 해야할지 판단하시면 됩니다.


물론, 로직에서 다 처리할 수 있습니다.



몇번이나 말하니...?   




XAML에서 효율적인 것은 정적이면서도 UI와 관련된 부분이기 때문에

로직에서 하지 않고 쉽게할 수 있다 이겁니다.


WPF는 이와 같이 .NET의 언어와 XAML 언어 

이 두 가지의 언어로 프로그래밍을 한다고 생각하시면 됩니다.


다음시간부터 어디 한번 나가 보도록 하겠습니다.


이상 삽잡이였습니다!