프로그래밍/xamarin

xamarin 강좌 004. 안드로이드, 아이폰, 윈도우, 플랫폼마다 다르게 실행되는 코드 만들기

panpro 2018. 9. 12. 20:16




xamarin은 마이크로소프트에서 Visual Studio와 함께 무료로 배포하고 있는 스마트폰 앱개발 툴입니다. 


xamarin은 크로스 플랫폼(cross platform) 기술로 한번 코드를 작성해 놓으면 안드로이드, 아이폰, 윈도우에서 실행되는 스마트폰 앱을 한꺼번에 만들 수 있는 강력한 도구입니다. 




xamarin 강좌 이전 글



xamarin 강좌 4번째 시간으로, 


안드로이드, 아이폰, 윈도우(UWP)에서 각각 실행되는 코드를 만드는 법을 소개합니다. 


초보 개발자라면 이 부분이 많이 어려우실 텐데요, 

xamarin을 이해하기 위해 꼭 필요한 부분이라 강좌의 초반부에 배치했습니다. 


당장은 이해하기 어려워서 포기하실수 있는데요, 머잖아 이 강좌로 꼭 다시 돌아오시게 될 거에요. ^^;



전화를 걸거나 메시지 상자를 보여주거나 하는 부분은 xamarin에서 처리하지 않고 안드로이드나 아이폰, 윈도우폰 등 각각의 플랫폼에서 자체적으로 처리하도록 하고 있어요. 



이런 식으로 되어 있는데요, 


IDialer라는 인터페이스를 만들어 놓고, 

각각의 플랫폼에 있는 클래스들에서 이 IDialer를 구현(Implementation)하고 있어요. 


그리고, xamarin의 DependencyService에서 각 플랫폼한테 IDialer 인터페이스를 구현한 클래스의 인스턴스를 달라고 요청하면 위에서 보이는 것처럼 Caller_android 클래스의 인스턴스 등을 넘겨줍니다. 


그럼 IDialer 인터페이스의 함수를 호출해 해당 플랫폼에서만 실행되는 코드를 호출할 수 있게 됩니다. 




인터페이스(Interface) 에 대해 잘 모르시면 이게 잘 이해가 안 되실 텐데요.

interface는 User Interface가 아닌 프로그램간의 약속이에요. 



예를 들어, 


public interface IDialer

{

   bool dial(string strPhoneNumber);

}



이렇게 인터페이스를 만들어 놓으면, 


이 인터페이스를 구현하겠다고 명시한 클래스들은 반드시 저 bool dial(string strPhoneNumber) 함수를 구현해야만 합니다. 


약속이죠. 


클래스가 인터페이스를 구현하겠다고 명시하는 방법은, 


public class Caller_android : IDialer

{


}


이에요.



약속으로 정한 만큼, Caller_android 클래스가 IDialer 인터페이스에 있는 bool dial(string strPhoneNumber) 같은 함수들을 모두 구현하지 않으면 컴파일 자체가 되질 않아요. 


약속으로 정했으니, 


이제는 IDialer 인터페이스를 구현한 클래스를 달라고 해서 받기만 하면, 그 클래스에는 무조건 bool dial(string strPhoneNumber) 함수가 있는 거에요.


그래서 맘놓고 dial()  함수를 실행할 수 있게 되는거죠. 




^^;

어렵지만 xamarin을 하면 꼭 해야 하는 부분이에요. 

미리 알수록 더 좋구요. 



이렇게 하면 각각의 플랫폼에서 각자 실행되는 코드를 만들 수 있어요.


똑같은 화면에서 똑같은 버튼을 눌러도, 

아이폰에서는 빨간색 공이 튀어나오지만, 

안드로이드폰에서는 파란색 공이 튀어나오는 코드를 만들 수도 있는거죠. 



전화를 거는 것처럼 플랫폼에 의존하는 코들을 이런 식으로 만들어요. 

그래서 똑같은 UI에서 각각 플랫폼마다 다른 코드를 실행할 수 있는거죠. 


진정한 크로스 플랫폼이 되기 위한 방법이죠.



위 예에서 각각의 플랫폼에게 IDialer 인터페이스를 구현한 클래스의 인스턴스를 달라고 요청하는 방법은

아주 간단해요. 딱 한줄,


var dialer = DependencyService.Get<IDialer>();



그리고 저 dialer가 null인지 아닌지 체크한 다음, null이 아니면


dialer.dial("010-1234-1234");


와 같이 실행할 수 있게 되는거죠.



이렇게 하면 각각의 플랫폼마다 IDialer를 구현한 클래스에 있는 기능들이 실행됩니다. 


간단하죠.


그리고 이렇게 각각의 플랫폼에서 IDialer 인터페이스를 구현한 클래스에는 윗부분에 



[assembly: Dependency(typeof(Caller_android))]



이렇게 한줄만 코드를 넣어주면 되요. 



간단하죠?



전체 소스코드는 다음과 같습니다. 



[공용코드부분]


IDialer.cs


using System;

using System.Collections.Generic;

using System.Text;


namespace xa004

{

    public interface IDialer

    {

        bool dial(string strPhoneNumber);

    }

}




MainPage.xaml


<?xml version="1.0" encoding="utf-8" ?>

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"

             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"

             xmlns:local="clr-namespace:xa004"

             x:Class="xa004.MainPage">


    <StackLayout>

        <!-- Place new controls here -->

        <Label Text="Welcome to Xamarin.Forms!" 

           HorizontalOptions="Center"

           VerticalOptions="CenterAndExpand" />

        <Button Text="전화" Clicked="Button_Clicked" />

    </StackLayout>


</ContentPage>







MainPage.xaml.cs


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using Xamarin.Forms;


namespace xa004

{

    public partial class MainPage : ContentPage

    {

        public MainPage()

        {

            InitializeComponent();

        }


        private void Button_Clicked(object sender, EventArgs e)

        {

            var dialer = DependencyService.Get<IDialer>();

            dialer.dial("010-1234-1234");

        }

    }

}





[안드로이드 코드부분]


Caller_android.cs


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


using Android.App;

using Android.Content;

using Android.OS;

using Android.Runtime;

using Android.Views;

using Android.Widget;

using xa004.Droid;

using Xamarin.Forms;


[assembly: Dependency(typeof(Caller_android))]

namespace xa004.Droid

{

    class Caller_android : IDialer

    {

        public bool dial(string strPhoneNumber)

        {

            System.Diagnostics.Debug.WriteLine("안드로이드에서 전화를 걸고 있습니다.");

            return true;

        }

    }

}






[UWP 코드부분]


Caller_UWP.cs


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using xa004.UWP;

using Xamarin.Forms;


[assembly: Dependency(typeof(Caller_UWP))]

namespace xa004.UWP

{

    class Caller_UWP : IDialer

    {

        public bool dial(string strPhoneNumber)

        {

            System.Diagnostics.Debug.WriteLine("UWP에서 전화를 걸고 있습니다.");

            return true;

        }

    }

}



전체 강의는 다음 xamarin 동영상 강좌로 확인하세요.