<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko-KR"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" hreflang="ko-KR" /><updated>2026-09-12T12:06:58+09:00</updated><id>/feed.xml</id><title type="html">소소한 지식 공부하고 공유하는 프로그래머</title><subtitle>소소한 지식 공부하고 공유하는 프로그래머</subtitle><entry><title type="html">상수와 리터럴</title><link href="/2026/09/12/constants-literals/" rel="alternate" type="text/html" title="상수와 리터럴" /><published>2026-09-12T09:00:00+09:00</published><updated>2026-09-12T09:00:00+09:00</updated><id>/2026/09/12/constants-literals</id><content type="html" xml:base="/2026/09/12/constants-literals/"><![CDATA[<p>지난 편에서는 값이 자유롭게 바뀔 수 있는 “변수”에 대해 배웠습니다. 그런데 프로그램을 짜다 보면 절대 바뀌면 안 되는 값도 있습니다. 예를 들어 원주율이나 세율처럼 계산 도중에 실수로 값이 바뀌면 프로그램 전체가 엉망이 될 수 있는 값들이죠. 오늘은 이런 “바뀌지 않는 값”인 상수(constant)와, 코드에 직접 써넣는 값인 리터럴(literal)에 대해 알아보겠습니다.</p>

<h2 id="리터럴이란">리터럴이란?</h2>

<p>리터럴은 코드 안에 그 자체로 적혀 있는 값을 말합니다. 예를 들어 아래 코드에서 <code class="language-plaintext highlighter-rouge">10</code>, <code class="language-plaintext highlighter-rouge">3.14</code>, <code class="language-plaintext highlighter-rouge">'A'</code>, <code class="language-plaintext highlighter-rouge">"hello"</code>는 모두 리터럴입니다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>          <span class="c1">// 정수 리터럴</span>
<span class="kt">double</span> <span class="n">pi</span> <span class="o">=</span> <span class="mi">3</span><span class="p">.</span><span class="mi">14</span><span class="p">;</span>     <span class="c1">// 실수 리터럴</span>
<span class="kt">char</span> <span class="n">grade</span> <span class="o">=</span> <span class="sc">'A'</span><span class="p">;</span>     <span class="c1">// 문자 리터럴</span>
<span class="kt">char</span> <span class="o">*</span><span class="n">msg</span> <span class="o">=</span> <span class="s">"hello"</span><span class="p">;</span> <span class="c1">// 문자열 리터럴</span>
</code></pre></div></div>

<p>리터럴에도 자료형이 있습니다. <code class="language-plaintext highlighter-rouge">10</code>은 기본적으로 <code class="language-plaintext highlighter-rouge">int</code>, <code class="language-plaintext highlighter-rouge">3.14</code>는 기본적으로 <code class="language-plaintext highlighter-rouge">double</code>로 취급됩니다. 만약 정수 리터럴을 <code class="language-plaintext highlighter-rouge">long</code>으로, 실수 리터럴을 <code class="language-plaintext highlighter-rouge">float</code>로 명시하고 싶다면 접미사를 붙일 수 있습니다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">long</span> <span class="n">big</span> <span class="o">=</span> <span class="mi">1000000L</span><span class="p">;</span>   <span class="c1">// L을 붙이면 long 타입</span>
<span class="kt">float</span> <span class="n">f</span> <span class="o">=</span> <span class="mi">3</span><span class="p">.</span><span class="mi">14</span><span class="n">f</span><span class="p">;</span>       <span class="c1">// f를 붙이면 float 타입</span>
<span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">u</span> <span class="o">=</span> <span class="mi">10U</span><span class="p">;</span>  <span class="c1">// U를 붙이면 unsigned int 타입</span>
</code></pre></div></div>

<p>또한 정수 리터럴은 진법도 다르게 표현할 수 있습니다. <code class="language-plaintext highlighter-rouge">0x</code>로 시작하면 16진수, <code class="language-plaintext highlighter-rouge">0</code>으로 시작하면 8진수로 해석됩니다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">decimal</span> <span class="o">=</span> <span class="mi">100</span><span class="p">;</span>   <span class="c1">// 10진수</span>
<span class="kt">int</span> <span class="n">hex</span> <span class="o">=</span> <span class="mh">0x64</span><span class="p">;</span>      <span class="c1">// 16진수(100과 같은 값)</span>
<span class="kt">int</span> <span class="n">octal</span> <span class="o">=</span> <span class="mo">0144</span><span class="p">;</span>    <span class="c1">// 8진수(100과 같은 값)</span>
</code></pre></div></div>

<h2 id="상수란">상수란?</h2>

<p>상수는 변수처럼 이름을 가지지만, 한 번 값이 정해지면 프로그램이 실행되는 동안 절대 바뀌지 않는 값입니다. C언어에서 상수를 만드는 방법은 크게 두 가지가 있습니다.</p>

<p>첫 번째는 <code class="language-plaintext highlighter-rouge">const</code> 키워드를 사용하는 방법입니다. 변수 선언 앞에 <code class="language-plaintext highlighter-rouge">const</code>를 붙이면 그 변수는 이후 값을 변경할 수 없는 상수가 됩니다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">const</span> <span class="kt">double</span> <span class="n">PI</span> <span class="o">=</span> <span class="mi">3</span><span class="p">.</span><span class="mi">14159</span><span class="p">;</span>
</code></pre></div></div>

<p>두 번째는 전처리기 지시문인 <code class="language-plaintext highlighter-rouge">#define</code>을 사용하는 방법입니다. 이는 컴파일 전에 코드에서 해당 이름을 지정된 값으로 그대로 바꿔치기하는 방식입니다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#define MAX_SCORE 100
</span></code></pre></div></div>

<p>두 방식 모두 비슷한 목적으로 쓰이지만, <code class="language-plaintext highlighter-rouge">const</code>는 자료형이 명확하게 지정되고 디버깅 시 변수처럼 취급되는 반면, <code class="language-plaintext highlighter-rouge">#define</code>은 단순 텍스트 치환이라 자료형이 없다는 차이가 있습니다. 요즘은 안전성 때문에 <code class="language-plaintext highlighter-rouge">const</code>를 더 권장하는 편입니다.</p>

<h2 id="예제-코드로-확인해보기">예제 코드로 확인해보기</h2>

<p>아래는 상수와 리터럴을 함께 사용해 원의 넓이와 둘레를 계산하는 예제입니다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="cp">#define MAX_RADIUS 1000
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">const</span> <span class="kt">double</span> <span class="n">PI</span> <span class="o">=</span> <span class="mi">3</span><span class="p">.</span><span class="mi">14159</span><span class="p">;</span>
    <span class="kt">double</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">5</span><span class="p">.</span><span class="mi">0</span><span class="p">;</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">radius</span> <span class="o">&gt;</span> <span class="n">MAX_RADIUS</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"반지름이 너무 큽니다.</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="kt">double</span> <span class="n">area</span> <span class="o">=</span> <span class="n">PI</span> <span class="o">*</span> <span class="n">radius</span> <span class="o">*</span> <span class="n">radius</span><span class="p">;</span>
    <span class="kt">double</span> <span class="n">circumference</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">PI</span> <span class="o">*</span> <span class="n">radius</span><span class="p">;</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"반지름: %.1f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">radius</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"넓이: %.2f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">area</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"둘레: %.2f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">circumference</span><span class="p">);</span>

    <span class="c1">// PI = 3.14;  // 이 줄의 주석을 풀면 컴파일 에러가 발생합니다.</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="코드-동작-설명-및-실행-결과">코드 동작 설명 및 실행 결과</h2>

<ul>
  <li><code class="language-plaintext highlighter-rouge">#define MAX_RADIUS 1000</code>은 전처리기가 컴파일 전에 코드 안의 <code class="language-plaintext highlighter-rouge">MAX_RADIUS</code>를 전부 <code class="language-plaintext highlighter-rouge">1000</code>이라는 텍스트로 바꿔치기합니다. 그래서 <code class="language-plaintext highlighter-rouge">radius &gt; MAX_RADIUS</code>는 실제로는 <code class="language-plaintext highlighter-rouge">radius &gt; 1000</code>으로 컴파일됩니다.</li>
  <li><code class="language-plaintext highlighter-rouge">const double PI = 3.14159;</code>는 <code class="language-plaintext highlighter-rouge">PI</code>라는 이름의 상수를 선언한 것입니다. 이후 코드에서 <code class="language-plaintext highlighter-rouge">PI = 3.14;</code>처럼 값을 바꾸려고 하면 컴파일러가 “읽기 전용 변수에 값을 대입할 수 없다”는 에러를 냅니다.</li>
  <li><code class="language-plaintext highlighter-rouge">area</code>와 <code class="language-plaintext highlighter-rouge">circumference</code>는 각각 원의 넓이(<code class="language-plaintext highlighter-rouge">반지름² × PI</code>)와 둘레(<code class="language-plaintext highlighter-rouge">2 × PI × 반지름</code>) 공식으로 계산됩니다.</li>
  <li><code class="language-plaintext highlighter-rouge">%.2f</code>는 소수점 아래 2자리까지 출력하라는 서식 지정자입니다.</li>
</ul>

<p>이 코드를 <code class="language-plaintext highlighter-rouge">gcc constants.c -o constants</code>로 컴파일하고 실행하면 다음과 같은 결과를 볼 수 있습니다.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>반지름: 5.0
넓이: 78.54
둘레: 31.42
</code></pre></div></div>

<p>만약 주석 처리된 <code class="language-plaintext highlighter-rouge">PI = 3.14;</code> 줄의 주석을 풀고 다시 컴파일하면, “assignment of read-only variable ‘PI’“와 같은 컴파일 에러가 발생합니다. 이것이 바로 상수가 우리를 지켜주는 방식입니다. 값을 실수로 바꾸는 코드를 아예 컴파일 단계에서 막아주는 것이죠.</p>

<h2 id="핵심-요약">핵심 요약</h2>

<ul>
  <li>리터럴은 코드에 직접 적혀 있는 값이며, 정수·실수·문자·문자열 등 다양한 종류가 있고 접미사(<code class="language-plaintext highlighter-rouge">L</code>, <code class="language-plaintext highlighter-rouge">f</code>, <code class="language-plaintext highlighter-rouge">U</code>)로 자료형을 명시할 수 있습니다.</li>
  <li>상수는 한 번 정해지면 바뀌지 않는 값으로, <code class="language-plaintext highlighter-rouge">const</code> 키워드나 <code class="language-plaintext highlighter-rouge">#define</code> 전처리기 지시문으로 만들 수 있습니다.</li>
  <li><code class="language-plaintext highlighter-rouge">const</code>는 자료형이 있는 진짜 변수처럼 취급되고, <code class="language-plaintext highlighter-rouge">#define</code>은 컴파일 전 단순 텍스트 치환이라는 차이가 있습니다.</li>
  <li>자주 바뀌면 안 되는 값(원주율, 최대값, 세율 등)은 상수로 선언해두면 실수를 방지하고 코드의 의도도 더 명확해집니다.</li>
</ul>

<p>다음 편에서는 값을 계산하고 비교하는 데 꼭 필요한 “연산자 (산술/관계/논리/비트)”에 대해 알아보겠습니다. C언어에서 자주 쓰는 다양한 연산자의 종류와 사용법을 예제와 함께 정리해보겠습니다.</p>]]></content><author><name></name></author><category term="C언어" /><summary type="html"><![CDATA[지난 편에서는 값이 자유롭게 바뀔 수 있는 “변수”에 대해 배웠습니다. 그런데 프로그램을 짜다 보면 절대 바뀌면 안 되는 값도 있습니다. 예를 들어 원주율이나 세율처럼 계산 도중에 실수로 값이 바뀌면 프로그램 전체가 엉망이 될 수 있는 값들이죠. 오늘은 이런 “바뀌지 않는 값”인 상수(constant)와, 코드에 직접 써넣는 값인 리터럴(literal)에 대해 알아보겠습니다.]]></summary></entry><entry><title type="html">변수와 자료형</title><link href="/2026/09/11/variables-datatypes/" rel="alternate" type="text/html" title="변수와 자료형" /><published>2026-09-11T09:00:00+09:00</published><updated>2026-09-11T09:00:00+09:00</updated><id>/2026/09/11/variables-datatypes</id><content type="html" xml:base="/2026/09/11/variables-datatypes/"><![CDATA[<p>지난 편에서 <code class="language-plaintext highlighter-rouge">gcc</code> 컴파일 과정을 살펴봤으니, 이제 본격적으로 C언어 문법으로 들어가 보겠습니다. 오늘 다룰 주제는 프로그래밍의 가장 기본이라고 할 수 있는 “변수와 자료형”입니다. 변수는 데이터를 담는 상자라고 생각하면 되고, 자료형은 그 상자에 어떤 종류의 데이터를 담을지 정해주는 규칙이라고 이해하면 쉽습니다.</p>

<h2 id="변수란-무엇인가">변수란 무엇인가?</h2>

<p>프로그램이 실행되는 동안 우리는 숫자, 문자, 참/거짓 같은 여러 값을 계속 다루게 됩니다. 이런 값을 메모리에 저장해두고 필요할 때마다 꺼내 쓰기 위한 이름 붙은 공간이 바로 변수입니다. C언어에서 변수를 사용하려면 먼저 “이 변수는 어떤 종류의 데이터를 담을지”를 컴파일러에게 알려줘야 하는데, 이를 변수 선언이라고 합니다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">age</span><span class="p">;</span>        <span class="c1">// 정수를 담는 변수 age를 선언</span>
<span class="n">age</span> <span class="o">=</span> <span class="mi">25</span><span class="p">;</span>       <span class="c1">// age에 25라는 값을 저장(대입)</span>
</code></pre></div></div>

<p>선언과 동시에 값을 넣어줄 수도 있는데, 이를 초기화라고 부릅니다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">age</span> <span class="o">=</span> <span class="mi">25</span><span class="p">;</span>   <span class="c1">// 선언과 동시에 초기화</span>
</code></pre></div></div>

<h2 id="기본-자료형-살펴보기">기본 자료형 살펴보기</h2>

<p>C언어에는 여러 기본 자료형이 있는데, 자주 쓰이는 것들만 먼저 정리해보겠습니다.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">int</code>: 정수를 저장합니다. 예: <code class="language-plaintext highlighter-rouge">10</code>, <code class="language-plaintext highlighter-rouge">-3</code>, <code class="language-plaintext highlighter-rouge">0</code></li>
  <li><code class="language-plaintext highlighter-rouge">float</code>: 소수점이 있는 실수를 저장합니다. 예: <code class="language-plaintext highlighter-rouge">3.14</code></li>
  <li><code class="language-plaintext highlighter-rouge">double</code>: <code class="language-plaintext highlighter-rouge">float</code>보다 더 정밀한 실수를 저장합니다. 실무에서는 <code class="language-plaintext highlighter-rouge">float</code>보다 <code class="language-plaintext highlighter-rouge">double</code>을 더 많이 씁니다.</li>
  <li><code class="language-plaintext highlighter-rouge">char</code>: 문자 하나를 저장합니다. 예: <code class="language-plaintext highlighter-rouge">'A'</code>, <code class="language-plaintext highlighter-rouge">'z'</code> (작은따옴표를 사용합니다)</li>
</ul>

<p>각 자료형이 차지하는 메모리 크기는 컴퓨터 환경에 따라 조금씩 다를 수 있지만, 보통 <code class="language-plaintext highlighter-rouge">int</code>는 4바이트, <code class="language-plaintext highlighter-rouge">char</code>는 1바이트, <code class="language-plaintext highlighter-rouge">double</code>은 8바이트를 사용합니다. 이 크기는 <code class="language-plaintext highlighter-rouge">sizeof</code> 연산자로 직접 확인할 수 있습니다.</p>

<h2 id="예제-코드로-확인해보기">예제 코드로 확인해보기</h2>

<p>아래 코드는 여러 자료형의 변수를 선언하고, 각각의 값과 메모리 크기를 출력하는 예제입니다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">age</span> <span class="o">=</span> <span class="mi">25</span><span class="p">;</span>
    <span class="kt">float</span> <span class="n">height</span> <span class="o">=</span> <span class="mi">175</span><span class="p">.</span><span class="mi">5</span><span class="n">f</span><span class="p">;</span>
    <span class="kt">double</span> <span class="n">pi</span> <span class="o">=</span> <span class="mi">3</span><span class="p">.</span><span class="mi">14159265</span><span class="p">;</span>
    <span class="kt">char</span> <span class="n">grade</span> <span class="o">=</span> <span class="sc">'A'</span><span class="p">;</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"나이: %d살</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">age</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"키: %.1fcm</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">height</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"원주율: %.8f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">pi</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"학점: %c</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">grade</span><span class="p">);</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">--- 각 자료형의 크기 ---</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"int 크기: %zu 바이트</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">));</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"float 크기: %zu 바이트</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">float</span><span class="p">));</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"double 크기: %zu 바이트</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">double</span><span class="p">));</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"char 크기: %zu 바이트</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">char</span><span class="p">));</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="코드-동작-설명">코드 동작 설명</h2>

<ul>
  <li><code class="language-plaintext highlighter-rouge">int age = 25;</code>처럼 각 자료형에 맞는 변수를 선언하고 초기화했습니다.</li>
  <li><code class="language-plaintext highlighter-rouge">printf</code>에서 자료형마다 사용하는 서식 지정자(format specifier)가 다릅니다. 정수는 <code class="language-plaintext highlighter-rouge">%d</code>, 실수는 <code class="language-plaintext highlighter-rouge">%f</code>, 문자는 <code class="language-plaintext highlighter-rouge">%c</code>를 사용합니다. <code class="language-plaintext highlighter-rouge">%.1f</code>나 <code class="language-plaintext highlighter-rouge">%.8f</code>처럼 소수점 뒤에 숫자를 붙이면 출력할 소수 자릿수를 지정할 수 있습니다.</li>
  <li><code class="language-plaintext highlighter-rouge">height</code>처럼 <code class="language-plaintext highlighter-rouge">float</code> 값에는 숫자 뒤에 <code class="language-plaintext highlighter-rouge">f</code>를 붙여줘야 합니다. 붙이지 않으면 컴파일러가 기본적으로 <code class="language-plaintext highlighter-rouge">double</code>로 취급하기 때문에, 정확한 자료형을 지정해주는 습관을 들이는 게 좋습니다.</li>
  <li><code class="language-plaintext highlighter-rouge">sizeof</code> 연산자는 괄호 안에 넣은 자료형이나 변수가 메모리에서 차지하는 바이트 수를 알려줍니다. 결과값은 부호 없는 정수 타입이라서 <code class="language-plaintext highlighter-rouge">%zu</code>라는 전용 서식 지정자를 사용합니다.</li>
</ul>

<p>이 코드를 <code class="language-plaintext highlighter-rouge">gcc datatypes.c -o datatypes</code>로 컴파일하고 실행하면 아래와 비슷한 결과가 나옵니다. (크기는 컴파일러나 환경에 따라 약간 다를 수 있습니다.)</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>나이: 25살
키: 175.5cm
원주율: 3.14159265
학점: A

--- 각 자료형의 크기 ---
int 크기: 4 바이트
float 크기: 4 바이트
double 크기: 8 바이트
char 크기: 1 바이트
</code></pre></div></div>

<h2 id="핵심-요약">핵심 요약</h2>

<ul>
  <li>변수는 데이터를 저장하는 이름 붙은 메모리 공간이고, 자료형은 그 공간에 어떤 데이터를 담을지 정하는 규칙입니다.</li>
  <li><code class="language-plaintext highlighter-rouge">int</code>(정수), <code class="language-plaintext highlighter-rouge">float</code>/<code class="language-plaintext highlighter-rouge">double</code>(실수), <code class="language-plaintext highlighter-rouge">char</code>(문자)가 가장 기본적으로 쓰이는 자료형입니다.</li>
  <li><code class="language-plaintext highlighter-rouge">printf</code>로 값을 출력할 때는 자료형에 맞는 서식 지정자(<code class="language-plaintext highlighter-rouge">%d</code>, <code class="language-plaintext highlighter-rouge">%f</code>, <code class="language-plaintext highlighter-rouge">%c</code> 등)를 사용해야 합니다.</li>
  <li><code class="language-plaintext highlighter-rouge">sizeof</code> 연산자로 각 자료형이 차지하는 메모리 크기를 직접 확인할 수 있습니다.</li>
</ul>

<p>다음 편에서는 프로그램 실행 중에 값이 바뀌지 않는 데이터인 “상수와 리터럴”에 대해 알아보겠습니다. 변수와 상수의 차이가 무엇인지, 그리고 <code class="language-plaintext highlighter-rouge">const</code> 키워드는 어떻게 쓰는지 함께 살펴볼 예정입니다.</p>]]></content><author><name></name></author><category term="C언어" /><summary type="html"><![CDATA[지난 편에서 gcc 컴파일 과정을 살펴봤으니, 이제 본격적으로 C언어 문법으로 들어가 보겠습니다. 오늘 다룰 주제는 프로그래밍의 가장 기본이라고 할 수 있는 “변수와 자료형”입니다. 변수는 데이터를 담는 상자라고 생각하면 되고, 자료형은 그 상자에 어떤 종류의 데이터를 담을지 정해주는 규칙이라고 이해하면 쉽습니다.]]></summary></entry><entry><title type="html">첫 프로그램과 컴파일 과정</title><link href="/2026/09/09/first-program/" rel="alternate" type="text/html" title="첫 프로그램과 컴파일 과정" /><published>2026-09-09T09:00:00+09:00</published><updated>2026-09-09T09:00:00+09:00</updated><id>/2026/09/09/first-program</id><content type="html" xml:base="/2026/09/09/first-program/"><![CDATA[<p>지난 편에서는 개발환경을 설치하고 <code class="language-plaintext highlighter-rouge">hello.c</code>를 실행해서 화면에 <code class="language-plaintext highlighter-rouge">Hello, C language!</code>를 띄워봤습니다. 코드는 몇 줄 안 되지만, 그 안에는 C언어의 핵심 개념들이 다 들어있어요. 이번 편에서는 그 코드를 한 줄씩 뜯어보고, <code class="language-plaintext highlighter-rouge">gcc hello.c -o hello</code> 명령을 실행했을 때 컴퓨터 내부에서 실제로 어떤 과정이 일어나는지 살펴보겠습니다.</p>

<h2 id="코드-한-줄씩-뜯어보기">코드 한 줄씩 뜯어보기</h2>

<p>먼저 지난 편에서 썼던 예제를 다시 가져와 봅시다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Hello, C language!</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<ul>
  <li><code class="language-plaintext highlighter-rouge">#include &lt;stdio.h&gt;</code>: <code class="language-plaintext highlighter-rouge">stdio.h</code>는 “standard input/output(표준 입출력)”의 줄임말입니다. 이 줄은 “printf 같은 입출력 함수를 쓰겠다”고 컴파일러에게 미리 알려주는 역할을 합니다. 이걸 빼면 <code class="language-plaintext highlighter-rouge">printf</code>가 어디서 온 함수인지 몰라서 컴파일 에러가 납니다.</li>
  <li><code class="language-plaintext highlighter-rouge">int main(void)</code>: C 프로그램은 항상 <code class="language-plaintext highlighter-rouge">main</code> 함수에서 실행이 시작됩니다. 즉, 아무리 코드가 길어도 프로그램의 시작점은 항상 <code class="language-plaintext highlighter-rouge">main</code>이에요. <code class="language-plaintext highlighter-rouge">int</code>는 이 함수가 끝날 때 정수값을 반환한다는 뜻이고, <code class="language-plaintext highlighter-rouge">void</code>는 “입력값(매개변수)이 없다”는 뜻입니다.</li>
  <li><code class="language-plaintext highlighter-rouge">printf("Hello, C language!\n");</code>: 괄호 안의 문자열을 화면(정확히는 표준 출력)에 출력하는 함수입니다. 끝에 붙은 <code class="language-plaintext highlighter-rouge">\n</code>은 줄바꿈 문자로, 다음 출력이 새 줄에서 시작되게 해줍니다.</li>
  <li><code class="language-plaintext highlighter-rouge">return 0;</code>: <code class="language-plaintext highlighter-rouge">main</code> 함수를 종료하면서 운영체제에 0이라는 값을 돌려줍니다. 관례적으로 0은 “프로그램이 정상적으로 끝났다”는 의미로 쓰입니다. 만약 오류가 있었다면 0이 아닌 값을 반환해서 문제가 있었음을 알릴 수 있어요.</li>
</ul>

<h2 id="컴파일-과정-정확히-무슨-일이-일어날까">컴파일 과정, 정확히 무슨 일이 일어날까?</h2>

<p><code class="language-plaintext highlighter-rouge">gcc hello.c -o hello</code>라는 명령 한 줄을 실행하면 사실 컴퓨터 내부에서는 네 단계가 순서대로 진행됩니다.</p>

<ol>
  <li><strong>전처리(Preprocessing)</strong>: <code class="language-plaintext highlighter-rouge">#include</code>, <code class="language-plaintext highlighter-rouge">#define</code> 같은 <code class="language-plaintext highlighter-rouge">#</code>으로 시작하는 전처리 지시문을 처리하는 단계입니다. <code class="language-plaintext highlighter-rouge">#include &lt;stdio.h&gt;</code>가 있으면, 그 자리에 <code class="language-plaintext highlighter-rouge">stdio.h</code> 파일의 내용이 통째로 복사되어 들어갑니다.</li>
  <li><strong>컴파일(Compilation)</strong>: 전처리가 끝난 C 코드를 어셈블리어 코드로 변환합니다. 이 단계에서 문법 오류(세미콜론 누락, 괄호 짝이 안 맞는 경우 등)가 있으면 바로 에러가 발생합니다.</li>
  <li><strong>어셈블(Assembly)</strong>: 어셈블리 코드를 컴퓨터가 직접 이해할 수 있는 기계어, 즉 오브젝트 파일(<code class="language-plaintext highlighter-rouge">.o</code> 또는 <code class="language-plaintext highlighter-rouge">.obj</code>)로 변환합니다.</li>
  <li><strong>링킹(Linking)</strong>: 오브젝트 파일과 <code class="language-plaintext highlighter-rouge">printf</code> 같은 라이브러리 함수들을 하나로 묶어서 최종 실행 파일(<code class="language-plaintext highlighter-rouge">hello</code> 또는 <code class="language-plaintext highlighter-rouge">hello.exe</code>)을 만듭니다. <code class="language-plaintext highlighter-rouge">printf</code>의 실제 구현 코드는 우리가 작성하지 않았는데도 실행이 되는 이유가 바로 이 링킹 단계 덕분입니다.</li>
</ol>

<p>이 네 단계를 직접 눈으로 확인해보고 싶다면, 각 단계마다 결과물을 따로 만들어볼 수 있습니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 1. 전처리 결과만 확인 (확장된 소스 코드)</span>
gcc <span class="nt">-E</span> hello.c <span class="nt">-o</span> hello.i

<span class="c"># 2~3. 오브젝트 파일까지만 생성 (링킹 전 단계)</span>
gcc <span class="nt">-c</span> hello.c <span class="nt">-o</span> hello.o

<span class="c"># 4. 최종 실행 파일 생성 (전체 과정)</span>
gcc hello.c <span class="nt">-o</span> hello
</code></pre></div></div>

<h2 id="실행하고-결과-확인하기">실행하고 결과 확인하기</h2>

<p>터미널에서 아래처럼 컴파일하고 실행해봅시다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gcc hello.c <span class="nt">-o</span> hello
./hello
</code></pre></div></div>

<p>정상적으로 진행됐다면 아래와 같은 결과가 출력됩니다.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Hello, C language!
</code></pre></div></div>

<p>만약 중간에 세미콜론(<code class="language-plaintext highlighter-rouge">;</code>)을 하나 빼먹거나 <code class="language-plaintext highlighter-rouge">stdio.h</code>를 include하지 않으면 컴파일 단계에서 에러 메시지가 출력되면서 실행 파일 자체가 만들어지지 않습니다. 즉, C언어는 문법이 틀리면 아예 실행조차 되지 않는 엄격한 언어라는 점을 기억해두세요. 에러 메시지를 무서워하지 말고, 어떤 줄에서 어떤 문제가 있는지 차근차근 읽어보는 습관을 들이면 좋습니다.</p>

<h2 id="핵심-요약">핵심 요약</h2>

<ul>
  <li>C 프로그램은 항상 <code class="language-plaintext highlighter-rouge">main</code> 함수에서 시작됩니다.</li>
  <li><code class="language-plaintext highlighter-rouge">#include</code>는 다른 파일(주로 헤더 파일)의 내용을 가져오는 전처리 지시문입니다.</li>
  <li>컴파일은 “전처리 → 컴파일 → 어셈블 → 링킹” 네 단계를 거쳐 실행 파일이 만들어지는 과정입니다.</li>
  <li><code class="language-plaintext highlighter-rouge">gcc 파일명.c -o 실행파일명</code> 명령 하나로 이 네 단계가 한 번에 처리됩니다.</li>
</ul>

<p>다음 편에서는 프로그램에서 데이터를 저장하는 가장 기본적인 방법인 “변수와 자료형”에 대해 알아보겠습니다. <code class="language-plaintext highlighter-rouge">int</code>, <code class="language-plaintext highlighter-rouge">float</code>, <code class="language-plaintext highlighter-rouge">char</code> 같은 기본 자료형들이 각각 어떤 데이터를 담기 위한 것인지 하나씩 살펴볼 예정이니 기대해주세요.</p>]]></content><author><name></name></author><category term="C언어" /><summary type="html"><![CDATA[지난 편에서는 개발환경을 설치하고 hello.c를 실행해서 화면에 Hello, C language!를 띄워봤습니다. 코드는 몇 줄 안 되지만, 그 안에는 C언어의 핵심 개념들이 다 들어있어요. 이번 편에서는 그 코드를 한 줄씩 뜯어보고, gcc hello.c -o hello 명령을 실행했을 때 컴퓨터 내부에서 실제로 어떤 과정이 일어나는지 살펴보겠습니다.]]></summary></entry><entry><title type="html">C언어 소개 &amp;amp; 개발환경 설정</title><link href="/2026/09/07/intro-setup/" rel="alternate" type="text/html" title="C언어 소개 &amp;amp; 개발환경 설정" /><published>2026-09-07T21:00:00+09:00</published><updated>2026-09-07T21:00:00+09:00</updated><id>/2026/09/07/intro-setup</id><content type="html" xml:base="/2026/09/07/intro-setup/"><![CDATA[<p>C언어는 1972년 데니스 리치(Dennis Ritchie)가 벨 연구소에서 만든 프로그래밍 언어입니다. 반세기 가까이 지난 지금도 운영체제(리눅스, 윈도우 커널), 임베디드 시스템, 데이터베이스 엔진 같은 곳에서 여전히 핵심적으로 쓰이고 있어요. 최신 언어들(파이썬, 자바, 자바스크립트 등)이 대부분 C의 문법이나 개념을 참고했기 때문에, C를 익혀두면 다른 언어를 배울 때도 훨씬 수월해집니다.</p>

<p>C언어를 배우면 좋은 이유를 정리하면 이렇습니다.</p>

<ul>
  <li><strong>하드웨어에 가까운 언어</strong>: 메모리를 직접 다루는 감각을 익힐 수 있습니다.</li>
  <li><strong>속도가 빠름</strong>: 컴파일 언어라서 실행 속도가 매우 빠릅니다.</li>
  <li><strong>기초 체력</strong>: 포인터, 메모리 관리 같은 개념은 이후 어떤 언어를 배우든 도움이 됩니다.</li>
</ul>

<h2 id="개발환경-설정하기">개발환경 설정하기</h2>

<p>C언어는 컴파일러만 있으면 바로 시작할 수 있습니다. 운영체제별로 설치 방법이 조금씩 다르니, 자신이 쓰는 OS에 맞는 방법을 따라 하세요.</p>

<h3 id="windows">Windows</h3>

<ul>
  <li><strong>방법 1: GCC (MSYS2 / MinGW-w64)</strong> — 가볍게 명령줄 컴파일만 필요할 때 추천합니다.
    <ol>
      <li><a href="https://www.msys2.org/">MSYS2</a>를 다운로드해 설치합니다.</li>
      <li>MSYS2 터미널을 열고 아래 명령으로 GCC를 설치합니다.
        <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pacman <span class="nt">-S</span> mingw-w64-x86_64-gcc
</code></pre></div>        </div>
      </li>
      <li>설치된 <code class="language-plaintext highlighter-rouge">mingw64\bin</code> 폴더 경로를 시스템 환경 변수 <code class="language-plaintext highlighter-rouge">PATH</code>에 추가하면, 일반 명령 프롬프트/PowerShell에서도 <code class="language-plaintext highlighter-rouge">gcc</code> 명령을 쓸 수 있습니다.</li>
    </ol>
  </li>
  <li><strong>방법 2: Visual Studio (Community, 무료)</strong> — IDE에서 편집·빌드·디버깅을 한 번에 하고 싶다면 추천합니다.
    <ol>
      <li><a href="https://visualstudio.microsoft.com/ko/downloads/">Visual Studio 다운로드 페이지</a>에서 <strong>Visual Studio Community</strong> 버전을 설치합니다.</li>
      <li>설치 화면의 워크로드 목록에서 <strong>“C++를 사용한 데스크톱 개발”</strong>을 체크합니다.</li>
      <li>설치 후 새 프로젝트를 만들 때 “빈 프로젝트”를 선택하고 <code class="language-plaintext highlighter-rouge">.c</code> 파일을 추가하면, 상단의 로컬 Windows 디버거(▶) 버튼으로 바로 빌드하고 실행할 수 있습니다.</li>
    </ol>
  </li>
</ul>

<h3 id="ubuntu-linux">Ubuntu (Linux)</h3>

<p>대부분의 배포판에 GCC가 기본 포함되어 있거나, 아래 한 줄로 바로 설치할 수 있습니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt update
<span class="nb">sudo </span>apt <span class="nb">install </span>build-essential
</code></pre></div></div>

<h3 id="macos">macOS</h3>

<p>Xcode Command Line Tools를 설치하면 <code class="language-plaintext highlighter-rouge">gcc</code> 명령으로 컴파일러(clang 기반)를 바로 쓸 수 있습니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>xcode-select <span class="nt">--install</span>
</code></pre></div></div>

<p>설치가 끝나면(Visual Studio 방식이 아니라면) 터미널이나 명령 프롬프트에서 아래 명령으로 설치를 확인합니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gcc <span class="nt">--version</span>
</code></pre></div></div>

<p>버전 정보가 출력되면 정상적으로 설치된 것입니다.</p>

<h2 id="에디터는-vscode를-추천합니다">에디터는 VSCode를 추천합니다</h2>

<p>컴파일러만 있어도 메모장으로 코드를 짤 수는 있지만, 요즘은 대부분 <strong>Visual Studio Code(VSCode)</strong>를 씁니다. 무료이고 가볍고, 확장 프로그램만 몇 개 깔면 자동완성·디버깅까지 전부 지원돼서 C언어 입문용으로도 최고의 선택입니다. (Windows에서 Visual Studio를 이미 설치했다면 이 단계는 건너뛰고 Visual Studio를 그대로 써도 됩니다.)</p>

<ol>
  <li><a href="https://code.visualstudio.com/">code.visualstudio.com</a>에서 운영체제에 맞는 버전을 설치합니다.</li>
  <li>VSCode를 실행하고 왼쪽 사이드바의 확장(Extensions) 아이콘을 눌러 아래 확장을 설치합니다.
    <ul>
      <li><strong>C/C++</strong> (Microsoft) — 문법 강조, 자동완성, 디버깅 지원</li>
      <li><strong>Code Runner</strong> — 코드를 한 번의 단축키로 바로 실행 (선택 사항이지만 입문자에게 편리합니다)</li>
    </ul>
  </li>
  <li><code class="language-plaintext highlighter-rouge">hello.c</code> 파일이 있는 폴더를 VSCode로 엽니다 (메뉴 <code class="language-plaintext highlighter-rouge">파일 &gt; 폴더 열기</code>).</li>
  <li>Code Runner를 설치했다면, 코드 작성 후 우측 상단의 ▶(Run) 버튼이나 단축키 <code class="language-plaintext highlighter-rouge">Ctrl+Alt+N</code>으로 바로 실행 결과를 확인할 수 있습니다.</li>
</ol>

<p>즉, “컴파일러(GCC 등) + VSCode(에디터)” 조합이 요즘 가장 널리 쓰이는 C언어 개발환경이라고 보면 됩니다.</p>

<h2 id="예제-코드로-확인해보기">예제 코드로 확인해보기</h2>

<p>설치가 잘 됐는지 아주 간단한 프로그램으로 테스트해봅시다. 아래 코드를 <code class="language-plaintext highlighter-rouge">hello.c</code>라는 파일로 저장하세요.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Hello, C language!</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>터미널에서 다음 명령으로 컴파일하고 실행합니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gcc hello.c <span class="nt">-o</span> hello
./hello
</code></pre></div></div>

<h2 id="실행-결과">실행 결과</h2>

<p>정상적으로 설치되었다면 터미널에 아래와 같이 출력됩니다.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Hello, C language!
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">gcc hello.c -o hello</code> 명령은 <code class="language-plaintext highlighter-rouge">hello.c</code> 소스 코드를 컴파일해서 <code class="language-plaintext highlighter-rouge">hello</code>라는 실행 파일을 만들어주고, <code class="language-plaintext highlighter-rouge">./hello</code>는 그 실행 파일을 실행하는 명령입니다. 아직 코드 내용을 몰라도 괜찮습니다. 지금은 “내 컴퓨터에서 C 코드를 컴파일하고 실행할 수 있다”는 것만 확인하면 충분해요.</p>

<h2 id="요약">요약</h2>

<ul>
  <li>C언어는 오래됐지만 여전히 널리 쓰이는, 성능이 뛰어난 언어입니다.</li>
  <li>운영체제에 맞는 컴파일러(GCC, Visual Studio 등)를 설치하면 바로 시작할 수 있습니다.</li>
  <li><code class="language-plaintext highlighter-rouge">gcc 파일명.c -o 실행파일명</code> → <code class="language-plaintext highlighter-rouge">./실행파일명</code> 순서로 컴파일하고 실행합니다.</li>
</ul>

<p>다음 편에서는 방금 작성한 <code class="language-plaintext highlighter-rouge">hello.c</code> 코드를 한 줄씩 뜯어보면서, 컴파일 과정에서 실제로 무슨 일이 일어나는지 자세히 알아보겠습니다. (2편: 첫 프로그램과 컴파일 과정)</p>]]></content><author><name></name></author><category term="C언어" /><summary type="html"><![CDATA[C언어는 1972년 데니스 리치(Dennis Ritchie)가 벨 연구소에서 만든 프로그래밍 언어입니다. 반세기 가까이 지난 지금도 운영체제(리눅스, 윈도우 커널), 임베디드 시스템, 데이터베이스 엔진 같은 곳에서 여전히 핵심적으로 쓰이고 있어요. 최신 언어들(파이썬, 자바, 자바스크립트 등)이 대부분 C의 문법이나 개념을 참고했기 때문에, C를 익혀두면 다른 언어를 배울 때도 훨씬 수월해집니다.]]></summary></entry><entry><title type="html">블로그를 시작합니다</title><link href="/2026/09/07/welcome/" rel="alternate" type="text/html" title="블로그를 시작합니다" /><published>2026-09-07T20:40:00+09:00</published><updated>2026-09-07T20:40:00+09:00</updated><id>/2026/09/07/welcome</id><content type="html" xml:base="/2026/09/07/welcome/"><![CDATA[<p>안녕하세요! 소소한 지식을 공부하고 정리해서 공유하는 블로그입니다.</p>

<p>앞으로 다양한 주제의 글을 꾸준히 올릴 예정입니다. 잘 부탁드립니다.</p>]]></content><author><name></name></author><category term="소개" /><summary type="html"><![CDATA[안녕하세요! 소소한 지식을 공부하고 정리해서 공유하는 블로그입니다.]]></summary></entry></feed>