<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[:Like a Comet]]></title><description><![CDATA[속세와 단절]]></description><link>https://elenesgu.dev/</link><image><url>https://elenesgu.dev/favicon.png</url><title>:Like a Comet</title><link>https://elenesgu.dev/</link></image><generator>Ghost 5.81</generator><lastBuildDate>Mon, 27 Apr 2026 14:00:08 GMT</lastBuildDate><atom:link href="https://elenesgu.dev/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Understanding C++ ostream and istream with the implementation of std::stringbuf in glibc]]></title><description><![CDATA[C++에서 흔히 std::ostream과 std::istream 타입의 인스턴스 std::cout, std::cin 또는 std::fstream와 같은 파생 클래스의 인스턴스를 사용한다. 각각의 클래스의 생성자를 살펴보면 공통적으로 basic_streambuf 타입을 인자로 받는 것을 알 수 있다. 이는 C++에서 입출력을 제어하는데 사용하는 핵심적인 클래스로 stringstream이나 fstream은 이를 이용하여 입출력을 수행한다.]]></description><link>https://elenesgu.dev/understanding-c-ostream-and-istream-with-the-implementation-of-std-stringbuf-in-glibc-2/</link><guid isPermaLink="false">6099dd550ab10400014c4a3a</guid><category><![CDATA[C++]]></category><dc:creator><![CDATA[Seungmin Lee]]></dc:creator><pubDate>Sun, 08 Aug 2021 09:26:36 GMT</pubDate><content:encoded><![CDATA[<p>C++&#xC5D0;&#xC11C; &#xD754;&#xD788; std::ostream&#xACFC; std::istream &#xD0C0;&#xC785;&#xC758; &#xC778;&#xC2A4;&#xD134;&#xC2A4; std::cout, std::cin &#xB610;&#xB294; std::fstream&#xC640; &#xAC19;&#xC740; &#xD30C;&#xC0DD; &#xD074;&#xB798;&#xC2A4;&#xC758; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;. &#xAC01;&#xAC01;&#xC758; &#xD074;&#xB798;&#xC2A4;&#xC758; &#xC0DD;&#xC131;&#xC790;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74; &#xACF5;&#xD1B5;&#xC801;&#xC73C;&#xB85C; basic_streambuf &#xD0C0;&#xC785;&#xC744; &#xC778;&#xC790;&#xB85C; &#xBC1B;&#xB294; &#xAC83;&#xC744; &#xC54C; &#xC218; &#xC788;&#xB2E4;. &#xC774;&#xB294; C++&#xC5D0;&#xC11C; &#xC785;&#xCD9C;&#xB825;&#xC744; &#xC81C;&#xC5B4;&#xD558;&#xB294;&#xB370; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xD575;&#xC2EC;&#xC801;&#xC778; &#xD074;&#xB798;&#xC2A4;&#xB85C; stringstream&#xC774;&#xB098; fstream&#xC740; &#xC774;&#xB97C; &#xC774;&#xC6A9;&#xD558;&#xC5EC; &#xC785;&#xCD9C;&#xB825;&#xC744; &#xC218;&#xD589;&#xD55C;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">/// from glibc:ostream
typedef basic_streambuf&lt;_CharT, _Traits&gt; __streambuf_type;
/**
 *  @brief  Base constructor.
 *
 *  This ctor is almost never called by the user directly, rather from 
 *  derived classes&apos; initialization lists, which pass a pointer to
 *  their own stream buffer.
 */
explicit basic_ostream(__streambuf_type* __sb) { this-&gt;init(__sb); }
</code></pre>
<!--kg-card-end: markdown--><p>streambuf&#xC5D0; &#xB300;&#xD55C; &#xAE30;&#xBCF8;&#xC801;&#xC778; &#xC791;&#xB3D9; &#xBC29;&#xC2DD;&#xC740; <a href="https://en.cppreference.com/w/cpp/io/basic_streambuf?ref=elenesgu.dev">cppreference</a>&#xB97C; &#xD1B5;&#xD574; &#xC774;&#xD574;&#xD560; &#xC218; &#xC788;&#xB2E4;. (&#xD574;&#xB2F9; &#xB9C1;&#xD06C;&#xC758; &#xC0AC;&#xC9C4;&#xC744; &#xAF2D; &#xBCF4;&#xB294; &#xAC83;&#xC744; &#xCD94;&#xCC9C;&#xD55C;&#xB2E4;.) &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xAC00;&#xC0C1; &#xD568;&#xC218;&#xB97C; &#xD1B5;&#xD574; &#xB2E4;&#xD615;&#xC131;&#xC744; &#xC9C0;&#xC6D0;&#xD55C;&#xB2E4;. &#xB9C1;&#xD06C;&#xC5D0; &#xB098;&#xC640;&#xC788;&#xB4EF;&#xC774;, 6&#xAC1C;&#xC758; &#xD3EC;&#xC778;&#xD130;&#xB97C; &#xC0AC;&#xC6A9;&#xD574; &#xC785;&#xCD9C;&#xB825;&#xC744; &#xAD00;&#xB9AC;&#xD55C;&#xB2E4;. &#xC6B0;&#xB9AC;&#xAC00; &#xD754;&#xD788; C&#xC5B8;&#xC5B4;&#xC5D0;&#xC11C; (&#xD639;&#xC740; &#xBA54;&#xBAA8;&#xB9AC;&#xB97C; &#xC9C1;&#xC811; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC5D0;) &#xB3D9;&#xC801; &#xBC30;&#xC5F4;&#xC744; &#xAD00;&#xB9AC;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; 3&#xAC1C;&#xC758; &#xD3EC;&#xC778;&#xD130; &#xAC12;&#xC744; &#xD1B5;&#xD574; &#xC720;&#xC9C0;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xCCAB; &#xBC88;&#xC9F8;&#xB85C; &#xD544;&#xC694;&#xD55C; &#xAC83;&#xC740; &#xBC30;&#xC5F4;&#xC758; &#xC2DC;&#xC791;&#xC810;&#xC774;&#xB2E4;. &#xB450; &#xBC88;&#xC9F8; &#xD3EC;&#xC778;&#xD130;&#xB294; &#xBC30;&#xC5F4;&#xC758; &#xAE38;&#xC774;&#xB97C; &#xB098;&#xD0C0;&#xB0B8;&#xB2E4;. &#xB9C8;&#xC9C0;&#xB9C9; &#xD3EC;&#xC778;&#xD130;&#xB294; &#xBC30;&#xC5F4;&#xC758; &#xC2E4;&#xC81C; &#xD5C8;&#xC6A9;&#xD558;&#xB294; &#xBA54;&#xBAA8;&#xB9AC; &#xACF5;&#xAC04;&#xC758; &#xB05D; &#xC9C0;&#xC810;&#xC744; &#xB098;&#xD0C0;&#xB0B8;&#xB2E4;. &#xC2DC;&#xC791; &#xC810;&#xC744; &#xC81C;&#xC678;&#xD55C; &#xB098;&#xBA38;&#xC9C0; &#xB450; &#xAC1C;&#xC758; &#xAC12;&#xC740; &#xD3EC;&#xC778;&#xD130;&#xAC00; &#xC544;&#xB2C8;&#xB77C; &#xC815;&#xC218;&#xB97C; &#xC0AC;&#xC6A9;&#xD574; &#xD45C;&#xD604;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xAC00; &#xB354; &#xC77C;&#xBC18;&#xC801;&#xC77C; &#xAC83;&#xC774;&#xB2E4;. &#xC2E4;&#xC81C;&#xB85C; glibc&#xC758; std::vector&#xC758; &#xAD6C;&#xD604;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xC544;&#xB3C4;3&#xAC1C;&#xC758; &#xD3EC;&#xC778;&#xD130;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xACF5;&#xAC04;&#xC744; &#xD45C;&#xD604;&#xD558;&#xACE0; &#xC788;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-cpp">///from glibc:stl_vector.h
struct _Vector_impl_data {
    pointer _M_start;
    pointer _M_finish;
    pointer _M_end_of_storage;
}
</code></pre>
<!--kg-card-end: markdown--><p>streambuf&#xB294; &#xC785;&#xB825;&#xC5D0; &#xD574;&#xB2F9;&#xD558;&#xB294; &#xC601;&#xC5ED;&#xACFC; &#xCD9C;&#xB825;&#xC5D0; &#xD574;&#xB2F9;&#xD558;&#xB294; &#xC601;&#xC5ED;&#xC744; &#xB458; &#xB2E4; &#xD45C;&#xAE30;&#xD574;&#xC57C; &#xD558;&#xBBC0;&#xB85C; &#xB450; &#xBC30;&#xC778; 6&#xAC1C;&#xC758; &#xD3EC;&#xC778;&#xD130;&#xB97C; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;. &#xC785;&#xB825;&#xC5D0; &#xD574;&#xB2F9;&#xD558;&#xB294; &#xC601;&#xC5ED;&#xC740; get &#xC601;&#xC5ED;&#xC774;&#xB77C;&#xACE0; &#xBD80;&#xB974;&#xACE0; &#xCD9C;&#xB825;&#xC5D0; &#xD574;&#xB2F9;&#xD558;&#xB294; &#xC601;&#xC5ED;&#xC740; put &#xC601;&#xC5ED;&#xC774;&#xB77C;&#xACE0; &#xBD80;&#xB978;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; 6&#xAC1C;&#xC758; &#xD3EC;&#xC778;&#xD130;&#xB97C; &#xAD00;&#xB9AC;&#xD558;&#xBA74;&#xC11C; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;(streambuf)&#xC5D0; &#xB9DE;&#xB294; &#xD568;&#xC218;&#xB97C; &#xC624;&#xBC84;&#xB77C;&#xC774;&#xB4DC;&#xD574;&#xC11C; &#xAD6C;&#xD604;&#xD558;&#xBA74; ostream/istream&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD560; &#xC785;&#xCD9C;&#xB825; &#xCC98;&#xB9AC; &#xB85C;&#xC9C1;&#xC744; &#xC790;&#xC694;&#xB86D;&#xAC8C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xC774; &#xAE00;&#xC5D0;&#xC120; std::stringstream&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xB294; std::stringbuf&#xC758; glibc &#xAD6C;&#xD604;&#xCCB4;&#xB97C; &#xC0B4;&#xD3B4;&#xBD04;&#xC73C;&#xB85C;&#xC368; streambuf&#xB97C; &#xC774;&#xD574;&#xD558;&#xB294; &#xAC83;&#xC774; &#xBAA9;&#xD45C;&#xC774;&#xB2E4;.</p><p>&#xC18C;&#xC2A4; &#xCF54;&#xB4DC;&#xB294; gcc-mirror github&#xC758; release/gcc-11.1.0 &#xD0DC;&#xADF8;&#xC5D0;&#xC11C; &#xC218;&#xC9D1;&#xB41C; &#xACB0;&#xACFC;&#xBB3C;&#xC774;&#xBA70;, raw.githubusercontent.com&#xC744; &#xC784;&#xBCA0;&#xB4DC; &#xD558;&#xC600;&#xB2E4;.</p><h1 id="std-stringstream-and-std-stringbuf">std::stringstream and std::stringbuf</h1><p>ostream&#xC774; basic_ostream&lt;char&gt;&#xC758; aliasing &#xC774;&#xB4EF;&#xC774; std::stringbuf&#xB3C4; std::basic_streambuf&lt;char&gt;&#xC758; aliasing&#xC774;&#xB2E4;. std::stringbuf&#xB294; &#xC774;&#xB984; &#xADF8;&#xB300;&#xB85C; &#xB0B4;&#xBD80;&#xC5D0; &#xC720;&#xC9C0;&#xD558;&#xACE0; &#xC788;&#xB294; &#xC785;&#xCD9C;&#xB825; &#xC601;&#xC5ED;&#xC740; std::string&#xC73C;&#xB85C; &#xAD00;&#xB9AC;&#xD558;&#xACE0; &#xC788;&#xB2E4;. std::string&#xC5D0; 6&#xAC1C;&#xC758; &#xD3EC;&#xC778;&#xD130;&#xB97C; &#xC5B4;&#xB5BB;&#xAC8C; &#xC124;&#xC815;&#xD558;&#xB294;&#xC9C0; &#xBCF4;&#xAE30; &#xC804;&#xC5D0; &#xBA3C;&#xC800; overflow&#xC5D0; &#xB300;&#xD55C; &#xD568;&#xC218;&#xB97C; &#xBCF4;&#xACE0; &#xAC00;&#xB824;&#xACE0; &#xD55C;&#xB2E4;. <a href="https://en.cppreference.com/w/cpp/io/basic_streambuf/overflow?ref=elenesgu.dev">overflow</a>&#xB294; &#xC774;&#xB984; &#xADF8;&#xB300;&#xB85C; &#xBC84;&#xD37C;&#xAC00; &#xAF49; &#xCC2C; &#xACBD;&#xC6B0; &#xCD9C;&#xB825;&#xC744; &#xD558;&#xAE30; &#xC704;&#xD574; &#xD638;&#xCD9C;&#xB418;&#xB294; &#xD568;&#xC218;&#xC774;&#xB2E4;. &#xC815;&#xD655;&#xD788;&#xB294; pptr&#xC774; nullptr&#xC774;&#xAC70;&#xB098; pptr&#xC774; epptr&#xBCF4;&#xB2E4; &#xD06C;&#xAC70;&#xB098; &#xAC19;&#xC744; &#xB54C; &#xCD9C;&#xB825;&#xB41C;&#xB2E4;. &#xD6C4;&#xC790;&#xAC00; &#xBC84;&#xD37C;&#xAC00; &#xAF49;&#xCC3C;&#xB2E4;&#xACE0; &#xC778;&#xC9C0;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC774;&#xB2E4;. &#xC0C1;&#xC704; &#xD074;&#xB798;&#xC2A4;&#xC778; std::streambuf&#xAC00; put &#xC601;&#xC5ED;&#xC758; 3&#xAC1C;&#xC758; &#xD3EC;&#xC778;&#xD130;&#xB97C; &#xC784;&#xC758;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xCD9C;&#xB825;&#xC744; &#xD558;&#xB2E4;&#xAC00; &#xB05D; &#xC9C0;&#xC810;&#xC5D0; &#xB3C4;&#xB2EC;&#xD588;&#xC744; &#xACBD;&#xC6B0; &#xC774; virtual &#xD568;&#xC218;&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xC5EC; &#xCC98;&#xB9AC;&#xD55C;&#xB2E4;. overflow&#xC758; &#xAD6C;&#xD604;&#xCCB4;&#xB294; <a href="https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/sstream.tcc?ref=elenesgu.dev">sstream.tcc</a>&#xC5D0; &#xC874;&#xC7AC;&#xD55C;&#xB2E4;. (CXX11_ABI&#xB294; &#xAEBC;&#xC838;&#xC788;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xAC04;&#xC8FC;&#xD55C;&#xB2E4;.)</p><!--kg-card-begin: html--><pre><code id="sstream-overflow-from-git" class="language-cpp"> </code></pre>

<script>    
const sstrea_overflow = async () => {
  const url = 'https://raw.githubusercontent.com/gcc-mirror/gcc/releases/gcc-11.1.0/libstdc++-v3/include/bits/sstream.tcc';
  const res = await fetch(url);
  const data = await res.text();
  const el = document.querySelector("#sstream-overflow-from-git");
  if(el) {
    const split_data = data.split('\n');
    el.innerHTML = hljs.highlightAuto(split_data[76].substr(2) + '\n' + split_data.slice(78, 145).map(x => x.replace(/\t/g, "        ")).map(x => x.substr(x[0] === '#' ? 2 : 4)).join('\n')).value;
  }
};
sstrea_overflow();
</script><!--kg-card-end: html--><p>&#xBA3C;&#xC800; &#xD604;&#xC7AC; &#xC2A4;&#xD2B8;&#xB9BC;&#xC758; &#xBAA8;&#xB4DC;&#xAC00; out&#xC774;&#xAC70;&#xB098; &#xC785;&#xB825;&#xC73C;&#xB85C; &#xC900; &#xAC12;&#xC774; EOF(end of file) &#xAC12;&#xC77C; &#xACBD;&#xC6B0;&#xB294; &#xC2A4;&#xD399;&#xC5D0; &#xB9DE;&#xB294; &#xAC12;&#xC744; &#xC989;&#xC2DC; &#xB9AC;&#xD134;&#xD55C;&#xB2E4;. <code>__testput</code> &#xBCC0;&#xC218;&#xB294; &#xC2A4;&#xD2B8;&#xB9BC;&#xC758; pptr&#xAC12;&#xACFC; epptr&#xAC12;&#xC744; &#xBE44;&#xAD50;&#xD55C;&#xB2E4;. pptr &#xAC12;&#xC740; put area &#xBC30;&#xC5F4;&#xC758; &#xD604;&#xC7AC; &#xB05D; &#xC810;&#xC744; &#xB098;&#xD0C0;&#xB0B4;&#xACE0;, epptr&#xC740; put area&#xC758; capacity &#xAD00;&#xC810;&#xC5D0;&#xC11C; &#xB05D;&#xC744; &#xB098;&#xD0C0;&#xB0B8;&#xB2E4;. pptr&#xC774; epptr &#xBBF8;&#xB9CC;&#xC774;&#xB77C;&#xBA74;, &#xC989; <code>__testput&#xC774;</code> true &#xB77C;&#xB294; &#xAC83;&#xC740; capacity&#xB97C; &#xB298;&#xB9AC;&#xC9C0; &#xC54A;&#xC544;&#xB3C4; &#xC785;&#xB825; &#xAC12; <code>c</code> &#xB97C; put area&#xC5D0; &#xB123;&#xC744; &#xC218; &#xC788;&#xB2E4;&#xB294; &#xAC83;&#xC774;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; &#xD568;&#xC218; &#xD558;&#xB2E8; &#xBD80;&#xC758; else &#xC601;&#xC5ED;&#xC744; &#xBCF4;&#xBA74; &#xB2E8;&#xC21C;&#xD788; &#xD604;&#xC7AC; pptr&#xC5D0; &#xC785;&#xB825; &#xAC12;&#xC744; &#xB123;&#xACE0; &#xC788;&#xB2E4;. &#xB9CC;&#xC57D;, false&#xB77C;&#xBA74; capacity&#xB97C; &#xB298;&#xB9B4; &#xD544;&#xC694;&#xAC00; &#xC788;&#xB2E4;. &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xBC30;&#xC5F4;&#xC744; &#xB298;&#xB9AC;&#xB294; &#xACBD;&#xC6B0;&#xC640; &#xC720;&#xC0AC;&#xD558;&#xAC8C; &#xC0C8;&#xB85C;&#xC6B4; &#xBC30;&#xC5F4; &#xC601;&#xC5ED;&#xC758; &#xAE38;&#xC774;&#xB97C; &#xACC4;&#xC0B0;&#xD558;&#xACE0; &#xADF8; &#xAE38;&#xC774;&#xC758; string&#xAC1D;&#xCCB4;&#xB97C; <code>__tmp</code> &#xB85C;&#xC0DD;&#xC131;&#xD55C;&#xB2E4;. &#xADF8; &#xD6C4; <a href="https://en.cppreference.com/w/cpp/string/basic_string/assign?ref=elenesgu.dev">assign</a>&#xC744; &#xD1B5;&#xD574; pbase&#xBD80;&#xD130; pptr&#xAE4C;&#xC9C0; &#xB2E4;&#xC2DC;&#xB9D0;&#xD574; &#xAE30;&#xC874; &#xBC84;&#xD37C;&#xC5D0; &#xC788;&#xB358; &#xB0B4;&#xC6A9;&#xC744; &#xBCF5;&#xC0AC;&#xD55C;&#xB2E4;. &#xADF8; &#xB2E4;&#xC74C; &#xC0C8;&#xB85C;&#xC6B4; &#xBC84;&#xD37C;&#xC5D0; &#xC785;&#xB825; &#xAC12; <code>c</code> &#xB97C; &#xB123;&#xACE0; <code>_M_sync</code>&#xD568;&#xC218;&#xB97C; &#xD1B5;&#xD574; pbase, pptr, &#xADF8;&#xB9AC;&#xACE0; epptr &#xAC19;&#xC740; &#xAC12;&#xC744; &#xB3D9;&#xAE30;&#xD654;&#xB97C; &#xC2DC;&#xD0A8;&#xB2E4;. &#xC704; &#xB450; &#xACBD;&#xC6B0;&#xC5D0; &#xB300;&#xD574; &#xCD9C;&#xB825;&#xC744; &#xCC98;&#xB9AC;&#xD55C; &#xD6C4;&#xC5D0;&#xB294; pbump&#xB97C; &#xD1B5;&#xD574; epptr &#xAC12;&#xC744; &#xD55C; &#xCE78; &#xC804;&#xC9C4;&#xC2DC;&#xD0A8;&#xB2E4;.</p><p>&#xB2E4;&#xC74C;&#xC73C;&#xB85C; &#xD655;&#xC778;&#xD560; &#xAC83;&#xC740; overflow&#xC640; &#xBC18;&#xB300; &#xAC1C;&#xB150;&#xC778; <a href="https://en.cppreference.com/w/cpp/io/basic_streambuf/underflow?ref=elenesgu.dev">underflow</a> &#xD568;&#xC218;&#xC774;&#xB2E4;. &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C;&#xC785;&#xB825; &#xBC84;&#xD37C;&#xAC00; &#xBE44;&#xC5B4;&#xC788;&#xC744; &#xACBD;&#xC6B0; &#xD638;&#xCD9C;&#xB41C;&#xB2E4;. &#xC5EC;&#xAE30;&#xC11C;&#xB3C4; &#xC815;&#xD655;&#xD788;&#xB294; gptr &#xAC12;&#xC774; nullptr&#xC774;&#xAC70;&#xB098; gptr&#xC774; egptr&#xBCF4;&#xB2E4; &#xD06C;&#xAC70;&#xB098; &#xAC19;&#xC744; &#xB54C; &#xD638;&#xCD9C;&#xB418;&#xACE0; &#xD6C4;&#xC790;&#xC758; &#xACBD;&#xC6B0;&#xAC00; &#xC785;&#xB825; &#xBC84;&#xD37C;&#xAC00; &#xBE44;&#xC5B4;&#xC788;&#xC744; &#xACBD;&#xC6B0;&#xC774;&#xB2E4;. underflow &#xAD6C;&#xD604;&#xCCB4; &#xC5ED;&#xC2DC; sstream.tcc&#xC5D0; &#xC874;&#xC7AC;&#xD55C;&#xB2E4;.</p><!--kg-card-begin: html--><pre><code id="sstream-underflow-from-git" class="language-cpp"> </code></pre>

<script>    
const sstream_underflow = async () => {
  const url = 'https://raw.githubusercontent.com/gcc-mirror/gcc/releases/gcc-11.1.0/libstdc++-v3/include/bits/sstream.tcc';
  const res = await fetch(url);
  const data = await res.text();
  const el = document.querySelector("#sstream-underflow-from-git");
  if(el) {
    const split_data = data.split('\n');
    el.innerHTML = hljs.highlightAuto(split_data[146].substr(2) + '\n' + split_data.slice(147, 163).map(x => x.replace(/\t/g, "        ")).map(x => x.substr(x[0] === '#' ? 2 : 4)).join('\n')).value;
  }
};
sstream_underflow();
</script><!--kg-card-end: html--><p>underflow &#xC790;&#xCCB4;&#xB294; &#xB2E8;&#xC21C;&#xD558;&#xB2E4;. &#xD604;&#xC7AC; &#xC2A4;&#xD2B8;&#xB9BC;&#xC758; &#xBAA8;&#xB4DC;&#xAC00; in&#xC77C; &#xACBD;&#xC6B0; &#xC9C4;&#xC9DC;&#xB85C; string&#xC758; &#xB05D;&#xC5D0;&#xB3C4;&#xB2EC;&#xD558;&#xC600;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD55C;&#xB2E4;. <code>_M_update_egptr</code> &#xD568;&#xC218;&#xB97C; &#xD1B5;&#xD574; string&#xC758; &#xB0B4;&#xBD80; &#xBC30;&#xC5F4; &#xAD6C;&#xAC04;&#xACFC; get area&#xB97C; &#xB3D9;&#xAE30;&#xD654; &#xC2DC;&#xD0A8; &#xB4A4; get area&#xC5D0; &#xB0B4;&#xC6A9;&#xC774; &#xB354; &#xC788;&#xC73C;&#xBA74; &#xD574;&#xB2F9; &#xAC12;&#xC744; &#xBC18;&#xD658;&#xD55C;&#xB2E4;.</p><p>&#xC9C0;&#xAE08;&#xAE4C;&#xC9C0; &#xC785;&#xCD9C;&#xB825;&#xC5D0;&#xC11C; &#xC911;&#xC694;&#xD55C; &#xC5ED;&#xD560;&#xC744; &#xD558;&#xB294; &#xB450; &#xD568;&#xC218;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xC558;&#xB2E4;. &#xC5EC;&#xAE30;&#xC11C; &#xB354; &#xB098;&#xC544;&#xAC00; &#xB450; &#xD568;&#xC218;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xB294; &#xB0B4;&#xBD80; &#xD568;&#xC218;&#xB4E4;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB3C4; &#xBCFC; &#xAC00;&#xCE58;&#xAC00; &#xC788;&#xB2E4;. &#xBA3C;&#xC800; <code>_M_sync</code> &#xC774;&#xB2E4;. &#xC774; &#xD568;&#xC218;&#xB294; overflow&#xC5D0;&#xC11C; &#xAE30;&#xC874; string&#xAC1D;&#xCCB4;&#xC758; &#xACF5;&#xAC04;&#xC774; &#xBD80;&#xC871;&#xD574; &#xC0C8;&#xB85C;&#xC6B4; string &#xAC1D;&#xCCB4;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4; &#xADF8; &#xAC83;&#xC744; &#xB0B4;&#xBD80; &#xBC84;&#xD37C;&#xB85C; &#xC0AC;&#xC6A9;&#xD560; &#xB54C; &#xBD88;&#xB9B0; &#xD568;&#xC218;&#xC774;&#xB2E4;. &#xB610;&#xD55C; <a href="https://en.cppreference.com/w/cpp/io/basic_streambuf/pubsetbuf?ref=elenesgu.dev">setbuf</a> &#xD568;&#xC218;&#xB098; &#xAC1D;&#xCCB4;&#xC758; &#xC0DD;&#xC131;&#xC790;&#xC5D0;&#xC11C; &#xCD08;&#xAE30;&#xD654; &#xD560; &#xB54C; &#xBD88;&#xB9AC;&#xB294; &#xD568;&#xC218;&#xC774;&#xAE30;&#xB3C4; &#xD558;&#xB2E4;. &#xD55C;&#xB9C8;&#xB514;&#xB85C; &#xD558;&#xC790;&#xBA74; 6&#xAC1C;&#xC758; &#xD3EC;&#xC778;&#xD130;&#xB97C; &#xB0B4;&#xBD80; &#xBC84;&#xD37C;&#xC5D0; &#xB9DE;&#xCD94;&#xB294; &#xC791;&#xC5C5;&#xC744; &#xD558;&#xB294; &#xD568;&#xC218;&#xC774;&#xB2E4;. <code>_M_sync</code> &#xAD6C;&#xD604;&#xCCB4;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><!--kg-card-begin: html--><pre><code id="sstream-M-sync-from-git" class="language-cpp"> </code></pre>

<script>    
const sstream_m_sync = async () => {
  const url = 'https://raw.githubusercontent.com/gcc-mirror/gcc/releases/gcc-11.1.0/libstdc++-v3/include/bits/sstream.tcc';
  const res = await fetch(url);
  const data = await res.text();
  const el = document.querySelector("#sstream-M-sync-from-git");
  if(el) {
    const split_data = data.split('\n');
    el.innerHTML = hljs.highlightAuto(split_data[242].substr(2) + '\n' + split_data.slice(243, 272).map(x => x.replace(/\t/g, "        ")).map(x => x.substr(x[0] === '#' ? 2 : 4)).join('\n')).value;
  }
};
sstream_m_sync();
</script><!--kg-card-end: html--><p>overflow&#xC5D0;&#xC11C;&#xB294; &#xCCAB; &#xBC88;&#xC9F8; &#xC778;&#xC790;&#xB85C; &#xBC84;&#xD37C; string&#xC758; data&#xB97C;, &#xB450; &#xBC88;&#xC9F8; &#xC778;&#xC790;&#xB85C; gptr - eback &#xAC12;&#xC744;, &#xC138; &#xBC88;&#xC9F8; &#xC778;&#xC790;&#xB85C; pptr - pbase &#xAC12;&#xC744; &#xC778;&#xC790;&#xB85C; &#xB123;&#xC5C8;&#xB2E4;. &#xB450; &#xBC88;&#xC9F8; &#xC778;&#xC790; <code>__i</code> &#xB294; get area&#xC758; &#xD604;&#xC7AC; &#xC704;&#xCE58;&#xC640; &#xBC84;&#xD37C; &#xC2DC;&#xC791; &#xC9C0;&#xC810;&#xC758; &#xCC28;&#xC774;&#xC758; &#xAE38;&#xC774;&#xB97C; &#xB098;&#xD0C0;&#xB0B4;&#xACE0; &#xC138; &#xBC88;&#xC9F8; &#xC778;&#xC790; <code>__o</code> &#xB294; put area&#xC758; &#xAE38;&#xC774;&#xB97C; &#xB098;&#xD0C0;&#xB0B8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; get area&#xC758; &#xC138; &#xD3EC;&#xC778;&#xD130; eback, gptr, egptr&#xC744; &#xAC01;&#xAC01; string&#xC758; data, &#xC785;&#xB825;&#xC73C;&#xB85C; &#xC900; &#xAE30;&#xC874; gtpr - eback &#xAC12; &#xADF8;&#xB9AC;&#xACE0; string&#xC758; size &#xAC12;&#xC73C;&#xB85C; &#xC124;&#xC815;&#xD55C;&#xB2E4;. put area&#xC758; &#xACBD;&#xC6B0; &#xC138; &#xD3EC;&#xC778;&#xD130; pbase, pptr, epptr&#xC744; &#xAC01;&#xAC01; string&#xC758; data, string&#xC758; capacity &#xADF8;&#xB9AC;&#xACE0; string&#xC758; size &#xAC12;&#xC73C;&#xB85C; &#xC124;&#xC815;&#xD55C;&#xB2E4;. &#xA0;<a href="https://en.cppreference.com/w/cpp/io/basic_streambuf/setg?ref=elenesgu.dev">setg</a>&#xC640; &#xB2EC;&#xB9AC; <a href="https://en.cppreference.com/w/cpp/io/basic_streambuf/setp?ref=elenesgu.dev">setp</a>&#xC758; &#xACBD;&#xC6B0; pbase&#xC640; pptr&#xB9CC; &#xC9C0;&#xC815;&#xD560; &#xC218; &#xC788;&#xACE0; pptr&#xC740; pbump&#xB97C; &#xD1B5;&#xD574;&#xC11C; &#xC804;&#xC9C4;&#xD574;&#xC57C;&#xD558;&#xB294;&#xB370; basic_streambuf&#xC758; <a href="https://cplusplus.github.io/LWG/issue255?ref=elenesgu.dev">pbump&#xC758; &#xC778;&#xC790;&#xAC00; int &#xC5EC;&#xC11C; &#xBC1C;&#xC0DD;&#xD558;&#xB294; &#xBB38;&#xC81C;</a>&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xB610;&#xB2E4;&#xB978; &#xB0B4;&#xBD80; &#xD568;&#xC218;&#xAC00; <code>_M_pbump</code> &#xB294; <code>__size_type</code>&#xC774;&#xB2E4;.</p><p>&#xB450; &#xBC88;&#xC9F8;&#xB85C; &#xBCFC; &#xB0B4;&#xBD80; &#xD568;&#xC218;&#xB294; underflow&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD588;&#xB358; <code>_M_update_egptr</code> &#xC774;&#xB2E4;. &#xC774; &#xD568;&#xC218;&#xB294; sstream&#xC5D0; &#xC9C1;&#xC811; &#xB4E4;&#xC5B4;&#xC788;&#xB2E4;.</p><!--kg-card-begin: html--><pre><code id="sstream-M-update-egptr-from-git" class="language-cpp"> </code></pre>

<script>    
const sstream_M_update_egptr = async () => {
  const url = 'https://raw.githubusercontent.com/gcc-mirror/gcc/releases/gcc-11.1.0/libstdc%2B%2B-v3/include/std/sstream';
  const res = await fetch(url);
  const data = await res.text();
  const el = document.querySelector("#sstream-M-update-egptr-from-git");
  if(el) {
    el.innerHTML = hljs.highlightAuto(data.split('\n').slice(400, 416).map(x => x.replace(/\t/g, "        ")).map(x => x.substr(x[0] === '#' ? 4 : 6)).join('\n')).value;
  }
};
sstream_M_update_egptr();
</script>
<!--kg-card-end: html--><p>pptr&#xC774; egptr&#xBCF4;&#xB2E4; &#xD06C;&#xB2E4;&#xBA74;, &#xC989; get area&#xC758; &#xBC84;&#xD37C;&#xC758; &#xB05D; &#xC9C0;&#xC810;&#xC774; put area&#xC758; &#xAE38;&#xC774;&#xC758; &#xB05D; &#xC9C0;&#xC810;&#xBCF4;&#xB2E4; &#xC791;&#xB2E4;&#xBA74; get area&#xC5D0;&#xC11C; &#xACE0;&#xB824;&#xD558;&#xC9C0; &#xBABB;&#xD55C; &#xB0B4;&#xC6A9;&#xC774; string&#xC5D0; &#xB354; &#xC788;&#xB2E4;&#xB294; &#xAC83;&#xC774;&#xB2E4;. &#xADF8;&#xB807;&#xB2E4;&#xBA74; egptr &#xAC12;&#xC744; pptr &#xAC12;&#xC73C;&#xB85C; &#xBC14;&#xAFD4; &#xB354; &#xC77D;&#xC744; &#xB0B4;&#xC6A9;&#xC774; &#xC788;&#xB2E4;&#xB294; &#xAC83;&#xC744; &#xB098;&#xD0C0;&#xB0B8;&#xB2E4;. stream&#xC758; &#xC2DC;&#xC791; &#xC2DC;&#xC810;&#xC758; &#xB0B4;&#xBD80; string &#xBC84;&#xD37C;&#xC758; &#xAE38;&#xC774;&#xAC00; 10&#xC774;&#xB77C;&#xACE0; &#xAC00;&#xC815;&#xD574;&#xC11C; egptr&#xC744; &#xADF8; &#xB2F9;&#xC2DC;&#xC758; string &#xAE38;&#xC774;&#xC758; &#xB05D; &#xC9C0;&#xC810;&#xC73C;&#xB85C; &#xC124;&#xC815; &#xD55C; &#xB4A4; &#xCD9C;&#xB825;&#xC744; &#xC9C4;&#xD589;&#xD558;&#xC5EC; &#xC2E4;&#xC81C; string &#xBC84;&#xD37C;&#xC5D0;&#xCD94;&#xAC00; &#xB0B4;&#xC6A9;&#xC744; &#xB123;&#xC744; &#xB54C; egptr &#xAC12;&#xC744; &#xBC14;&#xB85C; &#xBC14;&#xAFB8;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2C8;&#xB77C;, egptr&#xC740; &#xC5EC;&#xC804;&#xD788; &#xAE38;&#xC774;&#xAC00; 10&#xC778; &#xC2DC;&#xC810;&#xC758; &#xAC12;&#xC73C;&#xB85C; &#xC720;&#xC9C0;&#xD558;&#xACE0; &#xC788;&#xB2E4;&#xAC00; &#xD544;&#xC694;&#xD560; &#xB54C; &#xD655;&#xC778;&#xD558;&#xC5EC; &#xBCF8;&#xB798; &#xAC12;&#xC73C;&#xB85C; &#xB9DE;&#xCDB0; &#xC8FC;&#xB294; &#xC791;&#xC5C5;&#xC744; &#xD558;&#xB294; &#xAC83;&#xC774;&#xB2E4;.</p><h1 id="std-istream-and-std-ostream">std::istream and std::ostream</h1><p>std::stringstream&#xC740; std::string&#xC744; std::streambuf&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xBD80;&#xBD84;&#xC5D0; &#xB300;&#xD55C; &#xCD94;&#xAC00;&#xC801;&#xC778; &#xB85C;&#xC9C1;&#xC744; &#xB2F4;&#xB2F9;&#xD558;&#xACE0; &#xC2E4;&#xC81C;&#xB85C; &#xC785;&#xCD9C;&#xB825;&#xC744; &#xC0AC;&#xC6A9;&#xD560; &#xB54C; &#xD638;&#xCD9C;&#xD558;&#xB294; &#xD568;&#xC218; operator&lt;&lt;&#xC640; operator&gt;&gt;&#xB294; &#xAC01;&#xAC01; std::basic_ostream&#xACFC; std::basic_istream&#xC5D0; &#xC120;&#xC5B8; &#xBC0F; &#xC815;&#xC758;&#xB418;&#xC5B4; &#xC788;&#xB2E4;. &#xC5EC;&#xB7EC;&#xAC00;&#xC9C0; &#xC5D0;&#xB7EC; &#xCC98;&#xB9AC;&#xB098; &#xB3D9;&#xAE30;&#xD654; &#xB4F1;&#xC744; &#xC704;&#xD55C; &#xCD94;&#xAC00; &#xD568;&#xC218;&#xAC00; &#xB9CE;&#xC740;&#xB370;, &#xBA3C;&#xC800; ostream&#xC5D0; &#xBB38;&#xC790;&#xC5F4;&#xC744; &#xCD9C;&#xB825;&#xD558;&#xB294; &#xD568;&#xC218;&#xB97C; &#xBCF4;&#xC790;.</p><!--kg-card-begin: html--><pre><code id="ostream-operator-from-git" class="language-cpp"> </code></pre>
<script>
const ostream_operator = async () => {
  const url = 'https://raw.githubusercontent.com/gcc-mirror/gcc/releases/gcc-11.1.0/libstdc++-v3/include/std/ostream';
  const res = await fetch(url);
  const data = await res.text();
  const el = document.querySelector("#ostream-operator-from-git");
  if(el) {
    const split_data = data.split('\n');
    el.innerHTML = hljs.highlightAuto(split_data[586].substr(2) + '\n' + split_data.slice(587, 597).map(x => x.replace(/\t/g, "        ")).map(x => x.substr(x[0] === '#' ? 2 : 4)).join('\n')).value;
  }
};
ostream_operator();
</script>
<!--kg-card-end: html--><p> <code>__ostream_insert</code> &#xB294; bits/ostream_insert.h&#xC5D0; &#xC815;&#xC758;&#xB418;&#xC5B4; &#xC788;&#xACE0; &#xB0B4;&#xC6A9;&#xC740; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><!--kg-card-begin: html--><pre><code id="ostream-insert-from-git" class="language-cpp"> </code></pre>

<script>    
const ostream_insert = async () => {
  const url = 'https://raw.githubusercontent.com/gcc-mirror/gcc/releases/gcc-11.1.0/libstdc++-v3/include/bits/ostream_insert.h';
  const res = await fetch(url);
  const data = await res.text();
  const el = document.querySelector("#ostream-insert-from-git");
  if(el) {
    const split_data = data.split('\n');
    el.innerHTML = hljs.highlight(
      split_data[74].substr(2) +
      '\n' +
      split_data.slice(75, 113)
        .map(x => x.replace(/\t/g, "        "))
        .map(x => x.substr(x[0] === '#' ? 2 : 4))
        .join('\n'),
      {language: 'cxx'}
    ).value;
  }
};
ostream_insert();
</script><!--kg-card-end: html--><p> &#xC5EC;&#xB7EC; &#xC5D0;&#xB7EC; &#xCF00;&#xC774;&#xC2A4;&#xB97C; &#xCC98;&#xB9AC;&#xD558;&#xB294; &#xCF54;&#xB4DC;&#xB97C; &#xC81C;&#xC678;&#xD558;&#xBA74; &#xC2E4;&#xC878; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xD568;&#xC218;&#xB294; <code>__ostream_write</code> &#xC774;&#xACE0;, &#xD574;&#xB2F9; &#xD568;&#xC218;&#xB294; &#xB2E8;&#xC21C;&#xD788; <code>rdbuf()-&gt;sputn(str, legnth)</code> &#xB97C; &#xD638;&#xCD9C;&#xD560; &#xBFD0;&#xC774;&#xB2E4;. &#xD574;&#xB2F9; &#xD568;&#xC218;&#xB294; <a href="https://en.cppreference.com/w/cpp/io/basic_streambuf/sputn?ref=elenesgu.dev">basic_streambuf</a>&#xC5D0; &#xC815;&#xC758;&#xB418;&#xC5B4; &#xC788;&#xACE0;, xputn&#xC5D0; &#xB300;&#xD55C; NVI(non-virtual interface)&#xC774;&#xB2E4;. basic_streambuf&#xB294; xputn&#xC744; &#xB530;&#xB85C; &#xAD6C;&#xD604;&#xD558;&#xC9C0; &#xC54A;&#xC558;&#xC73C;&#xBBC0;&#xB85C; basic_streambuf&#xC758; xputn&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><!--kg-card-begin: html--><pre><code id="streambuf-xputn-from-git" class="language-cpp"> </code></pre>

<script>    
const streeambuf_xputn = async () => {
  const url = 'https://raw.githubusercontent.com/gcc-mirror/gcc/releases/gcc-11.1.0/libstdc++-v3/include/bits/streambuf.tcc';
  const res = await fetch(url);
  const data = await res.text();
  const el = document.querySelector("#streambuf-xputn-from-git");
  if(el) {
    const split_data = data.split('\n');
    el.innerHTML = hljs.highlightAuto(
      split_data[76].substr(2) +
      '\n' +
      split_data.slice(77, 109)
        .map(x => x.replace(/\t/g, "        "))
        .map(x => x.substr(x[0] === '#' ? 2 : 4))
        .join('\n')
    ).value;
  }
};
streeambuf_xputn();
</script><!--kg-card-end: html--><p> &#xC5EC;&#xAE30;&#xC11C; &#xBD80;&#xD130;&#xB294; &#xC704;&#xC5D0;&#xC11C; &#xB2E4;&#xB8E8;&#xC5C8;&#xB358; &#xAC1C;&#xB150;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xCD9C;&#xB825;&#xC744; &#xCC98;&#xB9AC;&#xD55C;&#xB2E4;. epptr&#xACFC; pptr&#xC744; &#xD1B5;&#xD574; &#xB0A8;&#xC544;&#xC788;&#xB294; &#xBC84;&#xD37C;&#xC758; &#xC601;&#xC5ED;&#xC744; &#xD655;&#xC778;&#xD558;&#xACE0;, &#xBC84;&#xD37C;&#xC758; &#xC601;&#xC5ED;&#xC5D0; &#xAC00;&#xB2A5;&#xD55C; &#xB9CC;&#xD07C; &#xCD9C;&#xB825;&#xD55C;&#xB2E4;. &#xADF8; &#xD6C4; &#xC591;&#xC774; &#xB0A8;&#xC544;&#xC788;&#xB2E4;&#xBA74; overflow&#xD568;&#xC218;&#xB97C; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;. &#xB354;&#xC774;&#xC0C1; &#xCD9C;&#xB825;&#xD560; &#xC218; &#xC5C6;&#xB2E4;&#xBA74; &#xCD9C;&#xB825;&#xD55C; &#xB9CC;&#xD07C;&#xC758; &#xAE38;&#xC774;&#xB97C; &#xBC18;&#xD658;&#xD558;&#xACE0;, &#xADF8; &#xC704;&#xC758; &#xD568;&#xC218;&#xC5D0;&#xC11C; badbit &#xC124;&#xC815;&#xD558;&#xB294; &#xB4F1; &#xCD9C;&#xB825;&#xC5D0; &#xC2E4;&#xD328;&#xD55C; &#xACBD;&#xC6B0;&#xC5D0; &#xB300;&#xD574; &#xCC98;&#xB9AC;&#xD55C;&#xB2E4;.</p><p> &#xBC84;&#xD37C;&#xB85C; &#xBD80;&#xD130; &#xBB38;&#xC790;&#xC5F4;&#xC744; &#xC785;&#xB825;&#xBC1B;&#xB294; &#xACBD;&#xC6B0;&#xB294; &#xC57D;&#xAC04; &#xB354; &#xBCF5;&#xC7A1;&#xD558;&#xB2C8; &#xCF54;&#xB4DC;&#xB294; &#xC0DD;&#xB7B5;&#xD558;&#xACE0; &#xD575;&#xC2EC;&#xC774; &#xB418;&#xB294; &#xD568;&#xC218;&#xB9CC; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;. &#xC2E4;&#xC81C;&#xB85C; &#xC785;&#xB825;&#xC744; &#xC5BB;&#xC5B4;&#xC624;&#xB294; &#xD568;&#xC218;&#xB294; <a href="https://en.cppreference.com/w/cpp/io/basic_streambuf/snextc?ref=elenesgu.dev">snextc</a> &#xC774;&#xB2E4;. &#xA0;snextc&#xB294; &#xC5EC;&#xB7EC;&#xAC00;&#xC9C0; &#xACBD;&#xC6B0;&#xC5D0; &#xB530;&#xB77C; &#xC791;&#xB3D9;&#xD55C;&#xB2E4;. &#xBA3C;&#xC800; sbumpc&#xC758; &#xBC18;&#xD658;&#xAC12;&#xC774; EOF&#xAC00; &#xC544;&#xB2D0; &#xACBD;&#xC6B0; <a href="https://en.cppreference.com/w/cpp/io/basic_streambuf/sgetc?ref=elenesgu.dev">sgetc</a>&#xB97C; &#xD638;&#xCD9C;&#xD55C;&#xB2E4;. sgetc &#xD568;&#xC218;&#xB294; gptr&#xC774; egptr&#xBCF4;&#xB2E4; &#xC791;&#xB2E4;&#xBA74; get area&#xC5D0; &#xB354; &#xC77D;&#xC744; &#xB0B4;&#xC6A9;&#xC774; &#xB0A8;&#xC544; &#xC788;&#xB2E4;&#xB294; &#xB73B;&#xC774;&#xBBC0;&#xB85C; gptr&#xC744; &#xC811;&#xADFC;&#xD558;&#xC5EC; &#xADF8; &#xAC12;&#xC744; &#xBC18;&#xD658;&#xD55C;&#xB2E4;. &#xB9CC;&#xC57D; &#xC544;&#xB2C8;&#xB77C;&#xBA74; &#xC704;&#xC5D0;&#xC11C; &#xC124;&#xBA85;&#xD55C; underflow&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xACE0; &#xADF8; &#xAC12;&#xC744; &#xBC18;&#xD658;&#xD55C;&#xB2E4;. <a href="https://en.cppreference.com/w/cpp/io/basic_streambuf/sbumpc?ref=elenesgu.dev">sbumpc</a>&#xB294; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; gptr&#xC774; egptr&#xBCF4;&#xB2E4; &#xC791;&#xB2E4;&#xBA74; gptr&#xB97C; &#xC77D;&#xACE0; &#xADF8; &#xAC12;&#xC744; &#xBC18;&#xD658;&#xD558;&#xACE0;, <a href="https://en.cppreference.com/w/cpp/io/basic_streambuf/gbump?ref=elenesgu.dev">gbump</a>&#xB97C; &#xD1B5;&#xD574; gptr&#xAC12;&#xC744; 1&#xB9CC;&#xD07C; &#xC99D;&#xAC00;&#xC2DC;&#xD0A8;&#xB2E4;. &#xB9CC;&#xC57D; &#xC544;&#xB2C8;&#xB77C;&#xBA74; uflow &#xD568;&#xC218;&#xB97C; &#xD638;&#xCD9C;&#xD55C;&#xB2E4;. <a href="https://en.cppreference.com/w/cpp/io/basic_streambuf/uflow?ref=elenesgu.dev">uflow</a>&#xD568;&#xC218;&#xB294; underflow&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xC5EC; &#xADF8; &#xAC12;&#xC774; EOF&#xAC00; &#xC544;&#xB2C8;&#xB77C;&#xBA74; gptr&#xC5D0;&#xC11C; &#xAC12;&#xC744; &#xC77D;&#xACE0; &#xBC18;&#xD658;&#xD55C; &#xB4A4; gptr&#xAC12;&#xC744; 1&#xB9CC;&#xD07C; &#xC99D;&#xAC00;&#xC2DC;&#xD0A8;&#xB2E4;. &#xC704; &#xD568;&#xC218;&#xB4E4;&#xC774; &#xBE44;&#xC2B7;&#xD558;&#xB2E4;&#xB294; &#xC0AC;&#xC2E4;&#xC744; &#xC54C;&#xC544; &#xCC28;&#xB838;&#xC744; &#xAC83;&#xC774;&#xB2E4;. uflow&#xB294; underflow&#xB97C; &#xD638;&#xCD9C;&#xD55C; &#xB4A4; gptr&#xC744; &#xC99D;&#xAC00;&#xC2DC;&#xD0A4;&#xB294; &#xCC28;&#xC774;&#xAC00; &#xC788;&#xACE0;, sbumpc&#xB294; sgetc&#xC640; &#xB2EC;&#xB9AC; gptr&#xC744; &#xC811;&#xADFC; &#xD55C; &#xB4A4; gptr &#xAC12;&#xC744; &#xC99D;&#xAC00;&#xC2DC;&#xD0A4;&#xB294; &#xCC28;&#xC774;&#xAC00; &#xC5ED;&#xC2DC; &#xC874;&#xC7AC;&#xD55C;&#xB2E4;.</p><p>&#xC2E4;&#xC81C;&#xB85C; stream&#xB4E4;&#xC740; &#xB2E8;&#xC21C;&#xD788; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC77D;&#xACE0; &#xCD9C;&#xB825;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2C8;&#xB77C; &#xD3EC;&#xB9F7;&#xC5D0; &#xB9DE;&#xCDB0; &#xCD9C;&#xB825;&#xC744; &#xD558;&#xAC70;&#xB098; &#xBB38;&#xC790;&#xC5F4;&#xC774; &#xC544;&#xB2CC; &#xC815;&#xC218; &#xB4F1;&#xC744; &#xCD9C;&#xB825;&#xD558;&#xB294; &#xC5ED;&#xD560;&#xB3C4; &#xD55C;&#xB2E4;. &#xADFC;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xD574;&#xB2F9; &#xAE30;&#xB2A5;&#xB4E4;&#xC740; &#xAC00;&#xC7A5; &#xAE30;&#xBCF8;&#xC801;&#xC778; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC77D;&#xACE0; &#xC4F0;&#xB294; &#xACFC;&#xC815;&#xC744; &#xD3EC;&#xD568;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xC0C1;&#xC0C1;&#xD558;&#xB294; &#xACFC;&#xC815;&#xB4E4;&#xC774; &#xC788;&#xC744; &#xAC83;&#xC774;&#xB77C; &#xCD94;&#xCE21;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xC704;&#xC5D0;&#xC11C; &#xCF54;&#xB4DC;&#xB97C; &#xBCF4;&#xC5EC;&#xC8FC;&#xC9C0; &#xC54A;&#xACE0; &#xB118;&#xC5B4;&#xAC04; &#xBC84;&#xD37C;&#xB85C; &#xBD80;&#xD130;&#xBB38;&#xC790;&#xC5F4;&#xC744; &#xC785;&#xB825;&#xBC1B;&#xB294; &#xACBD;&#xC6B0;&#xB97C; &#xC608;&#xC2DC;&#xB85C; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74;, <a href="https://en.cppreference.com/w/cpp/io/basic_ios/tie?ref=elenesgu.dev">&#xB3D9;&#xAE30;&#xD654;&#xC5D0; &#xAD00;&#xB828;&#xB41C; &#xCF54;&#xB4DC;</a>&#xB098; <a href="https://en.cppreference.com/w/cpp/io/ios_base/width?ref=elenesgu.dev">width</a>&#xC5D0; &#xAD00;&#xD55C; &#xCF54;&#xB4DC; &#xB4F1;&#xC774; &#xC788;&#xB2E4;. <a href="https://en.cppreference.com/w/cpp/locale?ref=elenesgu.dev">locale</a> &#xAE30;&#xB2A5;&#xC758; <a href="https://en.cppreference.com/w/cpp/locale/num_get?ref=elenesgu.dev">std::num_get</a> &#xAC19;&#xC740; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xC0B4;&#xD3B4;&#xBD10;&#xB3C4; &#xC88B;&#xB2E4;. &#xC2E4;&#xC81C;&#xB85C; stream&#xC758; &#xBAA8;&#xB4E0; &#xBB38;&#xC790;&#xC5F4; &#xCC98;&#xB9AC;&#xB97C; locale&#xC744; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xD558;&#xACE0; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC774;&#xB97C; &#xC0AC;&#xC2E4; &#xC9C0;&#xB098;&#xCE60; &#xC218; &#xC5C6;&#xB2E4;.</p><h1 id="-">&#xACB0;&#xB860;</h1><p>&#xC774; &#xAE00;&#xC5D0;&#xC11C; C++&#xC758; &#xAE30;&#xBCF8; &#xC785;&#xCD9C;&#xB825; &#xCEE8;&#xC149;&#xC778; stream&#xC5D0;&#xC11C; &#xC5B4;&#xB5BB;&#xAC8C; &#xC2E4;&#xC81C;&#xB85C; &#xB370;&#xC774;&#xD130; &#xAC12;&#xC744; &#xC77D;&#xACE0; &#xC4F0;&#xB294;&#xC9C0; &#xC0B4;&#xD3B4;&#xBCF4;&#xC558;&#xB2E4;. <a href="https://www.boost.org/doc/libs/1_76_0/libs/iostreams/doc/index.html?ref=elenesgu.dev">boost&#xC758; iostreams</a> &#xC5ED;&#xC2DC; overflow&#xC640; underflow&#xB97C; &#xD3EC;&#xD568;&#xD55C; &#xB0B4;&#xC6A9;&#xC744; &#xAD6C;&#xD604;&#xD558;&#xC5EC; std::iostream&#xC758; &#xD14C;&#xB450;&#xB9AC; &#xC548;&#xC5D0;&#xC11C; &#xC791;&#xB3D9;&#xD558;&#xACE0; &#xC788;&#xB2E4;. boost&#xB294; &#xB354; &#xB098;&#xC544;&#xAC00; &#xCEE8;&#xC149;&#xC744; &#xC0C8;&#xB85C; &#xB9CC;&#xB4E4;&#xC5B4; &#xADF8; &#xCEE8;&#xC149;&#xC744; &#xC0AC;&#xC6A9;&#xD55C; adpater&#xB97C; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xCEE4;&#xC2A4;&#xD140;&#xD55C; streambuf&#xAC00; &#xAD6C;&#xD604;&#xB418;&#xC5B4; &#xC788;&#xB2E4;. &#xC774; &#xAC1C;&#xB150;&#xB4E4;&#xC744; &#xD65C;&#xC6A9;&#xD558;&#xC5EC; &#xCEE4;&#xC2A4;&#xD140;&#xD55C; streambuf&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xB098;&#xB9CC;&#xC758; &#xC785;&#xCD9C;&#xB825; &#xCC98;&#xB9AC; &#xBC29;&#xBC95;&#xC744; &#xAD6C;&#xD604;&#xD560; &#xC218; &#xC788;&#xC744; &#xAC83;&#xC774;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[A. Korotkov's New R-Tree Splitting Algorithm]]></title><description><![CDATA[<p>&#xACF5;&#xAC04; &#xB370;&#xC774;&#xD130;(spatial data) &#xCC98;&#xB9AC;&#xB294; &#xD604;&#xB300; &#xB370;&#xC774;&#xD130;&#xBCA0;&#xC774;&#xC2A4;&#xC5D0;&#xC11C; &#xC911;&#xC694;&#xD55C; &#xC791;&#xC5C5; &#xC911; &#xD558;&#xB098;&#xC774;&#xB2E4;. &#xACF5;&#xAC04; &#xB370;&#xC774;&#xD130;&#xB97C; &#xD6A8;&#xC728;&#xC801;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xD558;&#xAE30; &#xC704;&#xD574; &#xAE30;&#xD0C0; &#xB2E4;</p>]]></description><link>https://elenesgu.dev/a-korotkovs-new-r-tree-splitting-algorithm/</link><guid isPermaLink="false">5fd02eb1ed1dc800014bebf1</guid><category><![CDATA[gis]]></category><dc:creator><![CDATA[Seungmin Lee]]></dc:creator><pubDate>Fri, 18 Dec 2020 08:01:35 GMT</pubDate><content:encoded><![CDATA[<p>&#xACF5;&#xAC04; &#xB370;&#xC774;&#xD130;(spatial data) &#xCC98;&#xB9AC;&#xB294; &#xD604;&#xB300; &#xB370;&#xC774;&#xD130;&#xBCA0;&#xC774;&#xC2A4;&#xC5D0;&#xC11C; &#xC911;&#xC694;&#xD55C; &#xC791;&#xC5C5; &#xC911; &#xD558;&#xB098;&#xC774;&#xB2E4;. &#xACF5;&#xAC04; &#xB370;&#xC774;&#xD130;&#xB97C; &#xD6A8;&#xC728;&#xC801;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xD558;&#xAE30; &#xC704;&#xD574; &#xAE30;&#xD0C0; &#xB2E4;&#xB978; &#xC815;&#xBCF4;&#xD615;&#xACFC; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; &#xC778;&#xB371;&#xC2A4; &#xAD6C;&#xC870;&#xB97C; &#xC720;&#xC9C0;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xB2E4;&#xCC28;&#xC6D0;&#xC801;&#xC774;&#xACE0; &#xAD6C;&#xAC04;(interval)&#xC744; &#xB098;&#xD0C0;&#xB0B4;&#xB294; &#xD2B9;&#xC131; &#xC0C1; &#xAE30;&#xC874;&#xC758; B-Tree &#xB4F1;&#xC758; &#xD0D0;&#xC0C9; &#xAD6C;&#xC870;&#xB85C;&#xB294; &#xD6A8;&#xC728;&#xC801;&#xC778; &#xACF5;&#xAC04; &#xB370;&#xC774;&#xD130;&#xC758; &#xC0C9;&#xC778;&#xC774; &#xC27D;&#xC9C0; &#xC54A;&#xB2E4;. &#xB530;&#xB77C;&#xC11C;, &#xAC01; &#xACF5;&#xAC04; &#xB370;&#xC774;&#xD130;&#xC758; &#xAC1D;&#xCCB4;(geometry&#xB77C;&#xACE0; &#xBD80;&#xB974;&#xAE30;&#xB3C4; &#xD55C;&#xB2E4;.)&#xB97C; &#xC5B4;&#xB290; &#xC815;&#xB3C4; &#xAC04;&#xB7B5;&#xD558;&#xAC8C; &#xD45C;&#xD604;&#xD558;&#xC5EC; &#xC778;&#xB371;&#xC2A4; &#xAD6C;&#xC870;&#xB97C; &#xC0DD;&#xC131;&#xD55C;&#xB2E4;. &#xAC00;&#xC7A5; &#xB300;&#xD45C;&#xC801;&#xC778; &#xAD6C;&#xC870;&#xAC00; <a href="https://ko.wikipedia.org/wiki/R_%ED%8A%B8%EB%A6%AC?ref=elenesgu.dev">R-Tree</a>&#xC774;&#xB2E4;. R-Tree&#xB294; geometry&#xB97C; MBR&#xC774;&#xB77C;&#xACE0; &#xBD88;&#xB9AC;&#xB294; &#xAD6C;&#xC870;&#xB85C; &#xAC04;&#xB7B5;&#xD558;&#xAC8C; &#xD45C;&#xD604;&#xD558;&#xC5EC; &#xC774;&#xB97C; &#xC0C9;&#xC778;&#xC5D0; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;.<a href="#cite-1"><sup>[1]</sup></a></p><p>MBR(Minimum Bounding Rectangle)&#xC740; geometry &#xC815;&#xBCF4;&#xB97C; &#xAC04;&#xB7B5;&#xD558;&#xAC8C; &#xD45C;&#xD604;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xBC29;&#xBC95; &#xC911; &#xD558;&#xB098;&#xC774;&#xB2E4;. &#xC5B4;&#xB5A4; geoemtry&#xC758; MBR&#xC740; &#xAC01; &#xCC28;&#xC6D0; &#xBCC4; geometry&#xC5D0; &#xC18D;&#xD55C; &#xC88C;&#xD45C;&#xB4E4;&#xC758; &#xCD5C;&#xC19F;&#xAC12;(min)&#xACFC; &#xCD5C;&#xB313;&#xAC12;(max) &#xC815;&#xBCF4;&#xB97C; &#xC720;&#xC9C0;&#xD558;&#xAC8C; &#xB418;&#xBBC0;&#xB85C;, n&#xCC28;&#xC6D0; geometry&#xC758; &#xACBD;&#xC6B0; 2 * n&#xAC1C;&#xC758; &#xC815;&#xBCF4;&#xB97C; &#xC720;&#xC9C0;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;. &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; 2&#xCC28;&#xC6D0;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xAC00; &#xB9CE;&#xC73C;&#xBBC0;&#xB85C; 2&#xCC28;&#xC6D0; MBR&#xC744; &#xC544;&#xB798; &#xAE00;&#xC5D0;&#xC11C; &#xC11C;&#xC220;&#xD560; &#xB54C; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;. &#xC784;&#xC758;&#xC758; 2&#xCC28;&#xC6D0; MBR \( m \) &#xC5D0; &#xB300;&#xD574; &#xCD5C;&#xC19F;&#xAC12;&#xACFC; &#xCD5C;&#xB313;&#xAC12; &#xC815;&#xBCF4;&#xB97C; &#xB098;&#xD0C0;&#xB0BC; &#xB54C; \( m = \{m^x_{min}, m^x_{max}, m^y_{min}, m^y_{max}\} \)&#xC640; &#xAC19;&#xC740; &#xAE30;&#xD638;&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xAC83;&#xC774;&#xB2E4;.</p><p>R-Tree&#xC758; leaf node&#xB294; &#xBCF5;&#xC218;&#xC758; &#xC5B4;&#xB5A4; geometry&#xC758; MBR&#xACFC; &#xC8FC;&#xC18C; (&#xB610;&#xB294; &#xAC1C;&#xCCB4;&#xC758; ref &#xAC12;)&#xB97C; &#xAC16;&#xB294;&#xB2E4;. Branch node&#xB294; &#xB2E4;&#xB978; &#xD2B8;&#xB9AC; &#xAD6C;&#xC870;&#xCC98;&#xB7FC; &#xC5EC;&#xB7EC; children node&#xB4E4;&#xC744; &#xC720;&#xC9C0;&#xD558;&#xACE0; &#xC788;&#xB2E4;. &#xC774; &#xB54C; &#xD55C; child node&#xB97C; &#xB098;&#xD0C0;&#xB0B4;&#xAE30; &#xC704;&#xD574; leaf node&#xCC98;&#xB7FC; &#xADF8; child node&#xC758; MBR &#xAC12;&#xACFC; &#xC8FC;&#xC18C;&#xB97C; &#xAC16;&#xB294;&#xB2E4;. &#xD55C; node&#xC758; MBR&#xC774;&#xB780; &#xADF8; node (&#xC640; &#xADF8; &#xC774;&#xD558;&#xC758; subtree)&#xAC00; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB294; &#xBAA8;&#xB4E0; &#xAC1D;&#xCCB4;&#xB4E4;&#xC758; MBR&#xC744; &#xC758;&#xBBF8;&#xD55C;&#xB2E4;.</p><p>R-Tree&#xB294; &#xB192;&#xC774; &#xADE0;&#xD615;(height balanced) &#xD2B8;&#xB9AC;&#xC774;&#xBBC0;&#xB85C; &#xC0BD;&#xC785; &#xB3C4;&#xC911;&#xC5D0;&#xC11C; &#xC5B4;&#xB5A4; &#xB178;&#xB4DC;&#xC758; &#xBD84;&#xD560;(split)&#xC774; &#xC77C;&#xC5B4;&#xB0A0; &#xC218; &#xC788;&#xB2E4;. R-Tree &#xD0D0;&#xC0C9;&#xC740; B-Tree&#xC640; &#xB2EC;&#xB9AC; multipath&#xB85C; &#xC774;&#xB8E8;&#xC5B4;&#xC9C0;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xB178;&#xB4DC;&#xC758; &#xBD84;&#xD560;&#xC774; &#xD6A8;&#xC728;&#xC801;&#xC774;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;&#xBA74; &#xD0D0;&#xC0C9; &#xC18D;&#xB3C4;&#xC758; &#xACB0;&#xACFC;&#xAC00; &#xC88B;&#xC9C0; &#xC54A;&#xC744; &#xAC83;&#xC774;&#xB77C;&#xACE0; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; &#xC5EC;&#xB7EC; node splitting &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC774; &#xC81C;&#xC548;&#xB418;&#xC5C8;&#xACE0;, <sup><a href="#cite-2">[2]</a></sup> <sup><a href="#cite-3">[3]</a></sup> <sup><a href="#cite-4">[4]</a></sup> &#xBCF8; &#xAE00;&#xC5D0;&#xC11C;&#xB294; &#xCD5C;&#xADFC; A. Korotkov&#xAC00; &#xC81C;&#xC2DC;&#xD55C; &#xC0C8;&#xB85C;&#xC6B4; splitting &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xC81C;&#xC2DC;&#xD55C;&#xB2E4;. <sup><a href="#cite-5">[5]</a></sup> &#xD574;&#xB2F9; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC740; &#xD604;&#xC7AC; PostGIS&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xB294; &#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC774;&#xB2E4;.</p><h1 id="-">&#xC54C;&#xACE0;&#xB9AC;&#xC998; &#xC18C;&#xAC1C;</h1><p>R-Tree node splitting &#xBB38;&#xC81C;&#xB97C; &#xB2E4;&#xB974;&#xAC8C; &#xC11C;&#xC220;&#xD558;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;. MBR&#xC758; &#xC9D1;&#xD569; I&#xAC00; &#xC8FC;&#xC5B4;&#xC9C8; &#xB54C;, I&#xC758; &#xBAA8;&#xB4E0; &#xC6D0;&#xC18C;&#xB97C; &#xB450; &#xC9D1;&#xD569; \( S_1 \) &#xC640; \( S_2 \) &#xB85C; &#xB098;&#xB204;&#xB294; &#xBB38;&#xC81C;&#xC774;&#xB2E4;. &#xC77C;&#xBD80; R-Tree variant &#xC911;&#xC5D0; &#xD55C; MBR&#xC774; &#xC11C;&#xB85C; &#xB2E4;&#xB978; &#xB450; &#xAC1C;&#xC758; node&#xC5D0; &#xC18D;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xB3C4; &#xC788;&#xC73C;&#xB098;, A. Korotkov&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC5D0;&#xC11C;&#xB294; &#xD5C8;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xBBC0;&#xB85C;, \( S_1 \)&#xC640; \( S_2 \) &#xB294; &#xC0C1;&#xD638; &#xBC30;&#xD0C0;&#xC801;&#xC774;&#xB2E4;.</p><p>&#xC774; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC740; &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; 1&#xCC28;&#xC6D0; &#xAD6C;&#xAC04;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xB3D9;&#xC791;&#xD558;&#xC9C0;&#xB9CC;, &#xB2E4;&#xCC28;&#xC6D0;&#xC77C; &#xACBD;&#xC6B0; &#xAC01; &#xCC28;&#xC6D0;&#xBCC4;&#xB85C; projection&#xC744; &#xC218;&#xD589;&#xD55C; &#xB4A4; &#xB3D9;&#xC77C;&#xD55C; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xC218;&#xD589;&#xD568;&#xC73C;&#xB85C;&#xC368; &#xB2E4;&#xCC28;&#xC6D0; MBR &#xBD84;&#xD560;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;. 2&#xCC28;&#xC6D0;&#xC758; MBR&#xC774; &#xD754;&#xD788; &#xC0AC;&#xC6A9;&#xB418;&#xBBC0;&#xB85C; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xC11C;&#xC220;&#xD560; &#xB54C; 2&#xCC28;&#xC6D0;&#xC744; &#xAC00;&#xC815;&#xD55C;&#xB2E4;. &#xB610;&#xD55C; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC758; &#xC785;&#xB825;&#xC778; MBR&#xC758; &#xC9D1;&#xD569; I&#xC758; &#xD06C;&#xAE30;&#xB294; n&#xC774;&#xB77C;&#xACE0; &#xD558;&#xC790;; \( (|I| = n). \) 2&#xCC28;&#xC6D0; MBR&#xC744; x&#xCD95;&#xC73C;&#xB85C; projection &#xD558;&#xAC8C; &#xB418;&#xBA74;, \( (x_{min}, x_{max}) \) &#xC640; &#xAC19;&#xC740; &#xAD6C;&#xAC04;&#xC73C;&#xB85C; &#xD45C;&#xD604;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC758; &#xAC00;&#xC7A5; &#xCCAB;&#xBC88;&#xC9F8; &#xACFC;&#xC815;&#xC740; \( x_{min} \) &#xD55C;&#xBC88; &#xC815;&#xB82C;&#xC744; &#xD558;&#xACE0; \( x_{max} \)&#xB85C;&#xB3C4; &#xD55C;&#xBC88; &#xC815;&#xB82C;&#xC744; &#xD558;&#xB294; &#xAC83;&#xC774;&#xB2E4;. \( x_{min} \)&#xC73C;&#xB85C; &#xC815;&#xB82C;&#xD55C; MBR &#xC21C;&#xC11C;&#xB97C; \( L=\{l_1, l_2, \cdots , l_n \} \)&#xC774;&#xB77C; &#xD558;&#xACE0;, \( x_{max} \)&#xB85C; &#xC815;&#xB82C;&#xD55C; MBR &#xC21C;&#xC11C;&#xB97C; \( U=\{u_1, u_2, \cdots , u_n \} \) &#xB77C;&#xACE0; &#xD558;&#xC790;. &#xBB3C;&#xB860; &#xAC01;&#xAC01;&#xC758; \( l_k \) &#xC640; \( u_k \) &#xB294; 1&#xCC28;&#xC6D0; interval&#xC774;&#xBBC0;&#xB85C;, min&#xACFC; max&#xB85C; &#xB098;&#xD0C0;&#xB0BC; &#xC218; &#xC788;&#xB294; &#xB450; &#xC218;&#xC758; &#xC30D;&#xC73C;&#xB85C; &#xD45C;&#xD604;&#xB41C;&#xB2E4;; \( ( 1 \ge k \land k \ge n ) \).</p><p>&#xC774; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC758; &#xC785;&#xB825;&#xC740; 1&#xCC28;&#xC6D0; &#xAD6C;&#xAC04;&#xC774;&#xBBC0;&#xB85C; &#xCD9C;&#xB825;&#xC740; 2&#xAC1C;&#xC758; &#xAD6C;&#xAC04;&#xC774;&#xB77C;&#xACE0; &#xAC00;&#xC815;&#xD574;&#xB3C4; &#xBB34;&#xBC29;&#xD558;&#xB2E4;. (&#xAC01; &#xC6D0;&#xC18C;&#xB97C; &#xC5B4;&#xB290; &#xAD6C;&#xAC04;&#xC5D0; &#xB123;&#xC744;&#xC9C0; &#xD655;&#xC778;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC740; &#xC26C;&#xC6B4; &#xC791;&#xC5C5;&#xC774;&#xB2E4;.) &#xC774; &#xC911;, &#xB458; &#xC911; &#xC801;&#xC5B4;&#xB3C4; 1&#xAC1C;&#xC758; &#xAD6C;&#xAC04;&#xC758; &#xCD5C;&#xC19F;&#xAC12;(min)&#xC740; &#xC785;&#xB825; &#xC9D1;&#xD569; \( I \) &#xC758; &#xBAA8;&#xB4E0; &#xAD6C;&#xAC04;&#xC758; &#xD558;&#xD55C;&#xC758; &#xCD5C;&#xC19F;&#xAC12;(minimum of lower bound; \( low_{min} = \min_{i \in I} i_{min} \) )&#xACFC; &#xC77C;&#xCE58;&#xD558;&#xACE0; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; &#xC801;&#xC5B4;&#xB3C4; 1&#xAC1C;&#xC758; &#xAD6C;&#xAC04;&#xC758; &#xCD5C;&#xB313;&#xAC12;(max)&#xC740; &#xC0C1;&#xD55C;&#xC758; &#xCD5C;&#xB313;&#xAC12;(maximum of upper bound; \( upp_{max} = \max_{i \in I} i_{max} \))&#xACFC; &#xC77C;&#xCE58;&#xD55C;&#xB2E4;&#xACE0; &#xD560; &#xC218; &#xC788;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC758; &#xACB0;&#xACFC;&#xB294; &#xAD6C;&#xAC04; 2&#xAC1C; \( (low_{min}, a) \)&#xC640; \( (b, upp_{max} ) \)&#xC774;&#xACE0;, &#xB2E4;&#xC2DC; &#xB9D0;&#xD558;&#xBA74; a&#xC640; b&#xB97C; &#xC815;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC774;&#xB77C;&#xACE0; &#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>\(a\)&#xC640; \(b\) &#xAC12;&#xC740; \(L\)&#xC640; \(U\)&#xB97C; &#xAC01;&#xAC01; &#xBC18;&#xBCF5;&#xD558;&#xC5EC; &#xCD1D; 2&#xBC88;&#xC758; &#xBC18;&#xBCF5;&#xBB38;&#xC744; &#xD1B5;&#xD574; &#xC5BB;&#xC5B4;&#xB0B8;&#xB2E4;. &#xBA3C;&#xC800; \(L\)&#xC744; &#xAE30;&#xC900;&#xC73C;&#xB85C; \(b\)&#xC758; &#xAC12;&#xC744; &#xC815;&#xD55C;&#xB2E4;. &#xC815;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC740; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;. &#xCCAB;&#xBC88;&#xC9F8; &#xBC18;&#xBCF5;&#xBB38;&#xC5D0;&#xC120; &#xAC01; iteration&#xB9C8;&#xB2E4; &#xC21C;&#xC11C; \(L\)&#xC758; &#xC6D0;&#xC18C;&#xB4E4;&#xC758; distinct \(min\)&#xAC12;&#xB4E4;&#xC774; \(b\)&#xAC00; &#xB41C;&#xB2E4;. &#xC774; &#xB54C; &#xB300;&#xC751;&#xD558;&#xB294; \( a \) &#xC758; &#xAC12;&#xC740; \( b \)&#xBCF4;&#xB2E4; &#xC791;&#xC740; \(min\)&#xC744; &#xAC16;&#xB294; \(L\)&#xC758; &#xC6D0;&#xC18C;&#xB4E4;&#xC758; \(max\) &#xAC12; &#xC911; &#xAC00;&#xC7A5; &#xD070; &#xAC12;&#xC774;&#xB2E4;.</p><p>\[ a &#xA0;:= \max_{i \in I : i_{min} &lt; b} i_{max} &#xA0;\]</p><p>&#xB610;&#xD55C; &#xC5EC;&#xAE30;&#xC5D0; &#xB367;&#xBD99;&#xC5EC; \( (low_{min}, a) \)&#xC5D0; &#xC18D;&#xD560; &#xC785;&#xB825; &#xAD6C;&#xAC04;&#xC758; &#xCD5C;&#xC18C; &#xAC1C;&#xC218; \( n_{min} \)&#xC640; &#xCD5C;&#xB300; &#xAC1C;&#xC218; \( n_{max} \)&#xB3C4; &#xC815;&#xD574;&#xC9C0;&#xB294;&#xB370; &#xC774;&#xB294; \(b\)&#xBCF4;&#xB2E4; &#xC791;&#xC740; min&#xB97C; &#xAC16;&#xB294; &#xC6D0;&#xC18C;&#xC758; &#xAC1C;&#xC218;&#xC640; \(a\)&#xBCF4;&#xB2E4; <strong>&#xC791;&#xAC70;&#xB098; &#xAC19;&#xC740;</strong> max&#xB97C; &#xAC16;&#xB294; &#xC6D0;&#xC18C;&#xC758; &#xAC1C;&#xC218;&#xB85C; &#xC815;&#xD574;&#xC9C4;&#xB2E4;. &#xC989;, &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><p>\[ n_{min} := \vert\{i \in I \mid i_{min} &lt; b \}\vert\]</p><p>\[ n_{max} &#xA0;:= \vert\{i \in I \mid i_{max} \le a \}\vert\]</p><p>&#xC774;&#xB97C; &#xB2E4;&#xC74C; &#xC608;&#xC81C;&#xC640; &#xD568;&#xAED8; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;. &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC758; &#xC785;&#xB825; I&#xAC00; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xC8FC;&#xC5B4;&#xC84C;&#xB2E4;&#xACE0; &#xD558;&#xC790;.</p><p>\[ I = \{ (1, 4) , (2, 3), (2, 5), (4, 7), (6, 8) , (6, 9), (7, 8) \} \]</p><p>&#xC815;&#xB82C;&#xC744; &#xD558;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;:</p><p>\[ L = \{ (1, 4), (2, 3), (2, 5), (4, 7), (6, 8), (6, 9), (7, 8) \} \]</p><p>\[ U = \{ (2, 3), (1, 4), (2, 5), (4, 7), (6, 8), (7, 8), (6, 9) \} \]</p><p>&#xCCAB; iteration&#xC5D0;&#xC11C;&#xB294; \( b = 1\)&#xC774;&#xC9C0;&#xB9CC; &#xC0C1;&#xC751;&#xD558;&#xB294; a&#xAC00; &#xC815;&#xC758;&#xB418;&#xC9C0; &#xC54A;&#xC73C;&#xBBC0;&#xB85C; &#xB2E4;&#xC74C; &#xAC12;&#xC778; 2&#xBD80;&#xD130; &#xC2DC;&#xC791;&#xD55C;&#xB2E4;. \(b = 2 \)&#xC77C; &#xACBD;&#xC6B0;, \( I \)&#xC758; &#xC9D1;&#xD569; &#xC911; min&#xC774; \(2\)&#xBCF4;&#xB2E4; &#xC791;&#xC740; &#xC6D0;&#xC18C;&#xB294; \( \{ (1, 4) \} \) &#xC774;&#xACE0; &#xC774; &#xC911; max&#xC758; &#xCD5C;&#xB313;&#xAC12;&#xC740; 4 &#xC774;&#xBBC0;&#xB85C; \(a = 4\)&#xAC00; &#xB41C;&#xB2E4;. \( n_{min} \) &#xC5ED;&#xC2DC; &#xC790;&#xC5F0;&#xC2A4;&#xB7FD;&#xAC8C; \( 1 \)&#xC774; &#xB41C;&#xB2E4;. &#xB2E4;&#xC2DC; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74; &#xC774;&#xBBF8; \( L \)&#xC774; min&#xC744; &#xAE30;&#xC900;&#xC73C;&#xB85C; &#xC815;&#xB82C; &#xB418;&#xC5B4;&#xC788;&#xACE0; iteration&#xC740; distinct min&#xC744; &#xAE30;&#xC900;&#xC73C;&#xB85C; &#xBC18;&#xBCF5;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; \( L \)&#xC744; &#xC21C;&#xC11C;&#xB300;&#xB85C; &#xBC18;&#xBCF5;&#xD558;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xCDA9;&#xBD84;&#xD558;&#xB2E4;. &#xB2E4;&#xC2DC; &#xCCAB; &#xBC88;&#xC9F8; iteration&#xC73C;&#xB85C; &#xB3CC;&#xC544;&#xC640;&#xC11C; &#xC815;&#xD574;&#xC9C0;&#xB294; &#xAC12;&#xC744; &#xBCF4;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;; \( a = 4, b = 2, n_{min} = 1, n_{max} = 2\). \(n_{max}\)&#xC758; &#xACBD;&#xC6B0; \( L \)&#xB9CC; &#xAC00;&#xC9C0;&#xACE0;&#xB294; &#xC27D;&#xAC8C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC5C6;&#xACE0;, \( U \) &#xB97C; &#xD1B5;&#xD574; \( a = 4 \)&#xBCF4;&#xB2E4; &#xC791;&#xAC70;&#xB098; &#xAC19;&#xC740; max&#xB97C; &#xAC16;&#xB294; &#xAD6C;&#xAC04;&#xC758; &#xAC1C;&#xC218;&#xB97C; &#xD30C;&#xC545;&#xD558;&#xBA74; &#xB41C;&#xB2E4;. &#xC774;&#xB807;&#xAC8C; &#xD55C; &#xC774;&#xD130;&#xB808;&#xC774;&#xC158;&#xC5D0;&#xC11C; &#xD6C4;&#xBCF4; &#xAD70;&#xC744; &#xCC3E;&#xC558;&#xC73C;&#xBA74; <a href="#considerSplit">considerSplit</a>&#xB77C;&#xB294; &#xC11C;&#xBE0C;&#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xD1B5;&#xD574; &#xC2E4;&#xC81C; split&#xC744; &#xC2DC;&#xB3C4;&#xD574;&#xBCF4;&#xAC8C; &#xB41C;&#xB2E4;. &#xD574;&#xB2F9; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC740; &#xBCC4;&#xB3C4; section&#xC5D0;&#xC11C; &#xC11C;&#xC220;&#xD55C;&#xB2E4;.</p><p>&#xB2E4;&#xC74C; iteration&#xBD80;&#xD130; &#xCC28;&#xB840;&#xB300;&#xB85C; a&#xC640; b&#xAC12;&#xC740; \( (a=5, b=4), (a=7, b=6), (a=9, b=7)\)&#xB85C; &#xC120;&#xD0DD;&#xD560; &#xAC83;&#xC774;&#xB2E4;. &#xC0C1;&#xC138;&#xD55C; &#xC608;&#xC2DC;&#xB97C; &#xD1B5;&#xD574; &#xBC14;&#xB85C; &#xB2E4;&#xC74C; iteration&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;. &#xC774;&#xC804; iteration&#xC5D0;&#xC11C; \( b= 2 \)&#xB85C; &#xC120;&#xD0DD;&#xD588;&#xC73C;&#xBBC0;&#xB85C; &#xB2E4;&#xC74C; distinct min &#xAC12;&#xC740; \( 4 \) &#xC774;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; \(b = 4\)&#xB85C; &#xC120;&#xD0DD;&#xD558;&#xACE0;, \(a\)&#xC758; &#xAC12;&#xC740; \( \{ (1,4), (2,3), (2,5) \} \) &#xC911; &#xAC00;&#xC7A5; &#xD070; max &#xAC12;&#xC778; \( 5 \)&#xB85C; &#xC124;&#xC815;&#xB41C;&#xB2E4;. &#xC790;&#xC5F0;&#xC2A4;&#xB7FD;&#xAC8C; \( n_{min} = 3, n_{max} = 3 \) &#xC73C;&#xB85C; &#xC815;&#xD574;&#xC9C4;&#xB2E4;. ( \(a = 5) \) &#xBCF4;&#xB2E4; &#xC791;&#xAC70;&#xB098; &#xAC19;&#xC740; max&#xB97C; &#xAC16;&#xB294; &#xC6D0;&#xC18C;&#xB4E4;&#xC740; \( \{ (2, 3), (1, 4), (2,5) \} \)&#xC774;&#xACE0; &#xAC1C;&#xC218;&#xB294; 3&#xAC1C;&#xC774;&#xB2E4;.) &#xC5ED;&#xC2DC; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; &#xAC01; iteration &#xB9C8;&#xB2E4; &#xCC3E;&#xC740; &#xD6C4;&#xBCF4; &#xAD70;&#xC5D0; &#xB300;&#xD574; <a href="#considerSplit">considerSplit</a>&#xB77C;&#xB294; &#xC11C;&#xBE0C; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xC218;&#xD589;&#xD55C;&#xB2E4;.</p><p>&#xB450; &#xBC88;&#xC9F8; &#xBC18;&#xBCF5;&#xC5D0;&#xC11C;&#xB294; \( a \)&#xAC12;&#xC744; distinct max &#xAC12;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC9C4;&#xD589;&#xD55C;&#xB2E4;. &#xCCAB; &#xBC18;&#xBCF5;&#xBB38;&#xC774; \( L \)&#xC704;&#xC5D0;&#xC11C; &#xBC18;&#xBCF5;&#xBB38;&#xC744; &#xC9C4;&#xD589;&#xD558;&#xBA70; \( b \)&#xAC12;&#xC744; &#xACB0;&#xC815;&#xD588;&#xB2E4;&#xBA74;, &#xC774;&#xD6C4;&#xB294; \( U \)&#xC704;&#xC5D0;&#xC11C; &#xB4A4;&#xC5D0;&#xC11C; &#xBC18;&#xBCF5;&#xBB38;&#xC744; &#xC9C4;&#xD589;&#xD558;&#xBA70; \( a \)&#xAC12;&#xC744; &#xACB0;&#xC815;&#xD558;&#xB294; &#xD615;&#xD0DC;&#xC774;&#xB2E4;. &#xBE44;&#xC2B7;&#xD558;&#xAC8C; &#xC774; &#xB54C; \( a \)&#xC5D0; &#xB300;&#xC751;&#xD558;&#xB294; \( b \)&#xC758; &#xAC12;&#xC740; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xC815;&#xC758;&#xB41C;&#xB2E4;. \( L \) &#xC6D0;&#xC18C; &#xC911; \(max\)&#xAC12;&#xC774; \( a \)&#xBCF4;&#xB2E4; &#xD070; &#xC6D0;&#xC18C;&#xB4E4;&#xC758; \( min \) &#xAC12;&#xC758; &#xCD5C;&#xC18C;&#xC774;&#xB2E4;.</p><p>\[ b &#xA0;:= \min_{i \in I : i_{max} &gt; a} i_{min} &#xA0;\]</p><p>&#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; \( a = 9 \) &#xAC12; &#xB2E4;&#xC74C;&#xC778; \( a = 8 \)&#xBD80;&#xD130; &#xC2DC;&#xC791;&#xD55C;&#xB2E4;. \( a = 8 \) &#xC77C; &#xACBD;&#xC6B0; \( max \)&#xAC00; \( a \)&#xBCF4;&#xB2E4; &#xD070; &#xC6D0;&#xC18C; &#xC9D1;&#xD569;&#xC740; \( \{ (6, 9) \} \)&#xC774;&#xACE0;, &#xC774; &#xC9D1;&#xD569;&#xC5D0;&#xC11C; \( min \)&#xAC12;&#xC758; &#xCD5C;&#xC18C;&#xB294; \(6\)&#xC774;&#xBBC0;&#xB85C; \(b = 6\)&#xC774;&#xB2E4;. \( (low_{min}, a) \)&#xC5D0; &#xC18D;&#xD560; &#xC785;&#xB825; &#xAD6C;&#xAC04;&#xC758; &#xCD5C;&#xC18C; &#xAC1C;&#xC218; \( n_{min} \)&#xC640; &#xCD5C;&#xB300; &#xAC1C;&#xC218; \( n_{max} \)&#xB294; &#xC774;&#xC804; &#xBC18;&#xBCF5;&#xACFC; &#xB3D9;&#xC77C;&#xD558;&#xAC8C; &#xC815;&#xC758;&#xB41C;&#xB2E4;. &#xC774; &#xACBD;&#xC6B0; \( b = 6 \)&#xBCF4;&#xB2E4; min&#xC774; &#xC791;&#xC740; &#xC6D0;&#xC18C;&#xC758; &#xAC1C;&#xC218;&#xB294; 4&#xAC1C;&#xC774;&#xBBC0;&#xB85C; \( n_{min}= 4\) &#xC774;&#xACE0; \( a = 8\) &#xBCF4;&#xB2E4; max&#xAC00; &#xC791;&#xAC70;&#xB098; &#xAC19;&#xC740; &#xC6D0;&#xC18C;&#xC758; &#xAC1C;&#xC218;&#xB294; 6&#xAC1C;&#xC774;&#xBBC0;&#xB85C; \( n_{max} = 6 \)&#xC774;&#xB2E4;. &#xC774;&#xD6C4; &#xC815;&#xD574;&#xC9C0;&#xB294; &#xAC12;&#xC740; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; \( a = 7 , b = 4 , n_{min} = 3, n_{max} = 4\) &#xAC00; &#xB420; &#xAC83;&#xC774;&#xB2E4;.</p><p>&#xC704; &#xBC29;&#xBC95;&#xC740; &#xB450; &#xBC88;&#xC758; &#xBC18;&#xBCF5;&#xC774; &#xAC01;&#xAC01; \( min \)&#xACFC; \( max \)&#xB85C; &#xC815;&#xB82C;&#xB41C; &#xBC30;&#xC5F4; \(L\)&#xACFC; \(U\)&#xC744; &#xB530;&#xB77C; &#xC21C;&#xD68C;&#xD568;&#xC73C;&#xB85C;&#xC368; &#xC27D;&#xAC8C; &#xAD6C;&#xD604;&#xD560; &#xC218; &#xC788;&#xC744; &#xAC83;&#xC774;&#xB2E4;. &#xCCAB; &#xBC88;&#xC9F8; &#xBC18;&#xBCF5;&#xC5D0;&#xC11C; distinct min&#xC744; &#xACE0;&#xB97C; &#xB54C; \(L\)&#xC5D0;&#xC11C; &#xCE74;&#xC6B4;&#xD130;(&#xC778;&#xB371;&#xC2A4;)&#xB97C; &#xC99D;&#xAC00;&#xC2DC;&#xCF1C;&#xAC00;&#xBA70; &#xB2E4;&#xB978; &#xAC12;&#xC774; &#xB098;&#xC62C; &#xB54C; &#xAE4C;&#xC9C0; &#xC99D;&#xAC00;&#xD558;&#xBA70; &#xD604;&#xC7AC; max&#xAC12;&#xC744; &#xC720;&#xC9C0;&#xD558;&#xBA74; \( a \) &#xC640; \(b\)&#xB97C; &#xC27D;&#xAC8C; &#xCC3E;&#xC744; &#xC218; &#xC788;&#xACE0;, \( n_{min} \)&#xC740; &#xADF8; &#xB2F9;&#xC2DC; &#xCE74;&#xC6B4;&#xD130;&#xC758; &#xAC1C;&#xC218;&#xC640; &#xC77C;&#xCE58;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;. \( n_{max} \)&#xC758; &#xACBD;&#xC6B0;&#xB294; &#xB530;&#xB85C; &#xCC3E;&#xC544;&#xC57C; &#xD558;&#xB294;&#xB370;, \(U\)&#xB97C; &#xB530;&#xB77C; &#xC21C;&#xD68C;&#xD558;&#xBA74; \( a \)&#xBCF4;&#xB2E4; max&#xAC00; &#xC791;&#xAC70;&#xB098; &#xAC19;&#xC740; &#xC6D0;&#xC18C;&#xC758; &#xAC1C;&#xC218;&#xB97C; &#xC27D;&#xAC8C; &#xCC3E;&#xC744; &#xC218; &#xC788;&#xB2E4;. &#xB450; &#xBC88;&#xC9F8; &#xBC18;&#xBCF5;&#xC5D0;&#xC11C;&#xB294; &#xC720;&#xC0AC;&#xD558;&#xAC8C; \( U \)&#xB97C; &#xB530;&#xB77C; distinc max&#xB97C; &#xACE0;&#xB97C; &#xB54C; &#xC778;&#xB371;&#xC2A4;&#xB97C; &#xAC10;&#xC18C;&#xC2DC;&#xCF1C;&#xAC00;&#xBA70; &#xC9C4;&#xD589;&#xD558;&#xBA74; &#xB420; &#xAC83;&#xC774;&#xB2E4;. &#xC774; &#xBC29;&#xBC95;&#xC740; A. Korotkov&#xAC00; pseudo-code&#xB85C; &#xC81C;&#xC2DC;&#xD55C; &#xBC29;&#xBC95;&#xC774;&#xBA70;, &#xD604;&#xC7AC; postGIS&#xC5D0;&#xC11C;&#xB3C4; R-Tree split &#xD568;&#xC218;&#xC5D0; &#xAC19;&#xC740; &#xC811;&#xADFC;&#xBC95;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xB2E4;.</p><!--kg-card-begin: html--><a name="considerSplit"></a><!--kg-card-end: html--><h2 id="considersplit">considerSplit</h2><p>&#xC704; &#xBC18;&#xBCF5;&#xC5D0;&#xC11C; &#xD6C4;&#xBCF4;&#xB97C; &#xCC3E;&#xAC8C; &#xB418;&#xBA74; &#xD574;&#xB2F9; &#xD6C4;&#xBCF4;&#xC758; cost&#xB97C; &#xACC4;&#xC0B0;&#xD558;&#xACE0; &#xD604;&#xC7AC; &#xC720;&#xC9C0;&#xD558;&#xACE0; &#xC788;&#xB294; &#xD6C4;&#xBCF4;&#xBCF4;&#xB2E4; &#xC88B;&#xB2E4;&#xBA74; &#xC785;&#xB825; &#xD6C4;&#xBCF4;&#xB97C; &#xC120;&#xD0DD;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;. &#xBCF8;&#xB798; R-Tree&#xC5D0;&#xB294; &#xAC01; node&#xC758; &#xCD5C;&#xC18C; degree&#xAC00; &#xC874;&#xC7AC;&#xD55C;&#xB2E4;. &#xC989;, &#xB450; &#xAC1C;&#xC758; &#xCD9C;&#xB825; &#xC9D1;&#xD569;&#xC758; &#xC6D0;&#xC18C;&#xC758; &#xAC1C;&#xC218;&#xB294; &#xD558;&#xD55C;&#xC774; &#xC788;&#xB294; &#xAC83;&#xC774;&#xB2E4;. &#xC774; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xB108;&#xBB34; &#xCE58;&#xC6B0;&#xCE5C; split &#xD6C4;&#xBCF4;&#xB97C; &#xAE08;&#xC9C0;&#xD55C;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; &#xC870;&#xAC74;&#xC744; &#xB9CC;&#xC871;&#xC2DC;&#xD0A8; &#xD6C4;&#xBCF4;&#xB97C; &#xC720;&#xD6A8;&#xD558;&#xB2E4;&#xACE0; &#xD558;&#xC790;. &#xD6C4;&#xBCF4;&#xB9C8;&#xB2E4; &#xD638;&#xCD9C;&#xB418;&#xB294; considerSplit &#xD568;&#xC218;&#xB294; &#xD574;&#xB2F9; &#xD6C4;&#xBCF4;&#xAC00; &#xC720;&#xD6A8;&#xD55C;&#xC9C0; &#xC0B4;&#xD3B4;&#xBCF4;&#xACE0;, &#xC720;&#xD6A8;&#xD55C; &#xD6C4;&#xBCF4;&#xAD70; &#xC911; &#xAC00;&#xC7A5; &#xC88B;&#xC740; &#xD6C4;&#xBCF4;&#xB97C; &#xCC3E;&#xB294; &#xD568;&#xC218;&#xC774;&#xB2E4;. &#xC5EC;&#xAE30;&#xC11C; &#xAC00;&#xC7A5; &#xC88B;&#xC740; &#xD6C4;&#xBCF4;&#xB780; &#xACB9;&#xCE5C; &#xC601;&#xC5ED;(overlapping area)&#xAC00; &#xAC00;&#xC7A5; &#xC801;&#xC740; &#xD6C4;&#xBCF4;&#xB97C; &#xC9C0;&#xCE6D;&#xD55C;&#xB2E4;.</p><p>\( n_{min} \) &#xBC0F; \( n_{max} \) &#xC740; \( (low_{min}, a) \)&#xC758; &#xCD5C;&#xC18C; &#xBC0F; &#xCD5C;&#xB300; &#xC6D0;&#xC18C;&#xC758; &#xAC1C;&#xC218;&#xB97C; &#xC758;&#xBBF8;&#xD560; &#xBFD0;&#xC774;&#xBBC0;&#xB85C;, &#xC2E4;&#xC81C;&#xB85C; \( (low_{min}, a) \)&#xAD6C;&#xAC04;&#xC5D0; &#xBA87; &#xAC1C;&#xC758; &#xC6D0;&#xC18C;&#xB97C; &#xB123;&#xC744;&#xC9C0; &#xACC4;&#xC0B0;&#xD574;&#xC57C; &#xD55C;&#xB2E4;. &#xC774;&#xB97C; \( n_{low} \) &#xB77C;&#xACE0; &#xC9C0;&#xCE6D;&#xD558;&#xC790;. \( n_{min} \) &#xC774; &#xC804;&#xCCB4; &#xAC1C;&#xC218;&#xC758; &#xC808;&#xBC18;&#xC744; &#xB118;&#xB294;&#xB2E4;&#xBA74; \( n_{low} = n_{min} \) &#xC774;&#xB2E4;. &#xC544;&#xB2D0; &#xACBD;&#xC6B0; \( n_{max} \) &#xAC00; &#xC804;&#xCCB4; &#xAC1C;&#xC218;&#xC758; &#xC808;&#xBC18;&#xC744; &#xB118;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;&#xBA74; \( n_{low} = n_{max} \) &#xC774;&#xACE0; &#xADF8; &#xC678;&#xC758; &#xACBD;&#xC6B0;&#xB294; &#xC804;&#xCCB4; &#xAC1C;&#xC218;&#xC758; &#xC808;&#xBC18;&#xC73C;&#xB85C; &#xC124;&#xC815;&#xB41C;&#xB2E4;. \( (b, upp_{max} ) \) &#xC5D0; &#xC18D;&#xD560; &#xC6D0;&#xC18C;&#xC758; &#xAC1C;&#xC218;&#xB294; &#xC790;&#xC5F0;&#xC2A4;&#xB7FD;&#xAC8C; &#xC815;&#xC758;&#xB41C;&#xB2E4;. &#xC774; &#xD6C4; &#xACB9;&#xCE5C; &#xC601;&#xC5ED;&#xC744; &#xACC4;&#xC0B0;&#xD558;&#xB294;&#xB370; &#xC774;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xC815;&#xC758;&#xB41C;&#xB2E4;.</p><p>\[ \frac{a - b}{upp_{max} - low_{min}} \]</p><p>&#xACB9;&#xCE5C; &#xC601;&#xC5ED; &#xAC12;&#xC744; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xCD5C;&#xC18C;&#xAC00; &#xB418;&#xB294; &#xD6C4;&#xBCF4;&#xB97C; &#xC120;&#xD0DD;&#xD558;&#xBA74; &#xC644;&#xB8CC;&#xB41C;&#xB2E4;.</p><h1 id="--1">&#xACB0;&#xB860;</h1><p> &#xC774; &#xAE00;&#xC5D0;&#xC11C;&#xB294; R-Tree&#xC758; node split &#xBC29;&#xBC95; &#xC911; &#xD558;&#xB098;&#xC778; A. Korotkov&#xC758; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xC558;&#xB2E4;. &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; 1&#xCC28;&#xC6D0; &#xAD6C;&#xAC04;&#xC5D0; &#xB300;&#xD55C; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC774;&#xC9C0;&#xB9CC; &#xAC01; &#xCD95; &#xBCC4;&#xB85C; &#xB3C5;&#xB9BD;&#xC801;&#xC73C;&#xB85C; &#xC218;&#xD589;&#xD560; &#xC218; &#xC788;&#xC73C;&#xBBC0;&#xB85C; &#xB2E4;&#xCC28;&#xC6D0; &#xAD6C;&#xAC04;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB3C4; &#xB3D9;&#xC791;&#xD558;&#xACE0; &#xB610;&#xD55C; A. Korotkov&#xC758; &#xC2E4;&#xD5D8;&#xACB0;&#xACFC; &#xAE30;&#xC874; R*-Tree &#xBC29;&#xBC95;&#xC5D0; &#xBE44;&#xD574; &#xC88B;&#xC740; &#xC131;&#xB2A5;&#xC744; &#xBCF4;&#xC5EC;&#xC8FC;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xD655;&#xC778;&#xB41C;&#xB2E4;.</p><h1 id="reference">Reference</h1><p>PostGIS 3.0.0 source <a href="https://git.osgeo.org/gitea/postgis/postgis/src/tag/3.0.0?ref=elenesgu.dev">(git repository)</a> <a href="https://git.osgeo.org/gitea/postgis/postgis/src/tag/3.0.0/postgis/gserialized_gist_2d.c?ref=elenesgu.dev">(code)</a></p><h1 id="bibliography">Bibliography</h1><!--kg-card-begin: html--><ol class="bibliography">
    <li>
        <a name="cite-1"> </a>A. Guttman. R-trees: A dynamic index structure for spatial searching. <i>SIGMOD Rec.</i>, 14(2):47&#x2013;57, June 1984.        
    </li>
    <li>
        <a name="cite-2"> </a> D. Greene. An implementation and performance analysis of spatial dataaccess methods. In <i> Proceedings. Fifth International Conference on Data Engineering </i>, pages 606&#x2013;615, 1989.
    </li>
    <li>
        <a name="cite-3"> </a>C. H. Ang and T. C. Tan. New linear node splitting algorithm for R-trees. In M. Scholl and A. Voisard, editors, <i> Advances in Spatial Databases</i>, pages 337&#x2013;349, Berlin, Heidelberg, 1997. Springer Berlin Heidelberg.
    </li>
    <li>
        <a name="cite-4"> </a>N. Beckmann, H.-P. Kriegel, R. Schneider, and B. Seeger. The R*-tree: An efficient and robust access method for points and rectangles. In <i> Proceedings of the 1990 ACM SIGMOD International Conference on Management of Data</i>, SIGMOD &#x2019;90, page 322&#x2013;331, New York, NY, USA, 1990. Association for Computing Machinery. &#xA0; 
    </li>
    <li>
        <a name="cite-5"></a> A. Korotkov, A new double sorting-based node splitting algorithm for R-tree. <i>Program Comput Soft</i> 38, 109&#x2013;118 (2012).
    </li>
</ol><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[C++ Fast pow Function]]></title><description><![CDATA[<h1 id="precaculated-exponentiation-table">Precaculated Exponentiation Table</h1><p> constexpr &#xD568;&#xC218;&#xC640; constexpr static &#xBCC0;&#xC218;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xCEF4;&#xD30C;&#xC77C; &#xD0C0;&#xC784;&#xC5D0; &#xACC4;&#xC0B0;&#xD558;&#xB294; global&#xAC1D;&#xCCB4; &#xD558;&#xB098;&#xB97C; &#xC0DD;&#xC131;&#xD55C;&#xB2E4;. constexpr &#xD568;&#xC218;&#xB85C; &#xC2E4;&#xC81C; &#xAC12;&#xC744; &#xACC4;&#xC0B0;&#xD558;&#xACE0;, index_sequence&</p>]]></description><link>https://elenesgu.dev/c-fast-pow-function/</link><guid isPermaLink="false">5efa9b39d900ba00014e3a1c</guid><category><![CDATA[C++]]></category><dc:creator><![CDATA[Seungmin Lee]]></dc:creator><pubDate>Wed, 08 Jul 2020 12:00:00 GMT</pubDate><content:encoded><![CDATA[<h1 id="precaculated-exponentiation-table">Precaculated Exponentiation Table</h1><p> constexpr &#xD568;&#xC218;&#xC640; constexpr static &#xBCC0;&#xC218;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xCEF4;&#xD30C;&#xC77C; &#xD0C0;&#xC784;&#xC5D0; &#xACC4;&#xC0B0;&#xD558;&#xB294; global&#xAC1D;&#xCCB4; &#xD558;&#xB098;&#xB97C; &#xC0DD;&#xC131;&#xD55C;&#xB2E4;. constexpr &#xD568;&#xC218;&#xB85C; &#xC2E4;&#xC81C; &#xAC12;&#xC744; &#xACC4;&#xC0B0;&#xD558;&#xACE0;, index_sequence&#xB97C; &#xC0AC;&#xC6A9;&#xD574; &#xD574;&#xB2F9; &#xAC12;&#xC73C;&#xB85C; &#xBC30;&#xC5F4;&#xC744; &#xCD08;&#xAE30;&#xD654; &#xD55C;&#xB2E4;. <a href="https://elenesgu.dev/compile-time-sequences-of-integers/">&#xC5EC;&#xAE30;&#xC5D0;</a> &#xB098;&#xC640;&#xC788;&#xB294; index_sequence&#xB97C; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;&#xBA74; C++11&#xC5D0;&#xC11C;&#xB3C4; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xBC30;&#xC5F4;&#xC758; &#xD06C;&#xAE30;&#xB294; &#xD574;&#xB2F9; &#xD0C0;&#xC785;&#xC774; &#xB098;&#xD0C0;&#xB0BC; &#xC218; &#xC788;&#xB294; &#xCD5C;&#xB300; &#xC218;&#xC758; log_10 &#xAC12; &#xC774;&#xC5B4;&#xC57C; &#xD558;&#xB294;&#xB370;, &#xC815;&#xC218;&#xB77C;&#xBA74; std::numeric_limits&#xC5D0; &#xC788;&#xB294; digits10 &#xAC12;&#xC744; &#xC774;&#xC6A9;&#xD558;&#xBA74; &#xB41C;&#xB2E4;. (&#xBD80;&#xB3D9;&#xC18C;&#xC218;&#xC810;&#xC758; digits10&#xC740; fraction &#xBD80;&#xBD84;&#xC5D0; &#xD574;&#xB2F9;&#xD558;&#xB294; &#xAC12;&#xC774;&#xBBC0;&#xB85C; &#xB530;&#xB85C; &#xACC4;&#xC0B0;&#xD574;&#xC57C; &#xD55C;&#xB2E4;.) &#xC774;&#xB97C; &#xCF54;&#xB4DC;&#xB85C; &#xD45C;&#xD604;&#xD558;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><!--kg-card-begin: html--><script src="https://gist.github.com/Elenesgu/fc5909858fc5e166b392a8419ef8caf6.js"></script><!--kg-card-end: html--><p>pow10_fast_tmp&#xB294; constexpr &#xD568;&#xC218;&#xC774;&#xBBC0;&#xB85C; &#xCEF4;&#xD30C;&#xC77C; &#xD0C0;&#xC784;&#xC5D0; &#xC218;&#xD589;&#xB420; &#xC218; &#xC788;&#xB2E4;. &#xC989;, </p><p><code>std::array&lt;int, pow10_fast_tmp&lt;size_t&gt;(3)&gt; arr</code> </p><p>&#xC640; &#xAC19;&#xC774; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><h1 id="-">&#xBCA4;&#xCE58; &#xB9C8;&#xD06C;</h1><p> &#xC704;&#xC5D0;&#xC11C; &#xC0DD;&#xC131;&#xD55C; &#xD14C;&#xC774;&#xBE14;&#xC744; &#xD65C;&#xC6A9;&#xD55C; pow &#xACC4;&#xC0B0; (&#xC0AC;&#xC2E4;&#xC0C1; &#xC811;&#xADFC;)&#xACFC; &#xC2E4;&#xC81C; &#xAC12; &#xACC4;&#xC0B0;&#xC744; &#xBE44;&#xAD50;&#xD574; &#xBCF4;&#xC790;. &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xD14C;&#xC2A4;&#xD2B8; &#xCF54;&#xB4DC;&#xB97C; &#xD1B5;&#xD574; &#xC218;&#xD589;&#xC2DC;&#xAC04;&#xC744; &#xD655;&#xC778;&#xD558;&#xC600;&#xB2E4;.</p><!--kg-card-begin: html--><script src="https://gist.github.com/Elenesgu/74b9232b4bda9774c4869970ce9465c4.js"></script><!--kg-card-end: html--><h2 id="--1"> &#xACB0;&#xACFC;</h2><p>i7-8700 &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xC635;&#xC158;&#xC73C;&#xB85C; &#xCEF4;&#xD30C;&#xC77C; &#xD6C4; &#xC2E4;&#xD589;&#xD558;&#xC600;&#xB2E4;. (clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final))</p><p><code>clang++ -std=c++14 -O2 pow_table.cpp</code></p><p>100000000 &#xBC88; pow&#xB97C; &#xD588;&#xC744; &#xB54C;, std::pow&#xC758; &#xACBD;&#xC6B0; 3000ms &#xADFC;&#xCC98;, &#xBBF8;&#xB9AC; &#xACC4;&#xC0B0;&#xD55C; &#xD14C;&#xC774;&#xBE14;&#xC758; &#xACBD;&#xC6B0; 30ms &#xC815;&#xB3C4;&#xAC00; &#xC18C;&#xC694;&#xB418;&#xC5C8;&#xB2E4;. </p><h1 id="todo-table-for-floating-point-types">TODO: Table for Floating Point Types</h1><p> &#xC218;&#xC815; &#xD6C4; double &#xD0C0;&#xC785; &#xB4F1;&#xC5D0;&#xC11C;&#xB3C4; &#xB3D9;&#xC791;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xD574;&#xBCF4;&#xC790;.</p>]]></content:encoded></item><item><title><![CDATA[Compile time sequences of integers in C++: std::integer_sequence]]></title><description><![CDATA[std::integer_sequence는 컴파일 타임에 수열을 표현하기 위한 보조 클래스이다. C++14에 도입되었지만, C++11에도 다음 snippet을 참조하여 사용할 수 있다. 이를 사용하여 컴파일 타임에 반복문을 생성하거나 특정 크기의 std::array 객체를 생성하거나 할 수 있다. std::index_sequence는 각 수의 타입이 size_t로 고정된 클래스이다.]]></description><link>https://elenesgu.dev/compile-time-sequences-of-integers/</link><guid isPermaLink="false">5e4f82b9f6ec420001eecc7f</guid><category><![CDATA[C++]]></category><category><![CDATA[developemnt]]></category><dc:creator><![CDATA[Seungmin Lee]]></dc:creator><pubDate>Thu, 19 Mar 2020 11:50:59 GMT</pubDate><content:encoded><![CDATA[<p>std::integer_sequence&#xB294; &#xCEF4;&#xD30C;&#xC77C; &#xD0C0;&#xC784;&#xC5D0; &#xC218;&#xC5F4;&#xC744; &#xD45C;&#xD604;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xBCF4;&#xC870; &#xD074;&#xB798;&#xC2A4;&#xC774;&#xB2E4;. C++14&#xC5D0; &#xB3C4;&#xC785;&#xB418;&#xC5C8;&#xC9C0;&#xB9CC;, C++11&#xC5D0;&#xB3C4; &#xB2E4;&#xC74C; snippet&#xC744; &#xCC38;&#xC870;&#xD558;&#xC5EC; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xC774;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xCEF4;&#xD30C;&#xC77C; &#xD0C0;&#xC784;&#xC5D0; &#xBC18;&#xBCF5;&#xBB38;&#xC744; &#xC0DD;&#xC131;&#xD558;&#xAC70;&#xB098; &#xD2B9;&#xC815; &#xD06C;&#xAE30;&#xC758; std::array &#xAC1D;&#xCCB4;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xAC70;&#xB098; &#xD560; &#xC218; &#xC788;&#xB2E4;. std::index_sequence&#xB294; &#xAC01; &#xC218;&#xC758; &#xD0C0;&#xC785;&#xC774; size_t&#xB85C; &#xACE0;&#xC815;&#xB41C; &#xD074;&#xB798;&#xC2A4;&#xC774;&#xB2E4;.</p><!--kg-card-begin: html--><script src="https://gist.github.com/ntessore/dc17769676fb3c6daa1f.js"></script><!--kg-card-end: html--><p>std::integer_sequence&#xC758; &#xC6D0;&#xB9AC;&#xB294; std::tuple&#xACFC; &#xC720;&#xC0AC;&#xD558;&#xAC8C; parameter pack&#xC744; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;. tuple&#xC758; &#xAD6C;&#xD604;&#xC744; &#xBA3C;&#xC800; &#xAC04;&#xB2E8; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;. (gnu)</p><!--kg-card-begin: markdown--><pre><code class="language-c++">template&lt;typename... _Elements&gt;
class tuple : public _Tuple_impl&lt;0, _Elements...&gt; {};

template&lt;std::size_t _Idx, typename _Head, typename... _Tail&gt;
struct _Tuple_impl&lt;_Idx, _Head, _Tail...&gt;
  : public _Tuple_impl&lt;_Idx + 1, _Tail...&gt;,
    private _Head_base&lt;_Idx, _Head&gt; {};

template&lt;std::size_t _Idx, typename _Head&gt;
struct _Tuple_impl&lt;_Idx, _Head&gt;
  : private _Head_base&lt;_Idx, _Head&gt; {};  
</code></pre>
<!--kg-card-end: markdown--><p>_Head_base&#xB294; tuple&#xC758; &#xAC01;&#xAC01;&#xC758; &#xC544;&#xC774;&#xD15C;&#xC744; &#xC800;&#xC7A5;&#xD558;&#xB294; &#xD074;&#xB798;&#xC2A4;&#xC774;&#xBBC0;&#xB85C; &#xBB34;&#xC2DC;&#xD558;&#xBA74;, variadic template&#xC758; &#xC778;&#xC790;&#xB4E4;&#xC744; &#xD55C; &#xAC1C;&#xC529; &#xD480;&#xBA74;&#xC11C; (&#xADF8;&#xB9AC;&#xACE0; size_t &#xD615;&#xC2DD;&#xC758; _Idx &#xAC12;&#xC744; 1&#xC529; &#xC99D;&#xAC00;&#xD558;&#xBA74;&#xC11C;) &#xBC18;&#xBCF5;&#xC801;&#xC73C;&#xB85C; &#xC0C1;&#xC18D;&#xC744; &#xD1B5;&#xD574; &#xCC98;&#xB9AC;&#xD558;&#xACE0; &#xC788;&#xB2E4;. &#xC5EC;&#xAE30;&#xC11C; &#xD15C;&#xD50C;&#xB9BF; &#xC778;&#xC790;&#xB4E4;&#xC774; &#xD0C0;&#xC785;&#xC744; &#xB098;&#xD0C0;&#xB0B4;&#xB294; &#xC9C0;&#xC815;&#xC790; &#xC600;&#xC9C0;&#xB9CC;, &#xC22B;&#xC790;&#xB97C; &#xB098;&#xD0C0;&#xB0B4;&#xB294; &#xAC12;&#xC77C; &#xC218; &#xB3C4; &#xC788;&#xB2E4;. &#xC778;&#xC790;&#xB4E4;&#xC774; &#xBAA8;&#xB450; &#xAC19;&#xC740; &#xD0C0;&#xC785;&#xC758; &#xC22B;&#xC790; &#xAC12;&#xC778; &#xD074;&#xB798;&#xC2A4;&#xAC00; integer_sequence &#xC774;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098;, integer_sequence&#xB294; &#xADF8;&#xC800; &#xC22B;&#xC790; &#xAC12;&#xC744; &#xB098;&#xD0C0;&#xB0BC; &#xBFD0;&#xC778;&#xB370; &#xC5B4;&#xB5BB;&#xAC8C; &#xD65C;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC744;&#xAE4C;? &#xC774;&#xB97C; &#xBCF4;&#xC870;&#xD574; &#xC8FC;&#xB294; &#xAC83;&#xC774; std::make_integer_sequence &#xB77C;&#xB294; &#xBCF4;&#xC870; &#xD074;&#xB798;&#xC2A4;&#xC758; &#xC5ED;&#xD560;&#xC774;&#xB2E4;.</p><h1 id="make_integer_sequence">make_integer_sequence</h1><p>make_integer_sequence&#xB294; &#xC5B4;&#xB5A4; &#xAC12;&#xC744; &#xB123;&#xC73C;&#xBA74; &#xADF8; &#xAC12;&#xC5D0; &#xD574;&#xB2F9;&#xD558;&#xB294; &#xC218;&#xC5F4;&#xC744; &#xB2F4;&#xB294; integer_sequence&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4; &#xC900;&#xB2E4;. (&#xC815;&#xD655;&#xD788;&#xB294; &#xADF8;&#xB7EC;&#xD55C; &#xD074;&#xB798;&#xC2A4;&#xC758; aliasing&#xC774; &#xB41C;&#xB2E4;.) &#xC608;&#xB97C; &#xB4E4;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">std::make_integer_sequence&lt;size_t, 10&gt;
//==
std::integer_sequence&lt;size_t, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9&gt;
</code></pre>
<!--kg-card-end: markdown--><p>tuple&#xACFC; &#xC720;&#xC0AC;&#xD558;&#xAC8C; &#xD15C;&#xD50C;&#xB9BF; &#xC778;&#xC790;&#xB4E4;&#xC744; &#xBC18;&#xBCF5;&#xC801;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xD558;&#xBA70; aliasing&#xC744; &#xBC18;&#xBCF5; &#xC2DC;&#xD0A4;&#xBA74; &#xB9CC;&#xB4E4; &#xC218; &#xC788;&#xB2E4;&#xB294; &#xAC83;&#xC744; &#xC9D0;&#xC791;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xC11C;&#xB450;&#xC5D0;&#xC11C; &#xB9C1;&#xD06C;&#xD574;&#xB454; gist&#xC758; snippet&#xC758; &#xCF54;&#xB4DC;&#xB97C; &#xBCF4;&#xBA74; &#xC774;&#xB97C; &#xC27D;&#xAC8C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">template&lt;typename T, std::size_t N, T... Is&gt;
struct make_integer_sequence : make_integer_sequence&lt;T, N-1, N-1, Is...&gt; {};
	
template&lt;typename T, T... Is&gt;
struct make_integer_sequence&lt;T, 0, Is...&gt; : integer_sequence&lt;T, Is...&gt; {};

template&lt;typename T, T... Ints&gt;
struct integer_sequence {
    typedef T value_type;
    static constexpr std::size_t size() { return sizeof...(Ints); }
};
</code></pre>
<!--kg-card-end: markdown--><p> &#xC774; &#xCF54;&#xB4DC;&#xB97C; &#xBC14;&#xD0D5;&#xC73C;&#xB85C;, &#xC704; &#xC608;&#xC81C;&#xB97C; &#xD480;&#xC5B4;&#xB098;&#xAC00;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC744; &#xAC83;&#xC774;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">std::make_integer_sequence&lt;size_t, 10&gt;
//=&gt;
std::make_integer_sequence&lt;size_t, 9, 9&gt;
//=&gt;
std::make_integer_sequence&lt;size_t, 8, 8, 9&gt;
//=&gt;
//...
//=&gt;
std::make_integer_sequence&lt;size_t, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9&gt;
//=&gt;
std::make_integer_sequence&lt;size_t, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9&gt;
//=&gt;
std::integer_sequence&lt;size_t, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9&gt;
</code></pre>
<!--kg-card-end: markdown--><p>gnu &#xACC4;&#xC5F4;&#xC5D0;&#xC11C;&#xB294; &#xC774;&#xB97C; &#xC21C;&#xCC28;&#xC801;&#xC73C;&#xB85C; &#xBC18;&#xBCF5;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xB9E4;&#xBC88; &#xC808;&#xBC18;&#xC73C;&#xB85C; &#xB098;&#xB204;&#xBA74;&#xC11C; &#xCEF4;&#xD30C;&#xC77C; &#xC18D;&#xB3C4;&#xC758; &#xC0C1;&#xC2B9;&#xC744; &#xCD94;&#xAD6C;&#xD558;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xCD94;&#xCE21;&#xB41C;&#xB2E4;. std::make_integer_sequence&lt;size_t, 10&gt;&#xC744; &#xCC98;&#xB9AC;&#xD560; &#xB54C;, gnu&#xC5D0;&#xC11C;&#xB294; _Build_index_tuple&lt;5&gt; &#xAE4C;&#xC9C0;&#xB9CC; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xC815;&#xC758;&#xD574;&#xB3C4; &#xB41C;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">template&lt;size_t... _Ind1, size_t... _Ind2&gt;
struct _Itup_cat&lt;_Index_tuple&lt;_Ind1...&gt;, _Index_tuple&lt;_Ind2...&gt;&gt; {
    using __type = _Index_tuple&lt;_Ind1..., (_Ind2 + sizeof...(_Ind1))...&gt;;
};

template&lt;size_t _Num&gt;
struct _Build_index_tuple
    : _Itup_cat&lt;
          typename _Build_index_tuple&lt;_Num / 2&gt;::__type,
	      typename _Build_index_tuple&lt;_Num - _Num / 2&gt;::__type
    &gt; { };
</code></pre>
<!--kg-card-end: markdown--><p> &#xC791;&#xB3D9; &#xBC29;&#xC2DD;&#xC744; &#xC54C;&#xC544;&#xBD24;&#xC73C;&#xB2C8; &#xC774;&#xC81C; &#xC774;&#xB97C; &#xC5B4;&#xB5BB;&#xAC8C; &#xD65C;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB294;&#xC9C0; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;. std::array&#xB97C; std::tuple&#xB85C; &#xBC14;&#xAFB8;&#xAC70;&#xB098;, std::tuple&#xC744; &#xCD9C;&#xB825;&#xD558;&#xB294; &#xD568;&#xC218;&#xB97C; &#xC791;&#xC131;&#xD558;&#xB294; &#xB4F1;&#xC758; &#xC608;&#xC81C;&#xB294; <a href="https://en.cppreference.com/w/cpp/utility/integer_sequence?ref=elenesgu.dev">cppreference</a>&#xC5D0;&#xC11C; &#xCC3E;&#xC744; &#xC218; &#xC788;&#xC73C;&#xBBC0;&#xB85C;, &#xB2E4;&#xB978; &#xC5C6;&#xB294; &#xC608;&#xC81C;&#xB97C; &#xCC38;&#xACE0;&#xD574; &#xBCF8;&#xB2E4;.</p><h1 id="instantiate-std-arrayt-n-and-fill-it-in-compile-time">Instantiate std::array&lt;T, N&gt; and fill it in compile time</h1><p> &#xAC00;&#xC7A5; &#xC26C;&#xC6B4; &#xC608;&#xC81C; &#xC911; &#xD558;&#xB098;&#xB294; std::array&#xAC12;&#xC744; &#xADE0;&#xC77C;&#xD55C; &#xAC12;&#xC73C;&#xB85C; &#xCC44;&#xC6B4; &#xB4A4; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xAC83;&#xC774;&#xB2E4;. &#xB2E4;&#xC74C; &#xCF54;&#xB4DC;&#xB97C; &#xBCF4;&#xC790;. std::array&#xB97C; &#xCD9C;&#xB825;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xD568;&#xC218;&#xB294; cppreference&#xC758; &#xAC83;&#xC744; &#xCC28;&#xC6A9;&#xD588;&#xB2E4;. &#xB300;&#xC2E0; C++14&#xC5D0;&#xB3C4; &#xB3CC;&#xC544;&#xAC08; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xC7AC;&#xADC0;&#xB85C; &#xCC98;&#xB9AC;&#xD558;&#xC600;&#xB2E4;. (&#xBCF8;&#xB798; std::tuple &#xCD9C;&#xB825;&#xD558;&#xB294; &#xD568;&#xC218;&#xB97C;C++17&#xC758; fold expression&#xC744; &#xD1B5;&#xD574; &#xAD6C;&#xD604;&#xD574; &#xB193;&#xC740; &#xCF54;&#xB4DC;&#xC600;&#xB2E4;.)</p><!--kg-card-begin: markdown--><pre><code class="language-c++">template&lt;class T, size_t... Is&gt;
constexpr std::array&lt;T, sizeof...(Is)&gt;
array_with_one(const T&amp; value, std::index_sequence&lt;Is...&gt;) {
  return {{(static_cast&lt;void&gt;(Is), value)...}};
}

template&lt;class Ch, class Tr, class Arr&gt;
void print_impl(std::basic_ostream&lt;Ch,Tr&gt;&amp; os,
                const Arr&amp; t,
                std::index_sequence&lt;&gt;) {  
}

template&lt;class Ch, class Tr, class Arr, std::size_t I, std::size_t... Is&gt;
void print_impl(std::basic_ostream&lt;Ch,Tr&gt;&amp; os,
                const Arr&amp; t,
                std::index_sequence&lt;I, Is...&gt;) {  
  os &lt;&lt; (I == 0? &quot;&quot; : &quot;, &quot;) &lt;&lt; t[I];
  print_impl(os, t, std::index_sequence&lt;Is...&gt;{});
}

template&lt;class Ch, class Tr, class Ty, size_t ArrSize&gt;
auto&amp; operator&lt;&lt;(std::basic_ostream&lt;Ch, Tr&gt;&amp; os,
                 const std::array&lt;Ty, ArrSize&gt;&amp; t)
{
  os &lt;&lt; &quot;[&quot;;
  print_impl(os, t, std::make_index_sequence&lt;ArrSize&gt;{});
  return os &lt;&lt; &quot;]&quot;;
}

int main() {
  auto arr = array_with_one&lt;double&gt;(12.0, std::make_index_sequence&lt;8&gt;{});

  std::cout &lt;&lt; arr &lt;&lt; std::endl;
  return 0;
}
// output:
// [12, 12, 12, 12, 12, 12, 12, 12]
</code></pre>
<!--kg-card-end: markdown--><p>array_with_one &#xD568;&#xC218;&#xB294; T &#xD0C0;&#xC785;&#xC758; &#xAC12; &#xD55C; &#xAC1C;&#xC640; index_sequence&#xB97C; &#xBC1B;&#xC544;&#xC11C; T&#xB85C; &#xCD08;&#xAE30;&#xD654;&#xB41C; index_sequence&#xC758; &#xD06C;&#xAE30; &#xB9CC;&#xD07C;&#xC758; T&#xC758; &#xBC30;&#xC5F4;&#xC744; &#xBC18;&#xD658;&#xD55C;&#xB2E4;. array_with_one &#xD568;&#xC218;&#xB97C; &#xC218;&#xC815;&#xD558;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xACBD;&#xC6B0;&#xB3C4; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-cpp">template&lt;class T, class I&gt;
inline constexpr T pow(const T base, I exp) {
  static_assert(std::is_integral&lt;I&gt;::value, &quot;Integral required in pow.&quot;);
  return     (exp == 0) ? 1 :
         (exp % 2 == 0) ?
           pow(base, exp/2)*pow(base, exp/2) :
           base * pow(base, (exp-1)/2) * pow(base, (exp-1)/2);
}

template&lt;class T, class I&gt;
inline constexpr T pow2(I exp) {
  return     (exp == 0) ? 1 :
         (exp % 2 == 0) ?
           pow2&lt;T&gt;(exp/2)*pow2&lt;T&gt;(exp/2) :
           2 * pow2&lt;T&gt;((exp-1)/2) * pow2&lt;T&gt;((exp-1)/2);
}

template&lt;class T, size_t... Is&gt;
constexpr std::array&lt;T, sizeof...(Is)&gt;
array_with_pow(std::index_sequence&lt;Is...&gt;) {
  return {{(pow2&lt;T&gt;(Is + 1))...}};
}

int main() {
  auto arr = array_with_pow&lt;double&gt;(std::make_index_sequence&lt;10&gt;{});

  std::cout &lt;&lt; arr &lt;&lt; std::endl;
  return 0;
}
// output:
// [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]
</code></pre>
<!--kg-card-end: markdown--><p> &#xC778;&#xC790;&#xB85C; &#xB4E4;&#xC5B4;&#xC628; T&#xC758; &#xAC12;&#xC744; &#xADF8;&#xB300;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xB300;&#xC2E0;&#xC5D0;, integer_sequence&#xC758; template &#xB4E4;&#xC744; &#xD55C; &#xAC1C;&#xC529; &#xB2E4;&#xB978; &#xD568;&#xC218;&#xC758; &#xC778;&#xC790;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xD568;&#xC218;&#xC758; &#xB9AC;&#xD134;&#xAC12;&#xC73C;&#xB85C; &#xC774;&#xB8E8;&#xC5B4;&#xC9C4; array&#xAC1D;&#xCCB4;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4; &#xB0B4;&#xC5C8;&#xB2E4;.</p><h1 id="concatenate-two-std-arrays">Concatenate two std::arrays</h1><p>integer_sequence&#xB294; 2&#xAC1C; &#xC774;&#xC0C1;&#xC744; &#xB3D9;&#xC2DC;&#xC5D0; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xC774;&#xB97C; &#xC774;&#xC6A9;&#xD558;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; 2&#xAC1C;&#xC758; std::array&#xB97C; &#xC774;&#xC744; &#xC218; &#xB3C4; &#xC788;&#xB2E4;. 2&#xAC1C;&#xC758; integer_sequence&#xC640; 2&#xBC88;&#xC758; parameter pack expansion&#xC744; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &#xC21C;&#xC11C;&#xB300;&#xB85C; &#xC0C8;&#xB85C;&#xC6B4; &#xAC1D;&#xCCB4;&#xC758; &#xC0DD;&#xC131;&#xC790; &#xC778;&#xC790;&#xB85C; &#xB123;&#xC5B4;&#xC8FC;&#xAC8C; &#xB41C;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">template&lt;class LA, class RA, size_t... LIs, size_t... RIs&gt;
constexpr std::array&lt;typename LA::value_type, sizeof...(LIs) + sizeof...(RIs)&gt;
merge_array_internal(
  const LA&amp; lh,
  const RA&amp; rh,
  std::index_sequence&lt;LIs...&gt;,
  std::index_sequence&lt;RIs...&gt;
) {
  return {{
    lh[LIs]...,
    rh[RIs]...
  }};
}

template&lt;class T1, class T2, size_t LSize, size_t RSize&gt;
constexpr std::array&lt;T1, LSize + RSize&gt;
merge_array(
  const std::array&lt;T1, LSize&gt;&amp; lh,
  const std::array&lt;T2, RSize&gt;&amp; rh
) {
  return merge_array_internal(
    lh, rh,
    std::make_index_sequence&lt;LSize&gt;{},
    std::make_index_sequence&lt;RSize&gt;{}
  );
}

int main() {
  std::array&lt;int, 6UL&gt; a = {1,2,3,4,5,6};
  std::array&lt;int, 4UL&gt; b = {7,8,9,10};
  auto arr = merge_array(a, b);

  std::cout &lt;&lt; arr &lt;&lt; std::endl;
  return 0;
}

// output:
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
</code></pre>
<!--kg-card-end: markdown--><p> &#xBFD0;&#xB9CC; &#xC544;&#xB2C8;&#xB77C;, &#xC77C;&#xBC18;&#xC801;&#xC778; variadic template (class... Args)&#xC640; &#xD568;&#xAED8; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xB3C4; &#xC788;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">template&lt;class T, size_t... Is, class... Args&gt;
constexpr std::array&lt;T, sizeof...(Is) + sizeof...(Args)&gt;
pad_right_array_internal(
  const std::array&lt;T, sizeof...(Is)&gt;&amp; tgt,
  std::index_sequence&lt;Is...&gt;,
  Args&amp;&amp;... args
) {
  return {
    tgt.at(Is)...,
    static_cast&lt;T&gt;(args)...
  };
}

template&lt;class T, size_t Size, class... Args&gt;
constexpr std::array&lt;T, Size + sizeof...(Args)&gt;
pad_right_array(
  const std::array&lt;T, Size&gt;&amp; tgt,
  Args&amp;&amp;... args
) {
  return pad_right_array_internal(
    tgt, std::make_index_sequence&lt;Size&gt;{}, std::forward&lt;Args&gt;(args)...
  );
}

int main() {
  std::array&lt;double, 6UL&gt; a = {1,2,3,4,5,6};
  auto arr = pad_right_array(a, 7, 8, 9, 10);

  std::cout &lt;&lt; arr &lt;&lt; std::endl;
  return 0;
}
// output:
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
</code></pre>
<!--kg-card-end: markdown--><p> &#xC774;&#xB7EC;&#xD55C; &#xBCF5;&#xC218;&#xC758; tuple-like &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xD569;&#xCE58;&#xB294; &#xB2E4;&#xB978; &#xBC29;&#xBC95;&#xC740; <a href="https://en.cppreference.com/w/cpp/utility/tuple/tuple_cat?ref=elenesgu.dev">tuple_cat</a> &#xD568;&#xC218;&#xB97C; &#xCC38;&#xC870;&#xD558;&#xC790;.</p><h1 id="-"> &#xC815;&#xB9AC;</h1><p> &#xC774;&#xB807;&#xB4EF;, integer_sequence&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xCEF4;&#xD30C;&#xC77C; &#xD0C0;&#xC784;&#xC5D0; &#xC218;&#xC5F4;&#xC744; &#xD65C;&#xC6A9;&#xD55C; &#xCF54;&#xB4DC; &#xC0DD;&#xC131;&#xC744; &#xC27D;&#xAC8C; &#xD560; &#xC218; &#xC788;&#xB2E4;. &#xB9CC;&#xC57D; C++17&#xC774;&#xC0C1;&#xC744; &#xD65C;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;&#xBA74;, <a href="https://en.cppreference.com/w/cpp/utility/apply?ref=elenesgu.dev">std::apply</a> &#xAC19;&#xC740; &#xD568;&#xC218;&#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xB3C4; &#xC788;&#xC73C;&#xB098;, C++11&#xC744; &#xC720;&#xC9C0;&#xD574;&#xC57C; &#xD55C;&#xB2E4;&#xBA74; &#xB3C4;&#xC6C0;&#xC774; &#xB420; &#xAC83;&#xC774;&#xB77C; &#xAE30;&#xB300;&#xD55C;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[gcc 4.8.5에서 emplace가 안될 때]]></title><description><![CDATA[<p>Key-Value &#xD615;&#xC2DD;&#xC758; STL Container&#xC5D0;&#xC11C; &#xAC01;&#xAC01;&#xC758; Key-Value &#xC30D;&#xC740; std::pair&lt;Key, Value&gt; &#xD615;&#xD0DC;&#xB85C; &#xC774;&#xB8E8;&#xC5B4;&#xC9C4;&#xB2E4;. std::pair&#xC758; &#xC0DD;&#xC131;&#xC790; &#xC911; &#xD558;&#xB098;&#xB294; &#xAC01;&#xAC01;&#xC758; Key, Value &#xD0C0;&#xC785;&#xC758; forwarding reference (&#xB610;&#xB294;</p>]]></description><link>https://elenesgu.dev/fix-compilation-error-in-emplace-gcc-4-8-5/</link><guid isPermaLink="false">5db6a65d47e04a0001f059af</guid><category><![CDATA[C++]]></category><category><![CDATA[developemnt]]></category><dc:creator><![CDATA[Seungmin Lee]]></dc:creator><pubDate>Mon, 28 Oct 2019 10:46:00 GMT</pubDate><content:encoded><![CDATA[<p>Key-Value &#xD615;&#xC2DD;&#xC758; STL Container&#xC5D0;&#xC11C; &#xAC01;&#xAC01;&#xC758; Key-Value &#xC30D;&#xC740; std::pair&lt;Key, Value&gt; &#xD615;&#xD0DC;&#xB85C; &#xC774;&#xB8E8;&#xC5B4;&#xC9C4;&#xB2E4;. std::pair&#xC758; &#xC0DD;&#xC131;&#xC790; &#xC911; &#xD558;&#xB098;&#xB294; &#xAC01;&#xAC01;&#xC758; Key, Value &#xD0C0;&#xC785;&#xC758; forwarding reference (&#xB610;&#xB294; Universal reference)&#xB97C; &#xBC1B;&#xB294;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; STL Container&#xC5D0;&#xC11C; emplace&#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xBA74; Key&#xC640; Value&#xC758; &#xAC12;&#xC744; &#xC804;&#xB2EC;&#xD574;&#xC11C; &#xC0BD;&#xC785;&#xD560; &#xC218; &#xC788;&#xB2E4;. (C++11&#xBD80;&#xD130; r-value reference&#xB85C; &#xC778;&#xD574; pair &#xAC1D;&#xCCB4;&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xB3C4; &#xB611;&#xAC19;&#xC744; &#xAC83;&#xC774;&#xAE34; &#xD558;&#xB2E4;.) &#xC774; &#xB54C;, Key&#xC640; Value&#xC758; &#xC0DD;&#xC131;&#xC790;&#xC5D0; &#xC784;&#xC758;&#xC758; &#xD0C0;&#xC785; A&#xC640; B&#xB97C; &#xAC01;&#xAC01; &#xBC1B;&#xB294; &#xACBD;&#xC6B0;&#xAC00; &#xC788;&#xB2E4;&#xACE0; &#xAC00;&#xC815;&#xD558;&#xBA74;, emplace&#xC5D0; Key&#xC640; Value&#xC758; &#xAC1D;&#xCCB4;&#xB97C; &#xBA85;&#xC2DC;&#xC801;&#xC73C;&#xB85C; &#xC0DD;&#xC131;&#xD560; &#xD544;&#xC694; &#xC5C6;&#xC774;, A&#xC640; B&#xC758; &#xAC1D;&#xCCB4;&#xC758; &#xC804;&#xB2EC;&#xB9CC;&#xC73C;&#xB85C;&#xB3C4; &#xC0DD;&#xC131;&#xD560; &#xC218; &#xC788;&#xC744; &#xAC83;&#xC774;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">
class A {};
class B {};

struct Key {
    Key(const A&amp; a) {}
};

struct Value {
    Value(const B&amp; a) {}
};

std::unordered_map&lt;Key, Value&gt; associative_container;

A a_instance;
B b_instance;

associative_container.emplace(a_instance, b_instance);
</code></pre>
<!--kg-card-end: markdown--><p>&#xD558;&#xC9C0;&#xB9CC;&#xC704;&#xCF54;&#xB4DC;&#xB294; gcc 4.8.5&#xC5D0;&#xC11C;&#xCEF4;&#xD30C;&#xC77C;&#xB418;&#xC9C0;&#xC54A;&#xC558;&#xB2E4;.(CentOS7&#xAE30;&#xC900;)&#xC774;&#xB97C;&#xD574;&#xACB0;&#xD558;&#xAE30;&#xC704;&#xD574;&#xC120;&#xB2E4;&#xB978;&#xBC29;&#xBC95;&#xB4E4;&#xC774;&#xC788;&#xC744;&#xAC83;&#xC774;&#xC9C0;&#xB9CC;,std::pair&#xC758;&#xB2E4;&#xB978;&#xC0DD;&#xC131;&#xC790;&#xB97C;&#xC0AC;&#xC6A9;&#xD558;&#xC5EC;&#xD574;&#xACB0;&#xD558;&#xAE30;&#xB85C;&#xD588;&#xB2E4;.std::pair&#xB294;&#xCCAB;&#xBC88;&#xC9F8;&#xC778;&#xC790;&#xAC00; std::piecewise_construct_t &#xD0C0;&#xC785;&#xC77C;&#xACBD;&#xC6B0;, tuple 2&#xAC1C;&#xB97C;&#xBC1B;&#xC544;&#xAC01;&#xAC01;&#xC758; tuple&#xB85C;&#xBD80;&#xD130;Key&#xC640;Value&#xAC1D;&#xCCB4;&#xB97C;&#xC0DD;&#xC131;&#xD560;&#xC218;&#xC788;&#xB2E4;.&#xC774;&#xB97C; emplace&#xC5D0;&#xC801;&#xC6A9;&#xC2DC;&#xCF1C;&#xC11C;&#xC0AC;&#xC6A9;&#xD558;&#xBA74;&#xB2E4;&#xC74C;&#xACFC;&#xAC19;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">associative_container.emplace(
    std::piecewise_construct,
    std::forward_as_tuple(a_instance),
    std::forward_as_tuple(b_instance)
);
</code></pre>
<!--kg-card-end: markdown--><p>&#xC704;&#xC640;&#xAC19;&#xC740;&#xC811;&#xADFC;&#xBC95;&#xC740;&#xC0DD;&#xC131;&#xC790;&#xAC00;2&#xAC1C;&#xC774;&#xC0C1;&#xC778;&#xACBD;&#xC6B0;&#xC5D0;&#xB3C4; emplace&#xB97C;&#xD638;&#xCD9C;&#xD558;&#xAE30;&#xC704;&#xD574;&#xC0AC;&#xC6A9;&#xD588;&#xC73C;&#xB098;,1&#xAC1C;&#xC758;&#xACBD;&#xC6B0;&#xC5D0;&#xB3C4;&#xBE4C;&#xB4DC;&#xAC00;&#xB418;&#xC9C0;&#xC54A;&#xC544;&#xC11C;&#xC801;&#xC6A9;&#xC2DC;&#xCF30;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[C++11 / C++17 함수 존재 확인 후 기본 행동 정의하기]]></title><description><![CDATA[C++11에서 템플릿을 사용하면 원하는 멤버함수가 존재하는지 여부도 확인하고 없을 경우 기본 로직을 사용하도록 설정할 수 있다.  이 글에서 어떻게 다른 클래스들을 같이 처리할 수 있는지에 대해 실제 gcc-c++ 의 glibcxx 헤더파일과 예시를 통해 보여주려고 한다.]]></description><link>https://elenesgu.dev/how-to-detect-the-existence-of-a-member-functions-in-the-given-class-and-define-default-behavior/</link><guid isPermaLink="false">5d76f9f5abbd9100017cad40</guid><category><![CDATA[C++]]></category><category><![CDATA[developemnt]]></category><dc:creator><![CDATA[Seungmin Lee]]></dc:creator><pubDate>Wed, 11 Sep 2019 11:00:00 GMT</pubDate><content:encoded><![CDATA[<h1 id="c-11-17-how-to-detect-the-existence-of-a-member-functions-in-the-given-class-and-define-default-behavior">C++11/17: How to detect the existence of a member functions in the given class and define default behavior</h1><p> C++&#xC5D0;&#xC11C; &#xB2E4;&#xB978; &#xD0C0;&#xC785;&#xC744; &#xAC16;&#xB294; &#xAC1D;&#xCCB4;&#xB4E4;&#xC744; &#xAC19;&#xC740; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;&#xB85C; &#xC811;&#xADFC; &#xB610;&#xB294; &#xD65C;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xC27D;&#xAC8C; &#xC811;&#xADFC;&#xD560; &#xC218; &#xC788;&#xB294; &#xBC29;&#xBC95; &#xC911; &#xD558;&#xB098;&#xB294; &#xC0C1;&#xC18D;&#xC744; &#xC0AC;&#xC6A9;&#xD55C; &#xD074;&#xB798;&#xC2A4; &#xB2E4;&#xD615;&#xC131;&#xC744; &#xAE30;&#xBC18;&#xC73C;&#xB85C;&#xD55C; &#xBC29;&#xBC95;&#xC774;&#xB2E4;. &#xAC19;&#xC740; &#xD074;&#xB798;&#xC2A4;&#xB97C; public &#xC0C1;&#xC18D;&#xBC1B;&#xC740; &#xB2E4;&#xC591;&#xD55C; &#xD0C0;&#xC785;&#xC758; &#xD074;&#xB798;&#xC2A4;&#xB4E4;&#xC740; &#xAC19;&#xC740; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;&#xB97C; &#xC9C0;&#xB2D0; &#xC218; &#xC788;&#xACE0;, &#xAC00;&#xC0C1; &#xD568;&#xC218; &#xD14C;&#xC774;&#xBE14;&#xC744; &#xD65C;&#xC6A9;&#xD558;&#xC5EC; &#xAC01;&#xAE30; &#xB2E4;&#xB978; &#xB85C;&#xC9C1;&#xC744; &#xC791;&#xB3D9;&#xC2DC;&#xD0AC; &#xC218; &#xC788;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xC0C1;&#xC18D;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xBC29;&#xBC95;&#xB3C4; &#xC874;&#xC7AC;&#xD55C;&#xB2E4;. C++&#xC758; &#xD15C;&#xD50C;&#xB9BF; &#xAE30;&#xB2A5;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xACF5;&#xD1B5; &#xBD80;&#xBAA8;&#xAC00; &#xC5C6;&#xACE0;, &#xC2EC;&#xC9C0;&#xC5B4; &#xB2E4;&#xD615;&#xC131;&#xB3C4; &#xB9CC;&#xC871;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xD074;&#xB798;&#xC2A4; &#xD0C0;&#xC785;&#xB4E4;&#xC758; &#xAC1D;&#xCCB4;&#xB3C4; &#xC77C;&#xAD00;&#xB418;&#xAC8C; &#xCC98;&#xB9AC;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xD2B9;&#xC815; attribute&#xB97C; &#xC815;&#xC758;&#xD558;&#xACE0;, &#xADF8;&#xAC83;&#xC744; &#xB9CC;&#xC871;&#xD558;&#xB294; &#xD074;&#xB798;&#xC2A4;&#xB4E4;&#xC5D0; &#xB300;&#xD574; &#xB2E4;&#xC591;&#xD55C; &#xB85C;&#xC9C1; &#xD328;&#xC2A4;&#xB85C; &#xCC98;&#xB9AC;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xD2B9;&#xD788; &#xC6D0;&#xD558;&#xB294; &#xBA64;&#xBC84;&#xD568;&#xC218;&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xB294;&#xC9C0; &#xC5EC;&#xBD80;&#xB3C4; &#xD655;&#xC778;&#xD558;&#xACE0; &#xC5C6;&#xC744; &#xACBD;&#xC6B0; &#xAE30;&#xBCF8; &#xB85C;&#xC9C1;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB3C4;&#xB85D; &#xC124;&#xC815;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xA0;&#xC774; &#xAE00;&#xC5D0;&#xC11C; &#xD15C;&#xD50C;&#xB9BF; &#xAE30;&#xB2A5;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xC5B4;&#xB5BB;&#xAC8C; &#xB2E4;&#xB978; &#xD074;&#xB798;&#xC2A4;&#xB4E4;&#xC744; &#xAC19;&#xC774; &#xCC98;&#xB9AC;&#xD560; &#xC218; &#xC788;&#xB294;&#xC9C0;&#xC5D0; &#xB300;&#xD574; &#xC2E4;&#xC81C; gcc-c++ &#xC758; glibcxx &#xD5E4;&#xB354;&#xD30C;&#xC77C;&#xACFC; &#xC608;&#xC2DC;&#xB97C; &#xD1B5;&#xD574; &#xBCF4;&#xC5EC;&#xC8FC;&#xB824;&#xACE0; &#xD55C;&#xB2E4;.</p><h2 id="iterator-iterator_tratis">iterator &amp; iterator_tratis</h2><p>&#xD15C;&#xD50C;&#xB9BF;&#xC744; &#xD1B5;&#xD55C; &#xB2E4;&#xC591;&#xD55C; &#xD074;&#xB798;&#xC2A4;&#xC758; &#xACF5;&#xD1B5;&#xB41C; &#xB85C;&#xC9C1;&#xC758; &#xD65C;&#xC6A9;&#xC744; &#xC6B0;&#xB9AC;&#xAC00; &#xAC00;&#xC7A5; &#xC27D;&#xAC8C; &#xC811;&#xD558;&#xB294; &#xBD80;&#xBD84;&#xC740; STL&#xC758; &#xCEE8;&#xD14C;&#xC774;&#xB108; &#xD074;&#xB798;&#xC2A4;&#xB4E4;&#xC758; iterator&#xB4E4; &#xC77C; &#xAC83;&#xC774;&#xB2E4;. algorithm &#xD5E4;&#xB354; &#xB4F1;&#xC5D0; &#xC874;&#xC7AC;&#xD558;&#xB294; iterator &#xAE30;&#xBC18; &#xD568;&#xC218;&#xB4E4;&#xC740; iterator&#xC758; &#xD0C0;&#xC785;&#xC744; &#xD074;&#xB798;&#xC2A4; &#xC778;&#xC790;&#xB85C; &#xBC1B;&#xC544; &#xCC98;&#xB9AC;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;. &#xC774; &#xB54C;, &#xAC01; iterator&#xB4E4;&#xC5D0; &#xB300;&#xD574; &#xACF5;&#xD1B5;&#xB41C; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xAE30; &#xC704;&#xD574; iterator_traits&#xC774;&#xB77C;&#xB294; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xBCC4;&#xB3C4;&#xB85C; &#xC815;&#xC758;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;. &#xBB3C;&#xB860; iterator&#xB4E4;&#xC5D0; &#xB300;&#xD574;&#xC11C; iterator_traits&#xB9CC; &#xC815;&#xC758;&#xB418;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2C8;&#xB77C; &#xD2B9;&#xC815; &#xC131;&#xC9C8;&#xC744; &#xB9CC;&#xC871;&#xD574;&#xC57C; &#xD55C;&#xB2E4;&#xACE0; &#xBA85;&#xC2DC;&#xD558;&#xACE0; &#xC788;&#xB2E4;. &#xB2E4;&#xC74C;&#xC740; iterator&#xB4E4;, &#xD2B9;&#xD788; LegacyIterator&#xC5D0; &#xB300;&#xD55C; &#xC694;&#xAD6C;&#xC870;&#xAC74;&#xC774;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-text">The type It satisfies LegacyIterator if
    The type It satisfies CopyConstructible, and
    The type It satisfies CopyAssignable, and
    The type It satisfies Destructible, and
    lvalues of type It satisfy Swappable, and
    std::iterator_traits&lt;It&gt; has member typedefs value_type, 
    difference_type, reference, pointer, and iterator_category , and 
Given
    r, an lvalue of type It. 
The following expressions must be valid and have their specified effects:
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502; Expression &#x2502; Return Type &#x2502; Precondition        &#x2502;
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502; *r         &#x2502; unspecified &#x2502; r is dereferenceable|
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502;  ++r 	     &#x2502;    It&amp;      &#x2502; r is incrementable  &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre>
<p>from <a href="https://en.cppreference.com/w/cpp/named_req/Iterator?ref=elenesgu.dev">https://en.cppreference.com/w/cpp/named_req/Iterator</a></p>
<!--kg-card-end: markdown--><p>&#xD2B9;&#xD788;, iterator_traits&#xC5D0; &#xB300;&#xD574; &#xD544;&#xC694;&#xD55C; &#xC0AC;&#xD56D;&#xC5D0; &#xB300;&#xD558; &#xAE30;&#xC220;&#xD558;&#xACE0; &#xC788;&#xB294;&#xB370;, &#xADF8; &#xC911; iterator_category&#xB97C; &#xD1B5;&#xD574; iterator&#xC758; &#xC131;&#xC9C8;&#xC744; &#xAD6C;&#xBD84;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;. &#xC774;&#xB97C; &#xC774;&#xC6A9;&#xD55C; &#xB300;&#xD45C;&#xC801;&#xC778; &#xD568;&#xC218;&#xAC00; std::distance&#xC774;&#xB2E4;. iterator_category&#xC758; &#xD0C0;&#xC785;&#xC744; &#xD1B5;&#xD574; &#xD604;&#xC7AC; iterator &#xD074;&#xB798;&#xC2A4;&#xAC00; &#xC784;&#xC758;&#xC811;&#xADFC;&#xC774; &#xAC00;&#xB2A5;&#xD55C;&#xC9C0; &#xC5EC;&#xBD80;&#xB97C; &#xD655;&#xC778;&#xD55C;&#xB2E4;. &#xC2E4;&#xC81C; GLIBCXX&#xC758; &#xAD6C;&#xD604; &#xD5E4;&#xB354;&#xD30C;&#xC77C;&#xC744; &#xBCF4;&#xBA74;, random_access_iterator_tag&#xB97C; &#xC9C0;&#xB2CC; iterator_traits&#xC77C; &#xB54C;&#xC640; &#xC544;&#xB2D0; &#xACBD;&#xC6B0;&#xB97C; &#xD568;&#xC218; &#xC624;&#xBC84;&#xB85C;&#xB529;&#xC744; &#xD1B5;&#xD574; &#xC54C;&#xB9DE;&#xC740; &#xB85C;&#xC9C1;&#xC744; &#xCC3E;&#xC544;&#xAC00;&#xB3C4;&#xB85D; &#xAD6C;&#xD604;&#xD558;&#xC600;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-cpp">template&lt;typename _InputIterator&gt;
inline _GLIBCXX17_CONSTEXPR
typename iterator_traits&lt;_InputIterator&gt;::difference_type
distance(_InputIterator __first, _InputIterator __last)
{
  // concept requirements -- taken care of in __distance
  return std::__distance(__first, __last,
             std::__iterator_category(__first));
}

template&lt;typename _InputIterator&gt;
inline _GLIBCXX14_CONSTEXPR
typename iterator_traits&lt;_InputIterator&gt;::difference_type
__distance(_InputIterator __first, _InputIterator __last,
           input_iterator_tag)
{
  // concept requirements
  __glibcxx_function_requires(_InputIteratorConcept&lt;_InputIterator&gt;)

  typename iterator_traits&lt;_InputIterator&gt;::difference_type __n = 0;
  while (__first != __last)
  {
    ++__first;
    ++__n;
  }
  return __n;
}

template&lt;typename _RandomAccessIterator&gt;
inline _GLIBCXX14_CONSTEXPR
typename iterator_traits&lt;_RandomAccessIterator&gt;::difference_type
__distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
           random_access_iterator_tag)
{
  // concept requirements
  __glibcxx_function_requires(_RandomAccessIteratorConcept&lt;
              _RandomAccessIterator&gt;)
  return __last - __first;
}
</code></pre>
<!--kg-card-end: markdown--><p>&#xC704; &#xD568;&#xC218;&#xB97C; std::vector &#xD0C0;&#xC785;&#xC758; iterator&#xC5D0; &#xB300;&#xD574; &#xD638;&#xCD9C;&#xD588;&#xC744; &#xACBD;&#xC6B0;, std::vector::iterator&#xC758; iterator_traits (&#xB610;&#xB294; iterator &#xADF8; &#xC790;&#xCCB4;)&#xAC00; random_access_iterator_tag&#xB97C; &#xC9C0;&#xB2C8;&#xACE0; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xB450; iterator&#xC758; &#xBE84;&#xC148;&#xC744; &#xD1B5;&#xD574; distance&#xAC12;&#xC744; &#xC5BB;&#xC5B4;&#xB0BC; &#xC218; &#xC788;&#xB2E4;. &#xC2E4;&#xC81C;&#xB85C; std::vector&#xC758; &#xCF54;&#xB4DC;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">template&lt;typename _Tp, typename _Alloc = std::allocator&lt;_Tp&gt; &gt;
class vector : protected _Vector_base&lt;_Tp, _Alloc&gt;
{
  typedef _Vector_base&lt;_Tp, _Alloc&gt;                     _Base;
public:
  typedef _Tp                                           value_type;
  typedef typename _Base::pointer                       pointer;
  typedef __gnu_cxx::__normal_iterator&lt;pointer, vector&gt; iterator;
};

template&lt;typename _Iterator, typename _Container&gt;
class __normal_iterator
{
protected:
  _Iterator _M_current;
  typedef iterator_traits&lt;_Iterator&gt; __traits_type;
public:
  typedef typename __traits_type::iterator_category iterator_category;
};

template&lt;typename _Tp&gt;
struct iterator_traits&lt;_Tp*&gt;
{
  typedef random_access_iterator_tag  iterator_category;
};

</code></pre>
<!--kg-card-end: markdown--><p>STL&#xC5D0;&#xC11C;&#xB294; &#xC774;&#xB807;&#xAC8C; &#xC5B4;&#xB5A4; &#xD074;&#xB798;&#xC2A4;&#xB4E4;&#xC774; &#xB9CC;&#xC871;&#xC2DC;&#xCF1C;&#xC57C; &#xD560; &#xC131;&#xC9C8;&#xC744; &#xAE30;&#xC220;&#xD55C; requirement &#xADF8;&#xB9AC;&#xACE0; &#xADF8;&#xAC83;&#xC744; &#xC9C0;&#xC6D0;&#xD558;&#xAE30; &#xC704;&#xD55C; traits, tags &#xB4F1;&#xC758; &#xBCF4;&#xC870; &#xD0C0;&#xC785;&#xB4E4;&#xC744; &#xD1B5;&#xD574; &#xC5EC;&#xB7EC; &#xB2E4;&#xB978; &#xD074;&#xB798;&#xC2A4;&#xB4E4;&#xC744; &#xB2E4;&#xB8E8;&#xACE0; &#xC788;&#xB2E4;.</p><h2 id="allocator-allocator_traits">allocator &amp; allocator_traits</h2><p>iterator&#xC5D0;&#xC11C; &#xB208;&#xC744; &#xB3CC;&#xB824; allocator&#xC5D0; &#xC8FC;&#xBAA9;&#xD558;&#xBA74; &#xC5EC;&#xAE30;&#xC11C;&#xB294; &#xB2E4;&#xB978; &#xBC29;&#xC2DD;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778; &#xD560; &#xC218; &#xC788;&#xB2E4;. allocator_traits&#xC774; &#xADF8; &#xC8FC;&#xC5ED;&#xC774;&#xB2E4;. STL &#xCEE8;&#xD14C;&#xC774;&#xB108;&#xB4E4;&#xC740; &#xB3D9;&#xC801; &#xBA54;&#xBAA8;&#xB9AC; &#xD560;&#xB2F9;&#xC774; &#xD544;&#xC694;&#xD560; &#xB54C; &#xC774;&#xB97C; &#xC704;&#xD55C; &#xC804;&#xB7B5;&#xC758; &#xB2E4;&#xBCC0;&#xD654;&#xB97C; &#xC704;&#xD574; allocator&#xB97C; &#xD15C;&#xD50C;&#xB9BF; &#xD615;&#xD0DC;&#xB85C; &#xC778;&#xC790;&#xB85C; &#xBC1B;&#xB294;&#xB2E4;. &#xC9C0;&#xC815;&#xD574; &#xC8FC;&#xC9C0; &#xC54A;&#xC73C;&#xBA74; std::allocator&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0;&#xB9CC; &#xD544;&#xC694;&#xD558;&#xB2E4;&#xBA74; &#xCEE4;&#xC2A4;&#xD140;&#xD55C; allocator&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xC774; &#xB54C;, &#xAC01; allocator&#xB4E4;&#xC5D0; &#xB300;&#xD574; &#xAC19;&#xC740; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD574; &#xD544;&#xC694;&#xD55C; &#xAC83;&#xC774; allocator_traits&#xC774;&#xB2E4;. iterator&#xC640; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; allocator&#xB3C4; &#xB9CC;&#xC871;&#xD574;&#xC57C;&#xD560; &#xC131;&#xC9C8;&#xB4E4;&#xC774; &#xC788;&#xB2E4;. <a href="https://en.cppreference.com/w/cpp/named_req/Allocator?ref=elenesgu.dev">&#xB9C1;&#xD06C;</a>&#xC5D0;&#xC11C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xC8FC;&#xBAA9;&#xD574;&#xC57C; &#xD560; &#xAC83;&#xC740;, allocate, deallocate, construct, destroy &#xD568;&#xC218; 4&#xAC1C;&#xC774;&#xB2E4;. &#xAC01;&#xAC01; &#xBA54;&#xBAA8;&#xB9AC;&#xB97C; &#xD560;&#xB2F9;, &#xD574;&#xC81C;&#xD558;&#xACE0; &#xAC1D;&#xCCB4;&#xB97C; &#xC0DD;&#xC131;, &#xC18C;&#xBA78;&#xC744; &#xB2F4;&#xB2F9;&#xD558;&#xB294; &#xD568;&#xC218;&#xC774;&#xB2E4;. &#xC774; &#xC911; allocate&#xC640; deallocate&#xB9CC; &#xD544;&#xC218;&#xB85C; &#xC874;&#xC7AC;&#xD574;&#xC57C;&#xD558;&#xB294; &#xD568;&#xC218;&#xC774;&#xACE0; construct&#xC640; destroy&#xB294; optional &#xD568;&#xC218;&#xC774;&#xB2E4;. optional &#xD568;&#xC218; 2&#xAC1C;&#xB97C; &#xC815;&#xC758;&#xD558;&#xC9C0; &#xC54A;&#xC740; allocator&#xB4E4;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB3C4; &#xC6B0;&#xB9AC;&#xB294; STL &#xCEE8;&#xD14C;&#xC774;&#xB108;&#xAC00; &#xC62C;&#xBC14;&#xB974;&#xAC8C; &#xC791;&#xB3D9;&#xD558;&#xB294; &#xAC83;&#xC744; &#xBCFC; &#xC218; &#xC788;&#xB294;&#xB370;, &#xD574;&#xB2F9; &#xD568;&#xC218;&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xC744; &#xACBD;&#xC6B0; &#xB300;&#xC2E0; &#xC218;&#xD589;&#xD560; default behavior&#xAC00; &#xC815;&#xC758;&#xB418;&#xC5B4; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xB2E4;. &#xADF8;&#xB9AC;&#xACE0; &#xADF8; &#xC5ED;&#xD560;&#xC744; allocator_traits&#xC774; &#xB2F4;&#xB2F9;&#xD55C;&#xB2E4;. &#xB2E4;&#xC74C; &#xCF54;&#xB4DC;&#xB85C;&#xBD80;&#xD130; vector&#xC5D0;&#xC11C; &#xACF5;&#xAC04;&#xC744; &#xD560;&#xB2F9;&#xD558;&#xAC70;&#xB098; &#xAC1D;&#xCCB4;&#xB97C; &#xC0DD;&#xC131;&#xD560; &#xB54C; allocator_traits&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xBAA8;&#xC2B5;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">template&lt;typename _Tp, typename _Alloc&gt;
struct _Vector_base
{
  pointer
  _M_allocate(size_t __n)
  {
    typedef __gnu_cxx::__alloc_traits&lt;_Tp_alloc_type&gt; _Tr;
    return __n != 0 ? _Tr::allocate(_M_impl, __n) : pointer();
  }
  void
  push_back(const value_type&amp; __x)
  {
    if (this-&gt;_M_impl._M_finish != this-&gt;_M_impl._M_end_of_storage)
    {
      _Alloc_traits::construct(this-&gt;_M_impl, this-&gt;_M_impl._M_finish, __x);
      ++this-&gt;_M_impl._M_finish;
    }
    else
      _M_realloc_insert(end(), __x);
  }
};
</code></pre>
<!--kg-card-end: markdown--><p>&#xC5EC;&#xAE30;&#xC11C; &#xD575;&#xC2EC;&#xC744; &#xC54C;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; allocator_traits&#xC758; construct &#xD568;&#xC218;&#xAC00; construct&#xD568;&#xC218;&#xAC00; &#xC815;&#xC758;&#xB418;&#xC5B4;&#xC788;&#xC9C0; &#xC54A;&#xC740; allocator&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC5B4;&#xB5A4; &#xD589;&#xB3D9;&#xC744; &#xD558;&#xB294;&#xC9C0;&#xB97C; &#xD30C;&#xC545;&#xD574;&#xC57C;&#xD55C;&#xB2E4;. &#xD574;&#xB2F9; &#xD568;&#xC218;&#xC758; &#xCF54;&#xB4DC;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">template&lt;typename _Tp, typename... _Args&gt;
using __has_construct
  = typename __construct_helper&lt;_Tp, _Args...&gt;::type;

template&lt;typename _Alloc&gt;
struct allocator_traits : __allocator_traits_base
{
  template&lt;typename _Tp, typename... _Args&gt;
  static _Require&lt;__has_construct&lt;_Tp, _Args...&gt;&gt;
  _S_construct(_Alloc&amp; __a, _Tp* __p, _Args&amp;&amp;... __args)
  { __a.construct(__p, std::forward&lt;_Args&gt;(__args)...); }

  template&lt;typename _Tp, typename... _Args&gt;
  static
  _Require&lt;__and_&lt;__not_&lt;__has_construct&lt;_Tp, _Args...&gt;&gt;,
  is_constructible&lt;_Tp, _Args...&gt;&gt;&gt;
  _S_construct(_Alloc&amp;, _Tp* __p, _Args&amp;&amp;... __args)
  { ::new((void*)__p) _Tp(std::forward&lt;_Args&gt;(__args)...); }
};
</code></pre>
<!--kg-card-end: markdown--><p>&#xB9AC;&#xD134;&#xD0C0;&#xC785;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74; _Require&#xC640; __has_construct&#xB77C;&#xB294; &#xD5EC;&#xD37C; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xB294;&#xAC83;&#xC73C;&#xB85C; &#xBCF4;&#xC778;&#xB2E4;. _Require&#xB294; std::enable_if&#xC758; aliasing&#xC73C;&#xB85C;, SFINAE&#xC744; &#xD65C;&#xC6A9;&#xD574;&#xC11C; &#xD574;&#xB2F9; &#xBA64;&#xBC84; &#xD568;&#xC218;&#xAC00; &#xC788;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD558;&#xACE0; &#xC788;&#xB2E4;. __has_construct &#xD5EC;&#xD37C; &#xD074;&#xB798;&#xC2A4;&#xAC00; &#xC2E4;&#xC81C;&#xB85C; &#xD568;&#xC218;&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD558;&#xB294; &#xC5ED;&#xD560;&#xC744; &#xD55C;&#xB2E4;. __has_construct&#xC5D0;&#xC11C; &#xC5B4;&#xB5BB;&#xAC8C; &#xD568;&#xC218;&#xC758; &#xC874;&#xC7AC;&#xB97C; &#xD655;&#xC778;&#xD558;&#xACE0; &#xC788;&#xB294;&#xC9C0; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">using true_type = std::integral_constant&lt;bool, true&gt;;
using false_type = std::integral_constant&lt;bool, false&gt;;
template&lt;typename _Tp, typename... _Args&gt;
struct __construct_helper
{
  template&lt;typename _Alloc2,
  typename = decltype(std::declval&lt;_Alloc2*&gt;()-&gt;construct(
      std::declval&lt;_Tp*&gt;(), std::declval&lt;_Args&gt;()...))&gt;
  static true_type __test(int);

  template&lt;typename&gt;
  static false_type __test(...);

  using type = decltype(__test&lt;_Alloc&gt;(0));
};
</code></pre>
<!--kg-card-end: markdown--><p>&#xADF8;&#xB807;&#xAC8C; &#xBCF5;&#xC7A1;&#xD558;&#xC9C0; &#xC54A;&#xB2E4;. &#xD574;&#xB2F9; &#xD074;&#xB798;&#xC2A4;&#xC758; &#xBA64;&#xBC84;&#xBCC0;&#xC218;&#xAC00; &#xD638;&#xCD9C;&#xB418;&#xB294;&#xC9C0; &#xC5EC;&#xBD80;&#xB97C; &#xD655;&#xC778;&#xD560; &#xBFD0;&#xC774;&#xB2E4;. std::declval&#xC744; &#xD1B5;&#xD574; &#xAC1D;&#xCCB4;&#xC0DD;&#xC131; &#xC5C6;&#xC774; &#xD568;&#xC218;&#xB97C; &#xD638;&#xCD9C;&#xC2DC;&#xB3C4;&#xD558;&#xACE0; &#xC778;&#xC790;&#xB3C4; &#xC5ED;&#xC2DC; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; std::declval&#xC744; &#xD1B5;&#xD574; &#xAC1D;&#xCCB4;&#xC0DD;&#xC131;&#xC5C6;&#xC774; &#xC804;&#xB2EC;&#xC2DC;&#xB3C4;&#xB97C; &#xD574;&#xBCF8;&#xB2E4;. &#xC989;, &#xCEF4;&#xD30C;&#xC77C; &#xC2DC;&#xB3C4;&#xB97C; &#xD574;&#xBCF8;&#xB2E4;. std::declval&lt;_Alloc2*&gt;()-&gt;construct(std::declval&lt;_Tp*&gt;(), std::declval&lt;_Args&gt;()...) &#xAC00; &#xBC14;&#xB85C; &#xADF8; &#xBD80;&#xBD84;&#xC774;&#xB2E4;. _Alloc2 &#xD074;&#xB798;&#xC2A4;&#xC5D0; construct&#xB77C;&#xB294; &#xBA64;&#xBC84;&#xD568;&#xC218;&#xAC00; &#xC5C6;&#xAC70;&#xB098;, &#xB610;&#xB294; &#xC874;&#xC7AC;&#xD558;&#xB354;&#xB77C;&#xB3C4; &#xD568;&#xC218;&#xC758; &#xC2DC;&#xADF8;&#xB2C8;&#xCC98;&#xAC00; &#xB2E4;&#xB974;&#xB2E4;&#xBA74; &#xC2DC;&#xB9E8;&#xD2F1; &#xC5D0;&#xB7EC;&#xAC00; &#xBC1C;&#xC0DD;&#xD560; &#xAC83;&#xC774;&#xACE0;, SFINAE&#xC5D0; &#xB530;&#xB77C; &#xC774;&#xB294; &#xCEF4;&#xD30C;&#xC77C; &#xC5D0;&#xB7EC;&#xB85C; &#xC774;&#xC5B4;&#xC9C0;&#xC9C0; &#xC54A;&#xACE0; &#xB2E4;&#xC74C; substitution&#xC744; &#xCC3E;&#xAC8C; &#xB41C;&#xB2E4;. &#xC774;&#xB294; &#xACE7; &#xC544;&#xB798;&#xC904;&#xC758; false_type __test(...)&#xC5D0; &#xD574;&#xB2F9;&#xD55C;&#xB2E4;. &#xC885;&#xD569;&#xC801;&#xC73C;&#xB85C; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74; __test&lt;_Alloc&gt;&#xC744; &#xBC1C;&#xACAC;&#xD55C; &#xD15C;&#xD50C;&#xB9BF; &#xC5D4;&#xC9C4;&#xC774; 2&#xAC1C;&#xC758; __test&#xC911; substitution&#xC744; &#xC2DC;&#xB3C4;&#xD574; &#xBCFC; &#xAC83;&#xC774;&#xACE0;, &#xC131;&#xACF5;&#xD55C; &#xD568;&#xC218;&#xB9CC; &#xC0AC;&#xC6A9;&#xD560; &#xAC83;&#xC774;&#xB2E4;. &#xADF8; &#xC774;&#xD6C4; &#xC131;&#xACF5;&#xD55C; &#xD568;&#xC218;&#xC758; &#xB9AC;&#xD134;&#xAC12;&#xC774; &#xCEF4;&#xD30C;&#xC77C; &#xD0C0;&#xC784; &#xC0C1;&#xC218;&#xB97C; &#xB098;&#xD0C0;&#xB0B4;&#xB294; &#xD074;&#xB798;&#xC2A4;&#xC774;&#xBBC0;&#xB85C; &#xC774;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;.</p><p>_Require &#xB610;&#xB294; std::enable_if&#xB294; &#xCCAB;&#xBC88;&#xC9F8; &#xD15C;&#xD50C;&#xB9BF; &#xC778;&#xC790;&#xC758; &#xCEF4;&#xD30C;&#xC77C; &#xD0C0;&#xC785; &#xC0C1;&#xC218; &#xBD88;&#xB9AC;&#xC5B8; &#xAC12;&#xC744; &#xBCF4;&#xACE0; true&#xC77C; &#xACBD;&#xC6B0;&#xC5D0;&#xB9CC; &#xC720;&#xC694;&#xD55C; &#xD074;&#xB798;&#xC2A4;&#xAC00; &#xB418;&#xBBC0;&#xB85C;, construct&#xD568;&#xC218;&#xAC00; &#xD638;&#xCD9C; &#xAC00;&#xB2A5;&#xD560; &#xACBD;&#xC6B0;&#xC640; &#xBD88;&#xAC00;&#xB2A5; &#xD560; &#xACBD;&#xC6B0;&#xB97C; &#xAD6C;&#xBD84;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xBD88;&#xAC00;&#xB2A5; &#xD560; &#xACBD;&#xC6B0; ::new&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; default behavior&#xB97C; &#xD1B5;&#xD574; &#xAC1D;&#xCCB4;&#xC0DD;&#xC131;&#xC744; &#xD558;&#xAC8C; &#xB41C;&#xB2E4;. &#xBCC4;&#xB3C4;&#xC758; &#xC0DD;&#xC131;&#xC790; &#xD638;&#xCD9C; &#xAC00;&#xB2A5; &#xC5EC;&#xBD80;&#xB97C; &#xD655;&#xC778;&#xD558;&#xB294; &#xCF54;&#xB4DC;&#xAC00; &#xC788;&#xC9C0;&#xB9CC; &#xD575;&#xC2EC;&#xC740; &#xACB0;&#xAD6D; __construct_helper&#xC774;&#xB2E4;.</p><h2 id="sfinae-based-default-behavior">SFINAE based default behavior</h2><p>&#xC774;&#xB97C; &#xCC38;&#xACE0;&#xD558;&#xC5EC; &#xD2B9;&#xC815; &#xBA64;&#xBC84; &#xD568;&#xC218;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xAC80;&#xCD9C; &#xBC0F; default behavior&#xB97C; &#xC124;&#xC815;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xB2E4;&#xC74C;&#xC740; Func&#xC774;&#xB77C;&#xB294; &#xC774;&#xB984;&#xC758; &#xBA64;&#xBC84; &#xD568;&#xC218;&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xB294;&#xC9C0; &#xC5EC;&#xBD80;&#xB97C; &#xD655;&#xC778;&#xD558;&#xB294; &#xBCF4;&#xC870; &#xD074;&#xB798;&#xC2A4;&#xC774;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">template&lt;class T, class... Args&gt;
struct DetectFunctionHelper {
    template&lt;class T2,
    typename = decltype(std::declval&lt;T2*&gt;()-&gt;Func(std::declval&lt;Args&gt;()...))&gt;
    static std::integral_constant&lt;bool, true&gt; test(int);

    template&lt;typename&gt;
    static std::integral_constant&lt;bool, false&gt; test(...);

    using type = decltype(test&lt;T&gt;(0));
};

template&lt;class T, class... Args&gt;
using HaveFunc = typename DetectFunctionHelper&lt;T, Args...&gt;::type;
</code></pre>
<!--kg-card-end: markdown--><p>&#xC774; &#xBCF4;&#xC870; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xC5EC; Func&#xD568;&#xC218;&#xAC00; &#xC788;&#xC744; &#xACBD;&#xC6B0;&#xC640; &#xC5C6;&#xC744; &#xACBD;&#xC6B0;&#xC5D0; &#xB300;&#xD55C; &#xC608;&#xC81C; &#xCF54;&#xB4DC;&#xC774;&#xB2E4;. Func &#xB77C;&#xB294; &#xC774;&#xB984;&#xC758; &#xBA64;&#xBC84; &#xD568;&#xC218;&#xAC00; &#xC8FC;&#xC5B4;&#xC9C4; &#xC778;&#xC790;&#xB97C; &#xC774;&#xC6A9;&#xD558;&#xC5EC; &#xD638;&#xCD9C;&#xAC00;&#xB2A5; &#xD560; &#xACBD;&#xC6B0; &#xC62C;&#xBC14;&#xB974;&#xAC8C; &#xD638;&#xCD9C;&#xD558;&#xBA70;, &#xADF8; &#xC678;&#xC758; &#xACBD;&#xC6B0; default behavior&#xB97C; &#xC218;&#xD589;&#xD55C;&#xB2E4;. &#xD074;&#xB798;&#xC2A4; A&#xC758; &#xACBD;&#xC6B0; Func &#xB77C;&#xB294; &#xC774;&#xB984;&#xC758; &#xD568;&#xC218;&#xAC00; &#xC778;&#xC790;&#xAC00; &#xC5C6;&#xC744; &#xACBD;&#xC6B0;(void)&#xC5D0;&#xB9CC; &#xD638;&#xCD9C; &#xAC00;&#xB2A5;&#xD558;&#xBBC0;&#xB85C;, Wrapper<a>::Func(a, 0) &#xC758; &#xACBD;&#xC6B0; &#xD638;&#xCD9C; &#xBD88;&#xAC00;&#xB2A5;&#xD558;&#xBBC0;&#xB85C; default behavior&#xAC00; &#xD638;&#xCD9C;&#xB41C;&#xB2E4;.</a></p><!--kg-card-begin: markdown--><pre><code class="language-c++">struct A {
    void Func() {
        std::cout &lt;&lt; &quot;A::Func&quot; &lt;&lt; std::endl;
    }
};

struct B {
};

template&lt;class T&gt;
struct Wrapper {
private:
    template&lt;class U, class... Args&gt;
    static
    typename std::enable_if&lt;HaveFunc&lt;U, Args...&gt;::value&gt;::type
    __FuncHelper(U&amp; u, Args&amp;&amp; ...args) {
        u.Func(std::forward&lt;Args&gt;(args)...);
        std::cout &lt;&lt; &quot;Specified Func is called.&quot; &lt;&lt; std::endl;
    }
    template&lt;class U, class... Args&gt;
    static
    typename std::enable_if&lt;!HaveFunc&lt;U, Args...&gt;::value&gt;::type
    __FuncHelper(U&amp;, Args&amp;&amp; ...) {
        std::cout &lt;&lt; &quot;Default behavior is called.&quot; &lt;&lt; std::endl;
    }
public:
    template&lt;class... Args&gt;
    static auto Func(T&amp; t, Args&amp;&amp; ...args) -&gt; decltype(__FuncHelper(t, args...)) {
        __FuncHelper(t, std::forward&lt;Args&gt;(args)...);
    }
};

int main () {
    A a;
    B b;
    int i;
    Wrapper&lt;decltype(a)&gt;::Func(a); 
    Wrapper&lt;decltype(a)&gt;::Func(a, 0);
    Wrapper&lt;decltype(b)&gt;::Func(b);
    Wrapper&lt;decltype(i)&gt;::Func(i);
}

/*         output          */
/// A::Func
/// Specified Func is called.
/// Default behavior is called.
/// Default behavior is called.
/// Default behavior is called.
</code></pre>
<!--kg-card-end: markdown--><p>&#xC774; &#xBCF4;&#xC870; &#xD074;&#xB798;&#xC2A4;&#xC5D0;&#xC11C; &#xD568;&#xC218;&#xC758; &#xB9AC;&#xD134;&#xC744; &#xCC98;&#xB9AC;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; &#xCD94;&#xAC00;&#xC801;&#xC778; &#xC791;&#xC5C5;&#xC774; &#xD544;&#xC694;&#xD558;&#xB2E4;. C++14&#xC5D0;&#xC11C;&#xB294; auto &#xB97C; &#xD1B5;&#xD55C; &#xD568;&#xC218; &#xB9AC;&#xD134; &#xD0C0;&#xC785; &#xCD94;&#xB860;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xC9C0;&#xB9CC;, C++11&#xC77C; &#xACBD;&#xC6B0; decltype&#xC744; &#xD1B5;&#xD574; &#xC9C0;&#xC815;&#xD574; &#xC8FC;&#xC5B4;&#xC57C; &#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xCD94;&#xAC00;&#xC801;&#xC778; &#xC791;&#xC5C5;&#xC774; &#xD544;&#xC694;&#xD558;&#xB2E4;. &#xB2E4;&#xC74C; &#xCF54;&#xB4DC;&#xB294; &#xD568;&#xC218; &#xB9AC;&#xD134;&#xC774; void&#xC77C; &#xACBD;&#xC6B0;&#xC5D0;&#xB3C4; &#xC77C;&#xAD04;&#xB85C;&#xC9C1;&#xC744; &#xC791;&#xB3D9;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xBCC0;&#xACBD;&#xD55C; &#xCF54;&#xB4DC;&#xC774;&#xB2E4;. &#xC774; &#xC2DC;&#xB098;&#xB9AC;&#xC624;&#xB97C; &#xCC98;&#xB9AC;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; 3&#xAC00;&#xC9C0; &#xACBD;&#xC6B0;&#xC758; &#xC218;&#xB97C; &#xACE0;&#xB824;&#xD588;&#xB2E4;. 1) Func &#xD568;&#xC218;&#xAC00; &#xC874;&#xC7AC;&#xD560; &#xACBD;&#xC6B0;, &#xADF8;&#xB9AC;&#xACE0; &#xB9AC;&#xD134; &#xD0C0;&#xC785;&#xC774; void&#xAC00; &#xC544;&#xB2D0; &#xACBD;&#xC6B0;; 2) Func &#xD568;&#xC218;&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xC9C0;&#xB9CC; &#xB9AC;&#xD134; &#xD0C0;&#xC785;&#xC774; void&#xC77C; &#xACBD;&#xC6B0;; 3) Func &#xD568;&#xC218;&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xC744; &#xACBD;&#xC6B0;. &#xC774;&#xB7EC;&#xD55C; &#xACBD;&#xC6B0;&#xB97C; &#xACE0;&#xB824;&#xD558;&#xC5EC; &#xCC98;&#xB9AC;&#xD55C; &#xCF54;&#xB4DC;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">struct A {
    int Func() {
        std::cout &lt;&lt; &quot;A::Func&quot; &lt;&lt; std::endl;
        return 0;
    }
};

struct B {
};

struct SomeReturnType {};

template&lt;class T&gt;
struct Wrapper {
private:
    /// 1) Func &#xD568;&#xC218;&#xAC00; &#xC874;&#xC7AC;&#xD560; &#xACBD;&#xC6B0;, &#xADF8;&#xB9AC;&#xACE0; &#xB9AC;&#xD134; &#xD0C0;&#xC785;&#xC774; void&#xAC00; &#xC544;&#xB2D0; &#xACBD;&#xC6B0;
    template&lt;class U, class... Args&gt;
    static
    typename std::enable_if&lt;
        HaveFunc&lt;U, Args...&gt;::value
        &amp;&amp; !std::is_void&lt;
            decltype(std::declval&lt;U*&gt;()-&gt;Func(std::declval&lt;Args&gt;()...))
            &gt;::value,
    decltype(std::declval&lt;U*&gt;()-&gt;Func(std::declval&lt;Args&gt;()...))&gt;::type
    __FuncHelper(U&amp; u, Args&amp;&amp; ...args) {
        std::cout &lt;&lt; &quot;Specified Func is called.&quot; &lt;&lt; std::endl;
        return u.Func(std::forward&lt;Args&gt;(args)...);
    }
    
    /// 2) Func &#xD568;&#xC218;&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xC9C0;&#xB9CC; &#xB9AC;&#xD134; &#xD0C0;&#xC785;&#xC774; void&#xC77C; &#xACBD;&#xC6B0;
    template&lt;class U, class... Args&gt;
    static
    typename std::enable_if&lt;
        HaveFunc&lt;U, Args...&gt;::value
        &amp;&amp; std::is_void&lt;
            decltype(std::declval&lt;U*&gt;()-&gt;Func(std::declval&lt;Args&gt;()...))
            &gt;::value,
    SomeReturnType&gt;::type
    __FuncHelper(U&amp; u, Args&amp;&amp; ...args) {
        std::cout &lt;&lt; &quot;Specified Func is called.&quot; &lt;&lt; std::endl;
        u.Func(std::forward&lt;Args&gt;(args)...);
        return SomeReturnType();
    }
    
    /// 3) Func &#xD568;&#xC218;&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xC744; &#xACBD;&#xC6B0;
    template&lt;class U, class... Args&gt;
    static
    typename std::enable_if&lt;!HaveFunc&lt;U, Args...&gt;::value,
    SomeReturnType&gt;::type
    __FuncHelper(U&amp;, Args&amp;&amp; ...) {
        std::cout &lt;&lt; &quot;Default behavior is called.&quot; &lt;&lt; std::endl;
        return SomeReturnType();
    }
public:
    template&lt;class... Args&gt;
    static auto Func(T&amp; t, Args&amp;&amp; ...args)
    -&gt; decltype(__FuncHelper(std::declval&lt;T&amp;&gt;(), std::declval&lt;Args&gt;()...)) {
        return __FuncHelper(t, std::forward&lt;Args&gt;(args)...);
    }
};

template&lt;class T&gt;
void ProcessReturnValue(T&amp;&amp;) {
    std::cout &lt;&lt; &quot;Valid return type.&quot; &lt;&lt; std::endl;
}

template&lt;&gt;
void ProcessReturnValue&lt;SomeReturnType&amp;&gt;(SomeReturnType&amp;) {
    std::cout &lt;&lt; &quot;Invalid return type.&quot; &lt;&lt; std::endl;
}

template&lt;&gt;
void ProcessReturnValue&lt;SomeReturnType&amp;&amp;&gt;(SomeReturnType&amp;&amp;) {
    std::cout &lt;&lt; &quot;Invalid return type.&quot; &lt;&lt; std::endl;
}

int main () {
    A a;
    B b;
    int i;
    {
        auto&amp;&amp; ret = Wrapper&lt;decltype(a)&gt;::Func(a);
        ProcessReturnValue(ret);
    }
    std::cout &lt;&lt; &quot;====================&quot; &lt;&lt; std::endl;
    {
        auto&amp;&amp; ret = Wrapper&lt;decltype(a)&gt;::Func(a, 0);
        ProcessReturnValue(ret);
    }
    std::cout &lt;&lt; &quot;====================&quot; &lt;&lt; std::endl;
    {
        auto&amp;&amp; ret = Wrapper&lt;decltype(b)&gt;::Func(b);
        ProcessReturnValue(ret);
    }
    std::cout &lt;&lt; &quot;====================&quot; &lt;&lt; std::endl;
    {
        auto&amp;&amp; ret = Wrapper&lt;decltype(i)&gt;::Func(i);
        ProcessReturnValue(ret);
    }
}

/*         output          */
/// Specified Func is called.
/// A::Func
/// Valid return type.
/// ====================
/// Default behavior is called.
/// Invalid return type.
/// ====================
/// Default behavior is called.
/// Invalid return type.
/// ====================
/// Default behavior is called.
/// Invalid return type.
</code></pre>
<!--kg-card-end: markdown--><h3 id="c-17">C++17</h3><p>&#xC704; &#xC608;&#xC81C; &#xCF54;&#xB4DC;&#xB294; C++11&#xC5D0;&#xC11C; &#xB3CC;&#xC544;&#xAC00;&#xB294; &#xAC83;&#xC744; &#xBCF4;&#xC7A5;&#xD558;&#xB294; &#xCF54;&#xB4DC;&#xC774;&#xB2E4;. C++17&#xC5D0;&#xC11C;&#xB294; if constexpr&#xAE30;&#xB2A5;&#xC774; &#xB3C4;&#xC785;&#xC774; &#xB418;&#xC5C8;&#xACE0;, enable_if &#xB300;&#xC2E0; if constexpr&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xC544;&#xB798; &#xCF54;&#xB4DC;&#xB294; if constexpr&#xC744; &#xD65C;&#xC6A9;&#xD558;&#xC5EC; &#xAC19;&#xC740; &#xB3D9;&#xC791;&#xC744; &#xC218;&#xD589;&#xD55C;&#xB2E4;. enable_if&#xC640; SFINAE&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xCD94;&#xAC00;&#xC801;&#xC778; &#xD15C;&#xD50C;&#xB9BF; &#xD568;&#xC218;&#xAC00; &#xD544;&#xC694;&#xAC00; &#xC5C6;&#xC5B4;&#xC11C; &#xB354; &#xAC04;&#xACB0;&#xD558;&#xAC8C; &#xC791;&#xC131;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xB610;&#xD55C;, C++14&#xC5D0;&#xC11C; &#xCD94;&#xAC00;&#xB41C; &#xB9AC;&#xD134; &#xD0C0;&#xC785; &#xCD94;&#xB860;&#xACFC; &#xD568;&#xAED8; &#xD568;&#xC218;&#xC758; &#xB9AC;&#xD134; &#xCC98;&#xB9AC;&#xB3C4; &#xB354; &#xAC04;&#xD3B8;&#xD574;&#xC84C;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">template&lt;class T&gt;
struct Wrapper {
public:
    template&lt;class... Args&gt;
    static auto Func(T&amp; t, Args&amp;&amp; ...args) {
        if constexpr(HaveFunc&lt;T, Args...&gt;::value) {
            std::cout &lt;&lt; &quot;Specified Func is called.&quot; &lt;&lt; std::endl;
            return t.Func(std::forward&lt;Args&gt;(args)...);
        } else if (!HaveFunc&lt;T, Args...&gt;::value) {
            std::cout &lt;&lt; &quot;Default behavior is called.&quot; &lt;&lt; std::endl;
            return SomeReturnType();
        }
    }
};
</code></pre>
<!--kg-card-end: markdown--><h2 id="-"> &#xC815;&#xB9AC;</h2><p>&#xC6B0;&#xB9AC;&#xB294; C++&#xC5D0;&#xC11C; &#xC5B4;&#xB5BB;&#xAC8C; &#xCEF4;&#xD30C;&#xC77C; &#xD0C0;&#xC784;&#xC5D0; &#xD2B9;&#xC815; &#xBA64;&#xBC84; &#xBCC0;&#xC218;&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD558;&#xACE0;, &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xC558;&#xC744; &#xACBD;&#xC6B0; &#xC6B0;&#xD68C;&#xAC00;&#xB2A5;&#xD55C; &#xB85C;&#xC9C1;&#xC744; &#xC815;&#xC758;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xC558;&#xB2E4;. C++11&#xC5D0;&#xC11C;&#xB294; SFINAE&#xC744; &#xC0AC;&#xC6A9;&#xD55C; &#xD15C;&#xD50C;&#xB9BF; &#xCD94;&#xB860;&#xC744; &#xD1B5;&#xD55C; &#xBC29;&#xBC95;&#xC774; &#xC788;&#xC5C8;&#xACE0; C++17&#xAE4C;&#xC9C0; &#xD5C8;&#xC6A9;&#xD55C;&#xB2E4;&#xBA74; &#xCEF4;&#xD30C;&#xC77C; &#xD0C0;&#xC784; &#xC870;&#xAC74;&#xBB38;(if constexpr)&#xC744; &#xD1B5;&#xD55C; &#xBC29;&#xBC95;&#xC744; &#xD1B5;&#xD574; &#xB354; &#xAC04;&#xD3B8;&#xD558;&#xAC8C; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131; &#xD560; &#xC218; &#xC788;&#xC5C8;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[Using the visitor pattern instead of "dynamic_cast" in C++]]></title><description><![CDATA[그 중에서도 특히, 클래스의 수는 늘어날 가능성이 매우 희박하면서도, (class specific) 함수들의 수는 늘어나기 매우 쉽고, 또 매우 많은 경우에 대해서 일관된 로직 플로우를 마련해야할 필요성이 생겼다. 이 글에서 naive한 접근 방식을 소개하고 이를 보안한 Visitor 패턴을 사용한 (아주 간단한) 방법을 어떻게 사용하였는지 서술하려고 한다.]]></description><link>https://elenesgu.dev/using-the-visitor-pattern-instead-of-dynamic-cast-in-cpp/</link><guid isPermaLink="false">5d70b61aabbd9100017cac83</guid><category><![CDATA[developemnt]]></category><category><![CDATA[C++]]></category><dc:creator><![CDATA[Seungmin Lee]]></dc:creator><pubDate>Mon, 09 Sep 2019 10:00:00 GMT</pubDate><content:encoded><![CDATA[<h1 id="visitor-c-dynamic_cast-">Visitor &#xD328;&#xD134;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; C++ dynamic_cast &#xC9C0;&#xC6B0;&#xAE30;</h1><p>C++&#xC5D0;&#xC11C; &#xB2E4;&#xD615;&#xC131;&#xC744; &#xB9CC;&#xC871;&#xD558;&#xB294; &#xD074;&#xB798;&#xC2A4;&#xB4E4;&#xC5D0;&#xAC8C; &#xAC01;&#xAC01; &#xB3C5;&#xB9BD;&#xC801;&#xC778; &#xB85C;&#xC9C1;&#xC744; &#xAC16;&#xB294; &#xD568;&#xC218;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; &#xAC00;&#xC0C1; &#xD568;&#xC218; &#xD14C;&#xC774;&#xBE14;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC77C;&#xBC18;&#xC801;&#xC774;&#xB2E4;. &#xD074;&#xB798;&#xC2A4;&#xC758; &#xC218;&#xAC00; &#xB298;&#xC5B4;&#xB0A0; &#xB54C; &#xADF8;&#xB9AC;&#xACE0; &#xD568;&#xC218;&#xC758; &#xC218;&#xAC00; &#xB298;&#xC5B4;&#xB0A0; &#xB54C;&#xB97C; &#xACE0;&#xB824;&#xD558;&#xAC70;&#xB098; &#xB2E4;&#xC218;&#xC758; &#xD074;&#xB798;&#xC2A4;&#xAC00; &#xAC19;&#xC740; &#xB85C;&#xC9C1;&#xC744; &#xC0AC;&#xC6A9;&#xD560; &#xB54C;&#xC758; &#xACBD;&#xC6B0;&#xB97C; &#xACE0;&#xB824;&#xD558;&#xC5EC; &#xB2E4;&#xC591;&#xD55C; &#xB514;&#xC790;&#xC778; &#xD328;&#xD134;&#xB4E4;&#xC774; &#xC18C;&#xAC1C;&#xAC00; &#xB418;&#xC5C8;&#xB2E4;. &#xADF8; &#xC911;&#xC5D0;&#xC11C;&#xB3C4; &#xD2B9;&#xD788; &#xD074;&#xB798;&#xC2A4;&#xC758; &#xC218;&#xB294; &#xB298;&#xC5B4;&#xB0A0; &#xAC00;&#xB2A5;&#xC131;&#xC774; &#xB9E4;&#xC6B0; &#xD76C;&#xBC15;&#xD558;&#xBA74;&#xC11C;&#xB3C4;, &#xD074;&#xB798;&#xC2A4; &#xD2B9;&#xC218;&#xD55C;(class specific) &#xD568;&#xC218;&#xB4E4;&#xC758; &#xC218;&#xB294; &#xB298;&#xC5B4;&#xB098;&#xAE30; &#xC26C;&#xC6B4; &#xACBD;&#xC6B0;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC77C;&#xAD00;&#xB41C; &#xB85C;&#xC9C1; &#xD50C;&#xB85C;&#xC6B0; &#xB610;&#xB294; &#xD328;&#xD134;&#xC744; &#xB9C8;&#xB828;&#xD574;&#xC57C; &#xD560; &#xD544;&#xC694;&#xC131;&#xC774; &#xC0DD;&#xACBC;&#xB2E4;. &#xC774; &#xAE00;&#xC5D0;&#xC11C; na&#xEF;ve&#xD55C; &#xC811;&#xADFC; &#xBC29;&#xC2DD;&#xC744; &#xC18C;&#xAC1C;&#xD558;&#xACE0; &#xC774;&#xB97C; &#xBCF4;&#xC548;&#xD55C; Visitor &#xD328;&#xD134;&#xC744; &#xC0AC;&#xC6A9;&#xD574; &#xC5B4;&#xB5BB;&#xAC8C; &#xAD6C;&#xD604;&#xD558;&#xC600;&#xB294;&#xC9C0; &#xC11C;&#xC220;&#xD558;&#xB824;&#xACE0; &#xD55C;&#xB2E4;.</p><p>&#xB2E4;&#xC74C; &#xCF54;&#xB4DC;&#xC870;&#xAC01;&#xC740; &#xC804;&#xCCB4; &#xC2E4;&#xD5D8;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD560; &#xAE30;&#xBCF8;&#xC801;&#xC778; &#xD074;&#xB798;&#xC2A4; &#xC815;&#xC758;&#xB97C; &#xB098;&#xD0C0;&#xB0B8;&#xB2E4;. Base&#xB77C;&#xB294; &#xD55C; &#xAC1C;&#xC758; &#xC21C;&#xC218; &#xAC00;&#xC0C1; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xC815;&#xC758;&#xD558;&#xC600;&#xACE0;, &#xC774;&#xB97C; &#xC0C1;&#xC18D;&#xBC1B;&#xC740; 8&#xAC1C;&#xC758; &#xD074;&#xB798;&#xC2A4;&#xB4E4;&#xC744; &#xC815;&#xC758;&#xD558;&#xC600;&#xB2E4;. Visitor&#xB97C; &#xBC1B;&#xC544;&#xB4E4;&#xC774;&#xAE30; &#xC704;&#xD55C; Invite&#xB77C;&#xB294; &#xBA64;&#xBC84; &#xD568;&#xC218;&#xAC00; &#xAC00;&#xC0C1;&#xD568;&#xC218;&#xB85C; &#xC815;&#xC758;&#xB418;&#xC5B4; &#xC788;&#xB2E4;. &#xC0C1;&#xC18D;&#xBC1B;&#xC740; &#xC790;&#xC2DD; &#xD074;&#xB798;&#xC2A4;&#xC5D0;&#xC11C;&#xB3C4; &#xC5ED;&#xC2DC; &#xC7AC;&#xC815;&#xC758;&#xD558;&#xC600;&#xB2E4;. &#xC774; &#xB54C;, &#xAC01; Derived &#xD074;&#xB798;&#xC2A4;&#xC758; Invite &#xD568;&#xC218;&#xC758; &#xC2A4;&#xCF54;&#xD504;&#xC5D0;&#xC11C; *this&#xC758; &#xD0C0;&#xC785;&#xD615;&#xC740; &#xC790;&#xAE30;&#xC790;&#xC2E0; &#xD074;&#xB798;&#xC2A4;&#xC758; &#xB808;&#xD37C;&#xB7F0;&#xC2A4;&#xAC00; &#xB420; &#xAC83;&#xC774;&#xACE0;, &#xC774; &#xB97C; &#xC815;&#xBCF4;&#xB85C; &#xC0BC;&#xC544; &#xD568;&#xC218; &#xC624;&#xBC84;&#xB85C;&#xB529;&#xC744; &#xD65C;&#xC6A9;&#xD558;&#xC5EC; &#xAC01; Visitor&#xC5D0;&#xC11C; &#xD074;&#xB798;&#xC2A4; &#xD2B9;&#xD654; &#xD568;&#xC218;&#xB97C; &#xD638;&#xCD9C;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xD558;&#xC600;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-cpp">class Base {
  protected:
    // &#xC544;&#xC8FC; &#xB9CE;&#xC740; &#xB370;&#xC774;&#xD130;
    int data[100];
  public:
    Base() {}
    virtual ~Base() {}
    
    virtual void Func() = 0;
    virtual void Invite(Visitor&amp; visitor) {
        visitor.Visit(*this);
    }

    virtual int Id() = 0;
};

#define MAKE_DERIVED(id) \
class Derived##id : public Base { \
public: \
    int cast_id; \
    Derived##id() : Base() {} \
    Derived##id(int a) : Base(), cast_id(a) {} \
    virtual ~Derived##id() {} \
    virtual void Func() override { } \
    virtual void Invite(Visitor&amp; visitor) override { \
        visitor.Visit(*this); \
    } \
    virtual int Id() override { \
        return cast_id; \
    } \
};

MAKE_DERIVED(A)
MAKE_DERIVED(B)
MAKE_DERIVED(C)
MAKE_DERIVED(D)
MAKE_DERIVED(E)
MAKE_DERIVED(F)
MAKE_DERIVED(G)
MAKE_DERIVED(H)

/// After preprocessing the above macro
class DerivedA : public Base {
  public:
    int cast_id;
    DerivedA() : Base() {}
    DerivedA(int a) : Base(), cast_id(a) {}
    virtual ~DerivedA() {}
    virtual void Func() override { }
    virtual void Invite(Visitor&amp; visitor) override {
        visitor.Visit(*this);
    }
    virtual int Id() override {
        return cast_id;
    }
};


</code></pre>
<!--kg-card-end: markdown--><p>&#xB2E4;&#xC74C;&#xC740; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xD558;&#xAE30; &#xC704;&#xD55C; &#xB370;&#xC774;&#xD130; &#xC900;&#xBE44;&#xC791;&#xC5C5;&#xC774;&#xB2E4;. 10,000,000&#xAC1C;&#xC758; &#xD074;&#xB798;&#xC2A4; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xC900;&#xBE44;&#xD558;&#xC600;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-cpp">const static size_t test_size = 10000000;

auto now = std::chrono::high_resolution_clock::now;
auto begin = now();

std::random_device rd;
std::mt19937 mt(rd());
std::uniform_int_distribution&lt;&gt; dis(0, 7);
std::vector&lt;std::unique_ptr&lt;Base&gt;&gt; v;
v.reserve(test_size);
for(size_t i = 0 ; i &lt; test_size ; i++) {
    int id = dis(mt);
    switch (id) {
    case 0:
        v.emplace_back(new DerivedA(1 * 10 + dis(mt)));
        break;
    case 1:
        v.emplace_back(new DerivedB(2 * 10 + dis(mt)));
        break;        
    case 2:
        v.emplace_back(new DerivedC(3 * 10 + dis(mt)));
        break;
    case 3:
        v.emplace_back(new DerivedD(4 * 10 + dis(mt)));
        break;        
    case 4:
        v.emplace_back(new DerivedE(5 * 10 + dis(mt)));
        break;        
    case 5:
        v.emplace_back(new DerivedF(6 * 10 + dis(mt)));
        break;        
    case 6:
        v.emplace_back(new DerivedG(7 * 10 + dis(mt)));
        break;        
    case 7:
        v.emplace_back(new DerivedH(8 * 10 + dis(mt)));
        break;
    default:
        break;
    }
}
auto end = now();
auto duration =
std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(end - begin).count();
std::cout &lt;&lt; &quot;Test preparation\n&quot; &lt;&lt; std::setw(20)
          &lt;&lt; std::right &lt;&lt; duration &lt;&lt; &quot;us&quot; &lt;&lt; std::endl;
</code></pre>
<!--kg-card-end: markdown--><p>&#xAC00;&#xC7A5; na&#xEF;ve&#xD55C; &#xC811;&#xADFC; &#xBC29;&#xBC95;&#xC740;, &#xBD80;&#xBAA8; &#xD074;&#xB798;&#xC2A4; &#xD0C0;&#xC785;&#xC758; &#xD3EC;&#xC778;&#xD130;&#xC5D0; dynamic_cast&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC774;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; cascading dyamic_cast &#xBC29;&#xC2DD;&#xC740; &#xB9CE;&#xC740; RTTI&#xC5D0; &#xAE30;&#xBC18;&#xD55C; &#xBE44;&#xAD50;&#xC5F0;&#xC0B0;&#xC744; &#xB3D9;&#xBC18;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC131;&#xB2A5;&#xC774; &#xC88B;&#xC744; &#xAC83;&#xC774;&#xB77C;&#xACE0; &#xAE30;&#xB300;&#xD558;&#xAE30; &#xC5B4;&#xB835;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-cpp">auto begin = now();
int cnt[8];
for(auto&amp;&amp; i : v) {
    auto&amp;&amp; p = i.get();
    if(auto ptr = dynamic_cast&lt;DerivedA*&gt;(p)) {
        cnt[0]++;
    } else if(auto ptr = dynamic_cast&lt;DerivedB*&gt;(p)) {
        cnt[1]++;
    } else if(auto ptr = dynamic_cast&lt;DerivedC*&gt;(p)) {
        cnt[2]++;
    } else if(auto ptr = dynamic_cast&lt;DerivedD*&gt;(p)) {
        cnt[3]++;
    } else if(auto ptr = dynamic_cast&lt;DerivedE*&gt;(p)) {
        cnt[4]++;
    } else if(auto ptr = dynamic_cast&lt;DerivedF*&gt;(p)) {
        cnt[5]++;
    } else if(auto ptr = dynamic_cast&lt;DerivedG*&gt;(p)) {
        cnt[6]++;
    } else if(auto ptr = dynamic_cast&lt;DerivedH*&gt;(p)) {
        cnt[7]++;
    } else {
        throw std::bad_cast();
    }
}

auto end = now();
auto duration
  = std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(end - begin).count();
std::cout &lt;&lt; &quot;Dynamic cast\n&quot; &lt;&lt; std::setw(20)
          &lt;&lt; std::right &lt;&lt; duration &lt;&lt; &quot;us&quot; &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;---------validation----------\n&quot;;
std::cout &lt;&lt; cnt[0] &lt;&lt; &quot; : &quot; &lt;&lt; cnt[1] &lt;&lt; &quot; : &quot; &lt;&lt; cnt[2] &lt;&lt; &quot; |\n&quot;
          &lt;&lt; cnt[3] &lt;&lt; &quot; : &quot; &lt;&lt; cnt[4] &lt;&lt; &quot; : &quot; &lt;&lt; cnt[5] &lt;&lt; &quot; |\n&quot;
          &lt;&lt; cnt[6] &lt;&lt; &quot; : &quot; &lt;&lt; cnt[7] &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;-----------------------------\n\n&quot;;
</code></pre>
<!--kg-card-end: markdown--><p>&#xB2E4;&#xC74C; &#xBC29;&#xBC95;&#xC740; Visitor&#xB97C; &#xD65C;&#xC6A9;&#xD55C; &#xBC29;&#xBC95;&#xC774;&#xB2E4;. &#xC0AC;&#xC6A9;&#xD560; Visitor&#xC758; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;. &#xBA3C;&#xC800; &#xAC01; Derived class&#xB9C8;&#xB2E4; Visit &#xD568;&#xC218;&#xB97C; &#xC9C0;&#xB2C8;&#xACE0; &#xC788;&#xACE0;, &#xAC01; Visit &#xD568;&#xC218; &#xB0B4;&#xBD80;&#xC5D0;&#xC11C;&#xB294; &#xAC00;&#xC0C1; &#xD568;&#xC218;&#xC778; DoWork&#xD568;&#xC218;&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;. Visit&#xD568;&#xC218;&#xC640; DoWork&#xD568;&#xC218;&#xB294; derived &#xD074;&#xB798;&#xC2A4; &#xBCC4;&#xB85C; &#xC624;&#xBC84;&#xB85C;&#xB529;&#xC774; &#xB418;&#xC5B4;&#xC788;&#xC5B4;&#xC11C; &#xD0C0;&#xC785;&#xC744; &#xC54C;&#xB9DE;&#xAC8C; &#xCC3E;&#xC744; &#xC218; &#xC788;&#xB2E4;. &#xC989;, &#xC804;&#xCCB4;&#xC801;&#xC778; &#xD50C;&#xB85C;&#xC6B0;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;. Base &#xD074;&#xB798;&#xC2A4;&#xC640; Derived &#xD074;&#xB798;&#xC2A4;&#xB4E4;&#xC758; vtable&#xC744; &#xC0AC;&#xC6A9;&#xD574; Visitor&#xB97C; &#xC778;&#xC790;&#xB85C; &#xBC1B;&#xC73C;&#xBA74;, &#xC790;&#xAE30; &#xC790;&#xC2E0;&#xC758; &#xD0C0;&#xC785;&#xC5D0; &#xD574;&#xB2F9;&#xD558;&#xB294; Visit &#xD568;&#xC218;&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;. &#xC774; &#xB54C; Derived &#xD074;&#xB798;&#xC2A4;&#xC758; &#xAD6C;&#xCCB4;&#xC801;&#xC778; &#xD0C0;&#xC785;&#xC740; &#xC54C; &#xC218; &#xC788;&#xB294; &#xC0C1;&#xD0DC;&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC54C;&#xB9DE;&#xC740; DoWork &#xD568;&#xC218;&#xB97C; &#xD638;&#xCD9C;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xC774; &#xB54C; &#xBAA8;&#xB4E0; &#xAC00;&#xC0C1; &#xD568;&#xC218;&#xB97C; &#xC624;&#xBC84;&#xB77C;&#xC774;&#xB529; &#xD588;&#xB2E4;&#xBA74;, Base &#xD0C0;&#xC785;&#xC758; &#xAC1D;&#xCCB4;&#xB97C; &#xBC1B;&#xC740; DoWork&#xD568;&#xC218;&#xB294; &#xD544;&#xC694;&#xC5C6;&#xACE0;, &#xB610; &#xD638;&#xCD9C;&#xB418;&#xC9C0; &#xC54A;&#xC744; &#xAC83;&#xC774;&#xB2E4;. &#xB300;&#xC2E0;&#xC5D0; &#xC774;&#xB97C; &#xAE30;&#xBCF8;&#xD589;&#xB3D9;&#xC744; &#xC9C0;&#xC815;&#xD558;&#xB294; &#xD568;&#xC218;&#xB97C; &#xB9CC;&#xB4E4; &#xACBD;&#xC6B0;&#xC5D0; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xD2B9;&#xC815; &#xD074;&#xB798;&#xC2A4;, DerivedA&#xC640; DerivedB&#xC5D0;&#xB9CC; &#xD2B9;&#xC815; &#xB85C;&#xC9C1;&#xC744; &#xB3D9;&#xC791;&#xC2DC;&#xD0A4;&#xACE0;, &#xADF8; &#xC678;&#xC5D0;&#xB294; &#xAE30;&#xBCF8; &#xB85C;&#xC9C1;&#xC744; &#xD65C;&#xC6A9;&#xD558;&#xACE0; &#xC2F6;&#xB2E4;&#xBA74; Base&#xB97C; &#xBC1B;&#xB294; &#xACBD;&#xC6B0;&#xB97C; &#xAE30;&#xBCF8; &#xB85C;&#xC9C1;&#xC744; &#xC704;&#xD55C; &#xD568;&#xC218;&#xB85C; &#xC124;&#xC815;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xC774;&#xB7F4; &#xACBD;&#xC6B0; Visitor &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;&#xC758; DoWork &#xD568;&#xC218;&#xB4E4;&#xC758; &#xAE30;&#xBCF8; &#xB85C;&#xC9C1;&#xC744; &#xC544;&#xB798; &#xCF54;&#xB4DC;&#xC870;&#xAC01;&#xC758; &#xB9E8; &#xD558;&#xB2E8; &#xBD80;&#xBD84;&#xCC98;&#xB7FC; &#xBC14;&#xAFD4;&#xC57C; &#xD560; &#xD544;&#xC694;&#xAC00; &#xC788;&#xC744; &#xAC83;&#xC774;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-cpp">#define DERIVED_FORWARD_DECL(id) \
class Derived##id;

#define MAKE_VISIT_FUNC(id) \
void Visit(const Derived##id&amp; tgt) { \
    DoWork(tgt); \
}

#define MAKE_WORK_FUNC(id, logic) \
virtual void DoWork(const Derived##id&amp; tgt) { \
    logic \
}

class Visitor {
  public:
    virtual ~Visitor() {}

    void Visit(const Base&amp; tgt) {
        DoWork(tgt);
    }

    MAKE_VISIT_FUNC(A)
    MAKE_VISIT_FUNC(B)
    MAKE_VISIT_FUNC(C)
    MAKE_VISIT_FUNC(D)
    MAKE_VISIT_FUNC(E)
    MAKE_VISIT_FUNC(F)
    MAKE_VISIT_FUNC(G)
    MAKE_VISIT_FUNC(H)

    virtual void DoWork(const Base&amp; tgt) {
        throw std::logic_error(&quot;Not Reachable&quot;);
    }
    MAKE_WORK_FUNC(A, ;)
    MAKE_WORK_FUNC(B, ;)
    MAKE_WORK_FUNC(C, ;)
    MAKE_WORK_FUNC(D, ;)
    MAKE_WORK_FUNC(E, ;)
    MAKE_WORK_FUNC(F, ;)
    MAKE_WORK_FUNC(G, ;)
    MAKE_WORK_FUNC(H, ;)

};

/// DoWork&#xC5D0; default function&#xC744; &#xC0AC;&#xC6A9;&#xD560; &#xACBD;&#xC6B0;
void Visiter::DoWork(const DerivedB&amp; tgt) {
    // explicit upcasting
    DoWork(static_cast&lt;const Base&amp;&gt;(tgt);
}
</code></pre>
<!--kg-card-end: markdown--><p>&#xB2E4;&#xC74C;&#xC740; cascading dynamic_cast&#xB97C; &#xC0AC;&#xC6A9;&#xD588;&#xC744; &#xB54C;&#xC640; &#xAC19;&#xC740; &#xC791;&#xB3D9;&#xC744; &#xD558;&#xB294; CountVisitor&#xC5D0; &#xB300;&#xD55C; &#xC815;&#xC758;&#xC640; &#xD14C;&#xC2A4;&#xD2B8; &#xCF54;&#xB4DC;&#xC774;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-cpp">auto begin = now();
class CountVisitor : public Visitor {
public:
    CountVisitor() : cnt{0} {}
    virtual ~CountVisitor() = default;

    MAKE_WORK_FUNC(A, cnt[0]++;)
    MAKE_WORK_FUNC(B, cnt[1]++;)
    MAKE_WORK_FUNC(C, cnt[2]++;)
    MAKE_WORK_FUNC(D, cnt[3]++;)
    MAKE_WORK_FUNC(E, cnt[4]++;)
    MAKE_WORK_FUNC(F, cnt[5]++;)
    MAKE_WORK_FUNC(G, cnt[6]++;)
    MAKE_WORK_FUNC(H, cnt[7]++;)

    int cnt[8];
};

CountVisitor cv;
for(auto&amp;&amp; i : v) {
    i-&gt;Invite(cv);
}       

auto end = now();
auto duration
    = std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(end - begin).count();
std::cout &lt;&lt; &quot;Dynamic cast\n&quot; &lt;&lt; std::setw(20)
          &lt;&lt; std::right &lt;&lt; duration &lt;&lt; &quot;us&quot; &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;---------validation----------\n&quot;;
std::cout &lt;&lt; cnt[0] &lt;&lt; &quot; : &quot; &lt;&lt; cnt[1] &lt;&lt; &quot; : &quot; &lt;&lt; cnt[2] &lt;&lt; &quot; |\n&quot;
          &lt;&lt; cnt[3] &lt;&lt; &quot; : &quot; &lt;&lt; cnt[4] &lt;&lt; &quot; : &quot; &lt;&lt; cnt[5] &lt;&lt; &quot; |\n&quot;
          &lt;&lt; cnt[6] &lt;&lt; &quot; : &quot; &lt;&lt; cnt[7] &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;-----------------------------\n\n&quot;;
</code></pre>
<!--kg-card-end: markdown--><p>&#xC774;&#xB97C; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xC218;&#xD589; &#xC2DC;&#xAC04;&#xC744; &#xCE21;&#xC815;&#xD574; &#xBCF4;&#xC558;&#xB2E4;. &#xD14C;&#xC2A4;&#xD2B8; &#xD658;&#xACBD;&#xC740; &#xC778;&#xD154; i5-8500&#xC774;&#xBA70; Ubuntu 18.04 Linux 5.0.0-27&#xC5D0;&#xC11C; &#xCE21;&#xC815;&#xB418;&#xC5C8;&#xB2E4;. g++ 7.4.0&#xBC84;&#xC804;&#xC5D0; -O3 &#xCD5C;&#xC801;&#xD654; &#xC635;&#xC158;&#xC73C;&#xB85C; &#xCEF4;&#xD30C;&#xC77C; &#xD558;&#xC600;&#xB2E4;. Cascading dynamic_cast&#xC758; &#xACBD;&#xC6B0; &#xC57D; 1,000,000 &#xB9C8;&#xC774;&#xD06C;&#xB85C;&#xCD08; (= 1&#xCD08;)&#xAC00; &#xC18C;&#xC694;&#xB418;&#xC5C8;&#xB2E4;. 1,100,000 &#xB9C8;&#xC774;&#xD06C;&#xB85C;&#xCD08;&#xAC00; &#xB118;&#xB294; &#xD14C;&#xC2A4;&#xD2B8; &#xD68C;&#xC218;&#xB3C4; &#xC788;&#xC5C8;&#xB2E4;. Visitor&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xACBD;&#xC6B0;, 150,000 &#xB9C8;&#xC774;&#xD06C;&#xB85C;&#xCD08;&#xC5D0;&#xC11C; 160,000 &#xB9C8;&#xC774;&#xD06C;&#xB85C;&#xCD08; &#xC0AC;&#xC774;&#xC758; &#xC2DC;&#xAC04;&#xC774; &#xC18C;&#xC694;&#xB418;&#xC5C8;&#xB2E4;. &#xC57D; 6&#xBC30; &#xC815;&#xB3C4;&#xC758; &#xC131;&#xB2A5; &#xCC28;&#xC774;&#xAC00; &#xC788;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD558;&#xC600;&#xB2E4;. &#xB2E4;&#xC74C;&#xC740; &#xD2B9;&#xC815; &#xD14C;&#xC2A4;&#xD2B8; &#xD68C;&#xC218;&#xC758; &#xACB0;&#xACFC;&#xC774;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-text">Test preparation
             2088129us
Dynamic cast
             1087401us
---------validation----------
1249520 : 1249369 : 1249623 |
1250041 : 1249819 : 1251194 |
1250905 : 1249529           |
-----------------------------
Visitor
              156315us
---------validation----------
1249520 : 1249369 : 1249623 |
1250041 : 1249819 : 1251194 |
1250905 : 1249529           |
-----------------------------
</code></pre>
<!--kg-card-end: markdown--><p>&#xCD5C;&#xC801;&#xD654; &#xC635;&#xC158;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xC558;&#xC744; &#xACBD;&#xC6B0;&#xB294; &#xADF8; &#xCC28;&#xC774;&#xAC00; 1.6&#xBC30;&#xC815;&#xB3C4; (Visitor&#xAC00; &#xB354; &#xBE60;&#xB984;) &#xC73C;&#xB85C; &#xC904;&#xC5B4;&#xB4E4;&#xAE30;&#xB294; &#xD558;&#xC9C0;&#xB9CC; &#xADF8;&#xB7FC;&#xC5D0;&#xB3C4; &#xCC28;&#xC774;&#xAC00; &#xC720;&#xC758;&#xBBF8;&#xD558;&#xB2E4;&#xACE0; &#xD310;&#xB2E8;&#xD560; &#xC218; &#xC788;&#xC744; &#xAC83;&#xC774;&#xB2E4;. -O1 &#xB610;&#xB294; -O2&#xC758; &#xACBD;&#xC6B0;&#xC5D0;&#xB3C4; -O3&#xC640; &#xC720;&#xC0AC;&#xD55C; &#xBE44;&#xC728;&#xC758; &#xC131;&#xB2A5; &#xCC28;&#xC774;&#xB97C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xB2E4;.</p><h2 id="type-checking-dynamic_cast"> Type checking + dynamic_cast</h2><p> C++&#xC774; dynamic_cast&#xB97C; &#xD558;&#xAE30;&#xC704;&#xD574; &#xB7F0;&#xD0C0;&#xC784; &#xD0C0;&#xC785; &#xC815;&#xBCF4;&#xB97C; &#xC5BB;&#xB294; &#xBC29;&#xBC95;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; &#xADDC;&#xC815;&#xC744; &#xD558;&#xACE0;&#xC788;&#xC9C0;&#xB294; &#xC54A;&#xC9C0;&#xB9CC;, &#xAC01; &#xD074;&#xB798;&#xC2A4; &#xB0B4;&#xBD80;&#xC5D0; &#xD0C0;&#xC785;&#xC5D0; &#xB300;&#xD55C; (&#xC5C4;&#xACA9;&#xD788; &#xAD00;&#xB9AC;&#xB41C;) &#xC815;&#xBCF4;&#xB97C; int&#xB4F1;&#xC758; &#xD0C0;&#xC785;&#xC73C;&#xB85C; &#xC720;&#xC9C0;&#xD55C;&#xB2E4;&#xBA74; int&#xD0C0;&#xC785;&#xC5D0; &#xB300;&#xD55C; &#xBE44;&#xAD50; &#xC5F0;&#xC0B0;&#xC774; RTTI&#xC744; &#xC0AC;&#xC6A9;&#xD55C; dynamic_cast&#xBCF4;&#xB2E4; &#xBE60;&#xB97C; &#xAC83; &#xAC19;&#xC558;&#xB2E4;. &#xBB3C;&#xB860; &#xD0C0;&#xC785;&#xC5D0; &#xB300;&#xD55C; &#xC815;&#xBCF4;&#xB97C; &#xD074;&#xB798;&#xC2A4; &#xB0B4;&#xBD80;&#xC5D0; &#xC720;&#xC9C0;&#xD558;&#xB294; &#xAC83;&#xC740; &#xAD8C;&#xC7A5;&#xD560;&#xB9CC;&#xD55C; &#xD589;&#xB3D9;&#xC740; &#xC544;&#xB2C8;&#xC9C0;&#xB9CC;, &#xC5B4;&#xC9F8;&#xB72C; &#xC6B0;&#xB9AC;&#xB294; int&#xD0C0;&#xC785;&#xC758; &#xAC12;&#xC744; &#xBCF4;&#xACE0; &#xD074;&#xB798;&#xC2A4;&#xC758; &#xC2E4;&#xC81C; &#xD0C0;&#xC785;&#xC744; &#xCD94;&#xB860;&#xD574; &#xBCFC; &#xAC83;&#xC774;&#xB2E4;. &#xD14C;&#xC2A4;&#xD2B8; &#xCF00;&#xC774;&#xC2A4;&#xB97C; &#xC0DD;&#xC131;&#xD55C; &#xCF54;&#xB4DC; &#xB610;&#xB294; Base &amp; Derived &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xC815;&#xC758;&#xD55C; &#xCF54;&#xB4DC;&#xB97C; &#xBCF4;&#xBA74; &#xC815;&#xC218;&#xC758; &#xAC12;&#xC73C;&#xB85C; &#xD0C0;&#xC785; &#xC815;&#xBCF4;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xC600;&#xB2E4;. 10&#xC758; &#xC790;&#xB9AC;&#xC758; &#xC218;&#xB97C; &#xBCF4;&#xACE0; &#xD0C0;&#xC785;&#xC744; &#xCD94;&#xB860;&#xD560; &#xC218; &#xC788;&#xC744; &#xAC83;&#xC774;&#xB2E4;. &#xC774;&#xB97C; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">auto begin = now();
int cnt[8] = {0};
for(auto&amp;&amp; i : v) {
    auto&amp;&amp; p = i.get();  
    int id = p-&gt;Id() / 10;          
    switch (id) {
    case 1:
        {
            auto ptr = dynamic_cast&lt;DerivedA*&gt;(p);
            cnt[0]++;
        }
        break;
    case 2:
        {
            auto ptr = dynamic_cast&lt;DerivedB*&gt;(p);
            cnt[1]++;
        }
        break;        
    case 3:
        {
            auto ptr = dynamic_cast&lt;DerivedC*&gt;(p);
            cnt[2]++;
        }
        break;
    case 4:
        {
            auto ptr = dynamic_cast&lt;DerivedD*&gt;(p);
            cnt[3]++;
        }
        break;        
    case 5:
        {
            auto ptr = dynamic_cast&lt;DerivedE*&gt;(p);
            cnt[4]++;
        }
        break;        
    case 6:
        {
            auto ptr = dynamic_cast&lt;DerivedF*&gt;(p);
            cnt[5]++;
        }
        break;        
    case 7:
        {
            auto ptr = dynamic_cast&lt;DerivedG*&gt;(p);
            cnt[6]++;
        }
        break;        
    case 8:
        {
            auto ptr = dynamic_cast&lt;DerivedH*&gt;(p);
            cnt[7]++;
        }
        break;
    default:
        break;
    }
}

auto end = now();
auto duration
    = std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(end - begin).count();
std::cout &lt;&lt; &quot;Dynamic cast + with id checking\n&quot; &lt;&lt; std::setw(20) &lt;&lt; std::right &lt;&lt; duration &lt;&lt; &quot;us&quot; &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;---------validation----------\n&quot;;
std::cout &lt;&lt; cnt[0] &lt;&lt; &quot; : &quot; &lt;&lt; cnt[1] &lt;&lt; &quot; : &quot; &lt;&lt; cnt[2] &lt;&lt; &quot; |\n&quot;
          &lt;&lt; cnt[3] &lt;&lt; &quot; : &quot; &lt;&lt; cnt[4] &lt;&lt; &quot; : &quot; &lt;&lt; cnt[5] &lt;&lt; &quot; |\n&quot;
          &lt;&lt; cnt[6] &lt;&lt; &quot; : &quot; &lt;&lt; cnt[7] &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;-----------------------------\n\n&quot;;
</code></pre>
<!--kg-card-end: markdown--><p>&#xC774;&#xB97C; &#xAC19;&#xC740; &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xD14C;&#xC2A4;&#xD2B8;&#xD588;&#xC744; &#xB54C;, 200,000&#xB9C8;&#xC774;&#xD06C;&#xB85C;&#xCD08; &#xADFC;&#xCC98;&#xC600;&#xB2E4;. Visitor&#xBCF4;&#xB2E4;&#xB294; &#xBE60;&#xB974;&#xC9C0; &#xC54A;&#xC558;&#xC5B4;&#xB3C4;, dynamic_cast&#xB97C; &#xC5EC;&#xB7EC;&#xBC88; &#xD55C; &#xACBD;&#xC6B0;&#xC5D0; &#xBE44;&#xD574; &#xC9E7;&#xC740; &#xC218;&#xD589;&#xC2DC;&#xAC04;&#xC744; &#xBCF4;&#xC5EC;&#xC8FC;&#xC5C8;&#xB2E4;.</p><h1 id="-">&#xC815;&#xB9AC;</h1><p>dynamic_cast&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xAC83;&#xC774; &#xAD8C;&#xC7A5;&#xB418;&#xC5B4;&#xB3C4;, (&#xADF8;&#xB9AC;&#xACE0; &#xD074;&#xB798;&#xC2A4; &#xC124;&#xACC4;&#xB97C; dynamic_cast&#xB97C; &#xC4F0;&#xC9C0; &#xC54A;&#xB294; &#xBC29;&#xBC95;&#xC73C;&#xB85C; &#xC218;&#xC815;&#xD558;&#xB294; &#xAC83;&#xC774; &#xAD8C;&#xC7A5;&#xB418;&#xB354;&#xB77C;&#xB3C4;) &#xB7F0;&#xD0C0;&#xC784;&#xC5D0; &#xD0C0;&#xC785;&#xC744; &#xCCB4;&#xD06C;&#xD558;&#xAC70;&#xB098; &#xC0C1;&#xC18D;&#xBC1B;&#xC740; &#xC790;&#xC2DD; &#xD074;&#xB798;&#xC2A4;&#xC5D0; &#xC788;&#xB294; &#xD2B9;&#xC218;&#xD55C; &#xD568;&#xC218; &#xB610;&#xB294; &#xC131;&#xC9C8;&#xC5D0; &#xC811;&#xADFC;&#xD574;&#xC57C;&#xD560; &#xD544;&#xC694;&#xC131;&#xC744; &#xC644;&#xC804;&#xD788; &#xC9C0;&#xC6B0;&#xB294; &#xAC83;&#xC740; &#xB178;&#xB825;&#xC774; &#xD544;&#xC694;&#xD55C; &#xC77C;&#xC774;&#xB2E4;. &#xC774; &#xAE00;&#xC5D0;&#xC11C; dynamic_cast&#xB97C; cascade &#xCC98;&#xB7FC; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xBE44;&#xC2B7;&#xD55C; &#xC5ED;&#xD560;&#xC744; &#xC218;&#xD589;&#xD560; &#xC218; &#xC788;&#xB294; &#xBC29;&#xBC95; &#xC911; &#xD558;&#xB098;&#xB97C; &#xC18C;&#xAC1C;&#xD574;&#xBCF4;&#xC558;&#xB2E4;. &#xC774; &#xBC29;&#xBC95;&#xB860;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB2E4;&#xBA74;, &#xD074;&#xB798;&#xC2A4;&#xC758; &#xC885;&#xB958;&#xAC00; &#xB298;&#xC5B4;&#xB098;&#xC9C0; &#xC54A;&#xACE0; &#xD568;&#xC218;&#xB97C; &#xACC4;&#xC18D; &#xCD94;&#xAC00;&#xD574; &#xB098;&#xAC00;&#xC57C; &#xD560; &#xB54C; &#xC880; &#xB354; &#xD3B8;&#xD558;&#xACE0; &#xADF8;&#xB9AC;&#xACE0; &#xB3D9;&#xC791;&#xC2DC;&#xAC04;&#xC774; &#xBE60;&#xB978; &#xCF54;&#xB4DC; &#xBC0F; &#xAD6C;&#xD604;&#xC744; &#xC5BB;&#xC5B4;&#xB0BC; &#xC218; &#xC788;&#xC744; &#xAC83;&#xC73C;&#xB85C; &#xAE30;&#xB300;&#xD55C;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[Drawing EBNG or CFG figures using LaTeX with Rail]]></title><description><![CDATA[EBNF(wikipedia) 를 나타내는 그림을 그리는 방법 중 하나인 Rail과 LaTeX을 소개한다. LaTex은 유명한 편집기 이며, Rail이라는 플러그인을 사용하면 EBNF를 나타내는 그림을 손쉽게 그릴 수 있다. ]]></description><link>https://elenesgu.dev/drawing-ebnf-or-cfg-figures-using-latex-with-rail/</link><guid isPermaLink="false">5d09cc2fe76f6b000143dfa1</guid><category><![CDATA[developemnt]]></category><dc:creator><![CDATA[Seungmin Lee]]></dc:creator><pubDate>Thu, 20 Jun 2019 00:38:48 GMT</pubDate><content:encoded><![CDATA[<h1 id="latex-ebnf-cfg-">LaTeX&#xB97C; &#xD65C;&#xC6A9;&#xD574; EBNF &#xB610;&#xB294; CFG &#xADF8;&#xB9BC; &#xADF8;&#xB9AC;&#xAE30;</h1><p> EBNF(<a href="https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form?ref=elenesgu.dev">wikipedia</a>) &#xB97C; &#xB098;&#xD0C0;&#xB0B4;&#xB294; &#xADF8;&#xB9BC;&#xC744; &#xADF8;&#xB9AC;&#xB294; &#xBC29;&#xBC95; &#xC911; &#xD558;&#xB098;&#xC778; Rail&#xACFC; LaTeX&#xC744; &#xC18C;&#xAC1C;&#xD55C;&#xB2E4;. LaTex&#xC740; &#xC720;&#xBA85;&#xD55C; &#xD3B8;&#xC9D1;&#xAE30; &#xC774;&#xBA70;, Rail&#xC774;&#xB77C;&#xB294; &#xD50C;&#xB7EC;&#xADF8;&#xC778;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; EBNF&#xB97C; &#xB098;&#xD0C0;&#xB0B4;&#xB294; &#xADF8;&#xB9BC;&#xC744; &#xC190;&#xC27D;&#xAC8C; &#xADF8;&#xB9B4; &#xC218; &#xC788;&#xB2E4;. </p><h1 id="programs-requirements">Programs Requirements</h1><!--kg-card-begin: markdown--><ul>
<li>LaTeX &amp; Rail<br>
&#xB2F9;&#xC5F0;&#xD788; &#xD3B8;&#xC9D1;&#xD558;&#xAE30; &#xC704;&#xD55C; LaTeX&#xACFC; &#xD50C;&#xB7EC;&#xADF8;&#xC778;&#xC778; Rail&#xC774; &#xD544;&#xC694;&#xD558;&#xB2E4;. Rail&#xC740; <a href="https://www.ctan.org/pkg/rail?ref=elenesgu.dev">CTAN</a>&#xC5D0;&#xC11C; &#xBC1B;&#xC744; &#xC218; &#xC788;&#xB2E4;. &#xB530;&#xB85C; &#xD328;&#xD0A4;&#xC9C0; &#xAD00;&#xB9AC;&#xC790;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xB2E4;&#xC6B4;&#xBC1B;&#xC740; &#xB4A4; &#xC9C1;&#xC811; &#xBE4C;&#xB4DC;&#xD558;&#xC5EC; &#xC0AC;&#xC6A9;&#xD588;&#xB2E4;. &#xBE4C;&#xB4DC;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xC2A4;&#xCE90;&#xB108;&#xC640; &#xD30C;&#xC11C;&#xC778; flex&#xC640; bison&#xC774; &#xC124;&#xCE58;&#xB418;&#xC5B4;&#xC788;&#xC5B4;&#xC57C; &#xD55C;&#xB2E4;. (&#xC2E4;&#xD589;&#xD560; &#xB54C;&#xB3C4; &#xD544;&#xC694;&#xD55C;&#xC9C0; &#xC5EC;&#xBD80;&#xB294; &#xD655;&#xC778;&#xD558;&#xC9C0; &#xBABB;&#xD588;&#xB2E4;.) &#xBE4C;&#xB4DC; &#xACB0;&#xACFC;&#xBB3C;&#xB85C; &#xB098;&#xC624;&#xB294; rail &#xC774;&#xB77C;&#xB294; &#xBC14;&#xC774;&#xB108;&#xB9AC; &#xC2E4;&#xD589;&#xD30C;&#xC77C;&#xACFC; rail.sty&#xC774; &#xD544;&#xC694;&#xD558;&#xB2E4;.</li>
<li>pdfcrop.pl<br>
&#xB9CC;&#xC57D; LaTeX&#xACFC; Rail&#xC744; &#xD1B5;&#xD574; &#xC5BB;&#xC5B4;&#xB0B8; PDF&#xD30C;&#xC77C;&#xC758; &#xD06C;&#xAE30;&#xAC00; &#xADF8;&#xB9BC;&#xC758; &#xD06C;&#xAE30;&#xBCF4;&#xB2E4; &#xD06C;&#xB2E4;&#xBA74; pdfcrop.pl&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xC5EC;&#xBC31;&#xC744; &#xC798;&#xB77C;&#xC904; &#xC218; &#xC788;&#xB2E4;. &#xC5ED;&#xC2DC; <a href="https://ctan.org/tex-archive/support/pdfcrop/?ref=elenesgu.dev">CTAN</a>&#xC5D0;&#xC11C; &#xB2E4;&#xC6B4;&#xBC1B;&#xC744; &#xC218; &#xC788;&#xB2E4;. &#xB610;&#xB294;, &#xADFC;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xD06C;&#xAE30;&#xAC00; &#xC54C;&#xB9DE;&#xC740; PDF&#xD30C;&#xC77C;&#xC744; &#xB9CC;&#xB4E4;&#xB3C4;&#xB85D; &#xC218;&#xC815;&#xD560; &#xC218; &#xC788;&#xC744; &#xAC83;&#xC73C;&#xB85C; &#xBCF4;&#xC778;&#xB2E4;. (<a href="https://tex.stackexchange.com/questions/34590/standalone-package-creates-a-page-with-a-fixed-width?ref=elenesgu.dev">&#xB9C1;&#xD06C;</a>)</li>
<li>ImageMagick<br>
PDF &#xD30C;&#xC77C;&#xC744; &#xADF8;&#xB9BC;&#xD30C;&#xC77C;&#xB85C; &#xBCC0;&#xD658;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC774;&#xB2E4;. &#xAE30;&#xBCF8; &#xC124;&#xC815;&#xC73C;&#xB85C;&#xB294; PDF &#xD30C;&#xC77C;&#xC758; &#xBCC0;&#xD658;&#xC774; &#xBD88;&#xAC00;&#xB2A5;&#xD588;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;, <a href="https://stackoverflow.com/questions/42928765/convertnot-authorized-aaaa-error-constitute-c-readimage-453?ref=elenesgu.dev">&#xC2A4;&#xD0DD;&#xC624;&#xBC84;&#xD50C;&#xB85C;&#xC6B0;</a>&#xC758; &#xC9C0;&#xCE68;&#xB300;&#xB85C; profile.xml&#xC744; &#xC218;&#xC815;&#xD574;&#xC918;&#xC57C; &#xD588;&#xB2E4;.</li>
</ul>
<!--kg-card-end: markdown--><h1 id="-"> &#xC608;&#xC81C; &#xACFC;&#xC815;</h1><p> &#xBCF8; &#xAC8C;&#xC2DC;&#xAE00;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD55C; &#xC608;&#xC81C; TeX&#xD30C;&#xC77C;&#xC740; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;. &#xA0;standalone &#xD074;&#xB798;&#xC2A4;(<a href="https://ctan.org/pkg/standalone?ref=elenesgu.dev">CTAN</a>)&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xADF8;&#xB9BC;&#xB9CC; &#xB098;&#xC624;&#xB294; &#xB3C5;&#xB9BD;&#xC801;&#xC740; PDF&#xB97C; &#xC5BB;&#xC5B4;&#xB0BC; &#xAC83;&#xC774;&#xB2E4;. &#xC608;&#xC81C; &#xD30C;&#xC77C;&#xC758; &#xB0B4;&#xC6A9;&#xC740; Rail &#xBB38;&#xC11C;&#xC5D0; &#xC788;&#xB294; Rail&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xBB38;&#xBC95;&#xC744; &#xC124;&#xBA85;&#xD558;&#xB294; &#xC18C;&#xC2A4;&#xC774;&#xB2E4;. &#xB9CC;&#xC57D; &#xAE38;&#xC774;&#xAC00; &#xB108;&#xBB34; &#xAE38;&#xC5B4;&#xC11C; PDF&#xD06C;&#xAE30;&#xAC00; &#xBD80;&#xC871;&#xD558;&#xB2E4;&#xBA74; geometry&#xB4F1;&#xC758; &#xD328;&#xCE90;&#xC9C0;&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &#xAE38;&#xC774;&#xB97C; &#xD06C;&#xAC8C; &#xC9C0;&#xC815;&#xD574;&#xC8FC;&#xB294; &#xBC29;&#xBC95; &#xB4F1;&#xC73C;&#xB85C; &#xD574;&#xACB0; &#xD560; &#xC218; &#xC788;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-latex]">% example.tex
\documentclass[preview, varwidth=true]{standalone}
\usepackage{rail}
\railoptions{-ah} % rail option 
\begin{document}
\begin{rail}
    rules	: ( rule ? + &apos;;&apos; ) ;

    rule	: ( identifier &apos;:&apos; ) ? body[1--5] ;
    body	: [1] ( ( &apos;[&apos; string &apos;]&apos; ) ? body[2--6] + &apos;|&apos; )
                | [2] body[3--6] &apos;*&apos; body[5--6]
                | [2] body[3--6] &apos;+&apos; body[5--6]
                | [3] ( body[4--5] + )
                | [4] body[5] &apos;?&apos;
                | [5] identifier ( &apos;[&apos; string &apos;]&apos; ) ?
                | [5] quote string quote
                | [5] dquote string dquote
                | [5] &apos;(&apos; body[1--6] &apos;)&apos;
                | [5] cr
                | [6]
                ;

\end{rail}
\end{document}
</code></pre>
<!--kg-card-end: markdown--><p> LaTeX&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xB97C; &#xD558;&#xACE0; &#xB098;&#xBA74;, PDF&#xD30C;&#xC77C;&#xC758; &#xADF8;&#xB9BC;&#xC774; &#xC644;&#xC804;&#xD558;&#xC9C0; &#xC54A;&#xC740; &#xAC83;&#xC744; &#xC54C; &#xC218; &#xC788;&#xB2E4;. &#xC774; &#xB54C;, &#xD30C;&#xC77C;&#xBA85;&#xACFC; &#xAC19;&#xC740; rai &#xD30C;&#xC77C;(example.rai)&#xC774; &#xAC19;&#xC774; &#xB5A8;&#xC5B4;&#xC9C0;&#xAC8C; &#xB41C;&#xB2E4;. &#xA0;&#xC774; &#xD30C;&#xC77C;&#xC744; Rail&#xC744; &#xD1B5;&#xD574; &#xCC98;&#xB9AC;&#xD558;&#xACE0; &#xB098;&#xBA74; &#xD30C;&#xC77C;&#xBA85;&#xACFC; &#xAC19;&#xC740; rao&#xD30C;&#xC77C;(example.rao)&#xC744; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xACE0;, &#xC774; &#xAC83;&#xC744; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xB2E4;&#xC2DC; LaTeX&#xC5D0; &#xC785;&#xB825;&#xC73C;&#xB85C; &#xB123;&#xC73C;&#xBA74; PDF&#xB97C; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xB2E4;. &#xC774; PDF&#xB97C; &#xC0AC;&#xC9C4;&#xC73C;&#xB85C; &#xBC14;&#xAFB8;&#xBA74; &#xB05D;&#xC774;&#xB2E4;. &#xC704; &#xC608;&#xC81C;&#xC758; &#xACBD;&#xC6B0; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xC0AC;&#xC9C4;&#xC744; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://elenesgu.dev/content/images/2019/06/file.png" class="kg-image" alt loading="lazy"><figcaption>&#xC608;&#xC81C; &#xD30C;&#xC77C;&#xC758; &#xCD9C;&#xB825; &#xACB0;&#xACFC;</figcaption></figure><p> &#xB9D0;&#xB85C; &#xC124;&#xBA85;&#xD55C; &#xC704; &#xACFC;&#xC815;&#xC758; &#xBA85;&#xB839;&#xC5B4;&#xB4E4;&#xC740; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-bash">pdflatex example.tex

# rail &#xC5D0; &#xC635;&#xC158;&#xC744; &#xC9C1;&#xC811; &#xC904; &#xC218; &#xC788;&#xB2E4;. (\railoptions{-ah} &#xB300;&#xC2E0; rail -ah example)
# &#xD655;&#xC7A5;&#xC790;(rai)&#xB97C; &#xC81C;&#xC678;&#xD55C; &#xD30C;&#xC77C;&#xC774;&#xB984;&#xB9CC; &#xC785;&#xB825;&#xC73C;&#xB85C; &#xB123;&#xB294;&#xB2E4;.
$(PATH_TO_RAIL)/rail example

pdflatex example.tex

# &#xB9CC;&#xC57D; &#xACB0;&#xACFC; pdf&#xAC00; &#xB108;&#xBB34; &#xD074; &#xB54C;,
# profcrop.pl (input_file) (output_file)
$(PATH_TO_PDFCROP)/pdfcrop.pl example.pdf example_cropped.pdf

# &#xACB0;&#xACFC; pdf&#xB97C; &#xC0AC;&#xC9C4;&#xC73C;&#xB85C; &#xBC14;&#xAFB8;&#xB824;&#xBA74;
convert -density 300 -quality 90 \
    example_cropped.pdf figure_output.png
# dpi = 300, quality = 90 &#xC758; png&#xD30C;&#xC77C;&#xC744; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xB2E4;.
</code></pre>
<!--kg-card-end: markdown--><p>Rail&#xC744; &#xC0AC;&#xC6A9;&#xD55C; EBNF &#xADF8;&#xB9BC;&#xBFD0;&#xB9CC;&#xC774; &#xC544;&#xB2C8;&#xB77C; Tikz&#xB4F1;&#xC744; &#xC774;&#xC6A9;&#xD55C; &#xADF8;&#xB9BC; &#xB4F1;&#xB3C4; &#xB2F9;&#xC5F0;&#xD788; &#xC27D;&#xAC8C; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[Spatial Relation Algorithm in GEOS]]></title><description><![CDATA[<p> GIS &#xB610;&#xB294; Spatial database&#xC5D0;&#xC11C;&#xB294; 2&#xAC1C;&#xC758; geometry &#xAC1D;&#xCCB4; (&#xB610;&#xB294; spatial &#xAC1D;&#xCCB4;)&#xC0AC;&#xC774;&#xC758; &#xAD00;&#xACC4;&#xAC00; &#xC911;&#xC694;&#xD55C; &#xC694;&#xC18C;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xC5B4;, 2&#xAC1C;&#xC758; geometry&#xAC00; &#xC11C;&#xB85C; &#xACB9;&#xCE58;&#xB294;&#xC9C0; &#xB610;&#xB294; &#xB2E4;&#xB978;</p>]]></description><link>https://elenesgu.dev/relate-in-geos/</link><guid isPermaLink="false">5cb03838759fac000125a8cc</guid><dc:creator><![CDATA[Seungmin Lee]]></dc:creator><pubDate>Fri, 03 May 2019 08:19:52 GMT</pubDate><content:encoded><![CDATA[<p> GIS &#xB610;&#xB294; Spatial database&#xC5D0;&#xC11C;&#xB294; 2&#xAC1C;&#xC758; geometry &#xAC1D;&#xCCB4; (&#xB610;&#xB294; spatial &#xAC1D;&#xCCB4;)&#xC0AC;&#xC774;&#xC758; &#xAD00;&#xACC4;&#xAC00; &#xC911;&#xC694;&#xD55C; &#xC694;&#xC18C;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xC5B4;, 2&#xAC1C;&#xC758; geometry&#xAC00; &#xC11C;&#xB85C; &#xACB9;&#xCE58;&#xB294;&#xC9C0; &#xB610;&#xB294; &#xB2E4;&#xB978; &#xD558;&#xB098;&#xB97C; &#xD3EC;&#xD568;&#xD558;&#xB294;&#xC9C0;&#xC5D0; &#xB300;&#xD55C; &#xB300;&#xB2F5;&#xC744; &#xD560; &#xC218; &#xC788;&#xC5B4;&#xC57C;&#xD55C;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; geometry &#xC0AC;&#xC774;&#xC758; &#xAD00;&#xACC4;, &#xC989; &#xC704;&#xC0C1;&#xC801; &#xAD00;&#xACC4;(topological relation)&#xB97C; &#xACC4;&#xC0B0;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xD6A8;&#xC728;&#xC801;&#xC778; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC774; &#xD544;&#xC694;&#xD558;&#xB2E4;. &#xC774; &#xAE00;&#xC5D0;&#xC11C;&#xB294; &#xC624;&#xD508;&#xC18C;&#xC2A4; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xC778; GEOS&#xC5D0;&#xC11C; &#xC5B4;&#xB5BB;&#xAC8C; &#xB450; geometry&#xC758; &#xAD00;&#xACC4;&#xB97C; &#xD655;&#xC778;&#xD558;&#xB294;&#xC9C0;&#xB97C; &#xD1B5;&#xD574;, &#xC704;&#xC0C1;&#xC801; &#xAD00;&#xACC4;&#xB97C; &#xACC4;&#xC0B0;&#xD558;&#xB294; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC5D0; &#xB300;&#xD574; &#xC54C;&#xC544;&#xBCF4;&#xB824;&#xACE0; &#xD55C;&#xB2E4;.</p><p> GEOS&#xC5D0;&#xC11C;&#xB294; &#xB450; geometry &#xAC1D;&#xCCB4;&#xC758; &#xC704;&#xC0C1;&#xC801; &#xAD00;&#xACC4;&#xB97C; (topologiocal relation) DE-9IM(Dimensionally Extended nine-Intersection Model)&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xD45C;&#xD604;&#xD55C;&#xB2E4;. &#xC774;&#xC5D0; &#xAD00;&#xD55C; &#xC124;&#xBA85;&#xC740; OGC&#xC758; <a href="http://www.opengeospatial.org/docs/is/?ref=elenesgu.dev">simple feature specification&#xC5D0; &#xAD00;&#xD55C; &#xBB38;&#xC11C;</a>&#xC5D0;&#xC11C; (&#xB610;&#xB294; <a href="https://en.wikipedia.org/wiki/DE-9IM?ref=elenesgu.dev">&#xC704;&#xD0A4;&#xD53C;&#xB514;&#xC544;</a>&#xC5D0;&#xC11C;) &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xB530;&#xB77C;&#xC11C;, GEOS&#xC5D0;&#xC11C; &#xC704;&#xC0C1;&#xC801; &#xAD00;&#xACC4;&#xB97C; &#xD30C;&#xC545;&#xD558;&#xB294; &#xD568;&#xC218;&#xB77C;&#xB294; &#xAC83;&#xC740; &#xACB0;&#xAD6D; &#xC774; DE-9IM(&#xC774;&#xD558; IM)&#xB97C; &#xACC4;&#xC0B0;&#xD558;&#xB294; &#xD568;&#xC218;&#xB97C; &#xC758;&#xBBF8;&#xD558;&#xACE0;, &#xACE7; IM&#xC744; &#xACC4;&#xC0B0;&#xD558;&#xB294; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xD1B5;&#xD574; &#xC704;&#xC0C1;&#xC801; &#xAD00;&#xACC4;&#xB97C; &#xC5BB;&#xC5B4;&#xB0B4;&#xB294; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xB2E4;. &#xB2E4;&#xC74C; &#xCF54;&#xB4DC;&#xB294; GEOS&#xC5D0;&#xC11C; &#xC704;&#xC0C1;&#xC801; &#xAD00;&#xACC4;&#xB97C; &#xD655;&#xC778;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC774;&#xB2E4;. &#xAC01; &#xD568;&#xC218;&#xB4E4;&#xC758; &#xAD6C;&#xD604;&#xCCB4;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74;, IM&#xACC4;&#xC0B0;&#xD55C; &#xB4A4; &#xADF8; &#xAC12;&#xC744; &#xD1B5;&#xD574; bool&#xAC12;&#xC744; &#xBC18;&#xD658;&#xD558;&#xACE0; &#xC788;&#xB294; &#xAC83;&#xC744; &#xC54C; &#xC218; &#xC788;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">//from a GEOS test c++ code.
//test/geostest/geostest.c

GEOSGeometry* g1;
GEOSGeometry* g2;

//Query topological relations using functions.
if ( GEOSIntersects(g1, g2) ) printf(&quot;Intersect\n&quot;);
if ( GEOSDisjoint(g1, g2) ) printf(&quot;Disjoint\n&quot;);
if ( GEOSTouches(g1, g2) ) printf(&quot;Touches\n&quot;);
if ( GEOSCrosses(g1, g2) ) printf(&quot;Crosses\n&quot;);
if ( GEOSWithin(g1, g2) ) printf(&quot;Within\n&quot;);
if ( GEOSContains(g1, g2) ) printf(&quot;Contains\n&quot;);
if ( GEOSOverlaps(g1, g2) ) printf(&quot;Overlaps\n&quot;);

//Query topological relations using IM.
auto ptr = GEOSRelate(g1, g2);
if( GEOSRelatePattern(g1, g2, ptr) )

//in each function
{
    ...
    unique_ptr&lt;IntersectionMatrix&gt; im ( relate(g) );
    return im-&gt;~();
}
</code></pre>
<!--kg-card-end: markdown--><h1 id="geometry-graph">Geometry Graph</h1><p>IM&#xC744; &#xAD6C;&#xD558;&#xB294; &#xACFC;&#xC815;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xAE30; &#xC804;&#xC5D0;, GEOS&#xC5D0;&#xC11C; IM&#xACC4;&#xC0B0;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; GeometryGraph&#xD074;&#xB798;&#xC2A4;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xB824;&#xACE0; &#xD55C;&#xB2E4;. GeometryGraph&#xB294; geometr&#xC744; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xC0DD;&#xC131;&#xB41C; &#xB178;&#xB4DC;(node)&#xC640; &#xC5E3;&#xC9C0;(edge)&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB294; &#xADF8;&#xB798;&#xD504;&#xB85C;&#xC11C; &#xAC01; &#xB178;&#xB4DC;&#xC640; &#xC5E3;&#xC9C0;&#xC5D0;&#xB294; (&#xBC14;&#xD0D5;&#xC774;&#xB418;&#xB294;) geometry&#xC758; &#xC810;(&#xB4E4;)&#xACFC; &#xC120;(&#xB4E4;)&#xC774; &#xC5B4;&#xB290; &#xC704;&#xCE58;&#xC5D0; &#xC788;&#xB294;&#xC9C0;&#xC5D0; &#xB300;&#xD55C; &#xC704;&#xC0C1;&#xC801; &#xAD00;&#xACC4;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xACE0; &#xC788;&#xB2E4;. &#xC5B8;&#xB4EF; &#xC9C1;&#xAD00;&#xC801;&#xC73C;&#xB85C; &#xC774;&#xD574;&#xAC00; &#xB418;&#xC9C0; &#xC54A;&#xC73C;&#xBBC0;&#xB85C; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xC608;&#xC81C;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;. &#xB2E4;&#xC74C;&#xC740; &#xD3F4;&#xB9AC;&#xACE4; &#xD615;&#xC2DD;&#xC758; geometry&#xB85C;, &#xB0B4;&#xBD80;&#xC5D0; 2&#xAC1C;&#xC758; ring&#xC774; &#xC874;&#xC7AC;&#xD55C;&#xB2E4;. &#xB0B4;&#xBD80; ring &#xC0AC;&#xC774;&#xC758; &#xACF5;&#xAC04;&#xC740; &#xC774; &#xD3F4;&#xB9AC;&#xACE4;&#xC5D0; &#xC18D;&#xD55C;&#xB2E4;&#xACE0; &#xAC04;&#xC8FC;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;. (&#xC989;, exterior &#xC774;&#xB2E4;.) GEOS (&#xB610;&#xB294; &#xAE30;&#xD0C0; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;)&#xC5D0;&#xC11C; &#xD3F4;&#xB9AC;&#xACE4;&#xC744; &#xC800;&#xC7A5;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC744; &#xB5A0;&#xC62C;&#xB9AC;&#xBA74; &#xADF8;&#xB9BC;&#xC758; &#xC120;&#xC740; &#xC2E4;&#xC81C;&#xB85C; &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;&#xB294; &#xAC83;&#xC744; &#xC54C; &#xC218; &#xC788;&#xB2E4;. &#xC989;, &#xADF8;&#xB9BC;&#xC5D0;&#xC11C;&#xB294; &#xC810;&#xACFC; &#xC120;&#xC73C;&#xB85C; &#xD45C;&#xD604;&#xD588;&#xC9C0;&#xB9CC;, &#xC800;&#xC7A5;&#xD55C; &#xB370;&#xC774;&#xD130;&#xB4E4;&#xC740; &#xC810;&#xC758; &#xC88C;&#xD45C;&#xC758; &#xBC30;&#xC5F4;&#xBFD0;&#xC774;&#xB2E4;. &#xC2E4;&#xC81C;&#xB85C;&#xB294; &#xC810; &#xC0AC;&#xC774;&#xC758; &#xC120;&#xC740; (&#xBA54;&#xBAA8;&#xB9AC;&#xC5D0;) &#xC874;&#xC7AC;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xBC30;&#xC5F4;&#xC5D0;&#xC11C; &#xC5F0;&#xC18D;&#xB41C; &#xB450; &#xC810; &#xC0AC;&#xC774;&#xB97C; &#xC9C1;&#xC120;&#xC73C;&#xB85C; &#xC787;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xC0DD;&#xAC01;&#xD55C;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; &#xC774; &#xD3F4;&#xB9AC;&#xACE4;&#xC740; 3&#xAC1C;&#xC758; &#xC810;&#xC758; &#xBC30;&#xC5F4;&#xB4E4;&#xB85C; &#xAD6C;&#xC131;&#xB418;&#xC5B4; &#xC788;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://elenesgu.dev/content/images/2019/04/image-13.png" class="kg-image" alt loading="lazy"></figure><p> &#xC774; geometry&#xB85C; &#xC0DD;&#xC131;&#xD55C; GeometryGraph&#xB294; 3&#xAC1C;&#xC758; &#xB178;&#xB4DC;&#xC640; 3&#xAC1C;&#xC758; &#xC5E3;&#xC9C0;&#xB85C; &#xAD6C;&#xC131;&#xB418;&#xC5B4;&#xC788;&#xB2E4;. Geometry&#xC758; &#xC810;&#xB4E4;&#xC744; &#xBCF4;&#xACE0;, &#xC810;&#xC758; &#xBC30;&#xC5F4;&#xC744; 1&#xAC1C;&#xC758; &#xC5E3;&#xC9C0;&#xB85C;, &#xC810;&#xC758; &#xBC30;&#xC5F4; &#xC911; &#xBA87;&#xAC1C;&#xB97C; &#xC120;&#xD0DD;&#xD558;&#xC5EC; &#xB178;&#xB4DC;&#xB85C; &#xC800;&#xC7A5;&#xD55C;&#xB2E4;. &#xB2E4;&#xC74C; &#xADF8;&#xB9BC;&#xC744; &#xD1B5;&#xD574; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;. &#xB178;&#xB4DC;&#xC758; &#xACBD;&#xC6B0; &#xADF8;&#xB9BC;&#xC5D0;&#xC11C; &#xC810;&#xC120;&#xC73C;&#xB85C; &#xD45C;&#xD604;&#xD55C; &#xC810;&#xB4E4;&#xC774; &#xD574;&#xB2F9;&#xD55C;&#xB2E4;. &#xC5E3;&#xC9C0;&#xC758; &#xACBD;&#xC6B0;, &#xAC19;&#xC740; &#xC0C9;&#xC758; &#xC810;&#xB4E4;&#xC758; &#xC88C;&#xD45C;&#xAC12;&#xC744; &#xBC30;&#xC5F4;&#xB85C; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB2E4;. &#xC989;, &#xC704;&#xC5D0;&#xC11C; &#xD3F4;&#xB9AC;&#xACE4;&#xC744; &#xB098;&#xD0C0;&#xB0BC; &#xB54C; &#xC0AC;&#xC6A9;&#xD55C; &#xC810;&#xC758; &#xBC30;&#xC5F4;&#xB9C8;&#xB2E4; 1&#xAC1C;&#xC758; &#xB178;&#xB4DC;&#xC640; 1&#xAC1C;&#xC758; &#xC5E3;&#xC9C0;&#xB97C; &#xC0DD;&#xC131;&#xD55C; &#xAC83;&#xC774;&#xB2E4;. &#xC774;&#xC81C; &#xAC01; &#xB178;&#xB4DC; &#xB610;&#xB294; &#xC5E3;&#xC9C0;&#xB9C8;&#xB2E4; &#xB77C;&#xBCA8;&#xC744; &#xD558;&#xB098;&#xC529; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB2E4;. &#xBE68;&#xAC04; &#xC120;&#xC758; &#xC9D1;&#xD569;&#xC73C;&#xB85C; &#xC778;&#xD574; &#xC0DD;&#xC131;&#xB41C; 1&#xAC1C;&#xC758; &#xC5E3;&#xC9C0;&#xC5D0;&#xB294; on: boundary, left: exterior, right: interior&#xB77C;&#xB294; &#xB77C;&#xBCA8;&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xACE0;, &#xB0B4;&#xBD80; &#xB9C1;&#xC5D0; &#xD574;&#xB2F9;&#xD558;&#xB294; &#xD30C;&#xB780;&#xC0C9;&#xACFC; &#xCD08;&#xB85D;&#xC0C9;&#xC73C;&#xB85C; &#xC778;&#xD574; &#xC0DD;&#xC131;&#xB41C; &#xC5E3;&#xC9C0; 2&#xAC1C;&#xB294; &#xAC01;&#xAC01; on: boundary, left: interior, right: exterior &#xB77C;&#xB294; &#xAC12;&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://elenesgu.dev/content/images/2019/04/image-14.png" class="kg-image" alt loading="lazy"></figure><p> &#xA0;&#xC774; &#xACBD;&#xC6B0;&#xB294; &#xD3F4;&#xB9AC;&#xACE4;&#xC758; &#xACBD;&#xC6B0;&#xC600;&#xACE0;, &#xB77C;&#xC778;&#xC2A4;&#xD2B8;&#xB9C1; &#xAC19;&#xC740; 2&#xCC28;&#xC6D0; &#xAC1D;&#xCCB4;&#xB4E4;&#xC740; &#xD55C;&#xAC1C;&#xC758; &#xC810;&#xC758; &#xBC30;&#xC5F4;&#xB9C8;&#xB2E4; &#xCC98;&#xC74C; &#xC810;&#xACFC; &#xB9C8;&#xC9C0;&#xB9C9; &#xC810;&#xC744; &#xB178;&#xB4DC;&#xB85C; &#xC800;&#xC7A5;&#xD55C;&#xB2E4;. &#xC989;, &#xC120;&#xC758; &#xC591; &#xB05D;&#xC810;&#xC744; &#xB178;&#xB4DC;&#xB85C;, &#xC804;&#xCCB4; &#xC810;&#xC758; &#xC9D1;&#xD569;&#xC744; &#xC5E3;&#xC9C0;&#xB85C; &#xC800;&#xC7A5;&#xD55C;&#xB2E4;. &#xC774; &#xB54C;, &#xC5E3;&#xC9C0;&#xC758; &#xB77C;&#xBCA8;&#xC740; on: interior&#xC774; &#xB418;&#xACE0; &#xB178;&#xB4DC;&#xC758; &#xB77C;&#xBCA8;&#xC740; on:boundary&#xAC00; &#xB420; &#xAC83;&#xC774;&#xB2E4;.</p><h1 id="computing-im"> Computing IM</h1><p> &#xB2E4;&#xC2DC; IM&#xC744; &#xACC4;&#xC0B0;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xACFC;&#xC815;&#xC73C;&#xB85C; &#xB3CC;&#xC544;&#xC640;&#xC11C; GEOS&#xC758; &#xC218;&#xD589;&#xACFC;&#xC815;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;. &#xC774; &#xACFC;&#xC815;&#xC744; &#xC218;&#xD589; &#xD574;&#xC8FC;&#xB294; &#xD074;&#xB798;&#xC2A4;&#xB294; RelateOp&#xB2E4;. RelateOp&#xB294; &#xACC4;&#xC0B0;&#xD55C; &#xB450; &#xAC1C;&#xC758; geometry&#xB97C; &#xC785;&#xB825;&#xC73C;&#xB85C; &#xBC1B;&#xACE0; GeometryGraph&#xC744; &#xC0DD;&#xC131;&#xD55C; &#xB4A4; relateComp&#xB77C;&#xB294; &#xAC1D;&#xCCB4;&#xB97C; &#xD1B5;&#xD574; IM&#xC744; &#xACC4;&#xC0B0;&#xD55C;&#xB2E4;. &#xADF8; &#xD6C4; &#xACC4;&#xC0B0;&#xD55C; IM&#xC744; &#xBC18;&#xD658;&#xD558;&#xBA74; &#xC774; &#xAC12;&#xC744; &#xD1B5;&#xD574; &#xC704;&#xC0C1;&#xC801; &#xAD00;&#xACC4;&#xB97C; &#xD30C;&#xC545;&#xD55C;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">//a-&gt;relate(b) =&gt;
//RelateOp::relate(this, other)
IntersectionMatrix*
RelateOp::relate(const Geometry *a, const Geometry *b)
{
	RelateOp relOp(a,b);
	return relOp.getIntersectionMatrix();
}

RelateOp::RelateOp(const Geometry *g0, const Geometry *g1):
	GeometryGraphOperation(g0, g1),
	relateComp(&amp;arg)
{
}

IntersectionMatrix*
RelateOp::getIntersectionMatrix()
{
	return relateComp.computeIM();
}
</code></pre>
<!--kg-card-end: markdown--><p> &#xB530;&#xB77C;&#xC11C;, IM&#xC744; &#xACC4;&#xC0B0;&#xD574;&#xC8FC;&#xB294; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC758; &#xC911;&#xC2EC;&#xC801;&#xC778; &#xBD80;&#xBD84;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; RelateComputer &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xC774;&#xD574;&#xD574;&#xC57C; &#xD55C;&#xB2E4;. &#xA0;IM&#xC744; &#xACC4;&#xC0B0;&#xD558;&#xB294; RelateComputer::computeIM &#xD568;&#xC218;&#xC758; (&#xAC04;&#xC18C;&#xD654;&#xB41C;) &#xCF54;&#xB4DC;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code>IntersectionMatrix*
RelateComputer::computeIM()
{
    // if the Geometries don&apos;t overlap there is nothing to do
    const Envelope *e1=(*arg)[0]-&gt;getGeometry()
                -&gt;getEnvelopeInternal();
    const Envelope *e2=(*arg)[1]-&gt;getGeometry()
                -&gt;getEnvelopeInternal();
    if (!e1-&gt;intersects(e2)) {
        computeDisjointIM(im.get());
        return im.release();
    }

    std::unique_ptr&lt;SegmentIntersector&gt; si1 (
        (*arg)[0]-&gt;computeSelfNodes(&amp;li,false)
    );
    std::unique_ptr&lt;SegmentIntersector&gt; si2 (
        (*arg)[1]-&gt;computeSelfNodes(&amp;li,false)
    );

    std::unique_ptr&lt; SegmentIntersector&gt; intersector (
        (*arg)[0]-&gt;computeEdgeIntersections((*arg)[1], &amp;li,false)
    );

    computeIntersectionNodes(0);
    computeIntersectionNodes(1);

    copyNodesAndLabels(0);
    copyNodesAndLabels(1);

    labelIsolatedNodes();

    computeProperIntersectionIM(intersector.get(), im.get());

    EdgeEndBuilder eeBuilder;
    std::unique_ptr&lt; std::vector&lt;EdgeEnd*&gt; &gt; ee0 (
        eeBuilder.computeEdgeEnds((*arg)[0]-&gt;getEdges())
    );
    insertEdgeEnds(ee0.get());
    std::unique_ptr&lt; std::vector&lt;EdgeEnd*&gt; &gt; ee1 (
        eeBuilder.computeEdgeEnds((*arg)[1]-&gt;getEdges())
    );

    insertEdgeEnds(ee1.get());

    labelNodeEdges();

    labelIsolatedEdges(0,1);

    labelIsolatedEdges(1,0);

    updateIM( *im );
    return im.release();
}
</code></pre>
<!--kg-card-end: markdown--><p> &#xC774;&#xC81C; &#xC774; &#xCF54;&#xB4DC;&#xB97C; &#xD30C;&#xC545;&#xD574; &#xBCF4;&#xC790;. &#xBA3C;&#xC800; &#xB450; geometry&#xC758; MBR (envelope in GEOS)&#xC774; &#xC11C;&#xB85C; &#xACB9;&#xCE58;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;&#xBA74;, geometry&#xB4E4; &#xB07C;&#xB9AC;&#xB3C4; &#xC5ED;&#xC2DC; &#xC544;&#xBB34;&#xB7F0; &#xC704;&#xC0C1; &#xAD00;&#xACC4;&#xAC00; &#xC5C6;&#xB2E4;&#xB294; &#xAC83;&#xC740; &#xC27D;&#xAC8C; &#xC54C; &#xC218; &#xC788;&#xB2E4;. &#xB530;&#xB77C;&#xC11C;, MBR&#xAC04;&#xC758; &#xAD00;&#xACC4;&#xB97C; &#xBA3C;&#xC800; &#xD655;&#xC778;&#xD574;&#xBCF8;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">const Envelope *e1=(*arg)[0]-&gt;getGeometry()-&gt;getEnvelopeInternal();
const Envelope *e2=(*arg)[1]-&gt;getGeometry()-&gt;getEnvelopeInternal();
if (!e1-&gt;intersects(e2)) {
    computeDisjointIM(im.get());
    return im.release();
}
</code></pre>
<!--kg-card-end: markdown--><p> &#xB2E4;&#xC74C;&#xC740; &#xC5B4;&#xB5A4; &#xAC04;&#xC120; &#xC30D;&#xC774; &#xACB9;&#xCE58;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD558;&#xACE0; &#xC800;&#xC7A5;&#xD55C;&#xB2E4;. GEOS&#xC5D0;&#xC11C;&#xB294; &#xBA3C;&#xC800;, &#xD55C; geometry &#xB0B4;&#xBD80;&#xC5D0;&#xC11C; &#xC2A4;&#xC2A4;&#xB85C; &#xACB9;&#xCE58;&#xB294; &#xC120;&#xC774; &#xC788;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD55C;&#xB2E4;. GeometryCollection&#xC774;&#xB098; LineStirng&#xC758; &#xACBD;&#xC6B0; &#xC2A4;&#xC2A4;&#xB85C; &#xACB9;&#xCE58;&#xB294; &#xC120;&#xC774; &#xC788;&#xC744; &#xC218; &#xC788;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; &#xACBD;&#xC6B0; &#xD574;&#xB2F9; intersection&#xC744; &#xB530;&#xB85C; &#xC800;&#xC7A5;&#xD55C;&#xB2E4;. &#xB2E4;&#xB978; geometry &#xAC1D;&#xCCB4;&#xC640; &#xACB9;&#xCE58;&#xB294; &#xBD80;&#xBD84;&#xC774; &#xC544;&#xB2C8;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xB2E4;. &#xADF8; &#xB2E4;&#xC74C; geometry &#xC0AC;&#xC774;&#xC5D0;&#xC11C; &#xACB9;&#xCE58;&#xB294; &#xAC04;&#xC120; &#xC30D;&#xC744; &#xCC3E;&#xB294;&#xB2E4;. &#xC774; &#xACFC;&#xC815;&#xC744; &#xD45C;&#xD604;&#xD55C; &#xCF54;&#xB4DC;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;. Intersection&#xC5D0; &#xB300;&#xD55C; &#xC5EC;&#xBD80;&#xB294; &#xC704;&#xC5D0;&#xC11C; &#xC11C;&#xC220;&#xD55C; GeometryGraph&#xC5D0; &#xC758;&#xD574; &#xC815;&#xBCF4;&#xAC00; &#xC800;&#xC7A5;&#xB41C;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-C++">std::unique_ptr&lt;SegmentIntersector&gt; si1 (
    (*arg)[0]-&gt;computeSelfNodes(&amp;li,false)
);
std::unique_ptr&lt;SegmentIntersector&gt; si2 (
    (*arg)[1]-&gt;computeSelfNodes(&amp;li,false)
);

std::unique_ptr&lt; SegmentIntersector&gt; intersector (
    (*arg)[0]-&gt;computeEdgeIntersections((*arg)[1], &amp;li,false)
);
</code></pre>
<!--kg-card-end: markdown--><h1 id="monotone-chian-sweep-line-algorithm">Monotone chian sweep line algorithm</h1><p> &#xC11C;&#xB85C; &#xACB9;&#xCE58;&#xB294; &#xC120;&#xC744; &#xCC3E;&#xC744; &#xB54C;&#xB294; brute force&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; (&#xBAA8;&#xB4E0; &#xC120; &#xC30D;&#xB4E4;&#xC744; &#xBE44;&#xAD50;&#xD558;&#xB294; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC778;) quadratic time algorithm&#xC744; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xB3C4; &#xC788;&#xB2E4;. &#xADF8;&#xB807;&#xC9C0;&#xB9CC; &#xC880; &#xB354; &#xD6A8;&#xC728;&#xC801;&#xC778; &#xACC4;&#xC0B0;&#xC744; &#xC704;&#xD574; GEOS&#xC5D0;&#xC11C;&#xB294; &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; monotone-chain sweep line algorithm&#xC744; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;. &#xC774; &#xACFC;&#xC815;&#xC5D0;&#xC11C; &#xC704;&#xC5D0;&#xC11C; &#xC11C;&#xC220;&#xD55C; GeometryGraph&#xB97C; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;. &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC5D0; &#xB300;&#xD55C; &#xC774;&#xB860;&#xC801;&#xC778; &#xC124;&#xBA85;&#xC740; &#xB2E4;&#xC74C; &#xB17C;&#xBB38;&#xC5D0;&#xC11C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB2E4;. (<a href="https://link.springer.com/chapter/10.1007/978-0-387-35490-3_21?ref=elenesgu.dev">&#xB9C1;&#xD06C;</a>) GEOS&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; monotone-chain&#xACFC;&#xB294; &#xC57D;&#xAC04; &#xB2E4;&#xB974;&#xC9C0;&#xB9CC;, &#xD575;&#xC2EC;&#xC774; &#xB418;&#xB294; &#xB0B4;&#xC6A9;&#xC740; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;. Chain (polygonal chain)&#xC740; &#xC5F0;&#xACB0;&#xB41C; &#xC120;&#xC758; &#xC9D1;&#xD569;&#xC774;&#xB2E4;. Monotone chain&#xB3C4; &#xC5ED;&#xC2DC; chain&#xC758; &#xC77C;&#xC885;&#xC73C;&#xB85C; &#xC120;&#xC758; &#xC9D1;&#xD569;&#xC73C;&#xB85C; &#xAD6C;&#xC131;&#xB418;&#xC5B4;&#xC788;&#xB2E4;. &#xC911;&#xC694;&#xD55C; &#xD3EC;&#xC778;&#xD2B8;&#xB294; monotone chain&#xC18D;&#xC758; &#xC120;&#xB4E4;&#xC740; &#xC11C;&#xB85C; &#xACB9;&#xCE58;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;&#xB294; &#xAC83;&#xC774;&#xB2E4;. &#xC774;&#xB97C; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xD558;&#xBA74;, &#xBAA8;&#xB4E0; &#xC120;&#xB4E4;&#xC744; monotone chain&#xC73C;&#xB85C; &#xAD6C;&#xC131;&#xD558;&#xACE0; monotone chain&#xC0AC;&#xC774;&#xC5D0; intersection&#xC774; &#xC788;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD558;&#xBA74; &#xB354; &#xD6A8;&#xC728;&#xC801;&#xC73C;&#xB85C; &#xCC3E;&#xC744; &#xC218; &#xC788;&#xB2E4;. &#xB17C;&#xBB38;&#xC5D0; &#xB530;&#xB978; &#xC218;&#xD559;&#xC801;&#xC778; monotone chain&#xC758; &#xC815;&#xC758;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><!--kg-card-begin: markdown--><blockquote>
<p>&#xC5B4;&#xB5A4; chain C &#xC5B4;&#xB5A4; &#xC120; L&#xC5D0; &#xC218;&#xC9C1;&#xC778; &#xBAA8;&#xB4E0; &#xC120; L0&#xC5D0; &#xB300;&#xD574; &#xAD50;&#xC810;&#xC774; &#xCD5C;&#xB300; 1&#xAC1C;&#xC774;&#xBA74;, &#xADF8; chain C&#xB294; &#xC120; L&#xC5D0; &#xB300;&#xD574; monotone &#xC774;&#xB2E4;. (A chain C is monotone w.r.t L if there is at most one intersection point between C and all lines L0 s.t. L0 is perpendicular to L.)</p>
</blockquote>
<!--kg-card-end: markdown--><p> GEOS&#xC5D0;&#xC11C;&#xB294; &#xC57D;&#xAC04; &#xC18D;&#xC131;&#xC744; &#xBC14;&#xAFB8;&#xC5B4; monotone chain&#xC744; &#xB2E4;&#xB974;&#xAC8C; &#xC815;&#xC758;&#xD558;&#xC600;&#xB2E4;. &#xB2E4;&#xB978; &#xC815;&#xC758;&#xC5D0; &#xB530;&#xB974;&#xBA74; &#xD55C; &#xAC1C;&#xC758; monotone chain &#xC18D;&#xC758; &#xBAA8;&#xB4E0; &#xC120;&#xC774; &#xC11C;&#xB85C; &#xACB9;&#xCE58;&#xC9C0; &#xC54A;&#xB294; &#xAC83;&#xC740; &#xBB3C;&#xB860; &#xC591; &#xB05D; &#xC120;&#xC758; &#xB05D; &#xC810;&#xC73C;&#xB85C; &#xC774;&#xB8E8;&#xC5B4;&#xC9C4; MBR (envelope) &#xC18D;&#xC5D0; &#xBAA8;&#xB4E0; &#xC120;&#xC774; &#xC18D;&#xD55C;&#xB2E4;. &#xB530;&#xB77C;&#xC11C;, 2&#xAC1C;&#xC758; monotone chain&#xC774; &#xC788;&#xC744; &#xB54C; MBR&#xC758; &#xBE44;&#xAD50;&#xB97C; &#xD1B5;&#xD574; &#xB354; &#xBE68;&#xB9AC; intersection&#xC744; &#xCC3E;&#xC744; &#xC218; &#xC788;&#xC744; &#xAC83;&#xC774;&#xB2E4;. &#xC774;&#xB97C; &#xC704;&#xD574; GEOS&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xBC29;&#xBC95;&#xC73C;&#xB85C; monotone chain&#xC744; &#xAD6C;&#xC131;&#xD55C;&#xB2E4;. &#xC544;&#xB798; &#xADF8;&#xB9BC;&#xC5D0;&#xC11C; &#xAC19;&#xC740; &#xC0C9;&#xC758; &#xC810;&#xB4E4;&#xC774; &#xD55C; monotone chain&#xC5D0; &#xC18D;&#xD55C;&#xB2E4;. &#xC0C9;&#xC774; &#xCE60;&#xD574;&#xC838; &#xC788;&#xC9C0; &#xC54A;&#xB294; &#xC810;&#xB4E4;&#xC740; &#xC591; &#xCABD;&#xC758; monotone chain&#xC5D0; &#xC18D;&#xD558;&#xB294; &#xAC83;&#xC774;&#xB2E4;. &#xC989;, &#xBE68;&#xAC04;&#xC0C9;&#xACFC; &#xBCF4;&#xB77C;&#xC0C9; monotone chain&#xC740; 1&#xAC1C;&#xC758; &#xC810;&#xC744; &#xACF5;&#xC720;&#xD55C;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://elenesgu.dev/content/images/2019/04/image-15.png" class="kg-image" alt loading="lazy"></figure><p> &#xC774;&#xC81C;, Monotone chain&#xC744; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; sweep line algorithm&#xC744; &#xD1B5;&#xD574; intersection&#xC744; &#xCC3E;&#xB294;&#xB2E4;. &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; x&#xCD95;&#xC73C;&#xB85C; &#xC815;&#xB82C;&#xC744; &#xD558;&#xACE0;, x&#xCD95;&#xC5D0; &#xC218;&#xC9C1;&#xC778; &#xC120;(sweep line)&#xC744; &#xAE0B;&#xACE0; &#xC774;&#xC640; &#xACB9;&#xCE58;&#xB294; &#xAC1D;&#xCCB4;&#xB4E4; (&#xC5EC;&#xAE30;&#xC11C;&#xB294; monotone chain) &#xC0AC;&#xC774;&#xC5D0;&#xC11C;&#xB9CC; intersection&#xC744; &#xCC3E;&#xB294;&#xB2E4;. &#xAC01; &#xC810;&#xC758; x&#xC88C;&#xD45C;&#xC5D0; &#xD574;&#xB2F9;&#xD558;&#xB294; &#xC810;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB9CC; &#xC120;&#xC744; &#xADF8;&#xC73C;&#xBA74; &#xB41C;&#xB2E4;&#xB294; &#xC810;&#xC740; &#xC27D;&#xAC8C; &#xB3C4;&#xCD9C;&#xD574; &#xB0BC; &#xC218; &#xC788;&#xB2E4;. Monotone chain&#xC744; &#xC0AC;&#xC6A9;&#xD560; &#xACBD;&#xC6B0;, &#xAC01; chain&#xC758; &#xC2DC;&#xC791;&#xC810;&#xACFC; &#xB05D;&#xC810;&#xC758; x&#xC88C;&#xD45C;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xD604;&#xC7AC; sweep line&#xACFC; &#xACB9;&#xCE58;&#xB294; monotone chain&#xC758; &#xC9D1;&#xD569;&#xC744; &#xC27D;&#xAC8C; &#xC720;&#xC9C0;&#xD560; &#xC218; &#xC788;&#xB2E4;. GEOS&#xC5D0;&#xB294; &#xC774; &#xC815;&#xBCF4;&#xB97C; event&#xD615;&#xD0DC;&#xB85C; &#xAD00;&#xB9AC;&#xD55C;&#xB2E4;. Monotone chain&#xC758; &#xC2DC;&#xC791;&#xC810;&#xC744; &#xAE30;&#xC900;&#xC73C;&#xB85C; insert event&#xB97C; &#xC0BD;&#xC785;&#xD558;&#xACE0; &#xB05D;&#xC810;&#xC744; &#xAE30;&#xC900;&#xC73C;&#xB85C; delete event&#xB97C; &#xC0AC;&#xC6A9;&#xD55C;&#xB2E4;.</p><h1 id="computing-im-continued-">Computing IM (continued)</h1><p> &#xC774;&#xC81C; &#xCF54;&#xB4DC;&#xB85C; &#xB3CC;&#xC544;&#xC640;&#xC11C; &#xC5B4;&#xB5BB;&#xAC8C; &#xC704; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC744; &#xC0AC;&#xC6A9;&#xD588;&#xB294;&#xC9C0; &#xC54C;&#xC544;&#xBCF4;&#xC790;. </p><!--kg-card-begin: markdown--><pre><code class="language-c++">unique_ptr&lt;EdgeSetIntersector&gt; esi(createEdgeSetIntersector());

typedef vector&lt;Edge*&gt; EC;

EC self_edges_copy;
EC other_edges_copy;

EC *se = edges;
EC *oe = g-&gt;edges;
if ( env &amp;&amp; ! env-&gt;covers(parentGeom-&gt;getEnvelopeInternal()) ) {
    collect_intersecting_edges(env, se-&gt;begin(), se-&gt;end(), self_edges_copy);
    se = &amp;self_edges_copy;
}
if ( env &amp;&amp; ! env-&gt;covers(g-&gt;parentGeom-&gt;getEnvelopeInternal()) ) {
    collect_intersecting_edges(env, oe-&gt;begin(), oe-&gt;end(), other_edges_copy);
    oe = &amp;other_edges_copy;
}
esi-&gt;computeIntersections(se, oe, si);
</code></pre>
<!--kg-card-end: markdown--><p> &#xC5EC;&#xAE30;&#xC11C;, EdgeSetInetersector&#xB97C; &#xD1B5;&#xD574; &#xACC4;&#xC0B0;&#xD558;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB2E4;. EdgeSetIntersector&#xB294; intersection&#xC744; &#xCC3E;&#xB294; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC758; &#xCD94;&#xC0C1;&#xD654; &#xD074;&#xB798;&#xC2A4;&#xB85C;, GEOS&#xC5D0;&#xC11C;&#xB294; &#xD604;&#xC7AC; &#xC704;&#xC5D0; &#xC124;&#xBA85;&#xD55C; monotone chain sweep line algorithm &#xC744; &#xAD6C;&#xD604;&#xD55C; SimpleMCSweepLineIntersector&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xB2E4;. &#xD574;&#xB2F9; &#xCF54;&#xB4DC;&#xC5D0; &#xB300;&#xD55C; &#xB0B4;&#xC6A9;&#xC740; &#xC774; &#xAE00;&#xC5D0;&#xC11C;&#xB294; &#xC0DD;&#xB7B5;&#xD55C;&#xB2E4;. &#xAD50;&#xC810;(&#xC758; &#xD6C4;&#xBCF4;)&#xC744; &#xCC3E;&#xB294;&#xB2E4;&#xBA74;, (monotone chain algorithm&#xC774; &#xC120; 2&#xAC1C;&#xB97C; &#xBC18;&#xD658;&#xD558;&#xC5EC;) &#xC774;&#xB97C; LineIntersector&#xC5D0; &#xC785;&#xB825;&#xD558;&#xC5EC; &#xD574;&#xB2F9; &#xAD50;&#xC810;&#xC774; &#xC5B4;&#xB5A4; &#xAD50;&#xC810;&#xC778;&#xC9C0; &#xD655;&#xC778;&#xD55C;&#xB2E4;. 3&#xAC00;&#xC9C0; &#xACBD;&#xC6B0;&#xC758; &#xC218;&#xAC00; &#xC788;&#xB2E4;. &#xB9CC;&#xB098;&#xC9C0; &#xC54A;&#xAC70;&#xB098;, (&#xC785;&#xB825;&#xB41C; &#xB450; &#xC120;&#xBD84;&#xC758; &#xB05D;&#xC810;&#xC774; &#xC544;&#xB2CC;) 1&#xAC1C;&#xC758; &#xAD50;&#xC810;&#xC744; &#xAC16;&#xAC70;&#xB098; &#xB610;&#xB294; &#xB450; &#xC120;&#xBD84;&#xC774; &#xACB9;&#xCE58;&#xB294; &#xACBD;&#xC6B0;&#xAC00; &#xC788;&#xB2E4;. &#xC774; &#xC911; 1&#xAC1C;&#xC758; &#xAD50;&#xC810;&#xC744; &#xAC16;&#xB294; &#xACBD;&#xC6B0; proper&#xD558;&#xB2E4;&#xACE0; &#xD55C;&#xB2E4;. &#xC774; &#xB54C;, &#xADF8; 1&#xAC1C;&#xC758; &#xAD50;&#xC810;&#xC774; &#xAC01; geometry&#xC758; boundary&#xAC00; &#xC544;&#xB2D0; &#xACBD;&#xC6B0;, properInterior &#xD50C;&#xB798;&#xADF8;&#xB97C; &#xCD94;&#xAC00;&#xB85C; &#xC124;&#xC815;&#xD55C;&#xB2E4;.</p><p> &#xC774;&#xB7EC;&#xD55C; &#xC815;&#xBCF4;&#xB97C; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; IM&#xAC12;&#xC744; &#xACB0;&#xC815;&#xD55C;&#xB2E4;. &#xAC01; geometry&#xC758; &#xCC28;&#xC6D0;, proper &#xC5EC;&#xBD80; &#xADF8;&#xB9AC;&#xACE0; properInterior &#xC5EC;&#xBD80;&#xAC00; &#xC911;&#xC694;&#xD558;&#xB2E4;. &#xD574;&#xB2F9; &#xCF54;&#xB4DC;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-c++">
int dimA=(*arg)[0]-&gt;getGeometry()-&gt;getDimension();
int dimB=(*arg)[1]-&gt;getGeometry()-&gt;getDimension();
bool hasProper=intersector-&gt;hasProperIntersection();
bool hasProperInterior=intersector-&gt;hasProperInteriorIntersection();

if (dimA==2 &amp;&amp; dimB==2) {
    if (hasProper) imX-&gt;setAtLeast(&quot;212101212&quot;);
} else if (dimA==2 &amp;&amp; dimB==1) {
    if (hasProper) imX-&gt;setAtLeast(&quot;FFF0FFFF2&quot;);
    if (hasProperInterior) imX-&gt;setAtLeast(&quot;1FFFFF1FF&quot;);
} else if (dimA==1 &amp;&amp; dimB==2) {
    if (hasProper) imX-&gt;setAtLeast(&quot;F0FFFFFF2&quot;);
    if (hasProperInterior) imX-&gt;setAtLeast(&quot;1F1FFFFFF&quot;);
} else if (dimA==1 &amp;&amp; dimB==1) {
    if (hasProperInterior) imX-&gt;setAtLeast(&quot;0FFFFFFFF&quot;);
}
</code></pre>
<!--kg-card-end: markdown--><p> &#xADF8;&#xB7EC;&#xB098; &#xC544;&#xC9C1; &#xB05D;&#xC774; &#xC544;&#xB2C8;&#xB2E4;. &#xC704;&#xC5D0;&#xC11C; &#xCC3E;&#xB294; &#xAD50;&#xC810;&#xC740; &#xB450; &#xC120;&#xBD84;&#xC758; &#xB05D;&#xC810;&#xC744; &#xACE0;&#xB824;&#xD558;&#xC9C0; &#xC54A;&#xC558;&#xC73C;&#xBBC0;&#xB85C;, &#xC774;&#xB97C; &#xACE0;&#xB824;&#xD574;&#xC57C; &#xD55C;&#xB2E4;. &#xC774;&#xB7F0; &#xACBD;&#xC6B0; proper&#xD55C; &#xAD50;&#xC810;&#xC744; &#xCC3E;&#xB294; &#xAC83;&#xC740; &#xC544;&#xB2C8;&#xC9C0;&#xB9CC;, &#xD574;&#xB2F9; &#xAD50;&#xC810;&#xC744; GeometryGrah&#xC758; &#xC5E3;&#xC9C0; &#xAC12;&#xC5D0; &#xB9E4;&#xB2EC;&#xC544; &#xB193;&#xAC8C; &#xB41C;&#xB2E4;.</p><hr><p>(Will be continued)</p>]]></content:encoded></item><item><title><![CDATA[Init - Ghost and Nginx within Docker  using Amazon Lightsail]]></title><description><![CDATA[개발 블로그에 대한 필요성을 느끼기 시작한 것은 오래전이다. 하지만, 이런 저런 이유로 막상 시작하지 못(안) 했다. 그러나 올해부터 생활 환경의 변화를 맞이하면서 블로그도 함께 시작하기로 하였다. 어떤 블로그 서비스를 사용할 지 고민한 중 ghost를 사용하기로 결정했다. 마침 Docker의 공부도 할 필요성을 느꼈기 때문에 ghost와 nginx를 docker에 올려서 사용해 봄으로써 공부도 하고 블로깅도 시작할 수 있는 기회가 되었으면 하였다.]]></description><link>https://elenesgu.dev/init-ghost-and-nginx-within-docker-using-amazon-lightsail/</link><guid isPermaLink="false">5cae9c19759fac000125a807</guid><category><![CDATA[developemnt]]></category><dc:creator><![CDATA[Seungmin Lee]]></dc:creator><pubDate>Thu, 11 Apr 2019 07:14:00 GMT</pubDate><content:encoded><![CDATA[<h1 id="-lightsail-nginx-ghost-"> &#xBE14;&#xB85C;&#xADF8; &#xC2DC;&#xC791; - &#xC544;&#xB9C8;&#xC874; Lightsail&#xC5D0;&#xC11C; &#xB3C4;&#xCEE4;&#xB97C; &#xD1B5;&#xD55C; nginx&#xC640; ghost &#xC0AC;&#xC6A9;&#xAE30;</h1><p> &#xAC1C;&#xBC1C; &#xBE14;&#xB85C;&#xADF8;&#xC5D0; &#xB300;&#xD55C; &#xD544;&#xC694;&#xC131;&#xC744; &#xB290;&#xB07C;&#xAE30; &#xC2DC;&#xC791;&#xD55C; &#xAC83;&#xC740; &#xC624;&#xB798;&#xC804;&#xC774;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC;, &#xC774;&#xB7F0; &#xC800;&#xB7F0; &#xC774;&#xC720;&#xB85C; &#xB9C9;&#xC0C1; &#xC2DC;&#xC791;&#xD558;&#xC9C0; &#xBABB;(&#xC548;) &#xD588;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xC62C;&#xD574;&#xBD80;&#xD130; &#xC0DD;&#xD65C; &#xD658;&#xACBD;&#xC758; &#xBCC0;&#xD654;&#xB97C; &#xB9DE;&#xC774;&#xD558;&#xBA74;&#xC11C; &#xBE14;&#xB85C;&#xADF8;&#xB3C4; &#xD568;&#xAED8; &#xC2DC;&#xC791;&#xD558;&#xAE30;&#xB85C; &#xD558;&#xC600;&#xB2E4;. &#xC5B4;&#xB5A4; &#xBE14;&#xB85C;&#xADF8; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xC9C0; &#xACE0;&#xBBFC;&#xD55C; &#xC911; <a href="https://ghost.org/?ref=elenesgu.dev">ghost</a>&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xAE30;&#xB85C; &#xACB0;&#xC815;&#xD588;&#xB2E4;. &#xB9C8;&#xCE68; Docker&#xC758; &#xACF5;&#xBD80;&#xB3C4; &#xD560; &#xD544;&#xC694;&#xC131;&#xC744; &#xB290;&#xAF08;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; ghost&#xC640; nginx&#xB97C; docker&#xC5D0; &#xC62C;&#xB824;&#xC11C; &#xC0AC;&#xC6A9;&#xD574; &#xBD04;&#xC73C;&#xB85C;&#xC368; &#xACF5;&#xBD80;&#xB3C4; &#xD558;&#xACE0; &#xBE14;&#xB85C;&#xAE45;&#xB3C4; &#xC2DC;&#xC791;&#xD560; &#xC218; &#xC788;&#xB294; &#xAE30;&#xD68C;&#xAC00; &#xB418;&#xC5C8;&#xC73C;&#xBA74; &#xD558;&#xC600;&#xB2E4;.</p><h1 id="lightsail-">Lightsail &#xC778;&#xC2A4;&#xD134;&#xC2A4; &#xB9CC;&#xB4E4;&#xAE30;</h1><p> &#xC11C;&#xBC84;&#xB294; AWS&#xC758; <a href="https://aws.amazon.com/ko/lightsail/?ref=elenesgu.dev">Lightsail</a>&#xC744; &#xC0AC;&#xC6A9;&#xD588;&#xB2E4;. &#xAE30;&#xC874;&#xC5D0; &#xAC1C;&#xC778;&#xC801;&#xC73C;&#xB85C; ec2&#xB97C; &#xC7A0;&#xAE50; &#xC0AC;&#xC6A9;&#xD574;&#xBCF8; &#xC801; &#xC788;&#xC73C;&#xB098; ec2&#xBCF4;&#xB2E4; &#xC880; &#xB354; &#xAC04;&#xD3B8;&#xD558;&#xAC8C; &#xD560; &#xC218; &#xC788;&#xB2E4;&#xACE0; &#xD55C; Lightsail&#xB85C; &#xC11C;&#xBC84;&#xB97C; &#xD638;&#xC2A4;&#xD305;&#xD558;&#xAE30;&#xB85C; &#xACB0;&#xC815;&#xD588;&#xB2E4;. Lightsail&#xC5D0;&#xC11C; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xBC95;&#xC740; &#xC815;&#xB9D0; &#xAC04;&#xB2E8;&#xD588;&#xB2E4;. ec2&#xC5D0;&#xC11C; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xC62C;&#xB9AC;&#xAE30; &#xC704;&#xD574;&#xC11C; &#xD560; &#xC218; &#xC788;&#xB294; &#xC124;&#xC815;&#xC5D0; &#xBE44;&#xD558;&#xBA74; Lightsail&#xC5D0;&#xC11C; &#xD560; &#xC218; &#xC788;&#xB294; &#xC124;&#xC815;&#xC758; &#xC218;&#xB294; &#xC801;&#xB2E4;. &#xAC04;&#xB2E8;&#xD788; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xC62C;&#xB9AC;&#xB294; &#xAC83;&#xC774; &#xBAA9;&#xC801;&#xC774;&#xB77C;&#xBA74; Lightsail&#xC774; &#xC880; &#xB354; &#xD3B8;&#xB9AC;&#xD55C; &#xC120;&#xD0DD;&#xC774; &#xB420; &#xAC83;&#xC774;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://elenesgu.dev/content/images/2019/04/image-5.png" class="kg-image" alt loading="lazy"><figcaption>ec2&#xC758; &#xC778;&#xC2A4;&#xD134;&#xC2A4; &#xC0DD;&#xC131; &#xCC3D;</figcaption></figure><p>&#xBE14;&#xB85C;&#xADF8;&#xB97C; &#xC704;&#xD574; &#xB3C4;&#xCFC4; &#xB9AC;&#xC804;&#xC758; Ubuntu 18.04 LTS&#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xC120;&#xD0DD;&#xD558;&#xC600;&#xB2E4;. &#xD074;&#xB9AD;&#xC744; &#xD1B5;&#xD574; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xAC04;&#xB2E8;&#xD788; &#xC124;&#xC815;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://elenesgu.dev/content/images/2019/04/image-6.png" class="kg-image" alt loading="lazy"><figcaption>Lightsail &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xC758; &#xB9AC;&#xC804;&#xACFC; &#xBE14;&#xB8E8;&#xD504;&#xB9B0;&#xD2B8; &#xC124;&#xC815;</figcaption></figure><p> &#xB2E4;&#xC74C;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xD560; &#xD50C;&#xB79C;&#xC744; &#xACE0;&#xB974;&#xBA74; &#xB354;&#xC774;&#xC0C1; &#xD560; &#xAC83;&#xC774; &#xC5C6;&#xB2E4;. &#xD50C;&#xB79C;&#xB9CC; &#xACE0;&#xB974;&#xBA74; &#xC0AC;&#xC6A9;&#xD55C; &#xD504;&#xB85C;&#xC138;&#xC11C;, &#xBA54;&#xBAA8;&#xB9AC;, &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0;, &#xADF8;&#xB9AC;&#xACE0; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xB7C9; &#xAE4C;&#xC9C0; &#xBB36;&#xC5B4;&#xC11C; &#xC81C;&#xACF5;&#xBC1B;&#xB294;&#xB2E4;. </p><figure class="kg-card kg-image-card"><img src="https://elenesgu.dev/content/images/2019/04/image-7.png" class="kg-image" alt loading="lazy"></figure><p> &#xC774; &#xAC83; &#xB9CC;&#xC73C;&#xB85C;&#xB3C4; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xBC1B;&#xC744; &#xC218; &#xC788;&#xC9C0;&#xB9CC;, &#xB098;&#xB294; &#xCD94;&#xAC00;&#xC801;&#xC73C;&#xB85C; SSH key pair&#xB97C; &#xB2E4;&#xB978;&#xAC83;&#xC73C;&#xB85C; &#xB4F1;&#xB85D;&#xC2DC;&#xCF30;&#xB2E4;. Lightsail&#xC5D0;&#xC11C;&#xB294; dbms &#xC2DC;&#xC2A4;&#xD15C;, &#xCD94;&#xAC00;&#xC801;&#xC778; &#xC2A4;&#xD1A0;&#xB9AC;&#xC9C0; &#xB514;&#xC2A4;&#xD06C;, &#xC2A4;&#xB0C5;&#xC0F7; &#xADF8;&#xB9AC;&#xACE0; &#xC815;&#xC801; IP &#xAE4C;&#xC9C0; &#xC9C0;&#xC6D0;&#xD55C;&#xB2E4;. &#xAC00;&#xB3D9;&#xC911;&#xC778; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xAC00; &#xC788;&#xB2E4;&#xBA74; &#xADF8; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xC5D0; &#xBB36;&#xC5EC;&#xC788;&#xB294; &#xC815;&#xC801; IP&#xC758; &#xC720;&#xC9C0;&#xBE44;&#xB294; &#xB0B4;&#xC9C0; &#xC54A;&#xC544;&#xB3C4; &#xB41C;&#xB2E4;. &#xC774;&#xC81C; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xC190;&#xC5D0; &#xC5BB;&#xC5C8;&#xC73C;&#xB2C8; ssh&#xB97C; &#xC0AC;&#xC6A9;&#xD574; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xC5D0; &#xC811;&#xC18D;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><h1 id="docker-docker-compose">Docker &#xC124;&#xCE58; &#xBC0F; docker-compose</h1><p>Docker&#xC640; Docker-compose&#xAC00; &#xBB34;&#xC5C7;&#xC778;&#xC9C0; &#xADF8;&#xB9AC;&#xACE0; &#xC5B4;&#xB5BB;&#xAC8C; &#xC124;&#xCE58;&#xD560; &#xC218; &#xC788;&#xB294;&#xC9C0;&#xC5D0; &#xB300;&#xD55C; &#xD6CC;&#xB96D;&#xD55C; (&#xD55C;&#xAD6D;&#xC5B4;) &#xAE00;&#xB4E4;(<a href="http://raccoonyy.github.io/docker-usages-for-dev-environment-setup/?ref=elenesgu.dev">&#xBE14;&#xB85C;&#xADF8;&#xAE00;</a>, <a href="https://github.com/remotty/documents.docker.co.kr?ref=elenesgu.dev">&#xD55C;&#xAD6D;&#xC5B4; docker &#xBB38;&#xC11C; &#xC9D1;&#xD569;</a>)&#xC774; &#xC778;&#xD130;&#xB137;&#xC5D0; &#xB9CE;&#xC544;&#xC11C; &#xCC38;&#xACE0;&#xB85C; &#xC9C4;&#xD589;&#xD558;&#xAE30; &#xC26C;&#xC6E0;&#xB2E4;. ghost&#xB85C; &#xBE14;&#xB85C;&#xADF8;&#xB97C; &#xD638;&#xC2A4;&#xD305;&#xD558;&#xAE30; &#xC704;&#xD574; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; docker-compose&#xB97C; &#xC791;&#xC131;&#xD588;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-yml">version: &apos;3&apos;

services:
    nginx:
        container_name: nginx
        image: nginx
        ports:
            - 80:80
            - 443:443
        volumes:
            - ./nginx/conf.d:/etc/nginx/conf.d
            - ./nginx/ssl:/etc/ssl
        links:
            - ghost:ghost

    ghost:
        container_name: ghost
        image: ghost
        volumes:
            - ./ghost/content:/var/lib/ghost/content
            - ./ghost/config.production.json:\
                        /var/lib/ghost/config.production.json
        environment:
            - NODE_ENV=production

</code></pre>
<!--kg-card-end: markdown--><p>nginx&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &#xB9AC;&#xBC84;&#xC2A4; &#xD504;&#xB85D;&#xC2DC;&#xB97C; &#xD1B5;&#xD574; ghost&#xC758; &#xC11C;&#xBE44;&#xC2A4;&#xC5D0; &#xC811;&#xC18D;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xD558;&#xC600;&#xB2E4;. MySQL&#xC744; &#xCD94;&#xAC00;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; ghost&#xAC00; db&#xB85C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD558;&#xACE0; &#xC2F6;&#xC5C8;&#xC73C;&#xB098;, &#xB0B4;&#xAC00; &#xC120;&#xD0DD;&#xD55C; Lightsail &#xD50C;&#xB79C;&#xC758; &#xBA54;&#xBAA8;&#xB9AC; &#xD06C;&#xAE30; (1GB)&#xB97C; &#xACE0;&#xB824;&#xD558;&#xC5EC; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;. &#xC774;&#xC81C; docker-compose&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; &#xCEE8;&#xD14C;&#xC774;&#xB108;&#xB97C; &#xD55C;&#xBC88;&#xC5D0; &#xC62C;&#xB9AC;&#xAC70;&#xB098;, &#xC2E4;&#xD589; &#xBC0F; &#xC815;&#xC9C0; &#xC2DC;&#xD0AC; &#xC218; &#xC788;&#xB2E4;.</p><p> &#xCC98;&#xC74C;&#xC5D0;&#xB294; networks&#xB97C; &#xD1B5;&#xD574; &#xB124;&#xD2B8;&#xC6CC;&#xD06C;&#xB97C; &#xBA85;&#xC2DC;&#xC801;&#xC73C;&#xB85C; &#xC9C0;&#xC815;&#xD558;&#xACE0;, &#xAC01; &#xCEE8;&#xD14C;&#xC774;&#xB108;&#xB97C; &#xB124;&#xD2B8;&#xC6CC;&#xD06C;&#xC5D0; &#xD3EC;&#xD568;&#xC2DC;&#xD0A4;&#xB294; &#xAC83;&#xC744; &#xD1B5;&#xD574; nginx&#xAC00; ghost&#xB97C; &#xBCFC; &#xC218; &#xC788;&#xAC8C; &#xD558;&#xACE0; &#xC2F6;&#xC5C8;&#xC73C;&#xB098; &#xC798; &#xB418;&#xC9C0; &#xC54A;&#xC544;&#xC11C; &#xBA85;&#xC2DC;&#xC801;&#xC73C;&#xB85C; links&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xBCFC; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD558;&#xC600;&#xB2E4;.</p><h1 id="nginx-ghost-">Nginx &#xBC0F; Ghost &#xC124;&#xC815;</h1><p> Docker-compose &#xC124;&#xC815;&#xC5D0;&#xC11C; &#xBCFC; &#xC218; &#xC788;&#xB4EF;&#xC774;, &#xC124;&#xC815; &#xD30C;&#xC77C;&#xC744; &#xD1B5;&#xD574; &#xAC01;&#xAC01; nginx&#xC640; ghost&#xB97C; &#xC124;&#xC815;&#xD558;&#xC600;&#xB2E4;. ghost&#xC758; &#xACBD;&#xC6B0; &#xC124;&#xC815;&#xD30C;&#xC77C;&#xC744; &#xC774;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xD658;&#xACBD;&#xBCC0;&#xC218;&#xB97C; &#xD1B5;&#xD574; &#xC124;&#xC815;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xB2E4;. Nginx&#xC758; &#xAE30;&#xBCF8; &#xC124;&#xC815; &#xD30C;&#xC77C;&#xC744; &#xBCF4;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xC0AC;&#xC2E4;&#xC744; &#xC54C; &#xC218; &#xC788;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-nginx">user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  &apos;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &apos;
                      &apos;$status $body_bytes_sent &quot;$http_referer&quot; &apos;
                      &apos;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;&apos;;

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

</code></pre>
<!--kg-card-end: markdown--><p> &#xB9E8; &#xC544;&#xB798; &#xC904;&#xC744; &#xBCF4;&#xBA74; &#xC790;&#xB3D9;&#xC73C;&#xB85C; conf.d/&#xC758; &#xBAA8;&#xB4E0; conf&#xD30C;&#xC77C;&#xC744; &#xD3EC;&#xD568;&#xD558;&#xACE0; &#xC788;&#xB2E4;. &#xB530;&#xB77C;&#xC11C;, (&#xCEE8;&#xD14C;&#xC774;&#xB108; &#xB0B4;&#xBD80;&#xC5D0; &#xC788;&#xB294;) &#xC774; &#xD3F4;&#xB354;&#xB97C; &#xD638;&#xC2A4;&#xD2B8;&#xC640; &#xC5F0;&#xB3D9;&#xC2DC;&#xCF1C; &#xD638;&#xC2A4;&#xD2B8;&#xC5D0;&#xC11C; &#xC124;&#xC815;&#xD55C; conf &#xD30C;&#xC77C;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xAC8C; &#xD558;&#xC600;&#xB2E4;. Nginx &#xC124;&#xC815; &#xD30C;&#xC77C;&#xC5D0;&#xC11C; 80&#xD3EC;&#xD2B8;&#xB85C; &#xB4E4;&#xC5B4;&#xC628; http&#xB97C; https&#xB85C; &#xB9AC;&#xB2E4;&#xC774;&#xB809;&#xD2B8; &#xD574;&#xC8FC;&#xACE0;, 433&#xD3EC;&#xD2B8;&#xB85C; &#xB4E4;&#xC5B4;&#xC628; https&#xC5D0;&#xC11C; ssl &#xC124;&#xC815;&#xACFC; ghost&#xB85C;&#xC758; &#xB9AC;&#xBC84;&#xC2A4; &#xD504;&#xB85D;&#xC2DC;&#xB97C; &#xC9C4;&#xD589;&#xD558;&#xC600;&#xB2E4;. &#xC0AC;&#xC6A9;&#xD55C; conf &#xD30C;&#xC77C;&#xB4E4;&#xC740; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><p> ghost&#xC758; &#xCEE8;&#xD14C;&#xC774;&#xB108;&#xB97C; &#xC124;&#xC815;&#xD560; &#xB54C; &#xD658;&#xACBD;&#xBCC0;&#xC218;&#xB85C; NODE_ENV = &#xA0;production&#xC73C;&#xB85C; &#xC124;&#xC815;&#xD558;&#xC5EC; config.production.json&#xC744; &#xC77D;&#xB3C4;&#xB85D; &#xC124;&#xC815;&#xD558;&#xC600;&#xB2E4;. &#xADF8;&#xB798;&#xC57C;&#xB9CC; ghost&#xAC00; &#xC62C;&#xBC14;&#xB978; &#xC124;&#xC815;&#xD30C;&#xC77C;&#xC744; &#xC77D;&#xB294;&#xB2E4;. ghost &#xC124;&#xC815; &#xD30C;&#xC77C; &#xB0B4;&#xBD80;&#xC5D0;&#xB294; url&#xC815;&#xBCF4;&#xC640; sqlite3&#xB97C; &#xC704;&#xD55C; &#xC815;&#xBCF4; &#xB4F1;&#xC744; &#xC124;&#xC815;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xADF8; &#xC678; &#xC774;&#xBBF8;&#xC9C0; &#xC555;&#xCD95;&#xC744; &#xD560; &#xAC83;&#xC778;&#xC9C0; &#xC5EC;&#xBD80;&#xB3C4; &#xB098;&#xB294; false&#xB85C; &#xC124;&#xC815;&#xD558;&#xC600;&#xB2E4;. <a href="https://docs.ghost.org/concepts/config/?ref=elenesgu.dev">&#xACF5;&#xC2DD; &#xBB38;&#xC11C;</a>&#xC5D0; &#xC5B4;&#xB5A4; &#xC124;&#xC815;&#xC744; &#xD560; &#xC218; &#xC788;&#xB294;&#xC9C0; &#xB098;&#xC640;&#xC788;&#xC5B4; &#xCC38;&#xACE0;&#xD558;&#xBA74;&#xC11C; &#xC9C4;&#xD589;&#xD588;&#xB2E4;. &#xB0B4;&#xAC00; &#xC0AC;&#xC6A9;&#xD55C; &#xC124;&#xC815; json&#xD30C;&#xC77C;&#xC740; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-json">{
    &quot;url&quot;: &quot;https://elenesgu.dev&quot;,
    &quot;server&quot;: {
        &quot;host&quot;: &quot;0.0.0.0&quot;,
        &quot;port&quot;: 2368
    },
    &quot;mail&quot;: {
        &quot;service&quot;: &quot;Gmail&quot;,
        &quot;transport&quot;: &quot;SMTP&quot;,
        &quot;options&quot;: {
            &quot;host&quot;: &quot;smtp.gmail.com&quot;,
            &quot;port&quot;: &quot;465&quot;,
            &quot;secureConnection&quot;: true
        }
    },
    &quot;database&quot;: {
        &quot;client&quot;: &quot;sqlite3&quot;,
        &quot;connection&quot;: {
            &quot;filename&quot;: &quot;/var/lib/ghost/content/data/ghost.db&quot;
        }
    },
    &quot;paths&quot;: {
        &quot;contentPath&quot;: &quot;/var/lib/ghost/content/&quot;
    },
    &quot;imageOptimization&quot;: {
        &quot;resize&quot;: false
    }
}

</code></pre>
<!--kg-card-end: markdown--><h1 id="-"> &#xC124;&#xC815; &#xC774;&#xD6C4;</h1><p> &#xC9C0;&#xAE08; &#xBCF4;&#xACE0; &#xC788;&#xB294; &#xC774; &#xBE14;&#xB85C;&#xADF8;&#xB294; &#xC704;&#xC640; &#xAC19;&#xC740; &#xACFC;&#xC815; &#xBC0F; &#xC124;&#xC815;&#xC744; &#xD1B5;&#xD574; &#xD0C4;&#xC0DD;&#xD558;&#xC600;&#xB2E4;. &#xC2A4;&#xC2A4;&#xB85C; &#xC6F9; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xD638;&#xC2A4;&#xD305;&#xD55C; &#xACBD;&#xD5D8;&#xC774; &#xC5C6;&#xC5B4;&#xC11C; &#xC0C8;&#xB86D;&#xAE30;&#xB3C4; &#xD558;&#xC5EC; &#xC7AC;&#xBC0C;&#xAC8C; &#xC9C4;&#xD589;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xB2E4;. &#xCC98;&#xC74C; <a href="https://www.ssllabs.com/index.html?ref=elenesgu.dev">SSL Lab</a> &#xC5D0;&#xC11C; &#xC774; &#xBE14;&#xB85C;&#xADF8; &#xC0AC;&#xC774;&#xD2B8;&#xB97C; &#xAC80;&#xC99D;&#xD588;&#xC744; &#xB54C;&#xB294;, B&#xB4F1;&#xAE09;&#xC73C;&#xB85C; &#xCC45;&#xC815;&#xB418;&#xC5C8;&#xACE0; &#xC774;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD574; &#xAC80;&#xC0C9;&#xC744; &#xD1B5;&#xD574; nginx &#xC124;&#xC815;&#xC744; &#xC218;&#xC815;&#xD558;&#xB294; &#xACFC;&#xC815;&#xC744; &#xAC78;&#xCCE4;&#xB2E4;. &#xC544;&#xC9C1; A+&#xB294; &#xC544;&#xB2C8;&#xC9C0;&#xB9CC; &#xCC28;&#xD6C4; &#xACF5;&#xBD80;&#xD574; &#xB098;&#xAC00;&#xBA74;&#xC11C; &#xC218;&#xC815;&#xD574; &#xB098;&#xAC08;&#xAC83;&#xC774; &#xAE30;&#xB300;&#xB41C;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://elenesgu.dev/content/images/2019/04/image-8.png" class="kg-image" alt loading="lazy"></figure><h1 id="--1"> &#xB3C4;&#xBA54;&#xC778;</h1><p> &#xC774;&#xAE00;&#xC758; &#xAC1C;&#xBC1C; &#xACFC;&#xC815;&#xC774; &#xD604;&#xC7AC; &#xB3C4;&#xBA54;&#xC778; (elenesgu.dev)&#xC5D0;&#xC11C; &#xC774;&#xB8E8;&#xC5B4;&#xC9C4; &#xAC83;&#xC774; &#xC544;&#xB2C8;&#xB2E4;. &#xC9C0;&#xC778;&#xC758; &#xB3C4;&#xBA54;&#xC778;&#xC744; &#xBE4C;&#xB824; &#xBE14;&#xB85C;&#xADF8;&#xB97C; &#xAD6C;&#xCD95;&#xD558;&#xC600;&#xACE0;, &#xADF8; &#xC774;&#xD6C4; &#xB3C4;&#xBA54;&#xC778;&#xC744; &#xAD6C;&#xC785;&#xD558;&#xC600;&#xB2E4;. Google Domain&#xC5D0; &#xAD6C;&#xC785;&#xD558;&#xC600;&#xC73C;&#xBA70; (&#xC11C;&#xBE0C; &#xB3C4;&#xBA54;&#xC778;&#xC744; &#xD3EC;&#xD568;&#xD558;&#xC5EC;) &#xB2E4;&#xC591;&#xD55C; &#xC124;&#xC815;&#xC774; &#xC788;&#xC5C8;&#xC73C;&#xB098;, &#xB098;&#xB294; &#xB3C4;&#xBA54;&#xC778; -&gt; IP&#xC758; &#xD3EC;&#xC6CC;&#xB529;&#xB9CC; &#xC124;&#xC815;&#xD574; &#xB454; &#xC0C1;&#xD0DC;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[Linear Referencing System in GIS and in Spatial Database]]></title><description><![CDATA[Linear Referencing System (선형 참조 체계, LRS) 는 선형 요소 (line element) 를 기반으로 하고, 그 선형 요소위에서 객체들을 정의 및 참조할 수 있는 시스템을 나타낸다.]]></description><link>https://elenesgu.dev/linear-referencing-system-in-gis-and-in-spatial-database/</link><guid isPermaLink="false">5cad655a5a43900001ce4864</guid><category><![CDATA[database]]></category><dc:creator><![CDATA[Seungmin Lee]]></dc:creator><pubDate>Wed, 10 Apr 2019 14:37:10 GMT</pubDate><content:encoded><![CDATA[<p>Linear Referencing System (&#xC120;&#xD615; &#xCC38;&#xC870; &#xCCB4;&#xACC4;, LRS) &#xB294; &#xC120;&#xD615; &#xC694;&#xC18C; (line element) &#xB97C; &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xD558;&#xACE0;, &#xADF8; &#xC120;&#xD615; &#xC694;&#xC18C;&#xC704;&#xC5D0;&#xC11C; &#xAC1D;&#xCCB4;&#xB4E4;&#xC744; &#xC815;&#xC758; &#xBC0F; &#xCC38;&#xC870;&#xD560; &#xC218; &#xC788;&#xB294; &#xC2DC;&#xC2A4;&#xD15C;&#xC744; &#xB098;&#xD0C0;&#xB0B8;&#xB2E4;. GIS&#xC5D0;&#xC11C; LRS&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB294; &#xAC1C;&#xB150;&#xB4E4;&#xB85C; &#xB3C4;&#xB85C;&#xC704;&#xC758; &#xC774;&#xC815;&#xD45C;&#xB098; &#xD45C;&#xC9C0;&#xD310; &#xB4F1;&#xC758; &#xC810; &#xC815;&#xBCF4;&#xB098;, &#xB3C4;&#xB85C; &#xAD6C;&#xAC04;&#xBCC4; &#xC81C;&#xD55C;&#xC18D;&#xB3C4; &#xB4F1;&#xC758; &#xAD6C;&#xAC04; &#xC815;&#xBCF4; &#xAC19;&#xC740; &#xAC83;&#xB4E4;&#xC774; &#xC788;&#xB2E4;. &#xAD50;&#xD1B5; &#xC815;&#xBCF4;&#xBFD0; &#xC544;&#xB2C8;&#xB77C; &#xAC00;&#xC2A4;&#xB098; &#xC624;&#xC77C; &#xD30C;&#xC774;&#xD504; &#xB610;&#xB294; &#xC218;&#xB3C4;&#xAD00; &#xAC19;&#xC740; &#xC694;&#xC18C;&#xB4E4;&#xB3C4; &#xC800;&#xC7A5;&#xD560; &#xC218; &#xC788;&#xB2E4;. LRS&#xC5D0;&#xC11C; &#xC774;&#xB7F0; &#xC815;&#xBCF4;&#xB97C; &#xC800;&#xC7A5;&#xD560; &#xB54C;, &#xAE30;&#xBC18; &#xC120;&#xD615; &#xC694;&#xC18C; (base line element)&#xB97C; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xC815;&#xC758;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;. &#xB3C4;&#xB85C;&#xC758; &#xACBD;&#xC6B0;, &#xB3C4;&#xB85C;&#xC758; &#xC5B4;&#xB5A4; &#xC774;&#xC815;&#xD45C;&#xC758; &#xC704;&#xCE58;&#xB098; &#xD2B9;&#xC815; &#xAD6C;&#xAC04;&#xC744; &#xB098;&#xD0C0;&#xB0BC; &#xB54C;, &#xB3C4;&#xB85C;&#xC758; &#xD2B9;&#xC815; &#xC9C0;&#xC810;&#xC73C;&#xB85C;&#xBD80;&#xD130; &#xB3D9;&#xCABD;&#xC73C;&#xB85C; 5m &#xB4F1;&#xC758; &#xBC29;&#xBC95;&#xC744; &#xD1B5;&#xD574; &#xC815;&#xC758;&#xD55C;&#xB2E4;. &#xC774; &#xB54C;, &#xC774;&#xB7EC;&#xD55C; &#xC704;&#xCE58; &#xD45C;&#xD604; &#xBC29;&#xC2DD;&#xC740; &#xB450; &#xAC00;&#xC9C0;&#xAC00; &#xC874;&#xC7AC;&#xD55C;&#xB2E4;. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://elenesgu.dev/content/images/2019/04/image-4.png" class="kg-image" alt loading="lazy"><figcaption>Figure 1. LRS&#xC5D0;&#xC11C;&#xC758; &#xC694;&#xC18C; &#xD45C;&#xD604;</figcaption></figure><p> &#xC0AC;&#xC9C4; &#xC790;&#xB8CC;&#xC5D0;&#xC11C;&#xB294; 2&#xAC00;&#xC9C0; &#xBC29;&#xBC95;&#xC73C;&#xB85C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xD45C;&#xD604;&#xD558;&#xACE0; &#xC788;&#xB2E4;.</p><ul><li> &#xC88C;&#xD45C;&#xB97C; &#xA0;&#xC9C1;&#xC811;&#xC801;&#xC73C;&#xB85C; &#xD45C;&#xD604;&#xD558;&#xB294; &#xBC29;&#xBC95;:<br> &#xD30C;&#xB780;&#xC0C9;&#xC73C;&#xB85C; &#xD45C;&#xC2DC;&#xB41C; &#xAC1D;&#xCCB4;&#xB4E4;&#xC740; &#xC9C1;&#xC811; &#xC88C;&#xD45C;&#xB97C; &#xD1B5;&#xD574; &#xD45C;&#xD604;&#xB418;&#xACE0; &#xC788;&#xB2E4;. &#xC0AC;&#xC9C4;&#xC5D0;&#xC11C;&#xB294; (&#xC2DC;&#xC791;&#xC810;&#xC73C;&#xB85C; &#xBD80;&#xD130;) 2 &#xB2E8;&#xC704; &#xB9CC;&#xD07C; &#xB5A8;&#xC5B4;&#xC9C4; &#xACF3;&#xC774;&#xB77C;&#xB294; &#xD615;&#xD0DC;&#xB85C; &#xC810;&#xC744; &#xD45C;&#xD604;&#xD558;&#xAC70;&#xB098; (&#xC5ED;&#xC2DC; &#xC2DC;&#xC791;&#xC810;&#xC73C;&#xB85C;&#xBD80;&#xD130;) 11&#xB2E8;&#xC704; &#xB9CC;&#xD07C; &#xB5A8;&#xC5B4;&#xC9C4; &#xACF3;&#xBD80;&#xD130; 18&#xB2E8;&#xC704; &#xB9CC;&#xD07C; &#xB5A8;&#xC5B4;&#xC9C4; &#xACF3; &#xC0AC;&#xC774;&#xB77C;&#xB294; &#xD615;&#xD0DC;&#xB85C; &#xC120;&#xC744; &#xD45C;&#xD604;&#xD558;&#xACE0; &#xC788;&#xB2E4;.</li><li> &#xC88C;&#xD45C;&#xB97C; &#xC0C1;&#xB300; &#xAC70;&#xB9AC;&#xB97C; &#xD1B5;&#xD574; &#xD45C;&#xD604;&#xD558;&#xB294; &#xBC29;&#xBC95;:<br> &#xBE68;&#xAC04;&#xC0C9; &#xAC1D;&#xCCB4;&#xB4E4;&#xC740; &#xD2B9;&#xC815; &#xAE30;&#xC900; &#xC810;&#xC744; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xC0C1;&#xB300;&#xC801;&#xC73C;&#xB85C; &#xD45C;&#xD604;&#xB418;&#xACE0; &#xC788;&#xB2E4;. &#xC0AC;&#xC9C4;&#xC5D0;&#xC11C;&#xB294; &#xD2B9;&#xC815; &#xC810; (&#xC5EC;&#xAE30;&#xC11C;&#xB294; &#xC2DC;&#xC791;&#xC810;) &#xC73C;&#xB85C; &#xBD80;&#xD130; 6&#xB2E8;&#xC704; &#xB5A8;&#xC5B4;&#xC9C4; &#xACF3;&#xC774;&#xB77C;&#xB294; &#xD615;&#xD0DC;&#xB85C; &#xC810;&#xC744; &#xD45C;&#xD604;&#xD558;&#xAC70;&#xB098; 13&#xC704;&#xC5D0;&#xC11C; 8&#xB2E8;&#xC704; &#xAC70;&#xB9AC;&#xB9CC;&#xD07C;&#xC774;&#xB77C;&#xB294; &#xD615;&#xD0DC;&#xB85C; &#xC120;&#xC744; &#xD45C;&#xD604;&#xD558;&#xACE0; &#xC788;&#xB2E4;.</li></ul><p><a href="http://desktop.arcgis.com/en/arcmap/latest/manage-data/using-sql-with-gdbs/what-are-spatial-types.htm?ref=elenesgu.dev">&#xAE30;&#xC874; spatial data type</a>&#xC73C;&#xB85C; &#xC774;&#xB7F0; &#xC815;&#xBCF4;&#xB97C; &#xD45C;&#xD604;&#xD560; &#xC218; &#xC5C6;&#xB294;&#xAC83;&#xC740; &#xC544;&#xB2C8;&#xB2E4;. &#xADF8;&#xB807;&#xC9C0;&#xB9CC;, LRS&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xB2E4;&#xC591;&#xD55C; &#xC7A5;&#xC810;&#xC774; &#xC788;&#xB2E4;. &#xAC00;&#xC7A5; &#xD070; &#xC7A5;&#xC810;&#xC73C;&#xB85C;&#xB294; &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xD558;&#xB294; &#xC120;&#xD615; &#xC694;&#xC18C;&#xB97C; &#xACF5;&#xC720;&#xD55C;&#xB2E4;&#xB294; &#xC810;&#xC774;&#xB2E4;. &#xB9CC;&#xC57D; &#xAE30;&#xBC18; &#xC120;&#xD615; &#xC694;&#xC18C;&#xC758; &#xB370;&#xC774;&#xD130;&#xC5D0; &#xBCC0;&#xD654;&#xAC00; &#xAC00;&#xD574;&#xC9C8; &#xACBD;&#xC6B0; &#xADF8; &#xC704;&#xC5D0; &#xC815;&#xC758;&#xB41C; &#xC5EC;&#xB7EC; &#xC694;&#xC18C;&#xB4E4;&#xC740; &#xB530;&#xB85C; &#xC218;&#xC815;&#xC744; &#xD558;&#xC9C0; &#xC54A;&#xC544;&#xB3C4; &#xB9DE;&#xCDB0;&#xC11C; &#xBCC0;&#xD654;&#xAC00; &#xAC00;&#xD574;&#xC9C4;&#xB2E4;&#xACE0; &#xBCFC; &#xC218; &#xC788;&#xB2E4;. &#xB610;&#xB294;, LRS&#xC704;&#xC758; &#xAC1D;&#xCCB4;&#xB4E4;&#xC774; &#xC5EC;&#xB7EC; &#xC18D;&#xC131;&#xC744; &#xC9C0;&#xB140;&#xC57C; &#xD560; &#xACBD;&#xC6B0;&#xC5D0;&#xB3C4; &#xC720;&#xC6A9;&#xD558;&#xB2E4;. &#xD55C; &#xC120;&#xD615; &#xC694;&#xC18C; &#xC704;&#xC5D0; &#xC5EC;&#xB7EC; &#xC18D;&#xC131;&#xB4E4;(attributes)&#xC774; &#xC788;&#xC744; &#xB54C;, &#xAE30;&#xC874;&#xC758; spatial geometry types&#xB85C; &#xC800;&#xC7A5;&#xD560; &#xACBD;&#xC6B0; &#xC5EC;&#xB7EC;&#xAC1D;&#xCCB4;&#xB85C; &#xB098;&#xB220;&#xC11C; &#xC800;&#xC7A5;&#xD574;&#xC57C;&#xD558;&#xC9C0;&#xB9CC;, LRS&#xC5D0;&#xC11C;&#xB294; &#xC27D;&#xAC8C; &#xC800;&#xC7A5; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xC5B4;, &#xC5B4;&#xB5A4; &#xAE30;&#xBC18; &#xC694;&#xC18C;&#xC778; &#xB3C4;&#xB85C;&#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC18D;&#xB3C4;, &#xD3EC;&#xC7A5;&#xC815;&#xBCF4;(&#xC544;&#xC2A4;&#xD314;&#xD2B8; &#xBC0F; &#xCF58;&#xD06C;&#xB9AC;&#xD2B8; &#xB4F1;),&#xC774;&#xC815;&#xD45C; &#xC18D;&#xC131; &#xB4F1;&#xC774; &#xC788;&#xC744; &#xACBD;&#xC6B0;, (&#xC11C;&#xB85C; &#xACB9;&#xCE58;&#xC9C0; &#xC54A;&#xB294;) &#xC791;&#xC740; &#xB2E8;&#xC704;&#xB4E4;&#xB85C; &#xB098;&#xB204;&#xC5B4;&#xC11C; &#xAC01; &#xC18D;&#xC131;&#xB4E4;&#xC744; &#xC800;&#xC7A5;&#xD560; &#xD544;&#xC694;&#xAC00; &#xC5C6;&#xB2E4;.</p><h1 id="lrs-in-oracle-spatial">LRS in Oracle Spatial</h1><p>Spatial database&#xC778; Oracle Sptial&#xC5D0;&#xC11C;&#xB3C4; LRS&#xB97C; &#xC9C0;&#xC6D0;&#xD55C;&#xB2E4;. LRS&#xC758; &#xAE30;&#xBC18; &#xC120;&#xD615; &#xC694;&#xC18C;&#xB97C; &#xC624;&#xB77C;&#xD074;&#xC5D0;&#xC11C;&#xB294; <em>geometric segment</em> &#xB77C;&#xACE0; &#xBD80;&#xB978;&#xB2E4;. Geometric segment&#xAC00; &#xB420; &#xC218; &#xC788;&#xB294; &#xAC83;&#xB4E4;&#xC740; &#xC9C1;&#xC120;, &#xACE1;&#xC120; &#xADF8;&#xB9AC;&#xACE0; &#xD3F4;&#xB9AC;&#xACE4; &#xB4F1;&#xC744; &#xD3EC;&#xD568;&#xD55C;&#xB2E4;. 1&#xAC1C;&#xC758; geometric segment&#xB294; &#xC2DC;&#xC791;&#xC810;&#xACFC; &#xB05D;&#xC810;&#xC774; &#xC815;&#xC758;&#xB418;&#xC5B4; &#xC788;&#xC5B4;&#xC57C; &#xD55C;&#xB2E4;. (&#xD3F4;&#xB9AC;&#xACE4;&#xC758; &#xACBD;&#xC6B0; &#xC2DC;&#xC791;&#xC810;&#xACFC; &#xB05D;&#xC810;&#xC774; &#xAC19;&#xB2E4;.) Geometric segment&#xB294; &#xC810;&#xC758; sequence&#xB85C; &#xC815;&#xC758;&#xB418;&#xC5B4; &#xC788;&#xB2E4;. &#xC774; sequence&#xC758; &#xC2DC;&#xC791;&#xC810;&#xACFC; &#xB05D;&#xC810;&#xC744; &#xC81C;&#xC678;&#xD558;&#xACE0; &#xB098;&#xBA38;&#xC9C0;&#xB97C; shape point&#xB77C;&#xACE0; &#xBD80;&#xB978;&#xB2E4;. Shape point&#xB97C; &#xD3EC;&#xD568;&#xD558;&#xC5EC; &#xBAA8;&#xB4E0; &#xC810;&#xB4E4;&#xC740; &#xC88C;&#xD45C;&#xC815;&#xBCF4;&#xC640; measure&#xB77C;&#xB294; &#xAC12;&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB2E4;. &#xC774; measure&#xB294; &#xC704;&#xC5D0;&#xC11C; &#xC11C;&#xC220;&#xD55C; &#xC0C1;&#xB300;&#xC801;&#xC778; &#xAC70;&#xB9AC;&#xB97C; &#xD45C;&#xD604;&#xD560; &#xB54C; &#xC4F0;&#xC774;&#xB294; &#xC9C0;&#xD45C;&#xC774;&#xB2E4;. &#xC88C;&#xD45C;&#xACF5;&#xAC04;&#xC0C1;&#xC5D0;&#xC11C; &#xB450; &#xC810;&#xC758; &#xAC70;&#xB9AC;&#xAC00; &#xAC00;&#xAE5D;&#xB2E4;&#xACE0; &#xD558;&#xC5EC;&#xB3C4;, measure&#xAC12;&#xC758; &#xC870;&#xC815;&#xC744; &#xD1B5;&#xD574; LRS&#xC0C1;&#xC5D0;&#xC11C;&#xB294; &#xADF8; &#xAC70;&#xB9AC;&#xB97C; &#xC870;&#xC808;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>Geometric segment&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xC694;&#xC18C; &#xBC0F; &#xAC1C;&#xB150;&#xB4E4;&#xC774; &#xC788;&#xB2E4;.</p><ul><li> direction<br>Segment&#xC758; direction&#xC740; &#xC2DC;&#xC791;&#xC810;&#xC73C;&#xB85C;&#xBD80;&#xD130; &#xB05D;&#xC810;&#xAE4C;&#xC9C0;&#xC758; &#xC21C;&#xC11C;&#xB97C; &#xD1B5;&#xD574; &#xC815;&#xC758;&#xB41C;&#xB2E4;. &#xAC01; &#xC810;&#xC758; measure&#xAC12;&#xB4E4;&#xC740; direction&#xC5D0; &#xB530;&#xB77C; &#xACC4;&#xC18D; &#xC99D;&#xAC00;&#xD558;&#xAC70;&#xB098; &#xACC4;&#xC18D; &#xAC10;&#xC18C;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</li><li> measure<br> measure&#xB294; &#xC5B4;&#xB5A4; &#xC810;&#xC774; &#xC2DC;&#xC791;&#xC810;&#xC73C;&#xB85C;&#xBD80;&#xD130; &#xC5BC;&#xB9C8;&#xB098; &#xB5A8;&#xC5B4;&#xC838; &#xC788;&#xB294;&#xC9C0; &#xB098;&#xD0C0;&#xB0B4;&#xB294; &#xCC99;&#xB3C4;&#xC774;&#xB2E4;. &#xAC01; &#xC810;&#xC5D0; &#xC815;&#xC758;&#xB41C; measure&#xB4E4;&#xC744; &#xD1B5;&#xD574; &#xACC4;&#xC0B0;&#xD560; &#xC218; &#xC788;&#xB2E4;. (linear interpolation)&#xC5B4;&#xB5A4; &#xB450; &#xC810;&#xC758; measure &#xAC12;&#xC774; &#xAC01;&#xAC01; 50, 80&#xC73C;&#xB85C; &#xC815;&#xC758;&#xB418;&#xC5B4;&#xC788;&#xB2E4;&#xBA74;, &#xADF8; &#xB450; &#xC810;&#xC758; &#xC815;&#xD655;&#xD788; &#xC911;&#xAC04;&#xC5D0; &#xC788;&#xB294; &#xC810;&#xC758; measure &#xAC12;&#xC740; 65&#xAC00; &#xB418;&#xB294; &#xC2DD;&#xC774;&#xB2E4;.</li><li> offset<br>offset&#xC740; segment&#xC790;&#xCCB4;&#xC758; &#xC774;&#xB3D9;&#xC744; &#xB73B;&#xD55C;&#xB2E4;. &#xC591;&#xC758; offset&#xC77C; &#xACBD;&#xC6B0;, direction&#xC758; &#xC67C;&#xCABD; &#xBC29;&#xD5A5;&#xC73C;&#xB85C; segment&#xC758; &#xC774;&#xB3D9;&#xC744; &#xB73B;&#xD558;&#xACE0;, &#xC74C;&#xC758; offset&#xC740; &#xADF8; &#xBC18;&#xB300;&#xB97C; &#xB73B;&#xD55C;&#xB2E4;.</li><li>projection<br> &#xC5B4;&#xB5A4; &#xC810;&#xC5D0; &#xB300;&#xD574;, segemnt&#xC704;&#xC758; &#xAC00;&#xC7A5; &#xAC00;&#xAE4C;&#xC6B4; &#xC810;&#xC744; &#xB098;&#xD0C0;&#xB0B8;&#xB2E4;.</li></ul><p> &#xA0;&#xC774;&#xB7EC;&#xD55C; &#xC694;&#xC18C; &#xBC0F; &#xAC1C;&#xB150;&#xB4E4;&#xC740; <a href="https://docs.oracle.com/cd/B28359_01/appdev.111/b28400/point.gif?ref=elenesgu.dev">Oracle Spatial Concept &#xBB38;&#xC11C;&#xC758; &#xC0AC;&#xC9C4;</a>&#xC5D0;&#xC11C; &#xC2DC;&#xAC01;&#xC801;&#xC73C;&#xB85C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><h2 id="handling-a-geometric-segment">Handling a geometric segment</h2><p>Geometric segment&#xB294; SQL &#xB610;&#xB294; PL/SQL&#xC744; &#xD1B5;&#xD574; &#xAC1D;&#xCCB4;&#xB97C; &#xC0DD;&#xC131;&#xD560; &#xC218; &#xC788;&#xB2E4;. Geometric segment&#xB294; &#xB2E4;&#xB978; spatial geometry type&#xACFC; &#xAC19;&#xC774; SDO_GEOMETRY&#xB77C;&#xB294; object type&#xC5D0; &#xC800;&#xC7A5;&#xB41C;&#xB2E4;. 2&#xCC28;&#xC6D0; &#xC88C;&#xD45C;&#xACC4;&#xC5D0;&#xC11C;&#xC758; geometric segment&#xB294; measure&#xAE4C;&#xC9C0; &#xD569;&#xD558;&#xC5EC; &#xD55C; &#xC810;&#xB2F9; 3&#xCC28;&#xC6D0;&#xC758; &#xC815;&#xBCF4;&#xB97C; &#xC800;&#xC7A5;&#xD55C;&#xB2E4;. &#xB530;&#xB77C;&#xC11C;, SDO_GEOMETRY&#xC758; SDO_GTYPE&#xAC12;&#xC774; 3302&#xC73C;&#xB85C; &#xC124;&#xC815;&#xB41C;&#xB2E4;. &#xC774;&#xB294; 3&#xCC28;&#xC6D0;&#xC774;&#xBA70;, LRS&#xC758; (2&#xCC28;&#xC6D0;) geometry&#xC774;&#xACE0;, line &#xD0C0;&#xC785; (02) &#xC744; &#xB098;&#xD0C0;&#xB0B8;&#xB2E4;.</p><!--kg-card-begin: markdown--><pre><code class="language-SQL">SDO_GEOMETRY(
  3302,  -- line string, 3 dimensions: X,Y,M
  NULL,
  NULL,
  SDO_ELEM_INFO_ARRAY(1,2,1), -- one line string, straight segments
  SDO_ORDINATE_ARRAY(
    2,2,0,   
    2,4,2,   
    8,4,8,   
    12,4,12, 
    12,10,NULL,
    8,10,22,
    5,14,27
  )
)
</code></pre>
<!--kg-card-end: markdown--><p>3&#xBC88;&#xC9F8; &#xC6D0;&#xC18C;&#xC758; &#xAC12;&#xC774; &#xAC01; &#xC810;&#xC758; measure&#xAC12;&#xC774;&#xB2E4;. &#xBE44;&#xC5B4;&#xC788;&#xC744; &#xACBD;&#xC6B0; (NULL) &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xACC4;&#xC0B0;&#xD558;&#xC5EC; &#xCC44;&#xC6CC;&#xC8FC;&#xAC8C; &#xB41C;&#xB2E4;. &#xA0;&#xC774;&#xB807;&#xAC8C; &#xC0DD;&#xC131;&#xD55C; geometric segment&#xB97C; &#xC0DD;&#xC131;, &#xC81C;&#xC5B4;, &#xBC0F; &#xD0D0;&#xC0C9; &#xB4F1;&#xC744; &#xC9C0;&#xC6D0;&#xD558;&#xAE30; &#xC704;&#xD574; Oracle Spatial&#xC5D0;&#xC11C;&#xB294; PL/SQL Package (<a href="https://docs.oracle.com/cd/B28359_01/appdev.111/b28400/sdo_lrs_ref.htm?ref=elenesgu.dev#SPATL150">MDSYS.SDO_LRS</a>) &#xB97C; &#xC81C;&#xACF5;&#xD55C;&#xB2E4;. &#xACF5;&#xC2DD; &#xBB38;&#xC11C;&#xC5D0;&#xC11C;&#xBD84;&#xB958;&#xD55C; &#xBC29;&#xBC95;&#xC73C;&#xB85C; PL/SQL Package &#xC548;&#xC758; subprogram&#xC744; &#xD558;&#xB294; &#xC77C;&#xC73C;&#xB85C; &#xBD84;&#xB958;&#xD574;&#xBCF4;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><ul><li> Geometric segment&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xACE0; &#xC218;&#xC815;</li><li> Geometric segment&#xC5D0; &#xAD00;&#xD55C; &#xC815;&#xBCF4; &#xC870;&#xD68C; &#xBC0F; &#xAC80;&#xC99D;</li><li> SDO_GEOMETRY&#xC640; LRS geometric segment &#xAC04;&#xC758; &#xBCC0;&#xD658;</li></ul><p> &#xC774; &#xC911; &#xBA87;&#xAC1C;&#xC758; subprogram&#xC744; &#xACE8;&#xB77C; &#xC774; &#xAE00;&#xC5D0;&#xC11C; &#xC18C;&#xAC1C;&#xD574; &#xBCF4;&#xB824;&#xACE0; &#xD55C;&#xB2E4;.</p><h3 id="geometric-segment-"> Geometric segment&#xC758; &#xC0DD;&#xC131; &#xBC0F; &#xC218;&#xC815;</h3><p> &#xC5EC;&#xAE30;&#xC5D0; &#xC18D;&#xD55C; subprogram&#xB4E4;&#xC744; &#xBC14;&#xD0D5;&#xC73C;&#xB85C; &#xD560; &#xC218; &#xC788;&#xB294; &#xC77C;&#xB4E4;&#xC740; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xB2E4;.</p><ul><li> Geometric segment&#xC758; clipping:<br> 2&#xAC1C;&#xC758; measure &#xAC12;&#xC744; &#xC785;&#xB825;&#xC73C;&#xB85C; &#xBC1B;&#xC544; &#xD574;&#xB2F9;&#xD558;&#xB294; &#xBD80;&#xBD84;&#xC758; geometric segment&#xB97C; &#xBC18;&#xD658;&#xD55C;&#xB2E4;.</li><li> Intersection:<br>2&#xAC1C;&#xC758; LRS geometric segment &#xB610;&#xB294; geometric segment&#xC640; SDO_GEOMETRY &#xC0AC;&#xC774;&#xC5D0;&#xC11C; (topologically) &#xACB9;&#xCE58;&#xB294; SDO_GEOMETRY&#xB97C; &#xBC18;&#xD658;&#xD55C;&#xB2E4;. geometric segment&#xB294; &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xC120;&#xC758; &#xC9D1;&#xD569;&#xC77C; &#xAC83;&#xC774;&#xBBC0;&#xB85C;, &#xBC18;&#xD658;&#xB418;&#xB294; SDO_GEOMETRY&#xB294;&#xC810;, &#xC120; &#xB610;&#xB294; &#xC120;&#xC9D1;&#xD569;(linestring or multiline)&#xC77C; &#xAC83;&#xC774;&#xB2E4;.</li><li>Offset:<br> &#xA0;&#xC704;&#xC5D0;&#xC11C; &#xC11C;&#xC220;&#xD55C; offset&#xB97C; &#xBC18;&#xD658;&#xD55C;&#xB2E4;. &#xB450; &#xAC1C;&#xC758; measure&#xAC12;&#xC744; &#xBC1B;&#xC544;&#xC11C;, &#xADF8; measure&#xC0AC;&#xC774;&#xC758; (sub) geometric segment&#xC5D0; &#xB300;&#xD574;&#xC11C; offset&#xD55C; geometric segment&#xB97C; &#xBC18;&#xD658;&#xD55C;&#xB2E4;. &#xB450; mesaure &#xAC12;&#xC744; &#xAC01;&#xAC01; &#xC2DC;&#xC791;&#xC810;&#xACFC; &#xB05D;&#xC810;&#xC73C;&#xB85C; &#xD55C;&#xB2E4;&#xBA74; &#xC804;&#xCCB4; segment&#xC5D0; &#xB300;&#xD574; offset&#xBCC0;&#xD658;&#xD55C; &#xAC1D;&#xCCB4;&#xAC00; &#xBC18;&#xD658;&#xB41C;&#xB2E4;.</li><li> &#xAE30;&#xD0C0; Split&#xC744; &#xD1B5;&#xD574; 2&#xAC1C;&#xB85C; &#xB098;&#xB204;&#xB358;&#xAC00;, Reverse&#xB4F1;&#xC744; &#xD1B5;&#xD574; &#xBC29;&#xD5A5;&#xC744; &#xBC14;&#xAFC0; &#xC218; &#xC788;&#xB2E4;.</li></ul><h3 id="-"> &#xC870;&#xD68C; &#xBC0F; &#xAC80;&#xC99D;</h3><p> &#xC5EC;&#xAE30;&#xC5D0; &#xC18D;&#xD55C; subprogram&#xB4E4;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xB370;&#xC774;&#xD130;&#xB4E4;&#xC758; &#xC870;&#xD68C; &#xBC0F; &#xAC80;&#xC99D;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;.</p><ul><li>LOCATE_PT:<br> Geometric segment&#xC640; measure&#xAC12;&#xC744; &#xC785;&#xB825;&#xC73C;&#xB85C; &#xBC1B;&#xC544;, &#xADF8; &#xC704;&#xCE58;&#xC758; &#xC810;&#xC744; SDO_GEOMETRY &#xD615;&#xD0DC;&#xB85C; &#xBC18;&#xD658;&#xD55C;&#xB2E4;.</li><li> &#xAE30;&#xD0C0; valid &#xC5EC;&#xBD80;&#xB97C; &#xAC80;&#xC99D; &#xD558;&#xB294; &#xD568;&#xC218;&#xB098; &#xAC04;&#xB2E8;&#xD55C; &#xAC12;&#xC744; &#xC870;&#xD68C;&#xD558;&#xB294; subprogram&#xB4E4;&#xC774; &#xC874;&#xC7AC;&#xD55C;&#xB2E4;.</li></ul><h3 id="--1"> &#xBCC0;&#xD658;</h3><p>SDO_GEOMETRY&#xC758; &#xAC1D;&#xCCB4;&#xB97C; &#xA0;LRS geometric segment&#xB85C; &#xBCC0;&#xD658;&#xD558;&#xAC70;&#xB098; &#xADF8; &#xC5ED;&#xC774; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;.</p><h1 id="lrs-in-another-spatial-database">LRS in another spatial database</h1><h2 id="postgis">PostGIS</h2><p> PostGIS&#xC5D0;&#xC11C;&#xB3C4; LRS &#xC5D0; &#xAD00;&#xD55C; &#xC5EC;&#xB7EC; &#xD568;&#xC218;&#xB97C; &#xC9C0;&#xC6D0;&#xD55C;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xC5B4;, ST_LineInterpolatePoint&#xB294; &#xC120; &#xD615;&#xD0DC;&#xC758; geometry &#xD0C0;&#xC785; (ST_geometry &#xB610;&#xB294; OGC geometry) &#xACFC; &#xC2E4;&#xC218; &#xAC12; (0&#xACFC; 1&#xC0AC;&#xC774;)&#xC744; &#xBC1B;&#xC544;, &#xC120; &#xD615;&#xD0DC;&#xC758; geometry&#xC758; &#xC2DC;&#xC791;&#xC810;&#xC5D0;&#xC11C; &#xC2E4;&#xC218; &#xAC12; &#xB9CC;&#xD07C; &#xB5A8;&#xC5B4;&#xC9C4; &#xC810;&#xC744; &#xBC18;&#xD658;&#xD55C;&#xB2E4;. ST_LineSubstring &#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xBA74;, &#xC5B4;&#xB5A4; &#xC120; &#xD615;&#xD0DC;&#xC758; geometry &#xC0C1;&#xC5D0;&#xC11C; &#xD2B9;&#xC815; &#xBD80;&#xBD84;&#xC744; &#xC798;&#xB77C;&#xB0BC; &#xC218; &#xC788;&#xB2E4;. &#xC989;, &#xC778;&#xC790;&#xB85C; &#xB4E4;&#xC5B4;&#xAC00;&#xB294; &#xB450; &#xC2E4;&#xC218;&#xAC00; &#xAC01;&#xAC01; 1/3, 2/3 &#xC774;&#xB77C;&#xBA74;, 3&#xB4F1;&#xBD84; &#xD55C; &#xC120; &#xC911; &#xAC00;&#xC6B4;&#xB370; &#xBD80;&#xBD84;&#xC758; geomtry&#xB97C; &#xBC18;&#xD658;&#xD55C;&#xB2E4;. Oracle Spatial&#xACFC; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; &#xAE30;&#xBC18; &#xC120;&#xD615; &#xC694;&#xC18C;(base line element)&#xC5D0; measure&#xC744; &#xCD94;&#xAC00;&#xD558;&#xC5EC; &#xC784;&#xC758;&#xC758; &#xAC70;&#xB9AC;&#xAD00;&#xACC4;&#xB97C; &#xC815;&#xC758;&#xD560; &#xC218; &#xC788;&#xB2E4;. LRS&#xC5D0; &#xAD00;&#xD55C; &#xB2E4;&#xB978; &#xD568;&#xC218;&#xB4E4;&#xC740; <a href="https://postgis.net/docs/reference.html?ref=elenesgu.dev#Linear_Referencing">&#xACF5;&#xC2DD; &#xBB38;&#xC11C;</a>&#xC5D0;&#xC11C; &#xCC3E;&#xC744; &#xC218; &#xC788;&#xB2E4;.</p><h1 id="--2"> &#xB9C8;&#xCE58;&#xBA70;</h1><p> &#xAD50;&#xD1B5;&#xC0AC;&#xACE0; &#xC815;&#xBCF4; &#xAC19;&#xC740; &#xC120;(&#xB3C4;&#xB85C;)&#xB97C; &#xB530;&#xB77C; &#xC77C;&#xC5B4;&#xB098;&#xB294; &#xC815;&#xBCF4;&#xAC00; &#xB9CE;&#xC774; &#xC785;&#xB825;&#xC73C;&#xB85C; &#xB4E4;&#xC5B4;&#xC624;&#xACE0; &#xC120;&#xC758; &#xBD80;&#xBD84;&#xC5D0; &#xB300;&#xD55C; &#xC5EC;&#xB7EC; &#xC18D;&#xC131;&#xC744;&#xC800;&#xC7A5;&#xD574;&#xC57C; &#xD560; &#xB54C; &#xC720;&#xC6A9;&#xD558;&#xAC8C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB294; LRS&#xC5D0; &#xB300;&#xD574; &#xACF5;&#xBD80;&#xD55C; &#xB0B4;&#xC6A9;&#xC744; &#xACF5;&#xC720;&#xD574; &#xBCF4;&#xC558;&#xB2E4;. </p><p> </p>]]></content:encoded></item></channel></rss>