<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>yong-_-been.log</title>
        <link>https://velog.io/</link>
        <description>이용빈식 mlops, 머신러닝, 딥러닝</description>
        <lastBuildDate>Sun, 18 Feb 2024 08:41:02 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>yong-_-been.log</title>
            <url>https://velog.velcdn.com/images/yong-_-been/profile/8b843629-1b7c-45bb-b83a-740b66baa4da/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. yong-_-been.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/yong-_-been" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[혼공c] 6주차 공부 정리]]></title>
            <link>https://velog.io/@yong-_-been/%ED%98%BC%EA%B3%B5c-6%EC%A3%BC%EC%B0%A8-%EA%B3%B5%EB%B6%80-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@yong-_-been/%ED%98%BC%EA%B3%B5c-6%EC%A3%BC%EC%B0%A8-%EA%B3%B5%EB%B6%80-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 18 Feb 2024 08:41:02 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yong-_-been/post/b069b102-17d6-43b7-aabc-fd4a186d8011/image.png" alt="">
마지막 6주차</p>
<p>포인터!</p>
<h1 id="ch9-포인터">ch9. 포인터</h1>
<h2 id="9-1-포인터의-기본-개념">9-1. 포인터의 기본 개념</h2>
<p>지금까지 변수를 선언해 메모리 공간에 정보를 저장하고 변수를 통해 접근하였다.</p>
<p>하지만 변수는 변수가 선언된 블록이나 함수를 벗어나면 사용이 불가능
-&gt; 이젠 변수가 위치한 메모리의 주소를 사용해 데이터에 접근할 수 있는 포인터에 대해 배운다.</p>
<p><strong>메모리의 주소</strong>
메모리에 저장된 데이터에 접근하려면 해당 데이터의 메모리 주소를 알아야 한다.
메모리의 주소는 바이트 단위로 구분되며 예를 들어 int 형 변수 a가 메모리 주소 0번지 부터 할당되었다면 0 ~ 3까지 4 바이트의 메모리 공간이 변수 a이다.</p>
<p>&amp; 연산자를 사용하면 변수의 메모리 주소 (시작 주소)를 알 수 있다.
--&gt; 위의 예에서 &amp;a 는 0이다.</p>
<p><strong>포인터와 간접 참조 연산자</strong>
포인터는 아래와 같이 선언한다</p>
<pre><code class="language-c">int *p;
// 자료형 * 변수명;</code></pre>
<p>자료형은 포인터가 주소를 저장하는 변수의 자료형을 사용한다.</p>
<p>포인터 또한 변수 이므로 메모리에 공간을 확보하고, 포인터가 가리키는 변수의 시작 주소를 저장할 수 있다.</p>
<pre><code class="language-c">pa = &amp;a;</code></pre>
<p>-&gt; pa 라는 포인터 변수에 변수 a의 시작 주소를 저장한다. 이러한 경우 &quot;포인터 pa가 변수 a를 가리킨다&quot;고 표현하고 pa -&gt; a로 간단히 적을 수 있다.</p>
<p>이젠 a를 가리키는 포인터 pa를 통해 변수 a를 직접 사용할 수 있다. 이때 포인터에 간접 참조 연산자 * 를 사용한다.</p>
<p>다시말해,</p>
<pre><code class="language-c">*pa == a;   // true

*pa = 10;  // 변수 a에 10 대입 </code></pre>
<h2 id="9-2-포인터-완전-정복을-위한-포인터-이해하기">9-2. 포인터 완전 정복을 위한 포인터 이해하기</h2>
<p>포인터는 주소를 저장하는 메모리의 공간
--&gt; 포인터 = 변수, 주소 = 상수</p>
<p>따라서, 포인터가 가리키는 변수가 달라질 수 있다.
즉, 아래와 같은 코드를 작성할 수 있다.</p>
<pre><code class="language-c">double a, b;
double *p;

*p = &amp;a;
*p = &amp;b;   // a를 가리키던 p가 이젠 b를 가리킴</code></pre>
<p><strong>주소와 포인터의 크기</strong></p>
<p>포인터의 크기는 가리키는 변수의 자료형과 상관이 없다.
저장할 주소의 크기와 같기 때문! (시작 주소)</p>
<p><img src="https://velog.velcdn.com/images/yong-_-been/post/292d6a8f-8d88-4e19-8029-784906661238/image.png" alt=""></p>
<p>흠 그러면 도대체 왜 포인터에 가리키는 변수의 자료형을 명시하는가 하는 의문이 듦과 동시에 간접 참조 연산자로 데이터를 읽어올 때 메모리 주소 몇간을 읽어 와야 하는가를 컴파일러에게 알려주기 위해서인가 하는 생각이 들어서 조사를 해보았다.
-&gt; 그러니까 명시된 자료형의 크기만큼 메모리를 읽어 와야 하기 때문이 아닌가?</p>
<p>맞는듯하다
<img src="https://velog.velcdn.com/images/yong-_-been/post/1a93adfb-0adb-4f3e-9a46-713bb9ca44bb/image.png" alt="">
출처: <a href="https://ko.wikipedia.org/wiki/C_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)">https://ko.wikipedia.org/wiki/C_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)</a></p>
<p>이렇게 생각하니 아래의 포인터의 대입 규칙 또한 자연히 이해가 되었다.</p>
<p>규칙 1. 포인터는 가리키는 변수의 형태가 같을 때에만 대입해야 한다.
규칙 2. 형 변환을 사용한 포인터의 대입은 가능하다.</p>
<p>[선택 미션]</p>
<p><img src="https://velog.velcdn.com/images/yong-_-been/post/cab079a6-223d-4106-9207-c75cc87edaa0/image.png" alt="">
<img src="https://velog.velcdn.com/images/yong-_-been/post/c9810d9d-d3be-4807-81c7-136be9568565/image.png" alt=""></p>
<p>출력：
<img src="https://velog.velcdn.com/images/yong-_-been/post/95442c06-cd7e-477f-b088-e08fc1a2a861/image.png" alt=""></p>
<p>＋ 회고
<img src="https://velog.velcdn.com/images/yong-_-been/post/74f37b04-48f9-49ab-94dc-eef1ffca6044/image.png" alt=""></p>
<p>지금까지 혼자서 ｃ언어를 복습하려고 여러번 시도했지만 매번 실패하였다。
항상 어설프게 이해하고 책 한권 완독하지 못했다。
물론 혼공단 활동으로 ｃ언어 교재를 전부 공부하지는 않았지만 이제는 혼자 할 수 있지 않을까 하는 자신감도 든다。</p>
<p>족장님께서 격려해주시고 매번 댓글도 달아주시니 매주 게시글을 작성할 힘이 났다。글을 써야 하니 더 꼼꼼히 공부하게 될 뿐만 아니라 누군가와 함께 공부하는 기분¡ （왜 느낌표가 거꾸로 달리는지¿）¿¿¿¿ ＜－ 얘는 왜 이러는지</p>
<p>아무튼 다들 고생하셨고、 족장님도 고생 하셨습니다。
남은 교재 진도는 스스로 헤쳐 나가겠습니다。
다들 화이팅¡¡¡¡¡¡¡¡</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공c] 5주차 공부 정리]]></title>
            <link>https://velog.io/@yong-_-been/%ED%98%BC%EA%B3%B5c-5%EC%A3%BC%EC%B0%A8-%EA%B3%B5%EB%B6%80-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@yong-_-been/%ED%98%BC%EA%B3%B5c-5%EC%A3%BC%EC%B0%A8-%EA%B3%B5%EB%B6%80-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sat, 03 Feb 2024 10:29:18 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yong-_-been/post/1b38d316-0d74-48d8-8d56-b16e65f9adca/image.png" alt="">
5주차 배열!</p>
<h1 id="ch8-배열">ch8. 배열</h1>
<h2 id="8-1-배열의-선언과-사용">8-1. 배열의 선언과 사용</h2>
<p>c언어의 배열은 같은 자료형의 데이터를 메모리에 연속적으로 저장하는 고정된 크기의 자료 구조이다.</p>
<p>배열은 다음과 같이 선언할 수 있다.</p>
<pre><code class="language-c">int a[5] = {1, 2, 3, 4, 5}</code></pre>
<p>위의 코드는 int 형 데이터를 5개 저장할 수 있는 배열을 선언하고 그 안에 1부터 5까지의 정수를 순서대로 저장하도록 배열을 초기화하는 코드이다.</p>
<p>5개의 정수를 저장하기 위해 a1 ~ a5 까지의 int 변수를 각각 만들 수도 있지만 배열을 사용하여 메모리 상에 연속된 공간에 저장하고 인덱스로 쉽게 접근할 수 있다.
따라서 위의 배열은 4바이트 int 저장 공간이 5개 연속되어 20바이트의 연속된 메모리 공간을 차지한다. (환경에 따라 int형 변수의 크기는 다르르 수 있음)</p>
<p> a = |1|2|3|4|5| 
index 0 1 2 3 4    </p>
<p>배열이 저장하는 값들을 배열 요소(element)라고 하는데 앞서 말했듯이 인덱스로 접근이 가능하다. 인덱스는 0부터 시작해 배열 크기 - 1에서 끝난다. 따라서 첫번째 배열 요소는 a[0]으로 접근할 수 있다. 인덱스의 범위를 벗어난 코드를 작성하지 않도록 조심해야 한다.</p>
<p>배열은 위의 코드와 같이 선언과 동시에 초기화 되어야 한다.
다른 변수와 같이 선언된 뒤에 초기화할 수 없고 이후 대입 연산자로 값을 변경할 수 없다.
즉, 아래와 같은 코드는 컴파일 에러가 발생한다.</p>
<pre><code class="language-c">int a[5];
a = {1, 2, 3, 4, 5}</code></pre>
<p>배열을 초기화 방법을 몇 가지 알아보자</p>
<ol>
<li><p>기본
int a[5] = {1, 2, 3, 4, 5}</p>
</li>
<li><p>배열의 크기보다 적은 수의 배열 요소로 초기화
int a[5] ={1, 2, 3} 첫 번재 요소부터 초기화 되고 나머지는 0으로 초기화 됨</p>
</li>
<li><p>자동 초기화
int a[999] = {0} 모든 요소를 0으로 초기화</p>
</li>
<li><p>배열 크기 생략
int a[] = {1, 2, 3} ㅇ컴파일러가 초깃값의 개수로 배열 크기 할당</p>
</li>
</ol>
<p>int형 말고도 다른 자료형을 저장하는 배열을 선언하고 사용할 수 있다.특히 c언어는 char 형 배열을 사용하여 문자열을 다룬다.
배열은 연속된 저장 공간이기 때문에 반복문을 사용하여 쉽게 처리할 수 있다.</p>
<h2 id="8-2-문자를-저장하는-배열">8-2. 문자를 저장하는 배열</h2>
<p>아까 말한 문자 배열이다. c언어에서 문자 배열 = 문자열이다.
문자 배열은 저장하려는 문자열 길이 보다 최소 하나 이상 큰 배열로 선언되어야 한다.
왜 그럴까?</p>
<p>바로 널 문자 &#39;\0&#39;를 사용해 문자열의 끝을 컴파일러에게 알리기 위해서다.
널 문자는 아래 아스키 코드상에서 숫자 0이다. 배열에 0을 저장하면 문자열에서는 널 문자로 해석되고 문자열의 끝난 것으로 약속한 것이다. 
<em>아스키 코드</em>
<img src="https://velog.velcdn.com/images/yong-_-been/post/9d831eee-9337-40c1-8644-f4e6441f88ab/image.png" alt="">
출처: <a href="https://sheepone.tistory.com/47">https://sheepone.tistory.com/47</a>
예를 들어 문자열을 출력할 때 널문자가 나오면 거기까지만 출력하도록 한다.</p>
<p>배열의 값은 계속 달라질 수 있는데, 긴 문자열을 저장했다가 더 짧은 문자열을 저장하는 경우를 생각해보자</p>
<p>|C|i|s|t|h|e|b|e|s|p|r|o|g|r|a|m|m|i|n|g|l|a|n|g|u|a|g|e|\0|</p>
<p>이렇게 저장된 배열에 scanf 함수로 배열의 값을 I agree로 변경하면(띄어쓰기는 하지 않는다고 가정하자)</p>
<p>앞에서부터
|I|a|g|r|e|e|\0|e|s|p|r|o|g|r|a|m|m|i|n|g|l|a|n|g|u|a|g|e|\0|
이런 식으로 변경되어 printf로 출력하면 Iagree만 출력된다.</p>
<p>실제 코드를 작성해보자.</p>
<pre><code class="language-c">#define _CRT_SECURE_NO_WARNINGS
#include&lt;stdio.h&gt;

void main() {

    char string[] = &quot;orangeman&quot;;
    printf(&quot;원래 문자 배열: %s\n&quot;, string);
    printf(&quot;변경할 문자열: &quot;);
    scanf(&quot;%s&quot;, string);

    printf(&quot;변경 후 배열 출력: %s\n&quot;, string);

    printf(&quot;배열 전체에 저장된 값: &quot;);
    for (int i = 0; i &lt; (sizeof(string) / sizeof(string[0])) - 1; i++)
    {    
        if (string[i] == &#39;\0&#39;)
            printf(&quot; &quot;);       //널 문자는 빈칸출력
        else
            printf(&quot;%c&quot;, string[i]);
    }
    printf(&quot;\n&quot;);
}</code></pre>
<p>출력 결과
<img src="https://velog.velcdn.com/images/yong-_-been/post/c864213d-d8fc-4183-b7c3-308860f9386e/image.png" alt=""></p>
<p>널 문자에 대해 다시 정리하면 아스키 코드상에서 첫번째 문자로서 숫자로는 0이지만 문자로 해석될 때 문자열의 끝을 알리는데 사용된다.</p>
<p>&#39;\0&#39; 또는 NULL로 표기할 수 있다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공C] 4주차 공부 정리]]></title>
            <link>https://velog.io/@yong-_-been/%ED%98%BC%EA%B3%B5C-3%EC%A3%BC%EC%B0%A8-%EA%B3%B5%EB%B6%80-%EC%A0%95%EB%A6%AC-l8d6rfha</link>
            <guid>https://velog.io/@yong-_-been/%ED%98%BC%EA%B3%B5C-3%EC%A3%BC%EC%B0%A8-%EA%B3%B5%EB%B6%80-%EC%A0%95%EB%A6%AC-l8d6rfha</guid>
            <pubDate>Sun, 28 Jan 2024 07:07:45 GMT</pubDate>
            <description><![CDATA[<p>4주차 이번엔 c언어의 함수에 대한 공부
<img src="https://velog.velcdn.com/images/yong-_-been/post/b485530d-017e-41c9-a6aa-e03b87189dda/image.png" alt=""></p>
<h1 id="ch7-함수">ch7. 함수</h1>
<h2 id="7-1-함수의-작성과-사용">7-1. 함수의 작성과 사용</h2>
<p>함수: 특정 기능을 수행하는 코드의 단위</p>
<p>이번엔 우리가 함수를 직접 정의하는 방법에 대해 배운다</p>
<p><strong>함수 정의</strong>
함수를 만들기 전에 고려해야할 것 3가지</p>
<ol>
<li>함수의 기능을 고려한 이름 -&gt; 함수명</li>
<li>함수의 기능을 수행하는데 필요한 데이터 -&gt; 매개변수</li>
<li>함수 실행의 결과 -&gt; 반환형</li>
</ol>
<p>--&gt; 위 3개의 질문의 대한 답이 함수 원형을 이룸</p>
<p>함수를 정의하는 것을 코드로 작성하면 아래와 같다</p>
<pre><code class="language-c">반환형 함수명(매개변수1, 매개변수 2.., 매개변수 n) -&gt; 함수 원형
{
    기능
}</code></pre>
<p>두개의 정수를 더하는 함수를 정의하고 메인 함수에서 호출하는 프로그램 예제를 통해
함수를 정의하고 호출하는 과정을 살펴보자</p>
<pre><code class="language-c">#include &lt;stdio.h&gt;

int sum(int x, int y); // sum 함수 선언 -&gt; 이후 설명

int main(void)
{
    int a = 10, b = 20;
    int result;

    result = sum(a, b); // 사용자가 정의한 sum 함수 호출
    printf(&quot;result = %d\n&quot;, result);

    return 0;
}

int sum(int x, int y)  // sum 함수 정의
{
    int temp;
    temp = x + y;

    return temp;
}</code></pre>
<p>위 소스 코드에서 먼저 sum 함수를 선언한 뒤 정의 한다.
함수 선언이란 함수 원형에 세미콜론을 붙여 작성한다. 함수 선언을 통해 컴파일러가 새로 만든 함수를 인식할 수 있도록 한다.
-&gt;
컴파일러는 함수 선언에서 반환값의 자료형을 확인하여 그에 맞는 저장 공간을 확보한다.
함수의 호출 형식에 문제가 없는지 검사한다. ex) 매개변수의 형태 수를 확인하여 인수를 검사한다.</p>
<h2 id="7-2-여러-가지-함수-유형">7-2. 여러 가지 함수 유형</h2>
<p>이 절은 이번주 혼공단 기본 미션의 내용이기도 하다.</p>
<p>함수의 원형 = 반환형 함수명(매개변수)임을 말했다.
그러나 모든 함수가 반드시 반환형과 매개변수가 있는 것은 아니다.
예를 들어 그저 화면에 텍스트를 출력하는 함수의 경우 반환형과 매개변수를 가질 이유가 없다.</p>
<p>따라서 다음과 같이 함수를 부류할 수 있다.</p>
<ol>
<li>반환형, 매개변수 둘다 가지는 함수</li>
<li>반환형을 가지지 않고 매개변수는 가지는 함수</li>
<li>반환형을 가지고 매개변수를 가지지 않는 함수</li>
<li>반환형과 매개변수 둘다 가지지 않는 함수</li>
</ol>
<p>위 4가지 경우에 더해 자기 자신을 호출하는 함수인 재귀 호출 함수가 있다.
1 번 경우의 함수는 앞선 장에서 설명 하였다.</p>
<p>두 번째 경우의 함수는 함수의 반환값이 없기 때문에 return문이 없거나 반환값 없이 단독으로 쓰인다. 또한 함수 원형에서 반환형 자리에 void를 넣는다. 반환값이 없기 때문에 수식의 일부로 사용될 수 없다.
ex) 입력 받은 숫자의 개수만큼 문자를 출력하는 함수</p>
<pre><code class="language-c">void AAA(int x, int y);</code></pre>
<p>세 번째 경우의 함수는 함수 원형에서 매개변수 자리에 void를 넣는다. 함수 호출 시 괄호안에 인수 없이 괄호만 작성하다.</p>
<pre><code class="language-c">int AAA(void);</code></pre>
<p>네 번째 경우의 함수는 두 번째, 세 번째 경우의 함수의 특징을 모두 가진다.</p>
<p>이제 재귀 호출 함수, 재귀 함수에 대해 알아보자.</p>
<p>다음은 간단한 재귀 함수의 예시이다. </p>
<pre><code class="language-c">void apple(void)
{    
    printf(&quot;apple\n&quot;);
    apple();
}</code></pre>
<p>위의 함수를 호출하면 함수가 멈추지 않고 계속해서 apple을 출력한다. 
(실제로는 메모리의 한계로 프로그램이 비정상 종료된다.)</p>
<p>정상적으로 재귀 함수를 사용하려면 무한 반복을 중단시킬 수 있는 중담점을 만들어야 한다.
예를 들어 조건식을 사용할 수 있다.</p>
<pre><code class="language-c">void apple(int x)
{    
    printf(&quot;apple\n&quot;);
    if (x == 3){
        return;
    }
    apple(x + 1);
}</code></pre>
<p>위와 같이 함수를 작성하면 apple(1)과 같이 호출했을 때, apple을 3번 출력하고 조건식이 충족되어 반복을 멈추게 된다.</p>
<p>그렇다면 그냥 반복문을 사용하는 것과 다를바 없지 않나? 다음의 예시를 살펴보자.</p>
<pre><code class="language-c">void apple(int x)
{    
    printf(&quot;apple\n&quot;);
    if (x == 3){
        return;
    }
    apple(x + 1);
    print(&quot;yeah\n&quot;);
}</code></pre>
<p>이 함수를 apple(1)과 같이 호출하면 yeah가 두번 출력될 것이다.
왜 그럴까?
먼저 apple(1)을 실행하면 조건식을 넘어가고 apple(2)를 호출할 것이다. 그 다음 apple(2)에서도 apple(3)을 호출할 것이다. 그러나 apple(3)에서 조건식이 충족되어 이후 apple(4)를 호출하지 함수가 종료되어 호출된 위치로 돌아가게 된다. 그 위치는 apple(2)에서 apple(3)을 호출하는 코드이다. 따라서 그 다음 코드인 print(&quot;yeah\n&quot;);이 실행되어 apple(2)의 실행이 종료된다. 따라서 다시 apple(1)함수로 돌아가 다시 yeah를 출력하게 된다. 아래의 그림으로 살펴보면 더 자세히 알아볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/yong-_-been/post/7241ed5f-b87e-420f-b93a-e47f5c58a4ef/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공C] 3주차 공부 정리]]></title>
            <link>https://velog.io/@yong-_-been/%ED%98%BC%EA%B3%B5C-3%EC%A3%BC%EC%B0%A8-%EA%B3%B5%EB%B6%80-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@yong-_-been/%ED%98%BC%EA%B3%B5C-3%EC%A3%BC%EC%B0%A8-%EA%B3%B5%EB%B6%80-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 21 Jan 2024 13:19:06 GMT</pubDate>
            <description><![CDATA[<p>혼공단 3주차!!!
<img src="https://velog.velcdn.com/images/yong-_-been/post/97434a04-024c-42c4-874a-defdaed77c8c/image.png" alt=""></p>
<h1 id="ch5-선택문">ch5. 선택문</h1>
<h2 id="5-1-if문">5-1. if문</h2>
<p>제어문: 선택문(if 등), 반복문(while 등), 분기문(return 등)</p>
<p>항상 차례대로 실행되는 프로그램이 아니라면 제어문이 필요
선택문의 경우 조건에 따라 실행 여부를 결정 가능</p>
<p><strong>if문의 기본 형식</strong></p>
<pre><code class="language-c">if (조건식)
{
    실행문
}</code></pre>
<p>조건식 만족하면 실행문 실행 그렇지 않으면 실행 x</p>
<p>실행문은 가독성을 위해 중괄호({})로 묶어주는 것이 좋고, 실행문이 2개 이상이면 반드시 묶어야 함 </p>
<p><strong>if ~ else 문</strong></p>
<pre><code class="language-c">if (조건식)
{
    실행문 1
}
else
{
    실행문 2
}</code></pre>
<p>조건문이 만족하지 않았을 때 실행되어야 하는 코드가 있다면?
if ~ else 사용 if의 조건식이 충족되지 않았을 때, else의 실행문이 실행됨
-&gt; else에는 조건식 x</p>
<p><strong>if ~ else if ~ else문</strong></p>
<pre><code class="language-c">if (조건식)
{
    실행문 1
}
else if (조건식)
{
    실행문 2
}
else
{
    실행문 3
}</code></pre>
<p>실행문이 3개 이상일 때, 이 중에서 하나만 실행되어야 한다면?
if ~ else if ~ else문 사용
위의 조건부터 검사하여 충족하지 못한다면 아래 조건식 검사</p>
<p><strong>이전 조건식의 결과가 반영된다는 것을 주의!</strong></p>
<h2 id="5-2-if문-활용과--switch--case-문">5-2. if문 활용과  switch ~ case 문</h2>
<p><strong>if문 중첩 사용</strong>
선행 조건이 있는 경우. 예를 들어, b라는 조건을 검사하기 전에 a라는 조건이 충족되어야 한다면 
a를 검사하는 if문 안에 b를 검사하는 if문을 넣어서 사용</p>
<pre><code class="language-c">if (a == True)
{
    if (b==True)
    {
        실행문 1
    }
    else
    {
        실행문 2
    }
}</code></pre>
<p>이때 if ~ else문은 실행문이 많더라도 전체를 한 문장으로 취급</p>
<p>이렇게 if문을 중첩해 사용하면 </p>
<ol>
<li>불필요한 조건 검사를 줄일 수 있고 2. 선행조건이 없더라도 실행 효율을 높일 수  있다</li>
</ol>
<p><strong>switch ~ case문</strong></p>
<pre><code class="language-c">switch (조건식)
{
case 상수식1:
    실행문1;
    break;
case 상수식2:
    실행문2;
    break;
case 상수식2:
    실행문2;
    break;
default:
    실행문3
    break;
}</code></pre>
<p>여러 개의 상수 중에서 조건에 해당하는 것을 골라서 실행 하는 것
조건은 반드시 정수식, case에 break 포함!</p>
<p>break가 없다면 끝까지 다 실행됨</p>
<h2 id="ch6-반복문">ch.6 반복문</h2>
<h3 id="6-1-while-for-do--while-문">6-1. while, for, do ~ while 문</h3>
<p>반복문: 일정 조건을 만족하는 동안 실행문을 반복
-&gt; 조건식과 실행문 필요</p>
<p><strong>while문</strong></p>
<pre><code class="language-c">while (조건식)
{
    실행문
    ```
    실행문
}</code></pre>
<p>조건식이 참인 동안 실행문들 반복</p>
<p><strong>for문</strong>
for문은 원하는 횟수만큼 반복할 때 사용</p>
<pre><code class="language-c">for(i = 0; i &lt; 3; i++)
{
    a += 1
}</code></pre>
<p>-&gt; 3 회 반복하는 for문
for(초기식, 조건식, 증감식)</p>
<p>초기식은 한번만 실행
조것닉 검사 후 참이면 실행문 실행 후 증감식
-&gt; 반복</p>
<p><strong>do ~ while문</strong>
while 문에서 실행문 실행 후 조건식 검사하는 것 -&gt; 반드시 한번은 실행문 실행</p>
<h3 id="6-2-반복문-활용">6-2. 반복문 활용</h3>
<p>if문 처럼 반복문도 중첩 가능</p>
<p>break: 반복을 즉시 끝냄
continue: 반복문의 일부를 건너 뜀. 블록 탈출 x</p>
<h2 id="기본-미션">기본 미션</h2>
<p>용어노트를 잃어버려서 한빛미디어 사이트에서 pdf로 다운받았다. 어디간거지 대체?
<img src="https://velog.velcdn.com/images/yong-_-been/post/045acc8a-169c-46cf-9af6-0ed5eb6886e5/image.png" alt="">
<img src="https://velog.velcdn.com/images/yong-_-been/post/68ce671f-42fe-4f72-8ec3-15fdba7bbfa7/image.png" alt="">
<img src="https://velog.velcdn.com/images/yong-_-been/post/a4576b8f-d50d-4a05-ab71-054f8a28d312/image.png" alt="">
pdf로 제공되는 파일이 있어 공부에 도움이 된다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공C] 2주차 공부 정리]]></title>
            <link>https://velog.io/@yong-_-been/%ED%98%BC%EA%B3%B5C-2%EC%A3%BC%EC%B0%A8-%EA%B3%B5%EB%B6%80-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@yong-_-been/%ED%98%BC%EA%B3%B5C-2%EC%A3%BC%EC%B0%A8-%EA%B3%B5%EB%B6%80-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sat, 13 Jan 2024 09:44:36 GMT</pubDate>
            <description><![CDATA[<p>벌써 혼공단 2주차!
<img src="https://velog.velcdn.com/images/yong-_-been/post/4f2ee90e-da37-4c1d-973a-140923bd6b93/image.png" alt=""></p>
<h1 id="ch3-변수와-데이터-입력">ch3. 변수와 데이터 입력</h1>
<h2 id="3-1-변수">3-1 변수</h2>
<p>변수: 데이터를 저장하는 공간
변수 선언시 메모리에 저장 공간을 확보하여 데이터를 저장
데이터의 종류에 따라 형태가 달라짐</p>
<p><strong>변수 선언 방법</strong>
ex) </p>
<pre><code class="language-c">int a; 
//(자료형) (변수명) ;</code></pre>
<p>변수의 이름과 이 변수가 저장할 데이터의 자료형을 알려주어 컴파일러가 확보할 저장 공간의 크기를 알려줌</p>
<p>이렇게 변수를 선언하면 처음에는 알 수 없는 값이 들어가 있음 -&gt; garbage value
따라서 변수를 선언하고 초기화 해야함</p>
<pre><code class="language-c">a = 10;</code></pre>
<p>= : 대입 연산자, 오르쪽 값을 왼쪽에 할당</p>
<p><strong>변수의 자료형</strong>
크게 정수형, 실수형으로 구분</p>
<p>정수형 변수</p>
<pre><code>char, short, int, long, long long + unsigned int (양수)</code></pre><p>실수형 변수</p>
<pre><code>float, double, long double</code></pre><p>문자열을 저장해야 한다면?
-&gt; char형 배열의 형태로 저장</p>
<pre><code class="language-c">char 배열명[문자열 길이+1] = 문자열;</code></pre>
<p>배열의 크기 = 문자열 길이 + 1인 이유?
-&gt; 문자열 끝에 컴파일러가 널 문자(\0)를 추가해 문자열의 끝을 표시</p>
<p>const 변수 -&gt; 값을 바꿀 수 없는 변수, 상수처럼 사용, 선언과 동시에 초기화</p>
<p>예약어: 사용방법이 이미 정해진 단어들 ex) while, if, 자료형 등
식별자: 변수명, 함수명 등 필요에 따라 만들어 사용하는 단어들</p>
<h2 id="3-2-데이터-입력">3-2 데이터 입력</h2>
<p>이 절에서는 키보드로 입력되는 문자를 프로그램에서 정수나 실수 같은 숫자로 사용하기 위해 변환하는 방법을 배운다 -&gt; scanf 함수 사용</p>
<p>scanf 함수는 키보드로 입력 받은 값을 변수에 저장</p>
<pre><code class="language-c">scanf(&quot;%d&quot;, &amp;a);
// int형 변수 a에 정수를 저장하는 방법

scanf(&quot;%d%f&quot;, &amp;a, &amp;b);
// 두개 이상의 변수를 입력 받을 수 있음</code></pre>
<p><strong>문자와 문자열 입력</strong>
키보드로 입력되는 모든 문자가 char형 변수에 저장됨 ex) 스페이스 키
문자열을 char형 배열에 저장. 문자열은 공백 없이 입력 + 배열명에 &amp; 붙이지 않음 -&gt; 배열명이 메모리 주소임  </p>
<h2 id="3장-기본-미션">3장 기본 미션</h2>
<p><img src="https://velog.velcdn.com/images/yong-_-been/post/31da0a88-6915-47c5-b239-1080a6a3232e/image.png" alt="">
1번 답: 3번
2번 답: 
<img src="https://velog.velcdn.com/images/yong-_-been/post/e8f794aa-b47b-4d0d-b8d8-e6c94f2c8ca5/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yong-_-been/post/141fa926-9c4a-492a-88d6-a39f2e813982/image.png" alt="">
3번 답: 
<img src="https://velog.velcdn.com/images/yong-_-been/post/ed0a813b-702c-4190-a2bc-701a4a31e9ca/image.png" alt=""></p>
<h1 id="ch4-연산자">ch4. 연산자</h1>
<h2 id="4-1-산술-연산자-관계-연산자-논리-연산자">4-1 산술 연산자, 관계 연산자, 논리 연산자</h2>
<p>연산에는 연산자 + 연산의 대상이 되는 피연산자 필요
상수나 변수 혹은 수식이 피연사자가 될 수 있음</p>
<p><strong>산술 연산자</strong>
더하기(+), 빼기(-), 곱하기(*), 나누기(/), 나머지(%)</p>
<p><strong>증감 연산자</strong>
변수의 값 1씩 증가 or 감소</p>
<pre><code class="language-c">++a; a++; --a; a--;</code></pre>
<p>전위 표기: 증감 후 연산에 값 사용
후위 표기: 값을 연산에 먼저 사용 후 증감</p>
<p><strong>관계 연산자</strong>
연산 결괏값: 0(거짓) 또는 1(참)
대소 관계 연산자, 동등 관계 연산자</p>
<p><strong>논리 연산자</strong>
&amp;&amp;(and), ||(or), !(not) 참, 거짓 판단</p>
<pre><code>숏 서킷 룰 
&amp;&amp;(and), ||(or)에 적용됨. 좌항 만으로 &amp;&amp;(and), ||(or)연산의 결과 판단.
ex) &amp;&amp;은 좌항이 거짓이면 우항 검토 x</code></pre><h2 id="4-1-그-외-유용한-연산자">4-1 그 외 유용한 연산자</h2>
<p><strong>형 변환 연산자</strong>
피연산자의 값 복사 후 연하는 데이터형으로 일시적으로 변환</p>
<pre><code class="language-c">(자료형) 피연산자
(double) 8 =&gt; 8.0
(int) 5.6 =&gt; 5</code></pre>
<p><strong>sizeof 연산자</strong>
피연산자의 크기 바이트 단위로 반환</p>
<pre><code class="language-c">sizeof(피연산자)
//피연산자는 자료형, 변수, 수식 등이 될 수 있다</code></pre>
<p><strong>이외 복합 대입 연산자, 콤마 연산자, 조건 연산자, 비트 연산자 등이 있다.</strong>
<strong>연산자 우선 순위와 연산 방향을 주의할 것</strong>
<img src="https://velog.velcdn.com/images/yong-_-been/post/77d1d1bb-f798-4156-b3f9-d22ea777dfc2/image.png" alt=""></p>
<h2 id="4장-기본-미션">4장 기본 미션</h2>
<p><img src="https://velog.velcdn.com/images/yong-_-been/post/3300bad1-6bbf-4bbb-8be1-5d1e43fd9703/image.png" alt="">
<img src="https://velog.velcdn.com/images/yong-_-been/post/5ce79bbd-3aa2-4c1e-989f-b5ba3ee6742e/image.png" alt="">
1번 답:
<img src="https://velog.velcdn.com/images/yong-_-been/post/13a73f7e-954d-4076-bdfa-3d04a43c5656/image.png" alt="">
2번 답:
<img src="https://velog.velcdn.com/images/yong-_-been/post/7e4610d5-a7cd-47e0-9c3a-76ae9ed53ab7/image.png" alt="">
3번 답:
<img src="https://velog.velcdn.com/images/yong-_-been/post/5107fc81-7d6c-4c49-8967-d6533e6ce2bf/image.png" alt=""></p>
<h2 id="선택-미션">선택 미션</h2>
<p><img src="https://velog.velcdn.com/images/yong-_-been/post/022e4505-f673-4263-9edb-c10b803e87b8/image.png" alt="">
답:
<img src="https://velog.velcdn.com/images/yong-_-been/post/39b240d3-1ad6-4bfe-8190-52d1feb4f0f0/image.png" alt=""></p>
<p>ㅎㅇㅌ~</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공C] 1주차 공부 정리]]></title>
            <link>https://velog.io/@yong-_-been/%ED%98%BC%EA%B3%B5C-1%EC%A3%BC%EC%B0%A8-%EA%B3%B5%EB%B6%80-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@yong-_-been/%ED%98%BC%EA%B3%B5C-1%EC%A3%BC%EC%B0%A8-%EA%B3%B5%EB%B6%80-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 07 Jan 2024 11:20:48 GMT</pubDate>
            <description><![CDATA[<p>c언어 복습을 여러번 시도후 번번이 실패했다. 그러다 혼공단을 알게되어 시작
아래 커리큘럼을 따른다.</p>
<p><img src="https://velog.velcdn.com/images/yong-_-been/post/a16fd538-2373-4f3e-9f46-f728ecd9ba38/image.png" alt=""></p>
<h1 id="1주차-시작">1주차 시작!</h1>
<h2 id="ch-1-프로그램-만들기">ch 1. 프로그램 만들기</h2>
<h3 id="c-언어란">c 언어란?</h3>
<p>데니스 리치가 유닉스 운영체제 개발을 위해 만든 프로그래밍 언어!
초기의 유닉스는 기계어로 작성되어 하드웨어에 따라 새로 작성해야 했다. 이러한 문제를 해결하기 위해 만들어진 언어가 바로 c언어이다.</p>
<h4 id="c-언어의-장점">c 언어의 장점</h4>
<ol>
<li>os 개발을 위해 만들어지 언어이므로 하드웨어 제어 가능</li>
<li>표준을 지키며 프로그래밍을 하면 다른 하드웨어에서 프로그램 재사용 가능</li>
<li>함수를 사용해 프로그램 개발 -&gt; 에러 수정 및 유지 보수에 용이</li>
</ol>
<h3 id="컴파일">컴파일</h3>
<p>프로그래밍 언어로 쓰인 소스 코드를 기계가 이해할 수 있는 기계어로 바꾸는 과정</p>
<p>컴파일 과정을 더 자세히 살펴보면
전처리 -&gt; 컴파일 -&gt; 링크 세 단계로 구분된다</p>
<h2 id="ch-2-상수와-데이터-출력">ch 2. 상수와 데이터 출력</h2>
<h3 id="2-1-c-프로그램의-구조와-데이터-출력-방법">2-1 c 프로그램의 구조와 데이터 출력 방법</h3>
<p>c 프로그램은 함수로 만든다!
함수란? -&gt; 일정 기능을 수행하는 코드의 단위
우선 함수 하나(main 함수)로 이루어진 간단한 프로그램을 다룬다.
c 언어에서 main 함수는 필수로 존재해야 하며, 프로그램의 시작이다.</p>
<p>아래 코드가 main 함수의 모습이다.</p>
<pre><code class="language-c">int main(void)
{
/// code
return 0;
}</code></pre>
<p>main 함수는 머리와 몸통으로 구분된다.</p>
<h4 id="머리">머리</h4>
<pre><code class="language-c">int main(void)
</code></pre>
<h4 id="몸통">몸통</h4>
<pre><code class="language-c">{
/// code
return 0;
}</code></pre>
<p>머리 = 함수 원형(function prototype) -&gt; 함수이름, 필요한 데이터 표시
함수의 기능을 몸통 {}안에 표시, return 0; -&gt; 프로그램 종료</p>
<p>주석 처리
/* <del>~</del> */ 또는 //</p>
<h4 id="함수의-몸통에-코드함수가-수행할-기능를-작성하는-데-규칙이-존재">함수의 몸통에 코드(함수가 수행할 기능)를 작성하는 데 규칙이 존재</h4>
<ol>
<li>세미클론(;) -&gt; 문장의 끝 표시</li>
<li>한줄에 한 문장씩 작성 -&gt; 세미클론으로 문장 구분하므로 여러 문장 작성 가능하나 가독성 주의</li>
<li>일정한 간격으로 들여쓰기</li>
</ol>
<h3 id="2-2-상수와-데이터-표현-방법">2-2 상수와 데이터 표현 방법</h3>
<p>상수 -&gt; 값을 바꿀 수 없는 데이터
상수의 종류: 정수, 실수, 문자 및 문자열</p>
<h4 id="c언어-소스-코드에서-상수의-표현법">c언어 소스 코드에서 상수의 표현법</h4>
<p>정수: 10진수 / 8진수 / 16진수
실수: 숫자, 기호, 소수점으로 표현 + 정규화 표기법 (e, E를 사용해 지수 표현)
문자 및 문자열: 문자는 &#39;&#39;로 묶고, 문자열은  &quot;&quot;로 묶어서 표현</p>
<h3 id="컴파일된-상수의-비트-형태">컴파일된 상수의 비트 형태</h3>
<p>정수: 4 바이트
실수: 8 바이트
문자: 1 바이트, 아스키 코드 값으로 컴파일됨</p>
<h4 id="상수의-크기는-항상-일정한가">@@상수의 크기는 항상 일정한가?</h4>
<p>--&gt; 아니다. 컴파일러에 따라 상수의 크기는 다를 수 있다. 즉, 상수는 항상 4바이트인 것은 아니라는 것. sizeof 연산자로 상수의 크기를 알 수 있다.</p>
<h2 id="기본-미션-비주얼-스튜디오-설치">[기본 미션] 비주얼 스튜디오 설치</h2>
<p>혼자 공부하는 c언어 교재에서는 visual studio 2019 community를 사용하므로 해당 ide를 설치 하자.</p>
<p><img src="https://velog.velcdn.com/images/yong-_-been/post/21b303fa-3579-41b8-a62e-e010ccf46bd4/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yong-_-been/post/e0d4e098-9c8d-4c43-86f1-25293bde6fa6/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yong-_-been/post/0122e80f-a8df-41f1-8ebe-29b20e7270e3/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yong-_-been/post/bea821aa-2d89-44d4-9fc7-d07a55ef9ebc/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yong-_-been/post/6c21c230-7d10-4828-8126-92d74f3b41cc/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yong-_-been/post/869b255d-f49b-4b26-b670-13b97fb2f26e/image.png" alt="">
설치 완료!</p>
<h2 id="선택-미션-2-2-확인문제-3번">[선택 미션] 2-2 확인문제 3번</h2>
<h4 id="자신의-학번-이름-학점을-출력하는-프로그램을-작성하시오">자신의 학번, 이름, 학점을 출력하는 프로그램을 작성하시오.</h4>
<p><img src="https://velog.velcdn.com/images/yong-_-been/post/482b3ba3-a779-454f-a4fb-66c80a6d056c/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>