<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>HyunHa.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 14 Jul 2022 11:40:48 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>HyunHa.log</title>
            <url>https://velog.velcdn.com/images/hyun_ha/profile/7e9e2fb3-a026-4b14-98c0-2138599ee95f/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. HyunHa.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hyun_ha" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Project] Happyever - 국내여행 플래너]]></title>
            <link>https://velog.io/@hyun_ha/Project-Happyever-%EA%B5%AD%EB%82%B4%EC%97%AC%ED%96%89-%ED%94%8C%EB%9E%98%EB%84%88</link>
            <guid>https://velog.io/@hyun_ha/Project-Happyever-%EA%B5%AD%EB%82%B4%EC%97%AC%ED%96%89-%ED%94%8C%EB%9E%98%EB%84%88</guid>
            <pubDate>Thu, 14 Jul 2022 11:40:48 GMT</pubDate>
            <description><![CDATA[<h1 id="✈️-happyever">✈️ Happyever</h1>
<blockquote>
<h4 id="mvc-패턴을-활용한-jsp-팀-프로젝트---국내여행-플래너">MVC 패턴을 활용한 JSP 팀 프로젝트 - 국내여행 플래너</h4>
</blockquote>
<blockquote>
<h3 id="🔗-source-link">🔗 Source Link</h3>
<p><a href="https://github.com/Hyun-HaHa/Happyever">https://github.com/Hyun-HaHa/Happyever</a></p>
</blockquote>
<br>

<h2 id="📆-개발-기간">📆 개발 기간</h2>
<ul>
<li>2022-05-17 ~ 2022-07-01</li>
</ul>
<br>

<h2 id="🙍♀️🙍♂️팀원-소개--역할">🙍‍♀️🙍‍♂️팀원 소개 &amp; 역할</h2>
<ul>
<li>총 7명 (멀티 포지션)<ul>
<li>정유섭 (조장) - 게시판, 일정 만들기
조현하 - 메인페이지, 로그인 &amp; 로그아웃, header
문기연 - 메인페이지, 비밀번호 찾기, footer
문승우 - 일정 만들기
김태경 - 일정 만들기
박종휘 - 마이페이지
유승재 - 회원가입 </li>
</ul>
</li>
</ul>
<br>

<h2 id="📖-프로젝트-소개">📖 프로젝트 소개</h2>
<blockquote>
<p>한국관광공사에서 제공하는 Tour3.0 API와 지도 API 등을 이용해 직관적인 UI로 누구나 쉽게 사용할 수 있는 여행 플래너 </p>
</blockquote>
<p>이제 코로나19로 인한 제한이 풀어지면서 여행을 마음껏 다닐 수 있는
희망이 다가오고 있습니다. 또한 지자체는 물론 정부 차원에서도 국내 여행을 다방면에서 지원하고 있습니다.
따라서 저희는 이러한 흐름에 편승하여 국내 여행 플래너를 만들어 보았습니다. </p>
<br>

<ul>
<li>국내 관광지 추천관광지 및 검색 기능</li>
<li>나만의 여행 플래너 작성 ( 원하는 도시와 일정 관리 가능 )</li>
<li>여행 리뷰 공유 게시판 (테마 별로 검색 기능)</li>
<li>회원가입, 로그인 (이메일로 비밀번호찾기 기능)</li>
<li>한국관광공사 API, Kakao Map API</li>
</ul>
<br>

<h2 id="⚙-개발-환경">⚙ 개발 환경</h2>
<ul>
<li>JAVA 1.8.0 (eclipse)</li>
<li>Apache Tomcat 8.5</li>
<li>MyBatis 3.5.10</li>
<li>ORACLE 11g DB</li>
<li>HTML5, CSS3, JavaScript, JSP, Jquery</li>
</ul>
<br>

<h2 id="🔨-설계">🔨 설계</h2>
<ul>
<li><p>화면 구현 사이트맵
<img src="https://velog.velcdn.com/images/hyun_ha/post/ae888b85-9e32-4ec2-a709-0d04eee7a200/image.PNG" alt=""></p>
</li>
<li><p>ERD
<img src="https://velog.velcdn.com/images/hyun_ha/post/9bf9f777-c7a5-4289-8509-887e4dc5cd7a/image.PNG" alt=""></p>
</li>
</ul>
<p><br> <br></p>
<h2 id="🔍-화면--기능-소개">🔍 화면 &amp; 기능 소개</h2>
<h3 id="메인페이지">메인페이지</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/6c50ae01-1079-4f76-8f29-777e24d3deef/image.PNG" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/342643df-38e7-4748-aac4-c36c315bdece/image.PNG" alt=""></p>
<ul>
<li>Bootstrap 프레임워크를 이용한 반응형 페이지 구현</li>
<li>3장의 배너 사진을 캐러셀(이미지 슬라이드)로 구현</li>
<li>키를 입력할 때마다 검색 결과가 동적으로 변하는 검색기능 구현</li>
<li>클릭한 여행지에 맞춰서 일정 만들기 페이지로 이동</li>
<li>비로그인 시 사용기능 제한</li>
</ul>
<p><br><br></p>
<h3 id="로그인--비밀번호-찾기">로그인 &amp; 비밀번호 찾기</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/390066e0-c3a9-4101-89b4-4e7df6cb50b0/image.PNG" alt=""></p>
<ul>
<li>정규표현식을 사용하여 이메일 형식 체크</li>
<li>사용자 정보가 틀렸을 때 alert으로 안내문구 출력</li>
</ul>
<ul>
<li>&lt;로그인&gt;<ul>
<li>header에 로그인 버튼 클릭 시 모달창 화면으로 구현</li>
<li>로그인 성공시 session에 회원정보 저장과 header에 사용자 이름이 표시된다.</li>
</ul>
</li>
<li>&lt;비밀번호 찾기&gt;<ul>
<li>이메일과 이름으로 회원가입 여부 판단 후, 이메일로 임시 비밀번호 전송</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h3 id="회원가입--마이페이지">회원가입 &amp; 마이페이지</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/584dd03a-5980-4df2-a131-a69bc65a3eac/image.PNG" alt=""></p>
<ul>
<li>&lt;회원가입&gt; <ul>
<li>정규 표현식을 사용하여 유효성 검사</li>
</ul>
</li>
<li>&lt;마이페이지&gt;<ul>
<li>회원 정보 수정, 탈퇴하기 기능</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h3 id="여행-일정-만들기">여행 일정 만들기</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/cec511b4-9ced-4c52-8482-56d62c0e788e/image.png" alt=""></p>
<ul>
<li>클릭한 지역명을 인자값으로 받아서 화면 이동</li>
<li>지도 API와 한국관광공사 API를 이용하여 사용자에게 추천 장소와 위치를 제공</li>
<li>API를 통해 JSON 형식으로 받아온 데이터를 MVC2패턴 방법으로 데이터 처리</li>
<li>여행 날짜를 입력 시 좌측영역에 DAY 생성</li>
<li>DAY마다 사용자가 원하는 여행지 추가 기능</li>
</ul>
<p><br><br></p>
<h3 id="여행-리뷰-공유-게시판">여행 리뷰 공유 게시판</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/0e0d63d0-7670-4b55-af81-ff461b10f2db/image.png" alt=""></p>
<ul>
<li>여행 키워드 클릭 시, 검색시 동적으로 변하는 검색기능 구현</li>
</ul>
<p><br><br></p>
<p>감사합니다. 😊  </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[WEB] JSP & Servlet / MVC 패턴]]></title>
            <link>https://velog.io/@hyun_ha/WEB-JSP-Servlet-MVC-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@hyun_ha/WEB-JSP-Servlet-MVC-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Sun, 03 Jul 2022 15:19:13 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="📝jsp--servlet">📝JSP &amp; Servlet</h2>
</blockquote>
<ul>
<li>동적 웹 페이지를 생성하는 공통점이 있다.</li>
<li>역할의 차이점이 있다.</li>
</ul>
<p><br><br></p>
<h2 id="서블릿servlet">서블릿(Servlet)</h2>
<ul>
<li>클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의
구현 규칙을 지킨 자바 웹 프로그래밍 기술이다.</li>
<li>JAVA 코드 안에 HTML태그가 삽입된 자바 언어이다.</li>
</ul>
<br>

<h2 id="jsp">JSP</h2>
<ul>
<li><p>서블릿(Servlet)의 단점을 보완한 서블릿 기반의 스크립트 기술이다.</p>
</li>
<li><p>HTML 코드에 JAVA코드를 넣어 동적 웹페이지를 생성하는 
웹어플리케이션 도구이다.</p>
</li>
<li><p>JSP가 실행되면 자바 서블릿(Servlet)으로 변환되면, 
웹 어플리케이션 서버에서 동작되면서 필요한 기능을 수행하고
그렇게 생성된 데이터를 웹페이지와 함께 클라이언트로 응답한다.</p>
</li>
</ul>
<pre><code class="language-java">스크립트 태그

&lt;%!     %&gt;        : 자바 변수나 메소드를 정의하는데 사용되는 태그

&lt;%     %&gt;        : 자바 변수 선언 및 자바 로직 코드를 작성하는데 사용되는 태그

&lt;%=  %&gt;        : 변수, 계산식, 메소드 호출 결과를 나타내는 태그

&lt;%@  %&gt;        : 페이지 속성 지정

&lt;%-- --%&gt;    : 주석처리</code></pre>
<p><br><br></p>
<h2 id="📙-jsp와-servlet의-정리">📙 JSP와 Servlet의 정리</h2>
<table>
<thead>
<tr>
<th align="center"></th>
<th align="center">JSP</th>
<th align="center">Servlet</th>
</tr>
</thead>
<tbody><tr>
<td align="center">형태</td>
<td align="center">JAVA in HTML</td>
<td align="center">HTML in JAVA</td>
</tr>
<tr>
<td align="center">형태 예시</td>
<td align="center">&lt;% for(int i = 0; i &lt;= 3; i++){ %&gt;</td>
<td align="center">PrintWriter out = response.getWriter();<br>out.println(&quot;&lt;HTML&gt;&quot;);</td>
</tr>
<tr>
<td align="center">특징</td>
<td align="center">presentation(View)에 좋다.</td>
<td align="center">data processing(Controller)에 좋다.</td>
</tr>
</tbody></table>
<br>

<ul>
<li>Servlet : 코드가 수정되면 다시 컴파일하고 배포해야 한다.</li>
<li>JSP :  코드가 수정되도 재배포 할 필요가 없지만, 다양한 코드가 JSP에 
노출되어 있기 때문에 유지보수가 힘들다.</li>
</ul>
<p><br><br></p>
<hr>
<br>

<blockquote>
<h2 id="📝-mvc-패턴">📝 MVC 패턴</h2>
</blockquote>
<ul>
<li>JSP와 Servlet을 모두 이용하는 모델이다.</li>
<li>유지보수에 용이하다.</li>
</ul>
<br>

<p><img src="https://velog.velcdn.com/images/hyun_ha/post/47d95a3a-d90b-4c25-b325-a2a3f50e3a26/image.PNG" alt=""></p>
<h3 id="m--model">M : Model</h3>
<ul>
<li>사용자가 원하는 데이터나 정보를 제공한다.</li>
<li>애플리케이션의 정보, 데이터를 나타낸다. 이러한 Data, 
정보들의 가공을 책임지는 역할을 한다.</li>
<li>Java Beans로 DTO와 DAO를 통해 DataBase에 접근한다.</li>
</ul>
<br>

<h3 id="v--view">V : View</h3>
<ul>
<li>데이터 및 객체의 입력, 즉 보여주는 출력을 담당한다. </li>
<li>데이터를 기반으로 사용자들이 볼 수 있는 화면이다.</li>
<li>HTML이 중심이 되는 JSP를 사용한다.</li>
</ul>
<br>

<h3 id="c--controller">C : Controller</h3>
<ul>
<li>사용자의 요청을 처리하고, 그 요청에 따른 전체적인 흐름을 제어한다.</li>
<li>데이터와 사용자의 인터페이스 요소들을 잇는 다리역할을 한다.</li>
<li>Java 코드가 중심이 되는 Servlet을 사용한다.</li>
</ul>
<p><br><br></p>
<h2 id="dto--dao">DTO &amp; DAO</h2>
<br>

<h3 id="dtodata-transfer-object--vo-value-object--bean">DTO(Data Transfer Object) / Vo (Value Object) / Bean</h3>
<ul>
<li>양쪽으로 전송되어 오고가는 데이터들을 담은 객체, jsp에서는 Bean이라고 부른다.</li>
<li>여러 데이터들을 포장해서 만든 데이터 포장객체</li>
<li>사용자가 입력한 값을 객체 형태로 받을 수 있게 클래스 구성<ul>
<li>폼에서 입력된 데이터들은 하나의 DTO 객체로 변환 가능하다.</li>
</ul>
</li>
<li>하나의 데이터베이스 레코드를 저장하여 레코드와 같은 구조를 가짐<ul>
<li>레코드가 50개면 DTO객체도 50개,
한 개의 레코드는 빈즈 클래스 객체 하나로 매핑</li>
</ul>
</li>
<li>데이터가 포함된 객체를 한 시스템에서 다른 시스템으로 전달하는
작업을 처리하는 객체  </li>
</ul>
<br>

<h3 id="daodata-access-object">DAO(Data Access Object)</h3>
<ul>
<li>DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 
즉 데이터 접근을 목적으로 하는 객체</li>
<li>데이터에 접근, 데이터를 관리하기 위한 객체 데이터들을 관리(CRUD)하는
여러 메소드들이 정의되어 있다.<ul>
<li>커넥션 같은 것을 하나만 두고 여러 사용자가 
DAO의 인터페이스를 사용하여 필요한 자료에 접근하도록 하는 것</li>
</ul>
</li>
<li>SQL을 직접 실행하는 기능을 가짐<ul>
<li>Insert, Delete, Update, Select 등 레코드 처리를 주 목적으로 한다.</li>
<li>데이터베이스 서버로부터 레코드를 select한 후, 
DTO 객체로 변경해 가져온다.</li>
<li>DTO 객체를 데이터베이스 서버에 저장한다.</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h2 id="mvc1--mvc2">MVC1 &amp; MVC2</h2>
<br>

<h3 id="mvc1-패턴">MVC1 패턴</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/26f5573f-007c-4ee1-ab6c-26e0cfc4859e/image.PNG" alt=""></p>
<ul>
<li><p>view와 Controller를 JSP가 담당하는 형태를 가진다.
즉, JSP 하나로 유저의 요청을 받고 응답을 처리하므로 구현 난이도는 쉽다.</p>
</li>
<li><p>단순한 프로젝트에는 괜찮겠지만, 내용이 복잡하고 거대해질수록 
이 패턴은 힘을 잃는다. 
즉 유지보수에 있어서 문제가 발생한다.</p>
</li>
</ul>
<br>

<h3 id="mvc2-패턴">MVC2 패턴</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/3aab5afd-f64c-4c84-9029-93ede7d479bc/image.PNG" alt=""></p>
<ul>
<li>MVC1 패턴과는 다르게 Controller, View가 분리되어 있다.
그러므로 개발자는 M, V, C 중에서 수정해야 할 부분이 있다면,
그것만 꺼내어 수정하면 된다.</li>
<li>유지보수에 있어서 큰 이점을 가진다.</li>
</ul>
<p><br><br><br></p>
<hr>
<p><br><br></p>
<pre><code>참고 사이트 : https://bangu4.tistory.com/35</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[HTML] HTML 기본 태그]]></title>
            <link>https://velog.io/@hyun_ha/HTML-HTML-%EA%B8%B0%EB%B3%B8-%ED%83%9C%EA%B7%B8</link>
            <guid>https://velog.io/@hyun_ha/HTML-HTML-%EA%B8%B0%EB%B3%B8-%ED%83%9C%EA%B7%B8</guid>
            <pubDate>Sun, 22 May 2022 08:27:23 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="📝-html이란">📝 HTML이란?</h2>
<p> HT - HyperText        : 문서와 문서가 링크로 연결되어 있다.
   M - Markup        : 태그로 이루어져 있다.
   L - Language        : 언어
   -&gt; 즉 웹사이트의 틀을 만들어 주는 마크업 언어이다.
   마크업 언어는 마크업 태그들로 이루어져 있다.</p>
</blockquote>
<p>HTML 태그는 다음과 같이 표현한다.</p>
<pre><code class="language-html">&lt;태그 이름&gt;내용&lt;/태그 이름&gt;</code></pre>
<p><br><br></p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/fa164b10-05f8-48b1-b8bd-136993f4850c/image.PNG" alt=""></p>
<h2 id="기본-태그">기본 태그</h2>
<h3 id="📌doctype-html-선언하기📌">📌<code>&lt;!DOCTYPE html&gt;</code> 선언하기📌</h3>
<p>html 태그를 사용하기 <span style="color:red">전</span>에 선언한다.
웹 브라우저에게 HTML 버전을 알려주는 역할을 한다.</p>
<h4 id="1-html-html-태그">1. <code>&lt;html&gt;</code> <code>&lt;/html&gt;</code> 태그</h4>
<p><code>&lt;html&gt;</code>과 <code>&lt;/html&gt;</code> 사이에 html 문서를 작성한다.</p>
<h4 id="2-head-head-태그">2. <code>&lt;head&gt;</code> <code>&lt;/head&gt;</code> 태그</h4>
<p><code>&lt;head&gt;</code>과 <code>&lt;/head&gt;</code> 사이에 문서 제목, 스타일, 스크립트 등등
문서에 대한 정보를 제공한다.</p>
<h4 id="3-meta-charsetutf-8">3. <code>&lt;meta charset=&quot;UTF-8&quot;&gt;</code></h4>
<p>인코딩 설정
<code>&lt;meta charset=&quot;인코딩 형식&quot;&gt;</code>로 시작하며 charset속성의 값으로
인코딩 형식을 지정해서 웹 페이지에 표시되는 문자의 인코딩을 설정한다.</p>
<h4 id="4-title-title-태그">4. <code>&lt;title&gt;</code> <code>&lt;/title&gt;</code> 태그</h4>
<p><code>&lt;title&gt;</code>과 <code>&lt;/title&gt;</code> 사이에는 문서의 제목을 쓴다.</p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/7222e65c-bde7-49d1-b99d-eb2dab2c43d0/image.PNG" alt=""></p>
<p>브라우저의 탭이나 방문 기록에 나와 있는 바로 그 제목이 이 곳에 들어간다.</p>
<h4 id="5-body-body-태그">5. <code>&lt;body&gt;</code> <code>&lt;/body&gt;</code> 태그</h4>
<p><code>&lt;body&gt;</code>과 <code>&lt;/body&gt;</code> 사이에는 화면에 표시되는 문서의 내용을 쓴다.</p>
<p><br><br></p>
<h2 id="html-태그">HTML 태그</h2>
<h3 id="1-시멘틱semantic-태그">1. 시멘틱(semantic) 태그</h3>
<ul>
<li><p>의미론적 태그로 문서의 정보를 보다 잘 표현하기 위해서는 
의미에 맞는 태그를 잘 사용해야 한다.</p>
</li>
<li><p>사용이유</p>
<ul>
<li><ol>
<li>SEO(Search Engine Optimization)</li>
</ol>
</li>
<li><blockquote>
<p>검색을 최적화하기 위해서 제목, 부제목, ... 시멘틱 태그를 잘 활용하면
특정 키워드로 검색했을때 내가 만든 웹사이트가 검색창에 노출될 수 있다.</p>
</blockquote>
</li>
<li><ol start="2">
<li>유지보수</li>
</ol>
</li>
<li><blockquote>
<p>단순히, div 태그로만 모든 구조를 짜는 것보다 더 한눈에 알아 볼 수 
있기 때문에, 유지보수에 더 편해진다.</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br>

<p>웹 사이트 구조 예시)</p>
<ol>
<li>헤더 영역</li>
</ol>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/37aeb1f8-a5fa-4ef7-843b-619cde8aeccc/image.PNG" alt=""></p>
<ol start="2">
<li>본문 영역</li>
</ol>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/e159ca84-43b7-4cbb-81a0-ba5c46d34ab5/image.PNG" alt=""></p>
<ol start="3">
<li>푸터 영역</li>
</ol>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/2670a517-a3b0-49f2-b1fd-b8b2b74141eb/image.PNG" alt=""></p>
<br> 

<h4 id="주요-태그">주요 태그</h4>
<table>
<thead>
<tr>
<th align="center">태그</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><code>&lt;header&gt;</code></td>
<td align="center">화면의 상단에 위치하는 사이트나 문서의 전체적인 정보를 정의</td>
</tr>
<tr>
<td align="center"><code>&lt;nav&gt;</code></td>
<td align="center">사이트의 내비게이션(메뉴) 항목을 정의</td>
</tr>
<tr>
<td align="center"><code>&lt;article&gt;</code></td>
<td align="center">문서의 내용을 표시하는 태그로, 독립적인 콘텐츠를 표시</td>
</tr>
<tr>
<td align="center"><code>&lt;main&gt;</code></td>
<td align="center">문서에서 가장 중심이 되는 콘텐츠를 표시<br>웹 문서마다 <span style="color:red">한 번만</span> 사용할 수 잇다.</td>
</tr>
<tr>
<td align="center"><code>&lt;aside&gt;</code></td>
<td align="center">광고와 같이 페이지 내용과는 관계가 적은 사이드바 콘텐츠를 표시</td>
</tr>
<tr>
<td align="center"><code>&lt;details&gt;</code></td>
<td align="center">기본적으로 표시되지 않는 정보들을 정의</td>
</tr>
<tr>
<td align="center"><code>&lt;figure&gt;</code></td>
<td align="center">삽화나 다이어그램과 같은 부가적인 요소를 정의</td>
</tr>
<tr>
<td align="center"><code>&lt;mark&gt;</code></td>
<td align="center">참조나 하이라이트 표시를 필요로하는 문자를 정의</td>
</tr>
<tr>
<td align="center"><code>&lt;footer&gt;</code></td>
<td align="center">화면의 하단에 위치하는 사이트나 문서의 전체적인 정보를 정의</td>
</tr>
<tr>
<td align="center"><code>&lt;section&gt;</code></td>
<td align="center">문서의 내용을 표시하는 태그로, 주로 문서의 영역적인 의미로 사용</td>
</tr>
</tbody></table>
<br>

<h3 id="2-div-태그">2. <code>&lt;div&gt;</code> 태그</h3>
<ul>
<li>html 문서에서 영역 또는 구역을 정의한다.</li>
<li>서로 중첩되어 사용할 수 있으며, 다른 태그를 포함할 수 있다.</li>
<li>고유한 id값을 부여하여 처리한다.</li>
</ul>
<br>

<h3 id="3-head-태그-안에-쓰는-태그">3. <code>&lt;head&gt;</code> 태그 안에 쓰는 태그</h3>
<table>
<thead>
<tr>
<th align="center">태그</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><code>&lt;title&gt;</code> <code>&lt;/title&gt;</code></td>
<td align="center">html 문서 제목</td>
</tr>
<tr>
<td align="center"><code>&lt;style&gt;</code> <code>&lt;/style&gt;</code></td>
<td align="center"><code>&lt;style&gt;</code>과 <code>&lt;/style&gt;</code> 태그 사이에 스타일시트 코드를 기술한다.<br>웹 페이지를 위한 스타일 정보를 정의하며<br> 웹 브라우저에서 HTML 태그를 표현하는 방법을 기술한다.</td>
</tr>
<tr>
<td align="center"><code>&lt;meta&gt;</code></td>
<td align="center">html 문서에 대한 메타데이터(데이터를 설명하는 데이터)를 정의하며<br>주로 페이지 설명, 키워드, 인코딩, 뷰포트, 검색 로봇 차단 등을 설정할 때 사용한다.</td>
</tr>
<tr>
<td align="center"><code>&lt;link&gt;</code></td>
<td align="center">웹 페이지와 외부 자원간의 관계를 정의하며,<br>주로 CSS파일 링크에 사용한다.</td>
</tr>
<tr>
<td align="center"><code>&lt;script&gt;</code> <code>&lt;/script&gt;</code></td>
<td align="center"><code>&lt;script&gt;</code>와 <code>&lt;/script&gt;</code> 태그 사이에 자바스크립트 코드를 기술한다.</td>
</tr>
<tr>
<td align="center"><code>&lt;base&gt;</code></td>
<td align="center">웹 페이지상의 모든 링크를 위한 기본 주소 또는 기본 대상을 지정한다.</td>
</tr>
</tbody></table>
<br>

<h3 id="4-텍스트text-태그">4. 텍스트(text) 태그</h3>
<h4 id="1-h1--h6-태그">1. <code>&lt;h1&gt;</code> ~ <code>&lt;h6&gt;</code> 태그</h4>
<ul>
<li>머리말(제목 또는 주제) 태그</li>
<li>글자 크기 순서<ul>
<li><code>&lt;h1&gt;</code> &gt; <code>&lt;h2&gt;</code> &gt; <code>&lt;h3&gt;</code> &gt;  <code>&lt;h4&gt;</code> &gt; <code>&lt;h5&gt;</code> &gt; <code>&lt;h5&gt;</code> &gt; <code>&lt;h6&gt;</code></li>
</ul>
</li>
</ul>
<h4 id="2--p-태그">2.  <code>&lt;p&gt;</code> 태그</h4>
<ul>
<li>문단과 문단 사이를 구분할 때 사용한다.</li>
</ul>
<h4 id="3-b--strong-태그">3. <code>&lt;b&gt;</code> &amp; <code>&lt;strong&gt;</code> 태그</h4>
<ul>
<li>글꼴을 진하게 표시한다.</li>
</ul>
<h4 id="4-i--em">4. <code>&lt;I&gt;</code> &amp; <code>&lt;em&gt;</code></h4>
<ul>
<li>글꼴을 기울임으로 표시한다.</li>
</ul>
<h4 id="5-br-태그">5. <code>&lt;br&gt;</code> 태그</h4>
<ul>
<li>줄 바꿈 태그</li>
</ul>
<h4 id="6-blockquote-태그">6. <code>&lt;blockquote&gt;</code> 태그</h4>
<ul>
<li>인용문을 삽입할 때 사용한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/ab3d60e8-f959-47fc-9fdd-3d5f2a2d22b9/image.PNG" alt=""></p>
<pre><code class="language-html">&lt;body&gt;
    &lt;h1&gt;h1&lt;/h1&gt;
    &lt;h2&gt;h2&lt;/h2&gt;
    &lt;h3&gt;h3&lt;/h3&gt;
    &lt;h4&gt;h4&lt;/h4&gt;
    &lt;h5&gt;h5&lt;/h5&gt;
    &lt;h6&gt;h6&lt;/h6&gt;

    &lt;p&gt;
        Hello world!
    &lt;/p&gt;

    &lt;p&gt;
        b와 strong태그는 &lt;b&gt;글꼴&lt;/b&gt;을 &lt;strong&gt;진하게&lt;/strong&gt;표시한다.&lt;br&gt;
        I와 em 태그는 &lt;i&gt;글꼴&lt;/i&gt;을 &lt;em&gt;기울임&lt;/em&gt;으로 표시한다.
    &lt;/p&gt;
        &lt;blockquote&gt;blockquote태그는 인용문을 삽입할 때 사용한다.&lt;/blockquote&gt;
&lt;/body&gt;</code></pre>
<br>

<h3 id="5-목록-태그">5. 목록 태그</h3>
<ul>
<li><code>&lt;ul&gt;</code>태그    : 순서가 없는 목록 태그</li>
<li><code>&lt;ol&gt;</code>태그    : 순서가 있는 목록 태그</li>
<li><code>&lt;li&gt;</code>태그    : 목록의 내용인 아이템</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/46e17430-a170-4637-9467-c3f647772c9c/image.PNG" alt=""></p>
<pre><code class="language-html">&lt;body&gt;
    &lt;h2&gt;순서가 없는 목록 태그&lt;/h2&gt;
    &lt;ul&gt;
        &lt;li&gt;HTML&lt;/li&gt;
        &lt;li&gt;CSS&lt;/li&gt;
        &lt;li&gt;JavaScript&lt;/li&gt;
    &lt;/ul&gt;

    &lt;h2&gt;순서가 있는 목록 태그&lt;/h2&gt;
    &lt;ol&gt;
        &lt;li&gt;HTML&lt;/li&gt;
        &lt;li&gt;CSS&lt;/li&gt;
        &lt;li&gt;JavaScript&lt;/li&gt;
    &lt;/ol&gt;
&lt;/body&gt;</code></pre>
<br>

<h3 id="6-a-태그">6. <code>&lt;a&gt;</code> 태그</h3>
<ul>
<li><p>하이퍼링크(또는 링크)를 사용해서 이동할 페이지 또는 이동할 위치를
지정할 때 사용한다.</p>
</li>
<li><p>필수 속성    : href=&quot;이동할 페이지 또는 위치&quot;</p>
</li>
</ul>
<pre><code class="language-html">&lt;a href=&quot;이동할 페이지 또는 위치&quot;&gt;내용&lt;/a&gt;</code></pre>
<ul>
<li>새 창에서 페이지를 열리게 할려면 
target속성과 _blank 속성값을 사용하면 된다.<pre><code class="language-html">&lt;a href=&quot;이동할 페이지 또는 위치&quot; target=&quot;_blank&quot;&gt;내용&lt;/a&gt;</code></pre>
</li>
</ul>
<br>

<h3 id="7-테이블-태그">7. 테이블 태그</h3>
<p><code>&lt;table&gt;</code> 태그는 표를 작성하는 태그이다.</p>
<ul>
<li><code>&lt;table&gt;</code>    : 표 영역만 설정하는 태그</li>
<li><code>&lt;thead&gt;</code> : 테이블의 head 부분을 의미</li>
<li><code>&lt;tbody&gt;</code>    : 테이블의 본문을 의미</li>
<li><code>&lt;tfoot&gt;</code>    : 테이블의 가장 아래쪽을 의미<ul>
<li>thead, tbody, tfoot 각각의 위치가 바껴도 head, body, foot에 맞춰 테이블이 그려진다.<br></li>
</ul>
</li>
<li><code>&lt;th&gt;</code>        : 테이블의 제목을 정의하는 태그</li>
<li><code>&lt;tr&gt;</code>    : 표의 행을 정의하는 태그</li>
<li><code>&lt;td&gt;</code>    : 표의 열을 정의하는 태그<br></li>
<li><code>&lt;rowspan&gt;</code>    : 행을 합치는 태그<ul>
<li>테이블의 셀을 세로로 합친다.</li>
</ul>
</li>
<li><code>&lt;colspan&gt;</code>    : 열을 합치는 태그<ul>
<li>테이블의 셀을 가로로 합친다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/e3493324-393a-4b12-bc40-0f01a4a7fc1c/image.PNG" alt=""></p>
<pre><code class="language-html">&lt;body&gt;
    &lt;h2&gt;회원 정보 &amp; 회비&lt;/h2&gt;

    &lt;table border=&quot;2&quot;&gt;    &lt;!-- border 속성은 테이블의 테두리선의 두께를 나타낸다. --&gt;
        &lt;thead&gt;
            &lt;tr&gt;
                &lt;th&gt;이름&lt;/th&gt;
                &lt;th&gt;성별&lt;/th&gt;
                &lt;th&gt;주소&lt;/th&gt;
                &lt;th&gt;나이&lt;/th&gt;
                &lt;th&gt;회비&lt;/th&gt;
            &lt;/tr&gt;
        &lt;/thead&gt;

        &lt;tbody&gt;
            &lt;tr&gt;
                &lt;td&gt;철수&lt;/td&gt;
                &lt;td&gt;남&lt;/td&gt;
                &lt;td rowspan=&quot;3&quot;&gt;역삼동&lt;/td&gt;
                &lt;td&gt;23&lt;/td&gt;
                &lt;td&gt;1000원&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;영희&lt;/td&gt;
                &lt;td&gt;여&lt;/td&gt;
                &lt;td&gt;24&lt;/td&gt;
                &lt;td&gt;2000원&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;미영&lt;/td&gt;
                &lt;td&gt;남&lt;/td&gt;
                &lt;td&gt;25&lt;/td&gt;
                &lt;td&gt;3000원&lt;/td&gt;
            &lt;/tr&gt;
        &lt;/tbody&gt;    

        &lt;tfoot&gt;    
            &lt;tr&gt;
                &lt;td colspan=&quot;4&quot;&gt;합계&lt;/td&gt;
                &lt;td&gt;6000원&lt;/td&gt;
            &lt;/tr&gt;
        &lt;/tfoot&gt;
    &lt;/table&gt;
&lt;/body&gt;</code></pre>
<br>

<h3 id="8-이미지-태그">8. 이미지 태그</h3>
<p><code>&lt;img&gt;</code>태그는 웹 페이지에 이미지를 삽입할 때 사용한다.</p>
<ul>
<li><code>&lt;img&gt;</code>태그의 주요 속성</li>
</ul>
<table>
<thead>
<tr>
<th align="center">속성</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">src</td>
<td align="center">표시할 이미지 파일의 경로를 포함한 이름을 입력한다.<br><span style="color:red">필수 속성</span></td>
</tr>
<tr>
<td align="center">alt</td>
<td align="center">이미지가 표시되지 못할 경우 대신 표시할 메시지 지정</td>
</tr>
<tr>
<td align="center">title</td>
<td align="center">이미지 위에 마우스 커서가 위치했을 때 보여지는 메시지 지정</td>
</tr>
<tr>
<td align="center">width</td>
<td align="center">이미지의 가로길이</td>
</tr>
<tr>
<td align="center">height</td>
<td align="center">이미지의 세로길이</td>
</tr>
</tbody></table>
<pre><code class="language-html">&lt;body&gt;
    &lt;img src=&quot;이미지 파일 경로&quot; alt=&quot;대체용 메시지&quot;
         title=&quot;이미지 메시지&quot; width=&quot;가로길이&quot; height=&quot;세로길이&quot;&gt;
&lt;/body&gt; </code></pre>
<br>

<h3 id="9-form-태그">9. <code>&lt;form&gt;</code> 태그</h3>
<ul>
<li><code>&lt;form&gt;</code> 태그는 폼을 만드는 가장 기본적인 태그로, 서버 전송 태그이다.</li>
<li>모든 폼 태그는 <code>&lt;form&gt;</code>과 <code>&lt;/form&gt;</code> 사이에 위치한다.</li>
</ul>
<h4 id="form태그의-속성"><code>&lt;form&gt;</code>태그의 속성</h4>
<table>
<thead>
<tr>
<th align="center">속성</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">accept-charset</td>
<td align="center">폼의 캐릭터 셋을 지정한다.<br>ex) <code>&lt;form accept-charset=&quot;utf-8&quot;&gt;</code></td>
</tr>
<tr>
<td align="center">action</td>
<td align="center">폼에 입력된 값을 처리(제출)할 페이지의 url을 지정한다.</td>
</tr>
<tr>
<td align="center">autocomplete</td>
<td align="center">폼에 입력 값을 자동 완성할지를 지정한다.</td>
</tr>
<tr>
<td align="center">enctype</td>
<td align="center">폼에 입력된 값을 처리 페이지로 넘길 때 인코딩 방식을 지정한다.</td>
</tr>
<tr>
<td align="center">method</td>
<td align="center">폼에 입력된 값을 처리 페이지로 넘길 때 HTTP 방식을 지정한다.</td>
</tr>
<tr>
<td align="center">name</td>
<td align="center">폼의 이름을 지정한다.</td>
</tr>
<tr>
<td align="center">novaildate</td>
<td align="center">폼에 입력된 값을 처리 페이지로 넘길 때 입증된 데이터가 아니라는 것을 지정한다.</td>
</tr>
<tr>
<td align="center">target</td>
<td align="center">action속성에 있는 처리 페이지의 타깃을 지정한다.<br>(현재 창에 표시할지, 새 창에 표시할지 등을 지정)</td>
</tr>
</tbody></table>
<p><br><br></p>
<h4 id="legend--fieldset-태그"><code>&lt;legend&gt;</code> &amp; <code>&lt;fieldset&gt;</code> 태그</h4>
<ul>
<li><code>&lt;fieldset&gt;</code>     : 웹 폼 태그를 그룹화한다.</li>
<li><code>&lt;legend&gt;</code>      : <code>&lt;fieldset&gt;</code> 태그로 묶인 그룹의 제목을 구성한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/7adf99e2-b216-47d6-a73e-adf534fb14b4/image.PNG" alt=""></p>
<pre><code class="language-html">&lt;body&gt;
    &lt;h2&gt;폼&lt;/h2&gt;
    &lt;form action=&quot;http://localhost/regist.jsp&quot;&gt;
        &lt;fieldset&gt;
            &lt;legend&gt;성별&lt;/legend&gt;
                남자 &lt;br&gt;
                여자 
        &lt;/fieldset&gt;
    &lt;/form&gt;
&lt;/body&gt;</code></pre>
<br>

<h4 id="label-태그"><code>&lt;label&gt;</code> 태그</h4>
<ul>
<li>입력 요소 앞이나 뒤에서 표시되는 제목을 구성</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/ab053d40-d5fd-4241-b412-8fd44969ca7e/image.PNG" alt=""></p>
<pre><code class="language-html">&lt;body&gt;
    &lt;h2&gt;폼&lt;/h2&gt;
    &lt;form action=&quot;http://localhost/regist.jsp&quot;&gt;
        &lt;fieldset&gt;
            &lt;legend&gt;성별&lt;/legend&gt;
            &lt;label&gt;
                남자 &lt;input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;남자&quot; checked&gt; 
            &lt;/label&gt;
            &lt;label&gt;    
                여자 &lt;input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;여자&quot;&gt; 
            &lt;/label&gt;    
        &lt;/fieldset&gt;
    &lt;/form&gt;
&lt;/body&gt;</code></pre>
<p><br><br></p>
<h3 id="10-form태그의-종류----input-태그">10. <code>&lt;form&gt;</code>태그의 종류 -  input 태그</h3>
<p><code>&lt;input&gt;</code> 태그는 입력형식을 구현한 태그로 웹 폼을 지원하기 위한
다양한 속성이 있다.</p>
<ul>
<li><code>&lt;input&gt;</code> 태그의 속성 </li>
</ul>
<table>
<thead>
<tr>
<th align="center">속성</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">type</td>
<td align="center">텍스트, 패스워트, 체크 박스 등의 웹 폼 태그를 만들 때 사용</td>
</tr>
<tr>
<td align="center">accept</td>
<td align="center">파일 선택기인 <code>&lt;input type=&quot;file&quot;&gt;</code>에서만 사용하는 속성으로,<br>서버가 받아들일 수 있는 파일의 타입을 지정</td>
</tr>
<tr>
<td align="center">autocomplete</td>
<td align="center">웹 폼태그에서 자동 완성 기능을 사용할 수 있도록 지정</td>
</tr>
<tr>
<td align="center">autofocus</td>
<td align="center">웹 페이지가 화면에 표시될 때 자동으로 특정 웹 폼 태그에 포커스를 지정</td>
</tr>
<tr>
<td align="center">checked</td>
<td align="center">체크박스 또는 라디오 버튼에서 선택 항목을 미리 지정할 때 사용</td>
</tr>
<tr>
<td align="center">disabled</td>
<td align="center">웹 폼 태그를 사용할 수 없도록 지정</td>
</tr>
<tr>
<td align="center">list</td>
<td align="center">데이터 리스트에서 선택한 항목을 표시</td>
</tr>
<tr>
<td align="center">max</td>
<td align="center">숫자 입력이나 날짜 입력 등에서 최댓값을 지정</td>
</tr>
<tr>
<td align="center">maxlength</td>
<td align="center">입력할 문자의 수를 제한하기 위해서 사용</td>
</tr>
<tr>
<td align="center">min</td>
<td align="center">숫자 입력이나 날짜 입력 등에서 최솟값을 지정</td>
</tr>
<tr>
<td align="center">multiple</td>
<td align="center">1개 이상의 값을 입력 받을 때 사용 (주로 여러 파일을 선택할 때 사용)</td>
</tr>
<tr>
<td align="center">name</td>
<td align="center">웹 프로그램과 연계되는 속성으로  한 페이지 안에서 고유한 값을 명시</td>
</tr>
<tr>
<td align="center">pattern</td>
<td align="center">정규표현식을 지정</td>
</tr>
<tr>
<td align="center">placeholder</td>
<td align="center">직접 입력하는 웹 폼 태그에 입력 힌트 값을 지정</td>
</tr>
<tr>
<td align="center">required</td>
<td align="center">반드시 입력해야 하는 필수 항목을 지정</td>
</tr>
<tr>
<td align="center">size</td>
<td align="center">텍스트 필드 등의 너비 지정</td>
</tr>
<tr>
<td align="center">step</td>
<td align="center">입력되는 숫자 간격을 지정</td>
</tr>
<tr>
<td align="center">value</td>
<td align="center">웹 폼 태그의 기본 값을 지정</td>
</tr>
</tbody></table>
<p><br><br></p>
<h4 id="type의-속성-값">type의 속성 값</h4>
<ol>
<li>text, password<ul>
<li>텍스트와 비밀번호 입력 양식을 생성한다.</li>
</ul>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/be508d12-42b0-432d-a9d5-f1b1c0b488d1/image.PNG" alt=""></p>
<pre><code class="language-html">&lt;body&gt;
    &lt;p&gt;아이디 : &lt;input type=&quot;text&quot; name=&quot;id&quot;&gt;&lt;/p&gt;
    &lt;p&gt;패스워드 : &lt;input type=&quot;password&quot; name=&quot;pwd&quot;&gt;&lt;/p&gt;
&lt;/body&gt;</code></pre>
<br>

<ol start="2">
<li><p>checkbox &amp; radio</p>
<ul>
<li><p>checkbox는 체크박스를 만들 때 사용한다.</p>
</li>
<li><blockquote>
<p>여러 항목 중 복수로 선택 가능한다.</p>
</blockquote>
</li>
<li><p>radio는 라디오 버튼을 만들 때 사용한다.</p>
</li>
<li><blockquote>
<p>여러 항목 중 한 가지만 선택 가능</p>
</blockquote>
</li>
</ul>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/60600ae6-7207-4c2b-a169-0c94d8a59441/image.PNG" alt=""></p>
<pre><code class="language-html">&lt;body&gt;
    &lt;p&gt;
        &lt;h1&gt;색상(단일선택)&lt;/h1&gt;
        붉은색 : &lt;input type=&quot;radio&quot; name=&quot;color&quot;&gt;
        검은색 : &lt;input type=&quot;radio&quot; name=&quot;color&quot;&gt;
        파란색 : &lt;input type=&quot;radio&quot; name=&quot;color&quot;&gt;
        보라색 : &lt;input type=&quot;radio&quot; name=&quot;color&quot; checked&gt;
    &lt;/p&gt;
    &lt;hr/&gt;

    &lt;p&gt;
        &lt;h1&gt;사이즈(다중선택)&lt;/h1&gt;
        95 : &lt;input type=&quot;checkbox&quot; name=&quot;size&quot;&gt;
        100 : &lt;input type=&quot;checkbox&quot; name=&quot;size&quot;&gt;
        105 : &lt;input type=&quot;checkbox&quot; name=&quot;size&quot;&gt;
    &lt;/p&gt;
&lt;/body&gt;</code></pre>
<br>

<ol start="3">
<li><p>file</p>
<ul>
<li><p>파일을 선택하고 업로드할 수 있는 필드를 제공한다.</p>
</li>
<li><p>한번에 하나의 파일만 첨부 가능하다.</p>
</li>
<li><p>파일 업로드하려는 폼은 <code>&lt;form&gt;</code>태그의 method속성이 &quot;posi&quot;이고,
enctype이 &quot;multipart/form-data&quot; 가 명시되어야 한다.</p>
</li>
</ul>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/ef29fa43-8d93-486e-86dc-1c98fefeab06/image.PNG" alt=""></p>
<pre><code class="language-html">&lt;body&gt;
    &lt;form action=&quot;http://localhost/upload.jsp&quot; enctype=&quot;multipart/form-data&quot;
             method=&quot;post&quot;&gt;
         &lt;input type=&quot;file&quot;&gt;
     &lt;/form&gt;
&lt;/body&gt;</code></pre>
<br>

<ol start="4">
<li>submit<ul>
<li>submit 버튼을 만들 때 사용한다.</li>
</ul>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/e3ddceb1-c976-48e0-a5fb-40bed2c11f22/image.PNG" alt=""></p>
<pre><code class="language-html">&lt;body&gt;
    &lt;input type=&quot;submit&quot;&gt;
    &lt;hr&gt;
    &lt;input type=&quot;submit&quot; value=&quot;회원가입&quot;&gt;
&lt;/body&gt;</code></pre>
<br>

<ol start="5">
<li><p>reset</p>
<ul>
<li>입력한 내용을 모두 초기화하는 리셋 버튼을 만들 때 사용한다.<br>
</li>
</ul>
</li>
<li><p>button</p>
<ul>
<li>일반적인 버튼을 만들 때 사용한다.</li>
<li>순수html (껍데기 라고 생각하면 된다.)</li>
</ul>
</li>
</ol>
<br>

<ol start="7">
<li><p>그 밖의 속성값들</p>
<ul>
<li><p>email     : 이메일 필드</p>
</li>
<li><p>url    : URL을 입력받을 수 있는 필드</p>
</li>
<li><p>tel    : 전화번호 필드</p>
</li>
<li><p>number    : 숫자 필드 [▲/▼을 눌러 숫자를 증감할 수 있다.]</p>
</li>
<li><p>range    : 슬라이드 막대를 사용해 숫자를 선택하는 필드</p>
</li>
<li><p>date    : 날짜 선택 필드</p>
</li>
<li><p>time    : 시간 선택 필드</p>
</li>
<li><p>week    : 특정 연도의 주 선택 필드</p>
</li>
<li><p>search    : 검색 필드</p>
</li>
<li><p>color    : 색상 선택 필드</p>
</li>
<li><p>hidden    : 화면에는 표시되지 않는 필드</p>
</li>
</ul>
</li>
</ol>
<p><br><br></p>
<h3 id="11-form태그의-종류---select-태그">11. <code>&lt;form&gt;</code>태그의 종류 - <code>&lt;select&gt;</code> 태그</h3>
<ul>
<li>드롭다운 리스트를 만들 때 사용한다.</li>
<li><code>&lt;select&gt;</code> 태그는 단지 드롭 다운 리스트의 영역을 만든다.</li>
<li><code>&lt;option&gt;</code> 태그를 사용해서 각 목록을 만든다. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/93dc1d58-6b80-4706-aa23-0d07a74df8a9/image.PNG" alt=""></p>
<pre><code class="language-html">&lt;body&gt;
    &lt;fieldset&gt;
        &lt;legend&gt;이동통신사 선택하기&lt;/legend&gt;
        &lt;label for=&quot;teleccom&quot;&gt;이동 통신사 선택&lt;/label&gt;
        &lt;select name=&quot;telecom&quot; id=&quot;telecom&quot;&gt;
            &lt;option value=&quot;SKT&quot;&gt;SKTelecom&lt;/option&gt;
            &lt;option value=&quot;KT&quot;&gt;KT&lt;/option&gt;
            &lt;option value=&quot;LG&quot;&gt;LG U+&lt;/option&gt;
        &lt;/select&gt;
    &lt;/fieldset&gt;
&lt;/body&gt;</code></pre>
<p><br><br></p>
<h3 id="12-form태그의-종류---textarea-태그">12. <code>&lt;form&gt;</code>태그의 종류 - <code>&lt;textarea&gt;</code> 태그</h3>
<ul>
<li>여러 줄을 입력할 수 있는 필드를 제공한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/ff27b623-4f08-4bbd-ad5c-b6ee9b3d9009/image.PNG" alt=""></p>
<pre><code class="language-html">&lt;body&gt;
    &lt;p&gt;자기소개&lt;/p&gt;
        &lt;p&gt;
            &lt;textarea rows=&quot;5&quot; cols=&quot;40&quot;&gt;자기 소개를 입력하세요&lt;/textarea&gt;
        &lt;/p&gt;
&lt;/body&gt;</code></pre>
<p><br><br><br>
<br><br><br></p>
<hr>
<pre><code>참고자료 : &lt;쉽게 배우는 HTML5 &amp; CSS3 그리고 jQuery&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[DBMS] DBMS & SQL 개념 ]]></title>
            <link>https://velog.io/@hyun_ha/SQL-DBMS-SQL-%EA%B0%9C%EB%85%90</link>
            <guid>https://velog.io/@hyun_ha/SQL-DBMS-SQL-%EA%B0%9C%EB%85%90</guid>
            <pubDate>Fri, 20 May 2022 23:28:32 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="📝-데이터베이스">📝 데이터베이스</h2>
</blockquote>
<ul>
<li>데이터(data)와 베이스(base)의 합성어이며 DBMS는 
Database Management System의 약자로 &#39;데이터베이스 관리 시스템&#39;을
의미한다.</li>
</ul>
<br>

<h2 id="기본-개념">기본 개념</h2>
<p>자료 (Data)</p>
<ul>
<li>현실 세계에서 관찰이나 측정을 통해 수집한 단순한 사실이나 값<br>

</li>
</ul>
<p>정보 (Information)</p>
<ul>
<li>의사 결정에 도움을 줄 수 있는 유용한 형태</li>
<li>자료를 가공(처리)해서 얻을 수 있는 결과를 의미<br>

</li>
</ul>
<p>데이터 베이스</p>
<ul>
<li>어느 한 조직체의 여러 응용 시스템들이 공동으로 사용할 수 있도록 통합하여 저장한
운영데이터의 집합.</li>
<li>공동의 목적을 지원하기 위한 서로 관련된 자료들의 모임</li>
<li>주제와 관련된 의미 있는 데이터들의 모음<br>

</li>
</ul>
<p>DBMS (DataBase Management System)</p>
<ul>
<li>사용자에게 데이터베이스를 생성하고 유지할 수 있게 하는 프로그램 집합</li>
<li>DBMS는 데이터베이스 언어를 가지고 있으며 이를 통해 데이터의 삽입/삭제/수정을
 할 수 있다.</li>
<li>DBMS 종류 : <ul>
<li>MySql, MongoDB, Oracle, MSSql, MariaDB, Tibero, Postgresql, 
sqlite, h2 </li>
</ul>
</li>
</ul>
<p><br><br></p>
<h2 id="dbms-기능">DBMS 기능</h2>
<ul>
<li>데이터의 무결성 유지<ul>
<li>DB의 데이터는 실세계를 적용하는 규칙을 항상 만족해야 한다. </li>
<li>서로 다른 부분에 있는 두 개의 데이터가 서로 모순되지 않아야 한다.
즉, 데이터의 일관성 유지</li>
</ul>
</li>
</ul>
<h3 id="dbms의-3가지-특성">DBMS의 3가지 특성</h3>
<ol>
<li><p>데이터의 논리적 독립성</p>
<ul>
<li>한 속성에 가해진 변경이 동일한 테이블에서 다른 속성에 영향을 주지
않는 것을 의미한다.</li>
<li>응용프로그램에 영향을 주지 않고 데이터 구조를 변경할 수 있게 하는 것</li>
</ul>
</li>
<li><p>참조 무결성과 데이터 무결성</p>
<ul>
<li>응용프로그램 개발시 무결성 제약 조건을 신경쓰지 않아도 된다.</li>
</ul>
</li>
<li><p>비정규 질의</p>
<ul>
<li>사용자는 작업을 실행하는 방법을 명시하지 않고도, 데이터베이스에게 어떤 
데이터를 조회할 것인지를 명령할 수 있다.</li>
</ul>
</li>
</ol>
<p><br><br></p>
<h2 id="데이터베이스-모델의-종류">데이터베이스 모델의 종류</h2>
<ul>
<li>계층형 데이터 모델<ul>
<li>나뭇가지 형태의 트리(tree)구조를 활용하여 데이터 관련성을
계층별로 나누어 부모 자식 같은 관계를 정의하고 데이터를
관리한다.</li>
<li>일대다 구조의 데이터를 표현하기에는 알맞지만 자식 개체가
여러 부모를 가진 관계는 표현할 수 없다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/76c69e56-bf89-4100-ba90-22a7f6988e50/image.PNG" alt=""></p>
<br>

<ul>
<li>망형 데이터 모델 (네트워크 데이터 모델)<ul>
<li>그래프(graph) 구조를 기반으로 한다.</li>
<li>개체 간 관계를 그래프 구조로 연결하므로 자식 개체가 
여러 부모 개채를 가질 수 있다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/0a1eadf5-f1bc-4a0a-919c-ff290b2824b3/image.PNG" alt=""></p>
<br>

<ul>
<li>객체 지향 데이터 모델<ul>
<li>객체 지향 프로그래밍에서 사용하는 객체 개념을 기반으로 한다.</li>
<li>데이터를 독립된 객체로 구성하고 관리하여 상속, 오버라이드 등
객체 지향 프로그래밍에서 사용하는 강력한 기능을 사용할 수 있다.<br></li>
<li><span style="color:red">하지만</span> 객체 지향형 모델 개념을 완전히 데이터 베이스에
적용하는 것은 쉽지 않기 때문에 이를 적용한
사용 DBMS는 많지 않다.
다만 여러 DBMS제품군이 &#39;관계형 데이터 모델&#39;을 바탕으로 객체 개념을
도입하여 &#39;객체 관계형 DBMS&#39;로 영역을 확장하고 있다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/c2a4fb93-662d-4842-92a3-bd4a0012def3/image.PNG" alt=""></p>
<br>

<ul>
<li>관계형 데이터 모델 (Relational Data Model)<ul>
<li>개체 집합에 대한 속성 관계를 표현하기 위하여 개체를 
테이블(table)로 사용하고 개체 집합들 사이의 관계는 공통 속성으로
연결하는 독립된 형태의 데이터 모델</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/a0460957-fc80-4e37-9b72-bd5be497c0e3/image.PNG" alt=""></p>
<h3 id="관계형-데이터-모델의-핵심-구성-요소">관계형 데이터 모델의 핵심 구성 요소</h3>
<table>
<thead>
<tr>
<th align="center">이름</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">개체<br>(entity)</td>
<td align="center">데이터베이스에서 데이터화하려는 사물, 개념의 정보 단위<br>관계형 데이터베이스의 테이블(table) 개념과 대응되며 테이블은 릴레이션(relation)으로 표기하기도 한다.</td>
</tr>
<tr>
<td align="center">속성<br>(attribute)</td>
<td align="center">개체를 구성하는 데이터의 가장 작은 논리적 단위로서 데이터의 종류, 특성, 상태 등을 정의한다.<br>관계형 데이터 베이스의 열(column)개념과 대응된다.</td>
</tr>
<tr>
<td align="center">관계<br>(relationship)</td>
<td align="center">개체와 개체 또는 속성 간의 연관성을 나타내기 위해 사용<br>관계형 데이터베이스에서는 테이블 간의 관계를 외래키(foreign key)등으로 구현하여 사용한다.</td>
</tr>
</tbody></table>
<br>

<h3 id="관계형-모델의-구성-요소">관계형 모델의 구성 요소</h3>
<ul>
<li>테이블 (table)<ul>
<li>관계형 모델은 기본적으로 데이터를 2차원 표 형태로 저장,관리한다.</li>
<li>이 표형태의 데이터 저장 공간을 테이블이라고 한다.</li>
<li>테이블의 내용은 실제적인 행의 집합으로 간주된다.</li>
</ul>
</li>
<li>행 (row)<ul>
<li>테이블의 가로줄을 말한다.</li>
<li>저장하려는 하나의 개체를 구성하는 여러 값을 가로로
늘어뜨린 형태</li>
<li>순서가 정해져 있지 않다.</li>
</ul>
</li>
<li>열(column)<ul>
<li>테이블의 세로줄을 말한다.</li>
<li>저장하려는 데이터를 대표하는 이름과 공통 특성을 정의한다.</li>
<li>저장 조건과 범위를 지정할 수 있다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/6b1dda6f-6e93-4ca3-a493-0beb8835b228/image.PNG" alt="">
<br></p>
<h4 id="키-key">키 (key)</h4>
<p>데이터를 구별할 수 있는 유일한 값으로, 종류별로 데이터를 구별하거나
테이블 간의 연관 관계를 표현할 때 키로 지정한 열을 사용한다.
<br></p>
<ul>
<li>기본키 (PK : Primary Key)<ul>
<li>테이블에 저장된 행을 식별할 수 있는 유일한 값 </li>
<li>한 테이블 내에서 중복되지 않는 값만 가질 수 있는 키</li>
<li>NULL 값을 가질 수 없다.</li>
</ul>
</li>
</ul>
<p>기본키는 학번, 주민등록번호 등 처럼 개인 정보 노출이 가장 적은
데이터를 선정한다.
<br></p>
<ul>
<li><p>보조키 (대체키 alternate key)</p>
<ul>
<li>후보키(candidate key)에 속해 있는 키로 후보키 중에서
기본키로 지정되지 않는 열이다.</li>
<li>예를들어 기본키로 선택한 주민등록번호를 제외한 학번,
아이디가 보조키가 된다.<br>
</li>
</ul>
</li>
<li><p>외래키(FK: Foreign Key)</p>
<ul>
<li>특정 테이블에 포함되어 있으면서 다른 테이블의 기본키로
지정된 키를 의미한다.</li>
<li>외래키는 데이터의 중복을 피하기 위해 테이블 사이의 관계를 
규명하기 위한다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/83a0f5c3-35c0-4d87-a497-d65fa2fca76e/image.PNG" alt=""></p>
<p>사진에서 학생 정보 테이블을 보면 열 중에 학과 정보 테이블의 기본키인 
&#39;학과 코드&#39;가 있다.
이 학과 코드가 바로 학생 정보 테이블과 학과 정보 테이블을 이어 주는 
&#39;외래키&#39; 역할을 한다.
즉! 학생 정보 테이블은 학과 코드를 통해 학과 정보 테이블의 세부 정보를 찾아 갈 
수 있다. 이를 학생 정보 테이블이 학과 코드를 &#39;참조&#39;한다고 표현한다.
<br></p>
<ul>
<li>복합키 (composite key)<ul>
<li>여러 열을 조합하여 기본키 역할을 할 수 있게 만든 키를 뜻한다.</li>
<li>하나의 열만으로 행을 식별하는 것이 불가능하여 두 개 이상의 열 값을
함께 사용해야 각 행이 유일한 데이터로서 가치를 지닌다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/e223725e-e4a6-4c28-9392-d4cca2fed392/image.PNG" alt="">
만약 같은 과목을 여러 교수가 가르치거나, 한 교수가 서로 다른 과목을
가르치는 경우에는 테이블 행을 정확히 구분하는 것이 불가능하다.</p>
<p>이때 각 과목별 과목 코드와 담당 교수 열을 조합하여 하나의 키로
지정한다면 과목 정보 테이블의 행을 정확히 구분할 수 있다.
즉 &#39;과목 코드 + 담당 교수&#39; 가 복합키로서 기본키 역할을 하게 된다.</p>
<p><br><br><br></p>
<h2 id="sql이란">SQL이란?</h2>
<ul>
<li>Structured Query Language의 약자로서 관계형 데이터 베이스 언어이다.</li>
<li>데이터의 삽입, 삭제, 갱신, 질의, 보호(보안) 명령문으로 구성되어 있다.</li>
<li>SQL은 비절차적 데이터베이스 언어로 분류한다.</li>
</ul>
<br>

<h3 id="sql-기능에-따른-분류">SQL 기능에 따른 분류</h3>
<table>
<thead>
<tr>
<th align="center">종류</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">데이터 정의어(DDL)</td>
<td align="center">테이블이나 관계의 구조를 생성하는데 사용한다.<br>Create, Alter, Drop 문 등이 있다.</td>
</tr>
<tr>
<td align="center">데이터 조작어(DML)</td>
<td align="center">테이블에 데이터를 검색, 삽입, 수정, 삭제하는데 사용한다.<br>select, insert, delete, update 문 등이 있다.</td>
</tr>
<tr>
<td align="center">데이터 제어어(DCL)</td>
<td align="center">데이터의 사용 권한을 관리하는데 사용한다.<br>grant, revoke문 등이 있다.</td>
</tr>
</tbody></table>
<p><br><br><br>
<br><br><br></p>
<hr>
<pre><code>참고자료 : &lt;Do it! 오라클로 배우는 데이터베이스 입문&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 컬렉션 프레임워크(Collection Framework)]]></title>
            <link>https://velog.io/@hyun_ha/JAVA-%EC%BB%AC%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%ACCollection-Framework</link>
            <guid>https://velog.io/@hyun_ha/JAVA-%EC%BB%AC%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%ACCollection-Framework</guid>
            <pubDate>Sun, 15 May 2022 02:23:54 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="📝-컬렉션-프레임워크collection-framework">📝 컬렉션 프레임워크(Collection Framework)</h2>
</blockquote>
<ul>
<li>기존 배열의 문제점을 해결하고, 다수의 데이터를 쉽게 처리할 수 있는
표준화 된 방법을 제공하는 클래스이다.</li>
</ul>
<p>자바 컬렉션 프레임워크는 몇 가지 인터페이스를 통해서 다양한 컬렉션 클래스를
이용할 수 있도록 한다.</p>
<p>주요 인터페이스로는 List, Set, Map이 있다.</p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/6beec756-35f1-45ec-9554-ceb2089c0c2c/image.PNG" alt=""></p>
<p>List와 Set은 서로 많은 공통점이 있어서, 
공통된 부분을 모아 collection 인터페이스를 정의할 수 있지만 
Map은 다른 형태로 컬렉션을 다루기 때문에 같은 상속계층도에 포함되지 못했다.</p>
<br>

<table>
<thead>
<tr>
<th align="center">인터페이스</th>
<th align="center">특징</th>
<th align="center">구현클래스</th>
</tr>
</thead>
<tbody><tr>
<td align="center">List</td>
<td align="center">순서가 있는 데이터의 집합<br><br>데이터 중복을 허용</td>
<td align="center">ArrayList, LinkedList,<br> Stack, Vector</td>
</tr>
<tr>
<td align="center">Set</td>
<td align="center">순서가 없는 데이터의 집합<br><br>데이터의 중복을 허용하지 않음</td>
<td align="center">HashSet, TreeSet</td>
</tr>
<tr>
<td align="center">Map</td>
<td align="center">키(Key)와 값(value)의 쌍으로 이루어진 데이터의 집합<br><br>순서는 유지되는 않는다.<br><br>키(Key)는 중복을 허용하지 않지만, 값(value)은 중복을 허용한다.</td>
<td align="center">HashMap, TreeMap,<br> Hashtable, Properties</td>
</tr>
</tbody></table>
<p><br><br></p>
<h1 id="list-인터페이스">List 인터페이스</h1>
<ul>
<li>객체를 일렬로 늘어놓은 구조를 가지고 있다. </li>
<li>객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동 인덱스가 부여되고
인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공한다.</li>
<li>List 인터페이스는 중복을 허용하면서 저장순서가 유지되는 컬렉션을 
구현하는데 사용된다.</li>
</ul>
<br>

<h2 id="list-인터페이스에-정의된-메서드">List 인터페이스에 정의된 메서드</h2>
<table>
<thead>
<tr>
<th align="center">메서드</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">void add(int index, Object element)<br>boolean addAll(int index, Collection c)</td>
<td align="center">지정된 위치(index)에 객체(element) 또는 컬렉션에 포함된 객체들을 추가한다.</td>
</tr>
<tr>
<td align="center">Object get(int index)</td>
<td align="center">지정된 위치(index)에 있는 객체를 리턴한다.</td>
</tr>
<tr>
<td align="center">int indexOf(Object o)</td>
<td align="center">지정된 객체의 위치(index)를 리턴한다.<br>(List의 첫 번째 요소부터 순방향으로 찾는다.)</td>
</tr>
<tr>
<td align="center">int lastIndexOf(Object o)</td>
<td align="center">지정된 객체의 위치(index)를 리턴한다.<br>(List의 마지막 요소부터 순방향으로 찾는다.)</td>
</tr>
<tr>
<td align="center">int size()</td>
<td align="center">저장되어 있는 객체의 개수를 리턴한다.</td>
</tr>
<tr>
<td align="center">Object remove(int index)</td>
<td align="center">지정된 위치(index)에 있는 객체를 삭제한다.</td>
</tr>
<tr>
<td align="center">void clear()</td>
<td align="center">저장된 모든 객체를 삭제한다.</td>
</tr>
<tr>
<td align="center">Object set(int index, Object element)</td>
<td align="center">지정된 위치(index)에 객체(element)를 저장한다.</td>
</tr>
<tr>
<td align="center">void sort(Comparator c)</td>
<td align="center">지정된 비교자(comparator)로 List를 정렬한다.</td>
</tr>
<tr>
<td align="center">List subList(int fromIndex, int toIndex)</td>
<td align="center">지정된 범위(fromIndex부터 toIndex)에 있는 객체를 반환한다.</td>
</tr>
</tbody></table>
<p><br><br></p>
<h2 id="arraylist">ArrayList</h2>
<ul>
<li><p>배열기반</p>
</li>
<li><p>ArrayList는 List 인터페이스를 상속받는 클래스로, 데이터를 이름표 없이
 무제한으로 보관할 수 있다.</p>
</li>
<li><p>ArrayList에 추가되는 데이터는 저장순서가 유지되고 중복을 허용한다.</p>
</li>
<li><p>ArrayList에서 특정 인덱스의 객체를 삭제하거나 추가할 경우
바로 뒤 인덱스부터 인덱스가 바뀐다.</p>
</li>
</ul>
<pre><code>📌 일반 배열과의 차이점 📌

  - 배열은 생성할 때 크기가 고정되고 사용 중에 크기를 변경할 수 없지만,
  ArrayList는 저장 용량(capacity)가 초과한 객체들이 들어오면 
  자동적으로 저장 용량(capacity)이 늘어난다. </code></pre><br>

<p>ArrayList의 선언</p>
<pre><code class="language-java">List&lt;저장할 객체 타입&gt; list = new ArrayList&lt;저장할 객체 타입&gt;();</code></pre>
<br>

<h3 id="✍-arraylist-코드-예시">✍ ArrayList 코드 예시)</h3>
<pre><code class="language-java">import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {

        List&lt;Integer&gt; numberList = new ArrayList&lt;Integer&gt;();

        // 데이터 추가하기
        for (int i = 1; i &lt;= 10; i++) {
            numberList.add(i);
        }

        System.out.println(&quot;데이터의 크기 : &quot; + numberList.size());
        System.out.println(&quot;--------------------------------&quot;);

        // 5번째 요소의 값 얻기, 
        System.out.println(&quot;5번째 요소의 값 : &quot; + numberList.get(4));
        System.out.println(&quot;--------------------------------&quot;);

        // 5번째 요소의 값 삭제
        numberList.remove(4);

        // 하나를 삭제 후, 전체 크기 다시 조회
        System.out.println(&quot;데이터의 크기 : &quot; + numberList.size());
        System.out.println(&quot;--------------------------------&quot;);

        // 5번째 요소의 값 다시 얻기
        System.out.println(&quot;5번째 요소의 값 : &quot; + numberList.get(4));
        System.out.println(&quot;--------------------------------&quot;);

        // 5번째 자리에 데이터 추가
        numberList.add(4, 123);
        System.out.println(&quot;5번째 요소의 값 : &quot; + numberList.get(4));
        System.out.println(&quot;--------------------------------&quot;);

        // 전체 삭제
        numberList.clear();
        System.out.println(&quot;데이터의 크기 : &quot; + numberList.size());

    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">데이터의 크기 : 10
--------------------------------
5번째 요소의 값 : 5
--------------------------------
데이터의 크기 : 9
--------------------------------
5번째 요소의 값 : 6
--------------------------------
5번째 요소의 값 : 123
--------------------------------
데이터의 크기 : 0</code></pre>
<p><br><br></p>
<h2 id="linkedlist">LinkedList</h2>
<ul>
<li><p>LinkedList는 List 구현 클래스이므로 ArrayList와 사용 방법은 똑같지만 
내부 구조는 완전히 다르다.</p>
</li>
<li><p>ArrayList는 모든 데이터가 연속적으로 존재하지만 
LinkedList는 불연속적으로 존재하는 데이터를 서로 연결(link)한 형태로 구성되어 있다.</p>
<ul>
<li>LinkedList의 각 요소들은 자신과 연결된 다음 요소에 대한 참조(주소값)와
데이터로 구성되어 있다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/f7f9c644-4df3-4e85-81f0-4ce7e67c24dd/image.PNG" alt=""></p>
<ul>
<li>특정 인덱스의 객체를 추가 또는 삭제할 경우 앞뒤 링크만 변경되고 나머지 링크는 
변경되지 않는다.<ul>
<li>앞뒤 링크 정보만 변경하면 되므로 처리속도가 매우 빠르다. </li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/28ed60bb-4920-414c-9ec5-bcba3d1a9966/image.PNG" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/8ea57579-e05c-42b4-ba8c-6a320ff71c7f/image.PNG" alt=""></p>
<ul>
<li>LinkedList는 불연속적으로 위치한 각 요소들이 서로 연결된 것이라 
처음부터 n번째 데이터까지 차례대로 따라가야만 원하는 값을 얻을 수 있다.<br>
그래서 LinkedList는 저장해야하는 데이터의 개수가 많아질수록
데이터를 읽어 오는 시간(접근시간)이 길어진다는 단점이 있다.</li>
</ul>
<br>

<ul>
<li>ArrayList와 LinkedList의 비교</li>
</ul>
<table>
<thead>
<tr>
<th align="center">컬렉션</th>
<th align="center">읽기 (접근시간)</th>
<th align="center">순차적 추가/삭제</th>
<th align="center">중간에 추가/삭제</th>
<th align="center">비고</th>
</tr>
</thead>
<tbody><tr>
<td align="center">ArrayList</td>
<td align="center">빠르다</td>
<td align="center">빠르다</td>
<td align="center">느리다</td>
<td align="center">비효율적인 메모리 사용<br>검색이 빠르다</td>
</tr>
<tr>
<td align="center">LinkedList</td>
<td align="center">느리다</td>
<td align="center">느리다</td>
<td align="center">빠르다</td>
<td align="center">데이터가 많을수록 접근성이 떨어진다.<br>검색이 느리다</td>
</tr>
</tbody></table>
<br>

<p>LinkedList의 선언</p>
<pre><code class="language-java">List&lt;저장할 객체 타입&gt; list = new LinkedList&lt;저장할 객체 타입&gt;();</code></pre>
<br>

<hr>
<p><br><br></p>
<h1 id="set-인터페이스">Set 인터페이스</h1>
<ul>
<li><p>중복을 허용하지 않고 저장순서가 유지되지 않는다.</p>
<ul>
<li>하나의 null만 저장할 수 있다.</li>
</ul>
</li>
<li><p>인덱스로 관리하지 않기 때문에 인덱스를 매개값으로 갖는 메서드가 없다.</p>
</li>
</ul>
<br>

<h2 id="set-인터페이스에-정의된-메서드">Set 인터페이스에 정의된 메서드</h2>
<table>
<thead>
<tr>
<th align="center">메서드</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">boolean add(Object o)</td>
<td align="center">주어진 객체를 저장<br>객체가 성공적으로 저장되면 true, 중복 객체면 false를 리턴한다.</td>
</tr>
<tr>
<td align="center">boolean contains(Object o)</td>
<td align="center">주어진 객체가 저장되어 있는지 확인한다.</td>
</tr>
<tr>
<td align="center">void clear()</td>
<td align="center">저장된 모든 객체를 삭제한다.</td>
</tr>
<tr>
<td align="center">boolean remove(Object o)</td>
<td align="center">주어진 객체를 삭제한다.</td>
</tr>
<tr>
<td align="center">boolean equals(Object o)</td>
<td align="center">동일한 컬렉션인지 비교한다.</td>
</tr>
<tr>
<td align="center">boolean isEmpty()</td>
<td align="center">컬렉션이 비어 있는지 확인한다.</td>
</tr>
<tr>
<td align="center">lterator iterator()</td>
<td align="center">저장된 객체를 한 번씩 가져오는 반복자 리턴</td>
</tr>
<tr>
<td align="center">int size()</td>
<td align="center">저장되어 있는 전체 객체 수 리턴한다.</td>
</tr>
</tbody></table>
<br>

<ul>
<li>Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메서드가 없다.
그래서 전체 객체를 대상으로 한번씩 반복해서 가져오는 반복자(Iterator)를
제공한다.</li>
</ul>
<br>

<h3 id="iterator-인터페이스">Iterator 인터페이스</h3>
<ul>
<li>Iterator는 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다.</li>
<li>iterator() 메서드를 호출하면 얻을 수 있다.</li>
</ul>
<br>
Iterator 인터페이스에 선언된 메서드

<table>
<thead>
<tr>
<th align="center">리턴 타입</th>
<th align="center">메서드명</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">boolean</td>
<td align="center">hasNext()</td>
<td align="center">가져올 객체가 있으면 true, 없으면 false를 리턴한다.</td>
</tr>
<tr>
<td align="center">E<br>(제네릭 타입)</td>
<td align="center">next()</td>
<td align="center">컬렉션에서 하나의 객체를 가져온다.<br>next() 메서드를 사용하기 전에 hasNext() 메서드로 가져올 객체가 있는지 확인하는 것이 좋다.</td>
</tr>
<tr>
<td align="center">void</td>
<td align="center">remove()</td>
<td align="center">Set 컬렉션에서 객체를 제거한다.</td>
</tr>
</tbody></table>
<p><br><br></p>
<h2 id="hashset">HashSet</h2>
<ul>
<li><p>Set인터페이스를 구현한 가장 대표적인 컬렉션이며, 중복된 요소를 
저장하지 않는다.</p>
</li>
<li><p>이미 저장되어 있는 요소와 중복된 요소를 추가하고자 한다면 
add메서드는 false를 리턴함으로써 중복된 요소이기 때문에 추가에
실패했다는 것을 알린다.</p>
</li>
<li><p>저장 순서를 유지하지 않으므로 저장순서를 유지하고자 한다면
LinkedHashSet을 사용해야한다.</p>
</li>
</ul>
<br>

<h3 id="중복을-걸러내는-과정">중복을 걸러내는 과정</h3>
<ul>
<li><p>HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode() 메서드를 호출해서
해시코드를 얻어낸다.</p>
</li>
<li><blockquote>
<p>그리고 이미 저장되어 있는 객체들의 해시코드와 비교한다.</p>
</blockquote>
</li>
<li><p>동일한 해시코드가 있다면 다시 equals() 메서드로 두 객체를 비교해서 true가
나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.</p>
</li>
</ul>
<br>

<p>HashSet의 선언</p>
<pre><code class="language-java">Set&lt;저장할 객체 타입&gt; set = new HashSet&lt;저장할 객체 타입&gt;(); </code></pre>
<br>

<h3 id="✍-hashset-코드-예시">✍ HashSet 코드 예시)</h3>
<pre><code class="language-java">import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Main {

    public static void main(String[] args) {

        Set&lt;String&gt; color = new HashSet&lt;String&gt;();

        // 데이터 추가하기
        color.add(&quot;Red&quot;);
        color.add(&quot;Blue&quot;);
        color.add(&quot;Black&quot;);
        color.add(&quot;White&quot;);
        color.add(&quot;Pink&quot;);

        System.out.println(&quot;데이터의 크기 : &quot; + color.size());
        System.out.println(&quot;numSet = &quot; + color);    // 저장순서를 유지하지 않는다.
        System.out.println(&quot;--------------------------------&quot;);

        // 중복된 값 추가
        //     -&gt; 중복된 값은 저장되지 않는다.
        color.add(&quot;Red&quot;);
        System.out.println(&quot;데이터의 크기 : &quot; + color.size());        
        System.out.println(&quot;--------------------------------&quot;);

        // 데이터 전체 출력하기 
        Iterator&lt;String&gt; ite = color.iterator();

        while(ite.hasNext()) {     // 값이 있으면 true, 없으면 false
            System.out.print(ite.next() + &quot; &quot;); 
        }
        System.out.println(&quot;\n--------------------------------&quot;);

        // 데이터 삭제
        color.remove(&quot;Blue&quot;);

        // 값 검색하기
        System.out.println(color.contains(&quot;Blue&quot;));
        System.out.println(color.contains(&quot;Red&quot;));

    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">데이터의 크기 : 5
numSet = [Red, White, Pink, Blue, Black]
--------------------------------
데이터의 크기 : 5
--------------------------------
Red White Pink Blue Black 
--------------------------------
false
true</code></pre>
<p><br><br></p>
<h2 id="treeset">TreeSet</h2>
<ul>
<li>이진 탐색 트리(binary search tree)라는 자료구조의 형태로 데이터를 
저장하는 컬렉션 클래스이다.</li>
<li>중복된 데이터의 저장을 허용하지 않으며 정렬된 위치에 저장하므로
저장순서를 유지하지도 않는다.</li>
</ul>
<br>

<p>TreeSet의 선언</p>
<pre><code class="language-java">TreeSet&lt;저장할 객체 타입&gt; treeSet = new TreeSet&lt;저장할 객체 타입&gt;();</code></pre>
<br>

<h3 id="이진-탐색-트리binary-search-tree">이진 탐색 트리(binary search tree)</h3>
<ul>
<li>이진 트리의 한 종류로 
정렬, 검색, 범위검색(range search)에 높은 성능을 보이는 자료구조이다.</li>
</ul>
<pre><code>이진 트리(binary tree)란?

- 여러 개의 노드(node)가 트리 형태로 연결된 구조로,
&#39;루트(root)&#39;라고 불리는 하나의 노드에서부터 시작해서 각 노드에 최대 2개의
노드를 연결할 수 있는 구조를 가지고 있다.
- 위 아래로 연결된 두 노드를 &#39;부모-자식관계&#39;에 있다고 하며 
위의 노드를 부모 노드, 아래의 노드를 자식 노드라 한다.
- 하나의 부모 노드는 최대 두 개의 자식 노드와 연결될 수 있다.</code></pre><p><img src="https://velog.velcdn.com/images/hyun_ha/post/b402d6bb-7b9b-48a6-b5d8-48df45c2ddda/image.PNG" alt=""></p>
<ul>
<li>이진 탐색 트리는
왼쪽 자식노드의 값은 부모노드의 값보다 작고,
오른쪽 자식노드의 값은 부모노드의 값보다 커야한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/7370700f-6d0c-42fa-8aa1-95a85d21474a/image.PNG" alt=""></p>
<p>왼쪽 마지막 값에서부터 오른쪽 값까지 값을 &#39;왼쪽 노드 -&gt; 부모 노드 -&gt; 오른쪽노드&#39;
순으로 읽어오면 오름차순으로 정렬된 순서를 얻을 수 있다.</p>
<ul>
<li><p>즉, 정렬에 유리하다.</p>
</li>
<li><p>TreeSet은 이처럼 정렬된 상태을 유지하기 때문에 단일 값 검색과 범위검색이 
매우 빠르다.</p>
</li>
<li><p>하지만 반복 비교로 자리를 찾아 저장하기 때문에 노드의 추가 삭제에 시간이 걸린다.</p>
</li>
</ul>
<br>

<h3 id="treeset의-메서드">TreeSet의 메서드</h3>
<table>
<thead>
<tr>
<th align="center">생성자 또는 메서드</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">Comparator comparator()</td>
<td align="center">TreeSet의 정렬기준(Comparator)을 반환</td>
</tr>
<tr>
<td align="center">NavigableSet descendingSet()</td>
<td align="center">TreeSet의 저장된 요소들을 역순으로 정렬해서 반환</td>
</tr>
<tr>
<td align="center">Object first()</td>
<td align="center">정렬된 순서에서 첫 번째 객체(제일 낮은 객체)를 반환</td>
</tr>
<tr>
<td align="center">Object last()</td>
<td align="center">정렬된 순서에서 마지막 객체(제일 높은 객체)를 반환</td>
</tr>
<tr>
<td align="center">Object lower(Object o)</td>
<td align="center">지정된 객체보다 작은 값을 가진 객체 중 제일 가까운 값의 객체를 반환<br>없으면 null</td>
</tr>
<tr>
<td align="center">Object higher(Object o)</td>
<td align="center">지정된 객체보다 높은 값을 가진 객체 중 제일 가까운 값의 객체를 반환<br>없으면 null</td>
</tr>
<tr>
<td align="center">Object floor(Object o)</td>
<td align="center">지정된 객체와 같은 객체를 반환<br>없으면 작은 값을 가진 객체 중 제일 가까운 객체를 반환<br>없으면 null</td>
</tr>
<tr>
<td align="center">Object ceiling(Object o)</td>
<td align="center">지정된 객체와 같은 객체를 반환<br>없으면 높은 값을 가진 객체 중 제일 가까운 객체를 반환<br>없으면 null</td>
</tr>
<tr>
<td align="center">Object pollFirst()</td>
<td align="center">TreeSet의 첫 번째 요소(제일 작은 값의 객체)를 반환 후 컬렉션에서 제거함</td>
</tr>
<tr>
<td align="center">Object pollLast()</td>
<td align="center">TreeSet의 마지막 요소(제일 높은 값의 객체)를 반환 후 컬렉션에서 제거함</td>
</tr>
<tr>
<td align="center">NavigableSet headSet(Object toElement, boolean inclusive)</td>
<td align="center">지정된 객체보다 작은 값의 객체들을 반환<br>inclusive가 true이면, 같은 값의 객체도 포함</td>
</tr>
<tr>
<td align="center">NavigableSet tailSet(Object toElement, boolean inclusive)</td>
<td align="center">지정된 객체보다 높은 값의 객체들을 반환<br>inclusive가 true이면, 같은 값의 객체도 포함</td>
</tr>
<tr>
<td align="center">NavigableSet sunSet(Object fromElement, boolean fromInclusive, Object toElement, boolean toInclusive</td>
<td align="center">범위 검색(fromElement와 toElement사이)의 결과를 반환<br>fromInclusive가 true면 시작값이 포함되고, toInclusive가 true면 끝값이 포함된다.</td>
</tr>
</tbody></table>
<br>

<h3 id="✍-treeset-코드-예시">✍ TreeSet 코드 예시)</h3>
<pre><code class="language-java">import java.util.NavigableSet;
import java.util.TreeSet;

public class Main {

    public static void main(String[] args) {

        TreeSet&lt;Integer&gt; scores = new TreeSet&lt;Integer&gt;();

        // 데이터 추가하기
        scores.add(new Integer(87));
        scores.add(new Integer(64));
        scores.add(new Integer(98));
        scores.add(new Integer(75));
        scores.add(new Integer(95));
        scores.add(new Integer(80));

        // 특정 객체 찾기
        System.out.println(&quot;가장 낮은 점수 : &quot; + scores.first());
        System.out.println(&quot;가장 높은 점수 : &quot; + scores.last() + &quot;\n&quot;);

        System.out.println(&quot;90점 아래 점수 : &quot; + scores.lower(new Integer(90)));
        System.out.println(&quot;90점 위의 점수 : &quot; + scores.higher(new Integer(90)) + &quot;\n&quot;);

        // 객체 정렬하기
        NavigableSet&lt;Integer&gt; descendingSet = scores.descendingSet();
        for (Integer score : descendingSet) {
            System.out.print(score + &quot; &quot;);
        }
        System.out.println(&quot;\n&quot;);

        // pollFirst() 메서드
        while (!scores.isEmpty()) {
            System.out.println(scores.pollFirst() + &quot; [남은 객체 수 : &quot; 
                                + scores.size() + &quot;]&quot; );
        }

    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">가장 낮은 점수 : 64
가장 높은 점수 : 98

90점 아래 점수 : 87
90점 위의 점수 : 95

98 95 87 80 75 64 

64 [남은 객체 수 : 5]
75 [남은 객체 수 : 4]
80 [남은 객체 수 : 3]
87 [남은 객체 수 : 2]
95 [남은 객체 수 : 1]
98 [남은 객체 수 : 0]</code></pre>
<br>

<h3 id="✍-treeset-코드-예시2">✍ TreeSet 코드 예시2)</h3>
<pre><code class="language-java">import java.util.NavigableSet;
import java.util.TreeSet;

public class Main {

    public static void main(String[] args) {

        TreeSet&lt;String&gt; words = new TreeSet&lt;String&gt;();

        words.add(&quot;apple&quot;);
        words.add(&quot;cherry&quot;);
        words.add(&quot;forever&quot;);
        words.add(&quot;zoo&quot;);
        words.add(&quot;dance&quot;);
        words.add(&quot;car&quot;);
        words.add(&quot;flower&quot;);
        words.add(&quot;green&quot;);

        // 범위 검색하기
        System.out.println(&quot;[c~f 사이의 단어 검색]&quot;);

        NavigableSet&lt;String&gt; rangeSearch = words.subSet(&quot;c&quot;, true, &quot;g&quot;, true);
        for(String word : rangeSearch) {
            System.out.println(word);
        }

    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">[c~f 사이의 단어 검색]
car
cherry
dance
flower
forever</code></pre>
<br>

<hr>
<p><br><br></p>
<h1 id="map-인터페이스">Map 인터페이스</h1>
<ul>
<li>키(key)와 값(value)을 하나의 쌍으로 묶어서 저장하는 컬렉션 
클래스를 구현하는데 사용된다.<ul>
<li>여기서 키와 값은 모두 객체이다.</li>
</ul>
</li>
<li>키는 중복될 수 없지만 값은 중복을 허용한다.</li>
<li>기존에 저장된 데이터와 중복된 키와 값을 저장하려면 기존의 값은 없어지고,
마지막에 저장된 값이 남게 된다.</li>
<li>키로 객체들을 관리하기 때문에 키를 매개값으로 갖는 메서드가 많다.</li>
</ul>
<br>

<h2 id="map-인터페이스에-정의된-메서드">Map 인터페이스에 정의된 메서드</h2>
<table>
<thead>
<tr>
<th align="center">메서드</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">Object put(Object key, Object value)</td>
<td align="center">주어진 키로 값을 저장<br>새로운 키일 경우 null을 리턴하고 동일한 키가 있을 경우 값을 대체하고 이전 값을 리턴한다.</td>
</tr>
<tr>
<td align="center">void clear()</td>
<td align="center">Map의 모든 객체를 삭제</td>
</tr>
<tr>
<td align="center">Object remove(Object key)</td>
<td align="center">지정한 key객체와 일치하는 key-value객체를 삭제</td>
</tr>
<tr>
<td align="center">boolean containsKey(Object key)</td>
<td align="center">지정된 키가 있는지 여부</td>
</tr>
<tr>
<td align="center">boolean containsValue(Object value)</td>
<td align="center">지정된 값이 있는지 여부</td>
</tr>
<tr>
<td align="center">Set keySet()</td>
<td align="center">Map에 저장된 모든 key객체를 리턴</td>
</tr>
<tr>
<td align="center">Collection values()</td>
<td align="center">저장된 모든 값을 Collection에 담아서 리턴</td>
</tr>
<tr>
<td align="center">Set entrySet()</td>
<td align="center">Map에 저장되어 있는 key-value쌍을 Map.Entry타입의 객체로 저장한 Set으로 리턴</td>
</tr>
<tr>
<td align="center">Object get(Object key)</td>
<td align="center">지정된 키가 있는 값을 리턴</td>
</tr>
<tr>
<td align="center">boolean equals(Object o)</td>
<td align="center">동일한 Map인지 비교</td>
</tr>
<tr>
<td align="center">boolean isEmpty()</td>
<td align="center">Map이 비어있는지 여부</td>
</tr>
<tr>
<td align="center">int size()</td>
<td align="center">저장된 키의 총 수를 리턴</td>
</tr>
</tbody></table>
<p><br><br></p>
<h2 id="hashmap">HashMap</h2>
<ul>
<li>Map 인터페이스를 구현한 대표적인 Map 컬렉션이다.</li>
<li>Map의 특징, 키(key)와 값(value)을 묶어서 하나의 데이터(entry)로
저장한다는 특징을 갖는다.</li>
<li>해싱(hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서
뛰어난 성능을 보인다.</li>
<li>키(key)는 주로 String을 많이 사용한다.<ul>
<li>키는 저장된 값을 찾는데 사용되는 것이기 때문에 컬렉션 내에서
유일(unique)해야 한다.</li>
<li>String은 문자열이 같은 경우 동등 객체가 될 수 있도록
hashcod()와 equuals()메서드가 재정의 되어 있다.</li>
</ul>
</li>
</ul>
<br>

<p>HashMap의 선언</p>
<pre><code class="language-java">Map&lt;키 타입, 값 타입&gt; map = new HashMap&lt;키 타입, 값 타입&gt;();</code></pre>
<br>

<h3 id="✍-hashmap-코드-예시">✍ HashMap 코드 예시)</h3>
<pre><code class="language-java">import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Main {

    public static void main(String[] args) {

        Map&lt;String, Integer&gt; map = new HashMap&lt;String, Integer&gt;();

        // 데이터 추가하기
        // -&gt; 중복을 허용하지 않는다. (마지막에 들어간 값이 저장된다.)
        map.put(&quot;국어&quot;, 95);
        map.put(&quot;수학&quot;, 90);
        map.put(&quot;영어&quot;, 85);
        map.put(&quot;수학&quot;, 100);
        map.put(&quot;영어&quot;, null);     // 객체를 넣는 것이므로 Null 사용 가능

        // 저장된 갯수을 얻기
        System.out.println(&quot;HashMap size : &quot; + map.size());
        System.out.println(&quot;-------------------------------------&quot;);

        // 데이터 꺼내기
        System.out.println(map.get(&quot;국어&quot;));
        System.out.println(map.get(&quot;영어&quot;));
        System.out.println(map.get(&quot;수학&quot;));
        System.out.println(&quot;-------------------------------------&quot;);

        // 반복문으로 탐색 -&gt; HashMap은 순서가 유지되지 않는다.
        Set&lt;String&gt; keySet = map.keySet();
        Iterator&lt;String&gt; it = keySet.iterator();
        while(it.hasNext()) {
            String key = it.next();
            Integer value = map.get(key);
            System.out.println(key + &quot; : &quot; + value);
        }

    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">HashMap size : 3
-------------------------------------
95
null
100
-------------------------------------
국어 : 95
수학 : 100
영어 : null</code></pre>
<p><br><br><br></p>
<hr>
<pre><code>참고자료 : &lt;Java의 정석&gt;, &lt;이것이 자바다&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] Calendar 클래스 & 형식화]]></title>
            <link>https://velog.io/@hyun_ha/JAVA-Calendar-%ED%81%B4%EB%9E%98%EC%8A%A4-%ED%98%95%EC%8B%9D%ED%99%94</link>
            <guid>https://velog.io/@hyun_ha/JAVA-Calendar-%ED%81%B4%EB%9E%98%EC%8A%A4-%ED%98%95%EC%8B%9D%ED%99%94</guid>
            <pubDate>Thu, 05 May 2022 14:40:33 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="📝-calendar-클래스">📝 Calendar 클래스</h2>
</blockquote>
<ul>
<li>Date 클래스처럼 날짜와 시간을 다루는 클래스이다.</li>
<li>java.util 패키지에 포함되어 있다.</li>
</ul>
<p>Calendar 클래스는 <span style="color:tomato">추상클래스</span>이기 때문에 직접 객체를 생성할 수 없고,
메서드를 통해서 완전히 구현된 클래스의 인스턴스를 얻어야 한다.</p>
<pre><code class="language-java">// 캘린더 객체의 생성 -&gt; 싱글톤 객체
Calendar cal = Calendar.getInstance();</code></pre>
<ul>
<li>getInstance()메서드는 Calendar클래스를 구현한 클래스의 인스턴스를 반환한다.</li>
</ul>
<p><br><br></p>
<h2 id="calendar-클래스의-주요-상수">Calendar 클래스의 주요 상수</h2>
<p>Calendar 객체를 얻었다면 get() 메서드를 이용해서 날짜와 시간에 대한 정보를 읽을 수 있다.</p>
<ul>
<li>get() 메서드의 매개변수로 사용되는 int값들은 Calendar에 정의된
static상수이다.</li>
</ul>
<br>

<table>
<thead>
<tr>
<th align="center">상수</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">YEAR</td>
<td align="center">년도</td>
</tr>
<tr>
<td align="center">MONTH</td>
<td align="center">월<br><br> <span style="color:pink">값의 범위는 0 ~ 11이기 때문에 0이면 1월을 의미한다.</span></td>
</tr>
<tr>
<td align="center">DAY_OF_MONTH</td>
<td align="center">일</td>
</tr>
<tr>
<td align="center">DAY_OF_WEEK</td>
<td align="center">요일<br><br>일 = 1 ~ 토 = 7</td>
</tr>
<tr>
<td align="center">AM_PM</td>
<td align="center">오전_오후<br><br>0 : 오전, 1: 오후</td>
</tr>
<tr>
<td align="center">HOUR</td>
<td align="center">시간 (0~11)</td>
</tr>
<tr>
<td align="center">HOUR_OF_DAY</td>
<td align="center">시간 (0~23)</td>
</tr>
<tr>
<td align="center">MINUTE</td>
<td align="center">분</td>
</tr>
<tr>
<td align="center">SECOND</td>
<td align="center">초</td>
</tr>
<tr>
<td align="center">DATE</td>
<td align="center">이 달의 마지막 일</td>
</tr>
</tbody></table>
<br>

<h3 id="✍-코드-예시">✍ 코드 예시)</h3>
<pre><code class="language-java">import java.util.Calendar;

public class Main01 {

    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();

        // 년, 월, 일, 시, 분, 초 &gt;&gt; 24시간제
        int yy = cal.get(Calendar.YEAR);
        int mm = cal.get(Calendar.MONTH) + 1;
        int dd = cal.get(Calendar.DAY_OF_MONTH);
        int hh = cal.get(Calendar.HOUR_OF_DAY);
        int mi = cal.get(Calendar.MINUTE);
        int ss = cal.get(Calendar.SECOND);

        System.out.printf(&quot;%04d년 %02d월 %02d일 %02d시 %02d분 %02d초\n&quot;
                        ,yy, mm, dd, hh, mi, ss);

        // 년, 월, 일, 시, 분, 초 &gt;&gt; 12시간제
        yy = cal.get(Calendar.YEAR);
        mm = cal.get(Calendar.MONTH) + 1;
        dd= cal.get(Calendar.DAY_OF_MONTH);
        hh = cal.get(Calendar.HOUR);
        mi = cal.get(Calendar.MINUTE);
        ss = cal.get(Calendar.SECOND);

        // 오전(=0), 오후(=1)
        int ampm = cal.get(Calendar.AM_PM);
        String[] apName = {&quot;오전&quot;, &quot;오후&quot;};

        System.out.printf(&quot;%04d년 %02d월 %02d일 %s %02d시 %02d분 %02d초\n&quot;
                        ,yy, mm, dd, apName[ampm], hh, mi, ss);

    }

}</code></pre>
<p>👉 실행결과</p>
<pre><code class="language-java">2022년 05월 05일 17시 19분 12초
2022년 05월 05일 오후 05시 19분 12초</code></pre>
<br>

<h3 id="✍-코드-예시2">✍ 코드 예시2)</h3>
<pre><code class="language-java">import java.util.Calendar;

// 캘린더 클래스를 파라미터로 전달받아, 그 객체가 포함하고 있는
// 시간을 출력하는 메서드
public class DatePrinter {

    public static void printDateTime(Calendar cal) {

        int yy = cal.get(Calendar.YEAR);
        int mm = cal.get(Calendar.MONTH) + 1;
        int dd = cal.get(Calendar.DAY_OF_MONTH);
        int hh = cal.get(Calendar.HOUR_OF_DAY);
        int mi = cal.get(Calendar.MINUTE);
        int ss = cal.get(Calendar.SECOND);

        System.out.printf(&quot;%04d년 %02d월 %02d일 %02d시 %02d분 %02d초\n&quot;
                        ,yy, mm, dd, hh, mi, ss);

    }

}</code></pre>
<pre><code class="language-java">import java.util.Calendar;

public class Main0 {

    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        DatePrinter.printDateTime(cal);
        System.out.println(&quot;-----------------------------&quot;);

        // 지금으로 부터 100일 후 
        cal.add(Calendar.DAY_OF_MONTH, 100);
        DatePrinter.printDateTime(cal);
        System.out.println(&quot;-----------------------------&quot;);

        // 75년 전
        cal.add(Calendar.YEAR, -75);
        DatePrinter.printDateTime(cal);
        System.out.println(&quot;-----------------------------&quot;);

        // 9시간 후
        cal.add(Calendar.HOUR, 9);
        DatePrinter.printDateTime(cal);
        System.out.println(&quot;-----------------------------&quot;);

        // 8달 후
        cal.add(Calendar.MONTH, 8);
        DatePrinter.printDateTime(cal);
        System.out.println(&quot;-----------------------------&quot;);

    }

}</code></pre>
<p>👉 실행결과</p>
<pre><code class="language-java">2022년 05월 05일 21시 36분 44초
-----------------------------
2022년 08월 13일 21시 36분 44초
-----------------------------
1947년 08월 13일 21시 36분 44초
-----------------------------
1947년 08월 14일 06시 36분 44초
-----------------------------
1948년 04월 14일 06시 36분 44초
-----------------------------</code></pre>
<p><br><br></p>
<h2 id="날짜--시간-설정하기">날짜 &amp; 시간 설정하기</h2>
<ul>
<li><h3 id="set메서드">set메서드</h3>
날짜와 시간을 원하는 값으로 변경하려면 set메서드를 사용하면 된다.</li>
</ul>
<br>

<h4 id="✍-코드-예시-1">✍ 코드 예시)</h4>
<pre><code class="language-java">import java.util.Calendar;

public class Main {

    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        DatePrinter.printDateTime(cal);

        // 특정 날짜로 지정
        cal.set(Calendar.YEAR, 2020);
        cal.set(Calendar.MONTH, 4);        // month는 0부터 시작해서 4로 했으면 5월이다.
        cal.set(Calendar.DAY_OF_MONTH, 5);
        cal.set(Calendar.HOUR_OF_DAY, 15);
        cal.set(Calendar.MINUTE, 30);
        cal.set(Calendar.SECOND, 33);
        DatePrinter.printDateTime(cal);

        // 특정 날짜로 지정(또 다른 방법)
        cal.set(1982, 5, 17);
        DatePrinter.printDateTime(cal);

        // 특정 날짜로 지정(또 다른 방법&gt; 시, 분, 초 포함 / 24시간제만 가능)
        cal.set(1982, 5, 17, 1, 2, 3);
        DatePrinter.printDateTime(cal);

        // 년, 월, 시, 분, 초는 가만히 두고, 날짜만 1일로 변경하는 경우
        cal.set(Calendar.DAY_OF_MONTH, 1);
        DatePrinter.printDateTime(cal);

    }

}</code></pre>
<p>👉 실행결과</p>
<pre><code class="language-java">2022년 05월 05일 21시 11분 00초
2020년 05월 05일 15시 30분 33초
1982년 06월 17일 15시 30분 33초
1982년 06월 17일 01시 02분 03초
1982년 06월 01일 01시 02분 03초</code></pre>
<br>

<h4 id="✍-코드-예시2-1">✍ 코드 예시2)</h4>
<pre><code class="language-java">import java.util.Calendar;

public class Main04 {

    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();

        // 요일에 해당하는 인덱스 (일 = 1 ~ 토 = 7)
        int day = cal.get(Calendar.DAY_OF_WEEK);
        System.out.println(&quot;요일 인덱스 = &quot; + day);

        // 요일을 출력하기
        String[] day_name = {&quot;일&quot;, &quot;월&quot;, &quot;화&quot;, &quot;수&quot;, &quot;목&quot;, &quot;금&quot;, &quot;토&quot;};
        System.out.println(&quot;요일 = &quot; + day_name[day - 1]);

        // 이번 달은 몇 주로 되어 있는가?
        int week_count = cal.getActualMaximum(Calendar.WEEK_OF_MONTH);
        System.out.println(&quot;이번 달은 &quot; + week_count + &quot;주로 되어 있다.&quot;);

        // 이번 달은 몇 일까지 있는가?
        int day_count = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        System.out.println(&quot;이번 달은 &quot; + day_count + &quot;일 까지 있다.&quot;);

        // 이번 달은 무슨 요일부터 시작하는가?
        cal.set(Calendar.DAY_OF_MONTH, 1);
        int first_day = cal.get(Calendar.DAY_OF_WEEK);
        System.out.println(&quot;이번 달의 시작 요일 인덱스 = &quot; + first_day);
        System.out.println(&quot;이번 달의 시작 요일 = &quot; + day_name[first_day - 1]);

    }

}</code></pre>
<p>👉 실행결과</p>
<pre><code class="language-java">요일 인덱스 = 5
요일 = 목
이번 달은 5주로 되어 있다.
이번 달은 31일 까지 있다.
이번 달의 시작 요일 인덱스 = 1
이번 달의 시작 요일 = 일</code></pre>
<p><br><br></p>
<hr>
<br>

<blockquote>
<h2 id="📝-형식화-클래스">📝 형식화 클래스</h2>
</blockquote>
<ul>
<li>숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 문자열로 표현할 수 있는 클래스이다.</li>
<li>java.text패키지에 포함되어 있다.</li>
</ul>
<p>형식화 클래스는 데이터를 정의된 패턴에 맞춰 형식화 할 수 있을 뿐만 아니라
역으로 형식화된 데이터에서 원래의 데이터를 얻어낼 수도 있다.</p>
<br>

<h2 id="decimalformat">DecimalFormat</h2>
<ul>
<li><p>숫자 형식 클래스</p>
</li>
<li><p>DecimalFormat은 숫자 데이터를 원하는 형식으로 표현하기 위해서 패턴을 사용한다.</p>
</li>
</ul>
<table>
<thead>
<tr>
<th align="center">기호</th>
<th align="center">의미</th>
</tr>
</thead>
<tbody><tr>
<td align="center">0</td>
<td align="center">10진수 (값이 없을 때는 0)</td>
</tr>
<tr>
<td align="center">#</td>
<td align="center">10진수</td>
</tr>
<tr>
<td align="center">.</td>
<td align="center">소수점</td>
</tr>
<tr>
<td align="center">-</td>
<td align="center">음수부호</td>
</tr>
<tr>
<td align="center">,</td>
<td align="center">단위 구분자</td>
</tr>
<tr>
<td align="center">E</td>
<td align="center">지수 기호</td>
</tr>
<tr>
<td align="center">;</td>
<td align="center">패턴구분자</td>
</tr>
<tr>
<td align="center">%</td>
<td align="center">퍼센트</td>
</tr>
<tr>
<td align="center"><code>\</code>u2030</td>
<td align="center">퍼밀 (퍼센트 * 10)</td>
</tr>
<tr>
<td align="center"><code>\</code>u00A4</td>
<td align="center">통화기호</td>
</tr>
<tr>
<td align="center">&#39;</td>
<td align="center">escape문자</td>
</tr>
</tbody></table>
<br>

<p>DecimalFormat 사용 방법</p>
<ul>
<li>적용할 패턴을 작성하여 DecimalFormat 생성자 매개값으로 지정해서 객체를 생성한 다음,</li>
<li>format() 메서드를 호출하면 패턴이 적용된 문자열을 얻을 수 있다.</li>
</ul>
<br>

<p>✍ 코드 예시)</p>
<pre><code class="language-java">import java.text.DecimalFormat;

public class Main {

    public static void main(String[] args) {

        double num = 1234567.89;

        DecimalFormat df = new DecimalFormat(&quot;#,###.0&quot;);
        String result = df.format(num);

        System.out.println(result);

    }

}</code></pre>
<p>👉 실행결과</p>
<pre><code class="language-java">1,234,567.9</code></pre>
<p><br><br></p>
<h2 id="simpledateformat">SimpleDateFormat</h2>
<ul>
<li><p>날짜 형식 클래스</p>
</li>
<li><p>날짜를 원하는 형식으로 표현하기 위해서 패턴을 사용한다.</p>
</li>
</ul>
<table>
<thead>
<tr>
<th align="center">기호</th>
<th align="center">의미</th>
</tr>
</thead>
<tbody><tr>
<td align="center">G</td>
<td align="center">연대 (BC, AD)</td>
</tr>
<tr>
<td align="center">y</td>
<td align="center">년도</td>
</tr>
<tr>
<td align="center">M</td>
<td align="center">월 (1<del>12 또는 1월</del>12월)</td>
</tr>
<tr>
<td align="center">w</td>
<td align="center">년의 몇 번째 주 (1~53)</td>
</tr>
<tr>
<td align="center">W</td>
<td align="center">월의 몇 번째 주 (1~5)</td>
</tr>
<tr>
<td align="center">D</td>
<td align="center">년의 몇 번째 일 (1~366)</td>
</tr>
<tr>
<td align="center">d</td>
<td align="center">월의 몇 번째 일( 1~31)</td>
</tr>
<tr>
<td align="center">F</td>
<td align="center">월의 몇 번째 요일 (1~5)</td>
</tr>
<tr>
<td align="center">E</td>
<td align="center">요일</td>
</tr>
<tr>
<td align="center">a</td>
<td align="center">오전/오후 (AM,PM)</td>
</tr>
<tr>
<td align="center">H</td>
<td align="center">시간 (0~23)</td>
</tr>
<tr>
<td align="center">k</td>
<td align="center">시간 (1~24)</td>
</tr>
<tr>
<td align="center">K</td>
<td align="center">시간 (0~11)</td>
</tr>
<tr>
<td align="center">h</td>
<td align="center">시간 (1~12)</td>
</tr>
<tr>
<td align="center">m</td>
<td align="center">분 (0~59)</td>
</tr>
<tr>
<td align="center">s</td>
<td align="center">초 (0~59)</td>
</tr>
<tr>
<td align="center">S</td>
<td align="center">천분의 일초 (0~999)</td>
</tr>
<tr>
<td align="center">z</td>
<td align="center">Time zone (General time zone)<br><br>ex) GMT+9:00</td>
</tr>
<tr>
<td align="center">Z</td>
<td align="center">Time zone (RFC 822 time zone)<br><br>ex) +0900</td>
</tr>
<tr>
<td align="center">&#39;</td>
<td align="center">escape문자 (특수문자를 표현하는데 사용)</td>
</tr>
</tbody></table>
<br>

<p>SimpleDateFormat 사용 방법</p>
<ul>
<li>적용할 패턴을 작성하여 SimpleDateFormat 생성자 매개값으로 지정해서 객체를 생성한 다음,</li>
<li>format(Date d)를 호출하면 지정한 출력형식에 맞게 변환된 문자열을 얻을 수 있다.</li>
</ul>
<br>

<p>✍ 코드 예시)</p>
<pre><code class="language-java">import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {

    public static void main(String[] args) {

        Date today = new Date();

        SimpleDateFormat sdf = new SimpleDateFormat(&quot;yyyy-MM-dd \n오늘은 올 해의 w번째 주입니다.&quot;);
        String result = sdf.format(today);

        System.out.println(result);
    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">2022-05-06 
오늘은 올 해의 19번째 주입니다.</code></pre>
<p><br><br></p>
<h2 id="messageformat">MessageFormat</h2>
<ul>
<li><p>문자열 형식 클래스</p>
</li>
<li><p>MessageFormat 클래스를 사용하면 문자열에 데이터가 들어갈 자리를
표시해 두고, 프로그램이 실행하면서 동적으로 데이터를 삽입해
문자열을 완성시킬 수 있다.</p>
</li>
<li><p>MessageFormat은 정적 format() 메서드를 호출해서 완성된 문자열을 리턴시킨다.</p>
<ul>
<li>메서드의 첫 번째 파라미터는 매개 변수화된 문자열을 지정,
두 번째 이후 파라미터는 인덱스 순서에 맞게 값을 나열하면 된다.</li>
</ul>
</li>
</ul>
<br>

<p>✍ 코드 예시)</p>
<pre><code class="language-java">public class Main {

    public static void main(String[] args) {

        String id = &quot;java&quot;;
        String name = &quot;자바&quot;;
        String tel = &quot;010-1234-1234&quot;;

        String text = &quot;id : {0}, 이름 : {1}, 전화번호 : {2}&quot;;
        String result = MessageFormat.format(text, id, name, tel);

        System.out.println(result);

    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">id : java, 이름 : 자바, 전화번호 : 010-1234-1234</code></pre>
<p><br><br><br>
<br><br></p>
<hr>
<br>

<pre><code>참고자료 : &lt;Java의 정석&gt;, &lt;이것이 자바다&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 예외처리]]></title>
            <link>https://velog.io/@hyun_ha/JAVA-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@hyun_ha/JAVA-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Thu, 05 May 2022 01:00:14 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="📝-프로그램-오류">📝 프로그램 오류</h2>
</blockquote>
<ul>
<li>프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로
종료되는 경우 이러한 원인을 프로그램 &#39;에러&#39; 또는 &#39;오류&#39;라고 한다.<blockquote>
<br></blockquote>
</li>
<li>이를 발생시점에 따라 &#39;컴파일 에러&#39;와 &#39;런타임 에러&#39;로 나눌 수 있다.</li>
</ul>
<p><br><br></p>
<h2 id="👾-에러의-종류">👾 에러의 종류</h2>
<ul>
<li><h3 id="컴파일-에러">컴파일 에러</h3>
<ul>
<li><p>소스코드의 구문 오류로 인하여 컴파일이 불가능한 상태</p>
</li>
<li><p>이클립스에서 빨간색으로 표시되는 경우 해당한다.</p>
</li>
<li><p>프로그램을 실행하기 전에 발견되므로 상대적으로 고치기 쉽다.</p>
</li>
</ul>
</li>
</ul>
<br> 

<ul>
<li><h3 id="런타임-에러">런타임 에러</h3>
<ul>
<li><p>구문상의 에러는 없지만, 프로그램이 실행되는 과정에서 다양한
 경우의 수에 대응하지 못하여 발생하는 예외상황</p>
</li>
<li><p>런타임 에러가 발생하면 프로그램은 강제로 종료된다.</p>
</li>
<li><p>우리가 프로그램의 에러라고 부르는 현상은 대부분 런타임 에러에
해당한다.</p>
</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h2 id="런타임-에러의-종류">런타임 에러의 종류</h2>
<ul>
<li><h3 id="논리-오류">논리 오류</h3>
<ul>
<li>프로그램 자체의 구조적인 문제로 인한 오류로 논리적 모순이
생기지 않도록 코드를 작성해야 한다.<br>  </li>
</ul>
</li>
<li><h3 id="자바-가상머신-자체의-오류">자바 가상머신 자체의 오류</h3>
<ul>
<li>프로그래머가 책임질 수 있는 수준의 오류가 아니다.<br></li>
</ul>
</li>
<li><h3 id="예외exception">예외(Exception)</h3>
<ul>
<li><p>프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류</p>
</li>
<li><p>자바 가상 머신은 프로그램 실행중에 예외가 발생하면
관련된 예외 클래스로부터 예외 객체를 생성하여 프로그램에서 지정된
예외처리 구문으로 넘긴다.</p>
</li>
<li><p>예외가 발생하면 프로그램에 지정된 예외 처리 구문이 자바 가상머신에
의해 호출되고, 이때 전달되는 예외 객체를 넘겨받아 적절한 처리를
수행한다.</p>
</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h2 id="예외처리---try--catch문">예외처리 - (try ~ catch문)</h2>
<ul>
<li><p>예외처리란?
: 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에
대비한 코드를 작성하는 것이다.</p>
</li>
<li><p>예외처리의 목적 
: 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지할 수
있도록 하는 것이다.</p>
</li>
</ul>
<br>

<h3 id="try--catch문">try ~ catch문</h3>
<ul>
<li>예외를 처리하기 위해서는 try-catch문을 사용한다.<br>

</li>
</ul>
<h4 id="📌-try--catch문-구조">📌 try ~ catch문 구조</h4>
<pre><code class="language-java">    try{
        // 기본적으로 실행되는 부분
    } catch (예외클래스이름 객체이름) {
        // try 블록에서 예외가 발생한 경우 이 곳으로 제어가 넘어온다.
    } finally {
        // 예외 상황의 발생 여부에 상관 없이 무조건 실행되는 부분
        // finally 블록은 생략 가능하다.
    }</code></pre>
<ul>
<li><p>try 블록 실행도중 catch에서 명시한 예외 클래스에 해당하는 런타임 에러가
발생하면, try 블록을 즉시 중단하고 catch 블록이 실행 된 후, finally 블록이
실행된다.</p>
</li>
<li><p>예외가 발생하지 않을 경우에는 try 블록 종료 후 finally 블록이 실행된다.</p>
</li>
</ul>
<br>

<h4 id="catch블록을-사용한-복잡한-에러처리">catch블록을 사용한 복잡한 에러처리</h4>
<ul>
<li>catch 블록은 에러가 예상되는 상황에 대해 복수로 명시하는 것이 가능하다.</li>
</ul>
<pre><code class="language-java">    try{
        // 
    } catch (NumberFormatException e) {
    } catch (ArrayIndexOutOfBoundsException e) {
    }</code></pre>
<p><br><br></p>
<h3 id="✍-코드-예시---런타임-에러가-발생한-경우">✍ 코드 예시 - 런타임 에러가 발생한 경우</h3>
<pre><code class="language-java">public class Main {

    public static void main(String[] args) {

        String year = &quot;두 살&quot;;
        int age = 2022 - Integer.parseInt(year) + 1;
        System.out.println(age);

        System.out.println(&quot;--------프로그램 종료--------&quot;);

    }

}</code></pre>
<p>👉 실행 결과</p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/f8c53540-d867-4104-bef7-9c56e8cf4194/image.PNG" alt=""></p>
<p>문자열은 숫자로 변환할 수 없으므로, 에러가 발생한다.</p>
<ul>
<li>java 프로그램은 예외 상황을 만나면 그 즉시 실행을 중단하고 강제 종료 된다.</li>
<li>때문에 이 프로그램의 맨 마지막에 출력하려는 메시지는 표시되지 않는다.</li>
</ul>
<p><br><br></p>
<h3 id="✍-코드-예시---try--catch문">✍ 코드 예시 - try ~ catch문</h3>
<pre><code class="language-java">public class Main {

    public static void main(String[] args) {

        try {
            String year = &quot;두 살&quot;;
            int age = 2022 - Integer.parseInt(year) + 1;
            System.out.println(age);
        } catch (NumberFormatException e) {
            System.out.println(&quot;에러가 발생했습니다.&quot;);
        }

        System.out.println(&quot;--------프로그램 종료--------&quot;);

    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">에러가 발생했습니다.
--------프로그램 종료--------</code></pre>
<p>try ~ catch 블록으로 예외처리가 적용된 경우에는, 에러가 발생하더라도
프로그램 자체가 다운되지는 않는다.</p>
<p><br><br></p>
<h2 id="예외-클래스의-종류">예외 클래스의 종류</h2>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/061592b3-1001-4dd6-8ff0-66f96af4d001/image.PNG" alt=""></p>
<p>예외 종류를 의미하는 모든 클래스는 java.lang.Exception 클래스를 상속받는다.</p>
<p><br><br></p>
<h2 id="exception-클래스">Exception 클래스</h2>
<ul>
<li><p>Java에서 예외 상황을 의미하는 모든 클래스들의 최상위 클래스</p>
</li>
<li><p>Exception 클래스로 catch 블록을 구성하면, 모든 예외 상황에 일괄적으로 대응할 수 있지만,
catch 블록이 세분화된 경우와는 달리 상황별 개별적인 처리는 불가능하다.</p>
</li>
<li><p>Exception 클래스에 대한 예외처리는 <span style="color:red">맨 마지막</span> catch 블록에 명시하여
&#39;마지막 알 수 없는 에러&#39;를 의미하도록 구성한다.</p>
</li>
</ul>
<pre><code class="language-java">    try{
        //
    } catch (NumberFormatException e) {
    } catch (ArrayIndexOutOfBoundsException e) {
    } catch (Exception e) {
    } </code></pre>
<p><br><br></p>
<h2 id="printstacktrace--getmessage">printStackTrace() &amp; getMessage()</h2>
<ul>
<li><p>printStackTrace() 또는 getMessage()와 같은 메서드를 통해서
예외의 발생원인을 알 수 있다.</p>
</li>
<li><p>printStackTrace()</p>
<ul>
<li>실제 예외 상황시에 출력되는 메시지를 강제로 출력한다.</li>
<li>개발자가 catch 블록 안에서 예외 상황을 분석하기 위한 용도로 사용한다.</li>
</ul>
</li>
<li><p>getMessage()</p>
<ul>
<li>간략한 에러 메시지를 리턴한다.</li>
<li>e.getLocalisMessage()도 같은 기능을 한다.<br>

</li>
</ul>
</li>
</ul>
<h4 id="✍--코드-예시">✍  코드 예시)</h4>
<pre><code class="language-java">public class Main {

    public static void main(String[] args) {

        try {
            String year = &quot;두 살&quot;;
            int age = 2022 - Integer.parseInt(year) + 1;
            System.out.println(age);
        } catch (NumberFormatException e) {
            System.out.println(&quot;에러가 발생했습니다.&quot;);
            System.out.println(&quot;원인 : &quot; + e.getMessage());

            // 개발자가 보려는 용도로 출력하는 시스템 에러 메시지
            e.printStackTrace();
        }

        System.out.println(&quot;--------프로그램 종료--------&quot;);

    }

}</code></pre>
<p>👉 실행결과</p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/00de5639-d1b8-4322-96b8-0f65ef7ca430/image.PNG" alt=""></p>
<p>이 결과는 비정상적으로 종료되었을 때의 결과와 비슷하지만
예외는 try-catch문에 의해 처리되었으며 프로그램은 정상적으로 종료되었다.</p>
<p><br><br></p>
<h2 id="예외-발생시키기">예외 발생시키기</h2>
<ul>
<li><p>throw 키워드를 사용해서 프로그래머가 고의로 예외를 발생시킬 수 있다.</p>
</li>
<li><p>예외 발생시키는 방법</p>
<ol>
<li>new 연산자를 이용해서 발생시키려는 예외 클래스의 객체를 만든다.<pre><code class="language-java">Exception e = new Exception(&quot;고의로 발생시킴&quot;);</code></pre>
</li>
<li>throw 키워드를 이용해서 예외를 발생시킨다.<pre><code class="language-java">throw e;</code></pre>
</li>
</ol>
</li>
</ul>
<br>

<h3 id="✍-코드예시">✍ 코드예시)</h3>
<pre><code class="language-java">public class Main {

    public static void main(String[] args) {

        try {
            Exception e = new Exception(&quot;고의로 발생시킴&quot;);
            throw e;
        } catch (Exception e) {
            System.out.println(&quot;에러 메시지 : &quot; + e.getMessage());
            e.printStackTrace();
        }
        System.out.println(&quot;-----프로그램 정상 종료-----&quot;);
    }

}</code></pre>
<p>👉 실행결과</p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/1482e499-b1d2-4fd8-8a87-b2f06f3c488e/image.PNG" alt=""></p>
<p>Exception인스턴스를 생성할 때, 생성자에 String을 넣어주면,
이 String이 Exception인스턴스에 메시지로 저장된다.
이 메시지는 getMessage()를 이용해서 얻을 수 있다.</p>
<p><br><br></p>
<h2 id="메서드에-예외-선언하기">메서드에 예외 선언하기</h2>
<ul>
<li><p>예외를 처리하는 방법에는 try-catch문을 사용하는 것 외에,
예외를 메서드에 선언하는 방법이 있다. 
이때 사용하는 키워드는 throws이다.</p>
</li>
<li><p>throws 키워드는 메서드에서 처리하지 않은 예외를 호출한 곳으로
떠넘기는 역할을 한다.</p>
<br></li>
<li><p>메서드에 예외 선언하는 방법</p>
<ul>
<li><p>throws 키워드를 메서드 선언부 끝에 작성한다.</p>
</li>
<li><p>예외가 여러 개일 경우에는 쉼표( , )로 구분한다.</p>
<pre><code class="language-java">리턴타입 메서드명() throws Exception1, Exception2 .. ExceptionN {
      // 메서드 내용
}</code></pre>
</li>
<li><p>아래와 같이 모든 예외의 최고조상인 Exception클래스를 메서드에 
선언하면, 모든 예외를 간단히 떠넘길 수도 있다.</p>
<pre><code class="language-java">리턴타입 메서드명() throws Exception{
      // 메서드 내용
}</code></pre>
<br>
### ✍ 코드예시)
```java
public class Example {

<p>public void method(String year) throws NumberFormatException{</p>
<pre><code>int age = 2022 - Integer.parseInt(year) + 1;

System.out.println(age);</code></pre><p>}</p>
</li>
</ul>
</li>
</ul>
<p>}</p>
<pre><code>```java
// Main 클래스
public class Main {

    public static void main(String[] args) {

        Example ex = new Example();

        try {
            ex.method(&quot;천구백오십년&quot;);    // 메서드 호출
        } catch (NumberFormatException e) {
            System.out.println(&quot;입력값이 숫자가 아닙니다.&quot;);    
        }
    }

}</code></pre><p>👉 실행결과</p>
<pre><code class="language-java">입력값이 숫자가 아닙니다.</code></pre>
<br>

<h4 id="코드-예시-설명">코드 예시 설명</h4>
<p>throws 키워드가 붙어있는 method()메서드를 사용할 때 
NumberFormatException 예외가 발생하면, 메서드를 사용한 곳에서
예외처리를 해야한다.</p>
<p>그래서 코드 예시에서 method()를 호출하는 main()메서드에서 
try-catch문으로 예외 처리를 했다.</p>
<br>

<h3 id="📙-throws-키워드-정리">📙 throws 키워드 정리</h3>
<ul>
<li>throws 키워드가 붙어있는 메서드는 반드시 try 블록 내에서 
호출되어야 한다.</li>
<li>그리고 catch 블록에서 떠넘겨 받은 예외를 처리해야 한다.<br></li>
<li>main() 메서드에서도 throws 키워드를 사용해서 예외를 떠넘길 수 있는데.
결국 JVM이 예외의 내용을 console에 출력하는 것으로 예외 처리를 한다.<ul>
<li>하지만 main()메서드에서 throws Exception을 붙이는 것은
사용자가 프로그램이 알 수 없는 예외 내용을 출력하고 종료되기 때문에
좋지 못한 예외 처리 방법이다.</li>
<li>그렇기 때문에 main()에서 try-catch문으로 최종 처리하는 것이
가장 바람직하다.</li>
</ul>
</li>
</ul>
<p><br><br><br>
<br><br><br></p>
<hr>
<pre><code>참고자료 : &lt;Java의 정석&gt;, &lt;이것이 자바다&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Git & GitHub] Git의 작업 영역 & 파일 상태]]></title>
            <link>https://velog.io/@hyun_ha/Git-GitHub-Git%EC%9D%98-3%EA%B0%80%EC%A7%80-%EC%9E%91%EC%97%85-%EC%98%81%EC%97%AD</link>
            <guid>https://velog.io/@hyun_ha/Git-GitHub-Git%EC%9D%98-3%EA%B0%80%EC%A7%80-%EC%9E%91%EC%97%85-%EC%98%81%EC%97%AD</guid>
            <pubDate>Wed, 04 May 2022 13:35:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="📌-git은-내부적으로-크게-3가지-종류의-작업-영역을-가지고-있다">📌 Git은 내부적으로 크게 3가지 종류의 작업 영역을 가지고 있다.</h3>
</blockquote>
<ol>
<li><p>working directory</p>
</li>
<li><p>staging area</p>
</li>
<li><p>repository</p>
<br>


</li>
</ol>
<h2 id="📝-1-working-directory-working-tree">📝 1. working directory (working tree)</h2>
<ul>
<li>첫 번째 작업영역인 working directory는 작업을 하는 프로젝트 디렉토리를 말한다.</li>
<li>.git 디렉토리를 제외한 모든 영역이다.</li>
</ul>
<br>

<h2 id="📝-2--staging-area-index">📝 2.  staging area (index)</h2>
<ul>
<li>두 번째 작업영역인 staging area는 git add를 한 파일들이 존재하는 영역이다.</li>
<li>이 곳에 있는 파일들만 커밋에 반영된다.</li>
</ul>
<br>

<h2 id="📝-3-repository">📝 3. repository</h2>
<ul>
<li>working directory의 변경 이력들이 저장되어 있는 영역이다.
즉, 커밋들이 저장되는 영역이다.</li>
<li>.git 디렉토리가 repository이다.  </li>
</ul>
<p><br><br></p>
<h2 id="작업-영역의-관계">작업 영역의 관계</h2>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/0b896c52-ab2b-4d10-bcb7-a885cc5372c9/image.PNG" alt=""></p>
<ol>
<li><p>working directory에서 A.txt 파일과 B.txt 파일을 작성하고</p>
</li>
<li><p>git add A.txt와 git add B.txt를 실행해서 staging area에 올라간다.</p>
</li>
<li><p>git commit -m &quot;1st commit&quot;을 실행해서
staging area에 있던 파일들의 모습이 스냅샷처럼 하나의 버전으로 Repository에 저장된다.</p>
</li>
</ol>
<p><br><br></p>
<h3 id="예시">예시)</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/78a68c72-8686-4048-87c7-3ad1c6c6557c/image.png" alt=""></p>
<ul>
<li><p>working directory에서 A, B.txt의 내용을 추가하고</p>
</li>
<li><p>git add B.txt만 실행해서 B.txt 파일만 staging area에 올렸을 때</p>
</li>
<li><p>git commit -m &quot;2nd commit&quot;을 하면 
A.txt는 수정전, B.txt는 수정후 파일이 커밋에 반영되었다.</p>
</li>
</ul>
<p>❗❗ 즉 working directory에서 수정을 해도 staging area에 올렸는지 여부에 따라 
그 최신 모습이 커밋에 반영되는지가 달라진다.</p>
<p><br><br></p>
<hr>
<p><br><br></p>
<blockquote>
<h3 id="📌-git으로-관리되는-파일은-4가지의-상태status를-가지고-있다">📌 Git으로 관리되는 파일은 4가지의 상태(status)를 가지고 있다.</h3>
</blockquote>
<ul>
<li>Untracked </li>
<li>Staged </li>
<li>Unmodified </li>
<li>Modified </li>
</ul>
<p>Git에서 파일들은 크게 2가지 상태를 가진다.</p>
<ul>
<li>Untracked</li>
<li>Tracked</li>
</ul>
<p>그리고 Tracked 상태는 다시 3가지 상태로 나눌 수 있다.</p>
<ul>
<li>Staged </li>
<li>Unmodified</li>
<li>Modified</li>
</ul>
<br>

<h2 id="📝-1-untracked">📝 1. Untracked</h2>
<ul>
<li><p>Untracked는 &#39;추적되지 않고 있는&#39;이라는 뜻으로
파일이 Git에 의해서 그 변동사항이 전혀 추적되고 있지 않는 상태</p>
</li>
<li><p>파일을 새로 생성하고 그 파일을 한 번도 git add 해주지 않은 상태를 
Untracked라고 한다. </p>
</li>
</ul>
<br>

<h2 id="📝-2-tracked">📝 2. Tracked</h2>
<ul>
<li>파일이 Git에 의해 그 변동사항이 추적되고 있는 상태</li>
<li>Tracked 상태는 그 특성에 따라 3가지 상태로 나뉜다.</li>
</ul>
<br>

<h3 id="2-1-staged">2-1. Staged</h3>
<ul>
<li>staging area에 올라와있는 상태를 말한다.</li>
</ul>
<pre><code>새로 생성한 파일에 내용을 쓰고 git add를 해주거나,

한 번이라도 커밋에 포함됐었던 파일이라도 내용을 수정하고 git add를 해주면 이 상태이다.</code></pre><br>

<h3 id="2-2-unmodified">2-2. Unmodified</h3>
<ul>
<li><p>현재 파일의 내용이 최신 커밋의 모습과 비교했을 때 전혀 바뀐 게 없는 상태면
그 파일은 Unmodified(수정되지 않은, 변한 게 없는) 상태이다.</p>
</li>
<li><p>커밋을 하고 난 직후에는 working directory 안의 모든 파일들이 이 상태이다.</p>
</li>
</ul>
<br>

<h3 id="2-3-modified">2-3. Modified</h3>
<ul>
<li>최신 커밋의 모습과 비교했을 때 조금이라도 바뀐 내용이 있는 상태면
그 파일은 Modified(수정된) 상태이다.</li>
</ul>
<p><br><br></p>
<h2 id="파일의-라이프사이클">파일의 라이프사이클</h2>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/f1e91c32-b9a5-4712-a16a-5e6473ae6ca4/image.png" alt=""></p>
<table>
<thead>
<tr>
<th align="center">상황</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">Add the file</td>
<td align="center">Untracked 상태의 파일을 처음으로 git add 해주면 Staged 상태가 된다.</td>
</tr>
<tr>
<td align="center">Edit the file</td>
<td align="center">최신 커밋과 비교했을 때 차이가 없는 Unmodified 상태의 파일의 내용을 수정하면 Modified 상태가 된다.</td>
</tr>
<tr>
<td align="center">Stage the file</td>
<td align="center">Modified 상태의 파일을 git add 해주면 Staged 상태가 된다.</td>
</tr>
<tr>
<td align="center">Remove the file</td>
<td align="center">파일을 삭제하면 Git에서 더이상 인식하지 못하는 Untracked 상태가 된다.</td>
</tr>
<tr>
<td align="center">Commit</td>
<td align="center">커밋을 하면 staging area에 있던 파일들이 커밋에 반영되고, <br>이제 모든 파일들은 최신 커밋과 차이가 없게 되니까 Unmodified 상태가 된다.</td>
</tr>
</tbody></table>
<p><br><br><br>
<br><br><br></p>
<hr>
<pre><code>이 글은 CODEIT의 강의를 기반으로 작성했습니다.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 정규 표현식 & Pattern 클래스]]></title>
            <link>https://velog.io/@hyun_ha/JAVA-%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D-Pattern-%ED%81%B4%EB%9E%98%EC%8A%A4</link>
            <guid>https://velog.io/@hyun_ha/JAVA-%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D-Pattern-%ED%81%B4%EB%9E%98%EC%8A%A4</guid>
            <pubDate>Sun, 01 May 2022 09:46:08 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="📝-정규-표현식">📝 정규 표현식</h2>
</blockquote>
<ul>
<li><p>특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 &#39;형식언어&#39;이다.</p>
</li>
<li><p>정규표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 &#39;문자열의 검색과 치환&#39;을
위해 지원하고 있다.</p>
</li>
<li><p>java.util.regex 패키지에 포함되어있다.</p>
</li>
</ul>
<br>

<h2 id="정규-표현식-종류">정규 표현식 종류</h2>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/33113d97-822c-41c8-8a5b-f902768e9a0a/image.PNG" alt="">
출처 <a href="https://hamait.tistory.com/342">https://hamait.tistory.com/342</a></p>
<p><br><br></p>
<blockquote>
<h2 id="📝-pattern-클래스">📝 Pattern 클래스</h2>
</blockquote>
<ul>
<li>Pattern 클래스의 matches()메서드는 문자열을 정규 표현식으로
검증하는 기능을 한다.</li>
</ul>
<pre><code class="language-java">boolean java.util.regex.Pattern.matches(String arg0, CharSequence arg1);</code></pre>
<ul>
<li>arg0 : 정규표현식 문자열이다.</li>
<li>arg1 : 형식을 검사받기 위한 내용이다.</li>
<li>즉 위의 기능은 arg1이 arg0의 형식에 맞는지를 검사하고
결과를 boolean으로 리턴한다.</li>
</ul>
<br/>

<h3 id="✍-코드-예시">✍ 코드 예시)</h3>
<pre><code class="language-java">import java.util.regex.Pattern;

public class Main {

    public static void main(String[] args) {

        // 회원가입시에 입력한 내용을 가정한 변수값들
        String name = &quot;자바학생&quot;;
        String age = &quot;22&quot;;
        String email = &quot;user@java.com&quot;;
        String phone = &quot;01012345678&quot;;

        // 한글 여부 검사
        boolean isKor = Pattern.matches(&quot;^[ㄱ-ㅎ가-힣]*$&quot;, name);

        if (!isKor) {
            System.out.println(&quot;이름은 한글로 입력해 주세요.&quot;);
            return;
        }

        // 숫자인지 검사
        boolean isNum = Pattern.matches(&quot;^[0-9]*$&quot;, age);

        if (!isNum) {
            System.out.println(&quot;나이는 숫자로만 입력해 주세요.&quot;);
            return;
        }

        // 이메일 검사
        boolean isEmail = Pattern.matches(&quot;^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$&quot;, email);

        if (!isEmail) {
            System.out.println(&quot;이메일 형식이 맞지 않습니다.&quot;);
            return;
        }

        // 휴대폰 형식 검사
        boolean isPhone = Pattern.matches(&quot;^01(?:0|1|[6-9])(?:\\d{3}|\\d{4})\\d{4}$&quot;, phone);

        if (!isPhone) {
            System.out.println(&quot;전화번호 형식이 맞지 않습니다.&quot;);
            return;
        }

        System.out.println(&quot;회원가입 절차를 시작합니다.&quot;);

    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">회원가입 절차를 시작합니다.</code></pre>
</br>

<h3 id="✍-코드-예시2-">✍ 코드 예시2 )</h3>
<p>❗ 정규식과 일치하지 않을 경우</p>
<pre><code class="language-java">import java.util.regex.Pattern;

public class Main {

    public static void main(String[] args) {

        String name = &quot;java학생&quot;;

        // 한글 여부 검사
        boolean isKor = Pattern.matches(&quot;^[ㄱ-ㅎ가-힣]*$&quot;, name);

        if (!isKor) {
            System.out.println(&quot;정규식과 일치하지 않습니다.&quot;);
            return;
        } else {
            System.out.println(&quot;정규식과 일치합니다.&quot;);
        }

    }    
}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">정규식과 일치하지 않습니다.</code></pre>
<p><br><br><br>
<br><br><br></p>
<hr>
<pre><code>참고자료 : &lt;이것이 자바다&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] Wrapper Class]]></title>
            <link>https://velog.io/@hyun_ha/JAVA-Wrapper-Class</link>
            <guid>https://velog.io/@hyun_ha/JAVA-Wrapper-Class</guid>
            <pubDate>Fri, 29 Apr 2022 05:05:44 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="📝-wrapper-class">📝 Wrapper Class</h2>
</blockquote>
<ul>
<li><p>포장 클래스(Wrapper Class)는 특정 기본형 타입을 객체로 다룰 때 사용된다.</p>
</li>
<li><p>Java는 데이터를 관리하기 위하여 기본 데이터 타입을 지원하지만,
 클래스를 통해서 만들어진 객체를 통한 데이터 관리도 가능하다.</p>
</li>
<li><p>어떤 상황에서는 기본 데이터 타입의 변수를 객체 형태로 사용해야 하는 경우가
 있는데, 이때 기본형 타입을 객체로 포장할 필요가 있다.</p>
</li>
</ul>
<p><br><br></p>
<h2 id="wrapper-class의-종류">Wrapper class의 종류</h2>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/7848839b-1c0f-4e0c-92b0-fab427eff0c6/image.PNG" alt=""></p>
<p><br><br></p>
<h2 id="boxing--unboxing">Boxing &amp; Unboxing</h2>
<ul>
<li><h3 id="boxing">Boxing</h3>
<ul>
<li>기본 타입의 값을 wrapper class의 객체로 만드는 과정</li>
<li>wrapper class의 생성자 파라미터값으로 기본타입의 값 또는
문자열을 넘겨주면 된다.<pre><code class="language-java">Integer wrapper = new Integer(10);</code></pre>
<br>
</li>
</ul>
</li>
<li><h3 id="unboxing">Unboxing</h3>
<ul>
<li>wrapper class에서 기본 타입의 값을 얻어내는 과정</li>
<li>각 wrapper class마다 가지고 있는 &quot;기본타입명 + Value()&quot; 메소드를 호출하면 된다.<pre><code class="language-java">int num = wrapper.intValue();</code></pre>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="autoboxing--autounboxing">AutoBoxing &amp; AutoUnBoxing</h3>
<ul>
<li><p>기본 자료형과 Wrapper 클래스 간에는 서로 암묵적 형변환이 가능하다.</p>
</li>
<li><p>AutoBoxing은 Wrapper 클래스 타입에 기본값이 대입될 경우,
AutoUnBoxing은 기본 타입에 wrapper class의 객체가 대입될 경우 발생한다.</p>
<pre><code class="language-java">int num = 100;
Integer wrpper = num;        // 자동 박싱 (AutoBoxing)</code></pre>
</li>
</ul>
<hr>
<p>Integer wrapper2 = new Integer(200);
int num = wrapper2;            // 자동 언박싱 (AutoUnBoxing)</p>
<pre><code>
&lt;br&gt;&lt;br&gt;

## Wrapper 클래스의 static 데이터
- 모든 Wrapper 클래스는 static 데이터 형태로 Wrapper 클래스에 대응되는
   자료형에 대한 최소 값과 최대 값을 가지고 있다.
```java
int max = Integer.MAX_VALUE;
int min = Integer.MIN_VALUE;</code></pre><p><br><br></p>
<h2 id="문자열-데이터의-형변환">문자열 데이터의 형변환</h2>
<ul>
<li><p>wrapper 클래스의 가장 중요한 기능은 기본 자료형의 모양을 띄고 있는 
문자열 데이터를 실제 기본 자료형으로 변환시키는 기능이다.</p>
</li>
<li><p>대부분의 wrapper 클래스에는 &#39;parse + 기본타입&#39; 메소드를 이용해 
문자열을 파라미터로 받아 기본 타입 값으로 변환한다.</p>
<ul>
<li>이때 각 자료형에 알맞은 문자열을 사용해야 한다. </li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/83c9abd3-6747-4608-a2f1-787e97976558/image.PNG" alt=""></p>
<br>

<p>✍ 코드 예시</p>
<pre><code class="language-java">public class Main {

    public static void main(String[] args) {
        String a = &quot;20&quot;;
        String b = &quot;3.14&quot;;

        System.out.println(a + b);
        System.out.println(&quot;-------------------------------------&quot;);

        // 형변환
        int num_a = Integer.parseInt(a);
        float num_b = Float.parseFloat(b);

        System.out.println(num_a + num_b);
        System.out.println(&quot;-------------------------------------&quot;);

    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">203.14
-------------------------------------
23.14</code></pre>
<br>

<p>변환된 값은 사칙연산이 가능하다.
또한 기본 데이터 형과 객체화 된 데이터도 서로 연산이 가능하다.     </p>
<pre><code class="language-java">    int v1 = num_a + 500;
    float v2 = num_b + 500;
    System.out.println(&quot;v1 = &quot; + v1);
    System.out.println(&quot;v2 = &quot; + v2);
    System.out.println(&quot;-------------------------------------&quot;);

    // 기본 데이터 형의 객체화
    Integer i = new Integer(500);

    int j = i + 300;
    System.out.println(&quot;j = &quot; + j);
</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">v1 = 520
v2 = 503.14
-------------------------------------
j = 800
</code></pre>
<p><br><br></p>
<h2 id="wrapper-클래스-값-비교">Wrapper 클래스 값 비교</h2>
<ul>
<li><p>Wrapper 클래스의 객체는 내부의 값을 비교하는 것이 아니라 객체의
잠조를 비교하기 때문에 ==와 != 연산자를 사용할 수 없다.</p>
</li>
<li><p>그러므로 직접 내부 값을 언박싱해서 비교하거나, equals() 메서드로
내부 값을 비교해야 한다.</p>
</li>
<li><p>Wrapper 클래스들은 모두 equals()가 오버라이딩되어 있어서 주소값이 아닌 객체가
가지고 있는 값을 비교할 수 있다.</p>
<br>

</li>
</ul>
<p>✍ 코드 예시</p>
<pre><code class="language-java">public class Main {

    public static void main(String[] args) {
        Integer a = new Integer(200);
        Integer b = new Integer(200);

        System.out.println(&quot;equals() 결과 : &quot; + a.equals(b));
    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">equals() 결과 : true</code></pre>
<p>이렇게 equals()를 이용한 두 Integer객체의 비교결과가 ture라는 것을 알 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 패키지(Package) 정리]]></title>
            <link>https://velog.io/@hyun_ha/JAVA-%ED%8C%A8%ED%82%A4%EC%A7%80Package</link>
            <guid>https://velog.io/@hyun_ha/JAVA-%ED%8C%A8%ED%82%A4%EC%A7%80Package</guid>
            <pubDate>Tue, 26 Apr 2022 14:07:12 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="📝-패키지package">📝 패키지(Package)</h2>
</blockquote>
<ul>
<li><p>패키지란? </p>
<ul>
<li>클래스의 묶음으로 클래스를 용도별이나, 기능별로 그룹화 한 것을 말한다.  </li>
</ul>
</li>
<li><p>패키지는 물리적으로 하나의 디렉토리(파일 시스템의 폴더) 이다.</p>
</li>
<li><p>클래스를 유일하게 만들어주는 식별자 역할을 한다.</p>
</li>
<li><p>같은 이름의 클래스 일지라도 서로 다른 패키지에 존재하는 것이 가능하므로, 
자신만의 패키지 체계를 유지함으로써 충돌이 발생하지 않는다. </p>
</li>
</ul>
<p><br/><br/></p>
<h2 id="패키지-추가하기">패키지 추가하기</h2>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/52b84a77-5c68-4308-9fb9-7adac7df8ce8/image.PNG" alt=""></p>
<p>클래스의 전체 이름은 &quot;패키지명 + 클래스명&quot;인데 
패키지가 상,하위로 구분되어 있다면 도트( . )를 사용해서 다음과 같이 표현한다.</p>
<pre><code class="language-java">상위패키지.하위패키지.클래스</code></pre>
<br/>

<h3 id="패키지-추가하기-예시">패키지 추가하기 예시)</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/67fe24ea-0bb7-4fc0-96ef-f005115d94d2/image.PNG" alt=""></p>
<p>Car 클래스가 com.mycompany 패키지에 속해 있다면,</p>
<ul>
<li><p>Car 클래스의 전체 이름 -&gt; com.mycompany.Car </p>
</li>
<li><p>실제 파일 시스템  -&gt; com\mycompany 폴더에 Car.class가 위치한다.</p>
<br/>

</li>
</ul>
<p>예를 들어 Car 클래스가 com.mycompany 패키지에 소속되어 있을 경우, 
파일 시스템 com\yourcompany 폴더에 강제로 Car.class를 이동하면 Car 클래스를 사용할 수 없다.</p>
<ul>
<li>❗❗ 클래스만 따로 복사해서 다른 패키지로 이동하면 클래스는 사용할 수 <span style="color:red">없다</span>.<ul>
<li>즉, 클래스를 이동할 경우에는 패키지 전체를 이동시켜야 한다.</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<h2 id="패키지-선언">패키지 선언</h2>
<ul>
<li><p>패키지에 소속된 클래스 파일은 첫 번째 라인에서 자신이 소속된 클래스 패키지
 이름을 선언해야 한다.</p>
<pre><code class="language-java">package 패키지명;   </code></pre>
</li>
<li><p>패키지 선언은 하나의 소스파일에 단 한 번만 선언될 수 있다.</p>
</li>
<li><p>소스파일에 자신이 속할 패키지를 지정하지 않은 클래스는 자동적으로
&#39;이름 없는 패키지(unnamed package)&#39;에 속하게 된다.</p>
</li>
</ul>
<br/>

<p>여러 개발 회사가 함께 참여하는 대규모 프로젝트나, 다른 회사의 패키지를 이용해서
개발할 경우, 패키지 이름이 중복될 가능성이 있다. 
그래서 패키지가 중복되지 않도록 회사의 <strong>도메인 이름</strong>으로 패키지를 만든다.</p>
<p>도메인 이름으로 패키지를 만들 경우,
도메인 이름 역순 + 마지막에 프로젝트 이름을 붙여준다.
( 포괄적인 이름이 상위 패키지가 되도록 하기 위해 역순으로 한다.)</p>
<pre><code class="language-java">ex)
com.samsung.projectName
com.lg.projectName
com.hyudai.projectName</code></pre>
<p><br/><br/></p>
<h2 id="패키지-사용하기">패키지 사용하기</h2>
<p>같은 패키지에 속하는 클래스들은 아무런 조건 없이 다른 클래스를 사용할 수 있지만
<span style="color:red">다른</span> 패키지에 속하는 클래스를 사용하려면 두 가지 방법 중 하나를 선택해야 한다.
<br/></p>
<h3 id="1-패키지와-클래스를-모두-기술하는-방법">1. 패키지와 클래스를 모두 기술하는 방법</h3>
<ul>
<li>패키지에 속해 있는 클래스에 대한 객체 생성을 해야한다.</li>
<li>패키지 이름을 포함한 FullName으로 사용해야 한다.<br/>

</li>
</ul>
<p>예시)
com.hankook 패키지에 소속된 Tire 클래스를 이용해서 필드를 선언 후 객체를 생성</p>
<pre><code class="language-java">package com.mycompany;

public class Car {
    com.hankook.Tire tire = new com.hankook.Tire();
}</code></pre>
<ul>
<li>단점<ul>
<li>패키지 이름이 길거나 이렇게 사용해야 할 클래스 수가 많다면 
이 방법은 전체 코드를 난잡해 보이게 할 수 있다.</li>
</ul>
</li>
</ul>
<p>그래서 두 번째 방법인 import문을 주로 사용한다.  </p>
<br/>

<h3 id="2-import문">2. import문</h3>
<p>import문의 역할은 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를
제공하는 것이다. 
import문으로 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에
사용되는 클래스이름에서 패키지명은 <span style="color:red">생략</span>할 수 있다.
<br/></p>
<p>import문 선언</p>
<pre><code class="language-java">import 패키지명.클래스명;

        또는

import 패키지명.*;</code></pre>
<ul>
<li><p>패키지 선언과 클래스 사이에 선언해야 한다.</p>
</li>
<li><p>import문의 개수는 제한이 없다.</p>
</li>
<li><p>같은 패키지에서 여러 개의 클래스가 사용될 때, 
&#39; 패키지명.* &#39;을 이용해서 지정된 패키지에 속하는 모든 클래스를 패키지명 없이 
사용할 수 있다. </p>
<br/>

</li>
</ul>
<p>ex)</p>
<pre><code class="language-java">package com.mycompany;

import com.hankook.Tire;

public class Car {
    Tire tire = new Tire();
}</code></pre>
<p><br/><br/>
<br/></p>
<h2 id="🔥-패키지-사용시-주의할-점-🔥">🔥 패키지 사용시 주의할 점 🔥</h2>
<ul>
<li><p>import문으로 지정된 패키지의 하위 패키지는 import 대상이 아니다.</p>
<ul>
<li>하위 패키지에 있는 클래스들도 사용하고 싶다면 import문을 하나 더 작성해야 한다.</li>
</ul>
</li>
<li><p>서로 다른 패키지에 동일한 클래스 이름이 존재하고,
두 패키지가 모두 import되어 있을 경우 패키지 이름 전체를 기술해야 한다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git & GitHub]  시작하기]]></title>
            <link>https://velog.io/@hyun_ha/Git-GitHub-%EC%B4%88%EA%B8%B0-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@hyun_ha/Git-GitHub-%EC%B4%88%EA%B8%B0-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Sun, 24 Apr 2022 06:48:45 GMT</pubDate>
            <description><![CDATA[<h2 id="📝-1-사용자-정보-설정">📝 1. 사용자 정보 설정</h2>
<p>Git은 협업을 전제로 하는 버전 관리 도구이다.
따라서 작업을 할 때 누구의 작업인지 기록해야 한다. </p>
<p>Git에서는 commit을 할 때 사용할 이름과 이메일을 지정할 수 있으며, 
이 때 commit에 기록된 이메일은 GitHub의 사용자를 연결할 때도 사용된다.</p>
<h4 id="❗❗-처음-git을-설치한-후-한-번만-실행하면-된다">❗❗ 처음 git을 설치한 후 한 번만 실행하면 된다.</h4>
</br>

<h3 id="1-git-bash-실행">1. git bash 실행</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/7a271380-412d-4283-ac04-07da134850f6/image.PNG" alt="">
</br></p>
<h3 id="2-사용자-이름-이메일-등록하기">2. 사용자 이름, 이메일 등록하기</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/ef3aae7b-7218-4672-a2a1-86d933158f18/image.PNG" alt=""></p>
<blockquote>
<p>git config --global user.name &quot;Your Name Here&quot;</p>
</blockquote>
<p>“Your Name Here” 에 사용자 이름 (github의 이름)</p>
<blockquote>
<p>git config --global user.email &quot;<a href="mailto:your_email@yourmail.com">your_email@yourmail.com</a>&quot;</p>
</blockquote>
<p>&quot;your_email@yourmail.com&quot;에는 GitHub 가입할 때 사용한 이메일을 적고 
명령어를 실행시킨다.
</br></p>
<pre><code>--global 옵션은 현재 시스템에서 기본값으로 사용자 설정할 때 쓰는 옵션이다.
( ❗❗ --global 옵션으로 설정하는 것은 딱 한 번만 하면 된다. )

만약 프로젝트마다 다른 이름과 이메일 주소를 사용하고 싶으면 
--global 옵션을 빼고 명령어를 실행시키면 된다.</code></pre></br>

<h3 id="3-사용자-정보-설정-확인하기">3. 사용자 정보 설정 확인하기</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/bf5d5f4e-bb95-4432-98b6-5567533372d3/image.PNG" alt=""></p>
<blockquote>
<p>git config --list</p>
</blockquote>
<p>명령어를 실행시키면 설정한 정보를 확인할 수 있다.</p>
<p></br></br>
</br></p>
<h2 id="📝-2-온라인-저장소remote-repository-생성">📝 2. 온라인 저장소(remote repository) 생성</h2>
<p>Git의 원격저장소 즉 GitHub의 저장소를 
리모트 레포지토리(remote repository)라고 한다.
</br></p>
<h3 id="1-githubcom-로그인-후-repositories---new-클릭">1. github.com 로그인 후 Repositories -&gt; New 클릭</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/b1dbb34b-e28f-453b-b328-87650de4bf46/image.PNG" alt="">
</br></p>
<h3 id="2-저장소-생성하기">2. 저장소 생성하기</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/efcc9cd4-fb3c-46f2-ac71-1cbd928a0074/image.png" alt=""> </p>
<ul>
<li><table>
<thead>
<tr>
<th align="center"></th>
<th align="center">필수여부</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">Repository name</td>
<td align="center">필수</td>
<td align="center">저장소의 이름</td>
</tr>
<tr>
<td align="center">Description</td>
<td align="center">(선택)</td>
<td align="center">저장소에 대한 설명</td>
</tr>
<tr>
<td align="center">Public, Private</td>
<td align="center">필수</td>
<td align="center">저장소 공개 여부</td>
</tr>
<tr>
<td align="center">Initialize this repository with a README</td>
<td align="center">(선택)</td>
<td align="center">README.md 파일 생성 여부</td>
</tr>
<tr>
<td align="center">Add .gitignore</td>
<td align="center">(선택)</td>
<td align="center">github에서 관리하지 않을 파일  선택</td>
</tr>
<tr>
<td align="center">Add a license</td>
<td align="center">(선택)</td>
<td align="center">license 파일 추가 (ex. 저작권)</br>- 이 프로젝트가 어떤 라이센스에 속할지 선택</td>
</tr>
</tbody></table>
</li>
</ul>
<ul>
<li>README 파일은 저장소를 소개하는 텍스트 파일이다.</li>
</ul>
</br>

<p><img src="https://velog.velcdn.com/images/hyun_ha/post/72e5d61d-3df0-46f3-b8a0-8f5495fce731/image.png" alt=""></p>
<p>Create repository 클릭 후 이 화면이 보이면 저장소가 생성된 것이다.</p>
<p>❗ 빨간 박스로 표시해 둔 곳이 저장소의 주소이므로 복사해 둔다.</p>
<p></br></br>
</br></p>
<h2 id="📝-3-로컬-저장소local-repository-생성">📝 3. 로컬 저장소(Local Repository) 생성</h2>
<p>본인의 컴퓨터에 저장소를 
로컬 저장소(Local Repository) 라고 한다.</p>
<p>온라인과 로컬 저장소들은 오로지 저장소일 뿐 작업 공간이 아니다.
실제 작업공간은 컴퓨터이기 떄문에 로컬 디렉토리에 만들 저장소에 실제로 미러링해야 한다.
</br></p>
<h3 id="1-local-repository-생성하고자-하는-위치로-이동">1. local repository 생성하고자 하는 위치로 이동</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/8ef84b48-7a5d-48dc-b240-03552c538a95/image.png" alt=""></p>
<ul>
<li>저장소로 등록하고 싶은 프로그램의 폴더로 경로로 이동 </li>
<li><blockquote>
<p>마우스 우클릭 -&gt; git Bash 실행</p>
</blockquote>
</li>
</ul>
</br>

<h3 id="2-git을-초기화-시켜-로컬-저장소-생성">2. git을 초기화 시켜 로컬 저장소 생성</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/9defca68-ed0a-4424-abcb-7b2544519b26/image.PNG" alt=""></p>
<blockquote>
<p>git init</p>
</blockquote>
<p>이 명령어를 입력하면 현재 폴더를 로컬 저장소로 초기화 한다는 의미로 
git의 버전관리가 가능한 폴더로 지정된다. </p>
<ul>
<li><h3 id="2-1-로컬-저장소-상태-확인">2-1. 로컬 저장소 상태 확인</h3>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/606657d2-08ce-402c-a703-19383e60380f/image.png" alt=""></p>
<blockquote>
<p>git status  </p>
</blockquote>
<p>로컬 저장소 상태 확인할 수 있는 명령어다.</p>
<p>on branch master - 이 프로젝트는 master branch 상에 있다.
No commits yet , 
nothing added to commit - 커밋 내역이 없다.
Untracked files - git add나 git commit을 하지 않았기에 Untracked 상태인 파일을 가리킨다.</p>
<ul>
<li>Untracked files는 git에 의해 아직 추적되지 않고있는 파일이다.</br>

</li>
</ul>
<h3 id="3-untracked-file을-버전관리-대상으로-추가하기">3. Untracked file을 버전관리 대상으로 추가하기</h3>
<p>untracked file은 버전관리 대상파일이 아니다.
그래서 이 파일을 버전관리의 대상으로 추가하기 위해 git add를 해야 한다.</p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/9696ce7d-3100-4d4a-9050-850000380c77/image.PNG" alt=""></p>
<blockquote>
<p>git add . </p>
</blockquote>
<p>이 곳에 있는 &#39;모든&#39; 파일을 add한다는 명령어이다.</p>
<p>❗❗ commit을 하기 전 꼭 커밋할 파일을 git add 해야한다. ❗❗</p>
<p>( add 뒤에 &#39; . &#39; 은 &#39;모든&#39; 파일을 의미한다. 
만약 특정 파일만 add할 경우 &#39;git add 파일이름&#39; 을 입력하면 된다. )</p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/1f2d2e08-c95e-43cf-9a71-4970168a250a/image.PNG" alt=""></p>
<p>add 후 로컬 저장소 상태를 확인하면 추가된 것을 확인할 수 있다. 
즉 commit할 수 잇는 상태가 된 것이다.
</br></p>
<h3 id="4-commit-하기">4. commit 하기</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/fe2e84fd-e2d6-49ce-bfab-e9eddbc85261/image.PNG" alt=""></p>
<blockquote>
<p>git commit -m &quot;커밋에 대한 정보&quot;</p>
</blockquote>
<p>-m 은 메세지 옵션으로 &quot; &quot;에 해당 commit을 설명하는 내용을 입력을 해야한다.</p>
<p>어느 부분을 수정했는지 등의 주석 같은 것을 적은 후 커밋하는 것이다.</p>
<p>git status 상태를 확인하면 다음과 같다. </p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/30aadda1-7129-44d4-8920-326417fb5ebc/image.PNG" alt=""></p>
<p>이렇게 로컬 저장소의 생성이 완료되었다.</p>
<p></br></br>
</br></p>
<h2 id="📝-4-로컬-저장소와-온라인-저장소-연결하기">📝 4. 로컬 저장소와 온라인 저장소 연결하기</h2>
<p>GitHub에 생성한 온라인 저장소와 로컬 저장소를 연결하기 위해서 저장소의 URL가 필요하다.</p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/be1b21c6-0055-4b00-9ee1-a05fdb5b1276/image.png" alt=""></p>
<p>온라인 저장소를 생성한 화면에서 push 부분을 한 줄씩 입력해주면 된다. 
</br></p>
<h3 id="🔥-git-bash에서-일반적인-복붙-단축키-ctrl-c-ctrl-v는-사용할-수-없다-🔥">🔥 git bash에서 일반적인 복붙 단축키 ctrl c, ctrl v는 사용할 수 없다. 🔥</h3>
<p>❗❗ git bash에서 복붙 단축키 ❗❗</p>
<ul>
<li>복사하기 - ctrl + insert</li>
<li>붙여넣기 - shift + insert</br>

</li>
</ul>
<h3 id="1--git-remote-add-origin-자기주소-">1. [ git remote add origin 자기주소 ]</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/9cf76bff-2e3c-4147-8a58-86388b52ebe4/image.PNG" alt=""></p>
<blockquote>
<p>git remote add origin 자기주소 </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/726f1cd8-793c-4eb4-a952-ab217ede60a9/image.PNG" alt=""></p>
<blockquote>
<p>git remote -v</p>
</blockquote>
<p>git remote -v 명령어를 입력하면 fetch와 push가 가능한 온라인 저장소를 추가했음을 확인할 수 있다
</br></p>
<h3 id="2-git-push">2. git push</h3>
<p>git push는 현재 로컬 저장소의 파일을 온라인 저장소로 올리는 작업을 말한다.</p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/a609d07b-f30f-4e21-b3a7-94099c24b07b/image.PNG" alt=""></p>
<blockquote>
<p>git branch -M main</p>
</blockquote>
<blockquote>
<p>git push -u origin main</p>
</blockquote>
<p>순서대로 입력하면 온라인 저장소와 동기화 된 것을 볼 수 있다</p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/0be26a1c-fac7-411d-9330-e2fa96ab2232/image.PNG" alt=""></p>
<p>이 후 github에 들어가면 파일이 올라온 것을 확인할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[🔎 Git & GitHub 기본개념  ]]></title>
            <link>https://velog.io/@hyun_ha/Git-GitHub-%EA%B8%B0%EB%B3%B8%EA%B0%9C%EB%85%90</link>
            <guid>https://velog.io/@hyun_ha/Git-GitHub-%EA%B8%B0%EB%B3%B8%EA%B0%9C%EB%85%90</guid>
            <pubDate>Thu, 21 Apr 2022 06:05:54 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>  Git &amp; GitHub 시작하기 전 알아두면 좋은 개념을 정리한 글이다.</p>
</blockquote>
<p><br/><br/></p>
<h2 id="📙-용어-정리">📙 용어 정리</h2>
<p></b></b></p>
<ul>
<li>커맨드 라인 ( Command Line )<ul>
<li>텍스트로 입력을 받아 명령을 수행하는 프로그램</li>
<li>윈도우 - cmd, Mac - teminal 이라고 한다.</li>
</ul>
</li>
</ul>
</b>

<ul>
<li><p>레포지토리 ( Repository )</p>
<ul>
<li><p>저장소를 의미한다. </p>
</li>
<li><p>원격 저장소(Remote Repository) : GitHub에서 만든 저장소
로컬 저장소(Local Repository) : 내 PC의 저장소</p>
</b>
</li>
<li><p>커밋 ( Commit )</p>
<ul>
<li>프로젝트 디렉토리의 특정 모습을 하나의 버전으로 남기는 행위 &amp; 결과물
( &#39; 체크포인트 &#39; 라고 생각하면 된다.)</b></li>
</ul>
</li>
</ul>
</li>
<li><p>브랜치 ( Branch )</p>
<ul>
<li><p>&#39; 나뭇가지 &#39;라는 뜻의 하나의 코드 관리 흐름이다.</p>
</li>
<li><p>여러 개발자들이 동시에 다양한 작업을 할 수 있게 만든 기능이다.
각자 독립적인 작업 내용을 나중에 합쳐서 새로운 버전을 만들 수 있다. </p>
<p>(ex. 하나의 프로그램을 유료ver, 무료ver 이렇게 나눠서 만든다고 생각하면 된다.)</p>
</li>
</ul>
</li>
</ul>
<p></br></br> 
</br></p>
<h2 id="📕-리눅스-주요-명령어">📕 리눅스 주요 명령어</h2>
</br>

<table>
<thead>
<tr>
<th align="center">명령어</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">pwd</td>
<td align="center">현재 나의 디렉토리 경로</td>
</tr>
<tr>
<td align="center">cd [이동경로]</td>
<td align="center">이동경로로 이동<br><br>cd ../ : 상위 레포지토리 이동</td>
</tr>
<tr>
<td align="center">ls</td>
<td align="center">폴더 리스트 조회</td>
</tr>
<tr>
<td align="center">ls -al</td>
<td align="center">폴더 리스트 상세 조회</td>
</tr>
<tr>
<td align="center">clear</td>
<td align="center">화면 깨끗하게 보기</td>
</tr>
<tr>
<td align="center">mkdir [폴더이름]</td>
<td align="center">폴더 생성</td>
</tr>
<tr>
<td align="center">rm -rf [폴더이름]</td>
<td align="center">폴더 삭제</td>
</tr>
<tr>
<td align="center">rm -r [파일이름]</td>
<td align="center">파일 삭제</td>
</tr>
<tr>
<td align="center">vim [파일이름]</td>
<td align="center">해당 파일 편집,<br>해당 파일이 없을때는 새로 생성<br><br>i : 입력이 가능한 상태<br>esc : insert 상태를 빠져나온다.<br>:wq : 저장 후 종료<br>:q : 종료<br>:q! : 강제 종료</td>
</tr>
<tr>
<td align="center">cat [파일이름]</td>
<td align="center">파일내용을 확인 할 수 있다.</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 디자인 패턴 - 싱글톤 (SingleTon)]]></title>
            <link>https://velog.io/@hyun_ha/JAVA-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%8B%B1%EA%B8%80%ED%86%A4-SingleTon</link>
            <guid>https://velog.io/@hyun_ha/JAVA-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%8B%B1%EA%B8%80%ED%86%A4-SingleTon</guid>
            <pubDate>Tue, 19 Apr 2022 14:01:01 GMT</pubDate>
            <description><![CDATA[<h2 id="디자인-패턴design-pattern">디자인 패턴(Design Pattern)</h2>
<ul>
<li>디자인 패턴이란 기존 환경 내에서 반복적으로 일어나는 문제들을 어떻게
풀어나갈 것인가에 대한 일종의 솔루션 같은 것이다. </li>
<li>디자인 패턴은 설계자들이 &quot;올바른&quot; 설계를 &quot;빨리&quot; 만들 수 있도록 도와준다. </li>
</ul>
<br/>

<blockquote>
<h2 id="📝-싱글톤-singleton">📝 싱글톤 (SingleTon)</h2>
</blockquote>
<ul>
<li>JAVA에서 많이 사용되는 디자인 패턴</li>
<li>어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에
 객체를 만들어 사용하는 디자인 패턴</li>
<li>즉 생성자의 호출이 반복적으로 이뤄져도 실제로 생성되는 객체는 최초 생성된
객체를 반환 해주는 것이다.</li>
</ul>
<br/>

<h2 id="singleton-객체의-이점">SingleTon 객체의 이점</h2>
<ul>
<li><p>메모리를 효율적으로 사용할 수 있다.</p>
<ul>
<li>프로그램의 전역에서 활용할 재료로 사용되는 공유 기능을 하나만 생성하여
여러 곳에서 재사용할 수 있다.</li>
</ul>
</li>
<li><p>다른 클래스 간에 데이터 공유가 쉽다</p>
<ul>
<li>싱글톤 객체가 전역으로 사용되는 객체이기 때문에 다른 클래스의 
객체들이 접근하여 사용할 수 있다.
❗❗ 단, 여러 클래스의 객체에서 싱글톤 객체의 데이터에 동시에 접근하게 
되면 동시성 문제가 발생할 수 있다.</li>
</ul>
</li>
</ul>
<br/>

<h2 id="singleton-생성">SingleTon 생성</h2>
<ul>
<li><h3 id="1-스스로의-객체를-static으로-선언">1. 스스로의 객체를 static으로 선언</h3>
<ul>
<li>static이 적용된 자원은 메모리의 고정영역에 생성되기 때문에, 클래스 자체의
객체나, 그 안에 포함된 멤버변수, 메서드와는 메모리 상에서 구별된다고 볼 수 있다.<pre><code class="language-java">// 싱글톤 예시 
</code></pre>
</li>
</ul>
</li>
</ul>
<p>public class Calc{
    static Calc current;
}</p>
<pre><code>
- ### 2. 외부에서 이 객체에 직접적인 접근을 못하도록 은닉시킨다. 
```java
public class Calc{
    private static Calc current;
}</code></pre><ul>
<li><h3 id="3-외부에서-객체-생성을-못하도록-객체-할당-금지하기">3. 외부에서 객체 생성을 못하도록 객체 할당 금지하기</h3>
<ul>
<li>기본 생성자를 private 형태로 정의하면 객체 생성자가 은닉 처리되어 외부에서
new 연산자를 사용한 객체 할당이 금지된다.</li>
</ul>
</li>
</ul>
<pre><code class="language-java">public class Calc{
    private static Calc current;

    // 생성자를 private
    private Calc() {}
}</code></pre>
<ul>
<li><h3 id="4-은닉된-객체를-할당하거나-메모리에서-삭제하는-기능-추가">4. 은닉된 객체를 할당하거나 메모리에서 삭제하는 기능 추가</h3>
<ul>
<li>current객체를 private으로 지정하였기 때문에 객체를 메모리에서 간접적으로 
할당하고 삭제하기 위한 메서드가 필요하다.<ul>
<li>객체를 메모리에서 제어하기 위해서는 null을 사용한다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code class="language-java">public class Calc{
    private static Calc current;

    private Calc() {}

    // 객체 할당 처리
    // 객체가 할당되지 않은 경우에만 할당하도록 하여 중복 할당을 방지한다.
    public static Calc getInstance() {
        if(current == null) {
            current = new Calc();
        }                        
        return current;
    }

    // 객체에 null을 대입하면 메모리에서 삭제된다.
    public static void freeInstance() {
        current = null;
    }
}</code></pre>
<br/>

<hr>
<br/>

<h3 id="✍-코드-예시">✍ 코드 예시</h3>
<pre><code class="language-java">public class Calc {
    // ------------------------ 싱글톤 객체 생성을 위한 준비 시작 ----------------------
    private static Calc current;

    private Calc() {}

    public static Calc getInstance() {
        if(current == null) {
            current = new Calc();
        }

        return current;
    }

    public static void freeInstance() {
        current = null;
    }
    // ------------------------ 싱글톤 객체 생성을 위한 준비 끝 ----------------------

    // 이 클래스가 구현해야 하는 기능
    public void plus(int x, int y) {
        int z = x + y;
        System.out.println(x + &quot; + &quot; + y + &quot; = &quot; + z);
    }

    public void minus(int x, int y) {
        int z = x - y;
        System.out.println(x + &quot; - &quot; + y + &quot; = &quot; + z);
    }

}</code></pre>
<pre><code class="language-java">public class Main {

    public static void main(String[] args) {
        // 별도의 객체에 참조시키는 경우
        Calc loader1 = Calc.getInstance();
        loader1.plus(10, 20);

        // 참조처리를 생략하고 직접 사용하는 경우
        Calc.getInstance().minus(100, 50);
        Calc.getInstance().plus(100, 50);
    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">10 + 20 = 30
100 - 50 = 50
100 + 50 = 150</code></pre>
</br>

<hr>
<br/>

<h2 id="📙-정리">📙 정리</h2>
<ul>
<li><p>싱글톤은 getInstance() 메서드를 사용하여 객체를 리턴 받는 형식으로 사용한다.</p>
</li>
<li><p>여러개의 객체를 리턴 받더라도 모두 하나의 static 객체를 참조하게 되기 때문에
전역 객체 하나만이 메모리에 할당되게 된다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] static 키워드 & 컴퓨터의 메모리 구조]]></title>
            <link>https://velog.io/@hyun_ha/JAVA-static-%ED%82%A4%EC%9B%8C%EB%93%9C-%EC%BB%B4%ED%93%A8%ED%84%B0%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@hyun_ha/JAVA-static-%ED%82%A4%EC%9B%8C%EB%93%9C-%EC%BB%B4%ED%93%A8%ED%84%B0%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Mon, 18 Apr 2022 13:11:09 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="📝-static">📝 static</h2>
</blockquote>
<ul>
<li>static은 &#39;고정된&#39; 또는 &#39;공통적인&#39;의 의미를 가지고 있다.
즉  모든 객체가 공유하는 값이다.</li>
<li>static 값은 클래스 이름을 통해서 접근해야 하며, 객체를 생성하지
않고도 사용할 수 있다.</li>
</ul>
<br/>

<h2 id="static-예시">static 예시</h2>
<p>하나의 게시물을 표현하기 위한 클래스가 있다.</p>
<pre><code class="language-java">public class Article{
    private int num;            // 글 번호
    private String title;        // 제목
    private String regDate;        // 날짜    
}</code></pre>
<p>이 클래스에 게시물이 새로 등록될 때 마다, 전체 글 수를 의미하는 count, 카테고리 정보를 담을 변수를 추가 할려고 한다.</p>
<pre><code class="language-java">public class Article{
    int count;             // 전체 글 수        
    String category;    // 카테고리

    private int num;            // 글 번호
    private String title;        // 제목
    private String regDate;        // 날짜    
}</code></pre>
<p>이렇게 전체 글 수, 카테고리정보를 선언한 후 여러 객체를 생성할 때
다음과 같은 문제가 발생한다.</p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/4606fa0a-8e7a-4c42-9e2d-a5a79ed4854b/image.PNG" alt=""></p>
<pre><code class="language-java">public class Main {

    public static void main(String[] args) {
        Article a1 = new Article(1, &quot;첫번째 글제목&quot;, &quot;20XX-01-01&quot;);
        a1.category = &quot;공지사항&quot;;
        a1.count++;

        Article a2 = new Article(2, &quot;두번째 글제목&quot;, &quot;20XX-01-02&quot;);
        a2.category = &quot;공지사항&quot;;
        a1.count++;
        a2.count = a1.count;

        Article a3 = new Article(3, &quot;세번째 글제목&quot;, &quot;20XX-01-03&quot;);
        a3.category = &quot;공지사항&quot;;
        a1.count++;
        a2.count++;
        a3.count = a2.count;

        System.out.println(a1.toString());
        System.out.println(a2.toString());
        System.out.println(a3.toString());
    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">Article [count=3, category=공지사항, num=1, title=첫번째 글제목, regDate=20XX-01-01]
Article [count=3, category=공지사항, num=2, title=두번째 글제목, regDate=20XX-01-02]
Article [count=3, category=공지사항, num=3, title=세번째 글제목, regDate=20XX-01-03]</code></pre>
<p>이 코드처럼 객체를 생성할 때마다 count, category 변수들을 바꿔줘야 하는 번거로움이 생긴다.
또한 반복적인 코드가 많아서 좋지 못한 코드라고 볼 수 있다.
<br/>
멤버변수는 모든 객체가 독립적으로 갖는 고유 데이터이기 때문에 count 라는
   공유 데이터를 모든 게시물이 갖게 된다.
즉, 각각의 객체가 중복된 데이터를 갖게 된다. </p>
<p>이러한 문제를 해결하려면 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/15b659db-6759-4b3e-9890-8ae952fe3418/image.PNG" alt=""></p>
<p>모든 객체에서 공통적으로 사용해야 하는 값에 &#39;static&#39;을 붙인다.</p>
<pre><code class="language-java">public class Article{
    static int count;                 // 전체 글 수        
    static String category;            // 카테고리

    private int num;                // 글 번호
    private String title;            // 제목
    private String regDate;            // 날짜    
}</code></pre>
<p>static이 붙은 멤버변수는 객체의 개수에 상관 없이 단 하나만 생성되며, 
   이를 모든 객체가 공유하기 때문에 메모리를 효율적으로 사용할 수 있다.</p>
<p>&lt;static이 붙은 멤버변수를 사용할 땐 대문자로 쓴 클래스 이름을 사용하면 된다.&gt;
<br/>   </p>
<pre><code class="language-java">public class Main {

    public static void main(String[] args) {
        Article.category = &quot;공지사항&quot;;

        Article a1 = new Article(1, &quot;첫번째 글제목&quot;, &quot;20XX-01-01&quot;);
        Article.count++;

        Article a2 = new Article(2, &quot;두번째 글제목&quot;, &quot;20XX-01-02&quot;);
        Article.count++;

        Article a3 = new Article(3, &quot;세번째 글제목&quot;, &quot;20XX-01-03&quot;);
        Article.count++;

        System.out.println(a1.toString());
        System.out.println(a2.toString());
        System.out.println(a3.toString());
    }

}</code></pre>
<p>많이 깔끔해졌지만 Article.count++; 매번 해줘야 하는 번거로움이 있다.
-&gt; 객체가 생성될 때마다 Article.count가 1씩 증가되기 때문에 아예 생성자에 이 줄을 넣으면 된다.
<br/>
✍ 최종 코드</p>
<pre><code class="language-java">public class Article {
    static int count;             // 전체 글 수        
    static String category;        // 카테고리

    private int num;            // 글 번호
    private String title;        // 제목
    private String regDate;        // 날짜

    public Article(int num, String title, String regDate) {
        this.num = num;
        this.title = title;
        this.regDate = regDate;

        count++;
    }

    public String toString() {
        return &quot;Article [count=&quot; + count 
                + &quot;, category=&quot; + category 
                + &quot;, num=&quot; + num 
                + &quot;, title=&quot; + title 
                + &quot;, regDate=&quot; + regDate + &quot;]&quot;;
    }
}    </code></pre>
<pre><code class="language-java">public class Main {

    public static void main(String[] args) {
        Article.category = &quot;공지사항&quot;;

        Article a1 = new Article(1, &quot;첫번째 글제목&quot;, &quot;20XX-01-01&quot;);
        Article a2 = new Article(2, &quot;두번째 글제목&quot;, &quot;20XX-01-02&quot;);
        Article a3 = new Article(3, &quot;세번째 글제목&quot;, &quot;20XX-01-03&quot;);

        System.out.println(a1.toString());
        System.out.println(a2.toString());
        System.out.println(a3.toString());
    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">Article [count=3, category=공지사항, num=1, title=첫번째 글제목, regDate=20XX-01-01]
Article [count=3, category=공지사항, num=2, title=두번째 글제목, regDate=20XX-01-02]
Article [count=3, category=공지사항, num=3, title=세번째 글제목, regDate=20XX-01-03]</code></pre>
<p><br/><br/></p>
<h2 id="멤버변수와-static-멤버변수의-차이">멤버변수와 static 멤버변수의 차이</h2>
<ul>
<li><p>멤버변수는 객체가 생성될 때 마다 생성되므로 객체마다 각기 다른
값을 유지할 수 있다.</p>
</li>
<li><p>static 변수는 모든 객체가 하나의 저장공간을 공유하므로, 항상
공통된 값을 갖는다.</p>
</li>
<li><p>static 변수는 객체가 생성되지 않았더라도 이미 존재하고 있기 때문에 객체의
 이름을 통해 접근하는 것이 아니라, 클래스의 이름을 통해서 접근해야 한다.</p>
<ul>
<li>단, static 변수가 선언된 클래스 안에서는 변수 이름으로 직접 접근이 허용된다.</li>
</ul>
</li>
</ul>
<pre><code class="language-java">// Article 클래스 및 다른 클래스에서 접근하는 경우
    Article.count = 9;
    Article.categoty = &quot;공지사항&quot;;

// Article 클레스에서 접근하는 경우
    count = 15;
    categoty = &quot;Q&amp;A게시판&quot;;</code></pre>
<hr>
<br/>

<blockquote>
<h2 id="📝-컴퓨터의-메모리-구조">📝 컴퓨터의 메모리 구조</h2>
</blockquote>
<ul>
<li>컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있다.</li>
<li>메모리 공간은 다음과 같은 4가지 영역으로 나누어진다.</li>
</ul>
<br/>

<p><img src="https://velog.velcdn.com/images/hyun_ha/post/16964217-6346-4e98-9418-d9e917239793/image.png" alt=""></p>
<br/>

<h2 id="코드-영역-고정영역">코드 영역 (고정영역)</h2>
<ul>
<li>프로그램의 코드가 저장되는 영역</li>
<li>이 영역에 저장된 명령어들을 CPU가 하나씩 가져가 실행한다.<br/>

</li>
</ul>
<h2 id="데이터-영역-고정영역">데이터 영역 (고정영역)</h2>
<ul>
<li>전역변수와 static으로 선언되는 변수가 할당된다.</li>
<li>이 영역에 할당되는 변수들은 프로그램 시작과 동시에 메모리 공간이 할당되어
  종료될 때 까지 남아있게 된다.<br/>

</li>
</ul>
<h2 id="힙-영역-동적영역">힙 영역 (동적영역)</h2>
<ul>
<li>프로그래머가 원하는 시점에 변수를 할당하고 소멸시키는 영역</li>
<li>메모리 동적 할당시 사용된다.</li>
<li>객체가 생성되는 영역이다.<br/>

</li>
</ul>
<h2 id="스택-영역-동적영역">스택 영역 (동적영역)</h2>
<ul>
<li>함수가 실행될 때 사용되는 파라미터와 지역변수에 대한 메모리 공간</li>
<li>함수의 종료와 함께 소멸된다.</li>
</ul>
<p><br/></br></p>
<h2 id="하나의-프로그램이-사용하는-메모리-영역">하나의 프로그램이 사용하는 메모리 영역</h2>
<ul>
<li><h3 id="고정영역">고정영역</h3>
<ul>
<li><p>프로그램이 실행되면 실행파일이 메모리에 로드되면서, 
   실행파일의 용량만큼 RAM을 사용한다.</p>
</li>
<li><p>실행 파일의 크기는 변할 수 없으므로 이 영역의 크기는 고정 크기를 갖는다.</p>
</li>
<li><p>이 영역의 자원들은 프로그램이 실행되는 동안 항상 존재한다. </p>
</li>
</ul>
</li>
<li><h3 id="동적영역">동적영역</h3>
<ul>
<li><p>프로그래머가 new 키워드를 사용해서 객체나 배열을 생성하면 사용된다.
(힙 영역)</p>
</li>
<li><p>메서드가 호출되는 동안 사용될 파라미터와 지역변수가 생성된다. (스택영역)</p>
</li>
<li><p>메서드가 종료되거나 객체가 더 이상 사용되지 않으면 생성된 변수나
객체는 메모리에서 사라지므로, 이 영역은 유동적인 크기를 갖게 된다.  </p>
</li>
</ul>
</li>
</ul>
<br/>

<h2 id="프로그램이-메모리를-사용하는-순서">프로그램이 메모리를 사용하는 순서</h2>
<ul>
<li>최초 실행 시 고정 영역에 실행파일만큼의 메모리를 점유한다.</li>
<li>프로그램이 각종 동작을 수행하는 동안 동적영역을 사용한다.</li>
</ul>
</br>

<h2 id="💥-static-메서드--static-변수">💥 static 메서드 &amp; static 변수</h2>
<ul>
<li><p>메모리 영역의 차이 때문에 static 메서드는 동적 메모리 영역의 
멤버변수를 사용하거나, static이 아닌 일반 멤버변수를 호출할 수 없다.</p>
</li>
<li><p>메서드의 정의 과정에서 static 키워드를 사용하면 static 자원에 접근하기
위한 메서드를 만들 수 있다.</p>
</li>
<li><h3 id="고정-영역">고정 영역</h3>
<ul>
<li>동적 메모리 영역의 자원들은 항상 존재하는 것이 아니기 때문에
static 멤버함수는 동적 메모리 영역의 멤버변수를 사용하거나,
static이 아닌 일반 멤버함수를 호출할 수 <span style="color:red">없다.</span>   </li>
</ul>
</li>
<li><h3 id="동적-영역">동적 영역</h3>
<ul>
<li>static 자원은 항상 존재하는 것이므로 동적 영역에서는 static 변수를
활용하거나, static 멤버함수를 호출할 수 있다.   </li>
</ul>
</li>
</ul>
<pre><code class="language-java">public class Article{
        private static int count;

        public static void setCount(int count) {
            Article.count = count;
        }

        public static int getCount() {
            return Article.count;
        }

    }</code></pre>
<br/>

<hr>
<br/>

<h2 id="📙-정리">📙 정리</h2>
<table>
<thead>
<tr>
<th align="center">대상</th>
<th align="center">의미</th>
</tr>
</thead>
<tbody><tr>
<td align="center">멤버변수</td>
<td align="center">- 모든 객체에 공통적으로 사용되는 클래스 변수가 된다.<br/>- 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다.<br/>- 클래스가 메모리에 로드될 때 생성된다.</td>
</tr>
<tr>
<td align="center">메서드</td>
<td align="center">- 객체를 생성하지 않고도 호출이 가능한 static 메서드가 된다.<br/>- static메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다.</td>
</tr>
</tbody></table>
<h2 id="static을-언제-붙여야-할까">static을 언제 붙여야 할까?</h2>
<ul>
<li>멤버변수 중 모든 객체에 공통으로 사용하는 것에 static을 붙인다.</li>
<li>메서드 내에서 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드에
staitc을 붙이는 것을 고려한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 인터페이스 (Interface)]]></title>
            <link>https://velog.io/@hyun_ha/JAVA-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-Interface</link>
            <guid>https://velog.io/@hyun_ha/JAVA-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-Interface</guid>
            <pubDate>Sat, 16 Apr 2022 07:51:58 GMT</pubDate>
            <description><![CDATA[<h2 id="추상-클래스의-한계">추상 클래스의 한계</h2>
<ul>
<li>자바 클래스간의 상속에서는 하나의 부모만 존재할 수 있기 때문에,
다중 상속의 구현은 불가능하다.</li>
<li>하지만, 인터페이스는 다중 상속이 가능하다. </li>
</ul>
</br>

<blockquote>
<h2 id="📝-인터페이스-interface">📝 인터페이스 (Interface)</h2>
</blockquote>
<ul>
<li>일종의 추상클래스이다.</li>
<li>오직 추상메서드와 상수만을 구성 멤버로 가진다.</li>
<li>다중 상속이 가능하기 때문에 용도별로 세분화 하여 필요한 요소만 상속할 수 있다.</li>
</ul>
</br>

<h3 id="인터페이스의-장점">인터페이스의 장점</h3>
<ul>
<li>개발시간을 단축시킬 수 있다.</li>
<li>표준화가 가능하다.</li>
<li>서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.</li>
<li>독립적인 프로그래밍이 가능하다.</li>
</ul>
</br>

<h2 id="인터페이스-정의">인터페이스 정의</h2>
<ul>
<li><p>클래스를 작성하는 것과 같다.
❗❗ 다만, class 키워드 대신 interface를 사용해야 한다.</p>
</li>
<li><p>인터페이스 내의 모든 메서드는 추상 메서드이기 때문에 &#39;abstract&#39; 키워드를 명시할 필요가 없다.</p>
</li>
</ul>
<pre><code class="language-java">public interface 인터페이스명 {

    public 리턴타입 메서드명(파라미터,...);

}</code></pre>
</br>

<h2 id="인터페이스-상속">인터페이스 상속</h2>
<ul>
<li><p>인터페이스의 상속은 implements 키워드를 사용한다.</p>
</li>
<li><p>인터페이스도 추상화를 구현하고 있기 때문에, 인터페이스를 상속받는 클래스는
 인터페이스내의 모든 메서드들을 <span style="color:red">반드시 재정의</span> 해야 한다.</p>
</li>
<li><p>인터페이스는 클래스와 달리 Object클래스와 같은 최상위 클래스가 없다.</p>
</li>
<li><p>다중 상속이 가능하다.</p>
<ul>
<li>인터페이스는 콤마( , )로 연결하여 여러개를 동시에 상속받을 수 있다.<ul>
<li>필요한 경우 다른 클래스와 동시에 상속받을 수 있다.<pre><code class="language-java">// 콤마(,)로 연결하여 동시에 상속한 경우
public class Monster implements Fight, Move {
...
}   
</code></pre>
</li>
</ul>
</li>
</ul>
<p>// 다른 클래스와 동시에 상속한 경우
public class Monster extends User implements Fight, Move{</p>
<pre><code>...</code></pre><p>}</p>
<pre><code>&lt;/br&gt;
</code></pre></li>
</ul>
<hr>
</br>

<h2 id="인터페이스-예시">인터페이스 예시</h2>
</br>

<pre><code class="language-java">public abstract class Unit{
        public abstract void attack();        // 공격
        public abstract void shield();        // 방어
        public abstract void walk();        // 걷다
        public abstract void run();            // 뛰다    
        public abstract void jump();        // 점프
        public abstract void pickup();        // 아이템 줍기
    }</code></pre>
<p>추상클래스인 Unit 클래스가 있다.</p>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/7f558b06-d00d-479a-b4cf-11147a846e19/image.PNG" alt=""></p>
<p>주인공과 몬스터 클래스가 Unit을 상속받을 경우</p>
<p>주인공 클래스는 Unit의 모든 기능을 사용하지만,
몬스터 클래스는 사용하지 않는 기능도 재정의해야하는 문제가 발생한다.</p>
</br>

<p><img src="https://velog.velcdn.com/images/hyun_ha/post/066fc18d-9b20-4208-b6b9-c173a4fc0154/image.PNG" alt=""></p>
<p>그래서 추상 클래스인 Unit의 기능을 용도별로 분할하여 나누어 놓고,
주인공과 몬스터가 각각의 기능 중에서 자신에게 필요한 것들만 상속받도록 해야한다.</p>
<p>클래스 다이어그램으로 표현하면 다음과 같다.
<img src="https://velog.velcdn.com/images/hyun_ha/post/0c4458ea-6836-4a18-8ae1-3451a6dcb90a/image.PNG" alt=""> </p>
</br>

<h3 id="✍-코드-예시">✍ 코드 예시</h3>
<pre><code class="language-java">// Action 인터페이스
public interface Action {

    public void pickup();        // 줍다

}

// Fight 인터페이스
public interface Fight {

    public void attack();        // 공격
    public void shield();        // 방어

}

// Move 인터페이스
public interface Move {

    public void walk();        // 걷기
    public void run();        // 뛰기
    public void jump();        // 점프

}</code></pre>
<pre><code class="language-java">// Monster 클래스 
public class Monster implements Fight, Move{
    private String name;                // 몬스터 이름

    public Monster(String name) {        // 생성자
        super();
        this.name = name;
    }

    // 다음과 같이 메서드 재정의가 이루어지면 필요한 기능을 구현한다.
    @Override
    public void walk() {
        System.out.println(this.name + &quot; &gt;&gt; 걷다&quot;);
    }

    @Override
    public void run() {
        System.out.println(this.name + &quot; &gt;&gt; 뛰다&quot;);
    }

    @Override
    public void jump() {
        System.out.println(this.name + &quot; &gt;&gt; 점프&quot;);
    }

    @Override
    public void attack() {
        System.out.println(this.name + &quot; &gt;&gt; 공격&quot;);
    }

    @Override
    public void shield() {
        System.out.println(this.name + &quot; &gt;&gt; 방어&quot;);
    }

}</code></pre>
<pre><code class="language-java">// Character 클래스
public class Character implements Action, Fight, Move{
    private String name;                // 캐릭터 이름

    public Character(String name) {        // 생성자
        super();
        this.name = name;
    }

    @Override
    public void attack() {
        System.out.println(this.name + &quot; &gt;&gt; 공격&quot;);
    }

    @Override
    public void shield() {
        System.out.println(this.name + &quot; &gt;&gt; 방어&quot;);
    }

    @Override
    public void pickup() {
        System.out.println(this.name + &quot; &gt;&gt; 아이템을 줍다&quot;);
    }

    @Override
    public void walk() {
        System.out.println(this.name + &quot; &gt;&gt; 걷다&quot;);
    }

    @Override
    public void run() {
        System.out.println(this.name + &quot; &gt;&gt; 뛰다&quot;);
    }

    @Override
    public void jump() {
        System.out.println(this.name + &quot; &gt;&gt; 점프&quot;);
    }

}</code></pre>
</br>

<pre><code class="language-java">// Main 클래스
public class Main {

    public static void main(String[] args) {
        Character c = new Character(&quot;주인공&quot;);

        c.walk();
        c.run();
        c.attack();
        c.shield();
        c.pickup();
        c.jump();

        System.out.println(&quot;------------------------------------&quot;);

        Monster m = new Monster(&quot;몬스터&quot;);

        m.attack();
        m.shield();
        m.walk();
        m.run();
        m.jump();

    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">주인공 &gt;&gt; 걷다
주인공 &gt;&gt; 뛰다
주인공 &gt;&gt; 공격
주인공 &gt;&gt; 방어
주인공 &gt;&gt; 아이템을 줍다
주인공 &gt;&gt; 점프
------------------------------------
몬스터 &gt;&gt; 공격
몬스터 &gt;&gt; 방어
몬스터 &gt;&gt; 걷다
몬스터 &gt;&gt; 뛰다
몬스터 &gt;&gt; 점프</code></pre>
</br>

<hr>
</br>

<h2 id="📙-정리">📙 정리</h2>
<table>
<thead>
<tr>
<th align="center"></th>
<th align="center">일반 클래스</th>
<th align="center">추상 클래스</th>
<th align="center">인터페이스</th>
</tr>
</thead>
<tbody><tr>
<td align="center">생성자, 멤버변수</td>
<td align="center">가능</td>
<td align="center">가능</td>
<td align="center">불가능 </br>(상수만 가능)</td>
</tr>
<tr>
<td align="center">일반 메서드</td>
<td align="center">가능</td>
<td align="center">가능</td>
<td align="center">불가능</td>
</tr>
<tr>
<td align="center">추상 메서드</td>
<td align="center">불가능</td>
<td align="center">가능</td>
<td align="center">가능</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 추상 클래스 및 메서드]]></title>
            <link>https://velog.io/@hyun_ha/JAVA-%EC%B6%94%EC%83%81-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B0%8F-%EB%A9%94%EC%84%9C%EB%93%9C</link>
            <guid>https://velog.io/@hyun_ha/JAVA-%EC%B6%94%EC%83%81-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B0%8F-%EB%A9%94%EC%84%9C%EB%93%9C</guid>
            <pubDate>Sat, 16 Apr 2022 02:24:58 GMT</pubDate>
            <description><![CDATA[<h2 id="추상화란">추상화란?</h2>
<ul>
<li>사전적 의미는 실체 간에 공통되는 특성을 추출한 것을 말한다.</li>
<li>JAVA에서의 추상화는 클래스들의 중요하고 공통된 성질들을 추출하여 
부모 클래스를 선정하는 개념이다.</li>
</ul>
</br>

<h2 id="java에서의-추상화-기법">JAVA에서의 추상화 기법</h2>
<ul>
<li>특정 클래스를 상속받은 경우, 
부모의 특정 메서드들을 <span style="color:red">무조건</span> 재정의하도록 강제하는 기법이다.</li>
<li>특정 메서드를 재정의하도록 강제함으로써, 자식 클래스들을 작성하기 위한 
가이드의 역할을 할 수 있다.</li>
<li>즉, 추상화 기법은 java 클래스를 작성하기 위한 설계도를 소스코드 형태로 
제시하는 역할을 한다.</li>
</ul>
</br>

<h2 id="추상화의-장점">추상화의 장점</h2>
<ul>
<li>상속을 통해 간결한 코드</li>
<li>생산성과 가독성 증가</li>
<li>에러 감소</li>
<li>유지 보수시 시간 단축</li>
<li>코드의 재사용성 증가</li>
</ul>
</br>

<hr>
</br>

<blockquote>
<h2 id="📝-추상-클래스-abstract-class">📝 추상 클래스 (abstract class)</h2>
</blockquote>
<ul>
<li>클래스를 설계도에 비유한다면, 추상 클래스는 미완성 설계도에 비유할 수 있다.</li>
<li>추상 클래스는 객체를 생성할 수 없고, 반드시 상속을 통해서만 사용될 수 있다.</li>
<li>추상 메서드를 하나 이상 포함하고 있는 클래스는 반드시 &#39;추상 클래스&#39;로
정의되어야 한다.</li>
<li>추상 클래스는 다른 자식 클래스를 위한 &#39;가이드라인&#39;의 역할을 한다.  </li>
</ul>
</br>

<h3 id="추상-클래스-선언">추상 클래스 선언</h3>
<ul>
<li>추상 클래스 &#39;abstract&#39;키워드를 사용하여 정의할 수 있다.</li>
<li>추상 클래스는 생성자, 멤버변수, 일반 메서드등을 포함할 수 있다.<ul>
<li>즉 공통 기능과 가이드라인을 모두 정의하여 다른 클래스에게 상속된다.<pre><code class="language-java">public abstract class Hello{
// 멤버변수
// 생성자
// 일반 메서드
// 추상 메서드
...
}</code></pre>
</li>
</ul>
</li>
</ul>
</br>

<h3 id="추상-클래스의-상속">추상 클래스의 상속</h3>
<ul>
<li>일반 클래스의 상속과 동일하게 &#39;extends&#39; 키워드를 사용한다.</li>
</ul>
</br>

<hr>
</br>

<blockquote>
<h2 id="📝-추상-메서드-abstract-method">📝 추상 메서드 (abstract method)</h2>
</blockquote>
<ul>
<li>추상 클래스에서만 선언할 수 있다.</li>
<li>메서드의 선언부만 있고 구현부가 없는 &#39;미완성 메서드&#39;이다.</li>
<li>추상 메서드는 자식 클래스가 구현해야 하는 메서드의 가이드라인만
 제시하기 위한 목적으로 사용된다.</li>
</ul>
</br>

<h3 id="추상-메서드-선언">추상 메서드 선언</h3>
<ul>
<li>&#39;abstract&#39; 키워드를 사용하여 메서드를 정의한다.</li>
<li>선언만 가능하고, 구현부를 위한 블록이 존재하지 않는다.<ul>
<li>중괄호{} 대신 문장의 끝을 알리는 세미콜론 ( ; ) 을 적어준다.</li>
</ul>
</li>
<li>추상 클래스를 상속받으면 자식은 부모의 모든 추상 메서드를 재정의 해야한다.  <pre><code class="language-java">public abstract void sayHello();</code></pre>
</li>
</ul>
</br>

<hr>
</br>

<p>✍ 코드 예시</p>
<pre><code class="language-java">// 육군 / 해군 / 공군 의 공통 기능을 명시하기 위한 부모 클래스

public abstract class Unit {
    private String name;

    public Unit(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // 자식들이 재정의할 메서드를 추상으로 명시
    public abstract void attack();

    public abstract void move();

}</code></pre>
<pre><code class="language-java">// 자식 클래스 

// 육군
public class Army extends Unit {

    public Army(String name) {
        super(name);
    }

    // 추상 메서드의 재정의를 요구한다.
    @Override
    public void attack() {
        System.out.println(this.getName() + &quot;&gt;&gt; 육상공격&quot;);
    }

    @Override
    public void move() {
        System.out.println(this.getName() + &quot;&gt;&gt; 육상이동&quot;);
    }

}

// 해군
public class Navy extends Unit {

    public Navy(String name) {
        super(name);
    }

    @Override
    public void attack() {
        System.out.println(this.getName() + &quot;&gt;&gt; 해안공격&quot;);
    }

    @Override
    public void move() {
        System.out.println(this.getName() + &quot;&gt;&gt; 해안이동&quot;);
    }

}

// 공군
public class AirForce extends Unit {

    public AirForce(String name) {
        super(name);
    }

    @Override
    public void attack() {
        System.out.println(this.getName() + &quot;&gt;&gt; 공중공격&quot;);
    }

    @Override
    public void move() {
        System.out.println(this.getName() + &quot;&gt;&gt; 공중이동&quot;);
    }

}</code></pre>
<pre><code class="language-java">// Main 클래스

public class Main {

    public static void main(String[] args) {
        Unit[] u = new Unit[3];

        u[0] = new Army(&quot;육군&quot;);
        u[1] = new Navy(&quot;해군&quot;);
        u[2] = new AirForce(&quot;공군&quot;);

        for (int i = 0; i &lt; u.length; i++) {
            u[i].attack();
            u[i].move();
            System.out.println(&quot;------------------------------------------&quot;);
        }

    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">육군&gt;&gt; 육상공격
육군&gt;&gt; 육상이동
------------------------------------------
해군&gt;&gt; 해안공격
해군&gt;&gt; 해안이동
------------------------------------------
공군&gt;&gt; 공중공격
공군&gt;&gt; 공중이동
------------------------------------------</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 객체 배열 & instanceof]]></title>
            <link>https://velog.io/@hyun_ha/JAVA-%EA%B0%9D%EC%B2%B4-%EB%B0%B0%EC%97%B4-instanceof</link>
            <guid>https://velog.io/@hyun_ha/JAVA-%EA%B0%9D%EC%B2%B4-%EB%B0%B0%EC%97%B4-instanceof</guid>
            <pubDate>Thu, 14 Apr 2022 15:15:51 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="📝-객체-배열">📝 객체 배열</h2>
</blockquote>
<ul>
<li>일반 데이터 타입의 배열과 동일한 개념으로, 같은 클래스의 객체 여러 개를 
 그룹화 할 수 있다.</li>
<li>동일한 클래스의 객체는 배열로 묶어서 여러 개를 한꺼번에 제어할 수 있다. </li>
</ul>
</br>

<hr>
</br>

<h3 id="일반-데이터-형의-배열과-객체-배열-비교">일반 데이터 형의 배열과 객체 배열 비교</h3>
<ol>
<li>생성</li>
</ol>
<pre><code class="language-java">   - 일반 데이터형의 배열
    int[] data = new int[3];

    - 객체 배열의 경우
    Army[] data = new army[3];</code></pre>
<ol start="2">
<li><p>배열의 요소 할당처리</p>
<pre><code class="language-java">- 일반 데이터 형 배열의 경우
   data[0] = 10;
   data[1] = 20;
   data[2] = 35;

- 객체 배열의 경우
   Army a1 = new Army();
   data[0] = new Army();
   data[1] = new Army();
   data[2] = new Army();</code></pre>
</li>
</ol>
<ul>
<li>일반 데이터 형은 단순히 값을 대입하지만, 
객체 배열은 &#39;new&#39;를 사용하여 객체를 할당해야 한다.</li>
</ul>
</br>

<h3 id="객체-배열의-활용">객체 배열의 활용</h3>
<ul>
<li>부모 클래스의 배열에 자식 클래스의 객체 넣기<ul>
<li>배열의 생성이 부모 클래스로 지정되었을 경우, 모든 자식 클래스의 객체들은
그 배열에 포함 될 수 있다.<pre><code class="language-java"> Unit[] unit = new Unit[3];
// 배열의 요소 할당과정에서 암묵적 형변환이 이루어진다.
unit[0] = new Army();
unit[1] = new Navy();
unit[2] = new AirForce();</code></pre>
</li>
</ul>
</li>
</ul>
 </br>

<h3 id="instanceof-연산자">instanceof 연산자</h3>
<ul>
<li>객체 타입 확인하는 연산자</br> </li>
<li>배열의 각 요소가 확장한 기능을 사용하기 위해서는 원래의 클래스 형태로 
명시적 형변환이 이루어 져야 한다.
하지만 몇번째 요소가 어떤 클래스에서 최초로 생성되었는지 판단하기 어렵다.  </br>   </li>
<li>이 경우 instanceof 연산자를 사용하면 어떤 객체에 대한 출처를 판단하여 
boolean형으로 결과를 반환할 수 있다.</li>
</ul>
<pre><code class="language-java">class Parent{}
class Child extends Parent{}

public class Main {

    public static void main(String[] args) {
        Parent p = new Parent();
        Child c = new Child();

        System.out.println(p instanceof Parent);        
        System.out.println(p instanceof Child);                
        System.out.println(c instanceof Parent);            
        System.out.println(c instanceof Child);            

    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">true
false
true
true</code></pre>
</br>

<hr>
</br>

<p>✍ 객체 배열 &amp; instanceof 코드 예시) - &lt;객체 형변환 글에 있는 코드 참고&gt;</p>
<pre><code class="language-java">public class Main {

    public static void main(String[] args) {
        // 부대지정
        Unit[] units = new Unit[5];

        units[0] = new AirForce(&quot;공군1호&quot;);
        units[1] = new AirForce(&quot;공군2호&quot;);
        units[2] = new Navy(&quot;해군1호&quot;);
        units[3] = new Army(&quot;육군1호&quot;);
        units[4] = new Army(&quot;육군2호&quot;);

        // 부대 일괄 공격 attak();
        for (int i = 0; i &lt; units.length; i++) {
            units[i].attack();

            // 각 기능의 고유한 기능 호출
            if (units[i] instanceof Army) {
                Army temp1 = (Army)units[i];
                temp1.tank();
            } 

            if (units[i] instanceof Navy) {
                Navy temp2 = (Navy)units[i];
                temp2.nucleus();
            } 

            if (units[i] instanceof AirForce) {
                AirForce temp3 = (AirForce)units[i];
                temp3.bombing();
            }

            System.out.println(&quot;-----------------------------&quot;);
        }

    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">공군1호 &gt;&gt;&gt; 공격준비 
공군1호 &gt;&gt; 이륙
공군1호 &gt;&gt; 공중공격 실행
공군1호 &gt;&gt; 폭격
-----------------------------
공군2호 &gt;&gt;&gt; 공격준비 
공군2호 &gt;&gt; 이륙
공군2호 &gt;&gt; 공중공격 실행
공군2호 &gt;&gt; 폭격
-----------------------------
해군1호 &gt;&gt;&gt; 공격준비 
해군1호 &gt;&gt; 어뢰발사
해군1호 &gt;&gt; 지상 상륙
해군1호 &gt;&gt; 핵미사일
-----------------------------
육군1호 &gt;&gt;&gt; 공격준비 
육군1호 &gt;&gt; 지상공격 실행
육군1호 &gt;&gt; 탱크공격
-----------------------------
육군2호 &gt;&gt;&gt; 공격준비 
육군2호 &gt;&gt; 지상공격 실행
육군2호 &gt;&gt; 탱크공격
-----------------------------
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 객체 형변환]]></title>
            <link>https://velog.io/@hyun_ha/JAVA-%EA%B0%9D%EC%B2%B4-%ED%98%95%EB%B3%80%ED%99%98</link>
            <guid>https://velog.io/@hyun_ha/JAVA-%EA%B0%9D%EC%B2%B4-%ED%98%95%EB%B3%80%ED%99%98</guid>
            <pubDate>Thu, 14 Apr 2022 13:07:51 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="📝-객체-형변환">📝 객체 형변환</h2>
</blockquote>
<ul>
<li>기본형 변수처럼 참조변수도 형변환(Casting)이 가능하다.</li>
<li>단, 서로 상속 관계에 있는 클래스 사이에서만 가능하다. </li>
</ul>
</br>


<pre><code>Parent parent = new Child();    </code></pre><ul>
<li>위의 대입연산에서 왼쪽 항(부모, Parent)과 오른쪽 항(자식, child)의 객체 유형이 
서로 다른 경우, 두 유형이 서로 상속관계에 있고 왼쪽 객체가 오른쪽 객체의 상위
클래스인 경우에만 <strong>암묵적 형변환</strong>이 일어난다.</li>
<li>하위 클래스에서 상위클래스 유형으로 할당하는 것은 가능하나 그 반대의 경우에는</li>
<li><em>명시적 형변환*</em>을 해야 한다.</li>
</ul>
<hr>
</br>

<h3 id="📃-암묵적-형변환">📃 암묵적 형변환</h3>
<ul>
<li>자식클래스가 부모클래스에게 상속받은 기능만 사용하도록 제한</li>
<li>주의할 점은 기능의 제한이지 기능의 변경은 아니라는 것이다.</li>
<li>모든 객체는 자신의 상위 형태로 암묵적 형변환이 가능하다.</b>

</li>
</ul>
<p>즉 오버라이드된 기능만 사용가능하고, 추가적으로 구현한 기능은 사용할 수 없다.</p>
</br>

<h3 id="암묵적-형변환-가능한-경우">암묵적 형변환 가능한 경우</h3>
<p><img src="https://velog.velcdn.com/images/hyun_ha/post/81c38490-d4b8-47f2-8fce-939fe83ff1c5/image.PNG" alt=""></p>
<pre><code class="language-java">    // 👉 가능하다.
    A a1 = new B();
    A a2 = new X();
    -------------------
    A a3 = new C();
    A a4 = new Y();
    -------------------                
    B b1 = new C();
    X x1 = new Y();
    -------------------
    C c = new C();
    B b2 = c;
    -------------------
    Y y = new Y();
    X x2 = y;
</code></pre>
<pre><code class="language-java">    // ❗❗ 불가능하다.
    C c1 = new B();
    C c2 = new X();</code></pre>
</br>

<p> ✍ 암묵적 형변환 코드 예시 )</p>
<pre><code class="language-java">// 부모 클래스
public class Unit {
    private String name;

    // 생성자 정의
    public Unit(String name) {
        super(); 
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // 재정의 대상
    public void attack() {
        System.out.println(this.name + &quot; &gt;&gt;&gt; 공격준비 &quot;);
    }
}</code></pre>
<pre><code class="language-java">// 자식 클래스

// 육군
public class Army extends Unit {

    // 부모 클래스의 생성자를 강제 호출하기 위한 생성자
    public Army(String name) {
        super(name);
    }

    // 공격의 형태를 육군에 맞게 변경하지만,
    // 부모 클래스가 가지고 있는 공격 준비 기능을
    // super 키워드를 통해 보전
    @Override
    public void attack() {
        super.attack();
        System.out.println(super.getName() + &quot; &gt;&gt; 지상공격 실행&quot;);
    }

    public void tank() {
        System.out.println(super.getName() + &quot; &gt;&gt; 탱크공격&quot;);
    }

}

// 해군
public class Navy extends Unit{

    public Navy(String name) {
        super(name);
    }

    @Override
    public void attack() {
        super.attack();
        System.out.println(this.getName() + &quot; &gt;&gt; 어뢰발사&quot;);
        System.out.println(this.getName() + &quot; &gt;&gt; 지상 상륙&quot;);
    }

    public void nucleus() {
        System.out.println(this.getName() + &quot; &gt;&gt; 핵미사일&quot;);
    }
}

// 공군
public class AirForce extends Unit {

    public AirForce(String name) {
        super(name);
    }

    @Override
    public void attack() {
        super.attack();
        System.out.println(super.getName() + &quot; &gt;&gt; 이륙&quot;);
        System.out.println(super.getName() + &quot; &gt;&gt; 공중공격 실행&quot;);
    }

    public void bombing() {
        System.out.println(this.getName() + &quot; &gt;&gt; 폭격&quot;);
    }
}</code></pre>
<pre><code class="language-java">// Main 클래스
public class Main01 {

    public static void main(String[] args) {
        // army, navy, airforce로 각각의 객체생성
        Army army = new Army(&quot;육군&quot;);
        Navy navy = new Navy(&quot;해군&quot;);
        AirForce air = new AirForce(&quot;공군&quot;);

        // 그 각각의 객체의 고유 기능을 사용
        army.tank();
        navy.nucleus();
        air.bombing();

        System.out.println(&quot;----------------------------------&quot;);

        // 상위 객체 형태로 암묵적 형변환
        Unit temp1 = army;
        Unit temp2 = navy;
        Unit temp3 = air;

        // 형변환이 되더라도 상속받거나 재정의한(Override)
        // 자신들의 기본 특성들은 그대로 유지
        temp1.attack();
        System.out.println();
        temp2.attack();
        System.out.println();
        temp3.attack();

        // 상위 클래스 형태로 형변환이 되면, 자신들의 독립 기능은
        // 사용하지 못한다.
//        temp1.tank();
//        temp2.nucleus();
//        temp3.bombing();

    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">육군 &gt;&gt; 탱크공격
해군 &gt;&gt; 핵미사일
공군 &gt;&gt; 폭격
----------------------------------
육군 &gt;&gt;&gt; 공격준비 
육군 &gt;&gt; 지상공격 실행

해군 &gt;&gt;&gt; 공격준비 
해군 &gt;&gt; 어뢰발사
해군 &gt;&gt; 지상 상륙

공군 &gt;&gt;&gt; 공격준비 
공군 &gt;&gt; 이륙
공군 &gt;&gt; 공중공격 실행</code></pre>
</br>

<h3 id="📙-암묵적-형변환-정리">📙 암묵적 형변환 정리</h3>
<p>객체가 상위클래스의 형태로 형변환 되더라도 Override된 자신의 기능은 잃지 않는다.
하지만, 추가적으로 구현한 기능은 사용할 수 없다.
</br></p>
<hr>
</br>

<h3 id="📃-명시적-형변환">📃 명시적 형변환</h3>
<ul>
<li>부모 클래스의 객체를 자식 클래스 형태로 변환하는 것</li>
<li>형변환을 위해서는 다음과 같이 변환할 클래스 이름을 명시적으로 지정해 주어야 한다.</li>
</ul>
<pre><code class="language-java">ChildClass child = (ChildClass)parent;</code></pre>
<p>❗❗  객체가 최초로 생성될 때 자식 클래스 형태로 생성되고, 부모 형태로 암묵적 형변환이 된 상태를
   다시 원래의 자식 클래스 형태로 되돌릴 경우에만 가능해진다.</p>
<pre><code class="language-java">   ChildClass child1 = new ChildClass();
ParentClass parent = child1;        // 암묵적 형변환
ChildClass child2 = (ChildClass)parent;    // 명시적 형변환</code></pre>
</br>

<h3 id="명시적-형변환-가능한-경우">명시적 형변환 가능한 경우</h3>
</br>

<p>✍ 명시적 형변환 코드 예시 )  </p>
<pre><code class="language-java">public class Main01 {

    public static void main(String[] args) {
        // army, navy, airforce로 각각의 객체생성
        Army army = new Army(&quot;육군&quot;);
        Navy navy = new Navy(&quot;해군&quot;);
        AirForce air = new AirForce(&quot;공군&quot;);

        System.out.println(&quot;----------------------------------&quot;);

        // 상위 객체 형태로 암묵적 형변환
        Unit temp1 = army;
        Unit temp2 = navy;
        Unit temp3 = air;

        temp1.attack();
        System.out.println();
        temp2.attack();
        System.out.println();
        temp3.attack();

        System.out.println(&quot;----------------------------------&quot;);

        // 하위 클래스 형태로 명시적 형변환
        Army re1 = (Army)temp1;
        Navy re2 = (Navy)temp2;
        AirForce re3 = (AirForce)temp3;

        re1.tank();
        re2.nucleus();
        re3.bombing();

    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">육군 &gt;&gt;&gt; 공격준비 
육군 &gt;&gt; 지상공격 실행

해군 &gt;&gt;&gt; 공격준비 
해군 &gt;&gt; 어뢰발사
해군 &gt;&gt; 지상 상륙

공군 &gt;&gt;&gt; 공격준비 
공군 &gt;&gt; 이륙
공군 &gt;&gt; 공중공격 실행
----------------------------------
육군 &gt;&gt; 탱크공격
해군 &gt;&gt; 핵미사일
공군 &gt;&gt; 폭격</code></pre>
</br>

<p>✍ 명시적 형변환이 불가능한 경우 </p>
<pre><code class="language-java">Unit u = new Unit();
Army army = (Army)u;        // 최초 객체 생성이 부모 형태로 만들어진 경우 불가능하다.</code></pre>
<pre><code class="language-java">Army army = new Army();
Unit u = army;
Navy navy = (Navy)u;        // 다른클래스로 만들어진 객체에 명시적 형변환은 불가능하다.</code></pre>
</br>

<h3 id="📙-암묵적-형변환-정리-1">📙 암묵적 형변환 정리</h3>
<p>하위 클래스 형태로 명시적 형변환을 함으로써, 자신들의 독립 기능(메서드)들을 사용할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 다형성 - 오버라이드, 오버로드]]></title>
            <link>https://velog.io/@hyun_ha/JAVA-%EB%8B%A4%ED%98%95%EC%84%B1-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%93%9C-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9</link>
            <guid>https://velog.io/@hyun_ha/JAVA-%EB%8B%A4%ED%98%95%EC%84%B1-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%93%9C-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9</guid>
            <pubDate>Wed, 13 Apr 2022 07:42:27 GMT</pubDate>
            <description><![CDATA[<h2 id="다형성이란">다형성이란?</h2>
<ol>
<li>하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다.</li>
<li>부모 클래스 타입으로 자식 클래스 객체를 참조 할 수 있다.
반대로 자식 클래스의 타입으로 부모 클래스 객체를 참조할 수는 <span style="color:red">없다.</span></li>
<li>객체지향 프로그래밍의 유연성, 재활용성, 유지보수성에 기본이 되는 특징이다.</li>
<li>대표적으로 오버라이드, 오버로딩이 있다.</br>
</li>
</ol>
<hr>
<p></br></br></p>
<blockquote>
<h2 id="📝-오버라이드--override-">📝 오버라이드 ( Override )</h2>
</blockquote>
<ul>
<li>부모 클래스로부터 상속받은 메서드의 기능을 재정의 하는 것을 말한다.</li>
</ul>
</br>

<h4 id="✍-코드-예시-1">✍ 코드 예시 1)</h4>
<pre><code class="language-java">// 부모 클래스
class Hello {

    public void say() {
        System.out.println(&quot;Hello!!!!!&quot;);
    }

}

// 자식 클래스 
class Korean extends Hello {

    public void say() {        // 부모 클래스의 say() 메서드를 재정의(오버라이드) 
        System.out.println(&quot;안녕하세요.&quot;);
    }

}</code></pre>
<pre><code class="language-java">// Main 클래스
public class Main {

    public static void main(String[] args) {
        Korean k = new Korean();
        k.say();    
    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">안녕하세요.</code></pre>
<p>❗ 자식 클래스인 Korean에서 부모 클래스의 메서드인 say()를 재정의 하였기 때문에,
Korean 클래스의 객체는 부모 클래스의 메서드 기능에 접근하지 못한다.</p>
</br>

<h4 id="✍-코드-예시-2">✍ 코드 예시 2)</h4>
<pre><code class="language-java">// 부모 클래스
class Hello {

    public void say() {
        System.out.println(&quot;Hello!!!!!&quot;);
    }

}

// 자식 클래스 
class Korean extends Hello {

    public void say() {        // 부모 클래스의 say() 메서드를 재정의(오버라이드) 
        super.say();        // super 키워드 사용
        System.out.println(&quot;안녕하세요.&quot;);
    }

}</code></pre>
<pre><code class="language-java">// Main 클래스
public class Main {

    public static void main(String[] args) {
        Korean k = new Korean();
        k.say();    
    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">Hello!!!!!
안녕하세요.</code></pre>
<p>❗ super 키워드는 부모 클래스의 메서드를 호출하는 기능을 가지고 있기 때문에
Override 된 자식 클래스의 메서드에서 super 키워드를 사용하면,
재정의 되기 이전의 부모 클래스에 대한 메서드를 호출할 수 있다.</p>
<p>❗ 즉 부모의 메서드를 호출한 뒤에 추가적인 기능을 정의하고 있으므로, 
부모의 원본 메서드에 대한 기능 확장 효과가 있다. </p>
</br>

<h3 id="override-옵션">@Override 옵션</h3>
<ul>
<li><p>부모 클래스의 say() 메서드를 재정의 하는 과정에서 개발자의 실수로 인해
 &quot;sai()&quot;라고 메서드가 추가되었다면, Java는 새로운 메서드를 추가한 것으로 인식하고,
 특별한 에러를 표시하지 않는다.</p>
</b>

<ul>
<li>이 때 부모의 메서드를 오버라이드하는 것이라는 걸 컴파일러에게 알려주는 
역할을 하는 것이 @Override 이다. </li>
<li>&quot;@Override&quot;은 이 키워드가 명시된 위치 아래에 정의되는 메서드가 부모 클래스에
존재하지 않을 경우 구문 에러로 처리한다.</li>
<li>즉 부모 클래스의 메서드를 재정의 하고자 할 경우 의도치 않은 실수를 예방하기 위한
&#39;오타 방지 옵션&#39;이다.</li>
<li>여러 개의 메서드를 재정의 한다면 재정의 되는 모든 메서드를 위에 각기 명시해야 한다.</li>
</ul>
</li>
</ul>
</br>

<h4 id="✍-코드-예시">✍ 코드 예시</h4>
<pre><code class="language-java">// 부모 클래스
class Hello {

    public void say() {
        System.out.println(&quot;Hello!!!!!&quot;);
    }

}

// 자식 클래스 
class Korean extends Hello {

    @Override
    public void sai() {        // 🔥 ERROR - say()메서드 이름이 틀렸기 때문에 구문 에러가 난다.
        System.out.println(&quot;안녕하세요.&quot;);
    }

}</code></pre>
</br>

<hr>
</br>


<blockquote>
<h2 id="📝-오버로드--overload-">📝 오버로드 ( Overload )</h2>
</blockquote>
<ul>
<li>한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 말한다.</li>
</ul>
</br>

<h3 id="오버로드가-성립하는-조건">오버로드가 성립하는 조건</h3>
<ol>
<li>메서드 이름이 같아야 한다.</li>
<li>파라미터의 개수 또는 타입이 달라야 한다.</li>
<li>return 타입은 관계 없다.</li>
</ol>
</br>

<h4 id="✍-코드-예시-">✍ 코드 예시 )</h4>
<pre><code class="language-java">public class Calc {

    int add (int a, int b) {
        return a + b;
    }

    int add (int a, int b, int c) {        // 파라미터 개수가 다른 경우
        return a + b + c;
    }

    double add (double a, double b) {    // 파라미터 타입이 다른 경우
        return a + b;
    }

}</code></pre>
<pre><code class="language-java">public class Main {

    public static void main(String[] args) {
        Calc c = new Calc();

        System.out.println(c.add(2, 4));

        System.out.println(c.add(2, 4, 6));

        System.out.println(c.add(1.2, 1.3));

    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">6
12
2.5</code></pre>
</br>

<h3 id="생성자의-overload">생성자의 Overload</h3>
<ul>
<li>생성자를 Overload할 경우, 해당 클래스에 대해 &#39;객체를 생성하는 방법&#39;을 다양하게
 준비할 수 있게 된다.</li>
<li>this 키워드를 사용한 생성자 Overload<ul>
<li>메서드처럼 사용할 경우, 현재 클래스의 다른 생성자를 의미한다.</li>
<li>파라미터가 서로 다른 생성자들이 하나의 완전한 생성자를 호출하도록 하여,
 데이터의 초기화를 한 곳에서 일괄적으로 처리하도록 구현할 수 있다.</li>
</ul>
</li>
</ul>
</br>

<h4 id="✍-코드-예시--1">✍ 코드 예시 )</h4>
<pre><code class="language-java">public class Article {
    private int seq;        // 글 번호
    private String subject;    // 글 제목
    private String writer;    // 글 작성자

    //파라미터가 있는 생성자
    public Article(int seq, String subject, String writer) {
        this.seq = seq;
        this.subject = subject;
        this.writer = writer;
    }

    public Article(int seq, String writer) {        // this 키워드를 사용한 생성자 Overload
        this(seq, &quot;제목없음&quot;, writer);
    }

    public Article(int seq) {                        // this 키워드를 사용한 생성자 Overload
        this(seq, &quot;제목없음&quot;, &quot;익명&quot;);
    }

    // toString()
    public String toString() {
        return &quot;Article [seq = &quot; + seq + &quot;, subject = &quot; + subject + &quot;, writer = &quot; + writer + &quot;]&quot;;
    }

}</code></pre>
<pre><code class="language-java">public class Main {

    public static void main(String[] args) {
        Article a1 = new Article(1, &quot;첫 번째 게시물&quot;, &quot;자바학생&quot;);
        System.out.println(a1.toString());

        Article a2 = new Article(2, &quot;자바학생2&quot;);
        System.out.println(a2);        // 이렇게 객체만 출력해도 toString을 우선적으로 찾아서 실행시켜준다.
                                    // 단, toString이 정의되지 않으면 주소값이 나온다.

        Article a3 = new Article(3);
        System.out.println(a3);
    }

}</code></pre>
<p>👉 실행 결과</p>
<pre><code class="language-java">Article [seq = 1, subject = 첫 번째 게시물, writer = 자바학생]
Article [seq = 2, subject = 제목없음, writer = 자바학생2]
Article [seq = 3, subject = 제목없음, writer = 익명]</code></pre>
</br>

<hr>
</br>

<h2 id="📙-오버라이드override-vs-오버로드overload">📙 오버라이드(Override) vs 오버로드(Overload)</h2>
</br>

<table>
<thead>
<tr>
<th align="center"></th>
<th align="center">오버라이드(Override)</th>
<th align="center">오버로드(Overload)</th>
</tr>
</thead>
<tbody><tr>
<td align="center">정의</td>
<td align="center">상속받은 메서드의 내용을 변경하는 것</td>
<td align="center">기존에 없는 새로운 메서드를 정의하는 것</td>
</tr>
<tr>
<td align="center">조건</td>
<td align="center">메서드 이름, 파라미터 개수와 타입, 리턴타입이 모두 동일해야 한다.</td>
<td align="center">메서드 이름은 동일하지만 파라미터 개수와 타입이 달라야 한다.</td>
</tr>
<tr>
<td align="center">관계</td>
<td align="center">상속 관계</td>
<td align="center">동일한 클래스 내 or 상속 관계</td>
</tr>
</tbody></table>
]]></description>
        </item>
    </channel>
</rss>