Godot: Godot์—์„œ C++์˜ ์ƒํƒœ

์— ๋งŒ๋“  2017๋…„ 07์›” 18์ผ  ยท  65์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: godotengine/godot

Godot์—์„œ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ C++ 98/03์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์˜ ๋ชฉ์ ์€ ๊ณ„์† ๊ณ ์ˆ˜ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์ตœ์‹  C++(C++11/14/17 ๋ฐ 20) ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Godot๊ฐ€ ์ฒ˜์Œ ์ž‘์„ฑ๋˜์—ˆ์„ ๋•Œ, C++03์€ ๊ฐ€์žฅ ์ตœ์‹  ๋ฒ„์ „์ด์—ˆ๊ณ  ๋ช‡ ๋…„ ํ›„์— ๊ทธ ์Šคํƒ€์ผ(ํ‘œ์ค€ ๋ฒ„์ „, ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํšŒํ”ผ ๋“ฑ)์€ ํŠน์ • ์ปดํŒŒ์ผ๋Ÿฌ(์ผ๋ถ€ ์ฝ˜์†”, ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ). ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์šฐ๋ ค๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๋ คํ•ด์•ผ ํ•  ํ•ญ๋ชฉ(์ด ๋ชฉ๋ก์€ ๊ณ„์† ์ฆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ผ๋ถ€ ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ๋งŒ ํ•จ):

  • ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ: Godot ์‚ฌ์šฉ์ž ์ •์˜ ํฌ์ธํ„ฐ/๊ฐ์ฒด ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๊ทธ์™€ ํ˜ธํ™˜๋˜๋‚˜์š”? Godot๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํฐ ๋ถ€๋ถ„์„ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋น„์šฉ๋ณด๋‹ค ์ด๋“์ด ๋” ํด๊นŒ์š”?
  • ์˜๋ฏธ ์ด๋™: ์—ฌ๊ธฐ์— ๋ฌป๋Š” ์งˆ๋ฌธ์€ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์™€ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
  • auto , constexpr , ๋žŒ๋‹ค ๋“ฑ : ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋“œ ์ž‘์„ฑ์„ ๋” ์‰ฝ๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ํ˜„์žฌ ์ฝ”์–ด๋ฅผ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๊ณ  ์ตœ์ ํ™” ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ์ตœ์‹  C++ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • ํ‘œ์ค€ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์‹ฑ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ : C++๋Š” ์ด์ œ ํ‘œ์ค€ ์Šค๋ ˆ๋”ฉ, ์›์ž์„ฑ, ๋ฉ”๋ชจ๋ฆฌ ์žฅ๋ฒฝ ๋“ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌํ˜„์„ ์œ ์ง€ํ•˜๊ณ  ๋‹ค๋ฅธ ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  • STL/Boost/other : ์‚ฌ์šฉ์ž ์ •์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ž˜ ์•Œ๋ ค์ง„ ๊ตฌํ˜„์œผ๋กœ ์ „ํ™˜ํ•˜๋ฉด ์•ฝ๊ฐ„์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์œ ์ง€ ๋ณด์ˆ˜, ์„ฑ๋Šฅ, ํ˜ธํ™˜์„ฑ ๋“ฑ์— ๊ด€ํ•œ ์žฅ/๋‹จ์ 
  • register , ์ธ๋ผ์ธ "ํŠธ๋ฆญ" ๋“ฑ : ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋” ์„ฑ๋Šฅ์ด ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ์— ์ถ”๊ฐ€๋œ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค ์ค‘ ์ผ๋ถ€๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์‹ค์ œ ์˜ํ–ฅ์ด ์—†๊ฑฐ๋‚˜ ์„ฑ๋Šฅ์„ ์•…ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ๊ฒƒ์„ ๋–จ์–ด๋œจ๋ฆด๊นŒ? ๋ฌด์—‡์„ ๋ณด๊ด€ํ•  ๊ฒƒ์ธ๊ฐ€?
  • ๋“ฑ,

์ž‘์€ ๋ณ€ํ™”๋Š” ์ผ์ฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ธ์ œ ํฐ ๋ณ€๊ฒฝ(์ด ๊ฒฝ์šฐ)์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ณ ๋„ 4.0? ์•„๋‹ˆ๋ฉด Godot 3.0์ด ์•ˆ์ •ํ™”๋˜์ž๋งˆ์ž?

@reduz , @punto-, @akien-mga, @karroffel , @bojidar-bg, @BastiaanOlij , @Faless์™€ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์„ ๋ช…์‹œ์ ์œผ๋กœ ์ดˆ๋Œ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

discussion

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

Godot์™€ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒ์œผ๋กœ์„œ ์ œ 2์„ผํŠธ(๋˜๋Š” 20์„ผํŠธ)๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ํ˜„์žฌ _Battle for Wesnoth_๋ฅผ Godot๋กœ ์ด์‹ํ•˜๋Š” ์ž‘์—…์„ ๊ฐ๋…ํ•˜๊ณ  ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. ์ด์ œ ํ”„๋ก ํŠธ ์—”๋“œ(์—๋””ํ„ฐ์™€ GDScript API)๊ฐ€ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค! ๋ช‡ ๊ฐ€์ง€ ๊ฑฐ์นœ ๋ถ€๋ถ„ ์™ธ์—๋„ ์ง€๊ธˆ๊นŒ์ง€๋Š” ์ข‹์€ ์†๋„๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ(ํŒ€)๋„ ์–ธ์  ๊ฐ€๋Š” ๋ฐฑ์—”๋“œ(์—”์ง„)์— ๋Œ€ํ•œ ํŒจ์น˜๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ด๋ฒˆ ์ฃผ ์ดˆ์— git repo๋ฅผ ๋ณต์ œํ•˜๊ณ  C++์—์„œ ์—ฌ๊ธฐ์ €๊ธฐ ํŒŒ๊ณ ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ ๋งํ•ด์„œ... ์ €๋Š” ์•ฝ๊ฐ„ ์‹ค๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” Wesnoth์˜ ์˜ค๋ž˜๋œ ์‚ฌ์šฉ์ž ์ •์˜ ์—”์ง„์˜ ํ˜•ํƒœ๋กœ ๋Œ€๊ทœ๋ชจ C++ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•œ ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ญ์‹œ C++03์œผ๋กœ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ C++11 ์ด์ƒ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ˜„๋Œ€ํ™”๋˜์—ˆ์œผ๋ฉฐ ์ด์ œ C++14์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ํ˜„๋Œ€ํ™” ๋…ธ๋ ฅ์„ ์ฃผ๋„ํ–ˆ๊ณ (์ข…์ข… ๋„ˆ๋ฌด ์—ด์„ฑ์ ์œผ๋กœ) ์šฐ๋ฆฌ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ํ›จ์”ฌ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ์ž‘์—…ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ €๋Š” ์ˆœ์ˆ˜ํ•œ C++03 ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ž‘์—…ํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ตœ์‹  C++ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ C++๋ฅผ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ auto , range-for ๋ฐ lambdas์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์ฝ”๋“œ๋ฅผ ๋œ ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” ์ƒ๊ฐ์€ ์ •๋ง... ๋งค์šฐ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

auto ๋ฅผ ๋‚จ์šฉํ•˜๊ณ  ๋‚จ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ™•์‹คํžˆ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํ•ฉ๋ฒ•์ ์ธ ์šฉ๋„๋„ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Wesnoth ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ auto ๋ฅผ ๋ฐฐํฌํ•œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์žฅ์†Œ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” for ๋ฃจํ”„์˜€์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

for(std::vector<T>::iterator foo = container.begin(); foo != container.end(); ++foo) {}

์–ด๋Š ๊ฒƒ์ด ์ง€์ €๋ถ„ํ•ด! ์‹ค์ œ๋กœ iterator๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ–ˆ์Šต๋‹ˆ๋‹ค.

for(auto foo = container.begin(); foo != container.end(); ++foo) {}

์˜ˆ, ์ด์ œ ๋ช…์‹œ์  ๋ฐ˜๋ณต๊ธฐ ์œ ํ˜•์„ ๋ชจ๋ฅด์ง€๋งŒ ๊ฑฐ์˜ ์•Œ ํ•„์š” ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ผ๋ถ€ ํŒŒ์ผ์„ ์„ ์–ธํ•˜๋ฉด ๋” ์–ด๋ ค์›Œ์ง„๋‹ค๋Š” ๊ฒŒ์‹œ๋ฌผ์„ ์—ฌ๊ธฐ์—์„œ ์ฝ์—ˆ์ง€๋งŒ ์‹ค์ œ๋กœ ํ˜„๋Œ€ ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ์™€ ์ธํ…”๋ฆฌ์„ผ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋‹ค์ง€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด range-for๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

for(const auto& foo : container) {}

ํƒ€์ดํ•‘๋„ ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํ”„ ๋‚ด์—์„œ ๋ฐ˜๋ณต์ž๋ฅผ ์—ญ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ์ธ๋ฑ์Šค๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์ด ์ „์ฒด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐ˜๋ณตํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค์€ ๋ฃจํ”„๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์‹ค์ œ๋กœ ์ง„ํ–‰๋˜๋Š”์ง€ ๋‹ค์‹œ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ range-for ๋ฃจํ”„์—์„œ auto ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ถ”๊ฐ€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ์–ตํ•ด์•ผ ํ•˜๋Š” ํ•ญ๋ชฉ์ด ํ•˜๋‚˜ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค! ๋‚˜๋Š” ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์ด ์ฝ”๋“œ๋ฅผ ๋œ ์ฝ๊ฑฐ๋‚˜ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” Juan์˜ ์ฃผ์žฅ์„ ์ •๋ง๋กœ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ €์—๊ฒŒ๋Š” ์ •๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค.

๊ทธ๋Š” Godot์˜ ์ƒํƒœ ๋น„๋””์˜ค์—์„œ ๋žŒ๋‹ค๋„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๊ทธ๊ฒƒ๋“ค์„ ๋‚จ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋˜ํ•œ ์—„์ฒญ๋‚˜๊ฒŒ ์œ ์šฉํ•œ ๋„๊ตฌ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค! ๋‹ค์Œ์€ C++11์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— Wesnoth์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋ณธ ์ผ๋ฐ˜์ ์ธ ํŒจ๋Ÿฌ๋‹ค์ž„์ž…๋‹ˆ๋‹ค.

struct sort_helper {
    operator()(const T& a, const T& B) {
        return a < b;
    }
}

void init() const {
    std::vector<T> foo;
    foo.push_back(T(1));
    foo.push_back(T(2));
    foo.push_back(T(3));

    std::sort(foo.begin(), foo.end(), sort_helper);
}

๊ธธ๊ณ  ์ง€์ €๋ถ„ํ•œ ์ฝ”๋“œ ํŒฝ์ฐฝ. ๋‹ค์Œ์€ C++11์—์„œ ์‚ฌ์šฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

void init() const {
    std::vector<T> foo {
        T(1),
        T(2),
        T(3),
    };

    std::sort(foo.begin(), foo.end(), [](const T& a, const T& b) { return a < b; });
}

๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ์˜ˆ, T์— ๋Œ€ํ•ด operator< ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๊ณ  std::sort ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ œ ์š”์ ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ํ˜„๋Œ€์ ์ธ C++๋กœ ๋ฐฐ์šฐ๊ณ  ๊ฑฐ์˜ ๋…์ ์ ์œผ๋กœ ์ž‘์—…ํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ ์ ˆํ•œ ๊ฒฝ์šฐ auto , range-for ๋ฐ lambdas์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์€ ๋ฐœ์„ ํ—›๋””๋”œ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚˜๋ฅผ ๋‹ค์Œ ์š”์ ์œผ๋กœ ์ด๋•๋‹ˆ๋‹ค. ๋‚˜๋Š” Godot๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ STL ์œ ํ˜• ๋Œ€์‹ ์— ์ž์ฒด ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๋‹ค. auto ์™€ ๊ฐ™์€ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์— ๋Œ€ํ•œ ์šฐ๋ ค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ STL ์œ ํ˜•๋ณด๋‹ค ์‚ฌ์šฉ์ž ์ •์˜ ์ฝ”์–ด ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ ˆ๋Œ€์ ์œผ๋กœ ์†ํ•ด์ž…๋‹ˆ๋‹ค! ๋ฉฐ์น  ์ „์— ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋‹ค๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

container.push_back(T(args));

์ด๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. push_back (์ ์–ด๋„ std::vector ์ธก๋ฉด์—์„œ) const ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์—ฐ์‚ฐ์ž๋Š” ๋ถˆํ•„์š”ํ•œ ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. emplace_back ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํŒจ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ... ์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค ๐Ÿ˜

Wesnoth์˜ ์„ค๊ณ„์— ๋Œ€ํ•œ ํฐ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ด์ž ์ƒˆ ์—”์ง„(์ด ๊ฒฝ์šฐ Godot)์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ฃผ์š” ์š”์ธ ์ค‘ ํ•˜๋‚˜๋Š” Wesnoth๊ฐ€ Not Invented Here ์ฆํ›„๊ตฐ์„ ํฌ๊ฒŒ ๊ฒช์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Boost์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์€ ์‚ฌ์šฉ์ž ์ง€์ •์ด์—ˆ๊ณ  UI ํˆดํ‚ท์€ ์‚ฌ์šฉ์ž ์ง€์ •๋˜์—ˆ์œผ๋ฉฐ ๋ฐ์ดํ„ฐ/์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด๋Š” ์‚ฌ์šฉ์ž ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.... ์š”์ ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Godot ํฌํŠธ์—์„œ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํ•˜๋“œ์›จ์–ด ๊ฐ€์† ๋ Œ๋”๋ง์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค(์ด ์‹œ์ ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” CPU ๊ธฐ๋ฐ˜ ํ‘œ๋ฉด/์Šคํ”„๋ผ์ดํŠธ ๋ Œ๋”๋ง์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. 2019๋…„์—๋Š” X_X๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค). SDL์˜ Texture API์—๋Š” ์…ฐ์ด๋” ์ง€์›์ด ์—†์—ˆ๊ณ  ์…ฐ์ด๋” ์ง€์›์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋‚˜๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ์ž์ฒด ๋ Œ๋”๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํ”„๋กœ์ ํŠธ์— ๋ถˆํ•„์š”ํ•œ ์œ ์ง€ ๊ด€๋ฆฌ ๋ถ€๋‹ด์„ ์ค„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฑฐ์˜ ์—†์—ˆ๊ณ , Godot์™€ ๊ฐ™์€ ์—”์ง„์— ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ํ›Œ๋ฅญํ•˜๊ณ  ์ž˜ ๊ด€๋ฆฌ๋œ ๋ Œ๋”๋Ÿฌ๊ฐ€ ์žˆ์„ ๋•Œ OpenGL(๋˜๋Š” OGL์„ ์‚ญ์ œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ Vulkan)์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์„ ์ฐพ๋Š” ๊ฒƒ์€ ๋ถˆํ•„์š”ํ•œ ๊ณ ํ†ต์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ ์—.

์‚ฌ๋‚ด์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์œ ์ƒ๊ฐ์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ์˜ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์•ฝ๊ฐ„ ์ค„์ผ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๋ง‰๋Œ€ํ•œ ์œ ์ง€ ๊ด€๋ฆฌ ๋ถ€๋‹ด์„ ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ push_back ํ˜ธ์ถœ์„ emplace_back ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์ฝ”๋“œ๋ฅผ ๋” ๊นจ๋—ํ•˜๊ณ  ์„ฑ๋Šฅ์ด ์ข‹๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ๋‚ฎ์€ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž ์ •์˜ vector ์œ ํ˜•์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€ ๊ตฌ์„ฑ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋ˆ„๊ตฐ๊ฐ€ ์ˆ˜๋™์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค!

๋” ํฐ ๋ฌธ์ œ๋Š” ์ง„์ž…์žฅ๋ฒฝ์ด ๋†’์•„์ง„๋‹ค๋Š” ์ ์ด๋‹ค. C++ STL ์œ ํ˜•์„ ๊ธฐ๋Œ€ํ•˜๋Š” Godot ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋‚˜ ๋˜๋Š” ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด์ œ ์—”์ง„์ด ์ œ๊ณตํ•˜๋Š” ์œ ํ˜•๊ณผ ๊ฐ API์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ์œ ํ˜•์„ ์ •ํ™•ํžˆ ์•Œ์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์›ํ•˜๋Š” std::map ? ์•„๋‹ˆ์š”, dictionary ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋ฉ”์ธํ…Œ์ด๋„ˆ์˜ ์‚ถ์„ ํž˜๋“ค๊ฒŒ ๋งŒ๋“ค๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ์—ฌ์ž๋“ค์˜ ์ผ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ, ํ•œ ๊ฐ€์ง€์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€... ์ฝ์„ ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๊นŒ?

์•ฝ 1๋…„ ์ „ Wesnoth์˜ 1.14 ๋ฆด๋ฆฌ์Šค ๋ฐ Steam ์ถœ์‹œ๋ฅผ ๋งˆ๊ฐํ•˜๋ฉด์„œ ์ €๋Š” erase() ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ std::list ์ธ ์‚ฌ์šฉ์ž ์ •์˜ ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌํŒฉํ† ๋ง ํ”„๋กœ์ ํŠธ์— ์ฐฉ์ˆ˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์ž. ๋‹ค์Œ์€ ๋ฌธ์ œ์˜ ์ปค๋ฐ‹ ์›์น™ ์ž…๋‹ˆ๋‹ค. ์ œ๋Œ€๋กœ ํ•˜๋ ค๋ฉด ๊ทธ ํ›„์— ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ–ˆ์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ ๋œ ๋ถˆํˆฌ๋ช…ํ•œ ์ฝ”๋“œ์˜€์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, ๋งค์šฐ ์œ ์šฉํ•œ C++11 ๊ธฐ๋Šฅ์„ ๋ถˆ๋ฒ•ํ™”ํ•˜๊ณ  STL ์œ ํ˜•๋ณด๋‹ค ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•์„ ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฒƒ์€ ์žฅ๊ธฐ์ ์œผ๋กœ Godot์— ๋ฐฉํ•ด๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ(์ €๋ฅผ ๋ฏฟ์œผ์„ธ์š”, ์ €๋„ ์••๋‹ˆ๋‹ค), ํ˜„์žฌ ์ƒํ™ฉ์—์„œ๋Š” ๊ฒฐ๊ตญ catch-22๋กœ ๋๋‚  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. STL(๋ผ๊ฑฐ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ ๋“ฑ) ์‚ฌ์šฉ์˜ ๋‹จ์ ์„ ํ”ผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ƒˆ๋กœ์šด C++ ํ‘œ์ค€์—์„œ ๋” ๋‚˜์€ ์„ฑ๋Šฅ๊ณผ ๊น”๋”ํ•œ โ€‹โ€‹์ฝ”๋“œ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ ์  ๋” ์–ด๋ ค์›Œ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•์—์„œ ๋‚ด๋ถ€ ๊ตฌ์„ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ํŠน๋ณ„ํžˆ ๊ธฐ๋Œ€ํ•˜๋Š” ์‚ฌ๋žŒ์€ ์•„๋ฌด๋„ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜ฌ

์—ฌ๊ธฐ์—์„œ ๋‚ด ์˜๊ฒฌ์ด ํฐ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ C++03์—์„œ ์ตœ์‹  C++๋กœ ์ด๋™ํ•œ ๋Œ€๊ทœ๋ชจ C++ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ์ž‘์—…ํ•œ ์‚ฌ๋žŒ์˜ ๊ด€์ ์—์„œ ๋‚ด ์ƒ๊ฐ์„ ์ œ๊ณตํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์ž‘์—…์ด์ง€๋งŒ ์žฅ๊ธฐ์ ์œผ๋กœ ๋ณผ ๋•Œ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๋Œ€ํ•œ ํ…์ŠคํŠธ์›”์„ ์šฉ์„œํ•˜์„ธ์š”!

๋ชจ๋“  65 ๋Œ“๊ธ€

์ด๊ฒƒ์€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋…ผ์˜๋˜์—ˆ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์ธ ๋‹ต๋ณ€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1) ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ 03 ์ด์ƒ์œผ๋กœ ์˜ฎ๊ธฐ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์ด ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. GDNative C++์˜ ๊ฒฝ์šฐ ์™„๋ฒฝํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2) STL/Boost/Etc ์‚ฌ์šฉ ์˜ํ–ฅ ์—†์Œ. ์ด๋ก ์  ๊ทผ๊ฑฐ๋Š” ํ•ญ์ƒ ๋™์ผํ–ˆ์Šต๋‹ˆ๋‹ค: a) Godot ํ…œํ”Œ๋ฆฟ์€ ํ‰์†Œ ํ•˜์ง€ ์•Š๋Š” ์ž‘์€ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ์›์ž์  ์ฐธ์กฐ ํšŸ์ˆ˜ ๋ฐ ์“ฐ๊ธฐ ์‹œ ๋ณต์‚ฌ) b) STL์€ ๋งค์šฐ ๊ธด ๋งน๊ธ€๋ง๋œ ๊ธฐํ˜ธ๋กœ ์ธํ•ด ๊ฑฐ๋Œ€ํ•œ ๋””๋ฒ„๊ทธ ๊ธฐํ˜ธ์™€ ๋””๋ฒ„๊ทธ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ ์ธ ๋Œ€ํ™”์— ๋Œ€ํ•œ ์˜๊ฒฌ์ด ์ข€ ์žˆ์—ˆ์ง€๋งŒ
ํ† ๋ก  ๋” ๊ณต๊ฐœ.

์ด๋ฏธ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ๋…ผ์˜๋˜๊ณ  ๋‹ซํ˜€ ์žˆ๋Š”์ง€ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค.

auto, constexpr ๋“ฑ๋„ ๋ฒ„๋ฆฌ๋‚˜์š”?

'๋“ฑ๋ก'์„ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์—˜ 7์›” 18์ผ 2017๋…„ ์˜คํ›„ 1์‹œ 54๋ถ„, "ํ›„์•ˆ ๋ฆฌ๋‹ˆ์—์ธ ํ‚ค" ์•Œ๋ฆผ @github.com
๊ธฐ๋ก:

์ด๊ฒƒ์€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋…ผ์˜๋˜์—ˆ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์ธ ๋‹ต๋ณ€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ 03 ์ด์ƒ์œผ๋กœ ์˜ฎ๊ธฐ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    ๊ทธ๋Ÿด ๊ฐ€์น˜๊ฐ€ ์—†์–ด. GDNative C++์˜ ๊ฒฝ์šฐ ์™„๋ฒฝํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. STL/Boost/Etc๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทผ๊ฑฐ๋Š” ํ•ญ์ƒ
    ๋™์ผ: a) Godot ํ…œํ”Œ๋ฆฟ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜์ง€ ์•Š๋Š” ์ž‘์€ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ์›์ž
    refcounts ๋ฐ copy on write) b) STL์€ ๊ฑฐ๋Œ€ํ•œ ๋””๋ฒ„๊ทธ ๊ธฐํ˜ธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋””๋ฒ„๊ทธํ•ฉ๋‹ˆ๋‹ค.
    ๋งค์šฐ ๊ธด ๋งน๊ธ€๋ง๋œ ๊ธฐํ˜ธ๋กœ ์ธํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ

์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

โ€”
์Šค๋ ˆ๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/godotengine/godot/issues/9694#issuecomment-316041201 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ALQCtipKmepD_1Xw6iRXZ7aGoQlLfiwFks5sPJzqgaJpZM4ObOio
.

์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์•ˆ์ „ํ•˜๊ณ  ์ด ์ฝ”๋“œ๊ฐ€ NIH ์ฆํ›„๊ตฐ์„ ์•“๊ณ  ์žˆ๋‹ค๊ณ  ์ด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ–ˆ์ง€๋งŒ ์ƒ์œ„๋Š” ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ƒ๊ฐ์ด ์—†์œผ๋ฏ€๋กœ ํฌ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ํˆฌ์žํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋ฐ๋Š” ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์–ด๋–ป๊ฒŒ ๋“  ์ด๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์—”์ง„ ์‚ฌ์šฉ์ž๋Š” "๋ฆฌํŒฉํ† ๋ง"(๊ธฐ์ˆ  ๋ถ€์ฑ„์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€ ์•Š๊ณ )๋ณด๋‹ค ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

@Marqin ์ฃ„์†กํ•˜์ง€๋งŒ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

1) ์œ ์ผํ•˜๊ฒŒ ์œ ์šฉํ•œ ๊ฒƒ์€ ์–ธ๊ธ‰๋œ ๊ฒƒ์ด๊ณ , ๋‚˜๋จธ์ง€๋Š” ์–ธ์–ด์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ •์‹ ์  ์ž์œ„์ž…๋‹ˆ๋‹ค.
2) ๋ชจ๋“  ๊ณณ์—์„œ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋”์ฐํ•œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ผ์œผํ‚ค๋Š” ์ฐธ์กฐ ์ฃผ๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
3) ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์œ ์‚ฌํ•œ Ref<>๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ฐธ์กฐ ์นด์šดํŒ…์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์ ์ด ์žˆ์œผ๋ฏ€๋กœ C#๊ณผ ๊ฐ™์€ ์–ธ์–ด์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์œ ํ•œ gc

๊ทธ๋Ÿฌ๋‹ˆ ์šฐ๋ฆฌ๊ฐ€ ๋ณ€๋•์Šค๋Ÿฝ๊ฒŒ ๊ฒฐ์ •ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๊ธฐ ์ „์— ๋จผ์ € ๋ฌผ์–ด๋ณด์„ธ์š”. ์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ •๋ณด์— ์ž…๊ฐํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ณ  ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ชจ๋“  ์‚ฌ๋žŒ๊ณผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋จธ์ง€๋Š” ์–ธ์–ด์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ •์‹ ์  ์ž์œ„์ž…๋‹ˆ๋‹ค.

@reduz , ๋ช…์‹œ์  ์†Œ์œ ๊ถŒ๊ณผ ์–ธ์–ด์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” RAII ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๊ฐ€ ์žˆ๋Š” unique_ptr์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์Šค๋ ˆ๋”ฉ๋„ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค(์˜ˆ: lock_guard ).

@RandomShaper ์ €๋Š” ๋ฏธ๋ž˜์˜ ์–ด๋Š ์‹œ์ ์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ตœ์‹  C++ ๋ฒ„์ „์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋œ ๋ช…์‹œ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค(์ผ๋ฐ˜์ ์œผ๋กœ auto ํ‚ค์›Œ๋“œ ๋‚จ์šฉ).

๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ์ด์ (์˜ˆ: ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  rtti๋ฅผ ์•ฝ๊ฐ„์˜ ๋น„์šฉ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Œ)์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ›จ์”ฌ ๋” ์ž‘์€ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ดœ์ฐฎ์•„. ๋‚˜๋Š” ๋‹น์‹ ์˜ ๋ง์„ ์กด์ค‘ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ํ† ๋ก ํ•˜๋Š” ๊ฒƒ์ด ๊ฑด๊ฐ•ํ•œ ์ผ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ช‡๋ช‡ ํฐ ๋น„๋””์˜ค ๊ฒŒ์ž„ ํšŒ์‚ฌ(Ubisoft, IIRC)๊ฐ€ ํฐ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์„ ํ˜„๋Œ€์ ์ธ C++๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ Godot์—๋„ ์™„๋ฒฝํ•˜๊ฒŒ ์ ํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ง€์ ํ–ˆ๋“ฏ์ด ์ž‘์—…/์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ :

  • ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ฝ”๋“œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์œ„ํ•ด ํ•ฉ๋ฆฌ์ ์ธ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.
  • ๋˜๋Š” ์ตœ์†Œํ•œ ์ƒˆ ์ฝ”๋“œ์— ๋Œ€ํ•ด "์Šน์ธ๋จ"์œผ๋กœ ํ•ฉ๋ฆฌ์ ์ธ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ auto ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ธฐ๋Šฅ์„ ๋‚จ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ฝ”๋”ฉ ์Šคํƒ€์ผ์„ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ง€๊ธˆ์€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋†’์€ ๊ฒƒ๋„ ์žˆ์ง€๋งŒ, 3.0์ด ์•ˆ์ •ํ™”๋˜๊ฑฐ๋‚˜ ๋ฏธ๋ž˜์˜ ๋‹ค๋ฅธ ์‹œ์ ์ด ๋˜๋ฉด ์ด๋ฏธ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Marqin ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Godot๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•ด ์ž์ฒด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ƒˆ๋กœ์šด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ž ๊ธˆ ๊ฐ€๋“œ๋Š” ์‚ฌ์‹ค์ƒ 3์ค„์˜ ์ฝ”๋“œ์ด๋ฉฐ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ C++11+๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, "ํ‘œ์ค€" 1) ์–ด๋–ค ๊ฒƒ์ด๋“  ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ข‹์•„์•ผ ํ•˜๊ณ  2) ์–ด์จŒ๋“  ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋” ๋‚ซ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? .๋‚ด ์ƒ๊ฐ์— ๊ทธ๊ฒƒ์€ ํ”ํ•œ ํ—›์†Œ๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ธ์‡„ ๊ธฐ๋Šฅ์„ ์‚ญ์ œํ•˜๊ณ  ostream/istream์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฝค ๋ฉ‹์ง„ String ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ํ›จ์”ฌ ๋” ๋งˆ๋น„๋œ std::string ๋˜๋Š” std::wstring์œผ๋กœ ๊ต์ฒดํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ชจ๋“  ์šฉ๋„๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๋ณด๋‹ค ๋” ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ๊ทธ๊ฒƒ๋“ค์„ ํ•„์š”๋กœ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์กด์žฌํ•˜๋ฉฐ, ํƒ€๋‹นํ•œ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฌด์‹œํ•˜๊ณ  ์ž์‹ ๋งŒ์˜ ๊ตฌํ˜„์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด์— ๋Œ€ํ•ด ํ™•์‹ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@RandomShaper ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1) ์ด์ต๋ณด๋‹ค ๋น„์šฉ์ด ๋” ๋งŽ์ด ๋“ ๋‹ค.
2) C++11+๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํ‘œ์ค€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋งŽ์€ ์ธ์ˆ˜์— ๋Œ€ํ•œ ์ฐฝ์„ ์—ฝ๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€๋Š” ๊ทธ๊ฒƒ๋“ค์„ ๊ฐ€์งˆ ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ  ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์—”์ง„์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์–ธ์  ๊ฐ€๋Š” ์œ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ง‘์ค‘ํ•ด์•ผ ํ•  ํ›จ์”ฌ ๋” ์ค‘์š”ํ•œ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
3) ๋˜ํ•œ ์ด์ „์— ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ƒˆ๋กœ์šด C++ ๋ฒ„์ „์œผ๋กœ ํฌํŒ…ํ•˜๋Š” ๊ฒƒ๋งŒํผ ๋ฉ‹์ง„ ์†Œ๋ฆฌ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋กœ ์ธํ•ด ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ํ›จ์”ฌ ์ปค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ๋กœ์„œ๋Š” ์‹ฌ๊ฐํ•˜๊ฒŒ ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ช‡ ๋…„ ํ›„์— ๋‹ค์‹œ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ Godot๊ฐ€ --std=c++17๊ณผ ๊ฐ™์€ ์˜ต์…˜์œผ๋กœ ์ปดํŒŒ์ผ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•„์š”ํ•˜๋‹ค๋ฉด ํ˜„๋Œ€ C++๋กœ ์ž‘์„ฑ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, https://github.com/godotengine/godot/issues/9691 ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ register ํ‚ค์›Œ๋“œ ์ œ๊ฑฐ์— ํˆฌํ‘œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ๋“  ๊ด€๋ จ์ด ์žˆ์ง€๋งŒ gcc-6.3์ด ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ธ€์„ ์ฝ์€ ๊ธฐ์–ต์ด ์žˆ์Šต๋‹ˆ๋‹ค(google
https://github.com/godotengine/godot/issues/7703์— ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. gcc-6.3์ด ๋‚ด ๋ฐฐํฌํŒ(debian stable)์˜ ๊ธฐ๋ณธ ์ปดํŒŒ์ผ๋Ÿฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ท€์ฐฎ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ๊ทธ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์™œ ๊ทธ๋Ÿฐ๋ฐ?

@efornara ์ผ๋ถ€ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์ด๋ฏธ ์ตœ์‹  C++ ๋ฒ„์ „์ด ํ•„์š”ํ•˜๋ฉฐ Scons๊ฐ€ ๋ณต์ œ๋œ ๋นŒ๋“œ ํ™˜๊ฒฝ์—์„œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ณด๋ ค๋ฉด etc2comp thridparty ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

@karroffel ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ข‹์€ ๊ธฐ๋Šฅ์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๋ˆ„๊ตฐ๊ฐ€ ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ณ  ์ด ๊ฒŒ์‹œ๋ฌผ์„ ์ฐพ์€ ๊ฒฝ์šฐ ๊ด€๋ จ ํŒŒ์ผ์€ https://github.com/godotengine/godot/blob/master/modules/etc/SCsub ์ž…๋‹ˆ๋‹ค. grep์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฐพ์•˜์œผ๋ฉฐ ํ˜„์žฌ ์ด๊ฒƒ์ด ํ•„์š”ํ•œ ์œ ์ผํ•œ ์žฅ์†Œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

C++11์„ C++11์ด ์•„๋‹Œ ์ฝ”๋“œ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - http://gcc.gnu.org/wiki/Cxx11AbiCompatibility

@Marqin ๋งํฌ๋ฅผ ์ž˜๋ชป ์ดํ•ดํ•˜์ง€ ์•Š๋Š” ํ•œ ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ Godot๊ฐ€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์ง€๋งŒ ๋Œ€์‹  ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

C++98 ์–ธ์–ด๋Š” C++11 ์–ธ์–ด์™€ ABI ํ˜ธํ™˜๋˜์ง€๋งŒ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์—ฌ๋Ÿฌ ์œ„์น˜์—์„œ ํ˜ธํ™˜์„ฑ์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

์–ธ์–ด๋ฅผ ํ˜ผํ•ฉํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ์•ˆ์ „ํ•ด ๋ณด์ด์ง€๋งŒ(๋‚˜๋„ ์ธ์ •ํ•˜๊ณ  ์•ž์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Œ) ์Œ, ๋ฒกํ„ฐ, ๋ชฉ๋ก ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ํ˜ผํ•ฉํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

@efornara ์ด ๋งํฌ๋Š” C++11์„ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ C++03์„ ์‚ฌ์šฉํ•˜๋Š” Godot์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Marqin ์˜ˆ, ํ•˜์ง€๋งŒ ๋งํฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐฉ์‹์€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๋Ÿฌ๋ถ„์ด ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ std::list<>๋ฅผ Godot์—์„œ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@reduz Godot์˜ ๋‚ด๋ถ€ Ref<> ๋ฌธ์„œ๋Š” ์–ด๋””์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋‚˜์š”? Godot ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ STL์˜ ์ปจํ…Œ์ด๋„ˆ์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€์— ๋Œ€ํ•œ ๋ฌธ์„œ๋Š” ์–ด๋””์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋‚˜์š”?

@Marqin ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ์šฐ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
http://docs.godotengine.org/en/stable/development/cpp/core_types.html#containers
Ref<>์˜ ๊ฒฝ์šฐ์—๋Š” ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์•„๋งˆ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์„œ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ œ์•ˆ์€ ๋งค์šฐ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์ƒˆ๋กœ์šด C++ ํ‘œ์ค€์ด ์•„์ฃผ ํ›Œ๋ฅญํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋„ˆ๋ฌด ์ ์€ ์ด๋“์„ ์œ„ํ•ด ๋„ˆ๋ฌด ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— Godot ๋‚ด๋ถ€ ๋ฆฌํŒฉํ† ๋ง์„ ์ œ์•ˆํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ”๋กœ ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ C++์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ƒˆ๋กœ์šด Godot ๊ธฐ๋Šฅ๊ณผ GDNative์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
์ €๋Š” ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ Godot๊ฐ€ ์ตœ์‹  C++ ์ง€์›์œผ๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

@reduz C++11/14/17์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ ๋ช…์‹œ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํž˜๋“  ์ผ์ด์ง€๋งŒ C++ ์ดˆ๋ณด์ž์—๊ฒŒ๋Š” ๋‹จ์ ์ด์ง€๋งŒ C++ ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์ข‹์€ ์ ์ž…๋‹ˆ๋‹ค.
"์ž๋™"์— ๊ด€ํ•ด์„œ๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž์—๊ฒŒ๋„ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ผญ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ์œ ํ˜•์„ ๊ณ„์†ํ•ด์„œ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ผ๋ถ€ ๋ฒ„๊ทธ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ๋„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ €๋Š” ์ตœ๊ทผ ๋งˆ์Šคํ„ฐ(godot3)๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปดํŒŒ์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

scons platform=x11 target=debug tools=yes builtin_openssl=true CCFLAGS=-std=c++17

๋ฐ๋น„์•ˆ ์ŠคํŠธ๋ ˆ์น˜(gcc-6.3)์—์„œ. ์„ฑ๊ฐ€์‹œ๊ฒŒ๋„ ์ด ์˜ต์…˜์€ C ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•  ๋•Œ๋„ ์„ค์ •๋˜๋ฏ€๋กœ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ์Ÿ์•„์ง€์ง€๋งŒ ๊ทธ ์™ธ์—๋Š” ๋ชจ๋‘ ์ˆœ์กฐ๋กญ๊ฒŒ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. register ํ‚ค์›Œ๋“œ์กฐ์ฐจ๋„ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ณต์‹ ๋นŒ๋“œ๊ฐ€ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ปดํŒŒ์ผ๋˜๋„๋ก ์ œ์•ˆํ•˜๋Š” ๊ฒƒ๊นŒ์ง€๋Š” ์•„๋‹ˆ์ง€๋งŒ ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์˜ต์…˜์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ ์ด๊ฒƒ์„ ๊นจ๋Š” ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ํšŒ๊ท€๋กœ ์ทจ๊ธ‰๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ผ๋ถ€ ์˜คํƒ€๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๊ฒฝ๊ณ ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ท€์ฐฎ๊ฒŒ๋„ C ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•  ๋•Œ๋„ ์˜ต์…˜์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

CPPFLAGS ์œผ๋กœ ์‹œ๋„ํ•˜์…จ์Šต๋‹ˆ๊นŒ?

@Hinsbart ์•„๋‹ˆ์š”,ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์ด ์žˆ์„์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ ์ €๋Š” scons๋ฅผ ์ž˜ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋•œ์งˆ์—†์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋Œ€๋กœ๊ฐ”์Šต๋‹ˆ๋‹ค.

$ scons platform=x11 builtin_openssl=true -h | grep FLAGS
CCFLAGS: Custom flags for the C and C++ compilers
CFLAGS: Custom flags for the C compiler
LINKFLAGS: Custom flags for the linker

ํŽธ์ง‘: ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด Godot ๋นŒ๋“œ ์‹œ์Šคํ…œ์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๋ชจ๋ฅด์ง€๋งŒ CPPFLAGS ๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ ์˜ต์…˜์„ ์ƒ๊ฐํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ํ•ญ์ƒ C++์— CXXFLAGS ๋ฅผ ์‚ฌ์šฉํ•ด ์™”์Šต๋‹ˆ๋‹ค.

CPPFLAGS๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ?

CPPFLAGS ๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์–ธ์–ด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ C์™€ C++๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

@m4nu3lf GDNative ์—์„œ ์›ํ•˜๋Š” C++ ํ˜•์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ฒฝํ—˜์ƒ ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ธฐํšŒ๊ฐ€ ์ข‹์€ ๊ธฐํšŒ์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ํŒŒ์ผ์ด ์‚ญ์ œ๋˜๊ณ  C++11 ๋ณ€์ข…์œผ๋กœ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฌธ์„œํ™”ํ•˜๋Š” ์ผ์ข…์˜ ์œ„ํ‚ค ํŽ˜์ด์ง€๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์Šค๋ ˆ๋”ฉ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ๋“ฑ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ์„ ์œ„ํ•œ ๋ณ€๊ฒฝ์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์†๋‹ด koolaid). ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ LLVM ํ”„๋กœ์ ํŠธ ๋ฐ ๊ธฐํƒ€ ๋งŽ์€ FOSS ํ”„๋กœ์ ํŠธ๋Š” ๋ณด๋‹ค ๋ช…ํ™•ํ•œ ๊ตฌ๋ฌธ ํŒจํ„ด, ์ฆ‰ ์ƒˆ๋กœ์šด for-iterator ํ‘œ๊ธฐ๋ฒ•์„ ์„ ํ˜ธํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ”์Šต๋‹ˆ๋‹ค. (์†”์งํžˆ ๋งํ•ด์„œ) ๊ฐ€๋Šฅํ•œ ํ•œ ์ ์€ ํ”Œ๋žซํผ ํŠน์ • ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๊ฒŒ์ž„ ์—”์ง„์— ์ด์ƒ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ์˜ ๋ถ„๋ฆฌ๋ฅผ ๊ฐ ์–ธ์–ด ๋Ÿฐํƒ€์ž„์— ์˜คํ”„๋กœ๋”ฉํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์ž‘์„ฑํ•˜๊ฒŒ ๋  ์ตœ๊ณ ์˜ ์ฝ”๋“œ๋Š” ๋‹น์‹ ์ด ์“ฐ์ง€ ์•Š์€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. :)

ํ˜ธ๊ธฐ์‹ฌ์œผ๋กœ ์ธํ•ด ์ด์ „ C++ ๋ฐ ์ตœ์‹  C++๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? C++ ๋ฒ„์ „ ๊ฐ„์— ์ค‘์š”ํ•œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํ˜ธ๊ธฐ์‹ฌ์œผ๋กœ ์ธํ•ด ์ด์ „ C++ ๋ฐ ์ตœ์‹  C++๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? C++ ๋ฒ„์ „ ๊ฐ„์— ์ค‘์š”ํ•œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ตœ์‹  C++๋Š” 99.99...%์˜ ๊ฒฝ์šฐ์—์„œ ์ด์ „ C++์™€ ์—ญํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. .

๊ทธ๋Ÿฌ๋‚˜ ์ตœ์‹  C++์—๋Š” ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉฐ ์ด์ „ C++ ๋ฒ„์ „์—์„œ๋Š” ๋ถ„๋ช…ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ๊ฐ€๋ณ€ ๋งคํฌ๋กœ ๋ฐ auto ๋ฐ ๋žŒ๋‹ค์™€ ๊ฐ™์€ ์‚ฌ์šฉ์„ฑ ๊ธฐ๋Šฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ move ์™€ ๊ฐ™์€ ํšจ์œจ์„ฑ ๊ธฐ๋Šฅ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ Visual Studio๋„ ์ตœ์‹  C++17์„ ์ง€์›ํ•œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ์ตœ์‹  ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€์„ ๋‹ฌ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” auto_ptr์„ ์‚ฌ์šฉํ•˜๋Š” third_party ๋ฌผ๊ฑด ์ค‘ ํ•˜๋‚˜๋ผ๋Š” ์œ ์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” C++17 ํ”Œ๋ž˜๊ทธ๋กœ Godot๋ฅผ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” C++17์—์„œ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ฌธ์ œ๋Š” C++17 ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค, ๋˜๋Š” ๋” ๋‚˜์œ ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ PR์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค... ํ”„๋กœ์ ํŠธ๊ฐ€ c์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋งŒ ++03.

๋žŒ๋‹ค๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์—ฌ๊ธฐ์„œ ๋ณผ ์ˆ˜ ์—†๋Š” ๊ฑฐ๋Œ€ํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ ๋ฒˆ, Godot๋Š” ๋ฐ์ดํ„ฐ์˜ ์ž„์‹œ ๋ชฉ๋ก์„ ์ €์žฅํ•œ ๋‹ค์Œ ์ด๋ฅผ ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ์— "for_each" ๋˜๋Š” ์ž์ฒด์ ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ธ๋ผ์ธ/์ตœ์ ํ™”๋˜๋Š” ๋žŒ๋‹ค ๋•๋ถ„์— ์—„์ฒญ๋‚œ ์–‘์˜ ์ฝ”๋“œ ๋‹จ์ˆœํ™”, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ์†Œ ๋ฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉ๋˜๋Š” C++11์ž…๋‹ˆ๋‹ค). ์—ฐ๊ฒฐ๋œ ๋ชฉ๋ก์˜ ๋ชจ๋“  ์ผ๋ฐ˜ ๋ฃจํ”„์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ๋˜‘๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๋™ ์—ฐ์‚ฐ์ž๋Š” ๋” ๋‚˜์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํ—ˆ์šฉํ•˜์—ฌ ํ˜„์žฌ์˜ ์ ˆ๋Œ€์ ์œผ๋กœ ์ข‹์ง€ ์•Š์€ ๊ตฌ์กฐ๋ฅผ ๋” ์ตœ์ ํ™”๋œ ์ผ๋ถ€๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ ์œ ํ˜•(์˜ˆ: "mystring"_hs) ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์€ ํ•ด์‹œ๋œ ๋ฌธ์ž์—ด์„ ์ฝ”๋“œ์˜ ๋ชจ๋“  ๊ณณ์— ํผ๋œจ๋ฆฌ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์—ฌ ๋ฌธ์ž์—ด ๊ฒ€์‚ฌ(์Šคํฌ๋ฆฝํŠธ ๋ฐ ์ด๋ฒคํŠธ ์ฝ”๋“œ์—์„œ ๋งค์šฐ ์ผ๋ฐ˜์ ์ž„)๋ฅผ ํ›จ์”ฌ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

std::thread๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋”๋ผ๋„(์ œ ์ƒ๊ฐ์—๋Š” ์ƒ๋‹นํžˆ ๋”์ฐํ•œ ์ถ”์ƒํ™”๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค), std atomics ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋†€๋ž๊ณ  ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. std::์›์ž๊ทธ๋ฆฌ๊ณ  ์ข‹์•„ํ•˜๋Š” ๊ฒƒ.

๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋žŒ๋“ค์ด ํ˜„๋Œ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์—†์„ ๋•Œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ C++03์„ ๊ฐ•์š”ํ•˜๋Š” ๊ฒƒ์ด ํ”„๋กœ์ ํŠธ ์ž์ฒด์— ์–ผ๋งˆ๋‚˜ ํฐ ํƒ€๊ฒฉ์„ ์ฃผ๋Š”์ง€ ์ด์•ผ๊ธฐ์กฐ์ฐจ ํ•˜์ง€ ๋ง์ž. ์™œ๋ƒํ•˜๋ฉด Godot๋Š” ๊ทธ๋Ÿฐ ์˜ค๋ž˜๋œ ๋ฒ„์ „์˜ C++์—์„œ ํฌ๊ธฐ๋˜์ง€ ์•Š์€ ์œ ์ผํ•œ ์˜คํ”ˆ ์†Œ์Šค C++ ํ”„๋กœ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค( ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ)

๊ฐœ์ธ์ ์œผ๋กœ, ์ €๋Š” ๋ณด์ˆ˜์ ์ด๊ณ  ์ ˆ๋Œ€์ ์ธ ์ตœ์‹  C++ ํ‘œ์ค€์„ ๋”ฐ๋ฅด์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ, C++14์˜ ์ผ๋ถ€ ๊ฒ€์ฆ๋œ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” C++11๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ๊ฐ€์žฅ ์ž˜ ์ž‘๋™ํ•˜๊ณ  Godot๋ฅผ ํฌ๊ฒŒ ๊ฐœ์„ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. C++11-14๋Š” ps4, xbox, ์Šค์œ„์น˜, pc, ์ €๊ฐ€ํ˜• PC, Android, IOS ๋ฐ HTML5 ์›น ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ํฌํŒ…๋˜๋Š” Unreal Engine์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ›จ์”ฌ ์ ์€ ์–‘์˜ ํ”Œ๋žซํผ์„ ์ง€์›ํ•˜๋Š”๋ฐ Godot๊ฐ€ ์Šค์Šค๋กœ๋ฅผ ์ œํ•œํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ ์œ ํ˜•(์˜ˆ: "mystring"_hs) ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์€ ํ•ด์‹œ๋œ ๋ฌธ์ž์—ด์„ ์ฝ”๋“œ์˜ ๋ชจ๋“  ๊ณณ์— ํผ๋œจ๋ฆฌ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์—ฌ ๋ฌธ์ž์—ด ๊ฒ€์‚ฌ(์Šคํฌ๋ฆฝํŠธ ๋ฐ ์ด๋ฒคํŠธ ์ฝ”๋“œ์—์„œ ๋งค์šฐ ์ผ๋ฐ˜์ ์ž„)๋ฅผ ํ›จ์”ฌ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋˜ํ•œ ์Šค์œ„์น˜์™€ ๊ฐ™์€ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๋…„ ์ „์— ํ”Œ๋ผ์ด์›จ์ดํŠธ ๋ฌธ์ž์—ด ๊ตฌํ˜„์„ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด Atom ์œ ํ˜•์„ ๋งŒ๋“  ๊ฒƒ์ฒ˜๋Ÿผ:
https://github.com/OvermindDL1/OverECS/blob/master/StringAtom.hpp

32๋น„ํŠธ(์ตœ๋Œ€ 5์ž ๋˜๋Š” ํ…Œ์ด๋ธ”์„ ์•ฝ๊ฐ„ ๋‹ค์‹œ ์ฝ”๋”ฉํ•˜๋Š” ๊ฒฝ์šฐ 6์ž)์™€ 64๋น„ํŠธ ๋ฒ„์ „(๊ธด๋ฐ€ํ•œ ์ธ์ฝ”๋”ฉ ์„ ํƒ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ตœ๋Œ€ 10 ๋˜๋Š” 12์ž)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋˜๋Š” ๋Ÿฐํƒ€์ž„์— ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋™์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋ฉฐ ์Šค์œ„์น˜ ๋“ฑ์—์„œ ์™„์ „ํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋“ฑ... ํ•ด๋‹น ํŒŒ์ผ์˜ ์‚ฌ์šฉ ์˜ˆ:

switch(blah) {
  case "UPDATE"_atom64: ... pass
  case "PHYSUPDATE"_atom64: ... pass
  ...
}

LUA ์ฝ”๋“œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ๋•Œ ๋ฐฉ๊ธˆ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ฒฝ๊ณ„์—์„œ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํŒŒ์ผ์€ "์ตœ์‹ " ๋ฒ„์ „์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ •์ˆ˜์—์„œ ๋ฌธ์ž์—ด๋กœ ๋Œ์•„๊ฐˆ ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์—†์ด ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค(์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด->์ •์ˆ˜์— ๊ด€๊ณ„์—†์ด ํ• ๋‹น์ด ์—†์Œ). . Atom64/Atom32/๋ชจ๋“  ์œ ํ˜•์„ ํ‘œ์‹œํ•  ๋•Œ ์ธ์ฝ”๋”ฉ์„ ๋ฐ˜๋Œ€๋กœ ํ•˜๋Š” Visual Studio ๋˜๋Š” GDB ํ•„ํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์€ ํŠนํžˆ ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•œ ์ฝ”๋“œ์—์„œ ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•˜๋ฉฐ, ์ด๊ฒƒ์€ ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์•„๋‹ˆ๋ผ C++11๋งŒ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ตœ์†Œํ•œ C++14๊ฐ€ Godot ํ‘œ์ค€์ด ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. C++17์€ ์ข‹์„ ์ˆ˜ ์žˆ์ง€๋งŒ(์ผ๋ถ€ ์ƒˆ ์ฝ”๋“œ์—์„œ ์ผ๋ถ€ ๋งค์šฐ ์œ ์šฉํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ), C++14๋Š” ํ˜„์žฌ ๋ณดํŽธ์ ์ธ ์ตœ์†Œ ์‚ฌ์–‘์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌผ๋ก  gcc/clang/VisualStudio ๋ฐ ๊ธฐํƒ€ ๋ชจ๋“  ๊ฒƒ์ด ์ด์ œ C++17์„ ์ž˜ ์ง€์›ํ•˜๋ฏ€๋กœ(๊ทธ๋ฆฌ๊ณ  C++20์˜ ํฐ ๋ฉ์–ด๋ฆฌ๊นŒ์ง€๋„) C++17๋„ ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„๋งˆ๋„ '๊ฒฝ์šฐ์— ๋”ฐ๋ผ'๋ฅผ ์œ„ํ•ด C++14๋ฅผ ์„ ํƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@OvermindDL1 ๊ทธ Atom ๋ฌผ๊ฑด์€ ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค. ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ทธ ์ •ํ™•ํ•œ ์ผ์„ ๊ฝค ๋งŽ์ด ํ•˜๋Š” Godot์™€ ์ •๋ง ์ž˜ ๋งž์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ Atom ๋ฌผ๊ฑด์€ ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ทธ ์ •ํ™•ํ•œ ์ผ์„ ๊ฝค ๋งŽ์ด ํ•˜๋Š” Godot์™€ ์ •๋ง ์ž˜ ๋งž์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@vblanco20-1 Godot๊ฐ€ ์›ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ํก์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ C++ ์—”์ง„์—์„œ ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉ๋˜์–ด ์™”์Šต๋‹ˆ๋‹ค. ์ž‘์€ ์ด๋ฒคํŠธ ํƒœ๊ทธ, ์‚ฌ๋ฌผ์˜ 'ํ‚ค'๋กœ ์‚ฌ์šฉํ•˜๋Š” ์งง์€ ๋ฌธ์ž์—ด์— ๋งค์šฐ ์œ ์šฉํ–ˆ์œผ๋ฉฐ Lua/LuaJit์—์„œ ์•ž๋’ค๋กœ ์‰ฝ๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ๋””๋ฒ„๊ฑฐ ํ•„ํ„ฐ๊ฐ€ ํฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋žŒ๋‹ค๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์—ฌ๊ธฐ์„œ ๋ณผ ์ˆ˜ ์—†๋Š” ๊ฑฐ๋Œ€ํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋žŒ๋‹ค๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋‚˜๋ฟ์ž…๋‹ˆ๊นŒ?

@Faless : ์•„๋‹ˆ์š”, ๋‹น์‹ ์ด ์œ ์ผํ•œ ์‚ฌ๋žŒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋žŒ๋‹ค๊ฐ€ ์ฝ๊ธฐ ์–ด๋ ค์šด ๊ฒƒ์ด Akien์ด C++ ๋ฒ„์ „์„ ์˜ฌ๋ฆฌ์ง€ ์•Š์€ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋žŒ๋‹ค๋Š” ์ž‘์€ ์ธ๋ผ์ธ ํ•จ์ˆ˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๋“ค์— ๋Œ€ํ•ด "์ฝ๊ธฐ ์–ด๋ ต๋‹ค"๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ ๋น„๊ต ํ•จ์ˆ˜๋ฅผ ๋ณด๋‚ด๋Š” Sort ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‚˜ ๋‚˜๋จธ์ง€ std ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฐ™์€ ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž„์‹œ ๋ฐฐ์—ด(octree ๋ฐ ๊ธฐํƒ€ ์‹œ์Šคํ…œ์˜ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐœ์ƒ)์ด ํ•„์š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•˜๊ณ  ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  std ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ‘๋ ฌ for, ๋ณ‘๋ ฌ ์ •๋ ฌ ๋ฐ ๋ณ‘๋ ฌ ๋ˆ„์ ์„ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด ์ฝ”๋“œ ํ’ˆ์งˆ, ์„ฑ๋Šฅ ๋ฐ ์žฌ์‚ฌ์šฉ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์„ ๋•Œ ์ด๋ฅผ "์ด์ƒํ•˜๋‹ค"๊ณ  ์“ฐ๋Š” ๊ฒƒ์€ ์ ˆ๋Œ€์ ์œผ๋กœ ์ˆ˜์น˜์Šค๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ด๋ฏธ ๊ตฌํ˜„ํ•œ ์‹ค์ œ ์˜ˆ:

//old linked list iteration
while (scenario->instances.first()) {
            instance_set_scenario(scenario->instances.first()->self()->self, RID());
        }
//new (just abstracts above)
scenario->instances.for_each([]( RID& item  ){
    instance_set_scenario(item, RID());
});

๋˜ ์ด๋Ÿฐ ๊ฒฝ์šฐ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ๋ฐ˜๋ณต๋˜์–ด

//old. Note the 1024 array, wich is hard size, and is wasting memory

int culled = 0;
Instance *cull[1024];
culled = scenario->octree.cull_aabb(p_aabb, cull, 1024);
for (int i = 0; i < culled; i++) {

    Instance *instance = cull[i];
    ERR_CONTINUE(!instance);
    if (instance->object_ID == 0)
        continue;

    instances.push_back(instance->object_ID);
}

//NEW. not implemented yet. 0 memory usage, can be inlined, and doesnt have a maximum size. 
//Its also shorter and will be faster in absolutely every case compared to old version.

scenario->octree.for_each_inside_aabb(p_aabb, [](Instance* instance){       
    ERR_CONTINUE(!instance);
    if (instance->object_ID == 0)
        continue;
    instances.push_back(instance->object_ID);
});

๋‚ด๊ฐ€ ์ด๋ฏธ ๊ตฌํ˜„ํ•œ ์‹ค์ œ ์˜ˆ:

์—ฌ๊ธฐ์—์„œ ์–ป๋Š” ์ด๋“์ด ๋ฌด์—‡์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ...

์‚ฌ๋žŒ๋“ค์ด ์ฝ”๋“œ ํ’ˆ์งˆ, ์„ฑ๋Šฅ ๋ฐ ์žฌ์‚ฌ์šฉ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์„ ๋•Œ ์ด๋ฅผ "์ด์ƒํ•˜๋‹ค"๊ณ  ์“ฐ๋Š” ๊ฒƒ์€ ์ ˆ๋Œ€์ ์œผ๋กœ ์ˆ˜์น˜์Šค๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค.

@vblanco20-1 ๊ธ€์Ž„, ๋‚˜๋Š” ๋‚˜ ์ž์‹ ์„ ์„ค๋ช…ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ด๋‹ค.
์‚ฌ๋žŒ๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

my_arr.push(
    [par1, par2, par3]{
      somefunc(par1, par2, par3);
    }
);

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค๋ฅธ ์žฅ์†Œ์—์„œ:

func = my_arr.front();
func();

์ฝ์„ ๋•Œ ์–ด๋–ค ๊ธฐ๋Šฅ์ด ์‹คํ–‰๋˜๋Š”์ง€, ๋ฌด์—‡์„ ์ฐพ์•„์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋‹จ์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ํŒŒ์ผ์— ์žˆ์œผ๋ฉด ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด๋‹น ๋ฐฐ์—ด์„ ์—ฌ๋Ÿฌ ํŒŒ์ผ์— ์ „๋‹ฌํ•˜๋ฉด ์ „์ฒด ์ฝ”๋“œ๋ฅผ ์ฝ์„ ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

@Falless ๊ท€ํ•˜์˜ ์˜ˆ๋Š” ๋žŒ๋‹ค๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์•…์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค(๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์‚ฌ์šฉ์€ ํ™•์‹คํžˆ ๊ธˆ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค).

"์‹œ๊ฐ„์— ๋”ฐ๋ผ" ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ• ๋‹นํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ์‚ฌ์šฉ์ด ์•„๋‹ˆ๋ฉฐ ์บก์ฒ˜๋œ ๋ณ€์ˆ˜๊ฐ€ ๋žŒ๋‹ค๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๊นŒ์ง€ ์œ ํšจํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํฐ ์œ„ํ—˜์ด ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: ํฌ์ธํ„ฐ๋ฅผ ๋ˆ„๋ฅธ ๋‹ค์Œ ๋žŒ๋‹ค๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๊ฐœ์ฒด๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์บก์ฒ˜๋œ ํฌ์ธํ„ฐ๊ฐ€ ๋งค๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค). ์ €๋Š” ๋žŒ๋‹ค๋ฅผ "์ฆ‰์‹œ" ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋žŒ๋‹ค๋ฅผ ๋ฐฉ์–ดํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

for_each ์˜ˆ์—์„œ for_each๋Š” ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ๋ณ€๊ฒฝ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์œผ๋ฉฐ(์˜ˆ: ๋ณ€์ˆ˜๋ฅผ ์•ฝ๊ฐ„ ์žฌ์ •๋ ฌํ•˜๋Š” ๊ฒฝ์šฐ) ๋” ๋งŽ์€ "๋ถˆํˆฌ๋ช…ํ•œ" ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค(์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” " ์–ด๋–ค ๊ฒƒ์ด ๋” ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜์šฉํ•จ์œผ๋กœ์จ "์‚ฌ์šฉ" ๊ณ„์ธต์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ถˆํˆฌ๋ช…ํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ํ›จ์”ฌ ๋” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๊ณ  ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…(์—ฐ๊ฒฐ ๋ชฉ๋ก ๋ฐ˜๋ณต)์„ ๋ณด๋‹ค "๋ช…ํ™•ํ•˜๊ฒŒ" ๋งŒ๋“ญ๋‹ˆ๋‹ค. " first()->self()->self "๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋…ธ๋“œ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” "unordered_for_each"์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์˜ ์ด์ ์€ ์‹ค์ œ๋กœ ๋” ๋งŽ์ด ์‚ฌ์šฉํ• ์ˆ˜๋ก ๋ˆ„์ ๋œ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค(ํ• ๋‹น์ž๋ฅผ ํ†ตํ•ด ๋˜๋Š” ์—ฐ๊ฒฐ ๋ชฉ๋ก์ด ๋งจ ์œ„์— ์ €์žฅ๋œ ๊ฒฝ์šฐ ๋ฐฐ์—ด) ๋˜๋Š” "reverse_for_each". "์ฐพ๊ธฐ" ๋˜๋Š” "์ •๋ ฌ"๊ณผ ๊ฐ™์€ ๊ฒƒ์กฐ์ฐจ๋„. (์ตœ์†Œํ•œ C++20 ๋ฒ”์œ„๊ฐ€ ๋ณ‘ํ•ฉ๋  ๋•Œ๊นŒ์ง€๋Š” std::algorithms๋ฅผ ๊ทธ๋‹ค์ง€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ์ผ๋ถ€๋กœ ์ž์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค)

Lambda๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Epic Games๊ฐ€ Sort, Partition, Filter, RemoveAll, Find ๋“ฑ๊ณผ ๊ฐ™์€ ์ž์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ C++11์—์„œ ์–ธ๋ฆฌ์–ผ ์—”์ง„์œผ๋กœ ํ—ˆ์šฉํ•œ ์ฒซ ๋ฒˆ์งธ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„๋กœ ๋‘˜ ๋‹ค ์†Œ์Šค ์ฝ”๋“œ์—์„œ ๊ฝค ์ž์ฃผ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—”์ง„ ์ฝ”๋“œ ๋ฐ ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด ์ฝ”๋“œ์—์„œ

์ฟจ, ์ ์–ด๋„ ์šฐ๋ฆฌ๋Š” ๋žŒ๋ฐ”๊ฐ€ ์„ฑ๋ฐฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ๊ทœ์น™์„ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ณต์—ฐ์— ๋Œ€ํ•ด ๋” ์—ฐ๊ตฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

2018๋…„ 12์›” 8์ผ ํ† ์š”์ผ 17:06 vblanco20-1 < ์•Œ๋ฆผ @github.com ์ž‘์„ฑ:

@Faless https://github.com/Faless ๊ท€ํ•˜์˜ ์˜ˆ๋Š”
๋žŒ๋‹ค๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ(๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์‚ฌ์šฉ๋ฒ•์€ ํ™•์‹คํžˆ
๊ธˆ์ง€).

"์‹œ๊ฐ„์— ๋”ฐ๋ผ" ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์‚ฌ์šฉ์ด ์•„๋‹™๋‹ˆ๋‹ค.
ํ• ๋‹นํ•˜๊ณ  ์บก์ฒ˜๋œ ๋ณ€์ˆ˜๋กœ ํฐ ์œ„ํ—˜์ด ๋ฉ๋‹ˆ๋‹ค.
๋žŒ๋‹ค๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๊นŒ์ง€ ์œ ํšจํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค(์˜ˆ:
ํฌ์ธํ„ฐ๋ฅผ ์บก์ฒ˜ํ•œ ๋‹ค์Œ ๋žŒ๋‹ค๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๊ฐœ์ฒด๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
์บก์ฒ˜๋œ ํฌ์ธํ„ฐ๊ฐ€ ๋งค๋‹ฌ๋ ค ์žˆ์Œ). ๋‚˜๋Š” ๋‹จ์ง€ ๋žŒ๋‹ค๋ฅผ ์˜นํ˜ธํ•  ๋ฟ์ด๋‹ค.
๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ, ์‚ฌ์šฉ ์œ„์น˜
"๊ณง".

for_each ์˜ˆ์—์„œ for_each๋Š” ๋‚ด๋ถ€์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ ๊ตฌ์กฐ(์˜ˆ: ๋ณ€์ˆ˜๋ฅผ ์•ฝ๊ฐ„ ์žฌ์ •๋ ฌํ•˜๋Š” ๊ฒฝ์šฐ),
๋” ๋งŽ์€ "๋ถˆํˆฌ๋ช…ํ•œ" ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ(๊ฐœ๋ฐœ์ž๊ฐ€
์–ด๋–ค ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ "์‰ฝ๊ฒŒ" ๋ณ€๊ฒฝ
๋” ์ž˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜์šฉํ•˜๋ฉด ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ฒƒ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
"์‚ฌ์šฉ"์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ถˆํˆฌ๋ช…ํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๋ ˆ์ด์–ด.

๋˜ํ•œ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๊ณ  ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋” "๋ช…ํ™•ํ•˜๊ฒŒ" ๋งŒ๋“ญ๋‹ˆ๋‹ค.
์‹ค์ œ๋กœ ์ˆ˜ํ–‰(์—ฐ๊ฒฐ ๋ชฉ๋ก ๋ฐ˜๋ณต). "๋ฅผ ์—†์• ๊ธฐ๋งŒ ํ•˜๋ฉด
first()->self()->self "๋Š” ์ž์ฒด์ ์œผ๋กœ ๊ฐœ์„ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์˜ ์ด์ ์€ ์‹ค์ œ๋กœ ๋” ๋งŽ์ด ์‚ฌ์šฉํ• ์ˆ˜๋ก ๋ˆ„์ ๋œ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค.
๋ฐ˜๋ณต๋˜๋Š” "unordered_for_each"์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋…ธ๋“œ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค(ํ• ๋‹น์ž๋ฅผ ํ†ตํ•ด ๋˜๋Š”
์—ฐ๊ฒฐ ๋ชฉ๋ก์€ ๋ฐฐ์—ด์˜ ๋งจ ์œ„์— ์ €์žฅ๋จ) ๋˜๋Š” "reverse_for_each"์ž…๋‹ˆ๋‹ค. ์‹ฌ์ง€์–ด ๋ฌผ๊ฑด
"์ฐพ๊ธฐ" ๋˜๋Š” "์ •๋ ฌ"์ฒ˜๋Ÿผ. (๋‚˜๋Š” std::algorithms๋ฅผ ๊ทธ๋‹ค์ง€ ์ถ”์ฒœํ•˜์ง€ ์•Š๋Š”๋‹ค.
Ranges๊ฐ€ ๋ณ‘ํ•ฉ๋  ๋•Œ C++20๊นŒ์ง€๋Š” ์ตœ์†Œํ•œ. ์ž์‹ ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„
๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค)

Lambda๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Epic Games๊ฐ€ C++11์—์„œ ์ฒ˜์Œ์œผ๋กœ ํ—ˆ์šฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
Sort์™€ ๊ฐ™์€ ์ž์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์–ธ๋ฆฌ์–ผ ์—”์ง„,
Partition, Filter, RemoveAll, Find ๋“ฑ ๊ทธ ์ดํ›„๋กœ๋Š” ๊ฝค ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
์—”์ง„ ์ฝ”๋“œ์™€ ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด ์ฝ”๋“œ ๋ชจ๋‘์—์„œ ์†Œ์Šค ์ฝ”๋“œ์— ์‚ฌ์šฉ

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/godotengine/godot/issues/9694#issuecomment-445474001 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABnBbvBTxThAh0v8AfFCdGsSv2HFnEz6ks5u2_GKgaJpZM4ObOio
.

์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” C++11 ๊ธฐ๋Šฅ:

  • override ๋ฐ final
  • ๋ฒ”์œ„ ๊ธฐ๋ฐ˜ for ๋ฃจํ”„
  • nullptr
  • ๊ฐ•๋ ฅํ•œ ํ˜•์‹์˜ ์—ด๊ฑฐํ˜•
  • explicit ํ‚ค์›Œ๋“œ

์‚ถ์˜ ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” C++11 ๊ธฐ๋Šฅ:

  • ์˜ค๋ฅธ์ชฝ ๊บพ์‡  ๊ด„ํ˜ธ( Vector<Vector> > ์—†์Œ)

[[nodiscard]] (C++17 ?) ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐ ํ•˜์‹ญ์‹œ์˜ค

์ƒˆ๋กœ์šด ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด 1~2๊ฐœ ์žˆ๋‹ค๊ณ  ํ•ด์„œ ์ตœ์‹  ๋ฒ„์ „์„ ์ฑ„ํƒํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ ์ด ๊ฐ€์น˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— C++11 ์ด์™ธ์˜ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
C++์ด ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ stl์€ ์ ์  ๋” ์ปค์ง€๊ณ  ์ „์ฒ˜๋ฆฌ๊ธฐ ๋‹จ๊ณ„์—์„œ ํ”„๋กœ์ ํŠธ์— ์ˆ˜๋ฐฑ ์ค„์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ์— ์ƒ๋‹นํ•œ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ์— ์ƒ๋‹นํ•œ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

์ ˆ๋Œ€ ์•ˆ๋ฉ๋‹ˆ๋‹ค? ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„๊ทธ๊ฐ€ ์—†๋Š” ํ•œ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ์ตœ์ข… ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์ „ํ˜€ ํฌํ•จ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ๊ฒฝ์šฐ์— ์ ์ ˆํ•œ ์ด๋™ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ผ๋ถ€ ์˜์—ญ์—์„œ๋Š” ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋˜๋ฉฐ ์ด์ „ ์˜ˆ์—์„œ๋Š” ์—…๋ฐ์ดํŠธ๋œ ์ง€์‹œ๋ฌธ์ด ๋‹ค๋ฅธ ๊ธฐ๋Šฅ ์ค‘์—์„œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@OvermindDL1 ์˜ˆ, ์ด๋ก ์ƒ ๊ทธ๋ž˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค : https://twitter.com/zeuxcg/status/1085781851568914432
๋‚˜๋Š” ์ตœ๊ทผ์— ์†Œ์…œ ๋ฏธ๋””์–ด์—์„œ ์ด์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์‚ฌ๋ก€๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ "์ œ๋กœ ๋น„์šฉ ์ถ”์ƒํ™”"๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์•„๋‹™๋‹ˆ๋‹ค.

@lupoDharkael ๊ทธ ํŠธ์œ„ํ„ฐ ์Šค๋ ˆ๋“œ(๋งˆ์นจ๋‚ด ๋กœ๋“œ๋˜๊ณ  ๋‚˜๋ฉด ๊ฑฐ๋ฃฉํ•œ ์™€์šฐ ํŠธ์œ„ํ„ฐ๋Š” ๋”์ฐํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค... ์ €๋Š” ๊ทธ๊ฒƒ์„ ๊ณ„์† ์žŠ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค...) libstdc++์˜ math.h๊ฐ€ C++17 ๋ชจ๋“œ์—์„œ ๋” ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์†๋„์— ๋Œ€ํ•ด์„œ๋งŒ ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ libc++์—๋Š” ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ์—†์Œ) ๋” ๋‚˜์€ ๋Ÿฐํƒ€์ž„ ์†๋„๋ฅผ ์œ„ํ•œ ๋” ๋งŽ์€ ์˜ค๋ฒ„๋กœ๋“œ ๋ฐ ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด Math.h๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ชจ๋“  ์ปดํŒŒ์ผ์€ ์ตœ์‹  stdlib ๋Œ€์‹  ํŠน์ • ์ด์ „ stdlib๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ์•ฝ 300ms ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์— ๋Œ€ํ•ด ์•„๋ฌด ๊ฒƒ๋„ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์‚ฌ์šฉ๋œ ๊ธฐ๋Šฅ์— ๋”ฐ๋ผ ๋” ๋†’์€ C++ ๋ชจ๋“œ์—์„œ๋งŒ ๋” ๋น ๋ฅธ ๊ฒƒ์„ ๋ณด์•˜๊ณ  ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋™์ผํ•œ ์†๋„). It's not as "zero cost abstractions" as it should. ์— ๊ด€ํ•ด์„œ๋Š” ์•„์ง ๋‹น์‹ ์ด ๋ฌด์—‡์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด์ „ stdlib์—์„œ math.h๋กœ ์ปดํŒŒ์ผํ•  ๋•Œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ์•ฝ 300ms ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งํฌํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ทธ์™€ ์•„๋ฌด ๊ด€๋ จ์ด ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์‹ค์ œ ๋ณด๊ณ ์„œ์— ๋Œ€ํ•œ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด์จŒ๋“  ์ปดํŒŒ์ผ๋œ ๊ฐœ์ฒด์˜ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด 300ms ์ฆ๊ฐ€ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋” ์กฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๋น„์šฉ์— ์ด์œ ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์ €์—๊ฒŒ ๋ฐ˜๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋žฉํƒ‘๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์—”์ง„์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ ์ž‘์—…์—๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ณ€๊ฒฝ ํ›„์— ์ปดํŒŒ์ผ+๋งํฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ •๋‹นํ•œ ์ด์  ์—†์ด ๋” ๋งŽ์ด ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋žฉํƒ‘๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์—”์ง„์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ ์ž‘์—…์—๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ณ€๊ฒฝ ํ›„์— ์ปดํŒŒ์ผ+๋งํฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ccache๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์œผ๋ฉด ์ฆ๋ถ„ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์—์„œ ๋งํฌ์— ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. ๋งํฌ์— ld gold ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 1์ดˆ ์ •๋„ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ lld ๋กœ ์ „ํ™˜ํ•˜์—ฌ ๋” ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค ํ™•์‹คํžˆ, ๋ฐฑ์—… ๋นŒ๋”๋กœ์„œ ccache์™€ ninja ๋ชจ๋‘์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ์ข‹๋‹ค๊ณ  ๋งํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด cmake๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ). ๋‘˜ ๋‹ค ์‹œ๊ฐ„ ์„ ๋งŽ์ด ์ ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค!

๊ฒŒ๋‹ค๊ฐ€ Unity ๋นŒ๋“œ๋Š” ๋†€๋ผ์šธ ์ •๋„๋กœ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  cpp ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ์ƒˆ unity.cpp ์ •๋„์˜ ํŒŒ์ผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ '๋ชจ๋“ˆ'๋‹น unity cpp ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ปดํŒŒ์ผํ•˜๊ณ  ๋งํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ๋ถ„ ์žฌ๊ตฌ์ถ•์—๋Š” ๋œ ์œ ์šฉํ•˜๊ณ  ๋ฆด๋ฆฌ์Šค ๋นŒ๋“œ์—๋Š” ๋” ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋”๋ฏธ์— ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด:
static_assert

์˜ˆ๋ฅผ ๋“ค์–ด SpatialMaterial::MaterialKey ํ•ฉ์ง‘ํ•ฉ์€ ๊ตฌ์กฐ์ฒด์˜ ํฌ๊ธฐ๊ฐ€ uint64_t์™€ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ์–ด๋””์—์„œ๋„ ์ฃผ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฑฐ๊ธฐ์— static_assert(sizeof(MaterialKey) == sizeof(uint64_t)) ๋ฅผ ์น˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ˆ˜๋™ ์ƒ์šฉ๊ตฌ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ๋ถˆํ•„์š”ํ•œ ์ฐธ์กฐ ๊ณ„์‚ฐ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํŒŒ๊ดด ์‹œ ์ ์ ˆํ•œ ์ •๋ฆฌ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด unique_ptr์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Godot์™€ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒ์œผ๋กœ์„œ ์ œ 2์„ผํŠธ(๋˜๋Š” 20์„ผํŠธ)๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ํ˜„์žฌ _Battle for Wesnoth_๋ฅผ Godot๋กœ ์ด์‹ํ•˜๋Š” ์ž‘์—…์„ ๊ฐ๋…ํ•˜๊ณ  ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. ์ด์ œ ํ”„๋ก ํŠธ ์—”๋“œ(์—๋””ํ„ฐ์™€ GDScript API)๊ฐ€ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค! ๋ช‡ ๊ฐ€์ง€ ๊ฑฐ์นœ ๋ถ€๋ถ„ ์™ธ์—๋„ ์ง€๊ธˆ๊นŒ์ง€๋Š” ์ข‹์€ ์†๋„๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ(ํŒ€)๋„ ์–ธ์  ๊ฐ€๋Š” ๋ฐฑ์—”๋“œ(์—”์ง„)์— ๋Œ€ํ•œ ํŒจ์น˜๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ด๋ฒˆ ์ฃผ ์ดˆ์— git repo๋ฅผ ๋ณต์ œํ•˜๊ณ  C++์—์„œ ์—ฌ๊ธฐ์ €๊ธฐ ํŒŒ๊ณ ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ ๋งํ•ด์„œ... ์ €๋Š” ์•ฝ๊ฐ„ ์‹ค๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” Wesnoth์˜ ์˜ค๋ž˜๋œ ์‚ฌ์šฉ์ž ์ •์˜ ์—”์ง„์˜ ํ˜•ํƒœ๋กœ ๋Œ€๊ทœ๋ชจ C++ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•œ ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ญ์‹œ C++03์œผ๋กœ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ C++11 ์ด์ƒ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ˜„๋Œ€ํ™”๋˜์—ˆ์œผ๋ฉฐ ์ด์ œ C++14์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ํ˜„๋Œ€ํ™” ๋…ธ๋ ฅ์„ ์ฃผ๋„ํ–ˆ๊ณ (์ข…์ข… ๋„ˆ๋ฌด ์—ด์„ฑ์ ์œผ๋กœ) ์šฐ๋ฆฌ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ํ›จ์”ฌ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ์ž‘์—…ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ €๋Š” ์ˆœ์ˆ˜ํ•œ C++03 ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ž‘์—…ํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ตœ์‹  C++ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ C++๋ฅผ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ auto , range-for ๋ฐ lambdas์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์ฝ”๋“œ๋ฅผ ๋œ ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” ์ƒ๊ฐ์€ ์ •๋ง... ๋งค์šฐ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

auto ๋ฅผ ๋‚จ์šฉํ•˜๊ณ  ๋‚จ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ™•์‹คํžˆ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํ•ฉ๋ฒ•์ ์ธ ์šฉ๋„๋„ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Wesnoth ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ auto ๋ฅผ ๋ฐฐํฌํ•œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์žฅ์†Œ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” for ๋ฃจํ”„์˜€์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

for(std::vector<T>::iterator foo = container.begin(); foo != container.end(); ++foo) {}

์–ด๋Š ๊ฒƒ์ด ์ง€์ €๋ถ„ํ•ด! ์‹ค์ œ๋กœ iterator๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ–ˆ์Šต๋‹ˆ๋‹ค.

for(auto foo = container.begin(); foo != container.end(); ++foo) {}

์˜ˆ, ์ด์ œ ๋ช…์‹œ์  ๋ฐ˜๋ณต๊ธฐ ์œ ํ˜•์„ ๋ชจ๋ฅด์ง€๋งŒ ๊ฑฐ์˜ ์•Œ ํ•„์š” ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ผ๋ถ€ ํŒŒ์ผ์„ ์„ ์–ธํ•˜๋ฉด ๋” ์–ด๋ ค์›Œ์ง„๋‹ค๋Š” ๊ฒŒ์‹œ๋ฌผ์„ ์—ฌ๊ธฐ์—์„œ ์ฝ์—ˆ์ง€๋งŒ ์‹ค์ œ๋กœ ํ˜„๋Œ€ ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ์™€ ์ธํ…”๋ฆฌ์„ผ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋‹ค์ง€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด range-for๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

for(const auto& foo : container) {}

ํƒ€์ดํ•‘๋„ ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํ”„ ๋‚ด์—์„œ ๋ฐ˜๋ณต์ž๋ฅผ ์—ญ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ์ธ๋ฑ์Šค๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์ด ์ „์ฒด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐ˜๋ณตํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค์€ ๋ฃจํ”„๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์‹ค์ œ๋กœ ์ง„ํ–‰๋˜๋Š”์ง€ ๋‹ค์‹œ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ range-for ๋ฃจํ”„์—์„œ auto ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ถ”๊ฐ€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ์–ตํ•ด์•ผ ํ•˜๋Š” ํ•ญ๋ชฉ์ด ํ•˜๋‚˜ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค! ๋‚˜๋Š” ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์ด ์ฝ”๋“œ๋ฅผ ๋œ ์ฝ๊ฑฐ๋‚˜ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” Juan์˜ ์ฃผ์žฅ์„ ์ •๋ง๋กœ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ €์—๊ฒŒ๋Š” ์ •๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค.

๊ทธ๋Š” Godot์˜ ์ƒํƒœ ๋น„๋””์˜ค์—์„œ ๋žŒ๋‹ค๋„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๊ทธ๊ฒƒ๋“ค์„ ๋‚จ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋˜ํ•œ ์—„์ฒญ๋‚˜๊ฒŒ ์œ ์šฉํ•œ ๋„๊ตฌ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค! ๋‹ค์Œ์€ C++11์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— Wesnoth์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋ณธ ์ผ๋ฐ˜์ ์ธ ํŒจ๋Ÿฌ๋‹ค์ž„์ž…๋‹ˆ๋‹ค.

struct sort_helper {
    operator()(const T& a, const T& B) {
        return a < b;
    }
}

void init() const {
    std::vector<T> foo;
    foo.push_back(T(1));
    foo.push_back(T(2));
    foo.push_back(T(3));

    std::sort(foo.begin(), foo.end(), sort_helper);
}

๊ธธ๊ณ  ์ง€์ €๋ถ„ํ•œ ์ฝ”๋“œ ํŒฝ์ฐฝ. ๋‹ค์Œ์€ C++11์—์„œ ์‚ฌ์šฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

void init() const {
    std::vector<T> foo {
        T(1),
        T(2),
        T(3),
    };

    std::sort(foo.begin(), foo.end(), [](const T& a, const T& b) { return a < b; });
}

๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ์˜ˆ, T์— ๋Œ€ํ•ด operator< ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๊ณ  std::sort ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ œ ์š”์ ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ํ˜„๋Œ€์ ์ธ C++๋กœ ๋ฐฐ์šฐ๊ณ  ๊ฑฐ์˜ ๋…์ ์ ์œผ๋กœ ์ž‘์—…ํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ ์ ˆํ•œ ๊ฒฝ์šฐ auto , range-for ๋ฐ lambdas์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์€ ๋ฐœ์„ ํ—›๋””๋”œ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚˜๋ฅผ ๋‹ค์Œ ์š”์ ์œผ๋กœ ์ด๋•๋‹ˆ๋‹ค. ๋‚˜๋Š” Godot๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ STL ์œ ํ˜• ๋Œ€์‹ ์— ์ž์ฒด ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๋‹ค. auto ์™€ ๊ฐ™์€ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์— ๋Œ€ํ•œ ์šฐ๋ ค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ STL ์œ ํ˜•๋ณด๋‹ค ์‚ฌ์šฉ์ž ์ •์˜ ์ฝ”์–ด ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ ˆ๋Œ€์ ์œผ๋กœ ์†ํ•ด์ž…๋‹ˆ๋‹ค! ๋ฉฐ์น  ์ „์— ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋‹ค๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

container.push_back(T(args));

์ด๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. push_back (์ ์–ด๋„ std::vector ์ธก๋ฉด์—์„œ) const ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์—ฐ์‚ฐ์ž๋Š” ๋ถˆํ•„์š”ํ•œ ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. emplace_back ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํŒจ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ... ์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค ๐Ÿ˜

Wesnoth์˜ ์„ค๊ณ„์— ๋Œ€ํ•œ ํฐ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ด์ž ์ƒˆ ์—”์ง„(์ด ๊ฒฝ์šฐ Godot)์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ฃผ์š” ์š”์ธ ์ค‘ ํ•˜๋‚˜๋Š” Wesnoth๊ฐ€ Not Invented Here ์ฆํ›„๊ตฐ์„ ํฌ๊ฒŒ ๊ฒช์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Boost์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์€ ์‚ฌ์šฉ์ž ์ง€์ •์ด์—ˆ๊ณ  UI ํˆดํ‚ท์€ ์‚ฌ์šฉ์ž ์ง€์ •๋˜์—ˆ์œผ๋ฉฐ ๋ฐ์ดํ„ฐ/์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด๋Š” ์‚ฌ์šฉ์ž ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.... ์š”์ ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Godot ํฌํŠธ์—์„œ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํ•˜๋“œ์›จ์–ด ๊ฐ€์† ๋ Œ๋”๋ง์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค(์ด ์‹œ์ ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” CPU ๊ธฐ๋ฐ˜ ํ‘œ๋ฉด/์Šคํ”„๋ผ์ดํŠธ ๋ Œ๋”๋ง์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. 2019๋…„์—๋Š” X_X๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค). SDL์˜ Texture API์—๋Š” ์…ฐ์ด๋” ์ง€์›์ด ์—†์—ˆ๊ณ  ์…ฐ์ด๋” ์ง€์›์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋‚˜๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ์ž์ฒด ๋ Œ๋”๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํ”„๋กœ์ ํŠธ์— ๋ถˆํ•„์š”ํ•œ ์œ ์ง€ ๊ด€๋ฆฌ ๋ถ€๋‹ด์„ ์ค„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฑฐ์˜ ์—†์—ˆ๊ณ , Godot์™€ ๊ฐ™์€ ์—”์ง„์— ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ํ›Œ๋ฅญํ•˜๊ณ  ์ž˜ ๊ด€๋ฆฌ๋œ ๋ Œ๋”๋Ÿฌ๊ฐ€ ์žˆ์„ ๋•Œ OpenGL(๋˜๋Š” OGL์„ ์‚ญ์ œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ Vulkan)์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์„ ์ฐพ๋Š” ๊ฒƒ์€ ๋ถˆํ•„์š”ํ•œ ๊ณ ํ†ต์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ ์—.

์‚ฌ๋‚ด์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์œ ์ƒ๊ฐ์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ์˜ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์•ฝ๊ฐ„ ์ค„์ผ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๋ง‰๋Œ€ํ•œ ์œ ์ง€ ๊ด€๋ฆฌ ๋ถ€๋‹ด์„ ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ push_back ํ˜ธ์ถœ์„ emplace_back ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์ฝ”๋“œ๋ฅผ ๋” ๊นจ๋—ํ•˜๊ณ  ์„ฑ๋Šฅ์ด ์ข‹๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ๋‚ฎ์€ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž ์ •์˜ vector ์œ ํ˜•์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€ ๊ตฌ์„ฑ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋ˆ„๊ตฐ๊ฐ€ ์ˆ˜๋™์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค!

๋” ํฐ ๋ฌธ์ œ๋Š” ์ง„์ž…์žฅ๋ฒฝ์ด ๋†’์•„์ง„๋‹ค๋Š” ์ ์ด๋‹ค. C++ STL ์œ ํ˜•์„ ๊ธฐ๋Œ€ํ•˜๋Š” Godot ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋‚˜ ๋˜๋Š” ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด์ œ ์—”์ง„์ด ์ œ๊ณตํ•˜๋Š” ์œ ํ˜•๊ณผ ๊ฐ API์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ์œ ํ˜•์„ ์ •ํ™•ํžˆ ์•Œ์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์›ํ•˜๋Š” std::map ? ์•„๋‹ˆ์š”, dictionary ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋ฉ”์ธํ…Œ์ด๋„ˆ์˜ ์‚ถ์„ ํž˜๋“ค๊ฒŒ ๋งŒ๋“ค๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ์—ฌ์ž๋“ค์˜ ์ผ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ, ํ•œ ๊ฐ€์ง€์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€... ์ฝ์„ ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๊นŒ?

์•ฝ 1๋…„ ์ „ Wesnoth์˜ 1.14 ๋ฆด๋ฆฌ์Šค ๋ฐ Steam ์ถœ์‹œ๋ฅผ ๋งˆ๊ฐํ•˜๋ฉด์„œ ์ €๋Š” erase() ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ std::list ์ธ ์‚ฌ์šฉ์ž ์ •์˜ ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌํŒฉํ† ๋ง ํ”„๋กœ์ ํŠธ์— ์ฐฉ์ˆ˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์ž. ๋‹ค์Œ์€ ๋ฌธ์ œ์˜ ์ปค๋ฐ‹ ์›์น™ ์ž…๋‹ˆ๋‹ค. ์ œ๋Œ€๋กœ ํ•˜๋ ค๋ฉด ๊ทธ ํ›„์— ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ–ˆ์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ ๋œ ๋ถˆํˆฌ๋ช…ํ•œ ์ฝ”๋“œ์˜€์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, ๋งค์šฐ ์œ ์šฉํ•œ C++11 ๊ธฐ๋Šฅ์„ ๋ถˆ๋ฒ•ํ™”ํ•˜๊ณ  STL ์œ ํ˜•๋ณด๋‹ค ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•์„ ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฒƒ์€ ์žฅ๊ธฐ์ ์œผ๋กœ Godot์— ๋ฐฉํ•ด๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ(์ €๋ฅผ ๋ฏฟ์œผ์„ธ์š”, ์ €๋„ ์••๋‹ˆ๋‹ค), ํ˜„์žฌ ์ƒํ™ฉ์—์„œ๋Š” ๊ฒฐ๊ตญ catch-22๋กœ ๋๋‚  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. STL(๋ผ๊ฑฐ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ ๋“ฑ) ์‚ฌ์šฉ์˜ ๋‹จ์ ์„ ํ”ผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ƒˆ๋กœ์šด C++ ํ‘œ์ค€์—์„œ ๋” ๋‚˜์€ ์„ฑ๋Šฅ๊ณผ ๊น”๋”ํ•œ โ€‹โ€‹์ฝ”๋“œ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ ์  ๋” ์–ด๋ ค์›Œ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•์—์„œ ๋‚ด๋ถ€ ๊ตฌ์„ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ํŠน๋ณ„ํžˆ ๊ธฐ๋Œ€ํ•˜๋Š” ์‚ฌ๋žŒ์€ ์•„๋ฌด๋„ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜ฌ

์—ฌ๊ธฐ์—์„œ ๋‚ด ์˜๊ฒฌ์ด ํฐ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ C++03์—์„œ ์ตœ์‹  C++๋กœ ์ด๋™ํ•œ ๋Œ€๊ทœ๋ชจ C++ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ์ž‘์—…ํ•œ ์‚ฌ๋žŒ์˜ ๊ด€์ ์—์„œ ๋‚ด ์ƒ๊ฐ์„ ์ œ๊ณตํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์ž‘์—…์ด์ง€๋งŒ ์žฅ๊ธฐ์ ์œผ๋กœ ๋ณผ ๋•Œ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๋Œ€ํ•œ ํ…์ŠคํŠธ์›”์„ ์šฉ์„œํ•˜์„ธ์š”!

@Vultraz ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” C++์— ๋Œ€ํ•œ (๊ฑฐ์˜) ๊ฒฝํ—˜์ด ์—†์ง€๋งŒ GDNative + C++๋กœ ์ž‘์—…ํ•œ ํ›„ ๊ท€ํ•˜์˜ ๊ฒฌํ•ด๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

๋ถˆ๊ณผ ๋ฉฐ์น  ์ „ ์ €๋Š” ๋ ˆ๋”ง์— " Godot์— ๊ธฐ์—ฌํ•˜๋Š” ๊ฒƒ์ด C++๋ฅผ ๋ฐฐ์šฐ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ธ๊ฐ€์š”? " ์Šค๋ ˆ๋“œ์— ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค:

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ถ”์ฒœํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. GDNative ๋ฐ C++ ์ž‘์—…์— ๋Œ€ํ•œ ๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ํœ ์„ ์ตœ์†Œํ•œ ์—ฌ๋Ÿฌ ๋ฒˆ ์žฌ์ฐฝ์กฐํ•ฉ๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž ์ง€์ • ์ปฌ๋ ‰์…˜ ๋ฐ ํฌ์ธํ„ฐ). ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ž˜์Šค๋Š” ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(์ตœ์†Œํ•œ GDNative C++ ๋ฐ”์ธ๋”ฉ/ํ—ค๋” POV์—์„œ - ๋‚ด๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹œ๋„ํ–ˆ์„ ๋•Œ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์€ ๋ฐ๋ชจ ํ”„๋กœ์ ํŠธ๋กœ ์ด์–ด์ง€๋Š” ํ•˜๋‚˜์˜ ๊ฐ€์ด๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ฝ”๋“œ [ํ—ค๋”, ๋ฐ”์ธ๋”ฉ] ๋˜๋Š” ๊ณต์‹ ๋ฌธ์„œ์—๋Š” ๋ฌธ์„œ๊ฐ€ ์—†์Œ) ๋ฐ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฑฐ๋‚˜ ์ง๊ด€์ ์ด์ง€ ์•Š์€ ๋™์ž‘์ด ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: Ref๊ฐ€ ์ง๊ด€์ ์œผ๋กœ ํˆฌ๋ช…ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ž˜ํ•‘๋˜๋Š” ํด๋ž˜์Šค์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ ๋˜์ง€๋งŒ Ref์—์„œ ์ผ๋ถ€ ์—”์ง„ ํด๋ž˜์Šค๋ฅผ ๋Šฆ๊ฒŒ ๋ž˜ํ•‘ํ•˜๋ฉด ์ž„์˜ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•จ).

๋‚˜๋Š” ๋˜ํ•œ ์ƒˆ๋กœ์šด C++ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  IMO ๊ฐ€๋…์„ฑ์ด ๋‚ฎ์€ ์ƒ์šฉ๊ตฌ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ํŒฌ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ €๋Š” Haskell(๋ฐ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ), ๊ฐ„๊ฒฐํ•จ, ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์–ธ์–ด ์žฅ์• ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ดˆ๋ณด์ž์—๊ฒŒ ์—ฐ์—ฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒฐ์ •/๊ฐ€์น˜ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ์—”์ง„์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์„์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. (์—”์ง„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ๊ฒฐ์ •์˜ ๋ฐฐ๊ฒฝ์ด ๊ธฐ์—ฌ๋ฅผ ์žฅ๋ คํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ๋ฐํ˜”๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๋ฏธ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ์™„์ „ํžˆ ๋ฐ˜๋Œ€์˜ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.)

@Vultraz ์ž˜ ์ •๋ฆฌ๋œ ๊ธ€, ์ž˜ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ด€์ ์„ ๋“ฃ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ €๋Š” ๊ตฌ์‹ C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ์ด๊ณ  Godot ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ํฐ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ  ์ œ ์ทจํ–ฅ์— ๋งŽ์ด ๋“ค์–ด๋งž์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ๊ธฐ๋ฐ˜์— ๋Œ€ํ•œ ๊ธฐ์กด ๊ฒฝํ—˜์ด ๊ฑฐ์˜ ์—†์ด ๋น„๊ต์  ๋น ๋ฅด๊ฒŒ ์ด ์—”์ง„์˜ ํ•ต์‹ฌ์— VR ์ง€์›์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ์€ ์ด ์—”์ง„์ด ์–ผ๋งˆ๋‚˜ ์ฝ๊ธฐ ์‰ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด์ง€์— ๋Œ€ํ•œ ์ฆ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฉด์—์„œ๋Š” ๊ตฌ์‹์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํŠน์ • ๋ถ€ํ’ˆ์ด ์–ผ๋งˆ๋‚˜ ์ž˜ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€์— ๊ณ„์†ํ•ด์„œ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์˜ˆ, ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ํ˜„๋Œ€ํ™”๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„์ด ์žˆ์ง€๋งŒ ์ „์ฒด์ ์œผ๋กœ๋Š” ๊ทธ๊ฒƒ์— ๊นŠ์€ ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด C++์˜ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์„ ๋“ค์„ ๋•Œ ์ข…์ข… ๋‚˜๋Š” ๊ทธ์ € ๋‚ก์•˜๋‹ค๋Š” ๋Š๋‚Œ์„ ๋ฐ›๊ณ  ์†Œ๋ž€์ด ๋ฌด์—‡์ธ์ง€ ์ •๋ง ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ข€ ๋” ํ˜„๋Œ€์ ์ธ C++๋ฅผ ๋ฐฐ์šฐ๊ณ  Godot์— ๊ธฐ์—ฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋ฉด ๋ฐ”ํ€ด๋ฅผ ๋‹ค์‹œ ๋ฐœ๋ช…ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ ์–ด๋„ ๋‚˜์™€ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๋ฐ ๋„ˆ๋ฌด ์ต์ˆ™ํ•ด์„œ ๋Œ€๋ถ€๋ถ„์ด ์—ฌ๊ธฐ์—์„œ ๊ตฌํ˜„๋œ ๋ฐฉ์‹์— ๊นŠ์€ ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. :)

๋ชจ๋“  ๊ฒƒ์ด ๋งํ–ˆ๋“ฏ์ด ์ด ๋ฌธ์ œ๋ฅผ ๋ณด๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด ์žฌ๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด C++ ๊ตฌ๋ฌธ๋ณด๋‹ค ์•ž์„  Godot์˜ ๊ธฐ์›์—์„œ ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ€์žฅ ํŽธ์•ˆํ•˜๊ฒŒ ๋Š๋ผ๋Š” ๊ฒƒ, Godot์˜ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํŠน์„ฑ๊ณผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์น˜(์ผ๋ถ€๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Œ)์— ์˜ํ•ด ๋ถ€๊ณผ๋œ ์ œํ•œ์— ์ด๋ฅด๊ธฐ๊นŒ์ง€. ๋‚˜๋Š” ์ด๊ฒƒ์— ์˜ณ๊ณ  ๊ทธ๋ฆ„์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ์ต์ˆ™ํ•˜๊ณ  ์–ด๋””์—์„œ ์™”๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  Godot๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ฐฐ์šฐ๋Š” ์ถ”๊ฐ€ ํ•™์Šต ๊ณก์„ ์ด ํฐ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ์ด์ ๋ณด๋‹ค ๋” ์ค‘์š”ํ•œ์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค ๋ฒ ์ด์Šค.

๋ณด์…จ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ Juan์€ GDC์—์„œ ์˜จ๋ผ์ธ์— ๊ฒŒ์‹œ๋œ ๊ฐ•์—ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค: https://www.youtube.com/watch?v=C0szslgA8VY
๋งˆ์ง€๋ง‰์— ์žˆ๋Š” Q&A์—์„œ ๊ทธ๋Š” ์ด์— ๋Œ€ํ•œ ์˜์‚ฌ ๊ฒฐ์ •์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.
์ข‹์€ ์‹œ๊ณ„์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์ธ GDNative์— ๋Œ€ํ•œ ์œ„์˜ ๋ฐ˜์‘๊ณผ ๊ด€๋ จํ•˜์—ฌ GDNative๋Š” ํŠน์ • ์š”๊ตฌ๋ฅผ ์ถฉ์กฑํ•˜๋Š” ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ ๊ฒƒ์œผ๋กœ ํ•ต์‹ฌ ์ œํ’ˆ์ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๊ณ  ๊ตฌ์ถ•๋˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ชจ๋“ˆ์„ ๋นŒ๋“œํ•ด ๋ณด์„ธ์š”(https://docs.godotengine.org/en/3.1/development/cpp/custom_modules_in_cpp.html). ์˜ˆ, GDNative๊ฐ€ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๋ฌธ์ œ์ธ ํ•ต์‹ฌ ์ œํ’ˆ์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—”์ง„์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ›จ์”ฌ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ํฌ๊ธฐํ•œ ๋งŽ์€ ์ฃผ์žฅ์€ Godot ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ GDNative์˜ ๋‹จ์ ์ž…๋‹ˆ๋‹ค.
์ €๋Š” ์ •์  ๋ชจ๋“ˆ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“ˆ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์  ๋ชจ๋“ˆ ์†”๋ฃจ์…˜์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€๋Š” ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ทธ๋•Œ๊นŒ์ง€๋Š” GDNative๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

@Vultraz @mnn ์‹ค์ œ๋กœ STL ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ์š”์ ์„ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ์ˆœ์ „ํžˆ ์ผ๋ถ€ ๊ตฌํ˜„(๋Œ€๋ถ€๋ถ„ MSVC)์ด ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ ๋”์ฐ ํ•˜๊ฒŒ ๋Š๋ฆฐ ์„ฑ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹จ์ˆœํžˆ EA์˜ STL์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋น ๋ฅด๊ณ  ํœด๋Œ€ ๊ฐ€๋Šฅํ•จ).

๋˜ํ•œ: ๊ฐœ์ธ์ ์œผ๋กœ RAII ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๊ณ ํ†ต์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. RAII๊ฐ€ C++11์— ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ์ „์ฒด์—์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ˆ˜ํ–‰๋˜๋Š” ์ˆ˜๋™ ์ •๋ฆฌ์˜ ์–‘์€ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์ธ GDNative์— ๋Œ€ํ•œ ์œ„์˜ ๋ฐ˜์‘๊ณผ ๊ด€๋ จํ•˜์—ฌ GDNative๋Š” ํŠน์ • ์š”๊ตฌ๋ฅผ ์ถฉ์กฑํ•˜๋Š” ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ ๊ฒƒ์œผ๋กœ ํ•ต์‹ฌ ์ œํ’ˆ์ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๊ณ  ๊ตฌ์ถ•๋˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋ฌผ๋ก  ์‚ฌ์‹ค์ด์ง€๋งŒ GDNative๋Š” "์Šคํฌ๋ฆฝํŠธ"๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—”์ง„ ์ž์ฒด๋ณด๋‹ค ๋” ์‚ฌ์šฉ์ž ์นœํ™”์ ์ด์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์—”์ง„?

์ด๋Ÿฌํ•œ ๊ฒฐ์ •/๊ฐ€์น˜ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ์—”์ง„์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์„์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. (์—”์ง„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ๊ฒฐ์ •์˜ ๋ฐฐ๊ฒฝ์ด ๊ธฐ์—ฌ๋ฅผ ์žฅ๋ คํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ๋ฐํ˜”๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๋ฏธ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ์™„์ „ํžˆ ๋ฐ˜๋Œ€์˜ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.)

์ €๋Š” C++ ๋ฉ์ฒญํ•œ ๋†ˆ(C++์—์„œ ์ผ์ฃผ์ผ์— 2์ผ ์•ฝ 2๊ฐœ์›”)์ด๋ฏ€๋กœ ์ด ๊ฒฐ์ •์œผ๋กœ ์ด์ต์„ ์–ป๋Š” ๋Œ€์ƒ ์ธ๊ตฌ ํ†ต๊ณ„ํ•™์  ๋Œ€์ƒ์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•œ Godot ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค(๋„ˆ๋ฌด ํ’๋ถ€ํ•˜์ง€ ์•Š์€ stl๊ณผ ๋น„๊ตํ•˜์—ฌ). ์ปจํ…Œ์ด๋„ˆ๊ฐ€ GDNative์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ, ์ œ๊ฐ€ ์ฐฉ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Godot ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๊ณ ํ†ต์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ํ•œ ํ”ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Ref์˜ ์ผ๊ด€๋˜์ง€ ์•Š๊ณ  ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ–‰๋™์€ ์—”์ง„์˜ ์ฑ…์ž„์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ์ œ ์ƒ๊ฐ์ด ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฐ๊ฒฝ์ด ์•„๋งˆ๋„ ๋‹ค์†Œ ์ด๋ก€์ ์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. JS/TS์—์„œ ์ „๋ฌธ์ ์œผ๋กœ ์ผํ•œ ๋…„, Scala์—์„œ 1๋…„, Haskell์—์„œ ๋” ์ž‘์€ ์ทจ๋ฏธ ํ”„๋กœ์ ํŠธ(์ˆ˜์ฒœ ์ค„, Haskell์ด ์–ผ๋งˆ๋‚˜ ๊ฐ„๊ฒฐํ•œ์ง€๋ฅผ ๊ณ ๋ คํ•˜๋ฉด ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ์ž‘์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค) - ์—ฌ๋Ÿฌ ๋ฒˆ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. C++์—์„œ๋Š” Haskell์—์„œ ์ตœ์†Œ 5๋ฐฐ๋Š” ๋” ์งง๊ณ  ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.) ๊ตฌ์‹์˜ ์ง€๋‚˜์น˜๊ฒŒ ์žฅํ™ฉํ•œ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚™๋‹ดํ•˜๋Š” ์œ ์ผํ•œ ์‚ฌ๋žŒ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@mnn , GDNative๋Š” C ๊ธฐ๋ฐ˜ ๋ชจ๋“ˆ์„ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์กŒ์œผ๋ฏ€๋กœ ์ „์ฒด ์—”์ง„์„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ์œ„์— C++, python, rust ๋“ฑ์œผ๋กœ ์ „์ฒด ์—”์ง„์„ ์ปดํŒŒ์ผํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๋ชจ๋“ˆ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๋Ÿฌ ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์˜ ๋˜ ๋‹ค๋ฅธ ๋ชฉํ‘œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ชจ๋“ˆ ์ž์ฒด๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์•ˆ์ •์ ์ธ ์—”์ง„ ๋นŒ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๋ชจ๋“ˆ์ด ์•„์ง ์œ ์ง€ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์•„ ํŠน์ • ๋ฒ„์ „์˜ ์—”์ง„์— ์—ฐ๊ฒฐ๋˜์–ด ์—†์–ด์กŒ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ปดํŒŒ์ผ ๋ฐ ๋ฐฐํฌ ๊ด€์ ์—์„œ ๋ชจ๋“ˆ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ‘๊ทผ ๋ฐฉ์‹ ๋•Œ๋ฌธ์— ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ œํ•œ ์‚ฌํ•ญ ๋‚ด์—์„œ ์œ ์ง€ํ•˜๋ฉด GDNative์—์„œ C++ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์œ ์ง€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ชจ๋“ˆ์„ ๋นŒ๋“œํ•˜๋Š” ๋Œ€์ƒ์ด ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ•œ๊ณ„์—์„œ ๋ฒ—์–ด๋‚˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋ฉด ๊ณจ์น˜ ์•„ํ”ˆ ์ผ์— ์ง๋ฉดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‚ด ํ˜„์žฌ ๊ณจ์นซ๊ฑฐ๋ฆฌ๋Š” OpenGL ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋กœ์ง์€ ๋ชจ๋‘ ๋น„์ฃผ์–ผ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ ๋‚ด๋ถ€์— ์บก์Šํ™”๋˜์–ด ์žˆ๊ณ  ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ GDNative ๋‚ด๋ถ€์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ GDNative๋กœ ๊ฒฐ์ฝ” ์„ค๊ณ„๋˜์ง€ ์•Š์€ ์ผ์„ ํ•˜๊ณ  ์‹ถ์€ ์ด์œ ์ž…๋‹ˆ๋‹ค.
์„ค๊ณ„๋œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ง ๋ฉ‹์ง„ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ GDNative๋Š” ๋” ๋†’์€ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•œ GDScript ์ฝ”๋“œ๋ฅผ ์žฌ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ GDScript๊ฐ€ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” ์—”์ง„ ๋‚ด๋ถ€์˜ ์–ด๋–ค ๊ฒƒ๋„ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์˜ˆ: OpenGL).

์ตœ์‹  ์ฝ”๋ฃจํ‹ด ์ง€์›, ์ฆ‰ co_await()๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? procgen ๊ด€์ ์—์„œ ์ด๊ฒƒ์€ ๊ฑฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋ฃจํ‹ด ์ง€์›์€ ์•„์ง ํ™•์ •๋˜์ง€ ์•Š์€ C++20 ํ‘œ์ค€์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

์ €๋Š” ํ˜„์žฌ 3D Spatial Editor๋ฅผ ์œ„ํ•œ ๊ณ ๊ธ‰(์†Œ์Šค ๋ง์น˜ ํŽธ์ง‘๊ธฐ ์ƒ๊ฐ) ๋ธŒ๋Ÿฌ์‹œ/csg ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ž๋™์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ด ์ด์•ผ๊ธฐ๋Š” ์ €์—๊ฒŒ ์ •๋ง ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” _auto๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์กฐ์ฐจ ๋ช…์‹œ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค_. ๋‹ค์Œ์„ ๊ณ ๋ คํ•˜์„ธ์š”:

์ €๋Š” SpatialEditorViewportContainer ์•ˆ์— ์žˆ๊ณ  ์ƒ์œ„ ๊ณ„์ธต์˜ ์„ธ ํ•ญ๋ชฉ์ธ SpatialEditor๋ฅผ ์–ป๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ทฐํฌํŠธ ์ปจํ…Œ์ด๋„ˆ์—์„œ SpatialEditor์— ์•ก์„ธ์Šคํ•˜๋Š” ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ์ง€์ ํ•˜๊ธฐ ์ „์— ์ด ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ์–ด์ œ)

auto sp = Object::cast_to<SpatialEditor>(get_parent()->get_parent()->get_parent());

๋ณด์‹œ๋‹ค์‹œํ”ผ ๋™์  ๋‹ค์šด์บ์ŠคํŠธ๋Š” _์ด๋ฏธ SP_ ์œ ํ˜•์„ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. auto๊ฐ€ ์—†์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ค‘๋ณต ์ •ํฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

SpatialEditor sp = Object::cast_to<SpatialEditor>(get_parent()->get_parent()->get_parent());

์‹ ์˜ ์‚ฌ๋ž‘์„ ์œ„ํ•ด ์˜คํ†  ์‚ฌ์šฉ์„ ํ—ˆ๋ฝํ•ด์ฃผ์„ธ์š”!

C++ ํ‘œ์ค€์„ ์‚ฌ์šฉํ•  ์ฃผ์ œ: C++20 ์ด์ƒ์—์„œ ์ œ์•ˆ๋œ ๋ฆฌํ”Œ๋ ‰์…˜ ๋ฐ ๋ฉ”ํƒ€ ํด๋ž˜์Šค ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งคํฌ๋กœ ํ˜ผ๋ž€์„ ์ค„์ด๋Š” ๋ฐ ์ •๋ง ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

GDCLASS(SpatialEditorViewportContainer, Container);

๋˜ํ•œ ์ด๋Ÿฌํ•œ ์ œํ•œ์œผ๋กœ ์ธํ•ด ๊ธฐ์—ฌํ•˜๊ธฐ๋กœ ํ•œ ๊ฒฐ์ •์ด ์ •๋ง ๋‘ ๋ฒˆ์งธ๋กœ ์ถ”์ธก๋œ๋‹ค๋Š” ์ ์„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. 2012๋…„๊ฒฝ, ๋‚˜๋Š” ์Šค์Šค๋กœ C++11์„ ๋ฐฐ์› ๊ณ  ์ด ํ‘œ์ค€์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ๋บจ์„ ๋•Œ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. C++11๊ณผ C++03์€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์–ธ์–ด์ด๋ฉฐ C++๊ฐ€ ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ต๊ณ  ์ฝ๊ธฐ ์–ด๋ ต๊ณ  ์“ฐ๊ธฐ ์–ด๋ ต๋‹ค๋Š” ํ‰ํŒ์˜ ๋Œ€๋ถ€๋ถ„์€ C++03(๋˜๋Š” 98)์˜ ์ž˜๋ชป์ž…๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ C++11 ๋˜๋Š” 14๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ๊ฐ€๋…์„ฑ์— _ํ•ด๋กœ์šด_ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” C++11๊ณผ ํ•จ๊ป˜ ์ž๋ž๊ณ  ํ”„๋กœ์ ํŠธ ๋ฆฌ๋”๋Š” ๋ถ„๋ช…ํžˆ ๊ทธ๋ ‡์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(๊ทธ๊ฐ€ 2007๋…„์— Godot์—์„œ ์ž‘์—…ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ์ €๋Š” 12์‚ด์ด์—ˆ์Šต๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ์ €๋Š” ์ด๊ฒƒ์ด ์„ ํ˜ธ๋„์™€ ์•„๊ธฐ ์˜ค๋ฆฌ ์ฆํ›„๊ตฐ์˜ ๊ฒฝ์šฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” C++11์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ํ˜„๋Œ€ C++์„ ๋ฐฐ์šฐ๋Š”๋ฐ ์‹œ๊ฐ„์„ ๋“ค์ธ ๋‚˜ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์„ ํฌ์ƒ์‹œํ‚ค๋ฉด์„œ ๊ตฌ์‹(์ผ๋ช… ๋”์ฐํ•œ) C++์— ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ๋“ค์„ ์œ„๋กœํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ ์  ๋” ๋งŽ์€ ์ฃผ๋‹ˆ์–ด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ˜„๋Œ€ C++ 11 ์ด์ƒ์—์„œ ์„ฑ์žฅํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๊ฐ€ ๋žŒ๋‹ค๊ฐ€ ์—†๋Š” ์–ธ์–ด์— ์˜์›ํžˆ ๊ฐ‡ํ˜€ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์š”์ปจ๋Œ€: C++11 ๋˜๋Š” ํ‰์ƒ!

๋ถ„๋ช…ํžˆ ๋ง์”€๋“œ๋ฆฌ์ž๋ฉด, ์ €๋Š” STL์˜ ์‚ฌ์šฉ์„ ์˜นํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ตด๋ฆฌ๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์ง€๋งŒ ๋žŒ๋‹ค ๋ฐ ์ž๋™๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ฑฐ๋ถ€ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์˜๋ฏธํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋” ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์˜๋ฏธํ•˜๋ฏ€๋กœ ์ง€๊ธˆ์€ ๋ฐ˜ํ–ฅ์‹ค์„ ๋‹ซ๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๋ช‡ ๋‹ฌ ์ „์— C++11 ๋ฐ/๋˜๋Š” ์ผ๋ถ€ ์ดํ›„ ๋ฒ„์ „์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๊ณ„ํš์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” @hpvb ๊ฐ€ ์šฐ๋ฆฌ์˜ ํ•ฉ์˜์— ๋”ฐ๋ผ ๊ทธ๊ฐ€ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š” ์ง€์นจ์„ ๋งˆ๋ฌด๋ฆฌํ•  ์‹œ๊ฐ„์„ ๊ฐ–๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์œผ๋ฉฐ, ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฒŒ์‹œ๋˜๋ฉด ํ•ด๋‹น ์ง€์นจ์— ๋Œ€ํ•ด ๋” ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€๋Š” ์ด๊ฒƒ์€ ๊ฑด์„ค์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰