<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>동학 개발 운동</title>
    <link>https://donghak-dev.tistory.com/</link>
    <description>Samsung Research

email : donghark03@naver.com</description>
    <language>ko</language>
    <pubDate>Sat, 8 Aug 2026 06:16:17 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Mark31</managingEditor>
    <image>
      <title>동학 개발 운동</title>
      <url>https://tistory1.daumcdn.net/tistory/4429644/attach/2c7263df5ec24c92ab8a27419642b712</url>
      <link>https://donghak-dev.tistory.com</link>
    </image>
    <item>
      <title>[Tensorflow] 1. MNIST 예제 시작해보</title>
      <link>https://donghak-dev.tistory.com/225</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x8ga4/btrTjFunBSs/qWGYshiQt8Lw4o4ggKYU01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x8ga4/btrTjFunBSs/qWGYshiQt8Lw4o4ggKYU01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x8ga4/btrTjFunBSs/qWGYshiQt8Lw4o4ggKYU01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx8ga4%2FbtrTjFunBSs%2FqWGYshiQt8Lw4o4ggKYU01%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;417&quot; height=&quot;267&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Tensorflow는 많은 기관, 학교, 기업에서 사용하고 있는 딥러닝 프레임워크입니다.&lt;/strong&gt;&lt;/h4&gt;
&lt;h4&gt;&lt;strong&gt;딥러닝을 학습하고 익히는데 있어 Tensorflow에서 제공하고 있는 튜터리얼을 살펴 보도록 하겠습니다.&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;다음은 텐서플로우 공식 튜터리얼 링크입니다. &lt;/p&gt;
&lt;p&gt;url : &lt;a href=&quot;https://www.tensorflow.org/tutorials/quickstart/beginner&quot;&gt;https://www.tensorflow.org/tutorials/quickstart/beginner&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;바로 예제 코드부터 살펴보겠습니다. &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;&amp;quot;&amp;quot;
This Contents is about MNIST from Tensorflow Official Tutorial
url : https://www.tensorflow.org/tutorials/quickstart/beginner
All of the codes are from the url above.
&amp;quot;&amp;quot;&amp;quot;

import tensorflow as tf  # Import Tensorflow Library

# Load MNIST Dataset
MNIST = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = MNIST.load_data()

# Normalize the data
# MNIST is Image Data, so it is 0~255
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential(
    [
        tf.keras.layers.Flatten(input_shape=(28, 28)),  # Flatten the data
        tf.keras.layers.Dense(128, activation=&amp;quot;relu&amp;quot;),  # Dense Layer
        tf.keras.layers.Dropout(0.2),  # Dropout Layer
        tf.keras.layers.Dense(10, activation=&amp;quot;softmax&amp;quot;),  # Output Layer
    ]
)

# Compile the model
model.compile(optimizer=&amp;quot;adam&amp;quot;, loss=&amp;quot;sparse_categorical_crossentropy&amp;quot;, metrics=[&amp;quot;accuracy&amp;quot;])

# Train the model
# epochs : How many times the model will be trained
model.fit(x_train, y_train, epochs=5)

# Evaluate the model
# verbose : 0, 1, 2
# verbose mean how much information will be shown
model.evaluate(x_test, y_test, verbose=2)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;다음은 실행 결과입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1393&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SEPpZ/btrTihm819N/xon8GPYMJbgmHkaParf100/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SEPpZ/btrTihm819N/xon8GPYMJbgmHkaParf100/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SEPpZ/btrTihm819N/xon8GPYMJbgmHkaParf100/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSEPpZ%2FbtrTihm819N%2Fxon8GPYMJbgmHkaParf100%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;1393&quot; height=&quot;400&quot; data-origin-width=&quot;1393&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;몇개의 레이어를 쓰지 않았지만 97프로라는 높은 결과값을 가지고 있습니다.&lt;/p&gt;
&lt;p&gt;한번 살펴 보도록 하겠습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-.py&quot;&gt;import tensorflow as tf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 부분은 텐서플로우 모듈을 사용하겠다는 선언입니다.&lt;/p&gt;
&lt;p&gt;그 다음은 데이터를 로드하는 것입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-.py&quot;&gt;# Load MNIST Dataset
MNIST = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = MNIST.load_data()

# Normalize the data
# MNIST is Image Data, so it is 0~255
x_train, x_test = x_train / 255.0, x_test / 255.0&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;여기서 MNIST라는 데이터를 불러옵니다. 데이터는 tf.keras.datasets에 있기 때문에 바로 불러올 수 있습니다.  &lt;/li&gt;
&lt;li&gt;MNIST나 CIFAR 등의 데이터는 별도의 작업 없이 바로 불러올 수 있도록 되어있습니다.  &lt;/li&gt;
&lt;li&gt;많은 초보자들이 처음 접하는 데이터이기 때문입니다.&lt;/li&gt;
&lt;li&gt;MNIST데이터는 10개의 숫자로 이루어진 이미지입니다. 데이터는 GRAY 스케일로 이루어져 있고 0~255사이의 값을 가지기 때문에 /255.0을 통해서 0과 1사이의 값으로 바꾸어 줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-.py&quot;&gt;model = tf.keras.models.Sequential(
    [
        tf.keras.layers.Flatten(input_shape=(28, 28)),  # Flatten the data
        tf.keras.layers.Dense(128, activation=&amp;quot;relu&amp;quot;),  # Dense Layer
        tf.keras.layers.Dropout(0.2),  # Dropout Layer
        tf.keras.layers.Dense(10, activation=&amp;quot;softmax&amp;quot;),  # Output Layer
    ]
)&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;이 부분은 모델을 쌓는 부분입니다. 여기서는 한개의 Flatten과 2개의 Dense 1개의 Dropout을 사용하고 있습니다.&lt;/li&gt;
&lt;li&gt;Flatten은 2차원 데이터를 1차원으로 풀어헤치는 작접입니다. 28X28크기의 Image데이터를 한줄로 펼칩니다. 이는 Dense를 위한 사전 작업입니다.&lt;/li&gt;
&lt;li&gt;펼처진 입력을 Dense (Fully Connected Layer)와 Relu 함수를 통해서 네트워크의 weight를 업데이트 해줍니다.&lt;/li&gt;
&lt;li&gt;이후 Dropout 을 통해서 과적합을 방지해 줍니다. dropout은 랜덤하게 weight 값을 삭제합니다.&lt;/li&gt;
&lt;li&gt;이후 10개의 레이블로 모으기 위해서 다시 한번 Dense 계층을 Softmax와 함께 거칩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-.py&quot;&gt;model.compile(optimizer=&amp;quot;adam&amp;quot;, loss=&amp;quot;sparse_categorical_crossentropy&amp;quot;, metrics=[&amp;quot;accuracy&amp;quot;])&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;이후 옵티마이저로 adam&lt;/li&gt;
&lt;li&gt;loss function으로 sparse_categorical_crossentropy로 모델을 설정해 줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-.py&quot;&gt;# Train the model
# epochs : How many times the model will be trained
model.fit(x_train, y_train, epochs=5)

# Evaluate the model
# verbose : 0, 1, 2
# verbose mean how much information will be shown
model.evaluate(x_test, y_test, verbose=2)&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;이후 train과 evaluate를 통해서 모델을 학습하고 평가하게 됩니다. &lt;/li&gt;
&lt;li&gt;train은 포워딩과 백프로파게이션을 통해서 웨이트를 업데이트합니다. Tensorflow에서는 이러한 과정을 train함수로 추상화하여 제공하고 있습니다. 물론 직접 step을 설정하여 학습을 진행 할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;위에 코드는 단순히 Tensorflow 사용법에 대해서 다루고 있기 때문에 Deep Learning에 대한 기본이 없으시면 코드를 따라가도 큰 학습을 못 하실 가능성이 높습니다. Flatten과 Dense, Activation Function, Optimizer, Loss Function 등을 학습하시고 오시면 큰 도움이 될 수 있습니다.&lt;/h4&gt;</description>
      <category> Artificial Intelligence/ Tensorflow, Pytorch</category>
      <category>tensorflow</category>
      <category>tensorflow 2.0</category>
      <author>Mark31</author>
      <guid isPermaLink="true">https://donghak-dev.tistory.com/225</guid>
      <comments>https://donghak-dev.tistory.com/225#entry225comment</comments>
      <pubDate>Sat, 10 Dec 2022 01:57:21 +0900</pubDate>
    </item>
    <item>
      <title>[C][Ch.7] C언어 기초6</title>
      <link>https://donghak-dev.tistory.com/223</link>
      <description>&lt;article class=&quot;markdown-body entry-content&quot;&gt;
&lt;h3 id=&quot;c언어-기초-6&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;C언어 기초 6&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 id=&quot;구조체-기본&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;구조체 기본&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조체(structure type) : 사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입. 즉 기본 타입으로만으로는 나타낼 수 없는 사용자가 원하는 데이터 타입을 새롭게 정의하는 것입니다.&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;pre class=&quot;cpp&quot;&gt;&lt;code&gt;struct name
{
    int name1;
    int name2;
    char name3;
    float name4;
}; //이렇게 정의

struct struct_name variable_name; //다음과 같이 사용합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;typedef-키워드&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;typedef 키워드&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;typeof는 이미 존재하는 타입에 새로운 이름을 부여할 때 사용합니다. 구조체는 매번 struct 키워드를 통해서 구조체임을 명시해야하는 방면 typeof 키워드를 사용하여 구조체에 이름을 선언하면 매번 struct 키워드를 사용하지 않아도 됩니다.&lt;/p&gt;
&lt;pre class=&quot;rust&quot;&gt;&lt;code&gt;typeof struct strcut_name new_struct name;

//아래는 예시
typeof struct book MYBOOK;

//또는 아래와 같이 동시에 수행할 수 있습니다.
typeof struct (struct_name)
{
    type1 name1;
    type2 name2;

}new_struct_name;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;구조체의-사용방법&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;구조체의 사용방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조체 멤버로의 접근 방법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;.&quot; 연산자를 통해서 사용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;my_book.author = 10; //다음과 같이 &quot;.&quot;연산자를 통해서 멤버변수에 접근할 수 있습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조체 멤버의 초기화&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래와 같이 초기화를 진행 할 수 있습니다. 초기화 하지않은 변수는 0으로 초기화 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;my_cloth = {.shoe = &quot;Nike&quot;, .shirt = &quot;Thom&quot;, .pants = &quot;New Balance&quot; };

// 다음과 같이 초기화도 가능합니다.

my_cloth = {&quot;Nike&quot;, &quot;Thom&quot;, &quot;New Balance&quot;};&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;구조체-배열-선언&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;구조체 배열 선언&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C언어에서는 배열의 요소가 될 수 있는 타입에는 제한이 없고, 구조체 또한 배열의 한 요소가 될 수 있습니다. 다음과 같이 선언하고 사용할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;struct book text_book[3] =
{
    {&quot;korean&quot;, &quot;Park&quot;, 15000};
    {&quot;English&quot;, &quot;Kim&quot;, 20000};
    {&quot;Math&quot;, &quot;Lee&quot;, 30000};
};
printf(&quot;%s, %s, %s\n&quot;, text_book[0].title, text_book[0].author, text_book[0].price);&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;구조체를-가리키는-포인터&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;구조체를 가리키는 포인터&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조체의 이름은 포인터가 아닙니다. 따라서 다음과 같이 사용할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;struct book* ptr_my_book;

string a = (*ptr_my_book).author;

string a = ptr_my_book -&amp;gt; author;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;함수와-구조체&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;함수와 구조체&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C언어에서는 함수를 호출할 때 인수, 반환값으로 구조체를 사용할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;typedef struct
{
    int savings;
    int loan;
} PROP;

int main(void)
{
    int park_prop;
    PROP park = {1000000, 100002030};

    park_prop = calcProperty/(park.savings, park.loan);

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;중첩된-구조체&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;중첩된 구조체&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러개의 구조체를 중첩할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;struct name
{
    char first[512];
    char last[512];
};

struct friends
{
    struct name friend_name;
    char address[512];
    char job[512];
};

int main(void)
{
    struct friend park =
    {
        {&quot;길동&quot;, &quot;홀&quot;}
        &quot;서울&quot;,
        &quot;개발자&quot;
    };
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;구조체의-크기&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;구조체의 크기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 구조체의 크기는 멤버 변수에 따릅니다. 하지만 항상 같은 것은 아닙니다. 그것은 성능을 위해서 바이트 패팅을 넣기 때문입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;바이트 패팅(byte padding)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴파일러는 프로그램의 속도 향상을 위해 바이트 패딩을 적용합니다. 이는 가장 큰 변수를 기준으로 메모리 크기를 맞추어 접근을 용이하게 만드는 것입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;공용체와-열거체&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;공용체와 열거체&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공용체 : Union 키워드를 사용하여 선언합니다. 멤버 변수가 하나의 메모리 공간을 공유한다는 것 이외에는 구조체와 동일합니다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;typedef union
{
    unsigned char a;
    unsigned short b;
    unsigned int c;
}DATA;

int main(void)
{
    DATA var;
    var.c = 0x11111111;

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;열거체 : enumerated types는 새롱누 타입을 선언하면서, 동시에 해당 타입이 가질 수 있는 정수형 상숫값도 명시할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;enum Weather {SUNNY = 0, CLOUD = 10, RAIN = 20, SNOW = 30};
int main(void)
{
    enum Weather wea;
    wea = SUNNY;

    switch (wea)
    {
        case SUNNY:
            break;
        case CLOUD:
            break;
        case RAIN:
            break;
        case SNOW:
            break;
        default:
            break;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;reference&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보다 자세한 내용을 학습하고 싶으시면 아래 링크를 참조해 주세요.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.tcpschool.com/c/intro&quot;&gt;http://www.tcpschool.com/c/intro&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category> Computer Science/ 개발 언어 (Language)</category>
      <author>Mark31</author>
      <guid isPermaLink="true">https://donghak-dev.tistory.com/223</guid>
      <comments>https://donghak-dev.tistory.com/223#entry223comment</comments>
      <pubDate>Fri, 10 Sep 2021 17:15:09 +0900</pubDate>
    </item>
    <item>
      <title>[C][Ch.6] C언어 기초5</title>
      <link>https://donghak-dev.tistory.com/222</link>
      <description>&lt;article class=&quot;markdown-body entry-content&quot;&gt;
&lt;h3 id=&quot;c언어-기초-5&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;C언어 기초 5&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 id=&quot;입출력&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;입출력&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;기본적인 입출력&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C언어에서는 기억장치에 저장되는 파일을 다루는 것처럼 입출력 장치를 다룹니다. 즉 키보드, 마우스 같은 콘솔 장치도 파일처럼 처리합니다. stdin 표준 스트림을 통해서 입력 장치를 다루며, stdout 표준 스트림을 통해서 출력 장치를 다룹니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;스트림&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C 언어는 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림이라는 것을 통해 다룹니다. 스트림이란 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미합니다. 이러한 스트림은 &quot;stdin&quot;, &quot;stdout&quot;, &quot;stderr&quot; 등이 기본으로 제공되고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;EOF&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C 언어에서는 파일의 끝에 도달했을 때 특별한 값을 반환합니다. 그 값을 EOF (End Of File)이라고 하며, 실제로 이 값은 -1을 나타냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;문자 입력 함수&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;getchar() 함수&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;getchar() 함수는 표준 입력 스트림인 키보드로부터 &quot;하나의 문자&quot;를 입력 받음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int getchar(void);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;fgetc() 함수&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마찬가지로 &quot;하나의 문자&quot;를 입력받음 하지만 입력받을 스트림을 인수로 전달하여 지정이 가능하다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int fgetc(FILE *stream);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;putchar() 함수&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 문자를 출력하는 함수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int putchar(int c);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;fputc() 함수&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 문자를 출력, 출력할 스트림 지정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int fputc(int c, FILE *stream);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;문자열&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C언어에서는 &quot;&quot;를 사용해 표현되는 문자열을 문자열 상수라고 부릅니다. 이러한 문자열은 연속된 문자들의 집합입니다. 따라서 다음과 같이 문자열을 선언할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;axapta&quot;&gt;&lt;code&gt;char str[] = &quot;this is string&quot;;
char str1[7] = &quot;String&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;NULL 문자&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자형 배열로 선언된 변수는 문자열의 끝을 알려야 합니다. 이때 이를 위해서 NULL 값을 추가해줍니다. 이는 '\0' 으로 표시하고, 아스키코드값으로는 0입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;문자열 입력&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;fgets() 함수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열을 입력 받을 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
char *fgets(char * restrict s, int n, FILE * restrict stream);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;문자열 출력&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;puts() 함수&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int puts(const char *s);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;fputs() 함수&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int fputs(const char * restrict s, FILE * restrict stream);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;문자열 처리 함수&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C언어에서 문자열이란 기본 타입에 해당하지 않기 때문에 컴파일러가 제공하는 연산자의 사용이 자유롭지 않습니다. 따라서 다양한 함수를 사용해서 처리합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;strlen() 함수&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열의 길이를 반환합니다. ( 널 문자는 길이에서 제외합니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;string.h&amp;gt;
size_t strlen(const char *s);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;strcat() 함수와 strncat() 함수&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 문자열에 다른 문자열을 연결합니다. strncat()은 오버플로우를 방지해줍니다. (최대길이를 제한)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;string.h&amp;gt;

char *strcat(char * restrict s1, const char *restrict s2);

char *strncat(char * restrict s1, const char *restrict s2, size_t n);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;strcpy() 함수와 strncpy() 함수&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;strcpy(), strncpy()는 문자열을 복사하는 함수입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

char *strcpy(char * restrict s1, const char* restrict s2);

char *strncpy(char * restrict s1, const char * restrict s2, size_t n);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;strcmp() 함수&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열의 내용을 비교하는 함수 입니다.&lt;/li&gt;
&lt;li&gt;완전히 같으면 0 반환&lt;/li&gt;
&lt;li&gt;첫번째 인수가 더 크면 양수 반환&lt;/li&gt;
&lt;li&gt;두번째 인수가 더 크면 음수 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int strcmp(const char *s1, const char *s2);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;atoi(), atol(), atoll(), atof() 함수&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 함수들은 문자열 타입에서 숫자 타입으로 변환해주는 함수입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdlib.h&amp;gt;
int atoi(const char *nptr);
long int atol(const char *nptr);
long long int atoll(const char *nptr);
double atof(const char *nptr);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;toupper() 함수와 tolower()함수&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열을 모두 대문자, 소문자로 전환하는 함수입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;ctype.h&amp;gt;
int toupper(int c);
int tolower(int c);&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;reference&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보다 자세한 내용을 학습하고 싶으시면 아래 링크를 참조해 주세요.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.tcpschool.com/c/intro&quot;&gt;http://www.tcpschool.com/c/intro&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category> Computer Science/ 개발 언어 (Language)</category>
      <author>Mark31</author>
      <guid isPermaLink="true">https://donghak-dev.tistory.com/222</guid>
      <comments>https://donghak-dev.tistory.com/222#entry222comment</comments>
      <pubDate>Thu, 9 Sep 2021 17:06:02 +0900</pubDate>
    </item>
    <item>
      <title>[C][Ch.5] C언어 기초4</title>
      <link>https://donghak-dev.tistory.com/221</link>
      <description>&lt;article class=&quot;markdown-body entry-content&quot;&gt;
&lt;h3 id=&quot;c언어-기초4&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;C언어 기초4&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 id=&quot;포인터와-배열&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;포인터와 배열&lt;/b&gt;&lt;/span&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;즉 배열의 이름은 배열의 주소값을 저장하고 있는 포인터입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 아래와 같은 응용이 가능합니다.&lt;/p&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;int arr[3] = {10, 20, 30, 40, 50};
printf(&quot;%d %d %d %d %d\n&quot;, arr[0], arr[1], arr[2]);
printf(&quot;%d %d %d %d %d\n&quot;, *(arr +0), *(arr + 1), *(arr + 2), *(arr + 3), *(arr + 4));
// 위의 두 printf문은 같은 결과를 출력하게 됩니다. 즉 배열의 이름을 활용한 주솟값 연산이 가능하다는 것입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;포인터-배열&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;포인터 배열&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터 배열은 배열의 요소로 포인터 변수를 가진다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;int arr_len;
int num1 = 10;
int num2 = 20;
int num3 = 30;

int* arr[3] = {&amp;amp;num1, &amp;amp;num2, &amp;amp;nnum3};&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;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;int* ptrArr[3]; //포인터 배열
int (*ptrArr)[3]; // 배열 포인터&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;메모리-구조&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;메모리 구조&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래밍을 하는데 있어서 내부 구조를 이해하는 것은 중요하다. 특히 C와 같이 하드웨어와 밀접한 작업을 할 수 있는 언어는 더욱 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 프로그램이 실행되기 위해서는 프로그램이 메모리(주로 우리가 말하는 DRAM)에 로드되어야 한다. 또한 이러한 프로그램에서 사용되는 다양한 데이터들도 메모리에 저장되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 컴퓨터 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있고 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드(Code) 영역
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드영역에는 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 부릅니다. 여기서 CPU가 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;데이터(Data) 영역
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터영역에는 프로그램의 전역 변수와 정적 변수가 저장됩니다. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소명합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스택(Stack) 영역
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스택영역은 함수의 호출과 관게되는 지역 변수와 매개 변수가 저장되는 영역입니다. 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다. 이러한 함수의 정보를 스택 프레임이라고 부릅니다. 스택은 말 그대로 스택구조로 되어 있으며 푸시와 팝을 통해 데이터를 인출 삽입합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;힙(Heap) 영역
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;힙 영역은 사용자가 직접 관리할 수 있는 메모리 영역입니다. 사용자가 동적할당을 하게 되면 이 부분에 할당되게 됩니다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;img style=&quot;letter-spacing: 0px;&quot; src=&quot;https://user-images.githubusercontent.com/44962038/132458784-98c4272a-b3f0-4e09-81a7-3b94b1e06424.png&quot; alt=&quot;image&quot; width=&quot;311&quot; height=&quot;574&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;
&lt;article class=&quot;markdown-body entry-content&quot;&gt;
&lt;h4 id=&quot;메모리-동적-할당&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;메모리 동적 할당&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 동적 할당 (Memory Dynamic Allocation)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 영역과 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 결정됩니다.&lt;/li&gt;
&lt;li&gt;하지만 힙 영역의 크기는 런 타임에 할당되며 사용자가 제어할 수 있습니다.&lt;/li&gt;
&lt;li&gt;이렇게 힙 영역에 메모리를 할당받아 사용하는 것을 메모리의 동적 할당이라고 합니다.&lt;/li&gt;
&lt;li&gt;여기서 동적이라는 뜻은 프로그램이 실행중인 상황에서 메모리를 할당하기 때문에 즉 런타임시에 메모리를 할당 받을 수 있기 때문에 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;malloc함수&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;malloc()함수&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;#include &amp;lt;stdlib.h&amp;gt;

void *malloc(size_f size);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 함수를 통해서 메모리를 할당 받을 수 있습니다. 이때 아래와 같은 조건에 따라서 메모리를 할당 받으면 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리의 크기는 바이트 단위 (보통 원하는 사이즈를 위해서 sizeof(int) * 4와 같은 형식으로 사용합니다.)&lt;/li&gt;
&lt;li&gt;할당 할 수 있는 적당한 공간이 없으면 널 포인터를 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;free-함수&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;free 함수&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;free() 함수는 할당 받은 메모리 공간을 운영체제로 반환하는 함수입니다. 많은 공간을 동적으로 할당하고 해제해주지 않으면 메모리 공간이 부족해지는 현상이 발생하고 이를 메모리 누수 (Memory Leak)라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;free()함수는 해재하고자하는 메모리의 포인터를 인수로 주어 사용합니다. 아래 예제를 보면 좀 더 쉽게 이해 할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;#include &amp;lt;stdlib.h&amp;gt;

ptr_arr = (int*) malloc(arr_len * sizeof(innt));

if (ptr_arr == NULL){ //NULL 포인터를 반환한 경우 : 실패시
    exit(1);
}

// ~~~~

free(ptr_arr);&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;calloc-함수&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;calloc() 함수&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;calloc() 함수는 malloc() 함수와 마찬가지이지만 아래와 같은 차이가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리를 할당 받은 후 모든 값을 0으로 초기화해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;#include &amp;lt;stdlib.h&amp;gt;
void *calloc(size_t s, size_t size);&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;realloc-함수&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;realloc() 함수&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;realloc() 함수는 이미 할당된 메모리의 크기를 바꾸어 재할당할 때 사용합니다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;#include &amp;lt;stdlib.h&amp;gt;
void *realloc(void *ptr, size_t size);&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;reference&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보다 자세한 내용을 학습하고 싶으시면 아래 링크를 참조해 주세요.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.tcpschool.com/c/intro&quot;&gt;http://www.tcpschool.com/c/intro&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category> Computer Science/ 개발 언어 (Language)</category>
      <author>Mark31</author>
      <guid isPermaLink="true">https://donghak-dev.tistory.com/221</guid>
      <comments>https://donghak-dev.tistory.com/221#entry221comment</comments>
      <pubDate>Wed, 8 Sep 2021 17:03:48 +0900</pubDate>
    </item>
    <item>
      <title>[ML] 머신 러닝이란 무엇인가</title>
      <link>https://donghak-dev.tistory.com/220</link>
      <description>&lt;article class=&quot;markdown-body entry-content&quot;&gt;
&lt;h3 id=&quot;1-머신-러닝-machine-learning이란-무엇인가&quot; data-ke-size=&quot;size23&quot;&gt;1. 머신 러닝 (Machine Learning)이란 무엇인가&lt;/h3&gt;
&lt;h4 id=&quot;머신-러닝이란-무엇인가-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;머신 러닝이란 무엇인가 ?&lt;/b&gt;&lt;/span&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;최근에는 이러한 일련의 과정을 데이터를 학습 알고리즘을 통해서 학습하고 모델을 생성한다고 합니다.&lt;/p&gt;
&lt;h4 id=&quot;머신러닝-용어-정리&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;머신러닝 용어 정리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 분야에서는 여러 단어들에 대해서 여러 의미가 존재하기 때문에 학습을 진행하기 전에 용어를 정리한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터(data), 사례(instance), 샘플(sample) : 학습을 위한 자료, 기록&lt;/li&gt;
&lt;li&gt;속성(attribute), 특성(feature) : 데이터의 특정한 부분 또는 성질&lt;/li&gt;
&lt;li&gt;속성 공간(attrivute space), 샘플 공간(sample space), 특성 벡터(feature vector) : 속성들, 샘플들을 포함하고 있는 확장된 영역을 의미한다. 이러한 특성을 하나의 좌표 벡터로 상응한 것을 특성 벡터라고 한다.&lt;/li&gt;
&lt;li&gt;차원수(dimensionality) : 샘플 공간에 있는 샘플이 가지고 있는 속성값의 갯수를 말한다.&lt;/li&gt;
&lt;li&gt;학습(learning), 훈련(training) : 데이터를 통해서 모델을 생성하는 과정&lt;/li&gt;
&lt;li&gt;훈련 데이터(traing data) : 모델 생성에 사용되는 데이터 이러한 데이터의 집합을 세트라고 부른다&lt;/li&gt;
&lt;li&gt;가설(hypothesis) : 데이터 속에 잠재된 특정 규칙, 발견하고자 하는 규칙&lt;/li&gt;
&lt;li&gt;분류(Classification) : 이산값에 대한 학습 문제&lt;/li&gt;
&lt;li&gt;회귀(Regression) : 정량적 값에 대한 학습 문제&lt;/li&gt;
&lt;li&gt;클러스터링(Clustering) : 특성에 따라 군집을 나누는 문제&lt;/li&gt;
&lt;li&gt;지도 학습(Supervised Learning) : 레이블을 보유한 상태에서 모델을 학습시키는 것&lt;/li&gt;
&lt;li&gt;비지도 학습(Unsupervised Learning) : 레이블을 보유하지 않은 상태에서 모델을 학습시키는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;가설-공간&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;가설 공간&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반화(Generalization)은 구체적인 특정 사실에서 일반성을 도출하는 것을 말하고, 특화(Specialization)은 기초 원리로 부터 구체적인 상황을 추론하는 것을 말합니다. 이러한 원리는 머신러닝 분야에서 굉장히 중요하고 기초 과학에서도 귀납과 연역이라는 이름의 추론의 기본적인 수단으로 이용되고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 특성을 머신러닝에 풀어보면 어떠한 상황을 판단하는데 있어 필요한 특성들이 있고 이러한 특성들로 하여금 가설을 세울 수 있다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 맛있는 고기를 찾는 과정에 필요한 특성을 3가지라고 가정하고 이 특성을 색, 도축일, 고기 종류라고 하고 각각의 특성이 가질 수 있는 도메인이 6개 일때 6 _ 6 _ 6 개의 특성 조합이 나옵니다. 이러한 것이 바로 가설 공간이고 우리가 찾는 것은 이 공간에서 적합한 답을 찾는 것입니다.&lt;/p&gt;
&lt;h4 id=&quot;귀납적-편향&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;귀납적 편향&lt;/b&gt;&lt;/span&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;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;보통이런 경우에는 오컴의 면도날(Occam's razor)이론에 따라 &quot;다수의 가설이 관측된 것과 일치하다면, 가장 간단한 것을 선택해야 한다&quot;를 따르게 됩니다. 하지만 항상 옳은 것은 아니기 때문에 좋은 모델을 선택하는 것은 쉬운 문제가 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;--&amp;gt; &quot;공짜 점심은 없다&quot; 정리에 따르면 총오차가 학습 알고리즘과 무관하다는 결론을 얻을 수 있습니다.&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;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;즉 모든 잠재적인 문제를 고려한다면 모든 학습 알고리즘이 동등하게 좋지만 특정하고 구체적인 상황에 따라 달라질 수 있다는 것입니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 &lt;i&gt;공짜 점심은 없다 정리&lt;/i&gt; 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/44962038/132323113-d04d327a-4160-4c2c-b13a-588ddc96f9d1.png&quot; alt=&quot;image&quot; width=&quot;764&quot; height=&quot;389&quot; /&gt;
&lt;h4 id=&quot;reference&quot; data-ke-size=&quot;size20&quot;&gt;Reference&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&quot;단단한 머신러닝&quot;&lt;br /&gt;&quot;핸즈 온 머신러닝&quot;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 게시물은 학습을 위해서 정리한 문서로 상업적 목적이 없습니다. 하지만 문제가 되는 부분이 있으면 언제든지 연락 부탁드립니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;email : &lt;a href=&quot;mailto:donghark03@naver.com&quot;&gt;donghark03@naver.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/article&gt;</description>
      <category> Artificial Intelligence/ 머신 러닝 (Machine Learning)</category>
      <author>Mark31</author>
      <guid isPermaLink="true">https://donghak-dev.tistory.com/220</guid>
      <comments>https://donghak-dev.tistory.com/220#entry220comment</comments>
      <pubDate>Tue, 7 Sep 2021 18:47:31 +0900</pubDate>
    </item>
    <item>
      <title>[Git]  Git 사용법 정리</title>
      <link>https://donghak-dev.tistory.com/219</link>
      <description>&lt;article class=&quot;markdown-body entry-content&quot;&gt;
&lt;h3 id=&quot;git-사용법-정리&quot; data-ke-size=&quot;size23&quot;&gt;Git 사용법 정리&lt;/h3&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;img src=&quot;https://user-images.githubusercontent.com/44962038/128297211-321ed8d5-d8bc-4a18-bb0d-0b1ba57ea19d.png&quot; alt=&quot;image&quot; width=&quot;611&quot; height=&quot;242&quot; /&gt;&lt;/article&gt;
&lt;article class=&quot;markdown-body entry-content&quot;&gt;&lt;/article&gt;
&lt;article class=&quot;markdown-body entry-content&quot;&gt;&lt;i&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이미지 출처 : &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://jrebel.com/rebellabs/git-commands-and-best-practices-cheat-sheet/&quot;&gt;https://jrebel.com/rebellabs/git-commands-and-best-practices-cheat-sheet/&lt;/a&gt;&lt;/i&gt;
&lt;h4 id=&quot;git-생성하기&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;git 생성하기&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;로컬 저장소 생성하기&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자신이 작업하고 싶은 project name을 입력해 git 설정을 초기화 해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;apache&quot;&gt;&lt;code&gt;git init [project_name]&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;저장소 가져오기&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Remote 저장소에 있는 source를 불러와 다운로드 합니다. 이때 url는 저장소 주소입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;git clone [url]&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;git-상태-조회&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;git 상태 조회&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;git 상태 ( 변경 사항 )&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업중인 디렉토리에서의 변경사항을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;변경된 Staged 파일 확인&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Stage가 변경되 파일을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;git diff&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;로그 보기&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변경 이력을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;git log&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;브랜치branch-작업하기&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;브랜치(Branch) 작업하기&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;로컬 브랜치 보기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;git branch&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;로컬과 원격 브랜치 보기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;git branch -av&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;브랜치 변경&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;git checkout &amp;lt;branch&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;브랜치 생성&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;git branch &amp;lt;new_branch&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;브랜치 삭제&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;git branch -d &amp;lt;branch&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원격 브랜치를 추적하는 새로운 브랜치 생성&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;git checkout --track &amp;lt;remote/branch&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원격 브랜치 추적하기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;git branch -u &amp;lt;remote/branch&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;현재 커밋에 태그 달기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;git tag &amp;lt;tag-name&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;git-변경하기&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Git 변경하기&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;파일의 변경 사항을 다음 커밋에 반영하기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;git add [filename]&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;모든 변경 사항을 다음 커밋에 반영하기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;git add .&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;메세지와 함께 커밋&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;git commit -m &quot;write Commit Message HERE&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;모든 변경 사항을 반영 + 커밋하기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;git commit -a&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;마지막 커밋 수정하기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;git commit --amend&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;git-취소하기&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Git 취소하기&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;작업 디렉토리에 모든 변경 사항 버리기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;git reset --hard HEAD&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;커밋 되돌리기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;git revert &amp;lt;commit&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;동기화하기&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;동기화하기&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원격 저장소의 변경사항 가져오기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;git fetch &amp;lt;remote&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원격 저장소의 변경사항을 가져오고, 머지하기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;git pull &amp;lt;remote&amp;gt; &amp;lt;branch&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원격 저장소의 변경사항을 가져오고 리베이스하기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;git pull --rebase&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원격 저장소에 변경사항 발행하기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원격 저장속에 태그 발행하기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;git push --tags&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;병합-리베이스&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;병합, 리베이스&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;병합하기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;git merge &amp;lt;branch&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;리베이스하기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;git rebase &amp;lt;branch&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;변경사항-저장하고-복원하기&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;변경사항 저장하고 복원하기&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;임시로 변경사항 저장하기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;git stash&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;임시 변경사항 복원하기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;git stash pop&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;임시 변경사항 보기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;git stash list&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category> 개발/ 협업 관리, 개발 도구 (Git, Tools)</category>
      <category>GIT</category>
      <category>git 명령어</category>
      <author>Mark31</author>
      <guid isPermaLink="true">https://donghak-dev.tistory.com/219</guid>
      <comments>https://donghak-dev.tistory.com/219#entry219comment</comments>
      <pubDate>Thu, 5 Aug 2021 15:13:48 +0900</pubDate>
    </item>
    <item>
      <title>[C][Ch.4] C언어 기초3</title>
      <link>https://donghak-dev.tistory.com/218</link>
      <description>&lt;article class=&quot;markdown-body entry-content&quot;&gt;
&lt;h3 id=&quot;c언어-기초3&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;C언어 기초3&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 id=&quot;배열&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;배열&lt;/b&gt;&lt;/span&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;배열은 같은 타입의 변수들로 이루어진 유합 집합이다. 배열을 구성하는 각각의 값을 배열 요소 (element)라고 하며, 이러한 요소의 위치를 가르키는 숫자를 인덱스(index)라고 합니다. C언어에서는 인덱스는 0부터 시작합니다. 이러한 배열은 1차원, 2차원, 다차원으로 활용이 가능합니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;//1차원 배열 선언
int num[3];

//1차원 배열 초기화
num[0] = 0;
num[1] = 1;
num[2] = 2;

// 선언과 동시에 초기화
int num[3] = {1,2,3};

// 다차원 배열
int num[2][2] = {
    {1,2},
    {3,4}
};&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;포인터&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;포인터&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소값이란 ?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터의 주소란 해당 데이터가 저장된 메모리의 시작 주소를 의미합니다. C언어에서는 1바이트 크기로 나누는데 이러한 메모리의 주소를 주소값이라고 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터란 ?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C언어에서 포인터란 메모리의 주소값을 저장하는 변수이며, 포인터 변수라고도 불립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터 연산자&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;&amp;amp;&quot; : 주소 연산자
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&quot;*&quot; : 참조 연산자
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참조 연산자는 포인터의 이름이나 주소 앞에 사용하여, 포인터에 가르키는 주소에 저장된 값을 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터 선언&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;int x = 89;
int *ptr = &amp;amp;x; // x의 주소값을 저장
int *pptr = &amp;amp;ptr; // 포인터 참조&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;인수-전달&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;인수 전달&lt;/b&gt;&lt;/span&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;함수를 호출할 때에는 함수에 필요한 데이터를 인수(argument)로 전달해 줄 수 있습니다. 이때 인수를 전달하는 것에는 두 가지 방법이 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Call by Value (값을 전달)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 방법은 인수로 전달되는 변수가 가지고 있는 값을 함수 내의 매개변수에 복사하는 방식입니다. 그렇기 때문에 전혀 별개의 변수가 되고 원함수로 돌아 갔을때 아무런 영향을 끼칠 수 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;int swap(int a, int b)
{   int temp;

    temp = a;
    a = b;
    b = temp;
}

int main(void)
{
    int a = 5;
    int b = 10;

    swap(a,b);
    // swap 후에도 변화 없음
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Call by Reference (참조 전달)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참조 전달은 변수의 값을 전달하는 방식이 아닌, 해당 변수의 주소값을 전달하기 때문에 조작시 영향을 받습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;int swap(int a, int b)
{
    int temp;

    temp = a;
    a = b;
    b = temp;
}

int main(void)
{
    int a = 5;
    int b = 10;

    swap(a, b);

    // a = 10, b = 5로 변해 있음
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 id=&quot;reference&quot; data-ke-size=&quot;size20&quot;&gt;Reference&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보다 자세한 내용을 학습하고 싶으시면 아래 링크를 참조해 주세요.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.tcpschool.com/c/intro&quot;&gt;http://www.tcpschool.com/c/intro&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category> Computer Science/ 개발 언어 (Language)</category>
      <category>c</category>
      <author>Mark31</author>
      <guid isPermaLink="true">https://donghak-dev.tistory.com/218</guid>
      <comments>https://donghak-dev.tistory.com/218#entry218comment</comments>
      <pubDate>Tue, 3 Aug 2021 13:54:57 +0900</pubDate>
    </item>
    <item>
      <title>[C][Ch.3] C언어 기초2</title>
      <link>https://donghak-dev.tistory.com/217</link>
      <description>&lt;article class=&quot;markdown-body entry-content&quot;&gt;
&lt;h3 id=&quot;c-언어-기초2&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;C 언어 기초2&lt;/span&gt;&lt;/h3&gt;
&lt;h4 id=&quot;연산자&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;연산자&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연산자(Operator)란 프로그램의 산술식이나 연산식을 표현하고 처리하기 위해 제공되는 다양한 기호를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;산술 연산자&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;+&quot; : 더하기&lt;/li&gt;
&lt;li&gt;&quot;-&quot; : 빼기&lt;/li&gt;
&lt;li&gt;&quot;*&quot; : 곱하기&lt;/li&gt;
&lt;li&gt;&quot;/&quot; : 나누기 연산&lt;/li&gt;
&lt;li&gt;&quot;%&quot; : 나머지 연산&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대입 연산자&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;=&quot; : 왼쪽에 오른쪽을 대입함&lt;/li&gt;
&lt;li&gt;&quot;+=&quot; : 더한 후 대입&lt;/li&gt;
&lt;li&gt;&quot;-=&quot; : 뺀 후 대입&lt;/li&gt;
&lt;li&gt;&quot;*=&quot; : 곱한 후 대입&lt;/li&gt;
&lt;li&gt;&quot;/=&quot; : 나눈 후 대입&lt;/li&gt;
&lt;li&gt;&quot;%=&quot; : 나머지 연산 후 대입&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;증감 연산자 (x는 변수명)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;++x&quot; : 1 증가 후 다음 연산 수행&lt;/li&gt;
&lt;li&gt;&quot;x++&quot; : 연산 수행 후 1 증가&lt;/li&gt;
&lt;li&gt;&quot;--x&quot; : 1 감소 후 다음 연산 수행&lt;/li&gt;
&lt;li&gt;&quot;++x&quot; : 연산 수행 후 1 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비교 연산자&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;==&quot; : 같으면 1 반환&lt;/li&gt;
&lt;li&gt;&quot;!=&quot; : 다르면 1 반환&lt;/li&gt;
&lt;li&gt;&quot;&amp;gt;&quot; : 왼쪽이 더 크면 1 반환&lt;/li&gt;
&lt;li&gt;&quot;&amp;lt;&quot; : 오른쪽이 더 크면 1 반환&lt;/li&gt;
&lt;li&gt;&quot;&amp;gt;=&quot; : 왼쪽이 더 크거나 같으면 1 반환&lt;/li&gt;
&lt;li&gt;&quot;&amp;lt;=&quot; : 오른쪽이 더 크거나 같으면 1 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;논리 연산자&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;&amp;amp;&amp;amp;&quot; : 논리식 모두가 참이면 1 반환&lt;/li&gt;
&lt;li&gt;&quot;||&quot; : 논리식 중 하나만 참이면 1 반환&lt;/li&gt;
&lt;li&gt;&quot;!&quot; : NOT 연산 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비트 연산자&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;&amp;amp;&quot; : 대응되는 비트가 모두 1이면 1 반환&lt;/li&gt;
&lt;li&gt;&quot;|&quot; : 대응되는 비트 중에서 하나라도 1이면 1 반환&lt;/li&gt;
&lt;li&gt;&quot;^&quot; : 대응되는 비트가 서로 다르면 1 반환&lt;/li&gt;
&lt;li&gt;&quot;~&quot; : 비트를 1이면 0으로, 0이면 1로 반전&lt;/li&gt;
&lt;li&gt;&quot;&amp;lt;&amp;lt;&quot; : 지정한 수만큼 비트를 왼쪽으로 이동&lt;/li&gt;
&lt;li&gt;&quot;&amp;gt;&amp;gt;&quot; : 지정한 수만큼 비트를 오른쪽으로 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;삼항 연산자&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문번 --&amp;gt; 조건식 ? 반환값1 : 반환값 2&lt;/li&gt;
&lt;li&gt;조건식의 결과가 참이면 반환값1을 반환하고 아니면 반환값2을 반환한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;포인터 연산자&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;&amp;amp;&quot; : 주소 연산자&lt;/li&gt;
&lt;li&gt;&quot;*&quot; : 참조 연산자&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;제어문&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;제어문&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;제어문 (Control Flow Statement)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C 언어는 절차적, 명령형 프로그램에 속하기 때문에 순서대로 명령을 수행한다. 하지만 때로 이런 순차적인 흐름을 제어해야하고 이럴 때 사용되는 문법이 제어문이다. 제어문에는 조건문, 반복문 등이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;조건문 (Conditional Statements)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건문은 주어진 조건식에 따라 명령을 수행하도록 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;if문&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;int num = 0;
if (num ==0)
{
    printf(&quot;True&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;if/else문&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;int num = 0;
if (num == 0)
{
    printf(&quot;True&quot;);
}
else
{
    printf(&quot;False&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;if/else if/else 문&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;int num = 0;
if (num ==0)
{
    printf(&quot;True&quot;);
}
else if (num == 1)
{
    printf(&quot;True2&quot;);
}
else
{
    printf(&quot;False&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;switch 문&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;int num = 0;
switch(num)
{
    case 0:
        printf(&quot;0&quot;);
        break;
    case 1:
        printf(&quot;1&quot;);
        break;
    case 2:
        printf(&quot;2&quot;);
        break;
    default:
        printf(&quot;default&quot;);
        break;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;반복문-iteration-statements&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;반복문 (iteration statements)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복문은 반복적인 명령을 처리하기 위한 제어문이다. 프로그래밍을 하는데 있어 반복적인 작업을 하는 경우가 굉장히 많기 때문에 빈번하게 사용되는 제어문이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;while 문&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;axapta&quot;&gt;&lt;code&gt;int count = 0;

while (count &amp;lt;= 5)
{
    printf(&quot;%d&quot;, count);
    count++;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;do/while 문&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;int i = 0;

do {
    printf(&quot;must execute this statement!&quot;);
} while (i&amp;lt;=5)
{
    printf(&quot;iteration&quot;);
    i++;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;for 문&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;matlab&quot;&gt;&lt;code&gt;for (int i=0; i&amp;lt;10; i++)
{
    printf(&quot;%d&quot;, i);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;함수&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;함수&lt;/b&gt;&lt;/span&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;C언어에서 함수를 선언하는 방법은 아래의 코드와 같습니다.&lt;/p&gt;
&lt;pre class=&quot;gml&quot;&gt;&lt;code&gt;int sum (x,y)
{
    return x+y;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반환 타입 : 여기서의 int입니다. 반환될 타입을 선언해줍니다.&lt;/li&gt;
&lt;li&gt;함수명 : 여기서의 sum입니다. 사용하고자 하는 함수의 이름을 선언해줍니다.&lt;/li&gt;
&lt;li&gt;매개변수 : 여기서의 (x,y)입니다. 함수에게 x와 y를 전달하는 것을 의미합니다.&lt;/li&gt;
&lt;li&gt;함수 코드부 : 아래 { ``` }부분입니다. 실제적인 함수의 로직이 들어가게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;변수의-유효-범위&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;변수의 유효 범위&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수는 선언 위치에 따라서 유효범위, 메모리 반환 시점, 초기화 여부, 저장되는 위치 등이 변경됩니다. 아래는 C에서의 메모리 영역 목록입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리의 구조
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 영역&lt;/li&gt;
&lt;li&gt;데이터 영역&lt;/li&gt;
&lt;li&gt;스택 영역&lt;/li&gt;
&lt;li&gt;힙 영역&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;지역 변수 (local variable)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;블록내에 선언된 변수로 선언된 장소에서만 유효한 변수이다. 이러한 지역 변수는 메모리상의 스택 영역에 저장되며, 초기화하지 않으면 쓰레기값을 가지고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;전역 변수 (global variable)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전역 변수는 함수의 외부에서 선언된 변수로, 프로그램 전체에서 사용할 수 있으며 프로그램 종료시 까지 사용됩니다. 이러한 전역 변수는 데이터 영역에 저장되며 자동으로 초기화 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;정적 변수 (static variabel)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;static 키워드를 통해서 선언된 정적 변수는 전역, 지역 변수의 특징을 모두 가집니다. 다만 단 한번만 초기화 할 수 있으며, 프로그램 종료시에 사라집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;레지스터 변수 (register variable)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;레지스터 변수는 지역변수에 register 키워드를 통해서 선언할 수 있으며 이러한 변수는 레지스터에 저장되어 빠르게 접근할 수 있습니다. 다만 레지스터는 크지 않아 제한 될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 id=&quot;reference&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보다 자세한 내용을 학습하고 싶으시면 아래 링크를 참조해 주세요.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.tcpschool.com/c/intro&quot;&gt;http://www.tcpschool.com/c/intro&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/article&gt;</description>
      <category> Computer Science/ 개발 언어 (Language)</category>
      <category>c</category>
      <author>Mark31</author>
      <guid isPermaLink="true">https://donghak-dev.tistory.com/217</guid>
      <comments>https://donghak-dev.tistory.com/217#entry217comment</comments>
      <pubDate>Thu, 29 Jul 2021 14:53:35 +0900</pubDate>
    </item>
    <item>
      <title>[C][Ch.2] C언어 기초</title>
      <link>https://donghak-dev.tistory.com/215</link>
      <description>&lt;article class=&quot;markdown-body entry-content&quot;&gt;
&lt;h3 id=&quot;c언어-기초&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;C언어 기초&lt;/span&gt;&lt;/h3&gt;
&lt;h4 id=&quot;c-프로그램의-구조&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;C 프로그램의 구조&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C언어는 주로 아래와 같은 구조를 가진다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include 문

#define 문

int func(int a)
{
    // 함수
    return 1;
}

int main(void)
{
    // statement

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 예제를 들자면 아래와 같다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

#define TEXT &quot;This is Simple Example&quot;

int main()
{
    printf(TEXT)l
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;c-프로그램의-특징&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;C 프로그램의 특징&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C언어는 다음과 같은 특징을 가지고 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C 프로그램의 기본 단위는 함수이다.&lt;/li&gt;
&lt;li&gt;함수 내의 각 명령문은 세미콜론(;)--&amp;gt; 구분자로 끝나야 한다.&lt;/li&gt;
&lt;li&gt;C 언어는 대소문자를 구분하여 사용해야 한다.&lt;/li&gt;
&lt;li&gt;형식을 지키면 자유롭게 프로그래밍 가능하다. ( Python은 인테트를 철저하게 지켜야함)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;주석-처리&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;주석 처리&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발을 진행함에 있어 주석은 협업에 있어서 굉장히 중요하다. 따라서 C언어에서의 주석 방법에 대해서 알아보자&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;// 한줄 주석은 다음과 같이 처리한다.&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;/*
여러줄
주석은
다음과 같이
처리한다.
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주석은 코드의 설명 뿐아니라 함수의 기능 설명, 작성자, 라이센스등을 표시할 때 유용하게 사용할 수 있다.&lt;/p&gt;
&lt;h4 id=&quot;c언어-표준-입출력-함수&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;C언어 표준 입출력 함수&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램에 입력과 출력을 다루는 것은 입출력 함수를 통해서 이루어진다. 여기서 말하는 입출력은 사용자와 프로그램사이의 인터렉티브를 위한 것이다. 대표적인 함수로는 printf(), scanf() 함수가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;printf() 함수는 다음과 같이 사용할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main()
{
    printf(&quot;Hello world&quot;); //줄바꿈 없는 출력 함수

    printf(&quot;Heelo world\n&quot;); //줄 바꿈 있는 출력 함수

    int num1 = 15;
    printf(&quot;%d&quot;, num1); //숫자 출력

    char chr1 = &quot;a&quot;;
    printf(&quot;%s&quot;, chr1); //문자열 출력 --&amp;gt; 문자하나 뿐 아니라 문자열도 출력 가능
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 %s, %d는 서식 지정자라고 지칭하는데 이를 통해서 데이터 서식을 지정하여 출력할 수 있습니다. (아래는 자주 사용되는 서식 지정자입니다. 더 자세한 내용은 참고 문헌을 참고해주세요.)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;%c : 하나의 문자&lt;/li&gt;
&lt;li&gt;%s : 문자열&lt;/li&gt;
&lt;li&gt;%d : 부호가 있는 10진 정수&lt;/li&gt;
&lt;li&gt;%f : 고정 소수점으로 표현한 실수 (소수점 이하 6자리까지 표현)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로는 scanf() 함수에 대해서 알아보겠습니다. 한가지 주의할 점은 요즘은 보안 문제로 인해서 scanf() 보다는 scanf_s()함수를 주로 사용합니다. 이는 스택오버플로우를 방지하기 위함입니다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void)
{
    int num1, num2;

    scanf(&quot;%d %d&quot;, &amp;amp;num1, &amp;amp;num2);

    printf(&quot;%d %d&quot;, num1, num2);
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;변수란-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;변수란 ?&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수(Variable)이란 데이터를 저장히기 위한 메모리 공간을 뜻합니다. C언어에서는 다양한 자료형의 변수가 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 변수를 선언할 때는 이름을 통해서 생성하게 되는데 이런 이름을 정하는데 규칙은 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수의 이름은 영문자, 숫자, _로만 구성&lt;/li&gt;
&lt;li&gt;이름을 숫자로 시작할 수 없음&lt;/li&gt;
&lt;li&gt;이름 사이에 공백은 존재 할 수 없음&lt;/li&gt;
&lt;li&gt;미리 정의된 키워드는 사용 불가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시는 아래와 같습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void)
{
    int num1;
    int num2 = 10;
    float num3;
    float num4 = 1.33;
    double num5;
    double num6 = 1.3324234234;

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;상수constant란-&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;상수(Constant)란 ?&lt;/span&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;이러한 상수에는 리터럴 상수와 심볼릭 상수가 있다. 리터럴 상수는 말 그대로의 상수를 의미한다. &quot;a&quot;, &quot;3&quot; 등과 같이 그 자체로 상수인 것을 말한다. 심볼릭 상수는 이름을 가진 상수로 선언과 동시에 초기화를 해야한다. 이러한 심볼릭 상수는 const나 #define을 통해서 정의할 수 있다.&lt;/p&gt;
&lt;h4 id=&quot;기본-타입&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;기본 타입&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C언어에서는 data의 타입을 통해서 얼마나 메모리를 차지할 지 결정할 수 있고 기본적으로 C언어에서 제공하는 타입들이 있는데 다음이 그 목록이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;short : 2바이트 정수&lt;/li&gt;
&lt;li&gt;unsigned short : 2바이트 정수&lt;/li&gt;
&lt;li&gt;int : 4바이트 정수&lt;/li&gt;
&lt;li&gt;unsigned int : 4바이트 정수&lt;/li&gt;
&lt;li&gt;long : 4바이트 정수&lt;/li&gt;
&lt;li&gt;unsigned long : 4바이트 정수&lt;/li&gt;
&lt;li&gt;float : 4바이트 실수&lt;/li&gt;
&lt;li&gt;double : 8바이트 실수&lt;/li&gt;
&lt;li&gt;long double : 8바이트 실수&lt;/li&gt;
&lt;li&gt;char : 1바이트 문자형&lt;/li&gt;
&lt;li&gt;unsigned char : 2바이트 문자형&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;타입-변환-type-conversion&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;타입 변환 (Type Conversion)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C언어에서의 연산은 같은 타입끼리만 진행된다. 그를 위해서 타입의 변환이 필요하다 이때 작은 단위(ex 정수) 에서 큰 단위(ex. 실수)로 가는 것은 정보의 손실이 없지만 반대의 경우 정보의 손실이 있다. 이러한 타입 변환에는 &quot;묵시적 타입 변환)&quot;과 &quot;명시적 타입 변환&quot;이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;묵시적 타입 변환 (자동 타입 변환)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;묵시적 타입 변환은 대입 연산이나 산술 연산에서 컴파일러가 자동으로 실행해준다. 아래의 순서대로 변환&lt;/li&gt;
&lt;li&gt;char -&amp;gt; short -&amp;gt; int -&amp;gt; long -&amp;gt; float -&amp;gt; double -&amp;gt; long double&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;명시적 타입 변환 (강제 타입 변환)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;명시적 타입 변환은 사용자가 타입 캐스트 연산자를 통해서 강제적으로 수동적으로 수행하는 타입 변환 작업이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;  int num1 = 1;
  int num2 = 4;

  double result1 = num1/num2;
  double result2 = (double)num1/num2;

  // result1 --&amp;gt; 0.000000
  // result2 --&amp;gt; 0.250000&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 id=&quot;reference&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Reference&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.tcpschool.com/c/intro&quot;&gt;http://www.tcpschool.com/c/intro&lt;/a&gt;&lt;/p&gt;
&lt;/article&gt;</description>
      <category> Computer Science/ 개발 언어 (Language)</category>
      <author>Mark31</author>
      <guid isPermaLink="true">https://donghak-dev.tistory.com/215</guid>
      <comments>https://donghak-dev.tistory.com/215#entry215comment</comments>
      <pubDate>Thu, 22 Jul 2021 15:05:45 +0900</pubDate>
    </item>
    <item>
      <title>[C][Ch.1] C언어란 무엇인가 ?</title>
      <link>https://donghak-dev.tistory.com/214</link>
      <description>&lt;article class=&quot;markdown-body entry-content&quot; itemprop=&quot;text&quot;&gt; &lt;h3 id=&quot;c언어&quot;&gt;C언어&lt;/h3&gt;
&lt;h4 id=&quot;c언어-개요&quot;&gt;C언어 개요&lt;/h4&gt;
&lt;p&gt;C 언어는 현재 사용되고 있는 모든 시스템에서 사용할 수 있는 범용성을 가진 프로그래밍 언어입니다.&lt;/p&gt;
&lt;p&gt;주요 운영체제의 커널의 대부분은 C언어를 통해서 구현되어 있으며 시스템 프로그래밍, 모빌리티, 임베디드에 전체적으로 사용되고 있는 언어입니다.&lt;/p&gt;
&lt;p&gt;이렇게 C언어가 사용되는 것은 그 특징에 기반한다. C언어는 절차 지향 프로그래밍 언어 이다.&lt;/p&gt;
&lt;h4 id=&quot;c언어의-특징&quot;&gt;C언어의 특징&lt;/h4&gt;
&lt;p&gt;장점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;C언어로 작성된 프로그램은 다양한 하드웨어로의 이식성이 좋습니다.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;C언어는 절차 지향 프로그래밍 언어로, 코드가 복잡하지 않아 상대적으로 유지보수가 쉽습니다.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;C언어는 저급 언어의 특징을 가지고 있으므로, 어셈블리어 수준으로 하드웨어를 제어할 수 있습니다.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;C언어는 코드가 간결하여, 완성된 프로그램의 크기가 작고 실행 속도가 빠릅니다.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;단점&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;C언어는 저급 언어의 특징을 가지고 있으므로, 자바와 같은 다른 고급 언어보다 배우기가 어렵습니다.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;C언어는 다른 언어와는 달리 시스템 자원을 직접 제어할 수 있으므로, 프로그래밍하는데 주의가 필요합니다.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;c언어의-표준&quot;&gt;C언어의 표준&lt;/h4&gt;
&lt;p&gt;C언어는 1989년부터 ANSI(American Noational Standards Institute)에서 표준화 작업은 진행했습니다. 하지만 현재는 ISO/IEC(International Organization for Standardization / International Electrotechnical Commission)에서 표준화를 담당하고 있습니다.&lt;/p&gt;
&lt;h4 id=&quot;프로그래밍-programming&quot;&gt;프로그래밍 (Programming)&lt;/h4&gt;
&lt;p&gt;C언어 파일 생성 과정&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/44962038/125627756-249c2c45-ae44-4aca-9423-6d87ec5c1d6f.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;소스 파일(Source File) 작성&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C언어를 사용하여 문법에 맞게 코딩을 진행 이를 통해 생성된 파일은 .c 확장자를 가진다.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;선행처리기(preprocessor)에 의한 선행처리&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;선행처리를 실시 ( 소스 파일 중 #으로 시작하는 지시문을 처리하는 작업)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;코드를 생성하는 것이 아니라 컴파일 전 컴파일러에게 작업하기 좋도록 재구성하는 역활을 수행&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;컴파일러(Compiler)에 의한 컴파일&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;소스 코드를 기계어로 변환하는 작업 수행&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;이렇게 수행된 파일을 오브젝트파일(object file)이라고 부르면 .o 또는 .obj 형식의 확장자를 가짐&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;링커(linker)에 의한 링크&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;컴파일러에 의해 생성된 오브젝트 파일은 운영체제와 인터페이스를 담당하는 시동 코드 (start-up code)를 가지고 있지 않습니다. 또한 라이브러리도 포함하고 있지 않습니다. 하지만 이 링크 과정을 통해서 오브젝트 파일과 시동 코드, 라이브러리 파일을 통합하게 됩니다.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;이러한 과정을 거치면 하나의 실행파일이나 라이브러리 파일이 생성됩니다.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;실행 파일(executable file)의 생성&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;소스 코드를 여러 과정을 거쳐서 하나의 실행 파일이 됩니다. 이러한 실행 파일은 .exe 확장자를 가집니다.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h4 id=&quot;reference&quot;&gt;Reference&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://www.tcpschool.com/c/intro&quot;&gt;http://www.tcpschool.com/c/intro&lt;/a&gt;&lt;/p&gt; &lt;/article&gt;</description>
      <category> Computer Science/ 개발 언어 (Language)</category>
      <category>C언어</category>
      <author>Mark31</author>
      <guid isPermaLink="true">https://donghak-dev.tistory.com/214</guid>
      <comments>https://donghak-dev.tistory.com/214#entry214comment</comments>
      <pubDate>Wed, 14 Jul 2021 22:15:35 +0900</pubDate>
    </item>
  </channel>
</rss>