<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sour_gexko.log</title>
        <link>https://velog.io/</link>
        <description>개발자가 되고싶은 직장인</description>
        <lastBuildDate>Tue, 30 Sep 2025 05:10:44 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. sour_gexko.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sour_gexko" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Nomad Coder AI Agents 마스터클래스 구매완료!]]></title>
            <link>https://velog.io/@sour_gexko/Nomad-Coder-AI-Agents-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%81%B4%EB%9E%98%EC%8A%A4-%EA%B5%AC%EB%A7%A4%EC%99%84%EB%A3%8C</link>
            <guid>https://velog.io/@sour_gexko/Nomad-Coder-AI-Agents-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%81%B4%EB%9E%98%EC%8A%A4-%EA%B5%AC%EB%A7%A4%EC%99%84%EB%A3%8C</guid>
            <pubDate>Tue, 30 Sep 2025 05:10:44 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/sour_gexko/post/2e0c7f17-f9d0-43ed-a956-d6a60f46abde/image.png" alt=""></p>
<p>Codex를 쓰면서, 프로젝트를 하던 도중, AI Agents에 대해 놀라게 되었고, 더 깊이있게 파야겠다는 생각을 했다. 하지만 혼자서 파려면, 엄청난 시간이 필요할 것이고, 나에게는 그런 에너지도 남아있지 않다 ㅎㅎ </p>
<p>코딩을 처음 시작할 때부터 들었던 니코 쌤이라면, 나에게 엄청난 것들을 퍼먹여주실 수 있을거라는 생각에 오랜만에 강의를 구매해본다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Visual Studio Code - Material Icon Theme Customize 해보자]]></title>
            <link>https://velog.io/@sour_gexko/Visual-Studio-Code-Material-Icon-Theme-Customize</link>
            <guid>https://velog.io/@sour_gexko/Visual-Studio-Code-Material-Icon-Theme-Customize</guid>
            <pubDate>Sun, 13 Mar 2022 12:43:53 GMT</pubDate>
            <description><![CDATA[<h2 id="개요">개요</h2>
<p>Material Icon Theme를 사용하면서, 해당 Extension에서 정해준 폴더명으로 했을 시에만 Icon이 적용이 된다.
내가 자주 사용하는 폴더명이 있는데, 어떤 폴더은 Icon이 적용이 되고, 어떤 폴더는 안되니 디렉토리탐색창에서 가독성(?)이 떨어진다.
찾아보니 됨.</p>
<h2 id="settingsjson">settings.json</h2>
<pre><code>  &quot;material-icon-theme.folders.associations&quot;: {
    &quot;sample1&quot;: &quot;sample2&quot;,
  },</code></pre><p><a href="https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme">https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme</a>
에 나와있는 아이콘 명을 참고하여,
settings.json에서 위와같이 작성.
sample1은 해당 아이콘을 배치할 폴더명, sample2에는 아이콘명을 작성하면 된다</p>
<h2 id="예시">예시:</h2>
<pre><code>  &quot;material-icon-theme.folders.associations&quot;: {
    &quot;domain&quot;: &quot;container&quot;,
    &quot;presentation&quot;: &quot;mobile&quot;,
    &quot;repository&quot;: &quot;interface&quot;
  },</code></pre><h2 id="전">전:</h2>
<p><img src="https://images.velog.io/images/sour_gexko/post/8368f059-68ec-4d43-b9bf-eb4e266d8abe/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.44.46.png" alt=""></p>
<h2 id="후">후:</h2>
<p><img src="https://images.velog.io/images/sour_gexko/post/1a9afcc2-3785-4ea9-9061-3d9d9d0e68cf/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.44.38.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[C# - 재귀 함수(Recursive Function)]]></title>
            <link>https://velog.io/@sour_gexko/C-%EC%9E%AC%EA%B7%80-%ED%95%A8%EC%88%98Recursive-Function</link>
            <guid>https://velog.io/@sour_gexko/C-%EC%9E%AC%EA%B7%80-%ED%95%A8%EC%88%98Recursive-Function</guid>
            <pubDate>Sun, 28 Mar 2021 12:31:54 GMT</pubDate>
            <description><![CDATA[<h3 id="재귀-함수recursive-function">재귀 함수(Recursive Function)</h3>
<ul>
<li>이미 해결한 작은 문제에 더 큰 문제를 해결하는 방법</li>
<li>프로그래밍에서는 함수 A가 매개변수만 바꾸어 다시 함수A를 호출하는 방법으로 구현<pre><code>recursive(형용사): 반복되는</code></pre><pre><code>static uint SumRecursive(uint num)
{
  if (num == 0)
  {
      return 0; // 종료조건 (base case)
  }
  else
  {
      return num + SumRecursive(num -1);
      // 재귀 호출 (recursive function)
  }
}
</code></pre></li>
</ul>
<p>static void Main(string[] args)
{
    Console.WriteLine(SumRecursive(3));
}</p>
<pre><code>
### 재귀 함수의 구성요소
- 종료조건 (ending condition, base case)
   - 더 이상 재귀 함수를 호출하지 않고 값을 반환하는 조건
   - 매우 간단히 함수의 반환 값을 찾을 수 있는 경우
   - 이것이 없으면 무한루프에 빠진다.
- 재귀적 함수 호출
   - 종료조건이 아닌 경우
   - 함수의 인자를 바꿔 스스로를 다시 호출
   - 이 때, 함수의 인자는 현재 문제보다 작은 문제를 대표해야함
   - 즉, 동일한 동작을 보다 작은 문제에 적용

### 반복문과의 비교
- 모든 재귀 함수는 반복문으로 해결 가능
- 복잡한 문제일수록 재귀 함수가 더 편함
   - 이진 검색
   - 트리 구조
   - 퀵 정렬
   - 하노이의 탑
   - 어떤 폴더 아래에 있는 모든 파일 목록 구하기

### 피보나치 수열 (Fibonacci)
- 제 0항은 0, 제 1항은 1이며, 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열</code></pre><p>0 1 1 2 3 5 8 13 21 34 55 ...</p>
<pre><code>- 수학적 정의
   - F₀ = 0
   - F₁= 1,
   - Fₙ = Fₙ-1 + Fₙ-2, (n &gt; 1)
</code></pre><p>using System;</p>
<p>namespace _Fibonacci
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write(Fibonacci(5)); 
        }</p>
<pre><code>    static uint Fibonacci(uint number)
    {
        if (number == 0)
        {
            return 0;
        }
        if (number == 1)
        {
            return 1;
        }
        return Fibonacci(number - 1) + Fibonacci(number - 2);
    }
}</code></pre><pre><code>
- 함수는 신뢰의 문제
- 재귀 함수는 더 큰 신뢰를 요구

### 재귀적 해결법 = 논리력
- 프로그래머의 논리력을 평가하기에 적합
- 매우 큰 문제를 작게 쪼개서 증명할 수 있나
   - 절대 틀릴 수 없는 최소한의 문제를 품
   - 최소한 문제의 해법에 의존하여 그 보다 하나 더 큰 문제를 해결
   - 그 과정을 반복하면 논리적으로 최종 문제까지 해결
- 수학적 귀납법과 매우 밀접

### 하노이의 탑으로 이해하는 재귀 함수
- 막대 세 개가 있고, 한 막대에 n개의 원판이 있음
   - n개의 원판에서 상위 n-1개를 다른 막대에 옮길 수 있다고 가정
      - n-1개의 원판을 중간 막대로 옮김
      - 마지막 n번째 원판은 목적지 막대에 옮김
      - 중간 막대에 있던 n-1개의 원판을 목적지 막대에 옮김

 - 막대 세 개가 있고, 한 막대에 n-1개의 원판이 있음
    - n-1개의 원판에서 상위 n-2개를 다른 막대에 옮길 수 있다고 가정
       - n-2개의 원판을 중간 막대로 옮김
       - 마지막 n-1번째 원판은 목적지 막대에 옮김
       - 중간 막대에 있던 n-2개의 원판을 목적지 막대에 옮김

- 막대 세 개가 있고, 한 막대에 2개의 원판이 있음
    - 2개의 원판에서 상위 1개를 다른 막대에 옮길 수 있다고 가정
       - 1개의 원판을 중간 막대로 옮김
       - 마지막 2번째 원판은 목적지 막대에 옮김
       - 중간 막대에 있던 1개의 원판을 목적지 막대에 옮김

- 막대 세 개가 있고, 한 막대에 1개의 원판이 있음
   - 1개의 원판을 다른 막대에 옮길 수 있음
      - 1개의 원판을 목적지 막대로 옮김
      - 종료 조건이 참이므로 위의 모든 과정이 참이 됨

### 재귀 함수의 장점
- 개념적으로 매우 훌륭함
- 증명이 가능함

### 재귀 함수의 단점
- 효율성이 떨어짐
- 반복문은 그런 문제가 없음: 이전 연산의 결과를 저장(캐싱)하기 때문
- 스택오버플로우 (Stack Overflow)
   - 함수 호출 깊이에는 제한이 있음

### 베스트 프랙티스
- 캐싱 없이 간단한 반복문으로 작성 가능한 문제는 반복문으로
   - 예: 1~N까지 수의 합 구하기
- 그 외에는 재귀 함수로 우선 작성
   - 설계 및 이해가 용이하기 때문
- 다음의 경우에는 반복문으로 코드 리팩토링(code refacktoring)
   - 함수 호출의 최대 깊이를 확정할 수 없음
   - 또는, 성능상의 문제를 발견


### 재귀 팩토리얼(factorial)</code></pre><p>using System;</p>
<p>namespace _20210327
{
    class Program
    {
        static void Main(string[] args)
        {
            const ulong FACTORIAL = 10;
            Console.Write(&quot;NonRecursiveFactorial: &quot;);
            Console.WriteLine(NonRecursiveFactorial(FACTORIAL));</p>
<pre><code>        Console.Write(&quot;RecursiveFactorial: &quot;);
        Console.WriteLine(RecursiveFactorial(FACTORIAL));
    }
    static ulong NonRecursiveFactorial(ulong n)
    {
        if (n &lt;= 1)
        {
            return 1;
        }
        uint factorial = 1;

        for (uint i = 2; i &lt;= n; i++)
        {
            factorial *= i;
        }

        return factorial;
    }

    static ulong RecursiveFactorial(ulong n)
    {
        if (n==0)
        {
            return 1;
        }
        return RecursiveFactorial(n - 1) * n;
    }
}</code></pre><p>}</p>
<p>```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[C# - 어서트(assert)]]></title>
            <link>https://velog.io/@sour_gexko/%EC%96%B4%EC%84%9C%ED%8A%B8assert</link>
            <guid>https://velog.io/@sour_gexko/%EC%96%B4%EC%84%9C%ED%8A%B8assert</guid>
            <pubDate>Sat, 27 Mar 2021 11:46:54 GMT</pubDate>
            <description><![CDATA[<h3 id="코드-검증을-위한-코드---어서트">코드 검증을 위한 코드 - 어서트</h3>
<ul>
<li>절대로 발생하지 않아야 하는 조건을 런타임 중에 검사<ul>
<li>만약 발생한다면 코드가 올바르게 동작하지 않는다는 의미</li>
<li>함수의 선조건 검사에 쓰기 적당</li>
</ul>
</li>
<li>디버그 모드에서만 동작<ul>
<li>릴리즈 모드에서는 어서트 함수는 무시됨</li>
<li>릴리즈 모드에서 동작하면 성능 저하가 발생</li>
</ul>
</li>
<li>최종 제품의 성능저하 없이 개발 중에 문제를 고치는 바람직한 방법<pre><code>enum EMenu
{
  Menu1 = 1,
  Menu2,
  Menu3,
  Menu4,
  Menu5,
  Count
}
</code></pre></li>
</ul>
<p>static double GetPrice(EMenu menu)
{
    switch (menu)
    {
          case EMenu.Menu1:
              return 10000,
          case EMenu.Menu2:
              return 11000,
          case EMenu.Menu3:
              return 12000,
          case EMenu.Menu4:
              return 13000,
          case EMenu.Menu5:
              return 14000,
          default:
              Debug.Assert(menu &lt; EMenu.Count, &quot;Wrong Menu Number&quot;);
              return -1; 
              // menu &lt; EMenu.Count 대신 false 사용 가능
    }
}</p>
<pre><code>### Debug.Assert()
- 사용하기 위해서는 System.Diagnostics 라이브러리를 추가해야함</code></pre><p>using System.Diagnostics;</p>
<pre><code>- Assert()안에 들어가는 조건이 거짓일 때 프로그램은 일시 중단되고, 어서트 메시지가 출력창에 출력

### Debug.Assert() 호출하기
- 방식1</code></pre><p>Debug.Assert(menu &lt; 5);
Debug.Assert(&lt;표현식&gt;)</p>
<pre><code>- 방식2 - 어서트가 일어날 때 보여줄 메시지를 함께 작성</code></pre><p>Debug.Assert(menu &lt; 5, &quot;Wrong menu number&quot;);
Debug.Assert(&lt;표현식&gt;, &lt;메시지&gt;);</p>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[C# - 열거형(enum)]]></title>
            <link>https://velog.io/@sour_gexko/%EC%97%B4%EA%B1%B0%ED%98%95enum</link>
            <guid>https://velog.io/@sour_gexko/%EC%97%B4%EA%B1%B0%ED%98%95enum</guid>
            <pubDate>Sat, 27 Mar 2021 11:28:55 GMT</pubDate>
            <description><![CDATA[<h3 id="열거형enumerated-type">열거형(Enumerated Type)</h3>
<pre><code>enumerate (동사)
열거하다, 나열하다</code></pre><ul>
<li>정수형 상수의 집합</li>
<li>각 원소마다 고유의 이름을 가짐</li>
<li>집합 역시 고유의 이름을 가짐</li>
<li>enum은 변수로 사용 가능</li>
<li>실수를 줄여준다.</li>
</ul>
<h3 id="열거형-정의기본형">열거형 정의(기본형)</h3>
<ul>
<li>정의는 함수 밖에서 함.</li>
<li>첫 번째 원소의 기본값은 0</li>
<li>아무 값도 대입해주지 않으면 원소의 값은 1씩 증가<pre><code>enum EDirection
{
  North,
  South,
  East,
  West
}</code></pre></li>
</ul>
<h3 id="열거형-정의원소-값-직접-정의">열거형 정의(원소 값 직접 정의)</h3>
<pre><code>enum EDirection
{
    North = 5,
    South = 10,
    East = 15,
    West = East + 10
}</code></pre><pre><code>enum EDirection
{
    North = 5,
    South, // 6
    East, // 7
    West //8
}

// 메인 함수
EDirection direction;</code></pre><ul>
<li>각 원소에 원하는 값 대입 가능: 상수 혹은 계산식</li>
<li>부동소수점은 안됨.</li>
<li>대입 없이 변수를 정의만 하면 기본값으로 0이 들어감.<pre><code>&lt;열거형 이름&gt;&lt;변수명&gt; = &lt;열거형 이름&gt;.&lt;열거형 원소&gt;;</code></pre></li>
</ul>
<h3 id="문제점">문제점</h3>
<ul>
<li>함수는 블랙박스 -&gt; 내부 구현을 몰라도 쓸 수 있어야함.</li>
<li>함수 시그니쳐만 보고 direction에 어떤 값이 들어갈지 유추 불가</li>
<li>결국 함수 구현부를 봐야 함.</li>
<li>만약 누군가가 함수 바디를 안보고 시그니쳐만 보고 판단하면 잘못된 인자를 넘길 가능성이 있음.</li>
</ul>
<h3 id="enum을-쓰면-좋은점">enum을 쓰면 좋은점</h3>
<ul>
<li>코드가 읽기 좋아짐</li>
<li>다른 값이 들어가면 컴파일 오류 발생 -&gt; 문제 발생 여지를 사전예방</li>
<li>함수 매개변수를 쓰이면 함수가 요구하는 인자형을 빨리 알 수 있음 -&gt; 함수에 잘못된 값이 넘어가는 걸 예방</li>
</ul>
<h3 id="enum-꼼수---배열-만들기">enum 꼼수 - 배열 만들기</h3>
<pre><code>enum EDirection
{
    North,
    South,
    East,
    West,
    MAX,
};

// 어느 함수
string[] directions = new string[(int)EDirection.MAX];
for (int i = 0; i &lt; directions.Length; ++i)
{
    // 코드
}</code></pre><h3 id="코딩-표준">코딩 표준</h3>
<ul>
<li>유사한 성질을 가진 정보들을 나열해야 할 때 정수형 상수보다는 enum을 사용할 것</li>
<li>열거형에서 char를 사용 할 수 있음(정수형이기 때문에)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[C# - 함수(Function)]]></title>
            <link>https://velog.io/@sour_gexko/%ED%95%A8%EC%88%98Function</link>
            <guid>https://velog.io/@sour_gexko/%ED%95%A8%EC%88%98Function</guid>
            <pubDate>Sat, 27 Mar 2021 11:05:35 GMT</pubDate>
            <description><![CDATA[<h3 id="반올림하는-코드">반올림하는 코드</h3>
<pre><code>num = (int)(num * 10 + 0.5) / 10.0 // 반올림
num = (int)(num * 10) / 10.0 // 버림</code></pre><p>0.5 미만의 수는 0.5를 더해도 첫째자리 수가 변하지 않지만,
0.5 이상의 수는 0.5를 더하면 첫째자리 수가 변한다.</p>
<h3 id="함수의-필요성">함수의 필요성</h3>
<p>중복코드를 방지하고, 유지 보수에 편하다. 재활용성이 올라간다.</p>
<h3 id="수학에서-말하는-함수">수학에서 말하는 함수</h3>
<p>집합 Y의 원소가 집합X의 각 원소에 오직 하나씩만 대응할 때, 이 대응f를 집합X에서 집합Y로의 함수라 함.</p>
<h3 id="프로그래밍에서의-함수">프로그래밍에서의 함수</h3>
<p>함수에 입력이 들어가면 어떤 결과가 출력</p>
<h3 id="함수-정의definition">함수 정의(definition)</h3>
<pre><code>static &lt;반환형&gt; &lt;함수형&gt;(&lt;매개변수 목록&gt;)
{
    // 함수 Body
}</code></pre><p>함수를 정의할 때는 다음 것들을 포함해야함</p>
<ul>
<li>함수 시그니쳐<ul>
<li>static</li>
<li>함수명(필수)</li>
<li>매개변수 목록(선택)<ul>
<li>입력값</li>
<li>int, byte와 같은 자료형 뿐만 아니라, int[], string[]같은 배열도 가능</li>
<li>함수는 0개 이상의 매개변수를 가짐(필수가 아님)</li>
<li>인자(Arguments)라고도 함.</li>
</ul>
</li>
</ul>
</li>
<li>반환형(필수) : 반환형이 없다면 void를 사용한다.<ul>
<li>반환형이 void가 아닐 경우, 함수 Body에 return 키워드를 이용해 데이터를 반환해야함.</li>
</ul>
</li>
<li>함수 Body(필수)</li>
</ul>
<h3 id="배열의-길이---length">배열의 길이 - Length</h3>
<pre><code>string[] args;
int length = arg.Length;</code></pre><ul>
<li>C#에서는 프로퍼티(property)라고 함.</li>
<li>배열의 길이를 알려준다.</li>
</ul>
<h3 id="함수명-함수body">함수명, 함수Body</h3>
<pre><code>static int Add(int op1, int op2)
{
    return op1 + op2;
}</code></pre><ul>
<li>함수가 어떤 기능을 가졌는지 알 수 있게 지으면 가독성 증가</li>
<li>함수는 블랙박스 -&gt; 어떤 입력을 넣으면 함수 내부구조를 알지 못해도 어떤 출력이 나오는지 알 수 있어야함. (함수명의 중요성)</li>
</ul>
<h3 id="함수호출">함수호출</h3>
<pre><code>static void Main(string[] args)
{
    int result = Add(1, 2)
}</code></pre><ul>
<li>함수 호출 시 인자는 변수, 상수 모두 가능</li>
</ul>
<h3 id="함수는-반드시-블랙박스여야함">함수는 반드시 블랙박스여야함</h3>
<ul>
<li>가독성을 위해</li>
<li>함수는 함수 호출자에 대해서 알아서는 안됨.</li>
<li>호출자가 함수 내부를 알 필요가 없게 함수명을 명확하게 지어야함.</li>
</ul>
<h3 id="코딩-표준-함수-이름-짓기">코딩 표준: 함수 이름 짓기</h3>
<ul>
<li>정확하게 어떤 기능을 하는지 알려주는 단어 사용<ul>
<li>동사로 시작할 것.</li>
<li>제일 첫 글자는 대문자로 (C#에서는...)</li>
</ul>
</li>
<li>여러 단어를 연결한다면 두 번째 단어에서는 첫 글자를 대문자로<ul>
<li>파스칼 표기법(Pascal Case)라고 함.<pre><code>PrintFullName</code></pre></li>
</ul>
</li>
</ul>
<h3 id="코딩-표준-매개변수와-지역변수-이름-짓기">코딩 표준: 매개변수와 지역변수 이름 짓기</h3>
<ul>
<li>정확하게 어떤 정보를 담는지 알려주는 단어 사용<ul>
<li>명사를 사용할 것</li>
<li>제일 첫 글자는 소문자로 시작할 것</li>
</ul>
</li>
<li>여러 단어를 연결한다면 &#39;낙타표기법(Camel Case)&#39;를 사용할 것</li>
</ul>
<h3 id="선조건precondition과-후조건postcondition">선조건(Precondition)과 후조건(Postcondition)</h3>
<ul>
<li>함수가 무슨 일을 하는지에 대한 약속</li>
<li>선조건<ul>
<li>함수 실행 시작 전에 참으로 가능한 조건</li>
<li>예) Divide()함수는 분모가 0이 아니여야 한다.</li>
<li>함수 이름이나 매개변수로 유추 가능하다, 부족하면 주석으로 추가 설명</li>
</ul>
</li>
<li>후조건<ul>
<li>함수 실행 후에 보장되는 조건</li>
<li>예) 두 정수를 더하면 정수의 결과가 나온다.</li>
<li>보통 함수 이름과 반환형으로 유추 가능</li>
</ul>
</li>
<li>선조건을 만족하지 못하면 후조건을 보장할 수 없음.</li>
</ul>
<h3 id="선조건을-명시한-주석">선조건을 명시한 주석</h3>
<ul>
<li>문서주석(Documentation Comment)라 부름.</li>
<li>비주얼 스튜디오에서는 슬래시(/)를 세 번 입력하면 자동으로 생성</li>
</ul>
<h3 id="범위scope">범위(Scope)</h3>
<ul>
<li>기본적으로 어떤 범위 안에 선언된 것은 범위 밖에서 쓰지 못함</li>
<li>상위 범위에서 선언한 변수/상수는 하위 범위에서 사용 가능</li>
</ul>
<h3 id="값에-의한-전달">값에 의한 전달</h3>
<ul>
<li>원본 변수 != 인자<ul>
<li>함수 매개변수에 원본 변수의 사본이 전달된다.</li>
</ul>
</li>
<li>호출된 함수(reciever)의 인자 값이 변경되어도 호출자(caller) 함수에 반영되지 않음.</li>
</ul>
<h3 id="원본-변수를-바꾸는-법">원본 변수를 바꾸는 법</h3>
<pre><code>class Program
{
    static void Square(ref double number)
    {
        number *= number;
    }

     static void Main(string[] args)
     {
         double number = 5;
        Console.WriteLine(${&quot;Before: {number}&quot;);
        Square(ref number);
        Console.WriteLine(${&quot;after: {number}&quot;);
     }
}</code></pre><ul>
<li>참조에 의한 전달 (Call by Reference)</li>
<li>인자 앞에 ref를 붙여준다.</li>
<li>원본 변수 = 인자</li>
<li>호출된 함수(reciever)의 인자의 값이 변경되면 호출자 함수(caller)에 반영</li>
<li>원본에 손상이 있을 수 있기 때문에 주의.</li>
</ul>
<h3 id="best-practice-함수-대신-중괄호">Best Practice: 함수 대신 중괄호</h3>
<ul>
<li>모든 코드를을 함수로 분리 할 필요는 없음.</li>
<li>함수가 길어지면 동일한 이름의 지역변수가 생기는 경우가 있음. -&gt; 중괄호를 사용하여 범위를 분리시킴.</li>
</ul>
<h3 id="best-practice-함수-대신-region과-endregion">Best Practice: 함수 대신 #region과 #endregion</h3>
<ul>
<li>C# 전용</li>
<li>긴 함수를 짧게 만들 수 있는 방법.</li>
<li>비주얼 스튜디오에서 코드를 접거나 펼 수 있게 해줌<pre><code>#region &lt;이름&gt;
// Code
#endregion</code></pre></li>
<li>함수를 따로 작성할 필요가 없음.</li>
<li>결론: 함수는 코드 중복을 피하기 위해서 만들어라.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[C# - 다차원 배열(Multidimensional Array)]]></title>
            <link>https://velog.io/@sour_gexko/%EB%8B%A4%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4Multidimensional-Array</link>
            <guid>https://velog.io/@sour_gexko/%EB%8B%A4%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4Multidimensional-Array</guid>
            <pubDate>Sat, 27 Mar 2021 09:43:46 GMT</pubDate>
            <description><![CDATA[<h3 id="2차원-배열">2차원 배열</h3>
<p>2차원 배열이 사용되는 예제: 2d게임, 온라인쇼핑몰, 테이블형 데이터, 구구단</p>
<pre><code>        static void Main(string[] args)
        {
            int[,] table = new int[9, 9];

            for (int i = 0; i &lt; 9; ++i)
            {
                for (int j = 0; j &lt; 9; ++j)
                {
                    table[i, j] = (i + 1) * (j + 1);
                    Console.Write($&quot;{(i+1),2} * {j+1,-2} = {table[i, j], -3}&quot;);
                }
                Console.WriteLine(&quot;&quot;);
            }
        }</code></pre><h3 id="2차원-배열-선언하기">2차원 배열 선언하기</h3>
<pre><code>int[,] table = new int[2, 4]; // 행, 열 순서로
&lt;자료형&gt;[,] &lt;변수명&gt; = new &lt;자료형&gt;[&lt;행의 개수&gt;, &lt;열의 개수&gt;] {{&lt;데이터&gt;}, {&lt;데이터&gt;}};</code></pre><ul>
<li>[,]은 2차원을 의미 -&gt; int[,]은 int형 2차원 배열을 의미</li>
</ul>
<h3 id="for-문-속-for-문">for 문 속 for 문</h3>
<ul>
<li>2차원 배열을 순차적으로 접근하기 위해서는 for문이 두개 필요<pre><code>int[,] table = new int[2, 3];
</code></pre></li>
</ul>
<p>for (int i = 0; i &lt; 2; ++i)
{
    for (int j = 0; j &lt; 3; ++j)
    {
        table[i, j] = (i + 1) * (j + 1);</p>
<pre><code>}</code></pre><p>]</p>
<p>```</p>
<h3 id="3차원-배열">3차원 배열</h3>
<ul>
<li>많이 쓰이지는 않음</li>
<li>주로 3차원 정보를 처리하는 프로그램 사용 (3D 블록데이터를 저장하는 게임, 의료프로그램(CT, MRI)</li>
</ul>
<h3 id="n차원">n차원</h3>
<ul>
<li>물리 시뮬레이션</li>
<li>머신 러닝</li>
<li>반복문이 많아질 수록 성능은 떨어진다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[시작]]></title>
            <link>https://velog.io/@sour_gexko/%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@sour_gexko/%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Fri, 26 Mar 2021 11:21:01 GMT</pubDate>
            <description><![CDATA[<h1 id="음악">음악</h1>
<p>저는 원래 음악프로듀서를 꿈꾸던 음악인이었습니다. 음악인이라고 하기엔 아무것도 이룬게 없지만, 나름 자부심을 가지고 음악에 임했었습니다. 친구들과 음원 발매도 해보고 실용음악과를 다니며 “Max Martin” 혹은 국내의 “테디”같은 프로듀서가 되거나 한국의 “Daft Punk”가 되겠다는 꿈을 가졌습니다. 하지만 저는 실용음악과라는 울타리에 갇혀 현재에 안도하고 시간을 그저 흘려 보냈습니다. 결국에 지금은 평범한 중소기업에서 일반직장인으로 일을 하고있습니다.</p>
<h1 id="포기하면-편하다">포기하면 편하다</h1>
<p>4년제 대학을 졸업했지만 실용음악과라는 특성에 제가 당장 돈을 벌 수단은 없었습니다. “인공지능 멜로디 작곡로봇”을 위한 미디 카피 정도가 있었지만 일시적이였고, 이쪽 바닥은 대학전공관련 취업자수가 현저히 적기 때문에 제가 할 수 있었던 것은 요식업 알바 경험을 통한 프랜차이즈 식당 주방직원이였습니다. 하루 10-12시간 일을 하며 음악에 대한 꿈을 놓지 않고 싶었지만, 꿈과 현실의 괴리만 점점 커질뿐이였습니다. 그렇게 2-3년을 보내고 나니, 결국 음악을 포기하고 중소기업에 입사하게 됩니다. 정말 맞는 말이였습니다.</p>
<h3 id="포기하면-편하다-1">“포기하면 편하다”</h3>
<h1 id="갑자기-굴러들어온-개발">갑자기 굴러들어온 개발</h1>
<p>누구나 실패는 겪어보지 않겠습니까.. 다만 똑같은 실수를 하면 안되는 것이죠. 저는 나약했고, 제 인생을 되돌아보면 정말 실수 투성이의 인생을 살아왔다라는 생각이 듭니다. 음악 하면서 반지하에서 라면만 먹고 살아도 상관없다, 내 인생은 음악이다라는 생각으로 살아왔지만 사람이 한순간에 변하더군요. IT, 서비스 관련 중소기업에서 일을 하다보니 “개발”이라는 것에 관심이 생겼습니다. 사실 컴퓨터를 통한 미디음악을 할 때에도 컴퓨터에 관심이 많아 C, C++, Max for Live, Interactive Music with Arduino이라는 용어를 들어보며 배우고싶다는 생각이 들긴 했었습니다. 그렇게 개발에 점점 관심이 생겼고, 어느 순간 시간만 나면 컴퓨터 개발에 대한 정보를 찾고있는 제 자신을 발견하게 되었습니다. 그렇게 저는 개발자라는 두번째 꿈을 갖게 되었습니다.</p>
<h1 id="배울게-산더미다">배울게 산더미다</h1>
<p>찾다가보니 알아야될것들, 배울것들이 너무 많더군요. 컴퓨터에 대해서는 아무런 지식도 없으니 막막했습니다. 개발자가 되고 싶은 꿈이 생겼지만, 저같은 비전공자가 컴퓨터공학과 졸업생들과 어떻게 경쟁하나라는 두려움과 새로운 시작을 하기에는 조금은 늦은 나이 등등 두려움이 많습니다. 하지만 용기를 내고 조금씩 둘러보다 보니 제가 나아가야할 방향을 조금은 감을 잡은것 같습니다.</p>
<h1 id="앞으로의-계획">앞으로의 계획</h1>
<p>앞으로 이 블로그에 제가 배운 것들과 저의 생각, 앞으로의 계획 등을 올릴 예정입니다. 배운것과 제 생각을 정리해야하는 필요성을 느껴졌거든요..! 저와 같이 개발자가 되고싶어하시는 비전공자분들에게도 조금은 도움이 되셨으면 하는 바램에 이 블로그를 시작합니다. </p>
]]></description>
        </item>
    </channel>
</rss>