ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด Haxe 4.0 ์ถœ์‹œ

์‚ฌ์šฉ ๊ฐ€๋Šฅ ํˆดํ‚ท ๋ฆด๋ฆฌ์Šค ํ•ต์Šค 4.0์—๋Š” ๊ฐ•๋ ฅํ•œ ํƒ€์ดํ•‘ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋‹ค์ค‘ ํŒจ๋Ÿฌ๋‹ค์ž„ ๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด, ํฌ๋กœ์Šค ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐ ํ‘œ์ค€ ํ•จ์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ๊ฐ ๋Œ€์ƒ ํ”Œ๋žซํผ์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์— ์•ก์„ธ์Šคํ•˜์—ฌ C++, HashLink/C, JavaScript, C#, Java, PHP, Python ๋ฐ Lua๋กœ์˜ ๋ณ€ํ™˜์€ ๋ฌผ๋ก  JVM, HashLink/JIT, Flash ๋ฐ Neko ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ์˜ ์ปดํŒŒ์ผ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ์ฝ”๋“œ ๋ฐฐํฌ์ž GPLv2 ๋ผ์ด์„ผ์Šค์— ๋”ฐ๋ผ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ Haxe์šฉ์œผ๋กœ ๊ฐœ๋ฐœ๋œ ๊ฐ€์ƒ ๋จธ์‹  ๋„ค์ฝ” MIT ๋ผ์ด์„ผ์Šค์— ๋”ฐ๋ผ.

์–ธ์–ด๋Š” ํ‘œํ˜„ ์ง€ํ–ฅ์  ๊ฐ•ํ•œ ํƒ€์ดํ•‘์œผ๋กœ. ๊ฐ์ฒด ์ง€ํ–ฅ, ์ผ๋ฐ˜ ๋ฐ ๊ธฐ๋Šฅ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.
Haxe ๊ตฌ๋ฌธ์€ ECMAScript์— ๊ฐ€๊น๊ณ  ํŒฝ์ฐฝํ•˜๋‹ค ์ •์  ์œ ํ˜• ์ง€์ •, ์ž๋™ ์œ ํ˜• ์ถ”๋ก , ํŒจํ„ด ์ผ์น˜, ์ œ๋„ค๋ฆญ, ๋ฐ˜๋ณต์ž ๊ธฐ๋ฐ˜ for ๋ฃจํ”„, AST ๋งคํฌ๋กœ, GADT(์ผ๋ฐ˜ ๋Œ€์ˆ˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•), ์ถ”์ƒ ์œ ํ˜•, ์ต๋ช… ๊ตฌ์กฐ, ๋‹จ์ˆœํ™”๋œ ๋ฐฐ์—ด ์ •์˜, ์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ํ‘œํ˜„์‹, ํ•„๋“œ์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ , ํด๋ž˜์Šค ๋ฐ ํ‘œํ˜„์‹, ๋ฌธ์ž์—ด ๋ณด๊ฐ„('My name is $name'), ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜("new Main<String>('foo')") ๋ฐ ํ›จ์”ฌ ๋”.

ํด๋ž˜์Šค ํ…Œ์ŠคํŠธ {
์ •์  ํ•จ์ˆ˜ ๋ฉ”์ธ() {
var ์‚ฌ๋žŒ๋“ค = [
"์—˜๋ฆฌ์ž๋ฒ ์Šค" => "ํ”„๋กœ๊ทธ๋ž˜๋ฐ",
"์กฐ์—˜" => "๋””์ž์ธ"
];

for (people.keys()์˜ ์ด๋ฆ„) {
var ์ง์—… = ์‚ฌ๋žŒ[์ด๋ฆ„];
Trace('$name์€ $์ผ์„ ํ•ด์„œ ์ƒ๊ณ„๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!');
}
}
}

์ฃผ์š” ํ˜์‹  ๋ฒ„์ „ 4.0:

  • "String->Int->Bool" ๋Œ€์‹  ํ•จ์ˆ˜ ์œ ํ˜• "(name:String, age:Int)->Bool" ๋˜๋Š” "(String, Int)->Bool"์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๊ตฌ๋ฌธ์€ "function(a, b) return a + b" ๋Œ€์‹  "(a, b) -> a + b"์ž…๋‹ˆ๋‹ค.
  • Null ๊ฐ’ ์‚ฌ์šฉ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค(์‹คํ—˜์  ๊ธฐ๋Šฅ, ํŠน์ • ํ•„๋“œ, ํด๋ž˜์Šค ๋˜๋Š” ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ์„ ํƒ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋จ).
  • "final" ํ‚ค์›Œ๋“œ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค ํ•„๋“œ์™€ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. "final"์€ ์ƒ์†์— ์˜ํ•ด ์žฌ์ •์˜๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ƒ์†๋  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค/์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ง€์› Neko๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์ปดํŒŒ์ผ ๋Œ€์ƒ์˜ ๊ธฐ๋ณธ ์œ ํ˜• "String"์— ๋Œ€ํ•œ ์œ ๋‹ˆ์ฝ”๋“œ ํ‘œ์ค€์ž…๋‹ˆ๋‹ค.
  • ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์ž‘์„ฑ๋œ ๋‚ด์žฅ ํ†ต์—ญ์‚ฌ(์ด์ œ ์ด๋ฆ„์ด ๋ถ™์Œ) ํ‰๊ฐ€. ์ƒˆ๋กœ์šด ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋•๋ถ„์— ์Šคํฌ๋ฆฝํŠธ์™€ ๋งคํฌ๋กœ๊ฐ€ ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋Œ€ํ™”ํ˜• ๋””๋ฒ„๊น… ๋ชจ๋“œ๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผ์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ํƒ€๊ฒŸ ์‹œ์Šคํ…œ(target) ํ•ด์‹œ๋งํฌ - JIT ๋˜๋Š” C์šฉ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ปดํŒŒ์ผ์„ ์ง€์›ํ•˜๋Š” Haxe์šฉ์œผ๋กœ ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋œ ๊ณ ์„ฑ๋Šฅ ๋Ÿฐํƒ€์ž„์€ C์™€์˜ ํ†ตํ•ฉ์ด ์šฉ์ดํ•˜๊ณ  ํ•˜์œ„ ์ˆ˜์ค€ ์ˆซ์ž ์œ ํ˜• ๋ฐ ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด JVM ๋Œ€์ƒ - Java์—์„œ ๋Œ€์ƒ์„ ์ง€์ •ํ•  ๋•Œ "-D jvm" ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ Java ์ฝ”๋“œ์˜ ์ปดํŒŒ์ผ ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  jvm ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜๋‚˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์‹œ์ ์—์„œ ์„ ์–ธ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ์ธ๋ผ์ธ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • ํฌํ•จ ๊ฐ€๋Šฅ์„ฑ ์ •์  ํ™•์žฅ "@:using(path.ToExtension)"์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜•(์˜ˆ: "enum")์„ ์„ ์–ธํ•  ๋•Œ.
  • ์ด์ œ ์ถ”์ƒ ์œ ํ˜•์€ "obj.foo = bar" ํ‘œํ˜„์‹์„ ๋‹ค์‹œ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด "@:op(ab)" ์—ฐ์‚ฐ์ž์˜ "set" ๋ฒ„์ „์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • "for" ๋ฃจํ”„ ๊ตฌ๋ฌธ์€ ์ด์ œ ํ‚ค-๊ฐ’ ๋ฐ˜๋ณต์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค: "for (key => value in collection) {}".
  • ํ‘œํ˜„์‹์—์„œ XML๊ณผ ์œ ์‚ฌํ•œ ๋งˆํฌ์—… ์‚ฌ์šฉ ์ง€์›: "var a = ``hi/>;" ํ˜„์žฌ ์ด ๊ธฐ๋Šฅ์€ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•œ ๊ตฌ๋ฌธ ๋ถ„์„์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์„ค๊ณ„ ๋‹จ๊ณ„์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ต๋ช… ๊ตฌ์กฐ ์œ ํ˜•์˜ "์ „์ฒด" ํ‘œ๊ธฐ๋ฒ•์—์„œ ์„ ํƒ์  ํ•„๋“œ์˜ ๊ตฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. "{ var ?f:Int; }"(์งง์€ "{ ?f:Int }"์˜ ๋Œ€์•ˆ).
  • ์—ด๊ฑฐํ˜• ๊ฐ’์€ ์ด์ œ ํ•จ์ˆ˜ ์ธ์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: "function foo<T>(option:Option<T> = None)".
  • "enum abstract Name(BasicType) {}" ๊ตฌ๋ฌธ์—๋Š” ๋” ์ด์ƒ "enum"์— "@:" ์ ‘๋‘์‚ฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ถ”์ƒ ์—ด๊ฑฐ์— ๋Œ€ํ•œ ์ž๋™ ๋ฒˆํ˜ธ ๋งค๊ธฐ๊ธฐ:

    ์—ด๊ฑฐํ˜• ์ถ”์ƒ Foo(Int) {
    ๋ณ€์ˆ˜ A; // 0
    ๋ณ€์ˆ˜ B; // 1
    }
    ์—ด๊ฑฐํ˜• ์ถ”์ƒ Bar(String) {
    ๋ณ€์ˆ˜ A; // "ใ…"
    ๋ณ€์ˆ˜ B; // "๋น„"
    }

  • "extern" ํ‚ค์›Œ๋“œ์—๋Š” ๋” ์ด์ƒ "@:" ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • "์˜ต์…˜์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.๊ตฌํ˜„ํ•˜๋‹ค ๋™์ "์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ํ†ตํ•ด ํด๋ž˜์Šค ํ•„๋“œ์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€ ํด๋ž˜์Šค ๋˜๋Š” ์ถ”์ƒ ์œ ํ˜• ๊ตฌํ˜„์„ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ์ต๋ช… ๊ตฌ์กฐ ๋ฐ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ์ œ์•ฝ ์กฐ๊ฑด์—๋งŒ ์ ์šฉ๋˜๋Š” ์œ ํ˜• ๊ต์ฐจ์— ๋Œ€ํ•œ "A & B" ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ์ œ์•ฝ ์กฐ๊ฑด ๊ตฌ๋ฌธ์ด ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋นˆ "Map" ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์€ "var map:Map<Int, String> = [];" ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ "haxe.ds.ReadOnlyArray"๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด์ œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค("@:prefix.name function() {...}")๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •์˜: "#if (some.flag ... #end").
  • IDE์— ์‚ฌ์šฉ๋˜๋Š” ์ƒˆ๋กœ์šด ์„œ๋น„์Šค ํ”„๋กœํ† ์ฝœ VSCode์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ.
  • Web API์— ๋Œ€ํ•œ ์™ธ๋ถ€ ์ •์˜(extern)๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ˆ„๋ฝ๋œ ์ •์˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€