<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>kimyongmin519 님의 블로그</title>
    <link>https://kimyongmin519.tistory.com/</link>
    <description>심심할 때마다 올림.</description>
    <language>ko</language>
    <pubDate>Tue, 2 Jun 2026 12:25:23 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>kimyongmin519</managingEditor>
    <image>
      <title>kimyongmin519 님의 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/8140291/attach/4aa052c62162453581bacdf647d49c0b</url>
      <link>https://kimyongmin519.tistory.com</link>
    </image>
    <item>
      <title>[알고리즘] 이진 탐색과 숫자 빠르게 찾기 문제 풀기 </title>
      <link>https://kimyongmin519.tistory.com/36</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;이진 탐색(Binary Search)란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정렬된 배열(또는 리스트)&lt;/b&gt; 에서 특정 값을 찾기 위해 사용하는 탐색 알고리즘이며 탐색 범위의 중간 값(mid)을 기준으로 찾고자 하는 값과 비교한 뒤, 값의 크기에 따라 왼쪽(left) 또는 오른쪽(right) 절반만 다시 탐색하면서 범위를 점점 좁혀 나가며 탐색함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;이진탐색.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3orIu/dJMcaiJ79zk/oJkWk1rF3rY4jZVU1m0iZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3orIu/dJMcaiJ79zk/oJkWk1rF3rY4jZVU1m0iZ1/img.png&quot; data-alt=&quot;이진탐색 예제 그림&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3orIu/dJMcaiJ79zk/oJkWk1rF3rY4jZVU1m0iZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3orIu%2FdJMcaiJ79zk%2FoJkWk1rF3rY4jZVU1m0iZ1%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;470&quot; height=&quot;411&quot; data-filename=&quot;이진탐색.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이진탐색 예제 그림&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d; text-align: center;&quot;&gt; (위 그림에는 low,high라 표시되어있지만 low를 left, high를 right로 치환해서 설명하겠습니다.) &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림은 &quot;정렬된&quot; 배열에서 34라는 값을 찾고 싶다고 할 때 이진탐색이 일어나는 과정을 그린 그림입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 0번째 인덱스를 left로 두고 맨 마지막 인덱스를 right, 그리고 그 둘의 중간 인덱스를 mid로 두고 탐색을 시작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt; (찾고자하는 값을 n이라고 하겠습니다) &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 mid의 값이 n이 아니라면 2가지 경우의 수에 놓여지는데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mid보다 n이 더 크다면 왼쪽에는 n이 없다는 뜻이니 left = mid + 1로 하고 범위를 좁혀줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d; text-align: start;&quot;&gt; (mid도 찾고자하는 값이 아니라는 뜻이기 때문에 1을 더해준다) &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;하지만 mid보다 n이 더 작다면 mid를 기준으로 오른쪽에는 없다는 뜻이기 때문에 right = mid - 1로 하고 범위를 좁혀줍니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d; text-align: start;&quot;&gt; (마찬가지로 mid도 찾고자하는 값이 아니라는 뜻이기 때문에 1을 뻬준다(인덱스가 더 큰쪽에는 없다는 뜻이기때문에)) &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;그 다음 새로운 값이 넣어진 left또는 right로 다시 mid를 정한 뒤 반복하면 빠른 속도로 찾고자하는 값을 얻을 수 있다!&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이제 이진탐색을 이용한 문제를 풀어보자 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(출처: 코드트리 숫자 빠르게 찾기 &amp;darr;)&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;671&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgIjqz/dJMb990NjKq/keyzZqma930BhrGDaiUTLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgIjqz/dJMb990NjKq/keyzZqma930BhrGDaiUTLK/img.png&quot; data-alt=&quot;문제 설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgIjqz/dJMb990NjKq/keyzZqma930BhrGDaiUTLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgIjqz%2FdJMb990NjKq%2FkeyzZqma930BhrGDaiUTLK%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;717&quot; height=&quot;545&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;671&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;문제 설명&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;593&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2CR4F/dJMcacDde5a/XkhlQoEc9tb7O877iv9O61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2CR4F/dJMcacDde5a/XkhlQoEc9tb7O877iv9O61/img.png&quot; data-alt=&quot;입력 예제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2CR4F/dJMcacDde5a/XkhlQoEc9tb7O877iv9O61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2CR4F%2FdJMcacDde5a%2FXkhlQoEc9tb7O877iv9O61%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;702&quot; height=&quot;593&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;593&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;입력 예제&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&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;b&gt;정답 코드 (주석으로 설명을 적음)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779952619312&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;iostream&amp;gt;
using namespace std;

int n, m;
int arr[100000]; //최대값 만큼 미리 할당

int BanarySearch(int target);

int main()
{
    cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;
    
    for (int i = 0; i &amp;lt; n; ++i)
    {
        cin &amp;gt;&amp;gt; arr[i]; //배열 내용 입력
    }

    for (int i = 0; i &amp;lt; m; ++i)
    {
        int x;
        cin &amp;gt;&amp;gt; x;
        cout &amp;lt;&amp;lt; BanarySearch(x) &amp;lt;&amp;lt; endl; //입력하는 수 마다 배열 안에 있는지 이진탐색 시작
    }

}

int BanarySearch(int target)
{
    int left, right, mid;
    left = 0, right = n - 1; //left를 0, right를 최대 인덱스로

    while (left &amp;lt;= right) // left와 right가 둘이 크로스되었다는 것은 탐색범위가 더 이상 없다는 것으로 즉, 타겟값을 찾지못했다는 것
    {
        mid = (left + right) / 2; //left와 right를 더하고 나눠 둘의 중간 지점을 mid로

        if (arr[mid] == target) //arr[mid]값이 찾으려고하는 타겟값과 같으면 mid의 위치 + 1 리턴 (인덱스이기 때문에 길이위치를 알기 위해 1 더해주기)
            return mid + 1;

        if (target &amp;gt; arr[mid]) //타겟값이 미드쪽 값보다 크다면
            left = mid + 1; //left를 올려 범위 좁히기
        else
            right = mid - 1; //반대로 타겟값이 더 작으면 right를 내려 범위 좁히기
    }
    return -1; //while문을 다 돌렸음에도 찾지못했으면 반복이 끝나고 -1 리턴
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상이며 이진탐색의 가장 중요한 개념은 &quot;정렬된 배열에서 제대로된 힘을 발휘하는 알고리즘&quot;입니다.&lt;/p&gt;</description>
      <category>알고리즘과 자료구조(C++)/알고리즘</category>
      <author>kimyongmin519</author>
      <guid isPermaLink="true">https://kimyongmin519.tistory.com/36</guid>
      <comments>https://kimyongmin519.tistory.com/36#entry36comment</comments>
      <pubDate>Thu, 28 May 2026 16:25:27 +0900</pubDate>
    </item>
    <item>
      <title>[C#] event키워드는 무엇이며 숨겨진 역할은 무엇인가? </title>
      <link>https://kimyongmin519.tistory.com/35</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 읽는 당신이 만약 C#을 좀 하시는 분들이라면 &quot;델리게이트와 액션&quot;을 사용해보셨을 겁니다.&lt;br /&gt;그리고 이 둘을 배울 때 항상 같이 배우는 녀석이 있는데요. (like. 마트 2+1 행사마냥 엌)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 &quot;event&quot;라는 키워드입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1778921864305&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public event Action MyAction;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이 키워드는 델리게이트 앞에 붙을 수 있으며 이 &lt;b&gt;키워드는 2가지 역할을 수행&lt;/b&gt;하며 저 2가지말고도 어떠한 영향을 끼치는지 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 외부에서의 호출을 막는다.  &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;event키워드는 외부에서 호출, 즉 Invoke시키는 것을 막아줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1778920905443&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class GameManager : MonoSingleton&amp;lt;GameManager&amp;gt;
{
    public event Action OnPlayerDeath;
    
    public void PlayerDie()
    {
        OnPlayerDeath?.Invoke();
    }
}

public class TestClass
{
    void Start()
    {
        GameManager.Instance.OnPlayerDeath?.Invoke(); //에러가 뜬다. (자동완성에 Invoke자체가 안뜸)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 예시코드처럼 &lt;b&gt;외부로부터 이벤트가 호출되는 것을 막아주며&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시상황으로, 게임의 상태를 관리하는 메니저가 있고 이 메니저의 OnGameStatusClear라는 액션을 구독하고 있는 녀석들이 있다고 쳤을 때 외부에서 이 이벤트를 호출해버리면 갑작스럽게 게임이 초기화되는 상황이 일어나는 것처럼 &lt;b&gt;캡슐화를 해주는 것&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 외부에서 = 으로 덮어씌울 수 없다.  &lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778921702228&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class HumanErrorTroll : MonoBehaviour
{
    void Start()
    {
        GameManager.Instance.OnPlayerDeath = HandleTroll; //에러가 뜬다.
    }

    private void HandleTroll()
    {
        //휴먼에러;;;;;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;event 키워드를 붙이면 외부에서 구독(+=), 해제(-=)만 가능해지며 =로 구독리스트들을 덮어씌워버리는 것을 막아줍니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시상황으로, 앞 상황처럼 게임의 상태를 관리하는 매니저가 있고 OnGameStatusClear라는 액션에 구독되어있는 녀석들이 개발자의 &lt;b&gt;실수로 외부에서 null을 넣어 구독되어있는 녀석들 모두를 해체해버리는 코드를 넣어 게임의 버그를 발생시키는 등의 상황을 방지&lt;/b&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;이처럼 event는 이 2가지 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만&lt;b&gt; event가 선언한 &quot;변수&quot; 자체에 개입&lt;/b&gt;을 하기도하는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 코드 보신 적 있을 겁니다.&lt;/p&gt;
&lt;pre id=&quot;code_1778921951174&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface ITestInterface
{
    event Action OnTestAction;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터페이스에서 액션을 선언하여 구현 멤버로써 사용하는 코드인데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 &lt;b&gt;event키워드를 빼면 오류가 뜨며 &quot;인터페이스는 인스턴스 필드를 포함할 수 없습니다.&quot;&lt;/b&gt; 라고 뜹니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아시다시피 인터페이스는 필드를 포함하지못하지만 이거랑 event랑 무슨 상관일까요?&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;event가 붙게되면 액션은 &quot;프로퍼티&quot;처럼 작동하며 내부적으로 프로퍼티와 같은 접근자 add/remove가지게 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1778922174502&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private Action _onTestAction;

public event Action OnTestAction
{
    add    { _onTestAction += value; } // += 할 때
    remove { _onTestAction -= value; } // -= 할 때
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 인터페이스는 프로퍼티를 가질 수 있기 때문에 event를 붙여야만 인터페이스에 작성할 수 있는것이며, 외부에는 add와 remove만 접근할 수 있도록 되어있고 =와 호출은 접근자로 노출되어있지 않기 때문에 못하는 것입니다.&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;/p&gt;</description>
      <category>개발관련/C# (중급)</category>
      <author>kimyongmin519</author>
      <guid isPermaLink="true">https://kimyongmin519.tistory.com/35</guid>
      <comments>https://kimyongmin519.tistory.com/35#entry35comment</comments>
      <pubDate>Sat, 16 May 2026 18:07:41 +0900</pubDate>
    </item>
    <item>
      <title>[C#] == 연산자와 Equals, ReferenceEquals </title>
      <link>https://kimyongmin519.tistory.com/34</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 코드를 작성하면서 어떤 것과 어떤 것을 비교할 때가 있습니다.&lt;br /&gt;그때 우리는 &quot;비교 연산자&quot; 라는 것을 사용합니다. (==, !=, &amp;gt;, &amp;lt; 등등)&lt;br /&gt;이중에서 == 비교를 할 때 서로 같은지 다른지를 체크하는 녀석입니다.&lt;br /&gt;이 친구처럼 C#에서 서로 같은 녀석인지 비교를 하게 해주는 녀석들은 더 존재합니다. 이 글에서는 이 녀석들을 알아보겠습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;수텝 1. == 연산자 &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;== 연산자는 가장 일반적으로 사용되며&lt;br /&gt;값 형식일 경우(int, bool 등등) 변수에 저장된 실제값이 같은지 비교합니다.&lt;br /&gt;참조 형식일 경우(class등등) 두 변수가 같은 메모리 위치를 가리키는지 (같은 객체를 가리키는지) 비교합니다.&lt;br /&gt;특징으로는 &lt;b&gt;연산자 오버로딩&lt;/b&gt;이 가능합니다.&lt;br /&gt;여기서 연산자 오버로딩은 후술할 Equals의 재정의와 비슷하며 둘다 두 비교 대상이 같은가를 어떤 기준으로 판별할지 정할 수 있습니다.&lt;br /&gt;예시로 내부적으로 string은 주소가 달라도 문자열 내용만 같으면 true를 반환하도록 되어있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Step 2. Equals &lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Equals는 System.Object에 있는 가상메서드이기 때문에 모든 객체에 정의되어있으며 int같은 녀석들도 최상위 부모로 object를 상속 받기 때문에 Equals가 존재합니다.&lt;br /&gt;Equals는 ==연산자와 똑같이 이 두 녀석이 같은 지를 판별하는데요.&lt;br /&gt;이 녀석은 가상메서드인 만큼 &lt;b&gt;재정의&lt;/b&gt;가 가능합니다.&lt;br /&gt;예시 코드로&lt;/p&gt;
&lt;pre id=&quot;code_1777819979493&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Monster
{
    public int MonsterID;

    public override bool Equals(object obj)
    {
        if (obj is Monster other)
        {
            return this.MonsterID == other.MonsterID;
        }
        return false;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 Monster의 Id만 같다면 같은 녀석으로 처리해준다고 개발자 맘대로 지정할 수도 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SiuuTep 3. ReferenceEquals &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 말한 녀석들과 달리 &lt;b&gt;오버로딩과 오버라이딩이 불가능&lt;/b&gt;하며 오직 두 객체의 참조 주소만 비교합니다. (이름도 &quot;레퍼런스&quot; 이퀄임)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별다른 특징 없이 이게 다이며 주의할 점으로는 int같은 값형식을 넣을 시 박싱처리되어 무조건 false가 뜹니다. (박싱과 언박싱에 대해서는 아래 링크 참고)&lt;br /&gt;&lt;a href=&quot;https://kimyongmin519.tistory.com/31&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kimyongmin519.tistory.com/31&lt;/a&gt;&lt;/p&gt;</description>
      <category>개발관련/C# (초급)</category>
      <author>kimyongmin519</author>
      <guid isPermaLink="true">https://kimyongmin519.tistory.com/34</guid>
      <comments>https://kimyongmin519.tistory.com/34#entry34comment</comments>
      <pubDate>Mon, 4 May 2026 00:00:22 +0900</pubDate>
    </item>
    <item>
      <title>[유니티] RenderPipeline과 RenderPipeline Converter </title>
      <link>https://kimyongmin519.tistory.com/33</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hdrp-scene-template.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVfaMz/dJMcafl7IdR/zdHKSqQgLqwtvC6u1vOkd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVfaMz/dJMcafl7IdR/zdHKSqQgLqwtvC6u1vOkd0/img.png&quot; data-alt=&quot;유니티 공식 렌더파이프 라인 문서에 있는 그래픽 사진&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVfaMz/dJMcafl7IdR/zdHKSqQgLqwtvC6u1vOkd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVfaMz%2FdJMcafl7IdR%2FzdHKSqQgLqwtvC6u1vOkd0%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;592&quot; height=&quot;333&quot; data-filename=&quot;hdrp-scene-template.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유니티 공식 렌더파이프 라인 문서에 있는 그래픽 사진&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 렌더파이프 라인이란?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;렌더파이프 라인은 유니티말고 컴퓨터 그래픽에서도 자주쓰이는 용어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 3차원에서 만들어진 모델을 2차원 상에 투영시켜 그려내는 과정을 말하는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서는 앞서 말한 3D 모델, 라이팅, 그림자, 쉐이딩 등등의 모든 그래픽 처리가 포함되어있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이런 녀석인 렌더파이프 라인은 유니티에서 총 3가지를 제공합니다.&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. SRP(URP, HDRP)  &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Scriptable Render Pipeline의 줄임말로, 개발자가 직접 C# 기반으로 렌더링과정을 제어할 수 있는 현대적인 방식입니다.&lt;br /&gt;SRP에서 또 URP, HDRP 2가지로 나뉘는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1-1. URP &lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Universal Render Pipeline의 줄임말로, 대부분의 프로젝트에서 범용성있게 쓰이는 렌더파이프 라인입니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;개발자들 사이에서는 거의 디폴트로 취급받을 만큼 가장 많이 쓰이며, 어디서나 돌아가는 범용성 중심으로 구성되어있는 것이 큰 특징입니다.&lt;br /&gt;GPU가 메모리에 접근하는 횟수를 최소화하도록 되어있기 때문에 (ex.URP환경에서는 반사광의 정도를 반사된 빛의 정해진 배수 만큼 곱해 표현한다.) 최적화 면에서도 좋아, 주로 모바일, 콘솔, 저사양 PC도 플레이 가능한 게임 등등 여러 게임을 제작할 때 쓰이며 가장 많이 쓰입니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1-2. HDRP &lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;High Definition Render Pipeline의 줄임말로, 이름에서도 들을 수 있듯이 높은 그래픽을 가지는 게임을 만들 때 쓰입니다.&lt;br /&gt;특징으로는 URP와 달리 빛의 세기를 Lux(럭스), Lumen(루멘)단위를 사용하여 계산하는 등 실제 세상을 코드로 재현하는 것 마냥 정밀하고도 높은 해상도의 그래픽을 그릴 수 있습니다.&lt;br /&gt;주로 고사양 PC를 위한 고퀄리티 게임을 만들 때 씁니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Built-in Render Pipeline (영포티 방식) &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Built-in Render Pipline은 유니티 출시 때부터 있었던 전통적인 방식이며 최근 들어서는 거의 쓰이지않는 파이프라인입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;color: #000000; background-color: #dddddd;&quot;&gt;쓰이지않는 이유가 뭔가요&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #dddddd;&quot;&gt;?&lt;/span&gt;&lt;/i&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;span style=&quot;color: #000000;&quot;&gt;빌트인은 우선 ShaderGraph나 VFXGraph같은 최신기능을 지원하지않아 확장성이 떨어집니다.&lt;br /&gt;그래서 현재로써는 옛날 프로젝트의 유지보수를 위해 쓰이거나 에셋테스트용으로는 거의 쓰이지않습니다.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;color: #000000; background-color: #dddddd;&quot;&gt;파이프라인 3가지는 알았는데 제목에 Render Pipeline Converter는 뭔가요&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #dddddd;&quot;&gt;???&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 렌더파이프 라인 컨버터란?&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqrLQi/dJMcabxd6co/tBSCcwuoDhNbv2QLnL9XSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqrLQi/dJMcabxd6co/tBSCcwuoDhNbv2QLnL9XSK/img.png&quot; data-alt=&quot;제 플젝에 있는 어느 한 모델&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqrLQi/dJMcabxd6co/tBSCcwuoDhNbv2QLnL9XSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqrLQi%2FdJMcabxd6co%2FtBSCcwuoDhNbv2QLnL9XSK%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;397&quot; height=&quot;350&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제 플젝에 있는 어느 한 모델&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 에셋을 다운받아 플젝에 넣거나 옛날 플젝에 있는 요소들을 플젝에 넣으면 가끔 메테리얼 잘 들어갔는데도 이상하게 나오는 경우가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 빌트 인 시절에 만들어진 것을 URP환경에서 가져와 쓸려니까 오류가 나는 것입니다.&lt;br /&gt;렌더 파이프라인 컨버터는 빌트 인 시절 에셋을 URP에 호환될 수 있도록 변경해주는 친구입니다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Window -&amp;gt; Rendering -&amp;gt; Render Pipeline Converter&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gf2xK/dJMcaiJRA9P/C36iPRgbyEgBgabq0ioenk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gf2xK/dJMcaiJRA9P/C36iPRgbyEgBgabq0ioenk/img.png&quot; data-alt=&quot;컨버터 창의 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gf2xK/dJMcaiJRA9P/C36iPRgbyEgBgabq0ioenk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGf2xK%2FdJMcaiJRA9P%2FC36iPRgbyEgBgabq0ioenk%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;441&quot; height=&quot;419&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;컨버터 창의 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 싹다 컨버트해버리면 해결되긴 하지만 명색의 블로그기 때문에 하나하나씩 뭔지 좀 집어보겠습니다.&lt;br /&gt;&lt;br /&gt;Material Upgrade - 빌트 인에서 사용하던 스텐다드 쉐이더를 최신 항목으로 변경해줍니다. (가장 많이 씀)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Animation Clip Converter - 애니메이션에서 머티리얼의 속성을 변경하고 있다면 이 부분을 URP구조에 맞게 변경해줌.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(ex. 애니메이션 클립에서 머티리얼의 색상 속성을 건들고 있다면 이 색상 속성의 이름이 다를 수 있음)&lt;br /&gt;Rendering Settings - 프로젝트 전체의 그래픽 설정을 URP방식으로 변경합니다.&lt;br /&gt;Read-only Material - 수정 불가능한 리드온리 머티리얼이 있는지 검사하고 어떠한 경로로 수정가능하게 복사시키거나 그럽니다.&lt;br /&gt;&lt;br /&gt;Initliaze Converters로 바꿀 항목들을 이닛해주고 딸깍딸깍 해주면 최신버전에 맞게 변경되는 모습을 볼 수 있습니다.&lt;br /&gt;&lt;br /&gt;이상 렌더 파이프라인과 그 컨버터였습니다.&lt;/p&gt;</description>
      <category>개발관련/유니티</category>
      <author>kimyongmin519</author>
      <guid isPermaLink="true">https://kimyongmin519.tistory.com/33</guid>
      <comments>https://kimyongmin519.tistory.com/33#entry33comment</comments>
      <pubDate>Tue, 28 Apr 2026 20:30:42 +0900</pubDate>
    </item>
    <item>
      <title>백준 1158번: 요세푸스 문제 풀어보기 (C++) </title>
      <link>https://kimyongmin519.tistory.com/32</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;실버4 짜리 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 링크: &lt;a href=&quot;https://www.acmicpc.net/problem/1158&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1158&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P48Yv/dJMcabX0u7E/epteFeljUkc4SnRrt8taH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P48Yv/dJMcabX0u7E/epteFeljUkc4SnRrt8taH0/img.png&quot; data-alt=&quot;문제 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P48Yv/dJMcabX0u7E/epteFeljUkc4SnRrt8taH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP48Yv%2FdJMcabX0u7E%2FepteFeljUkc4SnRrt8taH0%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;658&quot; height=&quot;377&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;문제 페이지&lt;/figcaption&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 큐가 가장 효율적인지는 코드에서 설명하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1775113957854&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;iostream&amp;gt;
#include&amp;lt;queue&amp;gt;
using namespace std;

int main()
{
	int n, k;

	cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; k;

	queue&amp;lt;int&amp;gt; que;
	int length = 0;
	
	for (int i = 1; i &amp;lt; n+1; ++i)
	{
		que.push(i); //숫자들 채워주기 (큐는 FIFO방식이기 때문에 그냥 이렇게 반복문 돌려도 됨)
	}

	length = que.size();
	cout &amp;lt;&amp;lt; &quot;&amp;lt;&quot;;
	for (int i = 0; i &amp;lt; length; ++i)
	{
		for (int j = 0; j &amp;lt; k - 1; ++j)
		{
			int q = que.front(); //pop으로 제거하기 전에 임의의 변수에 front값 넣어두기
			que.pop(); //pop으로 제거하고
			que.push(q); //front에 있던 값을 뒤로 보내서 넣어주기
		}
		if (i == length - 1) //마지막에는 , 를 안 붙이고 홑화살표만 붙어야하기 때문에 예외처리
			cout &amp;lt;&amp;lt; que.front();
		else // , 붙어주기
			cout &amp;lt;&amp;lt; que.front() &amp;lt;&amp;lt; &quot;, &quot;;
		que.pop(); //한명 제거
	}
	cout &amp;lt;&amp;lt; &quot;&amp;gt;&quot;;
}&lt;/code&gt;&lt;/pre&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 큐&lt;b&gt;의 원리 속에서 특히 원형큐에 원리와 일치&lt;/b&gt;한데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 &lt;b&gt;다른 자료형보다 더 효율적인 이유&lt;/b&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 다른 데이터를 옮기는 로직이 들어가 삭제한번에 O(N)시간이 소요되기 때문에 &lt;b&gt;시간복잡도 상 O(N^2)&lt;/b&gt;이라는 시간복잡도를 가지게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 큐는 pop이나 push를 할시 특성상 알아서 데이터가 옮겨지고 데이터 제거 후 삽입이 이뤄지지않기 때문에&amp;nbsp;&lt;b&gt;시간복잡도가 O(N x K)&lt;/b&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;/p&gt;</description>
      <category>백준 문제풀이(백준 망해서 이제 안올림)/실버</category>
      <author>kimyongmin519</author>
      <guid isPermaLink="true">https://kimyongmin519.tistory.com/32</guid>
      <comments>https://kimyongmin519.tistory.com/32#entry32comment</comments>
      <pubDate>Thu, 2 Apr 2026 16:33:29 +0900</pubDate>
    </item>
    <item>
      <title>[C#] 박싱과 언박싱 </title>
      <link>https://kimyongmin519.tistory.com/31</link>
      <description>&lt;pre id=&quot;code_1773239782661&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class TestBlog
{
    static void Main(string[] args)
    {
        object a = 10;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드는&quot;정수형&quot;인 10을 담은 &quot;object&quot; 형식에 변수 a입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 a에 담겨진 저 10이라는 값은 어디 메모리에 할당될까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 object형식은 참조형식이기 때문에 힙메모리에 할당될 것이라고 생각할 것 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로도 힙메모리에 할당되지만, 뭔가 좀 이상합니다. 10이라는 &quot;정수&quot;는 int나 long, float같은 값 형식에 담을 수 있는 데이터인데 &lt;b&gt;값 형식이 참조형식으로 바뀌는 상황&lt;/b&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;b&gt;박싱&lt;/b&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;b&gt;Boxing(박싱)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;b&gt;언박싱&lt;/b&gt;은 박싱된 값을 다시 사용하는 뜻이겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Unboxing(박싱)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;박싱된 값을 다시 값형식으로 바꾸어 쓰는걸 말합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉, object형식에 값형식을 넣으면 박싱이 되어 힙메모리에 할당되는 현상을 &lt;b&gt;박싱&lt;/b&gt;이라 부르고 이를 다시 꺼내 써오는걸 &lt;b&gt;언박싱&lt;/b&gt;이라고 부릅니다. 그렇기 때문에 언박싱은 &lt;b&gt;값복사가 일어나죠.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;박싱 &amp;amp; 언박싱의 장단점&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값 형식을 참조형식으로 변환하며 코드의 유연성을 늘릴 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점:&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;박싱과 언박싱은 힙메모리 할당과 가비지 컬렉션을 유발하기 때문에 당연히 성능저하가 일어납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;</description>
      <category>개발관련/C# (초급)</category>
      <author>kimyongmin519</author>
      <guid isPermaLink="true">https://kimyongmin519.tistory.com/31</guid>
      <comments>https://kimyongmin519.tistory.com/31#entry31comment</comments>
      <pubDate>Wed, 11 Mar 2026 23:47:07 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 난수와 rand,srand 함수 </title>
      <link>https://kimyongmin519.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;그거 아시나요? 사실 우리가 아는 Random은 사실 &quot;랜덤&quot;하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터는 기본적으로 무작위 수를 절대 뽑아낼 수 없는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 랜덤한 값을 뽑는 기능들은 어떤식으로 만드는 것일까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;난수&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;C++에서 난수를 가장 쉽게 구할 수 있는 함수가 있습니다. 바로 &lt;b&gt;rand()&lt;/b&gt;라는 함수인데요.&lt;/p&gt;
&lt;pre id=&quot;code_1773044628405&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;iostream&amp;gt;
using namespace std;

int main()
{
	int num;
	num = rand();
	cout &amp;lt;&amp;lt; num &amp;lt;&amp;lt; endl;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rand로 뽑은 값을 출력해보면 아마 이런 값이 나올 겁니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;264&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chXBkw/dJMb99ZTEBk/Wr29lkPA6aywlWIRtPyTtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chXBkw/dJMb99ZTEBk/Wr29lkPA6aywlWIRtPyTtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chXBkw/dJMb99ZTEBk/Wr29lkPA6aywlWIRtPyTtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchXBkw%2FdJMb99ZTEBk%2FWr29lkPA6aywlWIRtPyTtk%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;264&quot; height=&quot;55&quot; data-origin-width=&quot;264&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&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;분명 난수라 하였는데 rand를 호출해보니 계속 41만 출력하는데 무슨 일일까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 한번 10번 반복해서 출력해봅시다.&lt;/p&gt;
&lt;pre id=&quot;code_1773045094527&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;iostream&amp;gt;
using namespace std;

int main()
{
	for (int i = 0; i &amp;lt; 10; ++i)
	{
		cout &amp;lt;&amp;lt; rand() &amp;lt;&amp;lt; endl;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lJap7/dJMcabKbcXl/qd5hcCJgVdZ4JbpnqkCVJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lJap7/dJMcabKbcXl/qd5hcCJgVdZ4JbpnqkCVJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lJap7/dJMcabKbcXl/qd5hcCJgVdZ4JbpnqkCVJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlJap7%2FdJMcabKbcXl%2Fqd5hcCJgVdZ4JbpnqkCVJK%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;247&quot; height=&quot;194&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&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;이렇게 10번 출력하니 각각 &lt;span style=&quot;color: #006dd7;&quot;&gt;다른 값&lt;/span&gt;이 나옵니다! 역시 난수였군요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 다시 실행해보니 이 또한 1번째 값부터 10번째값이 다 똑같이 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 왜 그런지 보기전에 &lt;b&gt;srand()&lt;/b&gt;라는 함수를 먼저 봐봅시다.&lt;/p&gt;
&lt;pre id=&quot;code_1773045162404&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;iostream&amp;gt;
using namespace std;

int main()
{
	srand(2);
	for (int i = 0; i &amp;lt; 10; ++i)
	{
		cout &amp;lt;&amp;lt; rand() &amp;lt;&amp;lt; endl;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;114&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OA3dC/dJMcaadp2Qa/y0UIE0AzSxIOvKJC3q8hg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OA3dC/dJMcaadp2Qa/y0UIE0AzSxIOvKJC3q8hg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OA3dC/dJMcaadp2Qa/y0UIE0AzSxIOvKJC3q8hg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOA3dC%2FdJMcaadp2Qa%2Fy0UIE0AzSxIOvKJC3q8hg0%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;114&quot; height=&quot;190&quot; data-origin-width=&quot;114&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까와는 다르게 &lt;span style=&quot;color: #006dd7;&quot;&gt;다른 값&lt;span style=&quot;color: #000000;&quot;&gt;들이 나옵니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;srand는 무엇이고 rand는 정확히 무엇을 하는 함수이길래 이런 일이 일어날까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컴퓨터에서의 난수는 이미 정해져있다&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbwUo5/dJMcaflt21N/lo4nrmwkZrf9Ugxt9qPxP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbwUo5/dJMcaflt21N/lo4nrmwkZrf9Ugxt9qPxP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbwUo5/dJMcaflt21N/lo4nrmwkZrf9Ugxt9qPxP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbwUo5%2FdJMcaflt21N%2Flo4nrmwkZrf9Ugxt9qPxP1%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;692&quot; height=&quot;507&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;507&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;보면 srand에 매개변수로 입력한 수에 맞게 rand로 값을 뽑았을 때 위에 수열대로 나오는 걸 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;srand&lt;/b&gt;는 rand가 출력할 &lt;b&gt;시드&lt;/b&gt;를 정해주는 함수며 &lt;b&gt;rand&lt;/b&gt;는 정해진 시드에 난수들을 출력하는 것입니다.&amp;nbsp;&amp;nbsp;&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;span style=&quot;background-color: #dddddd;&quot;&gt;rand가 난수를 뽑는 원리는 알겠는데 이걸 가지고 어떻게 random을 만드나요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;예를 들어서 0 ~ 9중에서 숫자 하나를 뽑고 싶을 땐 어쩌죠?&lt;/span&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;rand를 활용해서 충분히 C#의 Random과 다른 언어의 랜덤 함수처럼 범위를 정하고 랜덤값을 뽑을 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773149187494&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;iostream&amp;gt;
using namespace std;

int main()
{
	for (int i = 0; i &amp;lt; 10; ++i)
	{
		cout &amp;lt;&amp;lt; rand() % 10 &amp;lt;&amp;lt; endl;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;rand값으로 뽑은 값들을 %(나머지 연산자)로 나눠보면 10의 배수로는 모두 나누어떨어지기 때문에 0~9까지에 수를 뽑아내는 로직을 만들 수 있습니다.&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;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;그럼 1 ~ 6처럼 0으로 시작하지않는 범위는 어떤식으로 구현할까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773149400739&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cout &amp;lt;&amp;lt; rand() % 6 + 1 &amp;lt;&amp;lt; endl;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;나머지들에 6으로 나눈 다음 나머지에 +1을 해주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;141&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHAww4/dJMcahQ8LNo/TkS0FGKQD6KC1wAHpWPDS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHAww4/dJMcahQ8LNo/TkS0FGKQD6KC1wAHpWPDS0/img.png&quot; data-alt=&quot;잘 나오는 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHAww4/dJMcahQ8LNo/TkS0FGKQD6KC1wAHpWPDS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHAww4%2FdJMcahQ8LNo%2FTkS0FGKQD6KC1wAHpWPDS0%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;141&quot; height=&quot;167&quot; data-origin-width=&quot;141&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;잘 나오는 모습&lt;/figcaption&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;span style=&quot;background-color: #dddddd;&quot;&gt;어? 근데 실행할 때마다 똑같은 수만 나와요!&lt;/span&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;srand함수가 계속 3번째 시드에서만 고르도록 설정하고 있기 때문입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 컴퓨터에서 유일하게 실시간으로 계속 바뀌는 데이터인 &quot;시간&quot;을 활용해서 가장 간단한 랜덤 알고리즘을 써보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773150949303&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;iostream&amp;gt;
using namespace std;

int main()
{
	srand((unsigned int)time(NULL));

	for (int i = 0; i &amp;lt; 10; ++i)
	{
		cout &amp;lt;&amp;lt; rand() % 10 + 1 &amp;lt;&amp;lt; endl;
	}
}&lt;/code&gt;&lt;/pre&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;b&gt;time(NULL) 또는 time(0)&lt;/b&gt;은 1970년 기준으로 현재까지 흐른 시간을&lt;b&gt; int_64형식으로 초로 반환&lt;/b&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;span style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot;&gt;하지만 time안에 들어가는 값 자체가 포인터여야하기 때문에 nullptr로 넣어주면 더 좋습니다.&lt;/span&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;srand를 현재 시간으로 갱신함으로써 실행할 때마다 다른 값이 나오게됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 알고리즘이 C++에서 구현할 수 있는 제일 쉬운 알고리즘이며 다음에는 &quot;메르센 트위스터&quot;라는 &lt;b&gt;진짜 랜덤 알고리즘&lt;/b&gt;을 알아보겠습니다.&lt;/p&gt;</description>
      <category>개발관련/C++</category>
      <author>kimyongmin519</author>
      <guid isPermaLink="true">https://kimyongmin519.tistory.com/30</guid>
      <comments>https://kimyongmin519.tistory.com/30#entry30comment</comments>
      <pubDate>Tue, 10 Mar 2026 22:59:57 +0900</pubDate>
    </item>
    <item>
      <title>[C#] Discard 무시 항목 &amp;quot;_&amp;quot; </title>
      <link>https://kimyongmin519.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;한정자 중에는 &quot;private&quot;라는 한정자가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;private한정자는 클래스 내에서만 참조할 수 있게 해주는 한정자죠.&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;하지만 C#에서는 private를 &quot;생략&quot;할 수 있습니다. 아래 코드를 보면&lt;/p&gt;
&lt;pre id=&quot;code_1772978035705&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private int a;
int a;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 두 코드는 완전히 똑같은 코드인데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 다른점은 private를 &quot;명시적&quot;으로 적어놨나 여부입니다.&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;그럼에도 사람들은 private를 적어놓는 이유는 무엇일까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 &quot;가독성&quot; 때문이죠.&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;오늘 알려드릴 &quot;_&quot; 이 문법도 가독성과 크게 연관되어있습니다.&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;b&gt;Discard _ &lt;/b&gt;이란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C#에서는 의도적으로 사용되지않은 임시변수인 Discard를 제공하묘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Discard변수는 &quot;_&quot; (언더바 또는 언더스코어라고 부름)로 표시합니다.&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;span style=&quot;background-color: #dddddd;&quot;&gt;왜 Discard를 사용해야하나요?&lt;/span&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;private와 마찬가지로 가독성 면에서 명시적으로 작성해놓으면 미래에 내가 실수를 할 수 있는걸 방지할 수 있는 것 입니다.&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;/p&gt;
&lt;pre id=&quot;code_1772979496615&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class TestBlog
{
    public static int Plus(int a, int b)
    {
        return a + b;
    }

    static void Main(string[] args)
    {
        _= Plus(10, 20);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 Plus메서드의 반환값을 받아올 공간을 Discard로 무시함으로써 스택에 공간을 마련하지않습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;이상 알아두면 좋은 Discard 문법에 대해 알아봤습니다.&lt;/p&gt;</description>
      <category>개발관련/C# (중급)</category>
      <author>kimyongmin519</author>
      <guid isPermaLink="true">https://kimyongmin519.tistory.com/29</guid>
      <comments>https://kimyongmin519.tistory.com/29#entry29comment</comments>
      <pubDate>Sun, 8 Mar 2026 23:23:02 +0900</pubDate>
    </item>
    <item>
      <title>[유니티] 지터링과 시네머신 브레인의 속성을 이용한 해결법 </title>
      <link>https://kimyongmin519.tistory.com/28</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2026-03-06 12-03-57.gif&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clB617/dJMcaadn0Z1/VG4YVodjEGXsyAmkh50PHk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clB617/dJMcaadn0Z1/VG4YVodjEGXsyAmkh50PHk/img.gif&quot; data-alt=&quot;지터링이 일어나는 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clB617/dJMcaadn0Z1/VG4YVodjEGXsyAmkh50PHk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/clB617/dJMcaadn0Z1/VG4YVodjEGXsyAmkh50PHk/img.gif&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;613&quot; height=&quot;225&quot; data-filename=&quot;2026-03-06 12-03-57.gif&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;지터링이 일어나는 모습&lt;/figcaption&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;위 GIF를 보면 시네머신을 사용한 프로젝트에서 플레이어가 끊겨보이는 현상이 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 &quot;지터링&quot;이라는 현상 때문인데요.&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;b&gt;지터링이란&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카메라 좌표계가 정밀한 좌표 계산을 할 때 발생하는 미세한 떨림 및 끊김 증상을 말합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;유니티에서는 이 문제를 어떻게 해결할까?&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbuGX4/dJMcaaj9nzp/WitV1DVPiobKJSh9crKCN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbuGX4/dJMcaaj9nzp/WitV1DVPiobKJSh9crKCN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbuGX4/dJMcaaj9nzp/WitV1DVPiobKJSh9crKCN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbuGX4%2FdJMcaaj9nzp%2FWitV1DVPiobKJSh9crKCN1%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;544&quot; height=&quot;263&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Update Method&lt;/b&gt;항목과&lt;b&gt; Blend Update Method&lt;/b&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;b&gt;Update Method&lt;/b&gt;: 시네머신이 언제 카메라의 위치, 회전값 등등을 어떻게 계산할 것이냐 여부&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Blend Update Method&lt;/b&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;2가지 프로퍼티는 간단하게 카메라의 변화값들을 어느 타이밍에 계산할지 여부인데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnBypH/dJMcac3iV6n/Go2xg6O66QKWGMVf4ELNi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnBypH/dJMcac3iV6n/Go2xg6O66QKWGMVf4ELNi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnBypH/dJMcac3iV6n/Go2xg6O66QKWGMVf4ELNi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnBypH%2FdJMcac3iV6n%2FGo2xg6O66QKWGMVf4ELNi0%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;518&quot; height=&quot;119&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&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;설정할 수 있는 값들을 보면 여러가지 Update들이 있는데, Fixed Update와 Late Update는 알더라도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Update Method안에 &lt;b&gt;Smart Update&lt;/b&gt;와&lt;b&gt; Manual Update&lt;/b&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;b&gt;Smart Update&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부적으로 추적대상을 실시간으로 감지해서 지터링이 일어나지 않게끔 타이밍을 계산하는 업데이트.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;b&gt;Manual Update&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카메라의 전환을 수동으로 제어하는 업데이트이며, 이 속성을 키면 Update나 Fixed Update 등등의 영향을 받지않고 오직 개발자가 CinemachineBrain.ManualUpdate()를 호출해야만 갱신되는 업데이트.&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;자 그러면 현재 문제가 일어나는 프로젝트에서는 Update Method가 Late Update로 되어있으며 Blend Update Method도 Late update로 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Smart Update로 바꿔서 실행해보면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2026-03-06 16-16-45.gif&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ripsI/dJMcacWx0aA/qNBxb6WeTv06TwKS7oguP0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ripsI/dJMcacWx0aA/qNBxb6WeTv06TwKS7oguP0/img.gif&quot; data-alt=&quot;부드럽게 잘 움직이는 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ripsI/dJMcacWx0aA/qNBxb6WeTv06TwKS7oguP0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ripsI/dJMcacWx0aA/qNBxb6WeTv06TwKS7oguP0/img.gif&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;573&quot; height=&quot;322&quot; data-filename=&quot;2026-03-06 16-16-45.gif&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;부드럽게 잘 움직이는 모습&lt;/figcaption&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;만약 이래도 해결이 되지않는다면 캐릭터의 움직임은 물리기반으로 움직이고 있으니 Update Method나 Blend Update Method를 Fixed Update로 바꾸면 해결이 됩니다.&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;/p&gt;</description>
      <category>개발관련/유니티</category>
      <author>kimyongmin519</author>
      <guid isPermaLink="true">https://kimyongmin519.tistory.com/28</guid>
      <comments>https://kimyongmin519.tistory.com/28#entry28comment</comments>
      <pubDate>Fri, 6 Mar 2026 16:22:33 +0900</pubDate>
    </item>
    <item>
      <title>[C#] 프로그래밍과 C# </title>
      <link>https://kimyongmin519.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;C#으로 처음 코딩을 시작하는 분들 위한 가이드입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 프로그래밍 기본배경지식과 C#을 소개하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;프로그래밍이란?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;프로그램을 제작한다&quot;라는 뜻으로 말 그대로 프로그램을 제작하는 뜻입니다.&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;컴퓨터는 0과 1로 이루어져있는 2진수 명령어 집합인 기계어를 통해 연산등을 수행하는데 문제는 기계어는 사람이 해석하기 너무 복잡하다는 것입니다.&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;그렇게하여 나온 것이 &quot;어셈블리어&quot;로 어셈블리어는 기계어 명령을 기호나 단어로 바꿔 만들었습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어셈블리어로 사람이 코드를 작성해 일종의 번역과정을 거쳐 기계어 코드로 변환되는데 이 과정을 &quot;컴파일&quot;이라고합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래머가 어셈블리어로 코드를 작성하면 &quot;컴파일러&quot;라는 소프트웨어를 이용하여 실행파일을 만들며 이 실행파일을 우리는 프로그램이라고 부릅니다.&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;어셈블리어처럼 프로그램 작성을 위해(사람이 쓸 수 있게) 만든 인공 언어 체계를 &quot;프로그래밍 언어&quot;라고 하며 이후 더 효율적인 개발을 위해 만들어진 것들이 우리가 아는 C#, C++, Java, Python... 등등인 &quot;고급언어&quot;들인 것입니다.&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;b&gt;컴파일러와 인터프리터&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞써 말했듯이 컴파일러는 소스코드를 컴파일해 실행파일을 만듭니다. 프로그램을 실행할려면 실행파일만 있으면 되며 소스코드는 필요하지않지만 반면에 &quot;인터프리터&quot;라는 녀석은 소스코드를 실시간으로 한줄씩 번역하여 실행해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중요 용어 정리:&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;266&quot; data-end=&quot;313&quot; data-ke-size=&quot;size16&quot;&gt;프로그래밍 언어: 사람이 컴퓨터에게 명령을 내리기 위해 만든 인공적인 언어 체계.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;266&quot; data-end=&quot;313&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;315&quot; data-end=&quot;392&quot; data-ke-size=&quot;size16&quot;&gt;고급 언어: 사람이 이해하고 작성하기 쉽도록 만들어진 프로그래밍 언어.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;315&quot; data-end=&quot;392&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;394&quot; data-end=&quot;422&quot; data-ke-size=&quot;size16&quot;&gt;소스코드: 프로그래밍 언어로 작성된 원본 코드.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;394&quot; data-end=&quot;422&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;424&quot; data-end=&quot;460&quot; data-ke-size=&quot;size16&quot;&gt;컴파일: 소스코드를 기계어(또는 중간 코드)로 변환하는 과정.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;424&quot; data-end=&quot;460&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;462&quot; data-end=&quot;501&quot; data-ke-size=&quot;size16&quot;&gt;컴파일러: 컴파일 과정을 수행하여 실행 파일을 생성하는 소프트웨어.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;462&quot; data-end=&quot;501&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;549&quot; data-end=&quot;608&quot; data-ke-size=&quot;size16&quot;&gt;인터프리터: 소스코드를 실행 시점에 한 줄씩 해석하여 바로 실행하는 방식 또는 이를 수행하는 프로그램.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;608&quot; data-start=&quot;549&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;608&quot; data-start=&quot;549&quot; data-ke-size=&quot;size16&quot;&gt;다른 글도 있으니 읽어보시고 다음에는 예제 코드를 통해서 기본개념들을 알아보겠습니다.&lt;/p&gt;
&lt;p data-end=&quot;608&quot; data-start=&quot;549&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;608&quot; data-start=&quot;549&quot; data-ke-size=&quot;size14&quot;&gt;(이 글은 &quot;이것이 C#이다(3판)&quot; 3~9쪽을 참고하여 작성되었습니다. 자세한 내용은 책을 참고해보세요!)&lt;/p&gt;</description>
      <category>개발관련/C# (입문)</category>
      <author>kimyongmin519</author>
      <guid isPermaLink="true">https://kimyongmin519.tistory.com/27</guid>
      <comments>https://kimyongmin519.tistory.com/27#entry27comment</comments>
      <pubDate>Sun, 15 Feb 2026 16:14:22 +0900</pubDate>
    </item>
  </channel>
</rss>