<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Winwoo's Story</title>
    <link>https://winwoo.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 14 Sep 2025 15:40:27 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>윈우</managingEditor>
    <item>
      <title>Spin Lock 개선</title>
      <link>https://winwoo.tistory.com/115</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SpinLock의 단점&lt;br /&gt;&amp;nbsp;- Lock해제 되었는지 체크하기 위해선 매 프레임마다 Loop를 돌기때문에 비효율 적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RandomLock&lt;br /&gt;&amp;nbsp;- Lock이 해제됐는지 일정 &quot;시간 주기&quot;로 체크한다&lt;br /&gt;&amp;nbsp;- 매 프레임마다 하지않기때문에 좀 더 효율적이다.&lt;br /&gt;&amp;nbsp;- 어떠한 형태로 &quot;시간 주기&quot;를 설정하냐에 따라 동작이 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무조건 대기&lt;br /&gt;&amp;nbsp;- 무조건 1ms 정도 대기한다.&lt;br /&gt;&amp;nbsp;- 1ms &quot;정도&quot;인 이유는 정확한 대기시간은 운영체제의 스케쥴러가 결정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1630584919153&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Thread.Sleep(1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건부 대기&lt;br /&gt;&amp;nbsp;- 자신보다 우선순위가 낮은 Thread한테는 양보 불가.&lt;br /&gt;&amp;nbsp;- 자신보다 우선순위가 높거나 같은 Thread에게만 프로세스를 양보한다.&lt;br /&gt;&amp;nbsp;- 이 경우 우선순위 설정에 따라 어떤 Thread는 기아현상(계속 프로세스 할당을 못받는 상황)을 겪게 될 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1630585059973&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Thread.Sleep(0)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관대한 대기&lt;br /&gt;&amp;nbsp;- 지금 실행 가능한 Thread가 있으면 해당 Thread를 우선 실행시키고, 없을 경우에만 자신을 실행 시킨다.&lt;/p&gt;
&lt;pre id=&quot;code_1630585219010&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Thread.Yield()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 방법이 베스트라고 할 수 없고 상황에 맞게 사용하면 된다.&lt;/p&gt;</description>
      <category>프로그래밍/네트워크</category>
      <author>윈우</author>
      <guid isPermaLink="true">https://winwoo.tistory.com/115</guid>
      <comments>https://winwoo.tistory.com/115#entry115comment</comments>
      <pubDate>Thu, 2 Sep 2021 21:21:12 +0900</pubDate>
    </item>
    <item>
      <title>SpinLock</title>
      <link>https://winwoo.tistory.com/114</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. SpinLock : 존버메타&lt;br /&gt;&amp;nbsp;- Lock풀릴때까지 무한정 기다린다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;520&quot; width=&quot;388&quot; height=&quot;312&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FKBmB/btrdPJddYUm/qAVgtJFFVXr70Q93BU6gp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FKBmB/btrdPJddYUm/qAVgtJFFVXr70Q93BU6gp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FKBmB/btrdPJddYUm/qAVgtJFFVXr70Q93BU6gp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFKBmB%2FbtrdPJddYUm%2FqAVgtJFFVXr70Q93BU6gp0%2Fimg.png&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;520&quot; width=&quot;388&quot; height=&quot;312&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;느낌적으로 짜보자.&lt;/p&gt;
&lt;pre id=&quot;code_1630503075453&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   class SpinLock
    {
        volatile bool _locked = false;

        public void Acquire()
        {
            // 잠금이 풀릴때 까지 대기
            while (_locked)
            {
            }

            // 획득
            _locked = true;
        }

        public void Release()
        {
            _locked = false;
        }
    }

    class Program
    {
        const int MAX = 100000;
        static int _num = 0;
        static SpinLock _lock = new SpinLock();

        static void Thread_1()
        {
            for (int i = 0; i &amp;lt; MAX; ++i)
            {
                _lock.Acquire(); // 획득
                ++_num;
                _lock.Release(); // 해제
            }
        }

        static void Thread_2()
        {
            for (int i = 0; i &amp;lt; MAX; ++i)
            {
                _lock.Acquire(); // 획득
                --_num;
                _lock.Release(); // 해제
            }
        }

        static void Main(string[] args)
        {
            Task t1 = new Task(Thread_1);
            Task t2 = new Task(Thread_2);
            t1.Start();
            t2.Start();

            Task.WaitAll(t1, t2);
            Console.WriteLine(_num);
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과&lt;br /&gt;&amp;nbsp;- 어림없다.&lt;br /&gt;&amp;nbsp;- Acquire 함수가 Atomic이 보장이 안되기때문.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;199&quot; data-origin-height=&quot;143&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c12FrF/btrdIThPi4O/2hvwIp0iAyFU4S70AkLuuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c12FrF/btrdIThPi4O/2hvwIp0iAyFU4S70AkLuuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c12FrF/btrdIThPi4O/2hvwIp0iAyFU4S70AkLuuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc12FrF%2FbtrdIThPi4O%2F2hvwIp0iAyFU4S70AkLuuk%2Fimg.png&quot; data-origin-width=&quot;199&quot; data-origin-height=&quot;143&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1630503251819&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        public void Acquire()
        {
            // 두개 Thread가 동시에 접근할 경우 _locked는 아직 false이므로
            while (_locked)
            {
            }

            // 두 Thread 모두 _locked를 획득하게 된다.
            _locked = true;
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결법 1.&lt;br /&gt;Interlocked.Exchange 사용&lt;br /&gt;&amp;nbsp;- Atomic을 보장하는 함수&lt;br /&gt;&amp;nbsp;- 값을 ref 변수에 Atomic을 보장하여 넣어준다. &lt;br /&gt;&amp;nbsp;- 반환값은 값을 넣기전에 값&lt;/p&gt;
&lt;pre id=&quot;code_1630503699646&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    class SpinLock
    {
        volatile int _locked = 0;

        public void Acquire()
        {
            while (true)
            {
                // Interlocked으로 _locked에 1을 대입한다.
                // 반환값이 0이면 이전에 사용하고 있던 Thread가 없는 것이고,
                // 반환값이 1이면 이전에 Thread가 사용하고 있고 아직 Release안된 상태.
                int original = Interlocked.Exchange(ref _locked, 1);
                if (original == 0)
                    break;
            }
        }

        public void Release()
        {
            _locked = 0;
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;166&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bro02o/btrdOWw8Nc4/qnoewxQ7UkyM8pCkehLkkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bro02o/btrdOWw8Nc4/qnoewxQ7UkyM8pCkehLkkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bro02o/btrdOWw8Nc4/qnoewxQ7UkyM8pCkehLkkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbro02o%2FbtrdOWw8Nc4%2FqnoewxQ7UkyM8pCkehLkkK%2Fimg.png&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;166&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결법 2.&lt;br /&gt;위 방법도 괜찮지만 뭔가 직관적이지 않음&lt;br /&gt;&amp;nbsp;- 무조건 Lock을 걸어주고, Lock걸기 이전에 Lock이 안걸려있는 경우에 Lock이 걸린다 : 복잡..&lt;br /&gt;&amp;nbsp;- Lock이 걸려있지 않으면 Lock을 걸어준다 : Good&lt;br /&gt;&amp;nbsp;- 간단한 코드로 써보면&lt;/p&gt;
&lt;pre id=&quot;code_1630504137720&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(_locked == 0)
    _locked = 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이렇게하면 Atomic하지 않기 때문에 Interlocked에서 제공되는 함수가 있다.&lt;br /&gt;Interlocked.CompareExchange(ref _locked, 넣을값, 비교값)&lt;br /&gt;&amp;nbsp;- _locked와 '비교값'을 비교하여 같으면 '넣을값'을 _locked에 넣어준다.&lt;br /&gt;&amp;nbsp;- Interlocked.Exchange와 똑같이 original값을 반환한다.&lt;/p&gt;
&lt;pre id=&quot;code_1630504489655&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int original = Interlocked.CompareExchange(ref _locked, 1, 0);
if (original == 0)
    break;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수를 사용하여 좀 더 명시적으로 바꾸면&lt;/p&gt;
&lt;pre id=&quot;code_1630504690640&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int expected = 0; // 예상한 값
int desired = 1; // 예상한 값이 맞으면 넣을 값
if (Interlocked.CompareExchange(ref _locked, desired, expected) == expected)
    break;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체코드&lt;/p&gt;
&lt;pre id=&quot;code_1630504880577&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    class SpinLock
    {
        volatile int _locked = 0;

        public void Acquire()
        {
            while (true)
            {
                int expected = 0; // 예상한 값
                int desired = 1; // 예상한 값이 맞으면 넣을 값

                // _locked가 0이면 1을 넣어주고, 0(original == expected)을 반환다.
                // original이 0이었다는건 이전에 사용하고있지 않은 상태이기 때문에 사용권을 획득한다.
                if (Interlocked.CompareExchange(ref _locked, desired, expected) == expected)
    				break;
            }
        }

        public void Release()
        {
            // 이미 Acquire 단계에서 Atomic이 보장된 상황이기때문에 별도 Interlocked없이 해제해도 된다.
            _locked = 0;
        }
    }&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍/네트워크</category>
      <author>윈우</author>
      <guid isPermaLink="true">https://winwoo.tistory.com/114</guid>
      <comments>https://winwoo.tistory.com/114#entry114comment</comments>
      <pubDate>Wed, 1 Sep 2021 23:01:26 +0900</pubDate>
    </item>
    <item>
      <title>DeadLock</title>
      <link>https://winwoo.tistory.com/113</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://winwoo.tistory.com/112#:~:text=Thread_2%EB%8A%94%C2%A0%20Dead%20Lock%20%EC%83%81%ED%83%9C(%EC%A3%BD%EC%9D%80%20%EC%9E%90%EB%AC%BC%EC%87%A0)&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이전예제&lt;/a&gt;&lt;/span&gt;에서 봤던 DeadLock상황은 엄청 단순한 상황.&lt;br /&gt;실제론 좀 더 복잡한 상황에서 자주 발생함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개 이상의 lock이 존재할 경우.&lt;br /&gt;&amp;nbsp;- Thread1이 Resource1을 Lock걸어 놓고 Resource2를 접근하려고 했지만. Resource2는 이미 Thread2에 의해 Lock걸린 상황&lt;br /&gt;&amp;nbsp;- 그와 동시에 Thread2는 Thread1에 의해 lock이 걸린 Resource1에 접근하려고 하면 Thread1과 Thread2는 둘다 &quot;교착상태&quot;가 발생하여 더이상 프로세스가 진행되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;202&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyYYRO/btrdyjFQ0hD/KpyfS3KQkOAKkf33e1BZT0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyYYRO/btrdyjFQ0hD/KpyfS3KQkOAKkf33e1BZT0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyYYRO/btrdyjFQ0hD/KpyfS3KQkOAKkf33e1BZT0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyYYRO%2FbtrdyjFQ0hD%2FKpyfS3KQkOAKkf33e1BZT0%2Fimg.jpg&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;202&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;617&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tEMI2/btrdqhXhJuw/goA8fGOX1GmttnU4HgxbHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tEMI2/btrdqhXhJuw/goA8fGOX1GmttnU4HgxbHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tEMI2/btrdqhXhJuw/goA8fGOX1GmttnU4HgxbHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtEMI2%2FbtrdqhXhJuw%2FgoA8fGOX1GmttnU4HgxbHk%2Fimg.png&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;617&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2301&quot; data-origin-height=&quot;825&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfjHW3/btrdqiIGWCp/ZTJ7eTL5nUS1q5nfkKYu51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfjHW3/btrdqiIGWCp/ZTJ7eTL5nUS1q5nfkKYu51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfjHW3/btrdqiIGWCp/ZTJ7eTL5nUS1q5nfkKYu51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfjHW3%2FbtrdqiIGWCp%2FZTJ7eTL5nUS1q5nfkKYu51%2Fimg.png&quot; data-origin-width=&quot;2301&quot; data-origin-height=&quot;825&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결책.&lt;br /&gt;1. Lock에 접근했을때 일정 시간동안 기다리다가 Lock이 해제가 안되면 포기한다.&lt;br /&gt;&amp;nbsp;- 해결을 될지 몰라도 근본적인 Lock구조가 꼬여있는 상태는 해결하지 못하기 때문에 좋은 방법은 아니다.&lt;br /&gt;2. DeadLock이 발생했을때 디버깅을 통해 Lock구조를 수정하여 해결&lt;br /&gt;&amp;nbsp;- 근본적인 해결이지만&amp;nbsp; DeadLock상황이 개발단계에서 발생하기 힘들기 때문에 문제 발견후 수정이 꽤나 어려움&lt;br /&gt;3. Lock별로 Id를 부여하여 Lock의 순서도를 가식화 하여 관리&lt;br /&gt;&amp;nbsp;- 2번을 미리 알기위한 방법중 하나&lt;br /&gt;&lt;br /&gt;그외 여러방법이 있을 수 있지만 근본적으론 DeadLock을 발견되면 즉시 Lock구조를 수정하는 방법이 최선이고 경험을 통해 구조를 잘짜는법 뿐인것같다.&lt;/p&gt;</description>
      <author>윈우</author>
      <guid isPermaLink="true">https://winwoo.tistory.com/113</guid>
      <comments>https://winwoo.tistory.com/113#entry113comment</comments>
      <pubDate>Sun, 29 Aug 2021 22:20:52 +0900</pubDate>
    </item>
    <item>
      <title>Lock</title>
      <link>https://winwoo.tistory.com/112</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Interlocked는 정수만 제어가능하다는 단점이 있다.&lt;br /&gt;&amp;nbsp;- 구문을 Atomic하게 제어할 수 있는 무언가가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Monitor를 이용한 Atomic구현&lt;br /&gt;&amp;nbsp;- 빈 object를 기준으로 Atomic영역의 시작과 끝을 정의할 수 있음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;379&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qP9uo/btrdqi9HKw4/2z2TbgExqTlcF5qI86Y3wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qP9uo/btrdqi9HKw4/2z2TbgExqTlcF5qI86Y3wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qP9uo/btrdqi9HKw4/2z2TbgExqTlcF5qI86Y3wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqP9uo%2Fbtrdqi9HKw4%2F2z2TbgExqTlcF5qI86Y3wk%2Fimg.png&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;379&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 코드가 길어질 경우 실수로 return을 하여 Monitor.Exit가 실행이 안되면 프로그램이 멈춰버림&lt;br /&gt;&amp;nbsp;- Thread_1은 return이후에 정상적으로 실행이 되겠지만, Thread_2의 경우 Thread_1에 의해 잠겨버린 _obj에 의해 동작이 멈춰버리게 된다.&lt;br /&gt;&amp;nbsp;- Thread_2는&amp;nbsp; Dead Lock 상태(죽은 자물쇠)&lt;br /&gt;&amp;nbsp;- 문을 잠그고 안열어준 상태&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;473&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqhBYr/btrdwTtPXuZ/lEHsY7stVo25UIKrNcRw70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqhBYr/btrdwTtPXuZ/lEHsY7stVo25UIKrNcRw70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqhBYr/btrdwTtPXuZ/lEHsY7stVo25UIKrNcRw70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqhBYr%2FbtrdwTtPXuZ%2FlEHsY7stVo25UIKrNcRw70%2Fimg.png&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;473&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결책1.&lt;br /&gt;try - finally&lt;br /&gt;&amp;nbsp;- 구문을 try로 묶고 finally에 Lock해제구문을 넣게되면 중간에 return을 하더래도 무조건 finally가 실행되어 Lock해제 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;353&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bR3Wws/btrduT1XGoO/q2C0Aetq6L7FAWRSR6UzRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bR3Wws/btrduT1XGoO/q2C0Aetq6L7FAWRSR6UzRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bR3Wws/btrduT1XGoO/q2C0Aetq6L7FAWRSR6UzRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR3Wws%2FbtrduT1XGoO%2Fq2C0Aetq6L7FAWRSR6UzRK%2Fimg.png&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;353&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결책2.&lt;br /&gt;&quot;lock&quot;키워드 사용&lt;br /&gt;&amp;nbsp;- lock내부적으론 위와 같이 Monitor.Enter와 Monitor.Exit로 구현돼 있다.&lt;br /&gt;&amp;nbsp;- Monitor를 사용하는 것보다 좀더 편리하고 안전하게 Atomic영역을 관리할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;397&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EAkDu/btrdtKc8F7a/8W8jCWWR0oOyMU6uVFQJfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EAkDu/btrdtKc8F7a/8W8jCWWR0oOyMU6uVFQJfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EAkDu/btrdtKc8F7a/8W8jCWWR0oOyMU6uVFQJfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEAkDu%2FbtrdtKc8F7a%2F8W8jCWWR0oOyMU6uVFQJfk%2Fimg.png&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;397&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>프로그래밍/네트워크</category>
      <author>윈우</author>
      <guid isPermaLink="true">https://winwoo.tistory.com/112</guid>
      <comments>https://winwoo.tistory.com/112#entry112comment</comments>
      <pubDate>Sun, 29 Aug 2021 22:16:25 +0900</pubDate>
    </item>
    <item>
      <title>Race Condition</title>
      <link>https://winwoo.tistory.com/111</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MultiThread 동작 시 하나의 변수에 대해 2개의 Thread가 값을 변경할 경우 예상과 다른 결과가 나올 수 있다.&lt;br /&gt;&amp;nbsp;- 값 연산 횟수가 많아질수록 더 심해진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/egGoo1/btrdqjN9XoW/ytBNjtA2kZUkoW6H3INHE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/egGoo1/btrdqjN9XoW/ytBNjtA2kZUkoW6H3INHE0/img.png&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;513&quot; style=&quot;width: 50.411%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/egGoo1/btrdqjN9XoW/ytBNjtA2kZUkoW6H3INHE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FegGoo1%2FbtrdqjN9XoW%2FytBNjtA2kZUkoW6H3INHE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;425&quot; height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpaKC1/btrdrnidXYT/WbPlnAYDBuAMzkamnLrxS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpaKC1/btrdrnidXYT/WbPlnAYDBuAMzkamnLrxS0/img.png&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;529&quot; style=&quot;width: 48.4262%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpaKC1/btrdrnidXYT/WbPlnAYDBuAMzkamnLrxS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpaKC1%2FbtrdrnidXYT%2FWbPlnAYDBuAMzkamnLrxS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;421&quot; height=&quot;529&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유&lt;br /&gt;&amp;nbsp;- Assembly Level에서의 변수의 값증가 행위는 3단계로 나뉜다.&lt;br /&gt;&amp;nbsp; 1. 해당 변수의 주소에 접근하여 값을 ecx register에 임시 저장한다.&lt;br /&gt;&amp;nbsp; 2. ecx를 1증가 시킨다.&lt;br /&gt;&amp;nbsp; 3. ecx값을 변수 주소에 다시 넣어준다.&lt;br /&gt;- Multi Thread에 경우 Atomic(원자성)이 보존되지 않아 1번 동작이 2개의 Thread에서 동시에 일어나게 되면 서로 다른 연산을 하게된다.&lt;br /&gt;&amp;nbsp;- 이 경우 &quot;변수의 주소&quot;는 Critical Section(임계 영역)이라고 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1630223840709&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// c#에서 증가
number++;

// Assembly에서 증가
mov exc, dword ptr[주소] // number주소에서 exc로 number값 저장
inc exc // exc(number에서 가져온값)을 1증가
mov dword ptr[주소], exc // exc의 증가된값을 number 주소로 다시 넣어준다.

// Assembly를 C#느낌으로 쉽게 풀어쓰면
int temp = number;
temp++;
number = temp;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Interlocked&lt;br /&gt;- Atomic을 보장하는 기능&lt;br /&gt;- 2개의 Thread가 하나의 주소에 접근할 경우 둘 중 먼저 접근한 Thread의 연산처리가 끝난뒤 다른 Thread가 순차적으로 접근하여 연산하게 된다.&lt;br /&gt;- 때문에 성능상의 저하는 피할 수 없다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;601&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDEo5E/btrdptwY9W6/VPSalQ4CUDCE9pKSofkbL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDEo5E/btrdptwY9W6/VPSalQ4CUDCE9pKSofkbL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDEo5E/btrdptwY9W6/VPSalQ4CUDCE9pKSofkbL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDEo5E%2FbtrdptwY9W6%2FVPSalQ4CUDCE9pKSofkbL0%2Fimg.png&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;601&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MultiThread환경에서 변수의 증감에 대한 Atomic한 결과를 확인하는 방법&lt;/p&gt;
&lt;pre id=&quot;code_1630226095917&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 잘못된 방법
Interlocked.Increment(ref number);
int result = number; // 이 시점에 number가 위에서 증가된 이후에 실행됐다는 보장이 없다.

// 옳바른 방법
// Interlocked.Increment의 반환값은 증가된 순간의 값을 반환하므로 Atomic한 값이다.
int result = Interlocked.Increment(ref number);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍/네트워크</category>
      <author>윈우</author>
      <guid isPermaLink="true">https://winwoo.tistory.com/111</guid>
      <comments>https://winwoo.tistory.com/111#entry111comment</comments>
      <pubDate>Sun, 29 Aug 2021 17:28:13 +0900</pubDate>
    </item>
    <item>
      <title>Cache</title>
      <link>https://winwoo.tistory.com/110</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Cache&lt;br /&gt;&amp;nbsp;- CPU가 메모리에 데이터를 전송하기 전 데이터를 저장하고있는 저장 공간&lt;br /&gt;&amp;nbsp;- 데이터를 바로 RAM에 올리는것이 아닌, 일정량을 Cache에 저장하고 있다가 한번에 RAM에 올린다.&lt;br /&gt;&amp;nbsp;- 속도는 Register -&amp;gt; L1 Cache -&amp;gt; L2 Cache -&amp;gt; RAM(MainMemory) 순이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boByt7/btrdlyZlYdj/Kgp1RMIS55Dxn8u1isH5j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boByt7/btrdlyZlYdj/Kgp1RMIS55Dxn8u1isH5j1/img.png&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;241&quot; style=&quot;width: 61.0225%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boByt7/btrdlyZlYdj/Kgp1RMIS55Dxn8u1isH5j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboByt7%2FbtrdlyZlYdj%2FKgp1RMIS55Dxn8u1isH5j1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;331&quot; height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bu3wFA/btrdoohDFea/1vHGfy6eTyE3iKdeMZJhk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bu3wFA/btrdoohDFea/1vHGfy6eTyE3iKdeMZJhk1/img.png&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;544&quot; style=&quot;width: 37.8147%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bu3wFA/btrdoohDFea/1vHGfy6eTyE3iKdeMZJhk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbu3wFA%2FbtrdoohDFea%2F1vHGfy6eTyE3iKdeMZJhk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;463&quot; height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cache 철학 - 무엇을 Cache 할것인가?&lt;br /&gt;&amp;nbsp;- 시간적 측면 : 가장 최근에 사용한 데이터&lt;br /&gt;&amp;nbsp;- 공간적 측면 : 가장 최근에 사용된 메모리 근처&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cache Test&lt;br /&gt;&amp;nbsp;- 2차원 배열에서 [0,0][0,1][0,2]를 참조하는 것과 [0,0][1,0][2,0]을 참조하는 시간이 차이가 난다.&lt;br /&gt;&amp;nbsp;- 공간적 측면에서 보면 [0,0]을 참조한 순간 Cache는 [0,?]을 우선으로 사용할 것이라고 가정했기 때문.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;559&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfcByj/btrdlzQ76tE/sQeJ84SLKuGZjViUxI5BR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfcByj/btrdlzQ76tE/sQeJ84SLKuGZjViUxI5BR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfcByj/btrdlzQ76tE/sQeJ84SLKuGZjViUxI5BR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfcByj%2FbtrdlzQ76tE%2FsQeJ84SLKuGZjViUxI5BR1%2Fimg.png&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;559&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>프로그래밍/네트워크</category>
      <author>윈우</author>
      <guid isPermaLink="true">https://winwoo.tistory.com/110</guid>
      <comments>https://winwoo.tistory.com/110#entry110comment</comments>
      <pubDate>Fri, 27 Aug 2021 21:58:35 +0900</pubDate>
    </item>
    <item>
      <title>Thread의 생성</title>
      <link>https://winwoo.tistory.com/109</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Thread의 기본 생성&lt;br /&gt;&amp;nbsp;- Thread 생성시 넣은 함수가 종료되면 Thread도 같이 종료된다.&lt;/p&gt;
&lt;pre id=&quot;code_1629987933217&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static void MainTread()
{
    Console.WriteLine(&quot;Hello Thread&quot;);
}

static void Main(string[] args)
{
    // Thread 생성 (생성된 Thread가 동작시킬 함수)
    Thread t = new Thread(MainTread);
    // Thread 시작
    t.Start();

    Console.WriteLine(&quot;Hello world&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;159&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TtZOa/btrdkabHU56/kL84SkbhDu3AqKBkl7kS50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TtZOa/btrdkabHU56/kL84SkbhDu3AqKBkl7kS50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TtZOa/btrdkabHU56/kL84SkbhDu3AqKBkl7kS50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTtZOa%2FbtrdkabHU56%2FkL84SkbhDu3AqKBkl7kS50%2Fimg.png&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;159&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C#의 Thread는 Default로 Foreground로 생성된다.&lt;br /&gt;&amp;nbsp;- 이 경우 Thread가 종료되지 않으면 프로그램이 종료되지 않는다.&lt;br /&gt;&amp;nbsp;- isBackground = true 해줄 경우 Thread가 background로 실행되기 때문에 프로그램 종료와 함께 종료된다.&lt;/p&gt;
&lt;pre id=&quot;code_1629988275796&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        static void MainTread()
        {
            while(true)
                Console.WriteLine(&quot;Hello Thread&quot;);
        }

        static void Main(string[] args)
        {
            // Thread 생성 (생성된 Thread가 동작시킬 함수)
            Thread t = new Thread(MainTread);
            t.IsBackground = true;
            // Thread 시작
            t.Start();

            Console.WriteLine(&quot;Hello world&quot;);
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2aTIX/btrdkOMYJb1/8QUkvKAuzi1ZcJn7w28WHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2aTIX/btrdkOMYJb1/8QUkvKAuzi1ZcJn7w28WHk/img.png&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;239&quot; style=&quot;width: 65.0349%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2aTIX/btrdkOMYJb1/8QUkvKAuzi1ZcJn7w28WHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2aTIX%2FbtrdkOMYJb1%2F8QUkvKAuzi1ZcJn7w28WHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;975&quot; height=&quot;239&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cviQXe/btrdiw7j7qI/xn4aBTDKrFDKnSDwN21K10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cviQXe/btrdiw7j7qI/xn4aBTDKrFDKnSDwN21K10/img.png&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;457&quot; style=&quot;width: 33.8024%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cviQXe/btrdiw7j7qI/xn4aBTDKrFDKnSDwN21K10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcviQXe%2Fbtrdiw7j7qI%2Fxn4aBTDKrFDKnSDwN21K10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;969&quot; height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;생성한 Thread가 종료되기전까지 프로그램이 종료되지 않는다. / isBackground = true일 경우 프로그램이 종료되면 Thread도 종료된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Thread가 Background로 실행되고 있어도 Join()함수를 통해 해당 Thread가 종료될때까지 프로그램을 대기시킬 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1629988800358&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        static void MainTread()
        {
            while(true)
                Console.WriteLine(&quot;Hello Thread&quot;);
        }

        static void Main(string[] args)
        {
            // Thread 생성 (생성된 Thread가 동작시킬 함수)
            Thread t = new Thread(MainTread);
            t.IsBackground = true;
            // Thread 시작
            t.Start();
            Console.WriteLine(&quot;Waiting for Thread&quot;);
            // background Thread가 종료될때 까지 대기
            t.Join();

            Console.WriteLine(&quot;Hello world&quot;);
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디버깅을 통해 현재 Thread상태 확인하기&lt;br /&gt;&amp;nbsp;- 프로그램 실행중 &quot;정지&quot;버튼을 누르고 Thread를 선택하면 해당 Thread의 동작지점이 표시된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sbbyr/btrdgRKJAn0/l3WS9mFoBTEUAWLbCZ3ChK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sbbyr/btrdgRKJAn0/l3WS9mFoBTEUAWLbCZ3ChK/img.png&quot; data-origin-width=&quot;1609&quot; data-origin-height=&quot;695&quot; style=&quot;width: 58.6884%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sbbyr/btrdgRKJAn0/l3WS9mFoBTEUAWLbCZ3ChK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSbbyr%2FbtrdgRKJAn0%2Fl3WS9mFoBTEUAWLbCZ3ChK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1609&quot; height=&quot;695&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wDbj5/btrdmAOe5pG/057PRmw4VSEMWeckfka8Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wDbj5/btrdmAOe5pG/057PRmw4VSEMWeckfka8Yk/img.png&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;579&quot; style=&quot;width: 40.1488%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wDbj5/btrdmAOe5pG/057PRmw4VSEMWeckfka8Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwDbj5%2FbtrdmAOe5pG%2F057PRmw4VSEMWeckfka8Yk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;917&quot; height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Thread Pool&lt;br /&gt;&amp;nbsp;- 프로그램 동작 중 간단한 작업을 위해 잦은 Thread 생성이 필요한 경우 사용하면 좋음.&lt;br /&gt;&amp;nbsp;- C#에서 미리 Poolling해둔 Thread를 가져다가 사용하고 해당 Thread가 종료되면 자동으로 Pool로 반납됨&lt;br /&gt;&amp;nbsp;- 대신 ThreadPool에서 가져온 Thread를 오래 사용할 경우 ThreadPool로 반납이 안되어, ThreadPool의 Thread가 부족해질 수 있고, 그럴경우 ThreadPool이 동작하지 않는 상황 발생.&lt;br /&gt;&amp;nbsp;- 그래서 간단한 작업을 할때 사용하자.&lt;/p&gt;
&lt;pre id=&quot;code_1629989388359&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        static void MainTread(object state)
        {
            for(int i = 0; i&amp;lt;5; ++i)
                Console.WriteLine(&quot;Hello Thread&quot;);
        }

        static void Main(string[] args)
        {
            ThreadPool.QueueUserWorkItem(MainTread);

            while (true)
            {

            }
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;437&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FbfK4/btrdlzBYLcO/tn9OMK57JWUFrfUZCQrak1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FbfK4/btrdlzBYLcO/tn9OMK57JWUFrfUZCQrak1/img.png&quot; data-alt=&quot;Thread Pool의 Max개수만큼 Thread를 사용하고 반납이 안될경우 더 이상 추가 Thread할당이 안됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FbfK4/btrdlzBYLcO/tn9OMK57JWUFrfUZCQrak1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFbfK4%2FbtrdlzBYLcO%2Ftn9OMK57JWUFrfUZCQrak1%2Fimg.png&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;437&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Thread Pool의 Max개수만큼 Thread를 사용하고 반납이 안될경우 더 이상 추가 Thread할당이 안됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Task&lt;br /&gt;&amp;nbsp;- TheadPool에서 Thread를 할당 받아 사용.&lt;br /&gt;&amp;nbsp;- 하지만 Task생성시 옵션으로 &quot;TaskCreationOptions.LongRunning&quot;을 설정해 줄 경우 ThreadPool에서 할당하지 않고 별도의 Thread를 생성하여 할당하기 때문에 Thread Pool의 부족현상을 해결 할 수 있다.&lt;br /&gt;&amp;nbsp;- &quot;TaskCreationOptions.LongRunning&quot; 옵션을 넣지 않으면 ThreadPool에서 할당한다.&lt;br /&gt;&amp;nbsp;- 따라서 Task위주로 Thread를 활용하고 오래걸리는 작업일 경우 Task생성시 &quot;TaskCreationOptions.LongRunning&quot;를 넣어주자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;457&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zbg48/btrdeXED2rz/QkNScp9ub8fDW6zznSwzx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zbg48/btrdeXED2rz/QkNScp9ub8fDW6zznSwzx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zbg48/btrdeXED2rz/QkNScp9ub8fDW6zznSwzx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzbg48%2FbtrdeXED2rz%2FQkNScp9ub8fDW6zznSwzx1%2Fimg.png&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;457&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>프로그래밍/네트워크</category>
      <author>윈우</author>
      <guid isPermaLink="true">https://winwoo.tistory.com/109</guid>
      <comments>https://winwoo.tistory.com/109#entry109comment</comments>
      <pubDate>Fri, 27 Aug 2021 00:02:55 +0900</pubDate>
    </item>
    <item>
      <title>Thread란?</title>
      <link>https://winwoo.tistory.com/108</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;CPU가 Single Core일 때 Thread 할당 방법&lt;br /&gt;&amp;nbsp;- Core의 작업을 나누어 각 Thread별로 일정 단위시간만큼 할당한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;514&quot; width=&quot;373&quot; height=&quot;240&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb0D2Q/btrdfe0nF4k/jlLllre9KEVGsCbzeelGQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb0D2Q/btrdfe0nF4k/jlLllre9KEVGsCbzeelGQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb0D2Q/btrdfe0nF4k/jlLllre9KEVGsCbzeelGQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb0D2Q%2Fbtrdfe0nF4k%2FjlLllre9KEVGsCbzeelGQ0%2Fimg.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;514&quot; width=&quot;373&quot; height=&quot;240&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU가 Multi Core일 때 Thread 할당 방법&lt;br /&gt;&amp;nbsp;- 각 코어가 Thread별로 할당됨&lt;br /&gt;&amp;nbsp;- Thread를 많이 생성한다고 효율이 좋지않다. &lt;br /&gt;&amp;nbsp; -&amp;gt; Thread가 많을 수록 CPU가 Thread를 옮겨가며 작업하는 횟수가 많아지고 그 행위자체가 비효율&lt;br /&gt;&amp;nbsp;- 그래서 Thread숫자는 Core숫자와 맞춰주는게 효율이 좋다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;1165&quot; data-origin-height=&quot;639&quot; width=&quot;412&quot; height=&quot;226&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c52JiH/btrdkJx4d8l/ugiLPEOnT9TiINEHjaAHK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c52JiH/btrdkJx4d8l/ugiLPEOnT9TiINEHjaAHK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c52JiH/btrdkJx4d8l/ugiLPEOnT9TiINEHjaAHK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc52JiH%2FbtrdkJx4d8l%2FugiLPEOnT9TiINEHjaAHK0%2Fimg.png&quot; data-origin-width=&quot;1165&quot; data-origin-height=&quot;639&quot; width=&quot;412&quot; height=&quot;226&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Multi Thread의 메모리 영역&lt;br /&gt;&amp;nbsp;- Heap : 공용&lt;br /&gt;&amp;nbsp;- 데이터(static) : 공용&lt;br /&gt;&amp;nbsp;- stack : 쓰레드별 할당&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjN7lZ/btrdkapd6Wd/GrBy9tXSRHLNiR5DATsw61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjN7lZ/btrdkapd6Wd/GrBy9tXSRHLNiR5DATsw61/img.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;328&quot; width=&quot;512&quot; height=&quot;240&quot; style=&quot;width: 53.2734%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjN7lZ/btrdkapd6Wd/GrBy9tXSRHLNiR5DATsw61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjN7lZ%2Fbtrdkapd6Wd%2FGrBy9tXSRHLNiR5DATsw61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RF6ob/btrdesZeqAv/DzkO8kxFoo20UOOnXWBrpK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RF6ob/btrdesZeqAv/DzkO8kxFoo20UOOnXWBrpK/img.jpg&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;166&quot; style=&quot;width: 45.5639%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RF6ob/btrdesZeqAv/DzkO8kxFoo20UOOnXWBrpK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRF6ob%2FbtrdesZeqAv%2FDzkO8kxFoo20UOOnXWBrpK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;303&quot; height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Thread가 많아질 수록 관리해야 될 부분이 많아져 혼란해진다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Multi Thread 활용시&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;Heap과 데이터 영역&lt;/span&gt;에 접근할때 이슈가 발생할 수 있다.&lt;/p&gt;</description>
      <category>프로그래밍/네트워크</category>
      <author>윈우</author>
      <guid isPermaLink="true">https://winwoo.tistory.com/108</guid>
      <comments>https://winwoo.tistory.com/108#entry108comment</comments>
      <pubDate>Thu, 26 Aug 2021 00:09:40 +0900</pubDate>
    </item>
    <item>
      <title>행렬</title>
      <link>https://winwoo.tistory.com/105</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;행렬(Matrix)&lt;br /&gt;&amp;nbsp;- 2차원 배열 느낌(행과 열로 이루어져 있음)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;236&quot; width=&quot;371&quot; height=&quot;199&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OS4nF/btraLsMtQVC/K0MA0J0oxNAk6SMKJNWxnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OS4nF/btraLsMtQVC/K0MA0J0oxNAk6SMKJNWxnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OS4nF/btraLsMtQVC/K0MA0J0oxNAk6SMKJNWxnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOS4nF%2FbtraLsMtQVC%2FK0MA0J0oxNAk6SMKJNWxnk%2Fimg.png&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;236&quot; width=&quot;371&quot; height=&quot;199&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬 스칼라 곱셈&lt;br /&gt;&amp;nbsp;- 각 요소에 스칼라값을 곱해주면 됨.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;182&quot; data-origin-height=&quot;158&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UH3zK/btraNIBiqFR/YcGO4uIaoveso3OKmsdIn1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UH3zK/btraNIBiqFR/YcGO4uIaoveso3OKmsdIn1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UH3zK/btraNIBiqFR/YcGO4uIaoveso3OKmsdIn1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUH3zK%2FbtraNIBiqFR%2FYcGO4uIaoveso3OKmsdIn1%2Fimg.jpg&quot; data-origin-width=&quot;182&quot; data-origin-height=&quot;158&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬 덧샘, 뺄샘&lt;br /&gt;&amp;nbsp;- 행렬의 모양이 같아야 됨.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;427&quot; width=&quot;271&quot; height=&quot;149&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdpK5X/btraFF7CGof/epUKAcOC4KnBzdYLyqgJ9k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdpK5X/btraFF7CGof/epUKAcOC4KnBzdYLyqgJ9k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdpK5X/btraFF7CGof/epUKAcOC4KnBzdYLyqgJ9k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdpK5X%2FbtraFF7CGof%2FepUKAcOC4KnBzdYLyqgJ9k%2Fimg.jpg&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;427&quot; width=&quot;271&quot; height=&quot;149&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬 곱셈&lt;br /&gt;&amp;nbsp;- 앞의 행렬의 열과 뒤의 행렬의 행의 개수가 같아야됨.&lt;br /&gt;&amp;nbsp;- 곱셈의 결과로 나온 행의 크기는 [앞행렬의 행, 뒤행렬의 열]이다. &lt;br /&gt;&amp;nbsp;- ex) [2, 1] * [1, 2] = 곱셈이 성립하고, 결과는 [2, 2] 이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daKWaq/btraHrVrd2y/L5UkkU8vpM3L7QTgaFsaKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daKWaq/btraHrVrd2y/L5UkkU8vpM3L7QTgaFsaKk/img.png&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;304&quot; width=&quot;449&quot; height=&quot;225&quot; style=&quot;width: 53.1855%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daKWaq/btraHrVrd2y/L5UkkU8vpM3L7QTgaFsaKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaKWaq%2FbtraHrVrd2y%2FL5UkkU8vpM3L7QTgaFsaKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;606&quot; height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TUxfe/btraKENaZdy/UfQwV266ibLaZkn5HFd7E1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TUxfe/btraKENaZdy/UfQwV266ibLaZkn5HFd7E1/img.png&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;353&quot; style=&quot;width: 45.6517%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TUxfe/btraKENaZdy/UfQwV266ibLaZkn5HFd7E1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTUxfe%2FbtraKENaZdy%2FUfQwV266ibLaZkn5HFd7E1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;604&quot; height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬의 곱을 벡터의 내적으로 표현&lt;br /&gt;&amp;nbsp;- 벡터의 내적 공식 : AxBx + AyBy + AzBz&lt;br /&gt;&amp;nbsp;- 행렬의 곱셈 공식 : Row1Col1 + Row2Col2 + Row3Col3&lt;br /&gt;&amp;nbsp;- 두 공식의 방식이 같으므로 행과 열을 벡터로 변환한뒤 내적하면 행렬의 곱이 성립된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;490&quot; width=&quot;548&quot; height=&quot;349&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca5sSS/btraHsndsZH/B38JNOk2n9IILFSVFx7Wjk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca5sSS/btraHsndsZH/B38JNOk2n9IILFSVFx7Wjk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca5sSS/btraHsndsZH/B38JNOk2n9IILFSVFx7Wjk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca5sSS%2FbtraHsndsZH%2FB38JNOk2n9IILFSVFx7Wjk%2Fimg.jpg&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;490&quot; width=&quot;548&quot; height=&quot;349&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교환법칙과 결합법칙&lt;br /&gt;&amp;nbsp;- 교환법칙은 성립되지 않음 ex) AB != BA&lt;br /&gt;&amp;nbsp;- 결합법칙은 성립됨 ex) (AB)C = A(BC)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대각행렬&lt;br /&gt;&amp;nbsp;- 대각요소를 제외한 숫자가 0인 행렬&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;225&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beTCGe/btraKFe44gm/unSo1uP2jbPCUTvRsui45k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beTCGe/btraKFe44gm/unSo1uP2jbPCUTvRsui45k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beTCGe/btraKFe44gm/unSo1uP2jbPCUTvRsui45k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeTCGe%2FbtraKFe44gm%2FunSo1uP2jbPCUTvRsui45k%2Fimg.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;225&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단위행렬 (Identity)&lt;br /&gt;&amp;nbsp;- 대각행렬의 숫자가 모두 1인 행렬&lt;br /&gt;&amp;nbsp;- 단위행렬은 어떠한 행렬과 곱셈해도 그 행렬의 값이 그대로 나온다.&lt;br /&gt;&amp;nbsp;- 단위행렬은 교환법칙도 성립한다. AI == IA&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/loDDC/btraKFe44wY/HGc4uqNjf9UOfKRW9dxkrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/loDDC/btraKFe44wY/HGc4uqNjf9UOfKRW9dxkrK/img.png&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;224&quot; style=&quot;width: 51.8392%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/loDDC/btraKFe44wY/HGc4uqNjf9UOfKRW9dxkrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FloDDC%2FbtraKFe44wY%2FHGc4uqNjf9UOfKRW9dxkrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;460&quot; height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boAx3z/btraImtyOmL/zOKKYy1PEhKnmjbKNyKTbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boAx3z/btraImtyOmL/zOKKYy1PEhKnmjbKNyKTbk/img.png&quot; data-origin-width=&quot;229&quot; data-origin-height=&quot;123&quot; style=&quot;width: 46.998%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boAx3z/btraImtyOmL/zOKKYy1PEhKnmjbKNyKTbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboAx3z%2FbtraImtyOmL%2FzOKKYy1PEhKnmjbKNyKTbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;229&quot; height=&quot;123&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역행렬&lt;br /&gt;&amp;nbsp;- 변환된 행렬을 원래 상태로 돼돌리는 행렬&lt;br /&gt;&amp;nbsp;- 행렬에 역행렬을 곱하면 단위행렬이 나온다. ex) M * M-&amp;sup1; = I(단위행렬)&lt;br /&gt;&amp;nbsp;- determinant = ad - bc&lt;br /&gt;&amp;nbsp;- determinat가 0이 아니면 역행렬이 존재한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sDCZK/btraLcwJAg5/FMUsb97F8UHjYghcMgEUyk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sDCZK/btraLcwJAg5/FMUsb97F8UHjYghcMgEUyk/img.jpg&quot; data-origin-width=&quot;289&quot; data-origin-height=&quot;151&quot; style=&quot;width: 38.6076%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sDCZK/btraLcwJAg5/FMUsb97F8UHjYghcMgEUyk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsDCZK%2FbtraLcwJAg5%2FFMUsb97F8UHjYghcMgEUyk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;289&quot; height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYiFUL/btraImty0Cf/QHAJukdPyB6wRXznFwOTUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYiFUL/btraImty0Cf/QHAJukdPyB6wRXznFwOTUK/img.png&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;211&quot; style=&quot;width: 60.2296%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYiFUL/btraImty0Cf/QHAJukdPyB6wRXznFwOTUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYiFUL%2FbtraImty0Cf%2FQHAJukdPyB6wRXznFwOTUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;630&quot; height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전치행렬(Transpose)&lt;br /&gt;&amp;nbsp;- 대각요소를 기준으로 행과 열이 뒤집힘&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;431&quot; data-origin-height=&quot;218&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciucRU/btraLtyFqCa/fgkj0zUXFyMt4SPiC7Q1Q1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciucRU/btraLtyFqCa/fgkj0zUXFyMt4SPiC7Q1Q1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciucRU/btraLtyFqCa/fgkj0zUXFyMt4SPiC7Q1Q1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciucRU%2FbtraLtyFqCa%2Ffgkj0zUXFyMt4SPiC7Q1Q1%2Fimg.jpg&quot; data-origin-width=&quot;431&quot; data-origin-height=&quot;218&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직교행렬&lt;br /&gt;&amp;nbsp;- 1개의 행을 1개의 Vector봤을때 각 행을 내적하여 값이 0이 나오면 직각을 이루고 있으므로, 해당행렬을 직교행렬이라 부른다.&lt;br /&gt;&amp;nbsp;- 직교행렬과 직교행렬의 전치행렬을 곱하면 단위 행렬이 나온다.&lt;br /&gt;&amp;nbsp;- 그러므로 직교행렬의 전치행렬은 직교행렬의 역행렬이다.&lt;br /&gt;&amp;nbsp; ex) M * ? = I &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=&amp;gt; ? = M-&amp;sup1;(역행렬) or Mt(전치행렬) &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=&amp;gt; M-&amp;sup1;(역행렬) == Mt(전치행렬)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CdMT6/btraGcxJ81r/JiI3koy02CmCjwpSciRup1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CdMT6/btraGcxJ81r/JiI3koy02CmCjwpSciRup1/img.png&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;154&quot; style=&quot;width: 61.8544%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CdMT6/btraGcxJ81r/JiI3koy02CmCjwpSciRup1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCdMT6%2FbtraGcxJ81r%2FJiI3koy02CmCjwpSciRup1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;328&quot; height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bekeM5/btraJArw7p9/jrbMxld3hpJ4E9koMBHnpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bekeM5/btraJArw7p9/jrbMxld3hpJ4E9koMBHnpK/img.png&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;501&quot; style=&quot;width: 36.9828%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bekeM5/btraJArw7p9/jrbMxld3hpJ4E9koMBHnpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbekeM5%2FbtraJArw7p9%2FjrbMxld3hpJ4E9koMBHnpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;638&quot; height=&quot;501&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>게임개발/게임수학</category>
      <author>윈우</author>
      <guid isPermaLink="true">https://winwoo.tistory.com/105</guid>
      <comments>https://winwoo.tistory.com/105#entry105comment</comments>
      <pubDate>Thu, 29 Jul 2021 00:01:30 +0900</pubDate>
    </item>
    <item>
      <title>벡터</title>
      <link>https://winwoo.tistory.com/104</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;스칼라(고정된 크기) : 1, 2, 3, 3.14 등등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스칼라(Scalar)의 한계&lt;br /&gt;&amp;nbsp;- 점A에서 5만큼 떨어진 점B를 정의할때 '5'라는 스칼라 값 만으로는 B의 위치를 알 수 없다.(A로부터 5만큼 떨어진 모든 지점이 B가될 수 있음)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;777&quot; width=&quot;194&quot; height=&quot;221&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/emjqBD/btraBTkdycc/mCk6Rtngfsn7sYkK2jx590/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/emjqBD/btraBTkdycc/mCk6Rtngfsn7sYkK2jx590/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/emjqBD/btraBTkdycc/mCk6Rtngfsn7sYkK2jx590/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FemjqBD%2FbtraBTkdycc%2FmCk6Rtngfsn7sYkK2jx590%2Fimg.png&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;777&quot; width=&quot;194&quot; height=&quot;221&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벡터(Vector) : 크기와 방향을 갖는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;809&quot; width=&quot;190&quot; height=&quot;246&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUN7Co/btraImFffoT/BBslBqRj6RHHBia17gKPa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUN7Co/btraImFffoT/BBslBqRj6RHHBia17gKPa0/img.png&quot; data-alt=&quot;A에서 B에대한 방향으로 5만큼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUN7Co/btraImFffoT/BBslBqRj6RHHBia17gKPa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUN7Co%2FbtraImFffoT%2FBBslBqRj6RHHBia17gKPa0%2Fimg.png&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;809&quot; width=&quot;190&quot; height=&quot;246&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;A에서 B에대한 방향으로 5만큼&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벡터의 성분 구하기&lt;br /&gt;&amp;nbsp;- 목적지 좌표(B) - 시작점 좌표(A) = 벡터AB의 성분&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dI9czj/btraGHiP9EB/71HPoFCdlDVXenAq1hZSd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dI9czj/btraGHiP9EB/71HPoFCdlDVXenAq1hZSd0/img.png&quot; width=&quot;216&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;589&quot; style=&quot;width: 35.4399%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dI9czj/btraGHiP9EB/71HPoFCdlDVXenAq1hZSd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdI9czj%2FbtraGHiP9EB%2F71HPoFCdlDVXenAq1hZSd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;525&quot; height=&quot;589&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lIEjB/btraBcYIKS6/I4cWZF5Vf5Y1fDAPnX9fXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lIEjB/btraBcYIKS6/I4cWZF5Vf5Y1fDAPnX9fXk/img.png&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;545&quot; width=&quot;300&quot; style=&quot;width: 63.3974%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lIEjB/btraBcYIKS6/I4cWZF5Vf5Y1fDAPnX9fXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlIEjB%2FbtraBcYIKS6%2FI4cWZF5Vf5Y1fDAPnX9fXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;869&quot; height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벡터의 덧샘, 뺄샘 : 각 벡터의 성분을 계산&lt;br /&gt;&amp;nbsp;- V1 + V2 = (V1. x + V2.x, V1.y + V2.y)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYOJVN/btraImys6UN/ggzIPuUUHFHKbgUFxIxljk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYOJVN/btraImys6UN/ggzIPuUUHFHKbgUFxIxljk/img.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;229&quot; style=&quot;width: 35.3188%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYOJVN/btraImys6UN/ggzIPuUUHFHKbgUFxIxljk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYOJVN%2FbtraImys6UN%2FggzIPuUUHFHKbgUFxIxljk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9yb4t/btraHsTdYxU/uVEmIQIktYYn9ehodzLJkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9yb4t/btraHsTdYxU/uVEmIQIktYYn9ehodzLJkk/img.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;191&quot; style=&quot;width: 63.5184%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9yb4t/btraHsTdYxU/uVEmIQIktYYn9ehodzLJkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9yb4t%2FbtraHsTdYxU%2FuVEmIQIktYYn9ehodzLJkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;191&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벡터의 크기&lt;br /&gt;&amp;nbsp;- 피타고라스정리 이용&lt;br /&gt;&amp;nbsp;- 3차원공간의 좌표에 대한 크기를 구하는 경우 두번의 피타고라스 정리를 이용하면됨.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl7OrI/btraEeVH4Gh/Fc8GXTnr03Lhxmj8V0W3hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl7OrI/btraEeVH4Gh/Fc8GXTnr03Lhxmj8V0W3hK/img.png&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;777&quot; width=&quot;394&quot; height=&quot;495&quot; style=&quot;width: 42.4983%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl7OrI/btraEeVH4Gh/Fc8GXTnr03Lhxmj8V0W3hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl7OrI%2FbtraEeVH4Gh%2FFc8GXTnr03Lhxmj8V0W3hK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;619&quot; height=&quot;777&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzvQrE/btraBSTaOHy/vXQyRW2uQdd67AkjkCB4w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzvQrE/btraBSTaOHy/vXQyRW2uQdd67AkjkCB4w1/img.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;303&quot; style=&quot;width: 56.339%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzvQrE/btraBSTaOHy/vXQyRW2uQdd67AkjkCB4w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzvQrE%2FbtraBSTaOHy%2FvXQyRW2uQdd67AkjkCB4w1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단위 벡터&lt;br /&gt;&amp;nbsp;- 크기가 1인 벡터&lt;br /&gt;&amp;nbsp;- 벡터의 각 성분에 벡터의 크기를 나눠 주면됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdMFzK/btraBdpGeES/mHWVOcjkkg9hNBrpshEQh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdMFzK/btraBdpGeES/mHWVOcjkkg9hNBrpshEQh0/img.png&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;689&quot; width=&quot;233&quot; height=&quot;306&quot; style=&quot;width: 19.3451%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdMFzK/btraBdpGeES/mHWVOcjkkg9hNBrpshEQh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdMFzK%2FbtraBdpGeES%2FmHWVOcjkkg9hNBrpshEQh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;525&quot; height=&quot;689&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2961q/btraFEUaiLq/epNhSWTRTqgbyviLxcCHc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2961q/btraFEUaiLq/epNhSWTRTqgbyviLxcCHc1/img.png&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;273&quot; style=&quot;width: 31.1539%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2961q/btraFEUaiLq/epNhSWTRTqgbyviLxcCHc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2961q%2FbtraFEUaiLq%2FepNhSWTRTqgbyviLxcCHc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;335&quot; height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vf95S/btrax6YVigQ/o5pdnFLgeaaR7m2JjkwvEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vf95S/btrax6YVigQ/o5pdnFLgeaaR7m2JjkwvEK/img.png&quot; data-origin-width=&quot;1035&quot; data-origin-height=&quot;557&quot; style=&quot;width: 47.1754%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vf95S/btrax6YVigQ/o5pdnFLgeaaR7m2JjkwvEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVf95S%2Fbtrax6YVigQ%2Fo5pdnFLgeaaR7m2JjkwvEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1035&quot; height=&quot;557&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벡터의 내적&lt;br /&gt;&amp;nbsp;- 스칼라 값을 반환&lt;br /&gt;&amp;nbsp;-&amp;nbsp; |a| &amp;middot; |b| &amp;middot; cos&amp;theta;&amp;nbsp; = ax*bx + ay*by -&amp;gt; 내적을 이용하면 쉽게 각도를 구할수 있다&lt;br /&gt;&amp;nbsp;- cos&amp;theta; 연산은 느리기때문에 내적을 이용하면 쉽게 각도나 삼각형의 변의 길이를 구할 수 있다.&lt;br /&gt;&amp;nbsp;- 교환법칙이 성립한다. -&amp;gt; |a| x |b| == |b| x |a|&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ai6IT/btrazvjkOjx/EIKdzc66ZySMPzehnm0611/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ai6IT/btrazvjkOjx/EIKdzc66ZySMPzehnm0611/img.png&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;357&quot; width=&quot;430&quot; height=&quot;174&quot; style=&quot;width: 41.3481%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ai6IT/btrazvjkOjx/EIKdzc66ZySMPzehnm0611/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAi6IT%2FbtrazvjkOjx%2FEIKdzc66ZySMPzehnm0611%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;883&quot; height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BlgDB/btraCTEeDuv/5kAepPQeNKJXsMrwQGMD30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BlgDB/btraCTEeDuv/5kAepPQeNKJXsMrwQGMD30/img.png&quot; data-origin-width=&quot;531&quot; data-origin-height=&quot;201&quot; style=&quot;width: 44.1634%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BlgDB/btraCTEeDuv/5kAepPQeNKJXsMrwQGMD30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBlgDB%2FbtraCTEeDuv%2F5kAepPQeNKJXsMrwQGMD30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;531&quot; height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E1Gqb/btraBd4kOPc/uoEZ4eTlH19w2oT6k42pzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E1Gqb/btraBd4kOPc/uoEZ4eTlH19w2oT6k42pzk/img.png&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;613&quot; style=&quot;width: 12.1629%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E1Gqb/btraBd4kOPc/uoEZ4eTlH19w2oT6k42pzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE1Gqb%2FbtraBd4kOPc%2FuoEZ4eTlH19w2oT6k42pzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;613&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백터의 외적&lt;br /&gt;&amp;nbsp;- 외적은 내적과 달리 결과가 벡터로 반환된다.&lt;br /&gt;&amp;nbsp;- |a| x |b| &amp;middot; sin&amp;theta; = a벡터와 b벡터가 있는 평면의 수직인 벡터(법선 벡터)&lt;br /&gt;&amp;nbsp;- ★교환법칙이 성립하지 않는다. -&amp;gt; |a| x |b| != |b|&amp;nbsp;x |a| (크기는 같지만 방향이 달라짐)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;567&quot; width=&quot;188&quot; height=&quot;208&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBa5WI/btraBUwIKja/yrzSgvMSolLzmPpJqocDq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBa5WI/btraBUwIKja/yrzSgvMSolLzmPpJqocDq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBa5WI/btraBUwIKja/yrzSgvMSolLzmPpJqocDq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBa5WI%2FbtraBUwIKja%2FyrzSgvMSolLzmPpJqocDq1%2Fimg.png&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;567&quot; width=&quot;188&quot; height=&quot;208&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>게임개발/게임수학</category>
      <author>윈우</author>
      <guid isPermaLink="true">https://winwoo.tistory.com/104</guid>
      <comments>https://winwoo.tistory.com/104#entry104comment</comments>
      <pubDate>Tue, 27 Jul 2021 23:33:26 +0900</pubDate>
    </item>
  </channel>
</rss>