Objective-C 개발자용 C# 입문서C# Primer for Objective-C Developers

Xamarin.iOS를 사용하면 C#에서 작성된 플랫폼 제약 없는 코드를 플랫폼 간에 공유할 수 있습니다. 그러나 기존 iOS 애플리케이션은 이미 만들어진 Objective-C 코드를 활용하려 할 수 있습니다. 이 문서는 Xamarin 및 C# 언어로 이동하려는 Objective-C 개발자를 위한 간단한 입문서입니다.Xamarin.iOS allows platform-agnostic code written in C# to be shared across platforms. However, existing iOS applications may want to leverage Objective-C code that has already been created. This article serves as a short primer for Objective-C developers looking to move to Xamarin and the C# language.

Objective-C에서 개발된 iOS 및 OS X 애플리케이션은 플랫폼별 코드가 필요 없는 곳에서 C#을 활용하여 Xamarin의 장점을 얻을 수 있으며, 이러한 코드를 Apple 이외의 디바이스에서 사용할 수 있습니다.iOS and OS X applications developed in Objective-C can benefit from Xamarin by leveraging C# in places where platform-specific code is not required, allowing such code to be used on non-Apple devices. 그리고 웹 서비스, JSON, XML 구문 분석 같은 것들과 사용자 지정 알고리즘을 플랫폼 간 방식으로 사용할 수 있습니다.Things such as web services, JSON and XML parsing, and custom algorithms can then be used in a cross-platform manner.

Objective-C 자산을 유지하면서도 Xamarin을 활용하려면 바인딩이라고 하는 Xamarin의 기술로 Xamarin을 C#에 노출하면 됩니다. 그러면 Objective-C 코드가 관리 C# 세계에 표시됩니다.To take advantage of Xamarin while maintaining existing Objective-C assets, the former can be exposed to C# in a technology from Xamarin known as bindings, which surface Objective-C code to the managed, C# world. 또한 원한다면 코드를 한 줄씩 C#으로 이식할 수 있습니다.Also, if desired, code can be ported line-by-line to C# as well. 하지만 바인딩을 사용하든 아니면 이식을 사용하든, 기존 Objective-C 코드를 Xamarin.iOS에 효율적으로 활용하려면 Objective-C 및 C#에 대한 약간의 지식이 필요합니다.Regardless of the approach however, whether it be binding or porting, some knowledge of both Objective-C and C# is necessary to effectively leverage existing Objective-C code with Xamarin.iOS.

Objective-C 상호 운용성Objective-C Interop

현재 Xamarin.iOS를 사용하여 Objective-C에서 호출 가능한 라이브러리를 C#으로 만드는 메커니즘은 지원되지 않습니다.There is currently no supported mechanism to create a library in C# using Xamarin.iOS that can be called from Objective-C. 주요 이유는 바인딩 외에도 Mono 런타임이 필요하기 때문입니다.The main reason for this is the Mono runtime is also required in addition to the binding. 하지만 사용자 인터페이스를 포함한 대부분의 논리는 여전히 Objective-C로 만들 수 있습니다.However, you can still create the majority of your logic in Objective-C, including user interfaces. 이렇게 하려면 라이브러리에 Objective-C 코드를 래핑하고 그에 대한 바인딩을 만듭니다.To do this, wrap the Objective-C code in a library and create a binding to it. 애플리케이션을 부트스트랩하려면 Xamarin.iOS가 필요합니다(Main 진입점을 만들어야 한다는 의미).Xamarin.iOS is needed to bootstrap the application (meaning it must create the Main entry point). 그 후, 그 외의 다른 논리는 Objective-C에서 바인딩을 통해(또는 P/Invoke를 통해) C#에 노출할 수 있습니다.After that, any other logic can be in Objective-C, exposed to C# through the binding (or via P/Invoke). 이러한 방식으로 플랫폼 관련 논리는 Objective-C로 유지하고 플랫폼 중립적 부분은 C#으로 개발할 수 있습니다.This way, you can keep the platform specific logic in Objective-C and develop the platform agnostic parts in C#.

이 문서는 기존 Objective-C 코드로 바인딩하든 아니면 C#으로 이식하든, C# 및 Xamarin.iOS로 전환하는 개발자를 위한 입문서로써 두 언어의 비슷한 점과 차이점을 설명합니다.This article highlights some key similarities, as well as contrasts several differences in both languages to serve as a primer when moving to C# with Xamarin.iOS, whether binding to existing Objective-C code, or porting it to C#.

바인딩을 만드는 방법에 대한 자세한 내용은 Objective-C 바인딩의 다른 문서를 참조하세요.For details on creating bindings see the other documents in Binding Objective-C.

언어 비교Language Comparison

Objective-C와 C#은 구문 및 런타임의 관점에서 매우 다른 언어입니다.Objective-C and C# are very different languages both syntactically and from a runtime standpoint. Objective-C는 동적 언어로 메시지 전달 체계를 사용하는 반면, C#은 형식은 정적 형식의 언어입니다.Objective-C is a dynamic language and uses a message passing scheme, whereas C# is statically typed. 구문 수준에서 볼 때 Objective-C는 Smalltalk와 비슷한 반면, C#은 최근 몇 년 사이에 Java에 없는 여러 기능이 새로 추가되기는 했지만 기본 구문의 상당수가 Java에서 파생됩니다.Syntax-wise, Objective-C is like Smalltalk, whereas C# derives much of its fundamental syntax from Java, although it has matured to included many capabilities beyond Java in recent years.

따라서 Objective-C와 C#의 여러 언어 기능이 비슷한 방식으로 작동합니다.That said there are several language features of both Objective-C and C# that are similar in function. C#에서 Objective-C 코드에 대한 바인딩을 만들 때 또는 Objective-C를 C#으로 이식하는 경우 이러한 유사성을 알고 있으면 많은 도움이 됩니다.When creating a binding to Objective-C code from C# or when porting Objective-C to C#, understanding these similarities is useful.

프로토콜 vs. 인터페이스Protocols vs. Interfaces

Objective-C와 C# 둘 다 단일 상속 언어입니다.Both Objective-C and C# are single inheritance languages. 그러나 두 언어는 여러 인터페이스를 특정 클래스로 구현하는 기능을 지원합니다.However, both languages have support for implementing multiple interfaces in a given class. Objective-C에서는 이러한 논리 인터페이스를 프로토콜이라고 하고 C#에서는 인터페이스라고 합니다.In Objective-C these logical interfaces are called protocols whereas in C# they are called interfaces. 구현 수준에서 볼 때 C# 인터페이스와 Objective-C 프로토콜의 주요 차이점은 후자의 경우 선택적 메서드를 사용할 수 있다는 것입니다.Implementation-wise, the main difference between a C# interface and an Objective-C protocol is the latter can have optional methods. 자세한 내용은 이벤트, 대리자 및 프로토콜 문서를 참조하세요.For more information see the Events, Delegates and Protocols article.

범주 vs. 확장 메서드Categories vs. Extension methods

Objective-C는 범주를 사용하는 구현 코드가 없을 수도 있는 클래스에 메서드를 추가할 수 있습니다.Objective-C allows methods to be added to a class for which you may not have the implementation code using Categories. C#에서 이와 비슷한 개념으로는 확장 메서드가 있습니다.In C# a similar concept is available through what’s known as extension methods.

확장 메서드를 사용하면 클래스에 정적 메서드를 추가할 수 있으며, C#의 정적 메서드는 Objective-C의 class 메서드와 비슷합니다.Extension methods let you add static methods to a class, where static methods in C# are analogous to class methods in Objective-C. 예를 들어 다음 코드는 UITextView 클래스에 ScrollToBottom 메서드를 추가하며, 이 클래스는 UIKit의 Objective-C UITextView 클래스에 바인딩되는 관리 클래스가 됩니다.For example, the following code adds a method named ScrollToBottom to the UITextView class, which in turn is a managed class that is bound to the Objective-C UITextView class from UIKit:

public static class UITextViewExtensions
{
    public static void ScrollToBottom (this UITextView textView)
    {
        // code to scroll textView
    }
}

그 후 코드에 UITextView 인스턴스가 생성되면 아래와 같이 자동 완성 목록에서 메서드를 사용할 수 있습니다.Then, when an instance of a UITextView is created in code, the method will be available in the autocomplete list as shown below:

확장 메서드가 호출되면 이 예제의 textView처럼 인스턴스가 인수로 전달됩니다.When the extension method is called the instance is passed to the argument, such as the textView in this example.

프레임워크 vs. 어셈블리Frameworks vs. Assemblies

Objective-C는 관련 클래스를 프레임워크라고 하는 특수 디렉터리에 패키징합니다.Objective-C packages related classes in special directories known as frameworks. 그러나 C# 및 .NET에서는 어셈블리를 사용하여 미리 컴파일된 코드의 재사용 가능한 비트를 제공합니다.In C# and .NET however, assemblies are used to provide reusable bits of precompiled code. iOS 외부 환경에서 어셈블리에는 런타임에 JIT(Just-In-Time) 컴파일되는 IL(중간 언어) 코드가 포함됩니다.In environments outside of iOS, assemblies contain intermediate language code (IL) that is just in time (JIT) compiled at runtime. 그러나 Apple은 iOS 애플리케이션에서 JIT를 허용하지 않습니다.However, Apple does not allow JIT in iOS applications. 따라서 Xamarin을 사용하는 iOS를 대상으로 하는 C# 코드는 AOT(Ahead Of Time) 컴파일되고, 애플리케이션 번들에 포함된 메타데이터 파일과 함께 단일 Unix 실행 파일을 생성합니다.Therefore C# code targeting iOS with Xamarin is ahead of time compiled (AOT), producing a single Unix executable along with metadata files that are included in the application bundle.

선택기 vs. 명명된 매개 변수Selectors vs. Named Parameters

Objective-C 메서드는 기본적으로 매개 변수 이름을 특성에 따라 선택기에 포함합니다.Objective-C methods inherently include parameter names in selectors by their very nature. 예를 들어 AddCrayon:WithColor: 같은 선택기는 각 매개 변수가 코드에 사용될 때 그 의미를 명확히 합니다.For example a selector such as AddCrayon:WithColor: makes it clear what each parameter means when used in code. C#은 필요에 따라 명명된 인수도 지원합니다.C# optionally supports named arguments as well.

예를 들어 명명된 인수를 사용하는 C#의 비슷한 코드는 다음과 같습니다.For example, similar code in C# using named arguments would be:

AddCrayon (crayon: myCrayon, color: UIColor.Blue);

C#은 언어의 4.0 버전에서 이 지원을 추가했지만, 실제로는 그렇게 자주 사용되지 않습니다.Although C# added this support in version 4.0 of the language, in practice it isn’t used very often. 그러나 코드를 명확하게 하기 위해 이에 대한 지원이 제공됩니다.However, if you want to be explicit in your code, the support for it is there.

헤더 및 네임스페이스Headers and Namespaces

C의 상위 집합인 Objective-C는 구현 파일에서 구분되는 공용 선언에 대한 헤더를 사용합니다.Being a superset of C, Objective-C uses headers for public declarations that are separate from the implementation file. C#은 헤더 파일을 사용하지 않습니다.C# does not use header files. Objective-C와는 달리, C# 코드는 네임스페이스에 포함됩니다.Unlike Objective-C, C# code is contained in namespaces. 일부 네임스페이스에서 사용할 수 있는 코드를 포함하려면 구현 파일의 맨 위에 using 지시문을 추가하거나 전체 네임스페이스가 있는 형식으로 한정해야 합니다.If you want to include code available in some namespace, you add either a using directive to the top of the implementation file, or you qualify the type with the full namespace.

예를 들어 다음 코드에는 UIKit 네임스페이스가 포함되어 있어서 해당 네임스페이스의 모든 클래스를 구현에 사용할 수 있습니다.For example, the following code includes the UIKit namespace, making every class in that namespace available to the implementation:

using UIKit
namespace MyAppNamespace
{
    // implementation of classes
}

또한 위의 코드에 나온 네임스페이스 키워드는 구현 파일 자체에 사용되는 네임스페이스를 설정합니다.Also, the namespace keyword in the above code sets the namespace used for the implementation file itself. 여러 구현 파일이 동일한 네임스페이스를 공유하는 경우 네임스페이스를 using 지시문에 포함할 필요가 없습니다. 그렇게 하라는 암시적 의미가 있기 때문입니다.If multiple implementation files share the same namespace, there’s no need to include the namespace in a using directive as well, as it is implied.

속성Properties

Objective-C와 C# 모두 접근자 메서드에 대한 높은 수준의 추상화를 제공하는 속성 개념을 갖고 있습니다.Both Objective-C and C# have the concept of properties to provide a high-level abstraction around accessor methods. Objective-C에서 @property 컴파일러 지시문은 효과적으로 접근자 메서드를 생성하는 데 사용됩니다.In Objective-C the @property compiler directive is used to effectively generate the accessor methods. 반면, C#은 언어 자체에 속성 지원이 포함되어 있습니다.In contrast, C# includes support for properties within the language itself. C# 속성은 다음 예제에 나와 있는 것처럼 지원 필드에 액세스하는 긴 스타일 또는 짧은 자동 속성 구문을 사용하여 구현할 수 있습니다.A C# property can be implemented using either a longer style that accesses a backing field, or using a shorter, automatic property syntax, as shown in the following examples:

// automatic property syntax
public string Name { get; set; }

// property implemented with a backing field
string address;
public string Address {
    get {
        // could add additional code here
        return address;
    }
    set {
        address = value;
    }
}

Static 키워드Static Keyword

static 키워드의 의미는 Objective-C와 C#에서 매우 다릅니다.The static keyword has very different meaning between Objective-C and C#. Objective-C에서 정적 함수는 함수의 범위를 현재 파일로 제한하는 데 사용됩니다.In Objective-C static functions are used to limit the scope of a function to the current file. 하지만 C#에서는 퍼블릭, 퍼블릭내부 키워드를 통해 범위가 유지됩니다.In C# however, scope is maintained through the public, private and internal keywords.

Objective-C의 변수에 static 키워드가 적용되면 변수는 함수 호출에서 해당 값을 유지합니다.When the static keyword is applied to a variable in Objective-C, the variable maintains its value across function calls.

C#에도 static 키워드가 있습니다.C# also has a static keyword. static 키워드를 메서드에 적용하면 Objective-C에서 + 한정자가 하는 것과 똑같은 일을 효과적으로 수행합니다.When applied to a method, it effectively does the same thing that the + modifier does in Objective-C. 즉, 클래스 메서드를 만듭니다.Namely, it creates a class method. 마찬가지로, static 키워드를 필드, 속성, 이벤트 등의 다른 구문에 적용하면 해당 형식의 인스턴스 대신 선언되는 형식의 해당 부분을 만듭니다.Similarly, when applied to other constructs such as fields, properties and events, it makes those part of the type they are declared within rather than with any instance of that type. 또한 클래스에 정의된 모든 메서드가 정적이어야 하는 static 클래스를 만들 수 있습니다.You can also make a static class, in which all the methods defined in the class must be static as well.

NSArray vs. 목록 초기화NSArray vs. List Initialization

이제 Objective-C에는 NSArray에 사용되는 리터럴 구문이 포함되어 있으므로 좀 더 쉽게 초기화할 수 있습니다.Objective-C now includes literal syntax for use with NSArray, making it easier to initialize. 하지만 C#에는 제네릭List라고 하는 풍부한 형식이 포함되어 있는데, 이는 목록을 만드는 코드를 사용하여 목록에서 보관할 형식을 제공할 수 있다는 의미입니다(예: C++의 템플릿).C# however has a richer type called a List which is generic, meaning the type the list holds can be provided by the code that creates the list (like templates in C++). 또한 목록은 아래와 같이 자동 초기화 구문을 지원합니다.Additionally, lists support auto-initialization syntax as shown below:

MyClass object1 = new MyClass ();
MyClass object2 = new MyClass ();
List<MyClass> myList = new List<MyClass>{ object1, object2 };

블록 vs. 람다 식Blocks vs. Lambda Expressions

Objective-C는 블록을 사용하여 클로저를 만들며, 여기서 사용자는 블록이 묶여 있는 상태를 사용할 수 있는 함수를 인라인으로 만들 수 있습니다.Objective-C uses blocks to create closures, where you can create a function inline that can make use of the state where it is enclosed. C#에도 람다 식을 사용하는 비슷한 개념이 있습니다.C# has a similar concept through the use of lambda expressions. C#에서 람다 식은 아래와 같이 => 연산자를 사용하여 만듭니다.In C# lambda expressions are created with the => operator as shown below:

(args) => {
    //  implementation code
};

람다 식에 대한 자세한 내용은 Microsoft의 C# 프로그래밍 가이드를 참조하세요.For more information on lambda expressions, see Microsoft’s C# Programming Guide.

요약Summary

이 문서에서는 Objective-C와 C#의 다양한 언어 기능을 비교하여 살펴보았습니다.In this article a variety of language features were contrasted between Objective-C and C#. 블록과 람다 식, 범주와 확장 메서드처럼 두 언어의 기능이 서로 비슷한 점도 있고,In some cases, it called out analogous features that exist between both languages, such as blocks to lambda expressions, and categories to extension methods. C#의 네임스페이스와 static 키워드의 의미처럼 두 언어가 서로 다른 점도 있습니다.Additionally, it contrasted places where the languages diverge, such as with namespaces in C# and the meaning of the static keyword.