C#과 같은 일반적인 프로그래밍 언어에서는 class, struct(구조체) 안에 property(속성)와 method(메서드)를 정의하여 활용할 수 있다. rust는 구조체를 지원하지만 해당 구조체 안에 속성만을 기술할 수 있지 메서드는 정의할 수 없고 impl 키워드를 사용하여 외부에 정의한다.
impl 키워드와 더불어 사용할 수 있는 trait는 타입에 대해 공통된 동작을 표시한다. 약간의 차이는 있지만 다른 프로그래밍 언어에서 말하는 interface와 비슷한 개념이다. 아래의 소스는 C#에서의 interface 기능을 간략하게 살펴보고 이를 rust를 이용하여 구현하고 비교해 본 것이다.
using System;
namespace ConsoleTest;
internal class Program
{
private static void Main()
{
Test1();
Console.WriteLine("------------------------------");
Test2();
/*
Truck can drive : 1111 : 1111
Truck can drive : 2222 : 1111
Truck can drive : 2222
Sedan can drive : 3333
Sedan can drive : 4444 : 1111
------------------------------
Truck can drive : 1111 : 1111
Truck can drive : 2222 : 2222
Truck can drive : 2222
Sedan can drive : 3333
Sedan can drive : 4444 : 2222
*/
}
콜백은 일반적으로 delegate를 통하여 구현하나 인터페이스를 사용하여 콜백을 구현할 수도 있다. 또한 모델 클래스를 만들 때 클래스에서 지원하지 않는 다중상속을 구현가능하게 해 준다. 아래는 전체 소스이다.
C#은 안전한 함수 포인터 개체를 정의하는 delegate 형식을 제공한다. C++ 사용자정의함수에서 파라미터로 함수를 입력받기 위해 사용하는 개념과 동일하다. c#에서는 delegate를 선언하고 사용하는 과정을 간소화하여 Action, Func, Predicate를 제공하고 있다. 참고로 delegate는 이벤트에서 사용하므로 C#에서 이해는 필수이다.
C++의 함수 포인터를 C#의 Func
으로 표현해 보는 몇 가지 예제를 작성하였다. 특히 C++의 함수 포인터 예제는 유튜브 C/C++ 강좌로 유명한 두들낙서 94강. 함수 포인터를 참고하였다. Rust 예제포함.
#include <iostream>
#include <string>
using namespace std;
bool compare(int a, int b)
{
return a == b;
}
int main(void)
{
bool (*fp)(int, int) = compare;
bool result = fp(2, 2);
cout << result << endl;
cout << boolalpha << result << endl;
cout << string(result ? "True" : "False") << endl;
}
void Main()
{
Func<int, int, bool> func = compare;
bool result = func(2, 2);
(result ? 1 : 0).Dump();
result.Dump();
}
bool compare(int a, int b)
{
return a == b;
}
일반적인 프로그래밍 언어에서는 에러 처리를 위한 예외 처리가 기본이다. 그렇지만 러스트(rust)는 예외 기능이 없다. 대신, 복구 가능한 에러를 위한 Result<T, E>
값과 복구 불가능한 에러가 발생했을 때 실행을 멈추는 panic! 매크로를 가지고 있다.1 또한 러스트는 다른 언어들이 가지는 Null이라는 기능이 없다. 러스트는 Null을 사용하지 않고, 존재하거나 존재하지 않음을 나타내는 개념을 나타내는 Option<T>
을 이용한다.2
enum Result<T, E> {
Ok(T),
Err(E)
}
enum Option<T> {
None,
Some(T)
}
여기에서 사용하는 대부분의 예제는 mithradates의 Easy Rust Korean를 참고하였다.