<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>seony-dev.log</title>
        <link>https://velog.io/</link>
        <description>게임 개발 공부 시작!</description>
        <lastBuildDate>Wed, 04 Dec 2024 08:41:03 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>seony-dev.log</title>
            <url>https://velog.velcdn.com/images/seony-dev/profile/fc949c96-b980-4518-96ad-7409523a1b84/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. seony-dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/seony-dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[OOP] is-a , has-a]]></title>
            <link>https://velog.io/@seony-dev/is-a-has-a</link>
            <guid>https://velog.io/@seony-dev/is-a-has-a</guid>
            <pubDate>Wed, 04 Dec 2024 08:41:03 GMT</pubDate>
            <description><![CDATA[<h4 id="🖥️-is-a란">🖥️ &#39;is-a&#39;란?</h4>
<p><strong>B(class) is a A(class)</strong> </p>
<blockquote>
<p>클래스 A가 서로 관련있는 클래스 B의 서브 클래스임을 의미함.
<strong>상속</strong> 관계에서 주로 사용.</p>
</blockquote>
<pre><code class="language-cpp">class A
{
public:
    void MoveA()
    {
        printf(&quot;Move A\n&quot;);
    }
};

class B : public A
{
public:
    void MoveB()
    {
        printf(&quot;Move B\n&quot;);
    }
};

int main()
{
    B b;
    b.MoveA();

    return 0;
}</code></pre>
<blockquote>
<p>console :
<strong>Move A</strong></p>
</blockquote>
<p>🚨 문제점 : 클래스 A와 클래스 B는 서로 밀접하게 결합되기 때문에 부모 클래스인 A에서 변경이 일어날 경우, 자식 클래스 B도 영향을 받을 가능성이 높다.<br>
&#39;고양이는 포유류이다.&#39;와 같은 1:1 관계에서는 안전한 클래스 계층구조를 이룰 수 있지만, 빈번한 상속은 피하는 것이 좋다.
혹은 <code>추상 클래스</code>로 다루는 것도 한 방법이다.</p>
<hr>
<h4 id="🖥️-has-a란">🖥️ &#39;has-a&#39;란?</h4>
<p><strong>A(class) has a B(class)</strong> </p>
<blockquote>
<p>클래스 A가 서로 관련 없는 클래스 B를 가지고(포함하고) 있음을 의미.</p>
</blockquote>
<pre><code class="language-cpp">class A
{
public:
    void Attack()
    {
        printf(&quot;A - Attack! \n&quot;);
    }
};

class B : public A
{
public:
    void UseWeapon()
    {
        Attack();
    }
};

int main()
{
    B b;
    b.UseWeapon();

    return 0;
}</code></pre>
<blockquote>
<p>console :
<strong>A - Attack!</strong> </p>
</blockquote>
<p>🚨 문제점 : <br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Unity] Animator - Interruption Source]]></title>
            <link>https://velog.io/@seony-dev/Unity-Animator-Interruption-Source</link>
            <guid>https://velog.io/@seony-dev/Unity-Animator-Interruption-Source</guid>
            <pubDate>Wed, 10 Jul 2024 08:35:47 GMT</pubDate>
            <description><![CDATA[<blockquote>
</blockquote>
<ul>
<li>Player &gt; Enemy 피격 시, 콤보 공격할 경우 생기는 이슈<ul>
<li>한 번 피격 당했을 때는 쿨타임 후, 공격하지만 콤보 공격으로 두 번 연속 피격 당할 경우 바로 공격하는 문제.</li>
</ul>
</li>
</ul>
<hr>
<blockquote>
<ul>
<li>이슈 해결 방법 </li>
</ul>
</blockquote>
<ul>
<li>Impact에서 Wait으로 Transition되는 구간에서 Interruption Source - Current State로 설정했을 경우, 해결.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/seony-dev/post/d475e1ad-a736-4c61-87e8-b4825e99625b/image.png" alt=""></p>
<p>출처 : <a href="https://jinhomang.tistory.com/116">https://jinhomang.tistory.com/116</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래밍] 17. 메모리 인터리빙(memory interleaving)]]></title>
            <link>https://velog.io/@seony-dev/CS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%9D%B8%ED%84%B0%EB%A6%AC%EB%B9%99memory-interleaving</link>
            <guid>https://velog.io/@seony-dev/CS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%9D%B8%ED%84%B0%EB%A6%AC%EB%B9%99memory-interleaving</guid>
            <pubDate>Wed, 12 Jun 2024 05:49:35 GMT</pubDate>
            <description><![CDATA[<h4 id="💻-메모리-인터리빙memory-interleaving이란">💻 메모리 인터리빙(memory interleaving)이란?</h4>
<blockquote>
<p>메모리 인터리빙(memory interleaving)은 주기억장치를 접근하는 속도를 빠르게 하는데 사용된다. 메모리 인터리빙 기법은 인접한 메모리 위치를 서로 다른 메모리 뱅크(bank)에 둠으로써 동시에 여러 곳을 접근할 수 있게 하는 것이다. 메모리 인터리빙은 블록 단위 전송이 가능하게 하므로 캐시나 기억장치와 주변장치 사이의 빠른 데이터 전송을 위한 DMA(Direct Memory Access)에서 많이 사용한다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[OOP/SOLID] 02. 개방 폐쇄 원칙(OCP)]]></title>
            <link>https://velog.io/@seony-dev/OOPSOLID-02.-%EB%A6%AC%EC%8A%A4%EC%BD%94%ED%94%84-%EC%B9%98%ED%99%98-%EC%9B%90%EC%B9%99LSP</link>
            <guid>https://velog.io/@seony-dev/OOPSOLID-02.-%EB%A6%AC%EC%8A%A4%EC%BD%94%ED%94%84-%EC%B9%98%ED%99%98-%EC%9B%90%EC%B9%99LSP</guid>
            <pubDate>Sun, 09 Jun 2024 15:18:27 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/seony-dev/post/09d10c84-b093-4baa-a7e8-4ef611fd706a/image.png" alt=""></p>
<hr>
<h4 id="🎭-객체지향-5원칙-solid">🎭 객체지향 5원칙 (SOLID)</h4>
<ol>
<li>단일 책임 원칙(<strong>S</strong>ingle Responsibility Principle)</li>
<li>개방-폐쇄 원칙(<strong>O</strong>pen-Closed Principle)</li>
<li>리스코프 치환 원칙(<strong>L</strong>iskov Substitution Principle)</li>
<li>인터페이스 분리 원칙(<strong>I</strong>nterface Segregation Principle)</li>
<li>의존성 역전 원칙(<strong>D</strong>ependency Inversion Principle)</li>
</ol>
<hr>
<h4 id="🎭-개방-폐쇄-원칙ocp란">🎭 개방 폐쇄 원칙(OCP)란?</h4>
<blockquote>
<p>클래스, 모듈, 함수 등 소프트웨어 엔티티는 기존의 코드를 변경하지 않고도 새로운 기능이나 동작을 추가할 수 있어야하며, 기존의 코드는 안전하게 동작하고 있는 상태를 유지하면서 새로운 기능이나 변경이 필요한 경우에는 해당 부분만을 수정하고 나머지 코드에는 영향을 주지 않아야 한다.
즉, <strong>확장은 개방</strong>되고, <strong>변경에는 폐쇄</strong>되어야 한다.</p>
</blockquote>
<p><strong>객체 지향의 특징인 <code>추상화</code>와 <code>다형성</code>을 사용하면 해당 원칙을 지킬 수 있으며, 이를 주로 <code>인터페이스(Interface)</code>로 다룬다.</strong></p>
<hr>
<h4 id="🎭-c-예시">🎭 C# 예시</h4>
<pre><code class="language-cs">class Character
{
    protected string name;
    public string Name { get =&gt; name; set =&gt; name = value; } 

    public Character(string name, float hp)
    {
        //this.name = name;
        //this.hp = hp;

        Name = name;
        Hp = hp;
    }


    public override string ToString() =&gt; $&quot;{name}, {hp}&quot;;

    public virtual void Move() //[추상성 - 가상화] 부모가 가상화 되어야 오버라이딩 가능.  키워드 : virtual
    {
        Debug.Log(&quot;Charater : 우측 방향 &gt; 10만큼 이동&quot;);
    }
}

class Player : Character
{
    public Player()
        : base(&quot;None&quot;, -1) //base() : 부모 클래스
    {
        Debug.Log(ToString()); //부모한테 상속받음

    }

    public Player(string name, float hp)
        : base(name, hp) //base() : 부모 클래스
    {
        Debug.Log(ToString());
    }

    public override void Move() //자식의 필요에 의해서 재정의. 키워드 : override
    {
        base.Move(); //부모의 Move() 사용

        Debug.Log(&quot;Player : 전진 &gt; 30만큼 이동&quot;);
    }
}

class Monster : Character
{
    public Monster(string name, float hp)
        :base(name, hp)
    {
        Debug.Log($&quot;Monster  {ToString()}&quot;);
    }

    public override void Move() //Move() 재정의
    {
        Debug.Log(&quot;Monster : 후진 &gt; 50만큼 이동&quot;);

    }
}</code></pre>
<hr>
<p><span style="color:darkgrey;">출처 : </span></p>
<ul>
<li><a href="https://velog.io/@zayson/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%98-5%EA%B0%80%EC%A7%80-%EC%9B%90%EC%B9%99-SOLID-%EC%9B%90%EC%B9%99">https://velog.io/@zayson/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%98-5%EA%B0%80%EC%A7%80-%EC%9B%90%EC%B9%99-SOLID-%EC%9B%90%EC%B9%99</a></li>
<li><a href="https://aspdotnet.tistory.com/3156">https://aspdotnet.tistory.com/3156</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[OOP/SOLID] 01. 단일 책임 원칙(SRP)]]></title>
            <link>https://velog.io/@seony-dev/SOLID-01.-%EB%8B%A8%EC%9D%BC-%EC%B1%85%EC%9E%84-%EC%9B%90%EC%B9%99SRP</link>
            <guid>https://velog.io/@seony-dev/SOLID-01.-%EB%8B%A8%EC%9D%BC-%EC%B1%85%EC%9E%84-%EC%9B%90%EC%B9%99SRP</guid>
            <pubDate>Fri, 07 Jun 2024 08:12:15 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/seony-dev/post/6452f603-3dbe-4aa3-8dd7-99b480fee4bf/image.png" alt=""></p>
<hr>
<h4 id="🎭-객체지향-5원칙-solid">🎭 객체지향 5원칙 (SOLID)</h4>
<ol>
<li>단일 책임 원칙(<strong>S</strong>ingle Responsibility Principle)</li>
<li>개방-폐쇄 원칙(<strong>O</strong>pen-Closed Principle)</li>
<li>리스코프 치환 원칙(<strong>L</strong>iskov Substitution Principle)</li>
<li>인터페이스 분리 원칙(<strong>I</strong>nterface Segregation Principle)</li>
<li>의존성 역전 원칙(<strong>D</strong>ependency Inversion Principle)</li>
</ol>
<hr>
<h4 id="🎭-단일-책임-원칙srp란">🎭 단일 책임 원칙(SRP)란?</h4>
<blockquote>
<p>간결하게 말하자면, &#39;하나의 객체는 반드시 하나의 동작만의 책임을 갖는다&#39;는 원칙이다.</p>
</blockquote>
<p>모듈화가 강할수록 다른 객체와의 의존 및 연관성이 줄어들며 모듈화가 약할수록 다른 객체와의 의존 및 연관성이 늘어난다. 
약한 모듈화는 정보 은닉화가 되지 않기 때문에 모듈의 메소드에 무분별하게 접근할 수 있게 되므로 모듈의 의존성을 지양해야한다.</p>
<p>모듈화가 약할 때 코드가 무분별하게 길어지거나 복잡해지면, 코드 수정할 때마다 전체적으로 대공사를 해야하는 번거로움이 생긴다. 
이를 방지하기 위해 &#39;단일 책임 원칙&#39;, 즉 <strong>객체 하나 당 책임도 하나만</strong> 줌으로써 책임을 줄여줘서 최대한 간결하게 코드 작성을 할 수 있게 해준다.</p>
<hr>
<h4 id="🎭-c-예시">🎭 C# 예시</h4>
<pre><code class="language-cs">class Character
{
    protected string name;
    public string Name { get =&gt; name; set =&gt; name = value; } 

    public Character(string name, float hp)
    {
        //this.name = name;
        //this.hp = hp;

        Name = name;
        Hp = hp;
    }


    public override string ToString() =&gt; $&quot;{name}, {hp}&quot;;

    public virtual void Move() //[추상성 - 가상화] 부모가 가상화 되어야 오버라이딩 가능.  키워드 : virtual
    {
        Debug.Log(&quot;Charater : 우측 방향 &gt; 10만큼 이동&quot;);
    }
}

class Player : Character
{
    public Player()
        : base(&quot;None&quot;, -1) //base() : 부모 클래스
    {
        Debug.Log(ToString()); //부모한테 상속받음

    }

    public Player(string name, float hp)
        : base(name, hp) //base() : 부모 클래스
    {
        Debug.Log(ToString());
    }

    public override void Move() //자식의 필요에 의해서 재정의. 키워드 : override
    {
        base.Move(); //부모의 Move() 사용

        Debug.Log(&quot;Player : 전진 &gt; 30만큼 이동&quot;);
    }
}

class Monster : Character
{
    public Monster(string name, float hp)
        :base(name, hp)
    {
        Debug.Log($&quot;Monster  {ToString()}&quot;);
    }

    public override void Move() //Move() 재정의
    {
        Debug.Log(&quot;Monster : 후진 &gt; 50만큼 이동&quot;);

    }
}</code></pre>
<p>→ <code>Character</code> 클래스를 상속 받은 <code>Player</code>, <code>Monster</code> 클래스는 각자의 <code>Move()</code> 함수에 알맞은 동작을 구현하여 한 객체가 하나의 책임을 갖게 된다.</p>
<p>예를 들어 <code>Monster</code>의 이동에 관련하여 코드를 수정해야한다면, 부모 클래스인 <code>Character</code>의 코드는 변경하지 않고 해당 객체의 메소드만 수정하면 되므로 의존성이 현저히 떨어지기 때문에 올바른 모듈화가 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C/C++] 01. 가상 테이블(Virtual Table; vtable)]]></title>
            <link>https://velog.io/@seony-dev/%EA%B0%80%EC%83%81-%ED%85%8C%EC%9D%B4%EB%B8%94Virtual-Table-vtable</link>
            <guid>https://velog.io/@seony-dev/%EA%B0%80%EC%83%81-%ED%85%8C%EC%9D%B4%EB%B8%94Virtual-Table-vtable</guid>
            <pubDate>Tue, 04 Jun 2024 05:34:08 GMT</pubDate>
            <description><![CDATA[<h4 id="가상-테이블이란">가상 테이블이란?</h4>
<blockquote>
<p>컴파일 시 가상함수가 정의된 클래스가 있다면 가상함수테이블(Virtual function table)이 만들어져서 바이너리 &#39;rdata&#39;영역에 기록되며 해당 클래스로 만들어진 객체에서 함수를 호출할 때 해당 클래스의 가상함수 테이블을 참조해서 함수를 호출된다. 편의를 위해 가상함수테이블은 &quot;vtable&quot; 이라고 명칭한다.</p>
</blockquote>
<hr>
<h4 id="예제">예제</h4>
<pre><code class="language-cpp">///// vtable(Virtual Table)
//_vfptr : virtual function pointer (배열로 구성. Key / Value)
//정적할당일 때는 부모(Base)에 할당. 동적할당일 때는 통해서 와야하기 때문에 자기자신한테 가상함수가 있는지 먼저 확인하기 위해 가상테이블이 따로 할당됨.
//C에서는 대부분 동적할당일 때만 가상화를 한다.

class Character 
{
public:
    Character(int id, string name)
    {
        this-&gt;id = id;
        this-&gt;name = name;

        printf(&quot;캐릭터 생성 %p - %s\n&quot;, this, this-&gt;name.c_str());
    }

    virtual ~Character() //가상 소멸자
    {
        printf(&quot;캐릭터 소멸 %p - %s\n&quot;, this, this-&gt;name.c_str());
    }

    virtual void Move() //가상화
    {
        printf(&quot;캐릭터 이동 %p - %s\n&quot;, this, this-&gt;name.c_str());
    }

    //순수 가상 함수(C에서는 추상클래스, 즉 추상함수의 abstract 키워드가 존재하지 않음.)
    virtual void Attack() = 0;

protected:
    int id;
    string name;
};

class Player : public Character
{
public:
    Player(int id, string name)
        : Character(id, name)
    {
        printf(&quot;플레이어 생성 %p - %s\n&quot;, this, this-&gt;name.c_str());
    }

    //C에서는 가상화를 할 때, 소멸자도 가상화를 해줘야함.
    ~Player() //override -&gt; 안 붙여도 됨.
    {
        printf(&quot;플레이어 소멸 %p - %s\n&quot;, this, this-&gt;name.c_str());
    }

    //재정의 X. 부모의 별도 영역에 들어간 것.
    void Move() override //C는 override 안 써도 됨. 그러나 써주는게 좋음.
    {
        Character::Move(); //재정의 X

        printf(&quot;플레이어 이동 %p - %s\n&quot;, this, this-&gt;name.c_str());
    }

    void Attack() override
    {
        printf(&quot;플레이어 공격 %p - %s\n&quot;, this, this-&gt;name.c_str());
    }
};


int main()
{
    //Character character(1, &quot;Character&quot;);

    //생성과 소멸은 역순으로(스택 때문에)
    Player player(2, &quot;Player&quot;);
    //player.Move();

    //Character player2 = player;
    //player2.Move(); //직접 접근 : 자기가 소유하고 있는 Move()를 콜 -&gt; Character의 Move()

    Character* player3 = new Player(3, &quot;Player3&quot;); //주소로 접근
    player3-&gt;Move(); //간접 접근 : Player의 Move()
    player3-&gt;Attack();
    delete player3;

    return 0;
}</code></pre>
<hr>
<p><span style="color:darkgray;">출처 : </span></p>
<ul>
<li><a href="https://pabloariasal.github.io/2017/06/10/understanding-virtual-tables/">https://pabloariasal.github.io/2017/06/10/understanding-virtual-tables/</a></li>
<li><a href="https://cosyp.tistory.com/228">https://cosyp.tistory.com/228</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[게임 수학] 10. 미끄러짐 벡터(Sliding Vector)]]></title>
            <link>https://velog.io/@seony-dev/%EB%AF%B8%EB%81%84%EB%9F%AC%EC%A7%90-%EB%B2%A1%ED%84%B0</link>
            <guid>https://velog.io/@seony-dev/%EB%AF%B8%EB%81%84%EB%9F%AC%EC%A7%90-%EB%B2%A1%ED%84%B0</guid>
            <pubDate>Sun, 02 Jun 2024 13:35:57 GMT</pubDate>
            <description><![CDATA[<h4 id="🖥️-미끄러짐-벡터sliding-vector란">🖥️ 미끄러짐 벡터(Sliding Vector)란?</h4>
<blockquote>
<p>충돌시 입사벡터가 입사면을 따라 미끄러지게 하기위해 수평성분만을 남긴 벡터이다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/seony-dev/post/b2b7a20c-a12f-4288-867f-4a74d48d493b/image.png" alt="">
위 그림에서는 벡터P 가 법선벡터 n을 가진 입사면에 충돌했을 때, 미끄러짐 벡터 S를 확인할 수 있다.
미끄러짐 벡터S는 여러 방법으로 구할 수 있지만, 반사 벡터를 이용한 방법과 일반적인 방법 총 두 방법을 확인해보자.</p>
<hr>
<h4 id="반사-벡터를-이용한-방법">반사 벡터를 이용한 방법</h4>
<p><img src="https://velog.velcdn.com/images/seony-dev/post/efaaba1e-01fb-400e-ba3e-83c5163c93bb/image.png" alt="">
반사 벡터에서 입사벡터 P에 n(-P·n) 을 한 번 더해주면, 입사면에 투영된 접선벡터(Tangent Vector)를 구할 수 있다.
위 그림을 보면, 입사벡터의 역벡터 -P가 n에 투영된 <code>n(-P·n)</code>을 이용하여 슬라이딩벡터 S를 구할 수 있다.</p>
<p>그러므로 미끄러짐 벡터S는 <code>S = P + n(-P·n)</code> 으로 구할 수 있다.</p>
<h4 id="일반적인-방법">일반적인 방법</h4>
<p><img src="https://velog.velcdn.com/images/seony-dev/post/192faf60-5681-489e-95b4-ab45f10ca34d/image.png" alt="">
일반적인 방법은 <strong>입사벡터P 를 n에 바로 투영</strong>시키는 것이다.
입사벡터P 와 법선벡터n 의 끼인각이 <code>0≤ θ ≤ π/2</code> 일 때, P·n 의 값은 <code>음수</code>가 되므로, n벡터의 역벡터 방향으로 투영벡터가 생성된다.
이렇게 얻어진 투영벡터 n(P·n)을 입사벡터 P에서 빼주면, 미끄러짐 벡터S 를 얻을 수 있다.
그러므로 슬라이딩벡터 S 는 <code>S = P - n(P·n)</code>으로 구할 수 있다.</p>
<hr>
<p><span style="color:darkgray;">출처 : </span></p>
<ul>
<li><a href="https://toymaker.tistory.com/entry/%EB%AF%B8%EB%81%84%EB%9F%AC%EC%A7%90-%EB%B2%A1%ED%84%B0-Sliding-Vector">https://toymaker.tistory.com/entry/미끄러짐-벡터-Sliding-Vector</a> </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[게임 수학] 09. 굴절 벡터]]></title>
            <link>https://velog.io/@seony-dev/%EA%B5%B4%EC%A0%88-%EB%B2%A1%ED%84%B0</link>
            <guid>https://velog.io/@seony-dev/%EA%B5%B4%EC%A0%88-%EB%B2%A1%ED%84%B0</guid>
            <pubDate>Sun, 02 Jun 2024 13:35:39 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/seony-dev/post/f83008c4-f1e5-458d-9af1-f396378383f3/image.png" alt=""></p>
<h4 id="굴절-벡터란">굴절 벡터란?</h4>
<blockquote>
</blockquote>
<p>주어진 입사 벡터 A, 표면 법선 B 및 굴절률 비율(IOR)에 따라, 굴절 벡터 R을 출력한다.</p>
<ul>
<li>스넬의 법칙 : 굴절의 법칙이라고도 하며, 근처의 두 매체를 통해 빛의 통과를 기술하는 법칙이다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[게임 수학] 08. 반사 벡터(Reflect Vector)]]></title>
            <link>https://velog.io/@seony-dev/%EB%B0%98%EC%82%AC%EB%B2%A1%ED%84%B0</link>
            <guid>https://velog.io/@seony-dev/%EB%B0%98%EC%82%AC%EB%B2%A1%ED%84%B0</guid>
            <pubDate>Fri, 31 May 2024 10:16:55 GMT</pubDate>
            <description><![CDATA[<h4 id="🖥️-반사-벡터reflect-vector란">🖥️ 반사 벡터(Reflect Vector)란?</h4>
<blockquote>
<p>입사벡터 P와 법선벡터 n이 주어졌을 때, 반사벡터 R은 벡터 P와 크기가 같고, 입사각과 반사각이 같음을 확인할 수 있다.
여기서 정반사는 입사벡터와 반사벡터의 크기가 같고, 입사각과 반사각의 크기가 같은것을 말한다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/seony-dev/post/4b5d2cfa-e62b-4a64-aca1-aec55f4e9517/image.png" alt="Unity Vector3.Reflect"></p>
<blockquote>
<p>Unity : 법선에 의해 정의된 평면에서 벡터를 반사한다. 벡터 &#39;inNormal&#39;는 평면을 정의하며(평면의 법선은 표면에 수직인 벡터이다.), 벡터 &#39;inDirection&#39;는 평면으로 들어오는 방향 화살표로 처리된다. 
반환된 값의 크기는 동일한 inDirection이지만, 방향이 반영된 벡터이다.</p>
</blockquote>
<hr>
<h4 id="입사벡터와-법선벡터로-반사벡터를-구하는-방법">입사벡터와 법선벡터로 반사벡터를 구하는 방법</h4>
<p><img src="https://velog.velcdn.com/images/seony-dev/post/12817078-64d7-42ef-9acc-fb47d8717344/image.png" alt="">
우선, 입사 벡터 P의 역벡터 -P를 n의 연장선 상에 투영시켜, 투영벡터 <code>n(-P·n)</code>를 구한다. 
입사 벡터 P의 시작 위치를 원점에 위치시키고, 여기에 n(-P·n)를 더하면, 입사면에 투영된 벡터의 위치를 구할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/seony-dev/post/964e9f78-cb6c-4b71-8d26-9ddcc17e68ed/image.png" alt="">
위 그림을 보면, 입사벡터 P에 n(-P·n)를 1번 더하면, 입사면에 투영된 위치를 구할  수 있고, 2번 더하면 반사벡터 R을 구할 수 있다.
결국, 반사벡터 R은 <code>R = P +  2n(-P·n)</code>로 구할 수 있다.</p>
<hr>
<h4 id="🖥️-유니티-활용">🖥️ 유니티 활용</h4>
<pre><code class="language-cs">using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    public Transform originalObject;
    public Transform reflectedObject;
    void Update() {
        reflectedObject.position = Vector3.Reflect(originalObject.position, Vector3.right);
    }
}</code></pre>
<hr>
<p><span style="color : darkgray;">출처 : </span></p>
<ul>
<li><a href="https://toymaker.tistory.com/entry/%EB%B0%98%EC%82%AC-%EB%B2%A1%ED%84%B0-Reflection-Vector">https://toymaker.tistory.com/entry/반사-벡터-Reflection-Vector</a> </li>
<li><a href="https://docs.unity3d.com/kr/530/ScriptReference/Vector3.Reflect.html">https://docs.unity3d.com/kr/530/ScriptReference/Vector3.Reflect.html</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래밍] 12. 해시 테이블(HashTable)]]></title>
            <link>https://velog.io/@seony-dev/%ED%95%B4%EC%8B%B1-%ED%85%8C%EC%9D%B4%EB%B8%94</link>
            <guid>https://velog.io/@seony-dev/%ED%95%B4%EC%8B%B1-%ED%85%8C%EC%9D%B4%EB%B8%94</guid>
            <pubDate>Mon, 27 May 2024 05:34:47 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/seony-dev/post/6aea536d-7d8e-4b4c-a539-e89387771499/image.png" alt=""></p>
<hr>
<h4 id="🖥️-해시-테이블hashtable이란">🖥️ 해시 테이블(HashTable)이란?</h4>
<blockquote>
<p>해시테이블은 Key-Value 형태로 저장되는 자료구조로, 평균 O(1)의 시간복잡도를 가짐. 흔히, HashMap이라고 불리기도 함.
key 값을 Hash Function을 이용해, Hash Table에 저장할 위치를 정함.
대표적인 Hash Function에는 Division Method(mod 연산)가 있음.</p>
</blockquote>
<hr>
<h4 id="🖥️-datdirect-access-table">🖥️ DAT(Direct Access Table)</h4>
<blockquote>
<p>키 값을 인덱스로 직접 사용하여 배치하는 자료구조이며, 빠른검색과 삽입•삭제가 가능함.
최대값에 1을 더한 크기의 배열을 만든 다음(0 기반 인덱스로 가정) 값을 인덱스로 사용함.</p>
</blockquote>
<hr>
<h4 id="🖥️-충돌은-왜-발생하는가">🖥️ 충돌은 왜 발생하는가?</h4>
<blockquote>
<p>해시 충돌은 어떤 entry를 넣으려고 할때, Hash Function으로 찾은 위치에 이미 다른 entry가 존재하는 경우 발생함.
즉, 다른 키 값일때, Hash Function을 통해 같은 값을 가지게 되는 경우 해시 출돌이 발생함.</p>
</blockquote>
<hr>
<h4 id="🖥️-충돌-해결방법---체이닝chaining">🖥️ 충돌 해결방법 - 체이닝(Chaining)</h4>
<ul>
<li>같은 주소로 해싱 될 때, 연결 리스트(Linked List)로 연결하는 방식.</li>
<li>각 인덱스는 자체 목록이 되므로 동일한 해시 인덱스를 가진 값이 동일한 목록에 배치됨.</li>
<li>추가 공간 활용</li>
</ul>
<hr>
<h4 id="🖥️-충돌-해결방법---개방주소법">🖥️ 충돌 해결방법 - 개방주소법</h4>
<hr>
<p><span style="color:darkgrey;">출처 : </span></p>
<ul>
<li><a href="https://velog.io/@nayu1105/%ED%95%B4%EC%8B%9C%ED%85%8C%EC%9D%B4%EB%B8%94Hash-Table%EC%99%80-%ED%95%B4%EC%8B%9C%EC%B6%A9%EB%8F%8CHash-Collision">https://velog.io/@nayu1105/%ED%95%B4%EC%8B%9C%ED%85%8C%EC%9D%B4%EB%B8%94Hash-Table%EC%99%80-%ED%95%B4%EC%8B%9C%EC%B6%A9%EB%8F%8CHash-Collision</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Unity] 06. GUID(Globally Unique IDentifier)]]></title>
            <link>https://velog.io/@seony-dev/Unity-GUIDGlobally-Unique-IDentifier</link>
            <guid>https://velog.io/@seony-dev/Unity-GUIDGlobally-Unique-IDentifier</guid>
            <pubDate>Thu, 23 May 2024 20:42:15 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/seony-dev/post/7e0d6d0e-8967-495f-b3af-9aed425fd278/image.png" alt=""></p>
<hr>
<h4 id="🖥️guidglobally-unique-identifier란">🖥️GUID(Globally Unique IDentifier)란?</h4>
<blockquote>
<p>컴퓨터 시스템에서 식별자로 사용되는 고유 참조 번호. GUID의 값은 32자의 16진수 문자열로 표현되며 모든 시간과 공간에서 고유한 번호를 가진다.
이는 유니티에서 asset을 구분하기 위해 쓰이며, &#39;Global UID&#39; 이므로 한 프로젝트 내에서만 아니라, 서로 다른 프로젝트 간에서도 유일한 번호를 가진다.</p>
</blockquote>
<hr>
<h4 id="🖥️-guid의-사용">🖥️ GUID의 사용</h4>
<p>Unity에서 새 에셋을 생성할 때마다 시스템이 자동으로 에셋에 GUID를 할당한다. 이 GUID는 자산과 연결된 메타 파일에 저장되며, Unity는 이 GUID를 사용하여 프로젝트 전체에서 자산을 추적한다.</p>
<hr>
<h4 id="🖥️-guid의-중요성">🖥️ GUID의 중요성</h4>
<p>GUID는 프로젝트 내에서 자산이 사용되거나 이동된 위치에 관계없이 자산을 식별하고 추적할 수 있도록 유지하는 Unity에서 중요한 역할을 한다. 
Unity에서 GUID가 작동하는 방식을 이해하면 깨진 참조 및 병합 충돌과 같은 일반적인 위험을 방지하여 게임 개발 프로세스를 보다 원활하고 효율적으로 만들 수 있다.</p>
<hr>
<p><span style="color:darkgrey;">출처: </span> </p>
<ul>
<li><a href="https://coding-shop.tistory.com/145">https://coding-shop.tistory.com/145</a> [끄적끄적 코딩 공방:티스토리]</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[OS] 05. 임계 구역(Critical Section)]]></title>
            <link>https://velog.io/@seony-dev/OS-07.-%EC%9E%84%EA%B3%84-%EA%B5%AC%EC%97%ADCritical-Section</link>
            <guid>https://velog.io/@seony-dev/OS-07.-%EC%9E%84%EA%B3%84-%EA%B5%AC%EC%97%ADCritical-Section</guid>
            <pubDate>Sat, 18 May 2024 15:17:20 GMT</pubDate>
            <description><![CDATA[<h4 id="🖥️-임계-구역critical-section-이란">🖥️ 임계 구역(Critical Section) 이란?</h4>
<blockquote>
<p>임계 구역(critical section)은 공유변수 영역이라고도 불리며, 병렬컴퓨팅에서 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원(자료 구조 또는 장치)을 접근하는 코드의 일부를 말한다. 
임계 구역은 지정된 시간이 지난 후 종료되기 때문에 어떤 스레드(태스크 또는 프로세스)가 임계 구역에 들어가고자 한다면 지정된 시간만큼 대기해야 한다. 스레드가 공유자원의 배타적인 사용을 보장받기 위해서 임계 구역에 들어가거나 나올때는 세마포어 같은 동기화 매커니즘이 사용된다.</p>
</blockquote>
<hr>
<p><span style="color:darkgrey;">출처 : </span> <a href="https://ko.wikipedia.org/wiki/%EC%9E%84%EA%B3%84_%EA%B5%AC%EC%97%AD">https://ko.wikipedia.org/wiki/%EC%9E%84%EA%B3%84_%EA%B5%AC%EC%97%AD</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[OS] 04. 문맥 교환 오버헤드(Context Switch Overhead)]]></title>
            <link>https://velog.io/@seony-dev/OS-04.-Context-Switch-Overhead</link>
            <guid>https://velog.io/@seony-dev/OS-04.-Context-Switch-Overhead</guid>
            <pubDate>Thu, 16 May 2024 10:18:38 GMT</pubDate>
            <description><![CDATA[<h4 id="💻-context-switch-overhead란">💻 Context Switch Overhead란?</h4>
<blockquote>
<p>문맥을 교환(Context Switch)하는 동안에는 유용한 작업을 수행할 수 없기 때문에, 문맥 교환 시간은 일종의 오버헤드라고 할 수 있다. CISC와 RISC는 각각 장단점이 있는데, 문맥교환 측면에 보면 RISC의 경우 레지스터의 용량이 CISC보다 상대적으로 크기 때문에 좀 더 큰 오버헤드가 발생한다.</p>
</blockquote>
<blockquote>
<p>CPU가 각 프로세스의 상태를 저장하고 복원해야 하기 때문에 오버헤드 비용도 발생하는데, 특히 프로세스 수가 많거나 컨텍스트 전환이 빈번한 환경에서 시스템 성능에 영향을 미칠 수 있다. 결과적으로 운영 체제 설계자는 최적의 시스템 성능을 달성하기 위해 멀티태스킹의 이점과 운영 체제의 컨텍스트 전환 오버헤드 간의 균형을 신중하게 조정해야 한다.</p>
</blockquote>
<h4 id="💻-운영체제의-문맥교환이-시스템-성능에-미치는-영향">💻 운영체제의 문맥교환이 시스템 성능에 미치는 영향</h4>
<p>시스템에서 실행 중인 프로세스 수가 많은 경우, 컨텍스트 전환을 자주 수행하면 CPU가 프로세스를 실행하는 것보다 프로세스 간 전환에 더 많은 시간을 소비하게 되어 전체 시스템 성능이 저하될 수 있다.</p>
<hr>
<p><span style="color:darkgrey;">출처 :<span></p>
<ul>
<li><a href="https://ko.wikipedia.org/wiki/%EB%AC%B8%EB%A7%A5_%EA%B5%90%ED%99%98">https://ko.wikipedia.org/wiki/%EB%AC%B8%EB%A7%A5_%EA%B5%90%ED%99%98</a></li>
<li><a href="https://datatrained.com/post/context-switching-in-os/">https://datatrained.com/post/context-switching-in-os/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[OS] 03. 상호배제(Mutex)]]></title>
            <link>https://velog.io/@seony-dev/OS-03.-%EC%83%81%ED%98%B8%EB%B0%B0%EC%A0%9CMutex</link>
            <guid>https://velog.io/@seony-dev/OS-03.-%EC%83%81%ED%98%B8%EB%B0%B0%EC%A0%9CMutex</guid>
            <pubDate>Wed, 15 May 2024 16:22:53 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/seony-dev/post/600052d0-8ebb-4284-bfaf-329cedce4cf0/image.png" alt=""></p>
<hr>
<h4 id="🖥️-상호배제mutex란">🖥️ 상호배제(Mutex)란?</h4>
<blockquote>
<p>상호 배제(相互排除, mutual exclusion, Mutex, 뮤텍스)는 동시 프로그래밍에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용되는 알고리즘으로, *임계 구역(critical section)으로 불리는 코드 영역에 의해 구현된다.
공유 불가능한 자원의 예로는 동시에 실행되고 있는 프로그램간의 통신에 사용되는 비트 단위의 깃발, 계수기, 큐 등이다. 문제는 스레드가 언제라도 정지되거나 시작될 수 있다는 것이다.</p>
</blockquote>
<h5 id="-임계-구역--서로-다른-두-프로세스-혹은-스레드-등의-처리-단위가-같이-접근해서는-안-되는-공유-영역-프로그래밍시-임계구역을-최소화하여야-성능-향상에-도움이-된다"><em>* 임계 구역 : 서로 다른 두 프로세스, 혹은 스레드 등의 처리 단위가 같이 접근해서는 안 되는 공유 영역. 프로그래밍시, 임계구역을 최소화하여야 성능 향상에 도움이 된다.</em></h5>
<p>★ <strong><code>상호배제</code></strong>는 <strong>교착상태(deadlock)의 4가지 필요조건</strong> 중 하나이다.</p>
<hr>
<p><span style="color:darkgrey">출처 : </span> <a href="https://ko.wikipedia.org/wiki/%EC%83%81%ED%98%B8_%EB%B0%B0%EC%A0%9C">https://ko.wikipedia.org/wiki/%EC%83%81%ED%98%B8_%EB%B0%B0%EC%A0%9C</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[OS] 02. 인터럽트(Interrupt) 종류와 발생 조건]]></title>
            <link>https://velog.io/@seony-dev/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8-%EC%A2%85%EB%A5%98%EC%99%80-%EB%B0%9C%EC%83%9D-%EC%A1%B0%EA%B1%B4</link>
            <guid>https://velog.io/@seony-dev/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8-%EC%A2%85%EB%A5%98%EC%99%80-%EB%B0%9C%EC%83%9D-%EC%A1%B0%EA%B1%B4</guid>
            <pubDate>Tue, 14 May 2024 14:30:29 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/seony-dev/post/20e54aee-3c8b-4234-937c-2c446593a62b/image.png" alt="프로그램 실행 중 &#39;E&#39;키를 눌러서 중단시켜보자^^ㅋㅋ"></p>
<h4 id="🖥️-인터럽트interrupt란">🖥️ 인터럽트(Interrupt)란?</h4>
<p>CPU가 프로그램을 실행하고 있을 때 예외상황이 발생해 처리가 필요할 경우 현재 실행중인 작업을 중단하고 발생된 상황을 처리한 뒤 다시 실행중인 작업으로 복귀하는 것을 말한다. 
입출력 연산이 CPU 연산 수행속도보다 현저히 느리기 때문에 사용한다. I/O 연산이 끝난 이후 I/O Device는 인터럽트를 통해 CPU에게 알리고 CPU는 I/O 연산 결과를 이용해 작업을 완료한다. </p>
<h4 id="🖥️-인터럽트의-종류">🖥️ 인터럽트의 종류</h4>
<ul>
<li><p>외부 인터럽트: 입출력 장치, 타이밍 장치, 전원 등의 외부적인 요인에 의해서 발생하는 인터럽트.</p>
<ul>
<li>전원 이상 인터럽트: 정전이나 전원이 이상이 있는 경우</li>
<li>기계 고장 인터럽트: CPU등의 기능적인 동작 오류가 발생한 경우</li>
<li>입출력 인터럽트(I/O Interrupt): 입출력의 종료 등의 이유로 CPU의 수행을 요청하는 인터럽트.</li>
</ul>
</li>
<li><p>내부 인터럽트: 잘못된 명령이나 데이터를 사용할 때 발생하는 인터럽트</p>
<ul>
<li>0으로 나누는 경우</li>
<li>오버플로우 또는 언더플로우가 발생한 경우</li>
<li>프로그램 상의 오류</li>
<li>프로그램에서 함수 등 명령어를 잘못 사용한 경우</li>
<li>예외를 처리하던 중 또 다른 예외가 발생할 경우, Double Fault이라고 부른다. Double Fault가 발생하여 이를 처리하는 중에 또 다른 예외가 발생할 경우, Triple Fault라고 부르며 이 경우 CPU Reset가 발생한다.</li>
<li>소프트웨어 인터럽트: CPU가 인스트럭션을 수행하는 도중에 일어나는 인터럽트</li>
</ul>
</li>
</ul>
<hr>
<p><span style="color : darkgrey;">출처 : </span> <a href="https://nice-engineer.tistory.com/entry/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8Interrupt#recentComments">https://nice-engineer.tistory.com/entry/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8Interrupt#recentComments</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[OS] 01. 데드락 발생조건 / 예방조건 4가지]]></title>
            <link>https://velog.io/@seony-dev/%EB%8D%B0%EB%93%9C%EB%9D%BD-%EB%B0%9C%EC%83%9D%EC%A1%B0%EA%B1%B4-%EC%98%88%EB%B0%A9%EC%A1%B0%EA%B1%B4-4%EA%B0%80%EC%A7%80</link>
            <guid>https://velog.io/@seony-dev/%EB%8D%B0%EB%93%9C%EB%9D%BD-%EB%B0%9C%EC%83%9D%EC%A1%B0%EA%B1%B4-%EC%98%88%EB%B0%A9%EC%A1%B0%EA%B1%B4-4%EA%B0%80%EC%A7%80</guid>
            <pubDate>Tue, 14 May 2024 06:19:50 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/seony-dev/post/855e61f8-d9b1-412c-b967-8684737873c9/image.png" alt=""></p>
<hr>
<h4 id="🖥️-데드락deadlock이란">🖥️ 데드락(deadlock)이란?</h4>
<blockquote>
<p>데드락(deadlock)은 교착 상태(膠着狀態)라고도 불리며, 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태이다. 
전산학에서 교착 상태란 다중 프로그래밍 환경에서 흔히 발생할 수 있는 문제이다. 이 문제를 해결하는 일반적인 방법은 아직 없는 상태이다.</p>
</blockquote>
<h4 id="🖥️-데드락deadlock의-발생조건">🖥️ 데드락(deadlock)의 발생조건</h4>
<ol>
<li><strong>상호배제(Mutual exclusion)</strong> : 프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구한다.</li>
<li><strong>점유대기(Hold and wait)</strong> : 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.</li>
<li><strong>비선점(No preemption)</strong> : 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다.</li>
<li><strong>순환대기(Circular wait)</strong> : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.</li>
</ol>
<p>이 조건 중에서 한 가지라도 만족하지 않으면 교착 상태는 발생하지 않는다. 이중 순환대기 조건은 점유대기 조건과 비선점 조건을 만족해야 성립하는 조건이므로, 위 4가지 조건은 서로 완전히 독립적인 것은 아니다.</p>
<hr>
<p><span style="color:darkgrey;">출처 : <span>
<a href="https://ko.wikipedia.org/wiki/%EA%B5%90%EC%B0%A9_%EC%83%81%ED%83%9C">https://ko.wikipedia.org/wiki/%EA%B5%90%EC%B0%A9_%EC%83%81%ED%83%9C</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Programming] 01. 애자일 소프트웨어 개발(Agile Software Development)]]></title>
            <link>https://velog.io/@seony-dev/Programming-01.-%EC%95%A0%EC%9E%90%EC%9D%BC-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B0%9C%EB%B0%9CAgile-Software-Development</link>
            <guid>https://velog.io/@seony-dev/Programming-01.-%EC%95%A0%EC%9E%90%EC%9D%BC-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B0%9C%EB%B0%9CAgile-Software-Development</guid>
            <pubDate>Sat, 04 May 2024 16:37:48 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/seony-dev/post/b32f3bda-05e9-4c49-a1e9-840a412f5405/image.jpg" alt=""></p>
<hr>
<h4 id="📝-애자일-소프트웨어-개발agile-software-development-애자일-방법론이란">📝 애자일 소프트웨어 개발(Agile Software Development; 애자일 방법론)이란?</h4>
<blockquote>
<p>애자일 소프트웨어 개발 방법론은 프로젝트를 작은 단위의 작업과 단계로 나누는 프로젝트 관리 공정이다. 업무를 세부적으로 나눠 진행하기 때문에 팀이 공정의 각 단계에서 관계자의 피드백을 적용하고, 작업을 재평가하고, 신속하게 반복 작업을 실행할 수 있다. 
애자일 방법론에서 가장 일반적으로 사용되는 방식은 짧은 개발 주기인 &#39;스프린트&#39;를 통해 업무를 점진적으로 진행하는 것이다. 이를 통해 팀은 업무를 신속하게 진행하고, 스프린트 계획 단계와 매일 진행되는 스크럼을 통해 관리자, 관계자들과 정기적으로 업무를 재평가할 수 있다. 프로젝트팀과 관계자들은 검토를 거쳐 업무를 현재의 방식대로 계속 진행할 것인지, 아니면 앞으로의 스프린트에서는 계획을 변경해 적용할 것인지 결정할 수 있다. 
전통적인 프로젝트 관리 방식과 비교하면 애자일 방법론은 속도, 유연성, 팀워크, 관계자의 요구 사항을 가장 우선순위로 둔다는 점에서 차이가 있다.
애자일 소프트웨어 개발은 2000년대 초반부터 현재까지 많은 기술 기업에서 프로젝트 관리 방식으로 중용되어 왔다. 오늘날 대부분의 소프트웨어 개발팀이 애자일 방법론을 어떠한 형태로든 사용하고 있고, 다른 많은 업무 환경에서도 애자일 방법론의 요소를 활용하고 있다.</p>
</blockquote>
<hr>
<h4 id="📝애자일의-유래">📝애자일의 유래</h4>
<p>애자일이라는 개념은 2000년대 초 소프트웨어 개발자들이 모여 4가지 원칙이 담긴 선언문을 발표한 데서 유래했으며, 그 원칙은 다음과 같다.</p>
<ol>
<li>공정과 도구보다 개인과 상호 작용 중시</li>
<li>포괄적인 문서보다 작동하는 소프트웨어 중시</li>
<li>계약 협상보다 고객과의 협력 중시</li>
<li>계획을 고수하기보다는 변화에 대응</li>
</ol>
<p>2001년에 발표된 애자일 선언문에 명시된 이 4가지 가치는 애자일 프로젝트 관리 방식의 바탕이 되었고, 소프트웨어 개발업계에 전면적인 변화를 가져왔다.</p>
<p>이전까지는 소프트웨어 개발 프로젝트에 폭포수 모델이 가장 선호되는 방식으로 여겨졌다. 폭포수 모델은 처음 등장한 1970년대에는 굉장히 획기적이었지만, 프로젝트를 시작하기도 전에 많은 양의 문서를 작성하고 확고한 계획을 세워야 한다는 점이 가장 큰 문제였다. 업무가 실제로 시작되면 각 팀이, 때로는 서로 고립된 상태에서, 계획을 철저하게 따라야 해 문제가 발생하거나 계획을 변경해야 할 때 이에 적절하게 대응하기가 힘들었다. 
이에 비해 애자일 방법론을 사용하는 팀은 프로젝트를 더 신속하게 시작할 수 있고 문제가 발생하면 이에 적절하게 대응할 수 있으며 고객, 관계자와 함께 계획을 세울 수 있다.</p>
<hr>
<p><span style="color:darkgray">출처 : </span>
<a href="https://experience.dropbox.com/ko-kr/resources/agile-methodology">https://experience.dropbox.com/ko-kr/resources/agile-methodology</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C# Programming] 추상화(Abstract)와 가상화(Virtual)]]></title>
            <link>https://velog.io/@seony-dev/Programming-%EC%B6%94%EC%83%81%ED%99%94-vs-%EA%B0%80%EC%83%81%ED%99%94</link>
            <guid>https://velog.io/@seony-dev/Programming-%EC%B6%94%EC%83%81%ED%99%94-vs-%EA%B0%80%EC%83%81%ED%99%94</guid>
            <pubDate>Thu, 02 May 2024 19:56:03 GMT</pubDate>
            <description><![CDATA[<h4 id="🖥️-추상화와-가상화의-차이">🖥️ 추상화와 가상화의 차이</h4>
<p><strong><code>가상 메서드</code>*</strong>에는 <strong>구현</strong>이 있으며 자식 클래스에 이를 <strong>재정의</strong>하는 <strong>옵션</strong>을 제공한다. (반드시 재정의할 필요는 없음.)
이에 비해, <strong><code>추상 메서드</code></strong>는 <strong>구현을 제공하지 않으며</strong> 파생 클래스가 메서드를 <strong>재정의</strong>하도록 <strong>강제</strong>한다.</p>
<p>따라서 <strong><code>추상 메서드</code></strong>에는 실제 코드가 없으며 추상이 아닌 자식 클래스는 <strong>부모의 추상 메서드를 재정의</strong>해야 한다. 
<strong><code>가상 메서드</code></strong>에는 일반적으로 어떤 항목의 기본 구현인 코드가 있을 수 있으며, 모든 자식 클래스는 <code>override</code> 수정자를 사용하여 메서드를 재정의하고 사용자 지정 구현을 제공할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래밍] 10. 오토마타 이론(Automata Theory)]]></title>
            <link>https://velog.io/@seony-dev/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-10.-%EC%98%A4%ED%86%A0%EB%A7%88%ED%83%80-%EC%9D%B4%EB%A1%A0Automata-Theory</link>
            <guid>https://velog.io/@seony-dev/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-10.-%EC%98%A4%ED%86%A0%EB%A7%88%ED%83%80-%EC%9D%B4%EB%A1%A0Automata-Theory</guid>
            <pubDate>Wed, 01 May 2024 17:11:15 GMT</pubDate>
            <description><![CDATA[<h4 id="🖥️-오토마타-이론automata-theory이란">🖥️ 오토마타 이론(Automata Theory)이란?</h4>
<blockquote>
<p>오토마타 이론(Automata Theory)은 계산 능력이 있는 추상 기계와 그 기계를 이용해서 풀 수 있는 문제들을 연구하는 컴퓨터 과학의 분야이다. 여기서 추상 기계를 오토마타(automata, 복수형) 또는 오토마톤(automaton, 단수형), 즉 자동 기계라고 부른다. 이 이름은 &#39;자동&#39;을 의미하는 그리스어 &#39;αὐτόματα&#39;에서 유래하였다.
오토마타는 &quot;자동화&quot;라는 단어와 밀접하게 관련된 자동 장치 라는 단어 자체는 특정 프로세스의 생산을 수행하는 자동 프로세스를 나타낸다.</p>
</blockquote>
<hr>
<h4 id="🖥️-오토마타의-종류">🖥️ 오토마타의 종류</h4>
<p>대표적으로 <strong><code>유한 상태 기계(Finite State Machine)</code></strong>가 있다. 이는 내부 상태 외의 저장 공간을 갖지 않는 오토마타이며, 저장 공간이 따로 없어서 가장 간단한 형태의 오토마타라 할 수 있다. 
또한, 오토마타는 입력 문자열을 순서대로 하나씩 읽으면서 읽은 글자와 내부 상태에 따라 내부 상태를 바꾸면서 작동한다. </p>
<p>유한 상태 기계가 사용되는 대표적인 예시로 정규 표현식과 <code>논리회로</code>가 있다. 순차적 논리회로는 유한 개의 저장 공간을 가지므로 이를 내부 상태로 생각해 유한 상태 기계로 표현할 수 있다.</p>
<hr>
<p><span style="color:dark-gray;">출처 : </span></p>
<ul>
<li><a href="https://ko.wikipedia.org/wiki/%EC%98%A4%ED%86%A0%EB%A7%88%ED%83%80_%EC%9D%B4%EB%A1%A0">https://ko.wikipedia.org/wiki/%EC%98%A4%ED%86%A0%EB%A7%88%ED%83%80_%EC%9D%B4%EB%A1%A0</a></li>
<li><a href="https://cs.stanford.edu/people/eroberts/courses/soco/projects/2004-05/automata-theory/basics.html">https://cs.stanford.edu/people/eroberts/courses/soco/projects/2004-05/automata-theory/basics.html</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[게임 수학] 01. 벡터의 내적과 외적]]></title>
            <link>https://velog.io/@seony-dev/%EA%B2%8C%EC%9E%84-%EC%88%98%ED%95%99-01.%EB%B2%A1%ED%84%B0%EC%9D%98-%EB%82%B4%EC%A0%81%EA%B3%BC-%EC%99%B8%EC%A0%81</link>
            <guid>https://velog.io/@seony-dev/%EA%B2%8C%EC%9E%84-%EC%88%98%ED%95%99-01.%EB%B2%A1%ED%84%B0%EC%9D%98-%EB%82%B4%EC%A0%81%EA%B3%BC-%EC%99%B8%EC%A0%81</guid>
            <pubDate>Mon, 29 Apr 2024 19:44:26 GMT</pubDate>
            <description><![CDATA[<h4 id="📈-들어가기-전">📈 들어가기 전...</h4>
<p><em><strong>벡터를 사용하는 이유</strong></em></p>
<ol>
<li><p>GameObject들의** 속도, 바람, 저항, 충돌, 위치 판단** 등 많은 요소들을 벡터로 표현할 수 있다.</p>
</li>
<li><p><code>벡터의 내적</code>을 이용해서 오브젝트 위치의 전·후방을 판별할 수 있다. <strong>플레이어의 시선(forward) 중심</strong>으로 <strong>좌, 우 90도가 넘어가는 순간</strong> <code>코사인 값</code>은 <code>음수</code>를 갖기 때문에, 플레이어 시선의 벡터와 target의 위치벡터를 내적해서 양수값이면 플레이어의 전방, 음수값이면 플레이어의 후방에 위치한다.</p>
</li>
<li><p><code>벡터의 외적</code>은 보통 오브젝트 위치의 좌우를 판별하는데 사용된다. 플레이어의 시선과 Up 벡터를 중심으로 외적을 구한다면 플레이어의 좌측에 있는 오브젝트는 양수, 플레이어의 오른쪽에 있는 오브젝트는 음수를 반환한다.</p>
</li>
</ol>
<h4 id="📈-벡터란">📈 벡터란?</h4>
<p><img src="https://velog.velcdn.com/images/seony-dev/post/e794b98c-e3ee-4756-861e-1b0cd5ea6385/image.png" alt=""></p>
<h5 id="↑-벡터는-점-a와-점-b를-잇는-화살표이다">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↑ 벡터는 점 A와 점 B를 잇는 화살표이다.</h5>
<blockquote>
<p>벡터는 그리스 수학자인 &#39;유클리디안 벡터(Euclidean vector)&#39;의 이름을 따랐으며, 기하학적 벡터(geometric vector)라고도 불린다. 
이는 크기와 방향을 모두 가지는 어떤 양으로 정의되며, 사물의 움직임을 프로그래밍하기 위한 가장 기본적인 구성요소이다. 
일반적으로 벡터는 <code>화살표</code>로 표현한다. <code>화살표가 가리키는 쪽</code>은 <code>방향</code>을 나타내며 <code>화살표의 길이</code>는 <code>크기</code>를 나타낸다.</p>
</blockquote>
<hr>
<h4 id="📈-벡터의-내적內積-inner-product">📈 벡터의 내적(內積; inner product)</h4>
<p><img src="https://velog.velcdn.com/images/seony-dev/post/910088ec-5510-47a3-b66c-d176414ac7f7/image.png" alt=""></p>
<p>내적은 벡터를 곱하는 개념 중 하나인데, 이는 &#39;쌓을 적(積)&#39;이라는 한자로 표현된다. 이는 <strong>두 벡터의 방향이 일치하는 정도에 따라서 곱을 한다.</strong> 
예를 들어, <strong>두 벡터의 방향이 완전히 일치</strong>하면 <strong>각 벡터의 크기를 그냥 곱</strong>하고, <strong>두 벡터가 이루는 각이 90도</strong>일 땐, <strong>일치하는 정도가 전혀 없기 때문에 곱이 0</strong>이 된다. 
즉 내적은 하나의 벡터를 다른 벡터로 <em>* 정사영</em> 시켜서 그 벡터의 크기를 곱하는 것으로 이해할 수 있다. </p>
<p><img src="https://velog.velcdn.com/images/seony-dev/post/d94fb411-1e7f-41c4-a118-2bdbbf3821d0/image.png" alt=""></p>
<p>내적의 값을 구하는 수식은 두 벡터 사이에 기호로 가운데 점(dot)을 찍는 것( · )이며, 이는 벡터a와 b의 절대값을 곱하고 코사인 세타 값을 곱하면 된다.</p>
<h5 id="-정사영orthogonal-projection--한-벡터를-다른-벡터에-수직으로-내린-선상에-있는-점을-찾는-것을-말한다-즉-정사영은-두-벡터-사이의-각도와-관련이-있으며-이를-통해-한-벡터를-다른-벡터의-방향으로-투영시키는-것이라-볼-수-있다">* 정사영(Orthogonal Projection) : 한 벡터를 다른 벡터에 수직으로 내린 선상에 있는 점을 찾는 것을 말한다. 즉 정사영은 두 벡터 사이의 각도와 관련이 있으며, 이를 통해 한 벡터를 다른 벡터의 방향으로 투영시키는 것이라 볼 수 있다.</h5>
<hr>
<h4 id="📈-벡터의-외적外積-outer-product">📈 벡터의 외적(外積; outer product)</h4>
<p><img src="https://velog.velcdn.com/images/seony-dev/post/0929b8ce-9f15-4b19-9bee-fc8bae5fd76d/image.png" alt=""></p>
<p>두 벡터를 곱하는 내적 외에 외적도 존재한다. 외적의 결과값은 벡터이며, 이 <code>벡터의 방향</code>은 <strong>곱하는 두 벡터에 수직</strong>하고 <code>크기</code>는 <strong>두 벡터가 이루는 평행사변형의 넓이이다.</strong>
내적의 연산 기호는 닷(dot; ·)을 사용하며, 수식은 벡터a와 b의 절대값을 곱하고 코사인 세타 값을 곱하면 된다.
외적의 연산 기호는 크로스(cross; χ )이며, 수식은 각 벡터의 외적의 크기(절대값)를 곱하고 사인 세타 값을 곱하면 된다.</p>
<hr>
<h4 id="📈-내적과-외적의-차이">📈 내적과 외적의 차이</h4>
<p>수학적으로 접근한다면 내적과 외적은 서로 상관이 없다. 즉 두 가지 형태의 다른 연산이 존재하는 것이라 볼 수 있다.
다만 <code>내적의 결과값</code>은 <strong><code>스칼라</code></strong>이고, <code>외적의 결과값</code>은 <strong><code>벡터</code></strong>이다.</p>
<p>위에서 서술한 것과 같이 게임 프로그래밍에서 바라보는 벡터의 내적과 외적은 다소 차이가 있다. 
내적은 0~180도 사이에서만 구할 수 있기 때문에 전·후방 값만 알 수 있으며, 반대로 외적은 중앙(0)을 기준으로 좌(-1)·우(1) 값을 알 수 있다. 즉 내적과 외적을 함께 쓰게 되면 360도 위치와 방향을 구현할 수 있다.
(해당 부분은 다시 정리)</p>
<hr>
<p><span style="color:darkgray;">출처 :</span></p>
<ul>
<li><a href="https://ko.khanacademy.org/computing/computer-programming/programming-natural-simulations/programming-vectors/a/intro-to-vectors">칸 아카데미 - 벡터란?</a></li>
<li><a href="https://wikidocs.net/22384">https://wikidocs.net/22384</a></li>
<li><a href="https://amirazmi.net/dot-products-in-games-and-their-use-cases/">https://amirazmi.net/dot-products-in-games-and-their-use-cases/</a></li>
<li><a href="https://gnaseel.tistory.com/18#google_vignette">https://gnaseel.tistory.com/18#google_vignette</a></li>
</ul>
]]></description>
        </item>
    </channel>
</rss>