<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Ko_Gun | Dev</title>
        <link>https://velog.io/</link>
        <description>Software Engineer | Computer Vision</description>
        <lastBuildDate>Tue, 15 Jul 2025 16:53:52 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Ko_Gun | Dev</title>
            <url>https://velog.velcdn.com/images/dev_gun/profile/578a9af2-316e-4a8a-a536-a90d6df696d5/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Ko_Gun | Dev. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_gun" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Python] 01장 파이썬 시작하기]]></title>
            <link>https://velog.io/@dev_gun/Python-01%EC%9E%A5-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dev_gun/Python-01%EC%9E%A5-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 15 Jul 2025 16:53:52 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>⚠️ <strong>주의:</strong> 이 글은 자바를 공부하면서 <strong>개인적으로 정리한 글</strong>입니다.<br>친절한 설명보다는 <strong>개념 정리 중심</strong>이니 참고용으로만 활용해주세요.</p>
</blockquote>
<hr>
<h2 id="mark01mark-파이썬이란"><mark>01.</mark> 파이썬이란?</h2>
<p style="font-size:1.2em; line-height:1.4;"><strong>
<u> Python 설치하기</u></strong>
</p>

<p>파이썬 설치하는 내용은 따로 다루지 않겠습니다.
해당 사이트를 참고해주시면 좋을 것 같습니다.
<a href="https://www.python.org/downloads/">https://www.python.org/downloads/</a></p>
<p>파이썬으로 작성된 코드를 실행해 주는 프로그램을 <code>인터프리터(Interpreter)<sup><a href="#fn1">1</a></sup></code>라고 한다.</p>
<blockquote>
  <summary><strong id="fn1"><sup>1</sup>💬 TMI : 인터프리터(Interpreter)란?</strong></summary>

<p>영어로 &quot;해석기&quot;란 의미를 가지고 있으며, 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경을 말한다.</p>
<p><img src="https://velog.velcdn.com/images/dev_gun/post/38510853-fdd5-4e23-a89c-18a18ce4d87e/image.png" alt=""></p>
<p>우리가 보통 쓰고 있는 컴퓨터 프로그래밍 언어는 인간이 알아보고 쓰기 쉽게 만들어진 고급 언어이다. 그렇기에 컴퓨터가 이해하고 처리 가능한 기계어라고 하는 저급 언어로 바꾸는 작업이 필요하다. </p>
<p><img src="https://velog.velcdn.com/images/dev_gun/post/7b236bb9-6c43-41f7-879e-9e653a055984/image.png" alt=""></p>
<p>이러한 작업을 수행하는 방법 중 프로그램 언어를 해석하고 번역하는 방식에 따라 2가지로 나누는데 이를 <code>컴파일러(Compiler)</code>와 <code>인터프리터(Interpreter)</code>라고 한다.
  <br>
  <strong>컴파일러(Compiler)</strong>
  <img src="https://velog.velcdn.com/images/dev_gun/post/2be468a7-cc72-4ec7-845a-1d7ec9ad33f3/image.png" alt=""></p>
<p>  컴파일을 수행하는 프로그램을 <code>컴파일러(compiler)</code>라고 한다.
  이 컴파일은 프로그램의 작성된 모든 코드를 한꺼번에 기계어로 바꾸어 처리하는 방식이다.
  <br>
  <strong>인터프리터(Interpreter)</strong>
  <img src="https://velog.velcdn.com/images/dev_gun/post/c0ce7d6d-11f3-4588-8fc5-d4f0e10bd758/image.png" alt=""></p>
<p>  반면, <code>인터프리터(Interpreter)</code>는 프로그램 코드를 한 줄씩 번역하여 기계어로 바꾸는 작업이다.</p>
  <br>


<p>  <strong>인터프리터의 특징과 컴파일러와의 차이점</strong>
  인터프리터의 가장 큰 특징이 프로그램을 한 줄씩 번역하는 과정을 거치는 것이기에, 대부분의 다른 특징에 이에 기반하여 수반된다. 인터프리터는 한 줄 명령어 단위에서 각 코드 한 줄이 {함수}인 경우가 많기에 인터프리터 언어를 &quot;함수 언어&quot;라 부르기도 한다.</p>
<p>인터프리터에서 명령어 한 줄 각각이 너무 단순하기도 하지만 때론 그 한 줄의 구조가 매우 복잡하고 기능을 위한 코드가 전부 담겨있을 수 있다. 객체지향적 언어는 아니지만 그에 준하는 객체지향적 성격을 가지도록 개발될 수 있다.</p>
<p>  <img src="https://velog.velcdn.com/images/dev_gun/post/2b68f852-0e51-458b-88b2-dcc3cbf22f7a/image.png" alt=""></p>
<p>  컴파일러는 번역 시 바이트코드라는 목적 파일이 생성되어 컴파일이 완료되는 반면, 인터프리터는 목적 파일을 생성하지 않는다. 그렇기 때문에 추가적인 메모리 사용이 없다는 특징이 있다.
  소스코드를 한줄씩 번역하기에 실행 속도 면에서는 컴파일러보다 느리지만 컴파일러보다 프로그램 수정이 간단하며, 한 줄씩 실행되기 때문에 디버깅 과정이 간단하다.
  </blockquote></p>
<hr>
<h2 id="mark02mark-파이썬에서-자주-나오는-용어-정리"><mark>02.</mark> 파이썬에서 자주 나오는 용어 정리</h2>
<h3 id="21-키워드keyword">2.1. 키워드(Keyword)</h3>
<p><code>키워드(Keyword)</code>는 파이썬에서 이미 예약되어있는 문자열로서 다른 용도로 사용이 불가능한 문자열이다.</p>
<table>
<thead>
<tr>
<th>키워드</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><code>False</code></td>
<td>불 값(False)을 나타내는 리터럴</td>
</tr>
<tr>
<td><code>None</code></td>
<td>아무 값도 없음을 나타내는 리터럴</td>
</tr>
<tr>
<td><code>True</code></td>
<td>참 값(True)을 나타내는 리터럴</td>
</tr>
<tr>
<td><code>and</code></td>
<td>논리 곱(and) 연산자</td>
</tr>
<tr>
<td><code>or</code></td>
<td>논리 합(or) 연산자</td>
</tr>
<tr>
<td><code>not</code></td>
<td>논리 부정(not) 연산자</td>
</tr>
<tr>
<td><code>is</code></td>
<td>동일성(identity) 비교 연산자</td>
</tr>
<tr>
<td><code>in</code></td>
<td>포함 여부 확인 연산자</td>
</tr>
<tr>
<td><code>if</code></td>
<td>조건문 시작 키워드</td>
</tr>
<tr>
<td><code>elif</code></td>
<td>if 다음의 추가 조건 분기</td>
</tr>
<tr>
<td><code>else</code></td>
<td>모든 조건이 False일 때 실행되는 블록</td>
</tr>
<tr>
<td><code>for</code></td>
<td>반복문(for-each) 시작 키워드</td>
</tr>
<tr>
<td><code>while</code></td>
<td>조건 기반 반복문 시작 키워드</td>
</tr>
<tr>
<td><code>break</code></td>
<td>반복문을 즉시 종료</td>
</tr>
<tr>
<td><code>continue</code></td>
<td>반복문의 현재 반복만 건너뛰고 다음 반복으로 이동</td>
</tr>
<tr>
<td><code>def</code></td>
<td>함수를 정의하는 키워드</td>
</tr>
<tr>
<td><code>return</code></td>
<td>함수에서 값을 반환</td>
</tr>
<tr>
<td><code>lambda</code></td>
<td>익명 함수를 정의하는 키워드</td>
</tr>
<tr>
<td><code>import</code></td>
<td>모듈을 가져오는 키워드</td>
</tr>
<tr>
<td><code>from</code></td>
<td>모듈에서 특정 이름만 가져오는 키워드</td>
</tr>
<tr>
<td><code>as</code></td>
<td>가져온 모듈이나 예외에 별칭(alias) 지정</td>
</tr>
<tr>
<td><code>class</code></td>
<td>클래스를 정의하는 키워드</td>
</tr>
<tr>
<td><code>try</code></td>
<td>예외 처리 블록 시작 키워드</td>
</tr>
<tr>
<td><code>except</code></td>
<td>예외 발생 시 처리 블록</td>
</tr>
<tr>
<td><code>finally</code></td>
<td>예외 발생 여부와 상관없이 항상 실행되는 블록</td>
</tr>
<tr>
<td><code>raise</code></td>
<td>예외를 강제 발생</td>
</tr>
<tr>
<td><code>with</code></td>
<td>컨텍스트 매니저 사용 시 블록 진입/종료 관리</td>
</tr>
<tr>
<td><code>pass</code></td>
<td>아무 동작도 하지 않는 플레이스홀더 문장</td>
</tr>
<tr>
<td><code>del</code></td>
<td>객체 참조를 삭제</td>
</tr>
<tr>
<td><code>global</code></td>
<td>함수 내부에서 전역 변수 사용을 선언</td>
</tr>
<tr>
<td><code>nonlocal</code></td>
<td>중첩 함수에서 외부 함수의 변수를 사용·수정할 때 선언</td>
</tr>
<tr>
<td><code>match</code></td>
<td>구조 분해 패턴 매칭(PEP 634) 시작 키워드</td>
</tr>
<tr>
<td><code>case</code></td>
<td><code>match</code> 블록 내에서 패턴별 분기</td>
</tr>
</tbody></table>
<br>

<h3 id="22-식별자identifier">2.2. 식별자(identifier)</h3>
<h4 id="221-식별자identifier란">2.2.1. 식별자(identifier)란?</h4>
<p><code>식별자(identifier)</code>는 변수, 상수, 함수, 사용자 정의 타입 등에서 다른 것들과 구분하기 위해서 사용되는 변수의 이름, 상수의 이름, 함수의 이름, 사용자 정의 타입의 이름 등 &#39;이름&#39;을 일반화 해서 지칭하는 용어이다.
사용자가 임의로 지정하며 이름만 보아도 뜻을 알 수 있도록 지정하는 것이 좋다.</p>
<h4 id="222-식별자identifier-명칭의-작성-스타일">2.2.2. 식별자(identifier) 명칭의 작성 스타일</h4>
<p>변수나 함수명 같은 식별자(identifier)의 명칭을 작성할 때 이름을 정의하는 것도 코딩 스타일 중 일부이다. 대표적인 표기법은 다음 네 가지가 있다.</p>
<ul>
<li><p><strong>카멜 표기법 (Camel Case)</strong><br>여러 단어를 연달아 사용할 때 각 단어의 첫 글자를 대문자로 적되, 맨 앞에 오는 글자는 소문자로 표기하는 것이다. 낙타의 등에 있는 혹과 같다고 하여 카멜(Camel) 표기법이라고 부른다. Java의 권장 표기법이다.<br>예) <code>camelVariable</code>, <code>firstName</code>, <code>lastName</code> …</p>
</li>
<li><p><strong>파스칼 표기법 (Pascal Case)</strong><br>단어의 모든 앞글자를 대문자로 표기하는 것이다. 카멜 표기법이 단봉낙타라면 파스칼은 쌍봉낙타라고 비유할 수 있다.<br>예) <code>PascalVariable</code>, <code>FirstName</code>, <code>LastName</code> …</p>
</li>
<li><p><strong>헝가리안 표기법 (Hungarian Notation)</strong><br>접두어에 자료형을 붙이는 표기법이다. 요즈음은 잘 사용하지 않는 스타일이다. 언어의 종류가 다양한 만큼 자료형도, 문서 데이터도 다양해졌기 때문에 접두어가 의미를 잃었다.<br>예) <code>strName</code>, <code>bBusy</code>, <code>szName</code> …</p>
</li>
<li><p><strong>스네이크 표기법 (Snake Case)</strong><br>단어 사이에 언더바를 넣어서 표기하는 방법이다. 하지만 <code>_</code> 이나 <code>__</code>로 시작되는 식별자는 많은 언어에서 확장으로 예약되어 있는 경우가 많으므로 사용하지 않는 것이 관례이다.</p>
</li>
</ul>
<p>대부분의 경우 카멜 표기법과 파스칼 표기법을 적절하게 조합하여, 변수명이나 함수명은 카멜 표기법을 따르고 클래스명은 파스칼 표기법을 따르는 스타일이 주를 이룬다. 전자는 Java, 후자는 C++에서 주로 볼 수 있는 스타일이다. 언어에 따라 전부 카멜 또는 전부 파스칼 표기법을 권장하기도 한다.
<img src="https://velog.velcdn.com/images/dev_gun/post/ee026885-451a-43d3-823f-9991683cfa12/image.png" alt=""></p>
<h4 id="223-식별자-작성-규칙">2.2.3. 식별자 작성 규칙</h4>
<ul>
<li>식별자는 소문자 (a ~ z) 또는 대문자 (A ~ Z) 또는 숫자 (0 ~ 9) 또는 밑줄 (_)의 조합입니다.</li>
<li>myClass, var_1및 print_this_to_screen 모두 유효한 예입니다.</li>
<li>식별자는 숫자로 시작될 수 없습니다. 1variable무효이지만 variable1완벽하게 괜찮습니다.</li>
<li>키워드는 식별자로 사용할 수 없습니다.</li>
<li>!, @, #, $, % 등 특수 기호는 우리 식별자에서 사용할 수 없습니다.</li>
<li>식별자의 길이는 제한이 없습니다.</li>
<li>파이썬은 대소 문자를 구별하는 언어입니다. 이는, Variable과 variable동일하지 않습니다.</li>
<li>의미있는 식별자의 이름을 항상 지정하십시오.</li>
</ul>
<blockquote>
<summary><strong>💬 TMI : Style Guide for Python Code</strong></summary>

<p style="font-size:1em; line-height:1.4;">
  <strong><u>코드 배치</u></strong>
</p>

<ul>
<li>들여쓰기는 공백 4칸을 권장한다.  </li>
<li>한 줄은 최대 79자까지 허용한다.  </li>
<li>최상위(top-level) 함수와 클래스 정의 전후에는 2줄씩 띄워 쓴다.  </li>
<li>클래스 내의 메소드 정의 전후에는 1줄씩 띄워 쓴다.<br>

</li>
</ul>
<p style="font-size:1em; line-height:1.4;">
  <strong><u>표현식과 구문의 공백</u></strong>
</p>
다음과 같은 곳의 불필요한 공백은 피한다.

<ul>
<li>대괄호(<code>[]</code>)와 소괄호(<code>()</code>) 안의 공백  </li>
<li>쉼표(<code>,</code>), 쌍점(<code>:</code>)과 세미콜론(<code>;</code>) 앞의 공백  </li>
<li>키워드 인자(keyword argument)와 기본값(default parameter value) 사이의 <code>=</code>는 붙여 쓴다.<br>

</li>
</ul>
<p style="font-size:1em; line-height:1.4;">
  <strong><u>주석</u></strong>
</p>

<ul>
<li>코드와 모순되는 주석은 없느니만 못하다. 항상 코드에 따라 갱신해야 한다.  </li>
<li>불필요한 주석은 달지 않는다.  </li>
<li>한 줄 주석은 신중히 단다.<br>

</li>
</ul>
<p style="font-size:1em; line-height:1.4;">
  <strong><u>이름 지정 규칙</u></strong>
</p>

<ul>
  <li>변수명에서 밑줄(<code>_</code>)은 위치에 따라 다음과 같은 의미를 가진다:
    <pre>
- 한 개의 밑줄로 시작: 내부적으로 사용되는 변수
- 한 개의 밑줄로 종료: 파이썬 키워드와 충돌을 피하려고 사용
- 두 개의 밑줄로 시작: 클래스 속성으로 사용
- 두 개의 밑줄로 종료: 네임스페이스 조정용 속성
    </pre>
  </li>
  <li>소문자 <code>l</code>, 대문자 <code>O</code>, 대문자 <code>I</code>는 변수명으로 사용하지 않는다.</li>
  <li>모듈(<abbr title="Module">Module</abbr>) 명은 짧은 소문자로 구성하며, 필요하다면 밑줄로 나눈다.
    <pre>
- 모듈은 파일 시스템의 영향을 받으므로 주의한다.
- C/C++ 확장 모듈은 밑줄로 시작한다.
    </pre>
  </li>
  <li>클래스명은 카멜케이스(<abbr title="CamelCase">CamelCase</abbr>)로 작성한다.
    <pre>
- 내부용 클래스명은 앞에 밑줄을 붙인다.
- 예외(<abbr title="Exception">Exception</abbr>) 클래스명은 실제 에러인 경우 “Error”를 뒤에 붙인다.
    </pre>
  </li>
  <li>함수명은 소문자로 구성하되, 필요하면 밑줄로 구분한다.
    <pre>
- 대소문자 혼용은 기존 하위호환을 위해 이미 흔히 쓰이는 경우에만 허용한다.
    </pre>
  </li>
  <li>메소드명은 함수명과 같으나, 비공개(non-public) 메소드나 변수인 경우 앞에 밑줄을 붙인다.
    <pre>
- 서브 클래스 이름 충돌을 막기 위해서는 밑줄 2개를 앞에 붙인다.
    </pre>
  </li>
  <li>상수(Constant)는 모듈 단위에서만 정의하며, 모두 대문자로 작성하고 필요하면 밑줄로 나눈다.</li>
</ul>

</blockquote>


<hr>
<h2 id="📚-참고-사이트">📚 참고 사이트</h2>
<ul>
<li><a href="https://m.blog.naver.com/solim5351/223232093932">인터프리터에 대하여</a></li>
<li><a href="https://www.python.org/downloads/">파이썬 다운로드 (공식 사이트)</a></li>
<li><a href="https://code.visualstudio.com/download">Visual Studio Code 다운로드 (공식 사이트)</a></li>
<li><a href="https://wikidocs.net/20559">식별자(identifier) — Python 계단밟기 (위키독스)</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 01. 자바란 무엇인가?]]></title>
            <link>https://velog.io/@dev_gun/Java-01.-%EC%9E%90%EB%B0%94%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80</link>
            <guid>https://velog.io/@dev_gun/Java-01.-%EC%9E%90%EB%B0%94%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80</guid>
            <pubDate>Tue, 15 Jul 2025 03:38:08 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>⚠️ <strong>주의:</strong> 이 글은 자바를 공부하면서 <strong>개인적으로 정리한 글</strong>입니다.<br>친절한 설명보다는 <strong>개념 정리 중심</strong>이니 참고용으로만 활용해주세요.</p>
</blockquote>
<hr>
<h2 id="mark01mark-자바란"><mark>01.</mark> 자바란?</h2>
<p><img src="https://velog.velcdn.com/images/dev_gun/post/47c228c9-8aa5-485e-8eca-af5872ca8bce/image.png" alt=""></p>
<p>자바(Java)는 썬 마이크로시스템즈(Sun Microsystems)의 제임스 고슬링(James Gosling)과 연구원들이 개발한 <code>객체 지향 프로그래밍<sup><a href="#fn1">1</a></sup></code> 언어로, 1995년에 발표되었다.</p>
<p>처음에는 가전제품에 탑재되는 프로그램을 만들기 위한 목적이었으나, 현재는 웹 애플리케이션, 모바일 앱, 서버 백엔드 개발 등 다양한 영역에서 가장 널리 사용되는 프로그래밍 언어 중 하나이다.</p>
<blockquote>
<details>
<summary><strong id="fn1"><sup>1</sup>💡 TMI : 객체지향 프로그래밍이란?</strong></summary>

<p>객체는 프로그램에서 사용되는 데이터 또는 참조 공간을 말한다.<br>객체는 값을 저장할 변수와 작업을 수행할 메서드를 묶은 단위로, 쉽게 말해 &quot;연관된 데이터 + 행동&quot;을 하나로 묶은 구조이다.  </p>
<p>이를 레고 블록에 비유할 수 있다.<br>레고 조각 하나하나가 객체이고, 이 객체들을 조립해서 하나의 큰 구조를 만드는 것이 객체지향 프로그래밍이다.</p>
</details>
</blockquote>

<hr>
<h2 id="mark02mark-자바-둘러보기"><mark>02.</mark> 자바 둘러보기</h2>
<p>프로그래밍 언어를 배울 때 자바는 다른 언어와 달리 첫 번째 예제로 다루는 Hello World 를 출력하는 자바 프로그램만 제대로 공부하면 자바 언어의 절반 이상을 익히는
것과 다름없다고 한다.</p>
<p>왜냐하면 Hello World 를 출력하는 프로그램을 작성하려면 <code>JDK<sup><a href="#fn2">2</a></sup></code> 와 <code>IDE<sup><a href="#fn3">3</a></sup></code> 를 설치하는 방법과 클래스, 함수, public, static 의 개념을 이해하고 실행하는 방법까지 모두 알아야 하기 때문이다.</p>
<blockquote>
<details>
<summary><strong id="fn2"><sup>2</sup>💬 TMI : JDK란?</strong></summary>



<p>JDK(Java Development Kit)는 <strong>자바 프로그램을 개발하기 위한 도구 모음</strong>이다.<br>이 안에는 <strong>컴파일러(javac), 실행기(java), 디버거(jdb), 문서 생성기(javadoc)</strong> 등<br>개발에 필요한 핵심 도구들과 JRE(Java Runtime Environment)가 포함되어 있다 </p>
<ul>
<li><strong>javac</strong>: 자바 소스 코드를 바이트코드(.class)로 변환하는 컴파일러  </li>
<li><strong>java</strong>: 컴파일된 바이트코드를 JVM에서 해석·실행하는 런처  </li>
<li><strong>jdb</strong>: 자바 프로그램을 디버깅하기 위한 도구  </li>
<li><strong>javadoc</strong>: 코드 주석을 기반으로 API 문서를 자동 생성  </li>
<li>기타 <code>jar</code>, <code>javadoc</code>, <code>javap</code>, <code>jinfo</code> 등 다양한 개발 유틸리티 포함 </li>
</ul>
<p>JDK는 내부적으로 JRE + 개발 도구 모음이기 때문에,<br>단순히 Java 애플리케이션 실행 목적이라면 JRE만 설치해도 가능하지만,<br>개발을 하려면 꼭 JDK를 설치해야 한다.</p>
</details>
</blockquote>


<blockquote>
<details>
<summary><strong id="fn3"><sup>3</sup>💬 TMI : IDE이란?</strong></summary>

<p>IDE(통합 개발 환경)이란, 프로그램을 실행하기 위한 과정인 <strong>코드 작성 → 컴파일 → 실행을 하나의 소프트웨어 안에서 처리할 수 있도록 도와주는 도구</strong>이다.
프로그램을 실행하는 과정은 일반적으로 다음 두 단계로 이루어진다.</p>
<p><strong>1. 프로그래밍(코딩)</strong><br>   → 우리가 실행하고자 하는 코드를 직접 작성하는 과정이다.</p>
<p>*<em>2. 컴파일  *</em>
   → 작성한 코드를 해당 언어의 컴파일러를 통해 기계어로 번역하고 실행한다.<br>   예를 들어, Python의 경우 Python 컴파일러를 통해 실행된다.</p>
<p>반면, IDE를 사용하면 코드 작성 → 컴파일 → 실행 과정을 한 곳에서 통합적으로 수행할 수 있어 훨씬 편리하다.</p>
</details>
</blockquote>


<p><strong>💡 자바 프로그램 실행 과정</strong></p>
<p>  <img src="https://velog.velcdn.com/images/dev_gun/post/5ee9218f-2a0a-4727-ad06-df70e9143311/image.png" alt=""> </p>
<p style="font-size:0.85em; line-height:1.4;">
  ※ 컴파일러는 <code>javac.exe</code>, 자바 가상 머신(<code>JVM</code>)은 <code>java.exe</code>에 해당합니다.
  <sup><a href="#fn1" style="font-size:0.75em;">1</a></sup>
</p>

<ol>
  <li>
    소스 코드인 MyProgram.java 파일을 작성한다.
  </li>
  <li>
    컴파일러는 자바 소스 코드를 이용하여 클래스 파일인 MyProgram.class를 생성한다. 이때 MyProgram.class는 JVM이 인식할 수 있는 이진 파일(binary file)이다.
  </li>
  <li>
    JVM은 클래스 파일의 이진 코드(binary code)를 해석하여 프로그램을 실행한다.
  </li>
  <li>
    MyProgram의 실행 결과가 컴퓨터에 반영된다.
  </li>
</ol>

<hr>
<h2 id="mark03mark-자바-설치-및-인텔리제이-설치"><mark>03.</mark> 자바 설치 및 인텔리제이 설치</h2>
<p style="font-size:1.2em; line-height:1.4;"><strong>
<u> JDK(Java Development Kit) 설치</u></strong>
</p>

<p>🔗 <a href="https://www.oracle.com/java/technologies/downloads/">JDK 다운로드 (Oracle 공식)</a></p>
<ul>
<li>자바 개발 도구 모음이며, 반드시 설치해야 함</li>
<li>설치 방법은 여러 블로그 및 공식 페이지를 참고</li>
</ul>
<p style="font-size:1.2em; line-height:1.4;"><strong>
<u> IntelliJ IDEA 설치</u></strong>
</p>

<p>🔗 <a href="https://www.jetbrains.com/ko-kr/idea/download/">IntelliJ IDEA 다운로드 (공식 사이트)</a></p>
<ul>
<li>JetBrains에서 제공하는 대표적인 자바 통합 개발 환경(IDE)</li>
<li>무료 버전(Community Edition)도 충분히 사용 가능</li>
</ul>
<hr>
<h2 id="mark04mark-hello-world"><mark>04.</mark> Hello World</h2>
<pre><code class="language-java">public class HelloWorld {
}</code></pre>
<p>클래스 선언 시 <code>public</code> 키워드는 <code>접근 제어자<sup><a href="#fn4">4</a></sup></code>이다.<br>자바에서는 하나의 파일에 여러 클래스를 작성할 수 있지만,<br>파일명과 동일한 클래스에는 <code>public</code> 키워드를 붙이는 것이 관례이다.</p>
<p>예를 들어 <code>HelloWorld.java</code> 파일 안에 여러 클래스가 있어도,<br>파일명과 같은 <code>HelloWorld</code> 클래스에만 <code>public</code>을 붙인다.</p>
<p><code>HelloWorld.java</code>의 파일명과 <code>HelloWorld</code> 클래스의 이름은 같다.</p>
<blockquote>
<details>
<summary><strong id="fn4"><sup>4</sup>💬 TMI : 접근제어자(public, private, protected, default)</strong></summary>

<p>자바에서 접근제어자(access modifier)는 클래스와 클래스의 멤버(필드, 메소드, 생성자)의 접근 범위를 지정하는 키워드이다.</p>
<h4 id="1-클래스의-접근제어자">1. 클래스의 접근제어자</h4>
<p>클래스를 정의할 때 사용할 수 있는 접근제어자는 public과 default(생략) 두 가지이다.</p>
<ul>
<li>public 클래스: 모든 패키지에서 접근 가능  </li>
<li>default 클래스: 같은 패키지 내에서만 접근 가능  </li>
</ul>
<pre><code class="language-java">public class Book {     // public 클래스
    ...
}

class NoteBook {        // default 클래스
    ...
}</code></pre>
  <br>

<h4 id="2-클래스-멤버의-접근제어자">2. 클래스 멤버의 접근제어자</h4>
<p>클래스 멤버(필드, 메소드, 생성자)에 사용할 수 있는 접근제어자는 public, private, protected, default(생략) 네 가지이다.</p>
<ul>
<li>public 멤버: 모든 패키지에서 접근 가능  </li>
<li>private 멤버: 같은 클래스 내부에서만 접근 가능  </li>
<li>protected 멤버: 같은 패키지 및 다른 패키지의 자식 클래스에서 접근 가능  </li>
<li>default 멤버: 같은 패키지 내에서만 접근 가능  </li>
</ul>
<p>접근 범위는 public &gt; protected &gt; default &gt; private 순으로 좁아진다.</p>
<pre><code class="language-java">public class Book {       // public 클래스

    public int a;          // public 멤버변수
    private int b;         // private 멤버변수
    protected int c;       // protected 멤버변수
    int d;                 // default 멤버변수

    public Book() { }      // public 생성자

    public void showA() { … }   // public 메서드
    private void showB() { … }  // private 메서드
}</code></pre>
<p><img src="https://velog.velcdn.com/images/dev_gun/post/cb9eb41a-6e2f-44c3-8c03-652b20555c51/image.png" alt=""></p>
</details>
</blockquote>



<p style="font-size:1.2em; line-height:1.4;"><strong>
  <u> main 메서드 이해하기</u></strong></p>

<p>자바 프로그램을 실행하려면 <code>main<sup><a href="#fn5">5</a></sup></code> 메서드가 필요하다.<br>모든 프로그램의 시작 지점이며, 실행 가능한 클래스에는 반드시 있어야 한다.</p>
<p>메서드는 함수와 개념이 동일하지만, 클래스 내부에 존재할 경우 보통 &quot;메서드&quot;라 부른다.<br>자바는 모든 것이 클래스 기반이므로, 자바에서의 함수는 곧 메서드이다.</p>
<pre><code class="language-java">public class HelloWorld {
    public static void main(String[] args) {
        System.out.println(&quot;Hello World&quot;);
    }
}</code></pre>
<blockquote>
<details>
<summary><strong id="fn5"><sup>5</sup>💬 TMI : main 메서드에 등장한 요소 설명 (보강)</strong></summary>

<ul>
<li><p><strong>public</strong>  </p>
<ul>
<li>접근 제어자 중 가장 허용 범위가 넓음.  </li>
<li>자바 어플리케이션 실행 시 JVM이 <strong>어디서든</strong> <code>main</code> 메서드를 호출할 수 있도록 공개되어야만 함.  </li>
<li>만약 <code>public</code>이 아니면, JVM이 진입점을 찾지 못해 실행 오류 발생.</li>
</ul>
</li>
<li><p><strong>static</strong>  </p>
<ul>
<li>클래스 로딩 시점에 메서드가 <strong>정적 영역(Static Area)</strong>에 미리 생성됨.  </li>
<li>인스턴스를 생성하지 않아도 호출 가능.  </li>
<li><code>static</code> 메서드에서는 아직 생성되지 않은(인스턴스화되지 않은) 인스턴스 멤버에 접근할 수 없음.</li>
</ul>
</li>
<li><p><strong>void</strong>  </p>
<ul>
<li>반환값이 없음을 명시.  </li>
<li><code>main</code> 메서드는 프로그램 실행 후 JVM으로 복귀만 하면 되므로, 아무것도 반환하지 않음.</li>
</ul>
</li>
<li><p><strong>String[]</strong>  </p>
<ul>
<li><code>String</code> 객체들의 배열.  </li>
<li>프로그램 실행 시, 커맨드라인에서 전달된 <strong>여러 개의 문자열 인자</strong>를 저장하는 역할.  </li>
<li>예: <code>java MyApp A B C</code> → <code>args[0]=&quot;A&quot;</code>, <code>args[1]=&quot;B&quot;</code>, <code>args[2]=&quot;C&quot;</code>.</li>
</ul>
</li>
<li><p><strong>args</strong>  </p>
<ul>
<li>변수명으로, 배열 참조 변수는 자유롭게 변경 가능 (<code>String[] data</code> 등).  </li>
<li><strong>배열 길이(<code>args.length</code>)</strong>를 통해 전달된 인자 개수를 확인할 수 있음.  </li>
<li>보통 <code>for</code> 문으로 순회 처리하거나, <code>if (args.length &lt; n)</code> 조건 검사에 사용.</li>
</ul>
</li>
<li><p><strong>System.out.println</strong>  </p>
<ul>
<li>표준 출력 스트림(<code>System.out</code>)으로 데이터를 보내는 내장 메서드.  </li>
<li>메시지 출력 후 자동 줄바꿈.</li>
</ul>
</li>
</ul>
<hr>
<h3 id="커맨드라인-예제">커맨드라인 예제</h3>
<pre><code class="language-bash"># 컴파일
javac SampleProject.java -encoding UTF-8

# 실행: 전달 인자 3개 이상이 필요할 때
java SampleProject one two three</code></pre>
<pre><code class="language-java">public class SampleProject {
    public static void main(String[] args) {
        if (args.length &lt; 3) {
            System.out.println(&quot;인자는 3개 이상 전달되어야 합니다.&quot;);
            return;
        }
        for (int i = 0; i &lt; args.length; i++) {
            System.out.println(&quot;args[&quot; + i + &quot;] = &quot; + args[i]);
        }
    }
}</code></pre>
<ol>
<li><code>args.length</code>로 인자 개수를 검사  </li>
<li><code>for</code> 문으로 각 인자를 순회  </li>
<li><code>-encoding UTF-8</code> 옵션으로 인코딩 오류 방지</li>
</ol>
</details>
</blockquote>

<p>main 메서드를 제대로 이해하려면 <code>객체</code>, <code>인스턴스</code> 개념이 선행되어야 하므로<br>이번 장에서는 깊이 설명하지 않고 넘어간다.</p>
<p>중요한 점은, <strong>자바 프로그램을 실행하려면 반드시 아래 형식의 main 메서드가 있어야 한다</strong>는 것이다.</p>
<pre><code class="language-java">public static void main(String[] args)</code></pre>
<p>앞에서 main 메서드를 준비했으므로, 이제 프로그램을 실행할 수 있다.  </p>
<hr>
<h2 id="📚-참고-사이트">📚 참고 사이트</h2>
<ul>
<li><a href="https://www.oracle.com/java/technologies/downloads/">Oracle JDK 다운로드 (Java Technologies)</a>  </li>
<li><a href="https://www.jetbrains.com/ko-kr/idea/download/">IntelliJ IDEA 다운로드 (JetBrains)</a>  </li>
<li><a href="https://javacpro.tistory.com/11">Java 프로세스 수행 방식</a>  </li>
<li><a href="https://kadosholy.tistory.com/96">JDK 설치 및 환경변수 설정 (Windows 기준)</a>  </li>
<li><a href="https://wikidocs.net/887">자바 개요 및 특징 (위키독스)</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter에서 네이티브 모듈 연동(Kotlin)]]></title>
            <link>https://velog.io/@dev_gun/Flutter%EC%97%90%EC%84%9C-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C-%EB%AA%A8%EB%93%88-%EC%97%B0%EB%8F%99-Kotlin</link>
            <guid>https://velog.io/@dev_gun/Flutter%EC%97%90%EC%84%9C-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C-%EB%AA%A8%EB%93%88-%EC%97%B0%EB%8F%99-Kotlin</guid>
            <pubDate>Wed, 05 Feb 2025 04:49:29 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_gun/post/0c521743-eb5d-4cf8-b63e-8ee01b789dd6/image.png" alt=""></p>
<p>Flutter는 플랫폼별 네이티브 코드를 연동할 수 있는 기능을 제공합니다. Android에서는 Kotlin을 사용하여 네이티브 기능을 구현하고, Flutter의 Dart 코드에서 이를 호출할 수 있습니다. 본 가이드에서는 Flutter에서 Kotlin을 활용하여 네이티브 모듈을 연동하는 방법을 자세히 설명합니다.</p>
<h2 id="1-프로젝트-설정">1. 프로젝트 설정</h2>
<h3 id="11-flutter-프로젝트-생성">1.1. Flutter 프로젝트 생성</h3>
<p>Flutter 프로젝트가 없다면 아래 명령어로 새 프로젝트를 생성합니다.</p>
<pre><code class="language-sh">flutter create my_flutter_app
cd my_flutter_app</code></pre>
<h3 id="12-android-네이티브-코드-사용-준비">1.2. Android 네이티브 코드 사용 준비</h3>
<p>Flutter 프로젝트를 생성하면 <code>android/</code> 폴더에 네이티브 Android 코드가 포함되어 있습니다. Kotlin을 사용할 수 있도록 <code>android/app/build.gradle</code> 파일을 수정합니다.</p>
<h4 id="androidbuildgradle-수정"><code>android/build.gradle</code> 수정</h4>
<pre><code class="language-gradle">ext.kotlin_version = &#39;1.6.10&#39; // 최신 버전에 맞게 변경
classpath &quot;org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version&quot;</code></pre>
<h4 id="androidappbuildgradle-수정"><code>android/app/build.gradle</code> 수정</h4>
<pre><code class="language-gradle">apply plugin: &#39;kotlin-android&#39;
apply plugin: &#39;kotlin-kapt&#39;</code></pre>
<hr>

<h2 id="2-네이티브-모듈-생성">2. 네이티브 모듈 생성</h2>
<p>Flutter와 Kotlin 간 통신을 위해 <strong>MethodChannel</strong>을 사용합니다.</p>
<h3 id="21-네이티브-코드-구현-kotlin">2.1. 네이티브 코드 구현 (Kotlin)</h3>
<p><code>android/app/src/main/kotlin/com/example/my_flutter_app/MainActivity.kt</code> 파일을 수정합니다.</p>
<pre><code class="language-kotlin">package com.example.my_flutter_app

import android.os.Bundle
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel

class MainActivity: FlutterActivity() {
    private val CHANNEL = &quot;com.example.flutter/native&quot;

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
            call, result -&gt;
            when (call.method) {
                &quot;getNativeMessage&quot; -&gt; {
                    val message = getNativeMessage()
                    result.success(message)
                }
                else -&gt; {
                    result.notImplemented()
                }
            }
        }
    }

    private fun getNativeMessage(): String {
        return &quot;Hello from Kotlin!&quot;
    }
}</code></pre>
<h3 id="22-flutter에서-네이티브-코드-호출">2.2. Flutter에서 네이티브 코드 호출</h3>
<p>Flutter의 Dart 코드에서 <code>MethodChannel</code>을 사용하여 네이티브 Kotlin 코드를 호출할 수 있습니다.</p>
<pre><code class="language-dart">import &#39;package:flutter/material.dart&#39;;
import &#39;package:flutter/services.dart&#39;;

class NativeModuleScreen extends StatefulWidget {
  @override
  _NativeModuleScreenState createState() =&gt; _NativeModuleScreenState();
}

class _NativeModuleScreenState extends State&lt;NativeModuleScreen&gt; {
  static const platform = MethodChannel(&quot;com.example.flutter/native&quot;);
  String _nativeMessage = &quot;&quot;;

  Future&lt;void&gt; getNativeMessage() async {
    try {
      final String result = await platform.invokeMethod(&quot;getNativeMessage&quot;);
      setState(() {
        _nativeMessage = result;
      });
    } catch (e) {
      setState(() {
        _nativeMessage = &quot;Failed to get message&quot;;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(&quot;Flutter ↔ Kotlin&quot;)),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(_nativeMessage),
            ElevatedButton(
              onPressed: getNativeMessage,
              child: Text(&quot;Get Message from Kotlin&quot;),
            )
          ],
        ),
      ),
    );
  }
}</code></pre>
<hr>

<h2 id="3-실행-및-테스트">3. 실행 및 테스트</h2>
<p>Flutter 앱을 실행하여 Kotlin 코드와의 연동이 정상적으로 이루어지는지 확인합니다.</p>
<pre><code class="language-sh">flutter run</code></pre>
<p>버튼을 클릭하면 Kotlin에서 전달된 메시지가 화면에 표시됩니다.</p>
<hr>
# 
## 4. 정리
- `MethodChannel`을 사용하여 Flutter와 Kotlin 간 네이티브 기능을 호출할 수 있습니다.
- Kotlin에서 `setMethodCallHandler`를 등록하여 특정 메서드를 실행하고 결과를 반환합니다.
- Dart에서 `invokeMethod`를 사용하여 Kotlin 메서드를 호출하고 결과를 받습니다.

<p>이제 Flutter 프로젝트에서 Kotlin을 활용한 네이티브 모듈 연동이 가능합니다! 🚀</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter에서 Kakao Map API 사용법]]></title>
            <link>https://velog.io/@dev_gun/Flutter%EC%97%90%EC%84%9C-Kakao-Map-API-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@dev_gun/Flutter%EC%97%90%EC%84%9C-Kakao-Map-API-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Wed, 05 Feb 2025 04:42:48 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_gun/post/a62b9057-4959-4dd9-9345-ca244f5a84d6/image.png" alt=""></p>
<h2 id="1-개요">1. 개요</h2>
<p>Flutter에서 Kakao Map API를 활용하여 지도 기능을 구현하는 방법을 소개합니다. Kakao Map API는 다양한 지도 기능과 POI(장소) 검색, 경로 안내 등의 기능을 제공합니다.</p>
<hr>

<h2 id="2-kakao-map-api-키-발급">2. Kakao Map API 키 발급</h2>
<ol>
<li><a href="https://developers.kakao.com/">Kakao Developers</a>에 접속하여 로그인합니다.</li>
<li>애플리케이션을 등록한 후 <strong>네이티브 앱 키</strong>와 <strong>JavaScript 키</strong>를 발급받습니다.</li>
<li><strong>플랫폼 설정</strong>에서 Android와 iOS를 추가하고, 패키지명을 입력합니다.<hr>

</li>
</ol>
<h2 id="3-flutter-프로젝트-설정">3. Flutter 프로젝트 설정</h2>
<h3 id="31-플러그인-추가">3.1. 플러그인 추가</h3>
<p>Flutter에서 Kakao Map을 사용하려면 <code>flutter_inappwebview</code> 또는 WebView 패키지를 이용해야 합니다. <code>pubspec.yaml</code> 파일에 다음 의존성을 추가합니다.</p>
<pre><code class="language-yaml">dependencies:
  flutter:
    sdk: flutter
  flutter_inappwebview: ^5.7.2</code></pre>
<h3 id="32-android-설정">3.2. Android 설정</h3>
<ol>
<li><code>android/app/src/main/AndroidManifest.xml</code> 파일을 열고, 인터넷 권한을 추가합니다.</li>
</ol>
<pre><code class="language-xml">&lt;uses-permission android:name=&quot;android.permission.INTERNET&quot;/&gt;</code></pre>
<ol start="2">
<li>Kakao SDK 초기화를 위해 <code>AndroidManifest.xml</code>에 다음 내용을 추가합니다.</li>
</ol>
<pre><code class="language-xml">&lt;meta-data
    android:name=&quot;com.kakao.sdk.AppKey&quot;
    android:value=&quot;여기에_네이티브_앱_키_입력&quot;/&gt;</code></pre>
<h3 id="33-ios-설정">3.3. iOS 설정</h3>
<ol>
<li><code>ios/Runner/Info.plist</code> 파일을 열고, WebView 관련 설정을 추가합니다.</li>
</ol>
<pre><code class="language-xml">&lt;key&gt;NSAppTransportSecurity&lt;/key&gt;
&lt;dict&gt;
    &lt;key&gt;NSAllowsArbitraryLoads&lt;/key&gt;
    &lt;true/&gt;
&lt;/dict&gt;</code></pre>
<hr>

<h2 id="4-kakao-map-webview로-띄우기">4. Kakao Map WebView로 띄우기</h2>
<p>Kakao Map API는 기본적으로 웹 기반이므로 WebView를 활용하여 지도를 표시할 수 있습니다.</p>
<h3 id="41-webview를-이용한-지도-표시">4.1. WebView를 이용한 지도 표시</h3>
<p>Flutter에서 WebView를 이용하여 Kakao Map을 표시하는 예제 코드입니다.</p>
<pre><code class="language-dart">import &#39;package:flutter/material.dart&#39;;
import &#39;package:flutter_inappwebview/flutter_inappwebview.dart&#39;;

class KakaoMapScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(&quot;Kakao Map&quot;)),
      body: InAppWebView(
        initialUrlRequest: URLRequest(
          url: Uri.parse(&quot;https://map.kakao.com&quot;),
        ),
      ),
    );
  }
}</code></pre>
<hr>

<h2 id="5-javascript를-활용한-지도-제어">5. JavaScript를 활용한 지도 제어</h2>
<p>Kakao Map API를 활용하여 Flutter 내에서 JavaScript를 실행할 수도 있습니다. 예를 들어, 특정 위치에 마커를 추가하는 방법은 다음과 같습니다.</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//dapi.kakao.com/v2/maps/sdk.js?appkey=여기에_Javascript_키_입력&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div id=&quot;map&quot; style=&quot;width:100%;height:100vh;&quot;&gt;&lt;/div&gt;
    &lt;script&gt;
        var mapContainer = document.getElementById(&#39;map&#39;);
        var mapOption = {
            center: new kakao.maps.LatLng(37.5665, 126.9780),
            level: 3
        };
        var map = new kakao.maps.Map(mapContainer, mapOption);
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<hr>

<h2 id="6-결론">6. 결론</h2>
<p>Flutter에서 Kakao Map API를 사용하여 지도를 표시하고 제어하는 방법을 알아보았습니다. WebView와 JavaScript를 활용하면 다양한 지도 기능을 구현할 수 있습니다. 추후 Flutter 플러그인으로 개발된 Kakao Map 패키지가 나오면 보다 손쉽게 사용할 수 있을 것입니다.</p>
<h4 id=""></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter 입문 가이드]]></title>
            <link>https://velog.io/@dev_gun/Flutter-%EC%9E%85%EB%AC%B8-%EA%B0%80%EC%9D%B4%EB%93%9C</link>
            <guid>https://velog.io/@dev_gun/Flutter-%EC%9E%85%EB%AC%B8-%EA%B0%80%EC%9D%B4%EB%93%9C</guid>
            <pubDate>Wed, 05 Feb 2025 04:34:14 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_gun/post/56cbc702-b346-40db-83a8-a28ae9e00eba/image.png" alt=""></p>
<h2 id="1-flutter란">1. Flutter란?</h2>
<p>Flutter는 Google에서 개발한 오픈 소스 UI 프레임워크로, 하나의 코드베이스로 iOS와 Android뿐만 아니라 웹, 데스크톱까지 지원하는 크로스 플랫폼 개발 도구입니다. Dart 언어를 기반으로 하며, 빠른 개발 속도와 우수한 성능을 제공합니다.</p>
<hr>

<h2 id="2-flutter의-특징">2. Flutter의 특징</h2>
<ul>
<li><strong>크로스 플랫폼 개발</strong>: 하나의 코드로 여러 플랫폼에서 실행 가능</li>
<li><strong>Hot Reload</strong>: 코드 수정 후 즉시 반영되어 빠른 개발 가능</li>
<li><strong>우수한 성능</strong>: 네이티브 성능에 가까운 UI/UX 제공</li>
<li><strong>풍부한 위젯</strong>: Material Design, Cupertino 스타일 제공</li>
<li><strong>강력한 커뮤니티 지원</strong><hr>


</li>
</ul>
<h2 id="3-flutter-개발-환경-설정">3. Flutter 개발 환경 설정</h2>
<h3 id="31-flutter-sdk-설치">3.1. Flutter SDK 설치</h3>
<p>Flutter 공식 사이트(<a href="https://flutter.dev)%EC%97%90%EC%84%9C">https://flutter.dev)에서</a> OS에 맞는 SDK를 다운로드 후 설치합니다.</p>
<h3 id="32-환경-변수-설정-windows-기준">3.2. 환경 변수 설정 (Windows 기준)</h3>
<ol>
<li><code>flutter/bin</code> 경로를 시스템 환경 변수 <code>Path</code>에 추가합니다.</li>
<li>터미널에서 <code>flutter doctor</code> 명령어를 실행하여 환경 설정을 확인합니다.</li>
</ol>
<h3 id="33-android-studio-및-emulator-설정">3.3. Android Studio 및 Emulator 설정</h3>
<ul>
<li>Android Studio 설치 후 Flutter 플러그인 및 Dart 플러그인을 추가합니다.</li>
<li>Android Emulator 또는 실기기를 연결하여 실행할 수 있도록 설정합니다.<hr>


</li>
</ul>
<h2 id="4-첫-번째-flutter-프로젝트-생성">4. 첫 번째 Flutter 프로젝트 생성</h2>
<p>터미널에서 다음 명령어를 실행하여 새로운 Flutter 프로젝트를 생성합니다.</p>
<pre><code class="language-sh">flutter create my_first_app
cd my_first_app
flutter run</code></pre>
<p>이제 기본 Flutter 앱이 실행됩니다.</p>
<hr>


<h2 id="5-flutter의-기본-구조">5. Flutter의 기본 구조</h2>
<p>Flutter 프로젝트는 다음과 같은 구조를 가집니다.</p>
<pre><code>my_first_app/
 ├── lib/            # Dart 코드 (앱의 메인 로직)
 │   ├── main.dart   # 앱의 진입점
 ├── android/        # 안드로이드 네이티브 코드
 ├── ios/            # iOS 네이티브 코드
 ├── pubspec.yaml    # 패키지 및 의존성 관리 파일</code></pre><hr>


<h2 id="6-flutter의-기본-코드-이해하기">6. Flutter의 기본 코드 이해하기</h2>
<h3 id="61-maindart-분석">6.1. main.dart 분석</h3>
<p>Flutter 앱의 진입점은 <code>main.dart</code> 파일입니다.</p>
<pre><code class="language-dart">import &#39;package:flutter/material.dart&#39;;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text(&#39;Hello Flutter&#39;)),
        body: Center(child: Text(&#39;Welcome to Flutter!&#39;)),
      ),
    );
  }
}</code></pre>
<ul>
<li><code>runApp(MyApp())</code>: 앱 실행</li>
<li><code>MaterialApp</code>: 기본적인 앱 설정을 제공하는 위젯</li>
<li><code>Scaffold</code>: 기본 레이아웃 구조 제공</li>
<li><code>AppBar</code>: 상단 바</li>
<li><code>Center</code>: 중앙 정렬</li>
<li><code>Text</code>: 텍스트 표시<hr>


</li>
</ul>
<h2 id="7-flutter-기본-위젯">7. Flutter 기본 위젯</h2>
<p>Flutter는 UI를 구성하는 다양한 위젯을 제공합니다.</p>
<h3 id="71-레이아웃-위젯">7.1. 레이아웃 위젯</h3>
<ul>
<li><code>Column</code> : 세로 정렬</li>
<li><code>Row</code> : 가로 정렬</li>
<li><code>Container</code> : 박스 형태의 위젯</li>
<li><code>SizedBox</code> : 크기 지정</li>
</ul>
<h3 id="72-입력-위젯">7.2. 입력 위젯</h3>
<ul>
<li><code>TextField</code> : 텍스트 입력</li>
<li><code>ElevatedButton</code> : 버튼</li>
</ul>
<h3 id="73-상태-관리">7.3. 상태 관리</h3>
<ul>
<li><code>StatefulWidget</code> : 상태 변화가 필요한 위젯<pre><code class="language-dart">class CounterApp extends StatefulWidget {
@override
_CounterAppState createState() =&gt; _CounterAppState();
}
</code></pre>
</li>
</ul>
<p>class _CounterAppState extends State<CounterApp> {
  int _counter = 0;</p>
<p>  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }</p>
<p>  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(&#39;Counter App&#39;)),
      body: Center(child: Text(&#39;$_counter&#39;)),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        child: Icon(Icons.add),
      ),
    );
  }
}</p>
<pre><code>&lt;hr&gt;


## 8. 패키지 사용하기
Flutter에서는 `pub.dev`에서 다양한 패키지를 사용할 수 있습니다.
### 8.1. 패키지 추가 방법
1. `pubspec.yaml` 파일에 패키지를 추가합니다.
```yaml
dependencies:
  http: ^0.13.4</code></pre><ol start="2">
<li>터미널에서 <code>flutter pub get</code> 명령어를 실행합니다.</li>
<li>코드에서 패키지를 가져와 사용합니다.<pre><code class="language-dart">import &#39;package:http/http.dart&#39; as http;</code></pre>
<hr>


</li>
</ol>
<h2 id="9-flutter-디버깅-및-배포">9. Flutter 디버깅 및 배포</h2>
<h3 id="91-디버깅">9.1. 디버깅</h3>
<ul>
<li><code>flutter run</code> : 기본 실행</li>
<li><code>flutter analyze</code> : 코드 분석</li>
<li><code>flutter doctor</code> : 환경 확인</li>
</ul>
<h3 id="92-배포">9.2. 배포</h3>
<ul>
<li>Android: <code>flutter build apk</code></li>
<li>iOS: <code>flutter build ios</code><hr>


</li>
</ul>
<h2 id="10-마무리">10. 마무리</h2>
<p>이 가이드를 따라 하면 Flutter의 기본 개념을 익히고 간단한 앱을 만들 수 있습니다. 다음 단계로는 REST API 연동, Firebase 사용법, 상태 관리 방법(Riverpod, Provider 등)을 학습하면 더욱 강력한 앱을 개발할 수 있습니다.</p>
<p>Flutter로 멋진 앱을 만들어 보세요! 🚀</p>
]]></description>
        </item>
    </channel>
</rss>