6 언어 기능(Language Features)

6 언어 기능(Language Features)

이 절은 Haxe 언어가 제공하는 다양한 기능들을 소개합니다.

추상 타입(Abstract types)Abstract types: 추상 타입은 런타임에 다르게 표현되는 컴파일 타임 구조예요. 기존 타입에 완전히 새로운 의미를 부여할 수 있게 합니다.

Extern 클래스(Extern classes)Extern classes: extern은 대상별 상호작용을 타입 안전하게 기술하는 데 사용할 수 있어요.

익명 구조체(Anonymous structures)Anonymous structures: 데이터는 익명 구조체로 쉽게 그룹화되어, 작은 데이터 클래스의 필요를 최소화합니다.

var point = {x: 0, y: 10};
point.x += 10;

배열 컴프리헨션(Array Comprehension)Array Comprehension: for 루프와 논리를 사용해 배열을 빠르게 만들고 채웁니다.

var evenNumbers = [for (i in 0...100) if (i & 1 == 0) i];

맵 컴프리헨션(Map Comprehension)Map Comprehension: for 루프와 논리를 사용해 맵을 빠르게 만들고 채웁니다.

var primality = [for (i in 0...100) i => isPrime(i)];

클래스, 인터페이스, 상속(Classes, interfaces and inheritance)Classes, interfaces and inheritance: Haxe는 코드를 클래스로 구조화할 수 있게 해 객체 지향 언어입니다. Java 같은 언어에서 알려진 상속과 인터페이스를 포함한 공통 기능들을 지원해요.

조건부 컴파일(Conditional compilation)Conditional compilation: 조건부 컴파일은 컴파일 매개변수에 따라 특정 코드만 컴파일하게 합니다. 이는 대상별 차이를 추상화하는 데 유용하지만, 더 상세한 디버깅 같은 다른 목적으로도 사용될 수 있어요.

#if js
  js.Browser.alert("Hello");
#elseif sys
  Sys.println("Hello");
#end

ADT/GADT(Generalized) Algebraic Data Types: 구조는 대수적 데이터 타입(ADT)으로 표현될 수 있으며, Haxe 언어에서는 enum으로 알려져 있어요. 또한 Haxe는 GADT로 알려진 일반화된 변형을 지원합니다.

enum Result {
  Success(data:Array<Int>);
  UserError(msg:String);
  SystemError(msg:String, position:PosInfos);
}

인라인 호출(Inlined calls)Inlined calls: 함수는 inline으로 지정될 수 있어 호출 위치에 코드가 삽입되게 합니다. 수동 인라이닝으로 코드 중복 없이 상당한 성능 이점을 제공할 수 있어요.

이터레이터(Iterators)Iterators: 이터레이터 덕분에 배열의 요소 같은 값 집합에 대해 반복하는 것이 Haxe에서 매우 쉽습니다. 사용자 정의 클래스도 이터레이터 기능을 빠르게 구현해 반복을 허용할 수 있어요.

for (i in [1, 2, 3]) {
  trace(i);
}

지역 함수와 클로저(Local functions and closures)Local functions and closures: Haxe의 함수는 클래스 필드에 국한되지 않고 표현식 안에서도 선언될 수 있어, 강력한 클로저를 허용합니다.

var buffer = "";
function append(s:String) {
  buffer += s;
}
append("foo");
append("bar");
trace(buffer); // foobar

메타데이터(Metadata)Metadata: 필드, 클래스 또는 표현식에 메타데이터를 추가합니다. 이것은 컴파일러, 매크로 또는 런타임 클래스에 정보를 전달할 수 있어요.

class MyClass {
  @range(1, 8) var value:Int;
}
trace(haxe.rtti.Meta.getFields(MyClass).value.range); // [1,8]

정적 확장(Static Extensions)Static Extensions: 기존 클래스와 다른 타입들은 using 정적 확장을 통해 추가 기능으로 확장될 수 있습니다.

using StringTools;
"  Me & You    ".trim().htmlEscape();

문자열 보간(String Interpolation)String Interpolation: 작은따옴표로 선언된 문자열은 현재 문맥의 변수에 접근할 수 있어요.

trace('My name is $name and I work in ${job.industry}');

부분 함수 적용(Partial function application)Partial function application: 어떤 함수든 부분적으로 적용할 수 있어, 일부 인자의 값을 제공하고 나머지는 나중에 채우도록 둘 수 있어요.

var map = new haxe.ds.IntMap();
var setToTwelve = map.set.bind(_, 12);
setToTwelve(1);
setToTwelve(2);

패턴 매칭(Pattern Matching)Pattern Matching: 복잡한 구조는 패턴과 매칭될 수 있으며, enum이나 구조체에서 정보를 추출하고 특정 값 조합에 대해 특정 연산을 정의합니다.

var a = {foo: 12};
switch a {
  case {foo: i}: trace(i);
  default:
}

속성(Properties)Properties: 변수 클래스 필드는 사용자 정의 읽기·쓰기 접근을 가진 속성으로 설계될 수 있어 세밀한 접근 제어를 허용합니다.

public var color(get,set);
function get_color() {
  return element.style.backgroundColor;
}
function set_color(c:String) {
  trace('Setting background of element to $c');
  return element.style.backgroundColor = c;
}

접근 제어(Access control)Access control: 접근 제어 언어 기능은 Haxe 메타데이터 구문을 사용해 클래스나 필드에 대한 접근을 강제하거나 허용합니다.

타입 매개변수, 제약, 분산(Type Parameters, Constraints and Variance)Type Parameters, Constraints and Variance: 타입은 타입 매개변수로 매개변수화될 수 있어, 타입 있는 컨테이너와 다른 복잡한 데이터 구조를 허용합니다. 타입 매개변수는 특정 타입으로 제약될 수도 있고 분산 규칙을 존중합니다.

class Main<A> {
  static function main() {
    new Main<String>("foo");
    new Main(12); // use type inference
  }

  function new(a:A) {}
}

출처: Language Features

본문

언어 기능 절은 추상 타입, extern, 익명 구조체, 배열/맵 컴프리헨션, 클래스·인터페이스·상속, 조건부 컴파일, ADT/GADT, 인라인, 이터레이터, 지역 함수와 클로저, 메타데이터, 정적 확장, 문자열 보간, 부분 함수 적용, 패턴 매칭, 속성, 접근 제어, 타입 매개변수 등을 다룹니다. 각 항목은 뒤의 하위 절에서 상세히 설명합니다.

더 알아보기

  • inline
  • 각 하위 절 링크