<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>고니의 코딩노트</title>
    <link>https://gonyzany.tistory.com/</link>
    <description>정재욱 소프트웨어공학과,
고니는 반려견 웰시코기 이름,
Since 2022-09-28</description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 18:20:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>고니자니</managingEditor>
    <image>
      <title>고니의 코딩노트</title>
      <url>https://tistory1.daumcdn.net/tistory/5685669/attach/daeb226292bc417ebc1692cddb3d8f7c</url>
      <link>https://gonyzany.tistory.com</link>
    </image>
    <item>
      <title>파이썬: 로또복권번호 자동생성기 tkinter GUI</title>
      <link>https://gonyzany.tistory.com/750</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 입력한 개수만큼 로또 번호 세트(Set)를 생성하여 표시하는 &lt;b&gt;Tkinter&lt;/b&gt; GUI 프로그램입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pafVD/dJMcadtF8Zm/f5AyLwt8Gow9xLqRdHwdgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pafVD/dJMcadtF8Zm/f5AyLwt8Gow9xLqRdHwdgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pafVD/dJMcadtF8Zm/f5AyLwt8Gow9xLqRdHwdgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpafVD%2FdJMcadtF8Zm%2Ff5AyLwt8Gow9xLqRdHwdgK%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;402&quot; height=&quot;482&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1764666466338&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tkinter as tk
from tkinter import ttk, messagebox
import random

class LottoBulkGeneratorApp:
    def __init__(self, master):
        # 메인 윈도우 설정
        self.master = master
        master.title(&quot;  로또 6/45 번호 일괄 생성기&quot;)
        master.geometry(&quot;400x450&quot;)
        master.resizable(False, False) # 창 크기 변경 불가
        
        # 폰트 설정
        self.default_font = (&quot;Malgun Gothic&quot;, 11)
        
        # 스타일 테마 적용 및 기본 폰트 설정
        style = ttk.Style()
        style.theme_use('clam')
        style.configure('TButton', font=self.default_font, padding=5)
        style.configure('TLabel', font=self.default_font)
        style.configure('TEntry', font=self.default_font)

        # --------------------
        # 2. UI 구성 요소 배치
        # --------------------
        
        # 입력 프레임 (개수 입력 위젯들을 묶음)
        input_frame = ttk.Frame(master, padding=&quot;10 10 10 10&quot;)
        input_frame.pack(pady=10)

        # 갯수 입력 레이블
        count_label = ttk.Label(input_frame, text=&quot;생성할 세트 수 (1~100):&quot;)
        count_label.pack(side=tk.LEFT, padx=5)

        # 갯수 입력 엔트리 (기본값 5)
        self.count_entry = ttk.Entry(input_frame, width=5, justify='center')
        self.count_entry.insert(0, &quot;5&quot;) # 기본값 5 입력
        self.count_entry.pack(side=tk.LEFT, padx=5)
        
        # 번호 생성 버튼
        generate_button = ttk.Button(master, 
                                     text=&quot;  번호 생성 시작&quot;, 
                                     command=self.generate_numbers,
                                     width=20)
        generate_button.pack(pady=15)
        
        # 결과 표시 영역 (Text Widget 사용)
        result_title_label = ttk.Label(master, text=&quot;[생성된 로또 번호 목록]&quot;, font=(&quot;Malgun Gothic&quot;, 12, &quot;bold&quot;))
        result_title_label.pack()
        
        # 스크롤바와 텍스트 위젯을 위한 프레임
        text_frame = ttk.Frame(master)
        text_frame.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)

        # 스크롤바
        scrollbar = ttk.Scrollbar(text_frame)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        # 결과 표시 텍스트 위젯
        self.result_text_widget = tk.Text(text_frame, 
                                          height=12, 
                                          width=40, 
                                          font=(&quot;Consolas&quot;, 14), # 번호 정렬을 위해 고정폭 폰트 사용
                                          yscrollcommand=scrollbar.set)
        self.result_text_widget.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

        # 스크롤바와 텍스트 위젯 연결
        scrollbar.config(command=self.result_text_widget.yview)

    # -------------------------------------------------------
    # 3. 핵심 기능: 로또 번호 일괄 생성 함수
    # -------------------------------------------------------
    def generate_numbers(self):
        &quot;&quot;&quot;입력된 횟수만큼 로또 번호 세트를 생성하고 Text Widget에 출력합니다.&quot;&quot;&quot;
        
        # 1. 입력값 가져오기 및 유효성 검사
        try:
            count = int(self.count_entry.get())
        except ValueError:
            messagebox.showerror(&quot;오류&quot;, &quot;유효한 정수(숫자)를 입력해주세요.&quot;)
            return

        if not (1 &amp;lt;= count &amp;lt;= 100):
            messagebox.showerror(&quot;오류&quot;, &quot;생성 개수는 1개부터 100개까지만 허용됩니다.&quot;)
            return
            
        # 2. 기존 결과 초기화
        self.result_text_widget.delete(&quot;1.0&quot;, tk.END) # 텍스트 위젯의 내용을 처음부터 끝까지 지움
        
        # 3. 입력된 횟수만큼 반복 생성
        for i in range(count):
            # 1부터 45까지의 숫자 중 6개를 중복 없이 무작위로 추출
            lotto_numbers = random.sample(range(1, 46), 6)
            
            # 숫자를 오름차순으로 정렬
            lotto_numbers.sort()
            
            # 생성된 번호를 포맷에 맞게 문자열로 변환 (한 자리 숫자는 0으로 채움)
            formatted_numbers = &quot; &quot;.join(f&quot;{num:02d}&quot; for num in lotto_numbers)
            
            # 결과를 텍스트 위젯에 추가
            # 텍스트 위젯의 끝(tk.END)에 새 줄을 추가하고 번호를 삽입
            self.result_text_widget.insert(tk.END, f&quot;[{i+1:02d}회차]  {formatted_numbers}\n&quot;)

# -------------------------------------------------------
# 4. 프로그램 실행
# -------------------------------------------------------
if __name__ == &quot;__main__&quot;:
    root = tk.Tk()
    app = LottoBulkGeneratorApp(root)
    root.mainloop()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python</category>
      <category>LottoNum</category>
      <category>로또</category>
      <category>로또복권번호</category>
      <category>생성기</category>
      <category>자동</category>
      <author>고니자니</author>
      <guid isPermaLink="true">https://gonyzany.tistory.com/750</guid>
      <comments>https://gonyzany.tistory.com/750#entry750comment</comments>
      <pubDate>Tue, 2 Dec 2025 18:08:45 +0900</pubDate>
    </item>
    <item>
      <title>파이썬: QR코드 생성하기</title>
      <link>https://gonyzany.tistory.com/749</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬으로 간단하게 QR 코드를 생성하는 코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 라이브러리가 필요합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1763699500702&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install qrcode[pil] pillow&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;210&quot; data-start=&quot;163&quot; data-ke-size=&quot;size16&quot;&gt;qrcode는 PNG 생성에 편하고, Pillow는 이미지 처리에 필요합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcXUZq/dJMcai2KQG7/0cxkOX3b0yQKKNp2bd5TNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcXUZq/dJMcai2KQG7/0cxkOX3b0yQKKNp2bd5TNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcXUZq/dJMcai2KQG7/0cxkOX3b0yQKKNp2bd5TNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcXUZq%2FdJMcai2KQG7%2F0cxkOX3b0yQKKNp2bd5TNk%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;1115&quot; height=&quot;400&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파이썬 QR코드 생성 프로그램&lt;/h3&gt;
&lt;pre id=&quot;code_1763699405966&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import qrcode

data = &quot;https://gonyzany.tistory.com&quot;  # QR에 담을 텍스트나 URL
img = qrcode.make(data)
img.save(&quot;c:/temp/qrcode_gonyzany.png&quot;)
print(&quot;qr코드 생성 완료&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;생성된 QR코드 이미지&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;qrcode_gonyzany.png&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d7XyZc/dJMcaiob3vO/c84hUGnfnoGHAgnTvfwT3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d7XyZc/dJMcaiob3vO/c84hUGnfnoGHAgnTvfwT3k/img.png&quot; data-alt=&quot;파이썬 QR코드 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d7XyZc/dJMcaiob3vO/c84hUGnfnoGHAgnTvfwT3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd7XyZc%2FdJMcaiob3vO%2Fc84hUGnfnoGHAgnTvfwT3k%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;370&quot; height=&quot;370&quot; data-filename=&quot;qrcode_gonyzany.png&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파이썬 QR코드 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Python</category>
      <category>QR코드</category>
      <category>QR코드생성</category>
      <author>고니자니</author>
      <guid isPermaLink="true">https://gonyzany.tistory.com/749</guid>
      <comments>https://gonyzany.tistory.com/749#entry749comment</comments>
      <pubDate>Fri, 21 Nov 2025 13:33:56 +0900</pubDate>
    </item>
    <item>
      <title>파이썬: gTTS를 이용한 텍스트를 음성으로 변환하기</title>
      <link>https://gonyzany.tistory.com/748</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬으로 gTTS(google TTS)를 이용해서 텍스트를 음성으로 변환하는 소스입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변환된 파일을 mp3 형식으로 저장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 모듈이 필요할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1763611243595&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install gTTS playsound==1.2.2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1763611138819&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from gtts import gTTS
import os
import tempfile
import sys

def tts_gtts(text, lang='ko', slow=False, filename=None, play=True):
    &quot;&quot;&quot;
    text: 읽을 문자열
    lang: 언어 코드, 한국어는 'ko'
    slow: True면 천천히 재생
    filename: 저장할 파일명 (예: 'out.mp3'). None이면 임시파일로 저장
    play: True면 저장 후 재생 (playsound 사용)
    &quot;&quot;&quot;
    tts = gTTS(text=text, lang=lang, slow=slow)
    if filename is None:
        fd, filename = tempfile.mkstemp(suffix=&quot;.mp3&quot;)
        os.close(fd)

    tts.save(filename)
    print(&quot;Saved to&quot;, filename)

    if play:
        try:
            # playsound는 아주 간단하게 mp3 재생 가능 (플랫폼별 동작 차이 있음)
            from playsound import playsound
            playsound(filename)
        except Exception as e:
            print(&quot;자동 재생 실패:&quot;, e)
            print(&quot;파일을 직접 열어 재생하세요:&quot;, filename)

if __name__ == &quot;__main__&quot;:
    sample = &quot;안녕하세요. 이것은 gTTS를 이용한 한국어 음성 예제입니다.&quot;
    tts_gtts(sample, lang='ko', slow=False, filename=&quot;sample_ko.mp3&quot;, play=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변환된 mp3 파일의 예:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bVPTCq/dJMb995Q09Y/0AFRqxZiB9WIoplLLtttX0/sample_ko.mp3?attach=1&amp;amp;knm=tfile.mp3&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;sample_ko.mp3&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.05MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;693&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yKQBo/dJMcadNTHWG/ghyClm5zoCoQ8HOnjk41Qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yKQBo/dJMcadNTHWG/ghyClm5zoCoQ8HOnjk41Qk/img.png&quot; data-alt=&quot;TTS&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yKQBo/dJMcadNTHWG/ghyClm5zoCoQ8HOnjk41Qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyKQBo%2FdJMcadNTHWG%2FghyClm5zoCoQ8HOnjk41Qk%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;224&quot; height=&quot;192&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;693&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;TTS&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Python</category>
      <category>gtts</category>
      <category>mp3</category>
      <category>변환</category>
      <category>음성</category>
      <category>텍스트</category>
      <category>텍스트를음성으로변환</category>
      <author>고니자니</author>
      <guid isPermaLink="true">https://gonyzany.tistory.com/748</guid>
      <comments>https://gonyzany.tistory.com/748#entry748comment</comments>
      <pubDate>Thu, 20 Nov 2025 13:06:32 +0900</pubDate>
    </item>
    <item>
      <title>C++26 소개</title>
      <link>https://gonyzany.tistory.com/747</link>
      <description>&lt;p data-end=&quot;167&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;C++26은 &lt;b&gt;2026년에 공식 표준화될 예정인 C++ 차기 표준(ISO/IEC 14882:2026)&lt;/b&gt; 입니다.&lt;br /&gt;현재(2025년 기준) C++26 초안(draft) 이 활발히 개발 중이며, &lt;b&gt;C++23 이후의 개선된 언어 기능과 표준 라이브러리 확장&lt;/b&gt;이 포함됩니다.&lt;/p&gt;
&lt;p data-end=&quot;203&quot; data-start=&quot;169&quot; data-ke-size=&quot;size16&quot;&gt;아래에 C++26의 핵심 내용을 간결하게 정리해 봅니다  &lt;/p&gt;
&lt;hr data-end=&quot;208&quot; data-start=&quot;205&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;224&quot; data-start=&quot;210&quot; data-ke-size=&quot;size26&quot;&gt;  C++26 개요&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;416&quot; data-start=&quot;226&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;277&quot; data-start=&quot;226&quot;&gt;&lt;b&gt;표준화 기구:&lt;/b&gt; ISO/IEC JTC1/SC22/WG21 (C++ 표준 위원회)&lt;/li&gt;
&lt;li data-end=&quot;298&quot; data-start=&quot;278&quot;&gt;&lt;b&gt;출시 목표:&lt;/b&gt; 2026년&lt;/li&gt;
&lt;li data-end=&quot;416&quot; data-start=&quot;299&quot;&gt;&lt;b&gt;핵심 방향:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;416&quot; data-start=&quot;316&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;335&quot; data-start=&quot;316&quot;&gt;언어 단순화 및 안전성 강화&lt;/li&gt;
&lt;li data-end=&quot;370&quot; data-start=&quot;338&quot;&gt;메타프로그래밍과 리플렉션(reflection) 지원&lt;/li&gt;
&lt;li data-end=&quot;392&quot; data-start=&quot;373&quot;&gt;병렬/비동기 프로그래밍 강화&lt;/li&gt;
&lt;li data-end=&quot;416&quot; data-start=&quot;395&quot;&gt;표준 라이브러리 확장 및 현대화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;421&quot; data-start=&quot;418&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;451&quot; data-start=&quot;423&quot; data-ke-size=&quot;size26&quot;&gt;  주요 언어 기능(예상 또는 승인된 제안)&lt;/h2&gt;
&lt;h3 data-end=&quot;482&quot; data-start=&quot;453&quot; data-ke-size=&quot;size23&quot;&gt;1. ✅ &lt;b&gt;리플렉션(Reflection)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;608&quot; data-start=&quot;483&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;514&quot; data-start=&quot;483&quot;&gt;C++26에서 가장 기대되는 기능 중 하나입니다.&lt;/li&gt;
&lt;li data-end=&quot;568&quot; data-start=&quot;515&quot;&gt;&lt;b&gt;컴파일타임에 코드 구조(클래스, 함수, 멤버 변수 등)를 탐색&lt;/b&gt;할 수 있게 됩니다.&lt;/li&gt;
&lt;li data-end=&quot;608&quot; data-start=&quot;569&quot;&gt;예: JSON 직렬화, ORM, UI 바인딩 등을 자동 생성 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762669191779&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Person { std::string name; int age; };

constexpr auto info = reflexpr(Person);
for (auto member : info.members()) {
    std::cout &amp;lt;&amp;lt; member.name() &amp;lt;&amp;lt; &quot;\n&quot;;  // &quot;name&quot;, &quot;age&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;821&quot; data-start=&quot;818&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;860&quot; data-start=&quot;823&quot; data-ke-size=&quot;size23&quot;&gt;2. ✅ &lt;b&gt;패턴 매칭 (Pattern Matching)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;932&quot; data-start=&quot;861&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;903&quot; data-start=&quot;861&quot;&gt;switch 문을 강화한 형태로, 구조 분해 기반의 조건 분기 지원.&lt;/li&gt;
&lt;li data-end=&quot;932&quot; data-start=&quot;904&quot;&gt;C#이나 Rust의 match 문과 유사합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762669207587&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;match (point) {
    case [0, 0]: std::cout &amp;lt;&amp;lt; &quot;origin\n&quot;;
    case [int x, 0]: std::cout &amp;lt;&amp;lt; &quot;x-axis: &quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &quot;\n&quot;;
    case [int x, int y]: std::cout &amp;lt;&amp;lt; &quot;point(&quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &quot;,&quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &quot;)\n&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1173&quot; data-start=&quot;1170&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1208&quot; data-start=&quot;1175&quot; data-ke-size=&quot;size23&quot;&gt;3. ✅ &lt;b&gt;Contracts (계약 프로그래밍)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1303&quot; data-start=&quot;1209&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1253&quot; data-start=&quot;1209&quot;&gt;C++20에 도입되려다 빠졌던 기능이 &lt;b&gt;C++26에서 다시 복귀&lt;/b&gt; 예상.&lt;/li&gt;
&lt;li data-end=&quot;1303&quot; data-start=&quot;1254&quot;&gt;pre, post, assert 등의 키워드로 함수의 계약(조건)을 명시.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1762669221611&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int divide(int a, int b)
    pre(b != 0)  // 사전 조건
    post(r =&amp;gt; r * b == a)  // 사후 조건
{
    return a / b;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1429&quot; data-start=&quot;1426&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1462&quot; data-start=&quot;1431&quot; data-ke-size=&quot;size23&quot;&gt;4. ✅ &lt;b&gt;모듈 개선 (Modules v2)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1551&quot; data-start=&quot;1463&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1510&quot; data-start=&quot;1463&quot;&gt;C++20 모듈 시스템을 개선하여 &lt;b&gt;빌드 속도 향상&lt;/b&gt; 및 &lt;b&gt;호환성 개선&lt;/b&gt;.&lt;/li&gt;
&lt;li data-end=&quot;1551&quot; data-start=&quot;1511&quot;&gt;전처리기 의존도를 더 줄이고, 대규모 프로젝트의 컴파일 효율을 높임.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1556&quot; data-start=&quot;1553&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1593&quot; data-start=&quot;1558&quot; data-ke-size=&quot;size23&quot;&gt;5. ✅ &lt;b&gt;코루틴 강화 (Coroutines v2)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1671&quot; data-start=&quot;1594&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1671&quot; data-start=&quot;1594&quot;&gt;C++20 코루틴의 복잡한 인터페이스를 단순화하고,&lt;br /&gt;&lt;b&gt;표준 task, generator, async API&lt;/b&gt;를 제공할 예정.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1676&quot; data-start=&quot;1673&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1713&quot; data-start=&quot;1678&quot; data-ke-size=&quot;size23&quot;&gt;6. ✅ &lt;b&gt;네트워킹(Networking) TS 통합&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1803&quot; data-start=&quot;1714&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1762&quot; data-start=&quot;1714&quot;&gt;오래 기다려온 &lt;b&gt;표준 네트워킹 라이브러리&lt;/b&gt;(std::net)가 포함될 예정.&lt;/li&gt;
&lt;li data-end=&quot;1803&quot; data-start=&quot;1763&quot;&gt;비동기 소켓, TCP/UDP 통신을 안전하고 일관성 있게 처리 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1808&quot; data-start=&quot;1805&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1834&quot; data-start=&quot;1810&quot; data-ke-size=&quot;size23&quot;&gt;7. ✅ &lt;b&gt;추가 라이브러리 개선&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1984&quot; data-start=&quot;1835&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1864&quot; data-start=&quot;1835&quot;&gt;std::expected(C++23) 확장&lt;/li&gt;
&lt;li data-end=&quot;1901&quot; data-start=&quot;1865&quot;&gt;std::generator, std::lazy 도입&lt;/li&gt;
&lt;li data-end=&quot;1938&quot; data-start=&quot;1902&quot;&gt;SIMD(Vector) 지원 강화 (std::simd)&lt;/li&gt;
&lt;li data-end=&quot;1984&quot; data-start=&quot;1939&quot;&gt;chrono, filesystem, format 등의 기능 확대&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1989&quot; data-start=&quot;1986&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2002&quot; data-start=&quot;1991&quot; data-ke-size=&quot;size26&quot;&gt;⚙️ 요약 비교&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목C++20C++23C++26(예정)
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 115px;&quot; border=&quot;1&quot; data-end=&quot;2264&quot; data-start=&quot;2004&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody data-end=&quot;2264&quot; data-start=&quot;2081&quot;&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;2142&quot; data-start=&quot;2081&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2089&quot; data-start=&quot;2081&quot;&gt;주요 테마&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;2103&quot; data-start=&quot;2089&quot; data-col-size=&quot;sm&quot;&gt;모듈, 코루틴, 개념&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;2117&quot; data-start=&quot;2103&quot; data-col-size=&quot;sm&quot;&gt;표준 라이브러리 개선&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;2142&quot; data-start=&quot;2117&quot; data-col-size=&quot;sm&quot;&gt;리플렉션, 패턴 매칭, 계약 프로그래밍&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;2175&quot; data-start=&quot;2143&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2150&quot; data-start=&quot;2143&quot;&gt;네트워킹&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;2158&quot; data-start=&quot;2150&quot; data-col-size=&quot;sm&quot;&gt;TS 단계&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;2163&quot; data-start=&quot;2158&quot; data-col-size=&quot;sm&quot;&gt;없음&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;2175&quot; data-start=&quot;2163&quot; data-col-size=&quot;sm&quot;&gt;표준 포함 예정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;2202&quot; data-start=&quot;2176&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2183&quot; data-start=&quot;2176&quot;&gt;리플렉션&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;2188&quot; data-start=&quot;2183&quot; data-col-size=&quot;sm&quot;&gt;없음&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;2193&quot; data-start=&quot;2188&quot; data-col-size=&quot;sm&quot;&gt;없음&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;2202&quot; data-start=&quot;2193&quot; data-col-size=&quot;sm&quot;&gt;지원 예정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;2230&quot; data-start=&quot;2203&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2211&quot; data-start=&quot;2203&quot;&gt;패턴 매칭&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;2216&quot; data-start=&quot;2211&quot; data-col-size=&quot;sm&quot;&gt;없음&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;2221&quot; data-start=&quot;2216&quot; data-col-size=&quot;sm&quot;&gt;없음&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;2230&quot; data-start=&quot;2221&quot; data-col-size=&quot;sm&quot;&gt;지원 예정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot; data-end=&quot;2264&quot; data-start=&quot;2231&quot;&gt;
&lt;td style=&quot;height: 21px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2243&quot; data-start=&quot;2231&quot;&gt;Contracts&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;2249&quot; data-start=&quot;2243&quot; data-col-size=&quot;sm&quot;&gt;미포함&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;2255&quot; data-start=&quot;2249&quot; data-col-size=&quot;sm&quot;&gt;미포함&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot; data-end=&quot;2264&quot; data-start=&quot;2255&quot; data-col-size=&quot;sm&quot;&gt;복귀 예정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2269&quot; data-start=&quot;2266&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2282&quot; data-start=&quot;2271&quot; data-ke-size=&quot;size26&quot;&gt;  기대 효과&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2401&quot; data-start=&quot;2283&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2313&quot; data-start=&quot;2283&quot;&gt;코드의 &lt;b&gt;표현력&lt;/b&gt;과 &lt;b&gt;안전성&lt;/b&gt; 대폭 향상&lt;/li&gt;
&lt;li data-end=&quot;2334&quot; data-start=&quot;2314&quot;&gt;템플릿 메타프로그래밍의 단순화&lt;/li&gt;
&lt;li data-end=&quot;2360&quot; data-start=&quot;2335&quot;&gt;&lt;b&gt;대규모 프로젝트 빌드 시간 감소&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2401&quot; data-start=&quot;2361&quot;&gt;&lt;b&gt;AI 코드 생성 도구와의 궁합 향상&lt;/b&gt; (리플렉션/패턴매칭 덕분)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2406&quot; data-start=&quot;2403&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cpp.png&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBXsxS/dJMcaaQ9v4Y/chEJJ1kUfR6K4dASTCTKl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBXsxS/dJMcaaQ9v4Y/chEJJ1kUfR6K4dASTCTKl0/img.png&quot; data-alt=&quot;C++&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBXsxS/dJMcaaQ9v4Y/chEJJ1kUfR6K4dASTCTKl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBXsxS%2FdJMcaaQ9v4Y%2FchEJJ1kUfR6K4dASTCTKl0%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;115&quot; height=&quot;122&quot; data-filename=&quot;cpp.png&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;C++&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>C_C++</category>
      <category>2026</category>
      <category>26</category>
      <category>C++</category>
      <category>C++26</category>
      <author>고니자니</author>
      <guid isPermaLink="true">https://gonyzany.tistory.com/747</guid>
      <comments>https://gonyzany.tistory.com/747#entry747comment</comments>
      <pubDate>Sun, 9 Nov 2025 15:23:43 +0900</pubDate>
    </item>
    <item>
      <title>음수를 2의 보수로 표현하는 방법, C언어 코드</title>
      <link>https://gonyzany.tistory.com/746</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아래 예제는 정수를 입력받아, 해당 정수를 8비트 이진수로 출력하면서 &lt;b&gt;양수/음수의 2의 보수 표현&lt;/b&gt;을 확인할 수 있게 해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1757475558618&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

// 8비트 이진수 출력 함수
void printBinary8(int num) {
    for (int i = 7; i &amp;gt;= 0; i--) {
        printf(&quot;%d&quot;, (num &amp;gt;&amp;gt; i) &amp;amp; 1);
    }
}

int main() {
    int num;

    printf(&quot;정수를 입력하세요: &quot;);
    scanf(&quot;%d&quot;, &amp;amp;num);

    printf(&quot;입력 값: %d\n&quot;, num);

    printf(&quot;8비트 이진수 표현: &quot;);
    printBinary8(num);
    printf(&quot;\n&quot;);

    if (num &amp;lt; 0) {
        printf(&quot;해당 값은 2의 보수로 저장되어 있습니다.\n&quot;);
    } else {
        printf(&quot;해당 값은 일반 양수 표현입니다.\n&quot;);
    }

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-end=&quot;1037&quot; data-start=&quot;1026&quot; data-ke-size=&quot;size26&quot;&gt;실행 예시&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;정수를 입력하세요:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;-5 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;입력 값: -5 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;8비트 이진수 표현: 11111011 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;해당 값은 2의 보수로 저장되어 있습니다. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;정수를 입력하세요: 5 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;입력 값: 5 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;8비트 이진수 표현: 00000101 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;해당 값은 일반 양수 표현입니다.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjUYYU/btsQrIuPFF0/4w84xrn5NTnxKkIcV6Du21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjUYYU/btsQrIuPFF0/4w84xrn5NTnxKkIcV6Du21/img.png&quot; data-alt=&quot;음수를 2의 보수로 표현하는 방법, C언어 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjUYYU/btsQrIuPFF0/4w84xrn5NTnxKkIcV6Du21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjUYYU%2FbtsQrIuPFF0%2F4w84xrn5NTnxKkIcV6Du21%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;475&quot; height=&quot;134&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;음수를 2의 보수로 표현하는 방법, C언어 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;&lt;hr data-end=&quot;96&quot; data-start=&quot;93&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;122&quot; data-start=&quot;98&quot; data-ke-size=&quot;size26&quot;&gt;  음수를 2의 보수로 표현하는 방법&lt;/h2&gt;
&lt;p data-end=&quot;146&quot; data-start=&quot;123&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 8비트로 표현한다고 가정하면:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;401&quot; data-start=&quot;148&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;231&quot; data-start=&quot;148&quot;&gt;&lt;b&gt;양수 이진수 표현&lt;/b&gt;&lt;br /&gt;절댓값을 2진수로 나타냅니다.&lt;br /&gt;예: -5라면, 우선 5를 8비트로 표현 &amp;rarr; 00000101&lt;/li&gt;
&lt;li data-end=&quot;312&quot; data-start=&quot;233&quot;&gt;&lt;b&gt;1의 보수(One&amp;rsquo;s Complement)&lt;/b&gt;&lt;br /&gt;모든 비트를 반전시킵니다.&lt;br /&gt;00000101 &amp;rarr; 11111010&lt;/li&gt;
&lt;li data-end=&quot;401&quot; data-start=&quot;314&quot;&gt;&lt;b&gt;2의 보수(Two&amp;rsquo;s Complement)&lt;/b&gt;&lt;br /&gt;1의 보수에 +1을 더합니다.&lt;br /&gt;11111010 + 1 = 11111011&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;444&quot; data-start=&quot;403&quot; data-ke-size=&quot;size16&quot;&gt;  따라서 -5의 8비트 2의 보수 표현은 &lt;b&gt;11111011&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C_C++</category>
      <category>2의보수</category>
      <category>음수</category>
      <author>고니자니</author>
      <guid isPermaLink="true">https://gonyzany.tistory.com/746</guid>
      <comments>https://gonyzany.tistory.com/746#entry746comment</comments>
      <pubDate>Wed, 10 Sep 2025 12:44:40 +0900</pubDate>
    </item>
    <item>
      <title>VC++ MFC 소개</title>
      <link>https://gonyzany.tistory.com/745</link>
      <description>&lt;h2 data-end=&quot;62&quot; data-start=&quot;46&quot; data-ke-size=&quot;size26&quot;&gt;  VC++ MFC란?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;346&quot; data-start=&quot;63&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;163&quot; data-start=&quot;63&quot;&gt;&lt;b&gt;VC++ (Visual C++)&lt;/b&gt;&lt;br /&gt;Microsoft에서 만든 C++ 개발 환경(IDE)으로, Windows 응용 프로그램을 만들 때 많이 사용합니다.&lt;/li&gt;
&lt;li data-end=&quot;346&quot; data-start=&quot;165&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;MFC (Microsoft Foundation Class)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;윈도우 프로그래밍을 쉽게 만들 수 있도록 제공하는 &lt;b&gt;C++ 클래스 라이브러리&lt;/b&gt;입니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;원래는 Win32 API를 직접 호출해야 했는데, API는 코드가 복잡하고 다루기 어려워서 이를 쉽게 사용할 수 있도록 만들어 놓은 클래스 라이브러리입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;351&quot; data-start=&quot;348&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;366&quot; data-start=&quot;353&quot; data-ke-size=&quot;size26&quot;&gt;  MFC의 특징&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;729&quot; data-start=&quot;367&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;442&quot; data-start=&quot;367&quot;&gt;&lt;b&gt;윈도우 프로그램 제작 편리&lt;/b&gt;&lt;br /&gt;버튼, 대화상자(Dialog), 메뉴, 툴바 같은 GUI 요소들을 쉽게 만들 수 있음.&lt;/li&gt;
&lt;li data-end=&quot;524&quot; data-start=&quot;443&quot;&gt;&lt;b&gt;클래스 구조 제공&lt;/b&gt;&lt;br /&gt;CWnd, CDialog, CButton, CEdit 등 다양한 윈도우 컨트롤 클래스 제공.&lt;/li&gt;
&lt;li data-end=&quot;617&quot; data-start=&quot;525&quot;&gt;&lt;b&gt;메시지 맵(Message Map)&lt;/b&gt;&lt;br /&gt;버튼 클릭 같은 이벤트를 처리하는 방식을 제공 (ON_BN_CLICKED, ON_WM_PAINT 등).&lt;/li&gt;
&lt;li data-end=&quot;729&quot; data-start=&quot;618&quot;&gt;&lt;b&gt;레거시지만 여전히 사용&lt;/b&gt;&lt;br /&gt;최신 앱 개발은 WPF, .NET, Qt, C# 등을 많이 쓰지만,&lt;br /&gt;&lt;b&gt;기존 기업용/산업용 프로그램 유지보수&lt;/b&gt;에서는 MFC가 아직 많이 사용됨.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;734&quot; data-start=&quot;731&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;756&quot; data-start=&quot;736&quot; data-ke-size=&quot;size26&quot;&gt;  MFC로 만들 수 있는 것&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;876&quot; data-start=&quot;757&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;791&quot; data-start=&quot;757&quot;&gt;윈도우 &lt;b&gt;대화상자 기반 프로그램&lt;/b&gt; (간단한 입력/출력)&lt;/li&gt;
&lt;li data-end=&quot;829&quot; data-start=&quot;792&quot;&gt;&lt;b&gt;문서/뷰 기반 프로그램&lt;/b&gt; (워드, 그림판 같은 UI 구조)&lt;/li&gt;
&lt;li data-end=&quot;876&quot; data-start=&quot;830&quot;&gt;산업용 제어 프로그램, 금융/증권 프로그램, CAD 툴, 사내 전용 프로그램 등&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;881&quot; data-start=&quot;878&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;904&quot; data-start=&quot;883&quot; data-ke-size=&quot;size26&quot;&gt;  Microsoft Visual Studio 개발도구&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MFC 앱을 만들기 위해서는 Microsoft Visual Studio 개발 도구가 설치되어 있어야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;899&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NjnJr/btsP0OWAT7s/T2Kr9Imul5XQKYNZQhZfak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NjnJr/btsP0OWAT7s/T2Kr9Imul5XQKYNZQhZfak/img.png&quot; data-alt=&quot;MFC 앱 만들기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NjnJr/btsP0OWAT7s/T2Kr9Imul5XQKYNZQhZfak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNjnJr%2FbtsP0OWAT7s%2FT2Kr9Imul5XQKYNZQhZfak%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;1360&quot; height=&quot;899&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;899&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MFC 앱 만들기&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1354&quot; data-start=&quot;1274&quot; data-ke-size=&quot;size16&quot;&gt;비주얼스튜디오 다운로드&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1354&quot; data-start=&quot;1274&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://coding-abc.tistory.com/4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://coding-abc.tistory.com/4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1755760140725&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;비주얼스튜디오 2022/Code, Visual Studio Community 다운로드 설치&quot; data-og-description=&quot;마이크로소프트 비주얼스튜디오 2022 다운로드 &amp;darr;&amp;darr; Visual Studio Code 다운로드 &amp;darr;&amp;darr; https://visualstudio.microsoft.com/ko/downloads/ Download Visual Studio Tools - Install Free for Windows, Mac, Linux Download Visual Studio IDE or V&quot; data-og-host=&quot;coding-abc.tistory.com&quot; data-og-source-url=&quot;https://coding-abc.tistory.com/4&quot; data-og-url=&quot;https://coding-abc.tistory.com/4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cH1A1x/hyZzAA5IkF/99kXaYlyoHGSvp6d4B1g8K/img.png?width=800&amp;amp;height=525&amp;amp;face=0_0_800_525,https://scrap.kakaocdn.net/dn/LRU6n/hyZDKotZsY/1Nmuf9msSSw6RnhY3jUTyK/img.png?width=800&amp;amp;height=525&amp;amp;face=0_0_800_525,https://scrap.kakaocdn.net/dn/T1Die/hyZynWkzPH/qVA73LAfbuYvHss4g3mJd0/img.png?width=1161&amp;amp;height=762&amp;amp;face=0_0_1161_762&quot;&gt;&lt;a href=&quot;https://coding-abc.tistory.com/4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://coding-abc.tistory.com/4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cH1A1x/hyZzAA5IkF/99kXaYlyoHGSvp6d4B1g8K/img.png?width=800&amp;amp;height=525&amp;amp;face=0_0_800_525,https://scrap.kakaocdn.net/dn/LRU6n/hyZDKotZsY/1Nmuf9msSSw6RnhY3jUTyK/img.png?width=800&amp;amp;height=525&amp;amp;face=0_0_800_525,https://scrap.kakaocdn.net/dn/T1Die/hyZynWkzPH/qVA73LAfbuYvHss4g3mJd0/img.png?width=1161&amp;amp;height=762&amp;amp;face=0_0_1161_762');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;비주얼스튜디오 2022/Code, Visual Studio Community 다운로드 설치&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;마이크로소프트 비주얼스튜디오 2022 다운로드 &amp;darr;&amp;darr; Visual Studio Code 다운로드 &amp;darr;&amp;darr; https://visualstudio.microsoft.com/ko/downloads/ Download Visual Studio Tools - Install Free for Windows, Mac, Linux Download Visual Studio IDE or V&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;coding-abc.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1354&quot; data-start=&quot;1274&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C_C++/VC++(MFC)</category>
      <category>MFC</category>
      <category>소개</category>
      <author>고니자니</author>
      <guid isPermaLink="true">https://gonyzany.tistory.com/745</guid>
      <comments>https://gonyzany.tistory.com/745#entry745comment</comments>
      <pubDate>Thu, 21 Aug 2025 16:11:15 +0900</pubDate>
    </item>
    <item>
      <title>C언어 역사 연대표</title>
      <link>https://gonyzany.tistory.com/744</link>
      <description>&lt;p data-end=&quot;115&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;C언어의 역사는 꽤 흥미롭고, 오늘날 우리가 쓰는 거의 모든 현대 프로그래밍 언어의 &amp;lsquo;조상님&amp;rsquo; 격이죠.&lt;br /&gt;아래는 C언어의 탄생부터 현재까지의 흐름을 간단하게 정리한 내용입니다.&lt;/p&gt;
&lt;hr data-end=&quot;120&quot; data-start=&quot;117&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;138&quot; data-start=&quot;122&quot; data-ke-size=&quot;size26&quot;&gt;  C언어 역사 연대표&lt;/h2&gt;
&lt;h3 data-end=&quot;169&quot; data-start=&quot;140&quot; data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;시작 이전 &amp;ndash; BCPL과 B 언어&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;393&quot; data-start=&quot;170&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;294&quot; data-start=&quot;170&quot;&gt;&lt;b&gt;1966년&lt;/b&gt; &amp;ndash; 마틴 리처즈(Martin Richards)가 &lt;b&gt;BCPL&lt;/b&gt;(Basic Combined Programming Language) 개발&lt;br /&gt;&amp;rarr; 시스템 프로그래밍을 위해 설계된 단순하고 효율적인 언어&lt;/li&gt;
&lt;li data-end=&quot;393&quot; data-start=&quot;295&quot;&gt;&lt;b&gt;1969년&lt;/b&gt; &amp;ndash; 켄 톰프슨(Ken Thompson)이 BCPL을 기반으로 &lt;b&gt;B 언어&lt;/b&gt; 개발&lt;br /&gt;&amp;rarr; 초기 유닉스(UNIX) 시스템을 PDP-7에서 구현할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;398&quot; data-start=&quot;395&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;418&quot; data-start=&quot;400&quot; data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;C언어의 탄생&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;622&quot; data-start=&quot;419&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;622&quot; data-start=&quot;419&quot;&gt;&lt;b&gt;1972년&lt;/b&gt; &amp;ndash; &lt;b&gt;데니스 리치(Dennis Ritchie)&lt;/b&gt;, 벨 연구소(Bell Labs)에서 &lt;b&gt;C 언어&lt;/b&gt; 개발
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li data-end=&quot;622&quot; data-start=&quot;419&quot;&gt;목적: UNIX 운영체제를 이식성과 효율성을 높여 구현&lt;/li&gt;
&lt;li data-end=&quot;573&quot; data-start=&quot;533&quot;&gt;B 언어의 한계를 보완하고, 자료형, 구조체, 포인터 개념을 도입&lt;/li&gt;
&lt;li data-end=&quot;622&quot; data-start=&quot;576&quot;&gt;PDP-11에서 UNIX를 C로 재작성 &amp;rarr; 운영체제까지 C로 작성하는 시대 개막&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;627&quot; data-start=&quot;624&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;654&quot; data-start=&quot;629&quot; data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;표준화 이전 &amp;ndash; K&amp;amp;R C&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;805&quot; data-start=&quot;655&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;805&quot; data-start=&quot;655&quot;&gt;&lt;b&gt;1978년&lt;/b&gt; &amp;ndash; 브라이언 커니핸(Brian Kernighan) &amp;amp; 데니스 리치,&lt;br /&gt;『The C Programming Language』(일명 K&amp;amp;R C) 출간
&lt;ul style=&quot;list-style-type: circle;&quot; data-end=&quot;805&quot; data-start=&quot;757&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li data-end=&quot;776&quot; data-start=&quot;757&quot;&gt;사실상 C언어의 &amp;lsquo;비공식 표준&amp;rsquo;&lt;/li&gt;
&lt;li data-end=&quot;805&quot; data-start=&quot;779&quot;&gt;많은 초기 개발자가 이 책을 통해 C를 배움&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;810&quot; data-start=&quot;807&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;843&quot; data-start=&quot;812&quot; data-ke-size=&quot;size23&quot;&gt;4. &lt;b&gt;표준화 &amp;ndash; ANSI C / ISO C&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1026&quot; data-start=&quot;844&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;883&quot; data-start=&quot;844&quot;&gt;&lt;b&gt;1983년&lt;/b&gt; &amp;ndash; ANSI(미국표준협회) C 표준화 위원회 결성&lt;/li&gt;
&lt;li data-end=&quot;919&quot; data-start=&quot;884&quot;&gt;&lt;b&gt;1989년&lt;/b&gt; &amp;ndash; &lt;b&gt;ANSI C (C89)&lt;/b&gt; 발표&lt;/li&gt;
&lt;li data-end=&quot;1026&quot; data-start=&quot;920&quot;&gt;&lt;b&gt;1990년&lt;/b&gt; &amp;ndash; 국제표준화기구(ISO)에서 승인 &amp;rarr; &lt;b&gt;ISO C (C90)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-end=&quot;1026&quot; data-start=&quot;972&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li data-end=&quot;997&quot; data-start=&quot;972&quot;&gt;함수 원형 선언, 표준 라이브러리 정의 등&lt;/li&gt;
&lt;li data-end=&quot;1026&quot; data-start=&quot;1000&quot;&gt;C가 본격적으로 국제적으로 통일된 언어가 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1031&quot; data-start=&quot;1028&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1053&quot; data-start=&quot;1033&quot; data-ke-size=&quot;size23&quot;&gt;5. &lt;b&gt;C99 &amp;ndash; 현대화&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1182&quot; data-start=&quot;1054&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1182&quot; data-start=&quot;1054&quot;&gt;&lt;b&gt;1999년&lt;/b&gt; &amp;ndash; &lt;b&gt;C99&lt;/b&gt; 표준 발표
&lt;ul style=&quot;list-style-type: circle;&quot; data-end=&quot;1182&quot; data-start=&quot;1086&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li data-end=&quot;1117&quot; data-start=&quot;1086&quot;&gt;inline 함수, 변수 선언을 블록 중간에 가능&lt;/li&gt;
&lt;li data-end=&quot;1161&quot; data-start=&quot;1120&quot;&gt;long long int, 불리언 _Bool, 복소수 타입 추가&lt;/li&gt;
&lt;li data-end=&quot;1182&quot; data-start=&quot;1164&quot;&gt;가변 길이 배열(VLA) 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1187&quot; data-start=&quot;1184&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1217&quot; data-start=&quot;1189&quot; data-ke-size=&quot;size23&quot;&gt;6. &lt;b&gt;C11 &amp;ndash; 멀티스레드와 유니코드&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1319&quot; data-start=&quot;1218&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1319&quot; data-start=&quot;1218&quot;&gt;&lt;b&gt;2011년&lt;/b&gt; &amp;ndash; &lt;b&gt;C11&lt;/b&gt; 표준 발표
&lt;ul style=&quot;list-style-type: circle;&quot; data-end=&quot;1319&quot; data-start=&quot;1250&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li data-end=&quot;1273&quot; data-start=&quot;1250&quot;&gt;멀티스레드 지원(threads.h)&lt;/li&gt;
&lt;li data-end=&quot;1295&quot; data-start=&quot;1276&quot;&gt;원자 연산, 유니코드 문자 처리&lt;/li&gt;
&lt;li data-end=&quot;1319&quot; data-start=&quot;1298&quot;&gt;안전한 표준 함수(*_s) 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1324&quot; data-start=&quot;1321&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1346&quot; data-start=&quot;1326&quot; data-ke-size=&quot;size23&quot;&gt;7. &lt;b&gt;C17 &amp;amp; 앞으로&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1495&quot; data-start=&quot;1347&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1406&quot; data-start=&quot;1347&quot;&gt;&lt;b&gt;2017년&lt;/b&gt; &amp;ndash; &lt;b&gt;C17 (C18)&lt;/b&gt; 표준 발표
&lt;ul style=&quot;list-style-type: circle;&quot; data-end=&quot;1406&quot; data-start=&quot;1385&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li data-end=&quot;1406&quot; data-start=&quot;1385&quot;&gt;C11의 버그 수정 및 사소한 개선&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1495&quot; data-start=&quot;1407&quot;&gt;&lt;b&gt;미래: C2x&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-end=&quot;1495&quot; data-start=&quot;1425&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li data-end=&quot;1449&quot; data-start=&quot;1425&quot;&gt;다음 세대 C 표준(202x년 예정)&lt;/li&gt;
&lt;li data-end=&quot;1495&quot; data-start=&quot;1452&quot;&gt;모듈, 개선된 메모리 모델, 현대 시스템 프로그래밍에 맞춘 기능 추가 예정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1500&quot; data-start=&quot;1497&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1515&quot; data-start=&quot;1502&quot; data-ke-size=&quot;size26&quot;&gt;  C언어의 의의&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1698&quot; data-start=&quot;1516&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1591&quot; data-start=&quot;1516&quot;&gt;&lt;b&gt;현대 언어의 기반&lt;/b&gt;&lt;br /&gt;C++&amp;middot;Java&amp;middot;C#&amp;middot;Objective-C&amp;middot;Go&amp;middot;Rust 등 수많은 언어가 C의 문법과 개념을 계승&lt;/li&gt;
&lt;li data-end=&quot;1623&quot; data-start=&quot;1592&quot;&gt;&lt;b&gt;운영체제와 하드웨어에 가까운 저수준 제어 가능&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1662&quot; data-start=&quot;1624&quot;&gt;**이식성(Portability)**과 &lt;b&gt;성능&lt;/b&gt;의 절묘한 균형&lt;/li&gt;
&lt;li data-end=&quot;1698&quot; data-start=&quot;1663&quot;&gt;&lt;b&gt;UNIX와 함께 성장&lt;/b&gt; &amp;rarr; 시스템 프로그래밍 표준이 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1703&quot; data-start=&quot;1700&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ecfdd8e5-2334-43f3-8f7e-c97f5fabb1e6.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpGniT/btsPQzsg0WT/CW9I8rutik4waSemjesWYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpGniT/btsPQzsg0WT/CW9I8rutik4waSemjesWYK/img.png&quot; data-alt=&quot;C언어의 역사&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpGniT/btsPQzsg0WT/CW9I8rutik4waSemjesWYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpGniT%2FbtsPQzsg0WT%2FCW9I8rutik4waSemjesWYK%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;1024&quot; height=&quot;1536&quot; data-filename=&quot;ecfdd8e5-2334-43f3-8f7e-c97f5fabb1e6.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;C언어의 역사&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C_C++</category>
      <category>C언어</category>
      <category>역사</category>
      <category>연대표</category>
      <author>고니자니</author>
      <guid isPermaLink="true">https://gonyzany.tistory.com/744</guid>
      <comments>https://gonyzany.tistory.com/744#entry744comment</comments>
      <pubDate>Wed, 13 Aug 2025 20:20:07 +0900</pubDate>
    </item>
    <item>
      <title>C++, 틱택토(TIC TAC TOE) 콘솔 게임: 인간과 컴퓨터 AI의 대결</title>
      <link>https://gonyzany.tistory.com/743</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;사람(X) vs 컴퓨터(AI, O)의 콘솔 틱택토 게임 C++ 소스 코드(단일 파일) 입니다. AI는 &lt;b&gt;미니맥스(minimax)&lt;/b&gt; 알고리즘으로 최적의 수를 둡니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스의 g++과 윈도우에서 Visual Studio 2022에서 실행할 수 있습니다 - 소스중에서 헤더 부분만 수정하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1754726097710&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 리눅스: g++ 헤더
//#include &amp;lt;bits/stdc++.h&amp;gt;  
//using namespace std;


// Visual Studio 헤더
#include &amp;lt;iostream&amp;gt;  
#include &amp;lt;limits&amp;gt;
#include &amp;lt;utility&amp;gt;
#include &amp;lt;climits&amp;gt;
using namespace std;

// 3x3 보드, 빈칸은 ' '
// 사람: 'X', 컴퓨터(AI): 'O'
char board[3][3];

// 보드 초기화
void initBoard() {
    for (int i = 0; i &amp;lt; 3; ++i)
        for (int j = 0; j &amp;lt; 3; ++j)
            board[i][j] = ' ';
}

// 보드 출력 (인덱스 포함)
void printBoard() {
    cout &amp;lt;&amp;lt; &quot;\n&quot;;
    cout &amp;lt;&amp;lt; &quot;     0   1   2\n&quot;;
    cout &amp;lt;&amp;lt; &quot;   -------------\n&quot;;
    for (int i = 0; i &amp;lt; 3; ++i) {
        cout &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &quot; |&quot;;
        for (int j = 0; j &amp;lt; 3; ++j) {
            cout &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; board[i][j] &amp;lt;&amp;lt; &quot; |&quot;;
        }
        cout &amp;lt;&amp;lt; &quot;\n   -------------\n&quot;;
    }
    cout &amp;lt;&amp;lt; &quot;\n&quot;;
}

// 승패 판단: 'X' 승 -&amp;gt; +10, 'O' 승 -&amp;gt; -10, 무승부/계속 -&amp;gt; 0 (미니맥스 점수 기준)
int evaluate() {
    // 행 체크
    for (int row = 0; row &amp;lt; 3; ++row) {
        if (board[row][0] != ' ' &amp;amp;&amp;amp;
            board[row][0] == board[row][1] &amp;amp;&amp;amp;
            board[row][1] == board[row][2]) {
            if (board[row][0] == 'X') return +10;
            else return -10;
        }
    }
    // 열 체크
    for (int col = 0; col &amp;lt; 3; ++col) {
        if (board[0][col] != ' ' &amp;amp;&amp;amp;
            board[0][col] == board[1][col] &amp;amp;&amp;amp;
            board[1][col] == board[2][col]) {
            if (board[0][col] == 'X') return +10;
            else return -10;
        }
    }
    // 대각선
    if (board[0][0] != ' ' &amp;amp;&amp;amp; board[0][0] == board[1][1] &amp;amp;&amp;amp; board[1][1] == board[2][2]) {
        if (board[0][0] == 'X') return +10;
        else return -10;
    }
    if (board[0][2] != ' ' &amp;amp;&amp;amp; board[0][2] == board[1][1] &amp;amp;&amp;amp; board[1][1] == board[2][0]) {
        if (board[0][2] == 'X') return +10;
        else return -10;
    }
    return 0;
}

// 남은 빈칸이 있는지
bool isMovesLeft() {
    for (int i = 0; i &amp;lt; 3; ++i)
        for (int j = 0; j &amp;lt; 3; ++j)
            if (board[i][j] == ' ')
                return true;
    return false;
}

// minimax: depth 포함 (깊을수록 빠른 승리/지연을 우선)
int minimax(int depth, bool isMax) {
    int score = evaluate();

    // 기본 종료조건
    if (score == 10) return score - depth; // 빠르게 이기면 더 좋음
    if (score == -10) return score + depth; // 지는 걸 늦추는 게 더 높음
    if (!isMovesLeft()) return 0;

    if (isMax) { // 사람(X) 차례를 모사 (최대화)
        int best = INT_MIN;
        for (int i = 0; i &amp;lt; 3; ++i) {
            for (int j = 0; j &amp;lt; 3; ++j) {
                if (board[i][j] == ' ') {
                    board[i][j] = 'X';
                    best = max(best, minimax(depth + 1, !isMax));
                    board[i][j] = ' ';
                }
            }
        }
        return best;
    }
    else { // 컴퓨터(O) 차례 (최소화)
        int best = INT_MAX;
        for (int i = 0; i &amp;lt; 3; ++i) {
            for (int j = 0; j &amp;lt; 3; ++j) {
                if (board[i][j] == ' ') {
                    board[i][j] = 'O';
                    best = min(best, minimax(depth + 1, !isMax));
                    board[i][j] = ' ';
                }
            }
        }
        return best;
    }
}

// 최적의 수 찾기 (AI: O)
pair&amp;lt;int, int&amp;gt; findBestMove() {
    int bestVal = INT_MAX; // AI는 최소화
    pair&amp;lt;int, int&amp;gt; bestMove = { -1, -1 };

    for (int i = 0; i &amp;lt; 3; ++i) {
        for (int j = 0; j &amp;lt; 3; ++j) {
            if (board[i][j] == ' ') {
                board[i][j] = 'O';
                int moveVal = minimax(0, true); // 다음은 사람 차례(최대화)
                board[i][j] = ' ';
                if (moveVal &amp;lt; bestVal) {
                    bestMove = { i, j };
                    bestVal = moveVal;
                }
            }
        }
    }
    return bestMove;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    initBoard();
    cout &amp;lt;&amp;lt; &quot;틱택토: 사람(X) vs 컴퓨터(O)\n&quot;;
    cout &amp;lt;&amp;lt; &quot;사람이 먼저 둡니다. 좌표 입력은 '행 열' (예: 0 2)\n&quot;;

    printBoard();
    while (true) {
        // 사람 수
        int r, c;
        while (true) {
            cout &amp;lt;&amp;lt; &quot;당신 차례 (X) &amp;mdash; 행 열: &quot;;
            if (!(cin &amp;gt;&amp;gt; r &amp;gt;&amp;gt; c)) {
                cout &amp;lt;&amp;lt; &quot;잘못된 입력입니다. 숫자 2개를 공백으로 구분해 주세요.\n&quot;;
                cin.clear();
                cin.ignore(numeric_limits&amp;lt;streamsize&amp;gt;::max(), '\n');
                continue;
            }
            if (r &amp;lt; 0 || r &amp;gt; 2 || c &amp;lt; 0 || c &amp;gt; 2) {
                cout &amp;lt;&amp;lt; &quot;범위를 벗어났습니다. 0 ~ 2 사이로 입력하세요.\n&quot;;
                continue;
            }
            if (board[r][c] != ' ') {
                cout &amp;lt;&amp;lt; &quot;이미 차있습니다. 다른 곳에 두세요.\n&quot;;
                continue;
            }
            board[r][c] = 'X';
            break;
        }

        printBoard();
        int score = evaluate();
        if (score == 10) {
            cout &amp;lt;&amp;lt; &quot;축하합니다! 당신이 이겼습니다.\n&quot;;
            break;
        }
        if (!isMovesLeft()) {
            cout &amp;lt;&amp;lt; &quot;무승부입니다.\n&quot;;
            break;
        }

        // 컴퓨터 수 (AI)
        cout &amp;lt;&amp;lt; &quot;컴퓨터(O) 생각 중...\n&quot;;
        pair&amp;lt;int, int&amp;gt; aiMove = findBestMove();
        if (aiMove.first == -1) {
            // 안전장치: 빈칸 아무거나
            for (int i = 0; i &amp;lt; 3 &amp;amp;&amp;amp; aiMove.first == -1; ++i)
                for (int j = 0; j &amp;lt; 3; ++j)
                    if (board[i][j] == ' ') { aiMove = { i,j }; break; }
        }
        board[aiMove.first][aiMove.second] = 'O';
        cout &amp;lt;&amp;lt; &quot;컴퓨터가 둔 위치: &quot; &amp;lt;&amp;lt; aiMove.first &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; aiMove.second &amp;lt;&amp;lt; &quot;\n&quot;;
        printBoard();

        score = evaluate();
        if (score == -10) {
            cout &amp;lt;&amp;lt; &quot;컴퓨터가 이겼습니다. 다시 도전해 보세요!\n&quot;;
            break;
        }
        if (!isMovesLeft()) {
            cout &amp;lt;&amp;lt; &quot;무승부입니다.\n&quot;;
            break;
        }
    }

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;913&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b73bOG/btsPK3UQ4nW/dZmxKgSNyS0rfwYk1GvY1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b73bOG/btsPK3UQ4nW/dZmxKgSNyS0rfwYk1GvY1K/img.png&quot; data-alt=&quot;C++, 틱택토(TIC TAC TOE) 콘솔 게임: 인간과 컴퓨터 AI의 대결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b73bOG/btsPK3UQ4nW/dZmxKgSNyS0rfwYk1GvY1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb73bOG%2FbtsPK3UQ4nW%2FdZmxKgSNyS0rfwYk1GvY1K%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;520&quot; height=&quot;913&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;913&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;C++, 틱택토(TIC TAC TOE) 콘솔 게임: 인간과 컴퓨터 AI의 대결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brz91W/btsPNopICgo/3cxfgr1UfRnonXi0oDmbmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brz91W/btsPNopICgo/3cxfgr1UfRnonXi0oDmbmK/img.png&quot; data-alt=&quot;C++, 틱택토(TIC TAC TOE) 콘솔 게임: 인간과 컴퓨터 AI의 대결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brz91W/btsPNopICgo/3cxfgr1UfRnonXi0oDmbmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbrz91W%2FbtsPNopICgo%2F3cxfgr1UfRnonXi0oDmbmK%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;520&quot; height=&quot;286&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;C++, 틱택토(TIC TAC TOE) 콘솔 게임: 인간과 컴퓨터 AI의 대결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;g++:&lt;/p&gt;
&lt;pre id=&quot;code_1754726322164&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;g++ -std=c++17 -O2 -o tictactoe tictactoe.cpp
./tictactoe&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C_C++</category>
      <category>ai</category>
      <category>tic tac toe</category>
      <category>인공지능</category>
      <category>틱택토</category>
      <author>enjoy-country-life</author>
      <guid isPermaLink="true">https://gonyzany.tistory.com/743</guid>
      <comments>https://gonyzany.tistory.com/743#entry743comment</comments>
      <pubDate>Sat, 9 Aug 2025 17:01:38 +0900</pubDate>
    </item>
    <item>
      <title>동기식(Synchronous)/비동기식(Asynchronous) 방식 개요</title>
      <link>https://gonyzany.tistory.com/742</link>
      <description>&lt;p data-end=&quot;117&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;동기식(Synchronous) 방식과 비동기식(Asynchronous) 방식은 &lt;b&gt;작업 처리 방식&lt;/b&gt;을 설명할 때 자주 사용되는 개념입니다. 두 방식은 작업 요청과 응답이 어떻게 이루어지는지에 따라 구분됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;122&quot; data-start=&quot;119&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;151&quot; data-start=&quot;124&quot; data-ke-size=&quot;size26&quot;&gt;✅ 동기식(Synchronous) 방식 개요&lt;/h2&gt;
&lt;h3 data-end=&quot;164&quot; data-start=&quot;153&quot; data-ke-size=&quot;size23&quot;&gt;  개념&lt;/h3&gt;
&lt;p data-end=&quot;244&quot; data-start=&quot;165&quot; data-ke-size=&quot;size16&quot;&gt;요청한 작업이 &lt;b&gt;끝날 때까지 기다린 후에&lt;/b&gt; 다음 작업을 수행하는 방식입니다.&lt;br /&gt;즉, 작업 A가 완료되어야 작업 B를 시작할 수 있습니다.&lt;/p&gt;
&lt;h3 data-end=&quot;255&quot; data-start=&quot;246&quot; data-ke-size=&quot;size23&quot;&gt;  특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;338&quot; data-start=&quot;256&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;278&quot; data-start=&quot;256&quot;&gt;요청 &amp;rarr; 대기 &amp;rarr; 응답 &amp;rarr; 다음 작업&lt;/li&gt;
&lt;li data-end=&quot;297&quot; data-start=&quot;279&quot;&gt;흐름이 직선적이고 예측 가능함&lt;/li&gt;
&lt;li data-end=&quot;338&quot; data-start=&quot;298&quot;&gt;구현이 단순하지만, &lt;b&gt;응답 시간이 길어지면 전체 성능 저하&lt;/b&gt; 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;349&quot; data-start=&quot;340&quot; data-ke-size=&quot;size23&quot;&gt;  예시&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;403&quot; data-start=&quot;350&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;377&quot; data-start=&quot;350&quot;&gt;함수 호출: 함수가 값을 반환할 때까지 기다림&lt;/li&gt;
&lt;li data-end=&quot;403&quot; data-start=&quot;378&quot;&gt;전화 통화: 상대방이 응답할 때까지 기다림&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;408&quot; data-start=&quot;405&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;439&quot; data-start=&quot;410&quot; data-ke-size=&quot;size26&quot;&gt;✅ 비동기식(Asynchronous) 방식 개요&lt;/h2&gt;
&lt;h3 data-end=&quot;452&quot; data-start=&quot;441&quot; data-ke-size=&quot;size23&quot;&gt;  개념&lt;/h3&gt;
&lt;p data-end=&quot;542&quot; data-start=&quot;453&quot; data-ke-size=&quot;size16&quot;&gt;요청한 작업이 끝나기를 &lt;b&gt;기다리지 않고&lt;/b&gt; 바로 다음 작업을 수행하는 방식입니다.&lt;br /&gt;요청한 작업의 결과는 나중에 알림(콜백, 이벤트 등)을 통해 처리합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;553&quot; data-start=&quot;544&quot; data-ke-size=&quot;size23&quot;&gt;  특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;635&quot; data-start=&quot;554&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;585&quot; data-start=&quot;554&quot;&gt;요청 &amp;rarr; 바로 다음 작업 수행 &amp;rarr; 결과는 나중에 처리&lt;/li&gt;
&lt;li data-end=&quot;601&quot; data-start=&quot;586&quot;&gt;효율적인 자원 활용 가능&lt;/li&gt;
&lt;li data-end=&quot;635&quot; data-start=&quot;602&quot;&gt;구현이 복잡할 수 있음 (콜백, Promise 등 필요)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;646&quot; data-start=&quot;637&quot; data-ke-size=&quot;size23&quot;&gt;  예시&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;752&quot; data-start=&quot;647&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;678&quot; data-start=&quot;647&quot;&gt;이메일: 메시지를 보내고 바로 다른 일을 할 수 있음&lt;/li&gt;
&lt;li data-end=&quot;720&quot; data-start=&quot;679&quot;&gt;JavaScript의 setTimeout, Ajax, Promise&lt;/li&gt;
&lt;li data-end=&quot;752&quot; data-start=&quot;721&quot;&gt;네트워크 요청: 응답을 기다리지 않고 다른 작업 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;757&quot; data-start=&quot;754&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;770&quot; data-start=&quot;759&quot; data-ke-size=&quot;size26&quot;&gt;  비교 정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;동기식 (Synchronous)비동기식 (Asynchronous)
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1208&quot; data-start=&quot;772&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1208&quot; data-start=&quot;917&quot;&gt;
&lt;tr data-end=&quot;978&quot; data-start=&quot;917&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;928&quot; data-start=&quot;917&quot;&gt;처리 순서&lt;/td&gt;
&lt;td data-end=&quot;953&quot; data-start=&quot;928&quot; data-col-size=&quot;sm&quot;&gt;순차적&lt;/td&gt;
&lt;td data-end=&quot;978&quot; data-start=&quot;953&quot; data-col-size=&quot;sm&quot;&gt;병렬 또는 분기 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1035&quot; data-start=&quot;979&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;990&quot; data-start=&quot;979&quot;&gt;대기 여부&lt;/td&gt;
&lt;td data-end=&quot;1008&quot; data-start=&quot;990&quot; data-col-size=&quot;sm&quot;&gt;요청 결과 올 때까지 대기&lt;/td&gt;
&lt;td data-end=&quot;1035&quot; data-start=&quot;1008&quot; data-col-size=&quot;sm&quot;&gt;대기하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1094&quot; data-start=&quot;1036&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1049&quot; data-start=&quot;1036&quot;&gt;성능&lt;/td&gt;
&lt;td data-end=&quot;1072&quot; data-start=&quot;1049&quot; data-col-size=&quot;sm&quot;&gt;느릴 수 있음&lt;/td&gt;
&lt;td data-end=&quot;1094&quot; data-start=&quot;1072&quot; data-col-size=&quot;sm&quot;&gt;빠르고 효율적일 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1150&quot; data-start=&quot;1095&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1105&quot; data-start=&quot;1095&quot;&gt;구현 난이도&lt;/td&gt;
&lt;td data-end=&quot;1126&quot; data-start=&quot;1105&quot; data-col-size=&quot;sm&quot;&gt;상대적으로 쉬움&lt;/td&gt;
&lt;td data-end=&quot;1150&quot; data-start=&quot;1126&quot; data-col-size=&quot;sm&quot;&gt;상대적으로 복잡함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1208&quot; data-start=&quot;1151&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1162&quot; data-start=&quot;1151&quot;&gt;활용 예시&lt;/td&gt;
&lt;td data-end=&quot;1181&quot; data-start=&quot;1162&quot; data-col-size=&quot;sm&quot;&gt;전통적 함수 호출, 파일 읽기&lt;/td&gt;
&lt;td data-end=&quot;1208&quot; data-start=&quot;1181&quot; data-col-size=&quot;sm&quot;&gt;웹 서버, Ajax, 비동기 I/O&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;010&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/010.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/010.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>통합게시판</category>
      <category>Asynchronous</category>
      <category>Synchronous</category>
      <category>동기식</category>
      <category>비동기식</category>
      <author>enjoy-country-life</author>
      <guid isPermaLink="true">https://gonyzany.tistory.com/742</guid>
      <comments>https://gonyzany.tistory.com/742#entry742comment</comments>
      <pubDate>Sat, 28 Jun 2025 20:45:17 +0900</pubDate>
    </item>
    <item>
      <title>VC++, MFC 바둑판 (오목판) 그리기 (1)</title>
      <link>https://gonyzany.tistory.com/741</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;VC++, MFC 대화상자 기반으로 바둑판(오목판)을 그리는 코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트명: Omok&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkudxB/btsOt3Ohyu7/iR0WCSjcgdIjnVVepdu3OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkudxB/btsOt3Ohyu7/iR0WCSjcgdIjnVVepdu3OK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkudxB/btsOt3Ohyu7/iR0WCSjcgdIjnVVepdu3OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkudxB%2FbtsOt3Ohyu7%2FiR0WCSjcgdIjnVVepdu3OK%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;840&quot; height=&quot;630&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OmokDlg.h&lt;/p&gt;
&lt;pre id=&quot;code_1749458291010&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// OmokDlg.h: 헤더 파일
//

#pragma once


// COmokDlg 대화 상자
class COmokDlg : public CDialogEx
{
// 생성입니다.
public:
	COmokDlg(CWnd* pParent = nullptr);	// 표준 생성자입니다.

// 대화 상자 데이터입니다.
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_OMOK_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 지원입니다.


// 구현입니다.
protected:
	HICON m_hIcon;

	// 생성된 메시지 맵 함수
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()

private:
	void DrawBoard(CDC* pDC);
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OmokDlg.cpp&lt;/p&gt;
&lt;pre id=&quot;code_1749458346905&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// OmokDlg.cpp: 구현 파일
//

#include &quot;pch.h&quot;
#include &quot;framework.h&quot;
#include &quot;Omok.h&quot;
#include &quot;OmokDlg.h&quot;
#include &quot;afxdialogex.h&quot;
#include &amp;lt;vector&amp;gt;

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

struct Point {
	int x;
	int y;
};

// 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 대화 상자 데이터입니다.
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_ABOUTBOX };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 지원입니다.

// 구현입니다.
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// COmokDlg 대화 상자



COmokDlg::COmokDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_OMOK_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()-&amp;gt;LoadIcon(IDR_MAINFRAME);
}

void COmokDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(COmokDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()


// COmokDlg 메시지 처리기

BOOL COmokDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 시스템 메뉴에 &quot;정보...&quot; 메뉴 항목을 추가합니다.

	// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
	ASSERT((IDM_ABOUTBOX &amp;amp; 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX &amp;lt; 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu-&amp;gt;AppendMenu(MF_SEPARATOR);
			pSysMenu-&amp;gt;AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 이 대화 상자의 아이콘을 설정합니다.  응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
	//  프레임워크가 이 작업을 자동으로 수행합니다.
	SetIcon(m_hIcon, TRUE);			// 큰 아이콘을 설정합니다.
	SetIcon(m_hIcon, FALSE);		// 작은 아이콘을 설정합니다.

	// TODO: 여기에 추가 초기화 작업을 추가합니다.

	return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}

void COmokDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID &amp;amp; 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면
//  아래 코드가 필요합니다.  문서/뷰 모델을 사용하는 MFC 애플리케이션의 경우에는
//  프레임워크에서 이 작업을 자동으로 수행합니다.

void COmokDlg::OnPaint()
{
	CPaintDC dc(this); // 디바이스 컨텍스트
	DrawBoard(&amp;amp;dc);
}

void COmokDlg::DrawBoard(CDC* pDC)
{
	const int startX = 20;
	const int startY = 20;
	const int cellSize = 30;
	const int boardSize = 15;

	// 외곽선
	CRect rect(startX - 1, startY - 1, startX + cellSize * (boardSize - 1) + 1, startY + cellSize * (boardSize - 1) + 1);
	pDC-&amp;gt;Rectangle(&amp;amp;rect);

	// 선 그리기
	for (int i = 0; i &amp;lt; boardSize; ++i)
	{
		int x = startX + i * cellSize;
		int y = startY + i * cellSize;

		pDC-&amp;gt;MoveTo(x, startY);
		pDC-&amp;gt;LineTo(x, startY + cellSize * (boardSize - 1));

		pDC-&amp;gt;MoveTo(startX, y);
		pDC-&amp;gt;LineTo(startX + cellSize * (boardSize - 1), y);
	}

	// hoshi 좌표
	std::vector&amp;lt;Point&amp;gt; hoshiPoints = {
		{3, 3}, {3, 7}, {3, 11},
		{7, 3}, {7, 7}, {7, 11},
		{11, 3}, {11, 7}, {11, 11}
	};

	// 검은색 브러시 생성
	CBrush blackBrush(RGB(0, 0, 0));
	CBrush* pOldBrush = pDC-&amp;gt;SelectObject(&amp;amp;blackBrush);

	// hoshi 점 그리기
	for (const auto&amp;amp; pt : hoshiPoints)
	{
		int x = startX + pt.x * cellSize;
		int y = startY + pt.y * cellSize;
		pDC-&amp;gt;Ellipse(x - 3, y - 3, x + 3, y + 3); // 반지름 3픽셀의 원
	}

	// 이전 브러시 복원
	pDC-&amp;gt;SelectObject(pOldBrush);
}

// 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서
//  이 함수를 호출합니다.
HCURSOR COmokDlg::OnQueryDragIcon()
{
	return static_cast&amp;lt;HCURSOR&amp;gt;(m_hIcon);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F1qeH/btsOu8uccLV/KaDcKwOOGJM6Y1vKKEUaJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F1qeH/btsOu8uccLV/KaDcKwOOGJM6Y1vKKEUaJ0/img.png&quot; data-alt=&quot;바둑판 (오목판) 15x15 그리기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F1qeH/btsOu8uccLV/KaDcKwOOGJM6Y1vKKEUaJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF1qeH%2FbtsOu8uccLV%2FKaDcKwOOGJM6Y1vKKEUaJ0%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;660&quot; height=&quot;505&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;바둑판 (오목판) 15x15 그리기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 소스&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bYyCpr/btsOuWOc1SR/Drnlocf13Agp0bqsCHJ22k/Omok_1.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Omok_1.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.23MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>C_C++/VC++(MFC)</category>
      <category>MFC</category>
      <category>VC++</category>
      <category>대화상자</category>
      <category>바둑판</category>
      <category>오목판</category>
      <author>고니자니</author>
      <guid isPermaLink="true">https://gonyzany.tistory.com/741</guid>
      <comments>https://gonyzany.tistory.com/741#entry741comment</comments>
      <pubDate>Mon, 9 Jun 2025 17:40:25 +0900</pubDate>
    </item>
  </channel>
</rss>