<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>chaean_7714.log</title>
        <link>https://velog.io/</link>
        <description>왜! 언제! 어떻게! 😁</description>
        <lastBuildDate>Thu, 18 Feb 2021 11:13:25 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>chaean_7714.log</title>
            <url>https://images.velog.io/images/chaean_7714/profile/5340a3f4-fbdf-4453-a6b8-7d944e372929/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. chaean_7714.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/chaean_7714" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Maven] Dependency Scope의 종류]]></title>
            <link>https://velog.io/@chaean_7714/Maven-Dependency-Scope%EC%9D%98-%EC%A2%85%EB%A5%98</link>
            <guid>https://velog.io/@chaean_7714/Maven-Dependency-Scope%EC%9D%98-%EC%A2%85%EB%A5%98</guid>
            <pubDate>Thu, 18 Feb 2021 11:13:25 GMT</pubDate>
            <description><![CDATA[<p>[Maven] Dependency Scope의 종류
Published on: 2013. 11. 14. 14:10 by louis.dev</p>
<p>maven은 dependency 엘리먼트 하위의 scope 엘리먼트를 통해 포함하려는 라이브러리의 범위를 지정할 수 있다. Maven 3에서는 다음의 여섯가지 옵션을 지원하고 있다.
compile : 기본 scope이다. 만약 dependency에 아무것도 입력하지 않았다면 기본적으로 입력되는 scope이다. 이 옵션은 프로젝트의 모든 classpath에 추가된다(테스트 중이건 런타임 중이건 상관없이).
provided : 이 옵션은 compile과 매우 비슷하지만, 실행시 의존관계를 제공하는 JDK나 Web Container(tomcat 같은)에 대해서 적용된다.  예를 들어 Java Enterprise Edition Web application을 개발할때 Servlet API나 Java EE API들은 &quot;provided&quot; scope로 지정해야한다. 왜냐하면 Servlet API같은 경우는 Servlet Container 자체에서 지원해 주기 때문에(Tomcat 같은 경우는 ${tomcat home directory}/lib 디렉토리에 있는 Servlet 라이브러리를 사용) 컴파일시 또는 테스트시에는 필요하지만 실행시에는 필요하지 않기 때문이다.
runtime : 컴파일 시에는 필요하지 않지만 실행시에 사용되는 경우 사용한다. 이 옵션은 런타임, 테스트 시 classpath에 추가 되지만, 컴파일시에는 추가 되지 않는다.
test : 일반적인 경우에는 필요하지 않고 테스트시에만 필요한 경우 사용한다.
system : 해당 jar를 포함해야 한다고 명시적으로 입력 하는 것을 제외하고는 provided와 유사하다. 선언된 artifact들은 항상 사용가능하지만 Maven의 central repository에서 찾아서 가져오는 것은 아니다.
import : Maven 2.0.9 이상의 버전에서 지원하는 scope로서, 이 scope는 <dependencyManagement> 섹션에서 pom의 의존관계에 대해 사용된다. 지정된 pom이 해당 pom의 <dependencyManagement> 영역에 있는 의존관계로 대체됨을 뜻한다.
자세한 예제는 메이븐 공식 홈페이지 에서 확인할 수 있다.</p>
<p>출처: <a href="https://krespo.net/166">https://krespo.net/166</a> [KRESPO.NET]</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[디비버와 오라클 연결시 ORA-12514, TNS:listener does not currently know of service requested in connect descriptor ]]></title>
            <link>https://velog.io/@chaean_7714/%EB%94%94%EB%B9%84%EB%B2%84%EC%99%80-%EC%98%A4%EB%9D%BC%ED%81%B4-%EC%97%B0%EA%B2%B0%EC%8B%9C-ORA-12514-TNSlistener-does-not-currently-know-of-service-requested-in-connect-descriptor</link>
            <guid>https://velog.io/@chaean_7714/%EB%94%94%EB%B9%84%EB%B2%84%EC%99%80-%EC%98%A4%EB%9D%BC%ED%81%B4-%EC%97%B0%EA%B2%B0%EC%8B%9C-ORA-12514-TNSlistener-does-not-currently-know-of-service-requested-in-connect-descriptor</guid>
            <pubDate>Thu, 18 Feb 2021 00:47:34 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>os환경: windows10</strong></p>
</blockquote>
<blockquote>
<p><strong>db환경: Oracle Database 11g Express Edition Release 11.2.0.2.0</strong></p>
</blockquote>
<blockquote>
<p><strong>error:ORA-12514, TNS:listener does not currently know of service requested in connect descriptor</strong></p>
</blockquote>
<p> 접속하기 위한 작성된 코드의 오타
==&gt; 오라클의 SID, SERVICE_NAME은 대소문자를 반드시 구분하여 기술해야 한다.</p>
<p><img src="https://images.velog.io/images/chaean_7714/post/37422d22-a8af-4f37-8070-d574a1bb7ede/image.png" alt=""></p>
<p>host아래 Database에 들어가야할 Service name을 잘못 적어서 나오는 에러였다.
이런 에러가 나오면 본인의 오라클 정보를 확인하자!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring project 설정 순서]]></title>
            <link>https://velog.io/@chaean_7714/Spring-project-%EC%84%A4%EC%A0%95-%EC%88%9C%EC%84%9C</link>
            <guid>https://velog.io/@chaean_7714/Spring-project-%EC%84%A4%EC%A0%95-%EC%88%9C%EC%84%9C</guid>
            <pubDate>Mon, 15 Feb 2021 10:44:23 GMT</pubDate>
            <description><![CDATA[<p>  SpringMVC03</p>
<ol>
<li>pom.xml:ojdbc6(+repository),mybatis,mybatis-spring,commoms-dbcp,spring-orm을 설치</li>
<li>web.xml:applicationContext.xml 변경, mapping(*,do), encoding filter 설정</li>
<li>/WEB-INF/spring/sqls/myboard.sql</li>
<li>DTO,DAO,BIZ,controller</li>
<li>src/main/resources/mybatis/board-mapper.xml</li>
<li>src/main/resources/mybatis/db.properties</li>
<li>/web-inf/spring/sqls/config.xml</li>
<li>applicationContext.xml, servlet-context.xml 을 가지고 놀것이다.</li>
</ol>
<p>_filter
9.  com/mvc/upgrade/common/filter/LogFilter(impl javax.servlet.Filter)
10. web.xml:filter</p>
<p>_aop
11. pom.xml : aspectjweaver, aspectjrt
12. com/mvc/upgrade/common/aop/LogAop
13. WEB-INF/spring/appServlet/aop-context.xml
14. web.xml : aop-context.xml 추가(init-param)
15. src/main/resources/log4j.xml(logger추가 및 log level변경 - trace)
16. pom.xml:jackson-core-asl,jsckson-mapper-asl(spring 4.x 이후부터는 변경된)
17.web-inf/spring/sqls/mymember.sql</p>
<p>_login
18.dto,dao,biz,controller
19.src/main/resources/mybatis/member-mapper.xml
20.web-inf/spring/sqls/config.xml</p>
<p>_intercepter
21. com/mvc/upgrade/common/intercepter/LoginIntercepter(impl HandlerIntercepter)
22. servlet-context.xml:인터셉터 추가</p>
<p>_transaction</p>
<ol start="23">
<li>(Board)dao,biz,controller 에 무엇인가 추가.</li>
<li>servlet-context.xml :tx(namespace)추가</li>
<li>applicationContext.xml:transactionManager</li>
</ol>
<p>_security
26. pom.xml:spring-security-web
27. /WEB-INF/spring/appServlet/secutity-context.xml
28. web.xml:security-context.xml 추가</p>
<p>spring version upgrade 방법
1.web.xml:2.5-&gt;4.0
(dynamic web project 만들면서 web module 설정을 4.0으로 생성-&gt;생성된 web.xml 부분 복사해서 스프링에 붙여넣기)</p>
<p>2.pom.xml
java:1.6-&gt;1.8
springframework-version:3.1.1-&gt;원하는 버전
servlet-api:2.5-&gt;4.0.1(servlet-api-&gt;javax.servlet-api)
jsp-api:2.1-&gt;2.3.3(jsp-api-&gt;javax.servlet.jsp-api)
maven-compiler-plugin:source/target 둘다 1.6-&gt;1.8</p>
<p>3.project facet
dynamic web module 2.5-&gt;4.0
java 1.6-&gt;1.8</p>
<p>4.maven update</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Servlet 이란?]]></title>
            <link>https://velog.io/@chaean_7714/Servlet-%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@chaean_7714/Servlet-%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Sat, 13 Feb 2021 06:21:09 GMT</pubDate>
            <description><![CDATA[<h3 id="1정의">1.정의</h3>
<h4 id="서버쪽에서-실행되면서-클라이언트의-요청에-따라-동적으로-서비스를-제공하는-자바-클래스클라이언트의-http요청에-대해-특정-기능을-수행-html-문서를-생성등의-응답을-하는-인터넷-서버-프로그램">서버쪽에서 실행되면서 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스.(클라이언트의 HTTP요청에 대해 특정 기능을 수행, HTML 문서를 생성등의 응답을 하는 인터넷 서버 프로그램.)</h4>
<h3 id="2서블릿-컨테이너">2.서블릿 컨테이너</h3>
<h4 id="서블릿을-관리하면서--서블릿의-생명주기를-관리하고-요청에-따라-스레드를-생성해준다-또-클라이언트의-request를-받아주고-response를-보낼-수-있게-웹-서버와-소켓을-만들어서-통신을-해준다">서블릿을 관리하면서 , 서블릿의 생명주기를 관리하고, 요청에 따라 스레드를 생성해준다. 또 클라이언트의 Request를 받아주고 Response를 보낼 수 있게 웹 서버와 소켓을 만들어서 통신을 해준다.</h4>
<p><img src="https://images.velog.io/images/chaean_7714/post/71d15064-8350-42c1-adb3-6213a550ef10/image.png" alt=""></p>
<h3 id="3-톰캣">3. 톰캣</h3>
<h4 id="톰캣은-서블릿-컨테이너이다-톰캣은-웹-서버와-연동하여-실행할-수-있는-자바-환경을-제공하여-자바-서버페이지와-자바-서블릿이-실행할-수-있는-환경을-제공하고-있다">톰캣은 서블릿 컨테이너이다. 톰캣은 웹 서버와 연동하여 실행할 수 있는 자바 환경을 제공하여 자바 서버페이지와 자바 서블릿이 실행할 수 있는 환경을 제공하고 있다.</h4>
<p>웹서버와 WAS참조<a href="http://blog.naver.com/PostView.nhnblogId=ssohyuny2000&amp;logNo=155249496">http://blog.naver.com/PostView.nhnblogId=ssohyuny2000&amp;logNo=155249496</a>
출처:<a href="https://jusungpark.tistory.com/15">https://jusungpark.tistory.com/15</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[내가 참고하는 사이트 ]]></title>
            <link>https://velog.io/@chaean_7714/%EB%82%B4%EA%B0%80-%EC%B0%B8%EA%B3%A0%ED%95%98%EB%8A%94-%EC%82%AC%EC%9D%B4%ED%8A%B8</link>
            <guid>https://velog.io/@chaean_7714/%EB%82%B4%EA%B0%80-%EC%B0%B8%EA%B3%A0%ED%95%98%EB%8A%94-%EC%82%AC%EC%9D%B4%ED%8A%B8</guid>
            <pubDate>Sat, 13 Feb 2021 06:02:56 GMT</pubDate>
            <description><![CDATA[<p>서블릿이란?  <a href="https://mangkyu.tistory.com/14">https://mangkyu.tistory.com/14</a></p>
<h4 id="jdbcjava-database-connectivity는-span-stylecolorred자바span에서-span-stylecolorred데이터베이스에-접속span할-수-있도록-하는-span-stylecolorred자바-apispan이다">JDBC(Java Database Connectivity)는 <span style="color:red">자바</span>에서 <span style="color:red">데이터베이스에 접속</span>할 수 있도록 하는 <span style="color:red">자바 API</span>이다.</h4>
<h4 id="ojdbc오라클-사이트에서-자바와-오라클-데이터베이스의-연동을-위한-ojdbc-라이브러리를-제공하고-있고">ojdbc:오라클 사이트에서 자바와 오라클 데이터베이스의 연동을 위한 ojdbc 라이브러리를 제공하고 있고</h4>
<h4 id="mybatis정리httpsvelogiochangyeonyoomybatiseb9e80-ec9ea5eca090-ed8ab9eca795-ecbbb4ed8faceb848ced8ab8">mybatis정리:<a href="https://velog.io/@changyeonyoo/Mybatis%EB%9E%80-%EC%9E%A5%EC%A0%90-%ED%8A%B9%EC%A7%95-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8">https://velog.io/@changyeonyoo/Mybatis%EB%9E%80-%EC%9E%A5%EC%A0%90-%ED%8A%B9%EC%A7%95-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</a></h4>
<h4 id="필터란httpstwofootdoggithubiospring-ed9584ed84b0filtereb9e80-ebacb4ec9787ec9db8eab080">필터란?:<a href="https://twofootdog.github.io/Spring-%ED%95%84%ED%84%B0(Filter)%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80/">https://twofootdog.github.io/Spring-%ED%95%84%ED%84%B0(Filter)%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80/</a></h4>
<h4 id="resoueces-폴더패턴들--httpsgocodertistorycom1105">resoueces 폴더패턴들-&gt; <a href="https://gocoder.tistory.com/1105">https://gocoder.tistory.com/1105</a></h4>
<h4 id="스피일-폴더구성---httpscodevangtistorycom240">스피일 폴더구성 -&gt; <a href="https://codevang.tistory.com/240">https://codevang.tistory.com/240</a></h4>
<h4 id="스프링-필터-aop-interceptorhttpsyzlosmiktistorycom24">스프링 필터-AOP-interceptor:<a href="https://yzlosmik.tistory.com/24">https://yzlosmik.tistory.com/24</a></h4>
<h4 id="log-httpsto-dytistorycom20">log <a href="https://to-dy.tistory.com/20">https://to-dy.tistory.com/20</a></h4>
<h4 id="spring-httpsvictorydntmdtistorycom176">spring <a href="https://victorydntmd.tistory.com/176">https://victorydntmd.tistory.com/176</a></h4>
<h4 id="static-httpsmangkyutistorycom47category872426">static <a href="https://mangkyu.tistory.com/47?category=872426">https://mangkyu.tistory.com/47?category=872426</a></h4>
<h4 id="lombok-httpsadvenohtistorycom24">lombok <a href="https://advenoh.tistory.com/24">https://advenoh.tistory.com/24</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[web.xml, pom.xml 정리.]]></title>
            <link>https://velog.io/@chaean_7714/web.xml-pom.xml-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@chaean_7714/web.xml-pom.xml-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sat, 13 Feb 2021 05:52:41 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👀이 글은 제가 공부한 것들을 잊어버리지 않기 위해 정리해 놓은 것입니다.</p>
</blockquote>
<h3 id="📌webxml이란">📌web.xml이란?</h3>
<h4 id="웹-어플리케이션의-span-stylecolorred배포설명자span로-각-span-stylecolorred어플리케이션의-환경을-설정span하는-역할을-한다">웹 어플리케이션의 <span style="color:red">배포설명자</span>로, 각 <span style="color:red">어플리케이션의 환경을 설정</span>하는 역할을 한다.</h4>
<h4 id="서버-작동이-가능하도록-servlet-정보를-설정함">(서버 작동이 가능하도록 servlet 정보를 설정함.)</h4>
<h4 id="브라우저가-java-servlet에-접근하기-위해서는-wasex-tomcat에-필요한-정보를-알려줘야-해당하는servlet을-호출할-수-있다">(브라우저가 Java Servlet에 접근하기 위해서는 WAS(Ex. Tomcat)에 필요한 정보를 알려줘야 해당하는Servlet을 호출할 수 있다.)</h4>
<h3 id="📌maven이란">📌maven이란?</h3>
<h4 id="출처httpsvelogiochangyeonyoomaven-ec9db4eb9e80">출처:<a href="https://velog.io/@changyeonyoo/Maven-%EC%9D%B4%EB%9E%80">https://velog.io/@changyeonyoo/Maven-%EC%9D%B4%EB%9E%80</a></h4>
<h3 id="📌pomxml이란">📌pom.xml이란?</h3>
<h4 id="span-stylecolorred프로젝트의-중요한-정보span를-정의하고-정리하기-위한-곳이다"><span style="color:red">프로젝트의 중요한 정보</span>를 정의하고 정리하기 위한 곳이다.</h4>
<h4 id="대부분-maven의-중요-설정파일들이-들어가있으며-라이브러리를-추가함으로써-불러오는-기능인-의존성-이-있으며-실제-라이브러리-파일이-저장되어-있는-저장소-서버의-위치를-지정하고-사용할-라이브러리를-지정해줍니다">대부분 Maven의 중요 설정파일들이 들어가있으며, 라이브러리를 추가함으로써, 불러오는 기능인 &#39;의존성&#39; 이 있으며, 실제 라이브러리 파일이 저장되어 있는 저장소 서버의 위치를 지정하고, 사용할 라이브러리를 지정해줍니다.</h4>
<h4 id="그렇기-때문에-maven을-통해서-라이브러리를-설정해놓고-잘-관리한다면-jar파일을-보다-pomxml-파일만-관리하면-됩니다">그렇기 때문에, Maven을 통해서 라이브러리를 설정해놓고 잘 관리한다면, jar파일을 보다 pom.xml 파일만 관리하면 됩니다.</h4>
<p>출처:<a href="https://m.blog.naver.com/rla99tjr/221862232097">https://m.blog.naver.com/rla99tjr/221862232097</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[annotation 정리 ing...]]></title>
            <link>https://velog.io/@chaean_7714/annotation-%EC%A0%95%EB%A6%AC-ing</link>
            <guid>https://velog.io/@chaean_7714/annotation-%EC%A0%95%EB%A6%AC-ing</guid>
            <pubDate>Sat, 13 Feb 2021 04:37:06 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👀이 글은 제가 공부한 것들을 잊어버리지 않기 위해 정리해 놓은 것입니다.</p>
</blockquote>
<h4 id="modelattribute">@ModelAttribute</h4>
<h4 id="사용자-요청시-전달하는-값은-오브젝트-형태로-전달한다-메소드레벨-그리고-메소드-파라미터에-적용가능하다">사용자 요청시 전달하는 값은 오브젝트 형태로 전달한다. 메소드레벨 그리고 메소드 파라미터에 적용가능하다.</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[AOP 란?]]></title>
            <link>https://velog.io/@chaean_7714/AOP-%EB%9E%80</link>
            <guid>https://velog.io/@chaean_7714/AOP-%EB%9E%80</guid>
            <pubDate>Thu, 11 Feb 2021 20:44:28 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👀이 글은 제가 공부한 것들을 잊어버리지 않기 위해 정리해 놓은 것입니다.</p>
</blockquote>
<br>
<br>

<h3 id="aopaspect---oriented---programing-관점지향-프로그래밍">AOP(Aspect - Oriented - Programing): 관점지향 프로그래밍.</h3>
<h4 id="✔aop는-spring이-아니라-span-stylecolorred방법론span이다">✔AOP는 spring이 아니라 <span style="color:red">방법론</span>이다.</h4>
<h4 id="✔사용자가-원하는-관점의-업무주업무-객체지향이-아닌">✔사용자가 원하는 관점의 업무(주업무-객체지향)이 아닌,</h4>
<h4 id="span-stylecolorred개발자가-원하는-관점의-업무로그보안트랜잭션span을-말한다"><span style="color:red">개발자가 원하는 관점의 업무(로그,보안,트랜잭션...)</span>을 말한다.</h4>
<p><img src="https://images.velog.io/images/chaean_7714/post/bfe3eedd-3c7f-4eab-a97d-afceaa67bace/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/chaean_7714/post/20ea55cc-7667-44fd-af24-c590a253ca4c/image.png" alt=""></p>
<h4 id="✔공통-관심-사항로그보안트랜잭션은-프록시-객체로-따로-빼어-놓고-사용한다">✔공통 관심 사항(로그,보안,트랜잭션...)은 프록시 객체로 따로 빼어 놓고 사용한다.</h4>
<p><img src="https://images.velog.io/images/chaean_7714/post/87ceb628-4057-47d0-8c9f-fc23b6f563a9/image.png" alt=""></p>
<h4 id="📌용어정리">📌용어정리.</h4>
<table>
<thead>
<tr>
<th align="center">용어</th>
<th align="center">의미</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><code>CC</code></td>
<td align="center">관심사</td>
</tr>
<tr>
<td align="center"><code>CCC</code></td>
<td align="center">공통 관심사</td>
</tr>
<tr>
<td align="center"><code>advice</code></td>
<td align="center">ccc의 코드</td>
</tr>
<tr>
<td align="center"><code>join point</code></td>
<td align="center">포인트 컷이 들어갈 수 있는 모든 위치</td>
</tr>
<tr>
<td align="center"><code>point cut</code></td>
<td align="center">ccc에 cc를 연결.(짝을 지어주는 것)</td>
</tr>
<tr>
<td align="center"><code>advisor</code></td>
<td align="center">advice + point cut</td>
</tr>
<tr>
<td align="center"><code>프록시 객체</code></td>
<td align="center">가로채서 연결해 주는 것.</td>
</tr>
</tbody></table>
<h4 id="프록시-객체">프록시 객체:</h4>
<h4 id="타겟cc을-호출하면-자기가-타겟cc인-척-호출되어-span-stylecolorred타겟cc에-지정된-어드바이스span를-첨가해서-타겟에게-건내줌ccc가-붙어서-나옴-그러면-타겟은-그걸-뿌림">타겟(cc)을 호출하면 자기가 타겟(cc)인 척 호출되어 <span style="color:red">타겟(cc)에 지정된 어드바이스</span>를 첨가해서 타겟에게 건내줌(ccc가 붙어서 나옴). 그러면 타겟은 그걸 뿌림.</h4>
<br>
<br>
<br>






<p>출처:<a href="https://www.youtube.com/watch?v=y2JkXjOocZ4">https://www.youtube.com/watch?v=y2JkXjOocZ4</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[13.제네릭.]]></title>
            <link>https://velog.io/@chaean_7714/13.%EC%A0%9C%EB%84%A4%EB%A6%AD</link>
            <guid>https://velog.io/@chaean_7714/13.%EC%A0%9C%EB%84%A4%EB%A6%AD</guid>
            <pubDate>Thu, 11 Feb 2021 03:57:54 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👀이 글은 제가 공부한 것들을 잊어버리지 않기 위해 정리해 놓은 것입니다.</p>
</blockquote>
<h3 id="131-제네릭을-사용하는-이유는">13.1 제네릭을 사용하는 이유는?</h3>
<h4 id="제네릭--정의-span-stylecolorred클래스span-span-stylecolorred인터페이스span-span-stylecolorred메소드span를-정의할-때--span-stylecolorred타입span을-span-stylecolorred파라미터span로-사용할-수-있도록-해준다">제네릭  정의: <span style="color:red">클래스</span>, <span style="color:red">인터페이스</span>, <span style="color:red">메소드</span>를 정의할 때  <span style="color:red">타입</span>을 <span style="color:red">파라미터</span>로 사용할 수 있도록 해준다.</h4>
<h4 id="✨컴파일에서-잘못된-타입을-검사해-준다">✨컴파일에서 잘못된 타입을 검사해 준다.</h4>
<h4 id="✨타입-변환을-제거한다">✨타입 변환을 제거한다.</h4>
<pre><code>List list = new ArrayList();
list.add(&quot;hello&quot;);
String str = (String)list.get(0);


List&lt;String&gt; list = new ArrayList&lt;String&gt;();     
list.add(&quot;hello&quot;);
String str = list.get(0);
</code></pre><h3 id="132-제네릭-타입class-t-interface-t-">13.2 제네릭 타입(class&lt; T &gt;,interface&lt; T &gt;)</h3>
<h4 id="타입을-파라미터로-가지는-span-stylecolorred클래스span와span-stylecolorred인터페이스span를-말한다">타입을 파라미터로 가지는 <span style="color:red">클래스</span>와<span style="color:red">인터페이스</span>를 말한다.</h4>
<h4 id="사용이유-✨타입-변환을-제거한다">사용이유: ✨타입 변환을 제거한다.</h4>
<pre><code>public class Box&lt;T&gt;{
    private T t;                     //T는 Box클래스를 객체로 생성할 때 구체적인 타입으로 변경된다.
    public T get() {return t;}
    public void set(T t) {this.t = t; }

}



Box&lt;String&gt; box = new Box&lt;String&gt;();

public class Box&lt;String&gt; {              //객체가 생성되면서 타입이 바뀜.
    private String t;
    public String get() {return t;}
    public void set(String t) {this.t = t;}

}
</code></pre><h3 id="133-멀티-타입-파라미터classkvinterfacekv">13.3 멀티 타입 파라미터(class&lt;k,v,...&gt;,interface&lt;k,v,...&gt;)</h3>
<h4 id="제네릭-타입은-두-개-이상의-타입-파라미터를-사용할-수-있다">제네릭 타입은 두 개 이상의 타입 파라미터를 사용할 수 있다.</h4>
<pre><code>public class Product&lt;T, M&gt; {
    private T kind;
    private M model;

    public T getKind() {
        return kind;
    }

    public M getModel() {
        return model;
    }

    public void setKind(T kind) {
        this.kind = kind;
    }

    public void setModel(M model) {
        this.model = model;
    }
}


public static void main(String[] args) {

    Product&lt;TV, String&gt; product1 = new Product&lt;TV, String&gt;();
    product1.setKind(new TV());
    product1.setModel(&quot;스마트TV&quot;);

    TV tv = product1.getKind();
    String tvModel = product1.getKind();

    Product&lt;Car, String&gt; product1 = new Product&lt;Car, String&gt;();
    product1.setKind(new Car());
    product1.setModel(&quot;디젤&quot;);

    Car tv = product1.getKind();
    String carModel = product1.getKind();

}
</code></pre><h3 id="134-제네릭-메소드-t-r--r-method-t-t">13.4 제네릭 메소드(&lt; T, R &gt; R method (T t))</h3>
<h4 id="제네릭-메소드는-span-stylecolorred매개타입span과-span-stylecolorred리턴타입span으로-타입-파라미터를-갖는-메소드를-말한다">제네릭 메소드는 <span style="color:red">매개타입</span>과 <span style="color:red">리턴타입</span>으로 타입 파라미터를 갖는 메소드를 말한다.</h4>
<pre><code>🎈예제1
public &lt; 타입 파라미터 &gt;  리턴타입  메소드면(매개변수,....){.....}</code></pre><pre><code>🎈예제2
public class Util {

    public static &lt;T&gt; Box&lt;T&gt; boxing(T t){

        Box&lt;T&gt; box = new Box&lt;T&gt;();
        box.set(t);

        return box;

        }
}



public class BoxingMethodExamplw{
    public static void main(String[] args) {

        Box&lt;Integer&gt; box1 = Util.&lt;Integer&gt;boxing(100); //🎃제네릭 메소드 호출방법1
        int intvalue = box1.get();

        Box&lt;String&gt; box2 = Util.boxing(&quot;홍길동&quot;);       //🎃제네릭 메소드 호출방법2
        String strvalue = box1.get();

    }
}</code></pre><pre><code>🎈예제3
public class Pair&lt;K, V&gt; {

    private K key;
    private V value;

    public Pair(K key, V value) {

        this.key = key;
        this.value = value;
    }

    public K getKey() {
        return key;
    }

    public void setKey(K key) {
        this.key = key;
    }

    public V getValue() {
        return value;
    }

    public void setValue(V value) {
        this.value = value;
    }



}

public class Util {

    public static &lt;K, V&gt; boolean compare(Pair&lt;K, V&gt; p1, Pair&lt;K, V&gt; p2) {

        boolean keyCompare = p1.getKey().equals(p2.getKey());
        boolean valCompare = p1.getValue().equals(p2.getValue());

        return keyCompare &amp;&amp; valCompare;
    }

}
public class CompareMethodExample {

    public static void main(String[] args) {

        Pair&lt;Integer , String&gt; p1 = new Pair&lt;Integer, String&gt;(1, &quot;사과&quot;);
        Pair&lt;Integer , String&gt; p2 = new Pair&lt;Integer, String&gt;(1, &quot;사과&quot;);

        boolean result1 = Util.&lt;Integer, String&gt;compare(p1, p2);
        if(result1) {
            System.out.println(&quot;논리적으로 동등하다1.&quot;);
        }else {
            System.out.println(&quot;논리적으로 동등하지 않다1.&quot;);
        }

        Pair&lt;String , String&gt; p3 = new Pair&lt;String, String&gt;(&quot;user1&quot;, &quot;사과&quot;);
        Pair&lt;String , String&gt; p4 = new Pair&lt;String, String&gt;(&quot;user2&quot;, &quot;사과&quot;);

        boolean result2 = Util.compare(p3, p4);
        if(result2) {
            System.out.println(&quot;논리적으로 동등하다2.&quot;);
        }else {
            System.out.println(&quot;논리적으로 동등하지 않다2.&quot;);
        }



    }

}

</code></pre><h3 id="135-제한된-타입-파라미터-t-extends-최상위-타입-">13.5 제한된 타입 파라미터(&lt; T extends 최상위 타입 &gt;)</h3>
<h4 id="타입-파라미터에-구체적인-타입을-제한할-때-사용한다">타입 파라미터에 구체적인 타입을 제한할 때 사용한다.</h4>
<h4 id="상위-타입은-클래스뿐만-아니라-인터페이스도-가능하다">상위 타입은 클래스뿐만 아니라 인터페이스도 가능하다.</h4>
<h4 id="인터페이스라고-해서-implements를-사용하지-않는다">인터페이스라고 해서 Implements를 사용하지 않는다.</h4>
<pre><code>🎈예제1
public class Util {

    public static &lt;T extends Number&gt; int compare(T t1, T t2) {
        double v1 = t1.doubleValue();
        double v2 = t2.doubleValue();

        return Double.compare(v1, v2);
    }

}

public class BoundedTypeParameterExample {
    public static void main(String[] args) {

        // String str = Util.compare(&quot;a&quot;, &quot;b&quot;); String은 Number타입이 아님.

        int result = Util.compare(10, 20);
        System.out.println(result);

        int result2 = Util.compare(4.5, 3);
        System.out.println(result2);

    }

}
</code></pre><h3 id="136-와일드카드-타입-----extends---super">13.6 와일드카드 타입(&lt; ? &gt;, &lt; ? extends...&gt;, &lt; ? super...&gt;)</h3>
<h4 id="제네릭-타입을-매개값이나-리턴-타입으로-사용할-떄-구체적인-타입대신-와일드-카드를-사용할-수-있다">제네릭 타입을 매개값이나 리턴 타입으로 사용할 떄 구체적인 타입대신 와일드 카드를 사용할 수 있다.</h4>
<h4 id="수강생이-될-수-있는-타입은-4가지-클래스라고-가정하자">수강생이 될 수 있는 타입은 4가지 클래스라고 가정하자.</h4>
<p><img src="https://images.velog.io/images/chaean_7714/post/dcae7cee-e66d-404c-ac70-14c2baa4adda/%EC%A0%9C%EB%84%A4%EB%A6%AD%EA%B7%B8%EB%A6%BC.jpg" alt=""></p>
<pre><code>🎈예제1
public class Course&lt;T&gt; {

    private String name;
    private T[] students;

    public Course(String name, int capacity) {
        this.name = name;
        students = (T[]) (new Object[capacity]);
    }

    public String getName() {
        return name;
    }

    public T[] getStudents() {
        return students;
    }

    public void add(T t) {
        for (int i = 0; i &lt; students.length; i++) {
            if (students[i] == null) {
                students[i] = t;
                break;
            }
        }
    }

}


public class WildCardExample {

    public static void registerCourse(Course&lt;?&gt; course) {// 수강생은 모든 타입일 될수 있다.
        System.out.println(course.getName() + &quot;수강생&quot; + Arrays.toString(course.getStudents()));

    }
    public static void registerCourseStudent(Course&lt;? extends Student&gt; course) {// 수강생은 student,highstudent.
        System.out.println(course.getName() + &quot;수강생&quot; + Arrays.toString(course.getStudents()));

    }
    public static void registerCourseWorker(Course&lt;? super Worker&gt; course) {// 수강생은 worker, person 타입일 될수 있다.
        System.out.println(course.getName() + &quot;수강생&quot; + Arrays.toString(course.getStudents()));

    }

    public static void main(String[] args) {
        Course&lt;Person&gt; personCourse = new Course&lt;Person&gt;(&quot;일반인과정&quot;, 5);
        personCourse.add(new Person(&quot;일반인&quot;));
        personCourse.add(new Worker(&quot;직장인&quot;));
        personCourse.add(new Student(&quot;학생&quot;));
        personCourse.add(new HighStudent(&quot;고등학생&quot;));

        Course&lt;Worker&gt; workerCourse = new Course&lt;Worker&gt;(&quot;작장인과정&quot;, 5);
        workerCourse.add(new Worker(&quot;직장인&quot;));

        Course&lt;Student&gt; studentCourse = new Course&lt;Student&gt;(&quot;학생과정&quot;, 5);
        studentCourse.add(new Student(&quot;학생&quot;));
        studentCourse.add(new HighStudent(&quot;고등학생&quot;));

        Course&lt;HighStudent&gt; highCourse = new Course&lt;HighStudent&gt;(&quot;고등학생과정&quot;, 5);
        highCourse.add(new HighStudent(&quot;고등학생&quot;));

        System.out.println(&quot;----------------------------------&quot;);
        registerCourse(personCourse);//모든 과정 등록 가능
        registerCourse(workerCourse);
        registerCourse(studentCourse);
        registerCourse(highCourse);
        System.out.println();

        //registerCourseStudent(personCourse); X
        //registerCourseStudent(workerCourse); X
        registerCourseStudent(studentCourse);  //학생 과정만 등록 가능
        registerCourseStudent(highCourse);

        registerCourseWorker(workerCourse);//직장인과 일반인 과정만 등록 가능.
        registerCourseWorker(personCourse);

    }

}




</code></pre><h3 id="137-제네릭-타입의-상속과-구현">13.7 제네릭 타입의 상속과 구현</h3>
<h4 id="제네릭-타입도-다른-타입과-마찬가지로-부모-클래스가-될수-있다">제네릭 타입도 다른 타입과 마찬가지로 부모 클래스가 될수 있다.</h4>
<pre><code>public class ChildProduct&lt;T,M&gt; extends ParentProduct&lt;T,M&gt;{....}
//자식 제네릭 타입은 추가적으로 타입 파라미터를 가질 수 있다.
public class ChildProduct&lt;T,M,C&gt; extends ParentProduct&lt;T,M&gt;{....}
</code></pre><pre><code>🎈예제1
//부모 제네릭 클래스
public class Product&lt;T, M&gt; {

    private T kind;
    private M model;

    public T getKind() {
        return kind;
    }

    public void setKind(T kind) {
        this.kind = kind;
    }

    public M getModel() {
        return model;
    }

    public void setModel(M model) {
        this.model = model;
    }

}

class Tv {
}

//자식 제네릭 클래스
public class ChildProduct &lt;T,M,C&gt; extends Product&lt;T, M&gt;{
    private C company;

    public C getCompany() {
        return company;
    }

    public void setCompany(C company) {
        this.company = company;
    }


}

//제네릭 인터페이스
public interface Storage&lt;T&gt; {
    public void add(T item, int index);

    public T get(int index);
}

//제네릭 구현 클래스
public class StorageImpl&lt;T&gt; implements Storage&lt;T&gt; {

    private T[] array;

    public StorageImpl(int capacity) {
        this.array = (T[])(new Object[capacity]);
    }

    @Override
    public void add(T item, int index) {

    }

    @Override
    public T get(int index) {

        return null;
    }

}

//제네릭 타입 사용 클래스
public class ChildProductAndStorageExample {

    public static void main(String[] args) {
        ChildProduct&lt;Tv, String, String&gt; product = new ChildProduct&lt;&gt;();
        product.setKind(new Tv());
        product.setModel(&quot;SmartTv&quot;);
        product.setCompany(&quot;samsong&quot;);

        Storage&lt;Tv&gt; storage = new StorageImpl&lt;Tv&gt;(100);
        storage.add(new Tv(), 0);
        Tv tv = storage.get(0);


    }
}
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[10.예외와 예외 클래스]]></title>
            <link>https://velog.io/@chaean_7714/10.%EC%98%88%EC%99%B8%EC%99%80-%EC%98%88%EC%99%B8-%ED%81%B4%EB%9E%98%EC%8A%A4</link>
            <guid>https://velog.io/@chaean_7714/10.%EC%98%88%EC%99%B8%EC%99%80-%EC%98%88%EC%99%B8-%ED%81%B4%EB%9E%98%EC%8A%A4</guid>
            <pubDate>Wed, 10 Feb 2021 11:13:47 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>이 글은 제가 공부한 것들을 정리한 것입니다.</p>
</blockquote>
<h3 id="101-예외와-예외클래스">10.1 예외와 예외클래스</h3>
<h4 id="에러-하드웨어-오작동">에러: 하드웨어 오작동</h4>
<h4 id="예외-사용자의-잘못된-조작-개발자의-잘못된-코딩">예외: 사용자의 잘못된 조작, 개발자의 잘못된 코딩.</h4>
<h4 id="예외-종류">예외 종류</h4>
<h4 id="-일반예외exception실행예외runtimeexceiption">-일반예외(Exception),실행예외(RuntimeExceiption)</h4>
<h4 id="✔일반예외">✔일반예외</h4>
<ul>
<li><p>컴파일 하는 과정에서 예외처리코드가 필요한지 검사한다.</p>
</li>
<li><p>만약 예외처리가 필요한 코드에  예외 처리 코드가 없다면 컴파일 오류가 발생한다.      * 일반예외는 Exception을 상속받지만 RuntimeException을 상속받지 않는다.</p>
<h4 id="✔실행예외">✔실행예외</h4>
</li>
<li><p>컴파일시 예외 처리를 확인하지 않는다.</p>
</li>
<li><p>RuntimeException을 상속받는 클래스들이다. RuntimeException 역시 Exception을 상속받지만 JVM은 RuntimeException을 상속했는지 여부를 보고 실행예외를 판단한다.</p>
<h3 id="102-실행예외">10.2 실행예외</h3>
<h4 id="1021-nullpointerexception">10.2.1 NullPointerException</h4>
<h4 id="1022-arrayindexoutofboundexception">10.2.2 ArrayIndexOutOfBoundException</h4>
<h4 id="1023-nuberformatexception">10.2.3 NuberFormatException</h4>
<h4 id="1024-classcastexception">10.2.4 ClassCastException</h4>
<h3 id="103-예외처리-코드">10.3 예외처리 코드</h3>
<pre><code>✨일반 예외처리
public class TryCatchFinallyExample {

  public static void main(String[] args) {

      try {
          Class Class = Class.forName(&quot;java.lang.String2&quot;);
      } catch (ClassNotFoundException e) {
          System.out.println(&quot;클래스가 존재하지 않습니다.&quot;);
          e.printStackTrace();
      }
  }
</code></pre></li>
</ul>
<p>}</p>
<p>✨실행예외처리 - 오로지 개발자의 경험에 의해 작성해주어야 한다.
public class TryCatchFinallyRuntimeExceptionExample {</p>
<pre><code>public static void main(String[] args) {
    String data1 = null;
    String data2 = null;

    try {
        data1 = args[0];
        data2 = args[1];
    } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println(&quot;실행 매개값의 수가 부족하다.&quot;);
        System.out.println(&quot;[실행 방법]&quot;);
        return;

    }

    try {
        int value1 = Integer.parseInt(data1);
        int value2 = Integer.parseInt(data2);
        int result = value1 + value2;

    } catch (NumberFormatException e) {
         System.out.println(&quot;숫자로 변환 할 수 없습니다.&quot;);
    } finally {
        System.out.println(&quot;다시 실행 하세요.&quot;);
    }
}</code></pre><p>}</p>
<pre><code>### 10.4 예외종류에 따른 처리 코드
#### 10.4.1 다중 catch</code></pre><p>public class CatchByExeptionKindExample {
    public static void main(String[] args) {</p>
<pre><code>    try {
        String data1 = args[0];
        String data2 = args[1];

        int value1 = Integer.parseInt(data1);// 여기는 실행이 안된다.
        int value2 = Integer.parseInt(data2);
        int result = value1 + value2;
        System.out.println(data1 + &quot;+&quot; + data2 + &quot;=&quot; + result);

    } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println(&quot;실행 매개값의 수가 부족하다.&quot;);
        System.out.println(&quot;[실행 방법]&quot;);


    } catch (NumberFormatException e) {
        System.out.println(&quot;숫자로 변환 할 수 없습니다.&quot;);
    } finally {
        System.out.println(&quot;다시 실행 하세요.&quot;);
    }
}</code></pre><p>}</p>
<pre><code>#### catch 블록이 여러 개라 할지라도 하나만 실행된다. try 블록에서 동시 다발적으로 예외가 발생하지 ㅇ낳고 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch블록으로 이동하기 때문이다. 
### 10.4.2 catch 순서
#### 다중 catch블록 작성시 주의할 점은 상위 예외 클래스가 하위 예외 클래스보다 아래에 위치해야 한다. 하위 예외는 상위 예외를 상속했기 때문에 상위 예외 타입도 되기 때문이다.
### 10.4.3 멀티 catch</code></pre><p>public class MultiCatchExample {
    public static void main(String[] args) {</p>
<pre><code>    try {
        String data1 = args[0];
        String data2 = args[1];

        int value1 = Integer.parseInt(data1);
        int value2 = Integer.parseInt(data2);
        int result = value1 + value2;
        System.out.println(data1 + &quot;+&quot; + data2 + &quot;=&quot; + result);
    } catch (ArrayIndexOutOfBoundsException | NumberFormatException e) {
        System.out.println(&quot;실행 매개값의 수가 부족하거나 숫자로 변환할 수 없습니다.&quot;);

    } catch (Exception e) {
        System.out.println(&quot;알수 없는 예외.&quot;);
    } finally {
        System.out.println(&quot;다시 실행 하세요.&quot;);
    }
}</code></pre><p>}</p>
<pre><code>
### 10.5 자동 리소스 닫기
### 자바 7에서 새로 추가된 try-with-resources 를 사용하면 예외 발생 여부와 상관없이 사용했던 리소스 객체(각종 입출력 스트림, 서버 소켓, 소켓 , 각종 채널)의 close()메소드를 호출해서 안전하게 리소스를 닫아준다.
#### 리소스는 간단히 데이터를 읽고 쓰는 객체라고 생각하자.</code></pre><p>FileInputStream fis = null;
        try {
            fis = new FileInputStream(&quot;file.txt&quot;);
        } catch (FileNotFoundException e) {</p>
<pre><code>    } finally {

        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {

            }
        }
    }</code></pre><p>//✨자바 7에서 새로 추가됬다.</p>
<p>try (FileInputStream fis = new FileInputStream(&quot;file.txt&quot;)) {</p>
<pre><code>    } catch (IOException e) {

    }</code></pre><p>//✨try 블록이 정상적으로 실행을 완료했거나 예외가 발생하게 되면 자동으로 
  FileInputStream의 close() 메소드가 호출된다.</p>
<p>//✨복수개의 리소스를 작성할 수 도 있다.</p>
<p>try (FileInputStream fis1 = new FileInputStream(&quot;file.txt&quot;);
       FileInputStream fis2 = new FileInputStream(&quot;file.txt&quot;)) {</p>
<pre><code>    } catch (IOException e) {

    }</code></pre><p>//✨try - with - resources를 사용하기 위해서는 조건이 있는데
리소스 객체는 java.lang.AutoCloseable 인터페이스를 구현하고 있어야 한다.</p>
<p>public class FileInputStream implements AutoCloseable {</p>
<pre><code>private String file;

public FileInputStream(String file) {
    this.file = file;
}

public void read() {
    System.out.println(file + &quot;를 읽습니다.&quot;);
}

@Override
public void close() throws Exception {
    System.out.println(file + &quot;를 닫습니다.&quot;);

}</code></pre><p>}</p>
<p>public class TryWithResourceExample {
    public static void main(String[] args) {</p>
<pre><code>    try (FileInputStream fis = new FileInputStream(&quot;file.txt&quot;)) {
        fis.read();
        throw new Exception();// 강제로 예외 발생
    } catch (Exception e) {
        System.out.println(&quot;예외처리 코드가 실행되었습니다.&quot;);
    }
}</code></pre><p>}</p>
<pre><code>
### 10.6 예외 떠넘기기
#### 메소드 내부에서 예외가 발생할 수 있는 코드를 try-catch 구문으로 예외를 처리하는 것이 기본이지만, 메소드를 호출한 곳으로 예외를 떠넘길 수 도 있다. 이때 사용하는 키워드가 &lt;span style=&quot;color:red&quot;&gt;throws&lt;/span&gt;이다.</code></pre><p>public void method1() {
    try {
            method2();
        } catch (ClassNotFoundException e) {
            System.out.println(&quot;클래스가 존재하지 않습니다.&quot;);
            }
}</p>
<p> public void method2() throws ClassNotFoundException{
    Class class = Class.forName(&quot;java.lang.String2&quot;);
        }</p>
<pre><code>
### 10.7 사용자 정의 예외와 예외 발생
#### 자바에서 제공하는 클래스만으로 다양한 예외를  표현할 수가 없다. 예를 들어 은행업무를 처리하는 프로그램에서 잔고보다 더 많은 출금 요청이 들어왔을 경우 오류가 되며 잔고 부족 오료를 발생시킬 필요가 있는데, 잔고부족 API는 자바에 존재하지 않는다. 이럴 경우 개발자가 직접 정의해서 만들어야 하므로 사용자 정의 예외라고 한다.
### 10.7.1 사용자 정의 예외 클래스 선언</code></pre><p>public class BalanceInsufficientException extends Exception {
            //사용자 정의 예외 클래스 이름은 Exception으로 끝나는 것이 좋다.
            //사용자 정의 예외 클래스도 필드, 생성자, 메소드 선언들을 포함할 수 있지만,
            //대부분 생성자 선언만을 포함한다.
            //생성자는 두개가 일반적인데,하나는 기본생성자
            //다른 하나는 예외 발생 원인을 전달하기 위해 Stirng 타입의 매개 변수를 갖는 생성자이다.
            //String 타입의 매개변수를 갖는 생성자는 상위 클래스의 생성자를 
            //호출하여 예외 메시지를 넘겨준다.
    public BalanceInsufficientException() {
    }</p>
<pre><code>public BalanceInsufficientException(String message) {
    super(message);
}</code></pre><p>}</p>
<p>public class Account {</p>
<pre><code>private long balance;

public Account() {
}

public long getBalance() {
    return balance;
}

public void deposit(int money) {
    balance += money;
}

public void withdraw(int money) throws BalanceInsufficientException {

    if (money &gt; balance) {
        throw new BalanceInsufficientException(&quot;잔고 부족: &quot; + (money - balance) + &quot;이 모자람.&quot;);
    }
    balance -= money;
}</code></pre><p>}</p>
<p>public class AccountExample {</p>
<pre><code>public static void main(String[] args) {
    Account acc = new Account();
    acc.deposit(10000);
    System.out.println(&quot;예금액:&quot; + acc.getBalance());
    try {
        acc.withdraw(30000);
    } catch (BalanceInsufficientException e) {
        System.out.println(&quot;meassage:&quot; + e.getMessage());
        System.out.println();
        e.printStackTrace();
    }
}</code></pre><p>}</p>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Vue.js study 04.]]></title>
            <link>https://velog.io/@chaean_7714/Vue.js-study-04</link>
            <guid>https://velog.io/@chaean_7714/Vue.js-study-04</guid>
            <pubDate>Sat, 30 Jan 2021 15:30:04 GMT</pubDate>
            <description><![CDATA[<h3 id="04-상용-웹을-개발하기-위한-필수-기술들---라우터-http통신">04 상용 웹을 개발하기 위한 필수 기술들 - 라우터&amp; HTTP통신</h3>
<h3 id="04-1-뷰-라우터">04-1 뷰 라우터</h3>
<h4 id="✔라우팅이란">✔라우팅이란?</h4>
<h4 id="웹-페이지-간의-이동-방법을-말한다-싱글-페이지-애플리케이션에서-주로-사용하고-있다">웹 페이지 간의 이동 방법을 말한다. 싱글 페이지 애플리케이션에서 주로 사용하고 있다.</h4>
<h4 id="✔싱글-페이지-어플리케이션이란">✔싱글 페이지 어플리케이션이란?</h4>
<h4 id="페이지를-이동할-때마다-서버에-웹-페이지를-요청하여-새로-갱신하는-것이-아니라-미리-해당-페이지들을-받아-놓고-페이지-이동-시에-클라이언트의-라우팅을-이용하여-화면을-갱신하는-패턴을-적용한-애플리케이션이다">페이지를 이동할 때마다 서버에 웹 페이지를 요청하여 새로 갱신하는 것이 아니라 미리 해당 페이지들을 받아 놓고 페이지 이동 시에 클라이언트의 라우팅을 이용하여 화면을 갱신하는 패턴을 적용한 애플리케이션이다.</h4>
<h4 id="✔뷰-라우터-뷰에서-라우팅-기술을-구현-할-수-있도록-지원하는-공식-라이브러리-이다">✔뷰 라우터: 뷰에서 라우팅 기술을 구현 할 수 있도록 지원하는 공식 라이브러리 이다.</h4>
<pre><code>&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
        &lt;h1&gt;뷰 라우터 예제&lt;/h1&gt;
        &lt;p&gt;
            &lt;router-link to=&quot;/main&quot;&gt;Main component&lt;/router-link&gt; &lt;!-- 1.url 값을 변경하는 태그--&gt;
            &lt;router-link to=&quot;/login&quot;&gt;Login component&lt;/router-link&gt;
        &lt;/p&gt;
        &lt;router-view&gt;&lt;/router-view&gt;&lt;!-- 2.url 값에 따라 갱신되는 화면영역 --&gt;

    &lt;/div&gt;
    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://unpkg.com/vue-router@3.0.1/dist/vue-router.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var Main = { template: &#39;&lt;div&gt;main&lt;/div&gt;&#39; };// 3. 컴포넌트 정의
        var Login = { template: &#39;&lt;div&gt;login&lt;/div&gt;&#39; };

        var routes = [
            { path: &#39;/main&#39;, component: Main },// 4. 각url에맞춰 컴포넌트 지정 
            { path: &#39;/login&#39;, component: Login }

        ];

        var router = new VueRouter({//5. 뷰라우터정의
         //   mode:&#39;history&#39;,  주소에 해시값을없애고싶을떄 
            routes
        });

        var app = new Vue({         //6. 뷰객체에 라우터추가
            router
        }).$mount(&quot;#app&quot;);  // el 속성과같다 
    &lt;/script&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre><h4 id="✔-네스티드-라우터-상위-컴포넌트가-하위-컴포넌트를-포함하는-형식">✔ 네스티드 라우터: 상위 컴포넌트가 하위 컴포넌트를 포함하는 형식.</h4>
<pre><code>&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
        &lt;router-view&gt;&lt;/router-view&gt;
    &lt;/div&gt;
    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://unpkg.com/vue-router@3.0.1/dist/vue-router.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var User = {
            template: &#39;&lt;div&gt;User component&lt;router-view&gt;&lt;/router-view&gt;&lt;/div&gt;&#39;
        }

        var UserProfile = { template: &#39;&lt;p&gt;User Profile Component&lt;/p&gt;&#39; }
        var UserPost = { template: &#39;&lt;p&gt;User Post Component&lt;/p&gt;&#39; }

        var routes = [
            {
                path: &#39;/user&#39;,
                component: User,

                children: [{
                    path: &#39;posts&#39;,
                    component: UserPost
                },{
                    path:&#39;profile&#39;,
                    component:UserProfile
                }
                ]

            }
        ]

        var router = new VueRouter({
            routes
        });

        var app = new Vue({
            router
        }).$mount(&quot;#app&quot;);
    &lt;/script&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre><h4 id="✔네임드-뷰-같은-레벨에서-여러-개의-컴포넌트를-한-번에-표시한다">✔네임드 뷰: 같은 레벨에서 여러 개의 컴포넌트를 한 번에 표시한다.</h4>
<pre><code>&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
        &lt;router-view name=&quot;header&quot;&gt;&lt;/router-view&gt;
        &lt;router-view&gt;&lt;/router-view&gt; &lt;!-- name이없는경우 defalut--&gt;
        &lt;router-view name=&quot;footer&quot;&gt;&lt;/router-view&gt;
    &lt;/div&gt;

    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://unpkg.com/vue-router@3.0.1/dist/vue-router.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;

        var Body = { template: &#39;&lt;div&gt; This is Body&lt;/div&gt;&#39; };
        var Header = { template: &#39;&lt;div&gt;This is Header&lt;/div&gt;&#39; };
        var Footer = { template: &#39;&lt;div&gt;This is Footer&lt;/div&gt;&#39; };

        var router = new VueRouter({
            routes: [
                {
                    path: &#39;/&#39;,
                    components: {
                        default: Body,
                        header: Header, //router-view 의 name속성과 컴포넌트를 연결.
                        footer: Footer
                    }
                }
            ]
        });

        var app = new Vue({ router }).$mount(&quot;#app&quot;);
    &lt;/script&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre><h3 id="04-2-뷰-http-통신">04-2 뷰 HTTP 통신</h3>
<h4 id="✔뷰-리소스-잘-안쓰는-추세이지만-사용은-한다">✔뷰 리소스 (잘 안쓰는 추세이지만 사용은 한다.)</h4>
<pre><code>&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
        &lt;button v-on:click=&quot;getData&quot;&gt;프레임 워크 목록 가져오기 &lt;/button&gt;
    &lt;/div&gt;


    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue-resource@1.3.4&quot;&gt;&lt;/script&gt;
    &lt;script&gt;

        new Vue({
            el: &#39;#app&#39;,
            methods: {
                getData: function () {
                    this.$http.get(&#39;https://raw.githubusercontent.com/joshua1988/doit-vuejs/master/data/demo.json&#39;).then(function (response) {
                        console.log(response);
                        console.log(JSON.parse(response.data));
                        //// 응답 데이터의 body 값이문자열이기 때문에 JSON.parse() 이용하여 자바스크립트 객체로보기쉽게변환하였다 
                    })
                }
            },
        })
    &lt;/script&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre><h4 id="✔엑시오스promise-기반의-api형식이-다양하게-제공되어-별도의-로직을-구현-할-필요-없다">✔엑시오스(promise 기반의 api형식이 다양하게 제공되어 별도의 로직을 구현 할 필요 없다.)</h4>
<h4 id="👍promise-기반의-api란-서버에-데이터를-요청하면-받아오는-것과-같은-일을-하는-비동기-로직-처리에-유용한-자바-스크립트-객체이다-js는-단일-스레드로-코드를-처리하기-때문에-특정-로직의-처리가-끝날-때까지-기다려-주지-않는다">👍promise 기반의 api란: 서버에 데이터를 요청하면 받아오는 것과 같은 일을 하는 비동기 로직 처리에 유용한 자바 스크립트 객체이다. js는 단일 스레드로 코드를 처리하기 때문에 특정 로직의 처리가 끝날 때까지 기다려 주지 않는다.</h4>
<p><a href="https://hudi.kr/%EB%B9%84%EB%8F%99%EA%B8%B0%EC%A0%81-javascript-%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9C-%EA%B8%B0%EB%B0%98-js%EC%9D%98-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC-%EB%B0%A9%EB%B2%95/">js 비동기 이해에 도움이 되는 사이트</a></p>
<pre><code>&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
        &lt;button v-on:click=&quot;getData&quot;&gt;Get Data!&lt;/button&gt;
    &lt;/div&gt;
    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://unpkg.com/axios/dist/axios.min.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        new Vue({
            el: &#39;#app&#39;,
            methods: {
                getData: function () {
                    axios.get(&#39;https://raw.githubusercontent.com/joshua1988/doit-vuejs/master/data/demo.json&#39;).then(function (response) {
                        console.log(response);
                    })
                }
            },
        })

    &lt;/script&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Vue.js study 03.]]></title>
            <link>https://velog.io/@chaean_7714/Vue.js-study-03</link>
            <guid>https://velog.io/@chaean_7714/Vue.js-study-03</guid>
            <pubDate>Sat, 30 Jan 2021 10:14:31 GMT</pubDate>
            <description><![CDATA[<h3 id="03-화면을-개발하기-위한-필수-단위--인스턴스컴포넌트">03 화면을 개발하기 위한 필수 단위- 인스턴스&amp;컴포넌트.</h3>
<h3 id="03-1-뷰-인스턴스">03-1 뷰 인스턴스</h3>
<pre><code>&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
        {{message}}
    &lt;/div&gt;

    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        new Vue({       // Vue 객체 생성
            el:&#39;#app&#39;,  // el 속성
            data:{      //data 속성
                message:&#39;Hello Vue.js!&#39;
            }
        })

    &lt;/script&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre><h3 id="✔뷰-인스턴스-옵션-속성">✔뷰 인스턴스 옵션 속성</h3>
<ul>
<li>template - 마크업 요소 정의하는 속성. </li>
<li>method -  전반적인 이벤트와 화면 동작과 관련되 로직을 추가할 수 있다.</li>
<li>created - 뷰 객체가 생성되자마자 실행 할 로직을 정의할 수 있는 속성.</li>
</ul>
<h3 id="✔뷰-인스턴스의-유효범위">✔뷰 인스턴스의 유효범위.</h3>
<h4 id="뷰-객체를-생성하면-html의-특정-범위-안에서만-옵션-속성들이-적용되어-나타난다">뷰 객체를 생성하면 HTML의 특정 범위 안에서만 옵션 속성들이 적용되어 나타난다.</h4>
<h4 id="인스턴스가-화면에-적용되는-과정">인스턴스가 화면에 적용되는 과정.</h4>
<h4 id="1-뷰-라이브러리-파일-로딩-2인스턴스-객체-생성옵션-속성-포함-3특정화면요소에-인스턴스를-붙임---4인스턴스-내용이-화면-요소로-변함--5변환된-화면-요소를-사용자가-최종-확인">1. 뷰 라이브러리 파일 로딩-&gt;2.인스턴스 객체 생성(옵션 속성 포함.)-&gt;3.특정화면요소에 인스턴스를 붙임. -&gt; 4.인스턴스 내용이 화면 요소로 변함. -&gt;5.변환된 화면 요소를 사용자가 최종 확인.</h4>
<h3 id="✔뷰-인스턴스-라이프-사이클">✔뷰 인스턴스 라이프 사이클</h3>
<h4 id="객체-상태에-따라-호출-할-수-있는-속성을-라이프사이클-속성이라고-한다">객체 상태에 따라 호출 할 수 있는 속성을 라이프사이클 속성이라고 한다.</h4>
<h4 id="그리고-각-라이프-사이클-속성에서-실행되는-커스텀-로직을-라이프-사이클-훅hook이라고-한다">그리고 각 라이프 사이클 속성에서 실행되는 커스텀 로직을 라이프 사이클 훅(hook)이라고 한다.</h4>
<p><img src="https://images.velog.io/images/chaean_7714/post/ec724136-5065-4329-a90b-be4ef4667517/0_Sy_X_S-M1DIq-yaG.png" alt="Vue"></p>
<pre><code>&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
        {{message}}
    &lt;/div&gt;

    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        new Vue({       // Vue 객체 생성
            el:&#39;#app&#39;,  // el 속성
            data:{      //data 속성
                message:&#39;Hello Vue.js!&#39;
            },
            beforeCreate() {
                console.log(&quot;beforeCreate&quot;);
            },
            mounted() {
                console.log(&quot;mounted&quot;);
                this.message = &#39;Hello vue!!!&#39;;
            },
            updated() {
                console.log(&quot;updated&quot;);
            },
        })

    &lt;/script&gt;
&lt;/body&gt;

&lt;/html&gt;
</code></pre><h3 id="03-2-뷰-컴포넌트">03-2 뷰 컴포넌트</h3>
<pre><code>&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
        &lt;button&gt;컴포넌트등록&lt;/button&gt;
        &lt;my-global-component&gt;&lt;/my-global-component&gt; &lt;!-- 전역컴포넌트자리 --&gt;
        &lt;my-local-component&gt;&lt;/my-local-component&gt; &lt;!-- 지역컴포넌트자리 --&gt;
    &lt;/div&gt;

    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;

        Vue.component(&#39;my-global-component&#39;, {
            template: &#39;&lt;div&gt;전역 컴포넌트가 등록되었습니다. &lt;/div&gt;&#39;
        })

        var cmp = {
            template: &#39;&lt;div&gt;지역 컴포넌트가 등록되었습니다. &lt;/div&gt;&#39;
        }

        new Vue({
            el: &#39;#app&#39;,
            components: {
                &#39;my-local-component&#39;:cmp
            }

        })
    &lt;/script&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre><h4 id="✔전역-컴포넌트는-인스턴스를-새로-생성할-때마다-인스턴스에-componemts-속성으로-등록할-필요없이-한-번-등록하면-어느-인스턴스에서든지-사용할-수-있다-반대로-지역-인스턴스는-생성할-때마다-등록해줘야-한다">✔전역 컴포넌트는 인스턴스를 새로 생성할 때마다 인스턴스에 componemts 속성으로 등록할 필요없이 한 번 등록하면 어느 인스턴스에서든지 사용할 수 있다. 반대로 지역 인스턴스는 생성할 때마다 등록해줘야 한다.</h4>
<h3 id="03-3-뷰-컴포넌트-통신">03-3 뷰 컴포넌트 통신.</h3>
<h4 id="뷰는-컴포넌트로-화면을-구성하므로-같은-웹-페이지라도-데이터를-공유-할-수-없다-이유는-컴포넌트마다-고유한-유효범위를-같기-때문이다">뷰는 컴포넌트로 화면을 구성하므로 같은 웹 페이지라도 데이터를 공유 할 수 없다. 이유는 컴포넌트마다 고유한 유효범위를 같기 때문이다.</h4>
<pre><code>&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
        &lt;my-component01&gt;&lt;/my-component01&gt;
        &lt;my-component02&gt;&lt;/my-component02&gt;

    &lt;/div&gt;
    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var cmp1 = {
            template: &#39;&lt;div&gt;첫번째 지역컴포넌트:{{cmp1Data}}&lt;/div&gt;&#39;,
            data: function () {
                return { cmp1Data: 100 }
            }
        }

         var cmp2 = {
            template: &#39;&lt;div&gt;두번째 지역컴포넌트:{{cmp2Data}}&lt;/div&gt;&#39;,
            data: function () {
                return { cmp1Data:cmp1.data.cmp1Data  }// 각 컴포넌트의 고유한 범위 때문에 이부분은 나타나지않는다. 
            }
        }

        new Vue({
            el:&#39;#app&#39;,
            components:{
                &#39;my-component01&#39;:cmp1,
                &#39;my-component02&#39;:cmp2
            }
        })
    &lt;/script&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre><h4 id="✔상하위-컴포넌트-관계">✔상하위 컴포넌트 관계.</h4>
<p>컴포넌트는 각각 고유한 유효범위가 있어서 직접 다른 컴포넌트의 값을 참조 할 수 없다.
그래서 뷰 에서 정의한 데이터 전달 방법을 따라야 한다.
가장 기본 적인 데이터 전달 방법은 상위 하위 데이터 전달 방법이다.</p>
<pre><code>&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;

        &lt;child-component v-bind:propsdata=&quot;message&quot;&gt;&lt;/child-component&gt;
          &lt;!-- 인스턴스 객체 자체가 상위컴포넌트이다. 
             인스턴스에 새로운 컴포넌트를 등록하면 기존에 있는 컴포넌트가 
             상위컴포넌트가 되고 새로 등록된 것이 하위컴포넌트가 된다. 그러면 인스턴스가 최상위 컴포넌트가 된다. --&gt;
    &lt;/div&gt;
    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        Vue.component(&#39;child-component&#39;,{
            props:[&#39;propsdata&#39;],
            template:&#39;&lt;p&gt;{{propsdata}}&lt;/p&gt;&#39;

        })
       new Vue({
           el:&#39;#app&#39;,
           data:{
               message:&#39;Hello vue&#39;
           }
       })
    &lt;/script&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre><h4 id="✔하위에서-상위-컴포넌트로-이벤트-생성하기">✔하위에서 상위 컴포넌트로 이벤트 생성하기.</h4>
<pre><code>&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
        &lt;!--  show-log:하위컴포넌트이벤트명, printText:상위컴포넌트메소드명  --&gt;
         &lt;child-component v-on:show-log=&quot;printText&quot;&gt;&lt;/child-component&gt;  &lt;!-- //3 --&gt;

    &lt;/div&gt;
    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;

        Vue.component(&#39;child-component&#39;, {
            template: &#39;&lt;button v-on:click=&quot;showLog&quot;&gt;show&lt;/button&gt;&#39;,   //1
            methods: {                                                //2
                showLog: function () {
                    this.$emit(&quot;show-log&quot;);
                }
            },
        })

        var app = new Vue({
            el:&#39;#app&#39;,
            data:{
                message:&#39;Hello vue passed from Parent Component&#39;
            },
            methods:{
                printText:function(){
                    console.log(&quot;received an event&quot;);                   //4
                }
            }
        })
    &lt;/script&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre><h4 id="✔같은-레벨간의-컴포넌트-간-통신-관계-없는-컴포넌트간-통신---이벤트-버스">✔같은 레벨간의 컴포넌트 간 통신, 관계 없는 컴포넌트간 통신 - 이벤트 버스</h4>
<pre><code>&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
        &lt;child-component&gt;&lt;/child-component&gt;
    &lt;/div&gt;

    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var eventBus = new Vue();   //1

        Vue.component(&#39;child-component&#39;,{  //2
            template:&#39;&lt;div&gt;하위 컴포넌트입니다 &lt;button v-on:click=&quot;showLog&quot;&gt;show&lt;/button&gt;&lt;/div&gt;&#39;,
            methods: {
                showLog:function(){//이벤트 명 , 데이터
                    eventBus.$emit(&#39;triggerEventBus&#39;,100);
                }
            },
        })

        var app = new Vue({
            el:&#39;#app&#39;,
            created() {
                eventBus.$on(&#39;triggerEventBus&#39;,function(val){
                    console.log(&quot;전달받은값: &quot;+ val);

                })
            },
        })


    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[ Vue.js study 01,02 ]]></title>
            <link>https://velog.io/@chaean_7714/Do-it-Vue-.js-3%EB%8B%A8%EC%9B%90</link>
            <guid>https://velog.io/@chaean_7714/Do-it-Vue-.js-3%EB%8B%A8%EC%9B%90</guid>
            <pubDate>Sat, 30 Jan 2021 08:11:02 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👀이 글은 제가 공부한 것들을 잊어버리지 않기 위해 정리해 놓은 것입니다.</p>
</blockquote>
<h3 id="01-1-vuejs란">01-1 Vue.js란?</h3>
<h4 id="웹-페이지-화면-개발을-위한-프론트-엔드-프레임-워크다">웹 페이지 화면 개발을 위한 프론트 엔드 프레임 워크다.</h4>
<h3 id="01-2-특징1-뷰는-ui-화면-개발-방법-중-하나인-mvvm-패턴의-뷰-모델에-해당하는-화면단-라이브러리이다">01-2 특징1 .뷰는 UI 화면 개발 방법 중 하나인 MVVM 패턴의 뷰 모델에 해당하는 화면단 라이브러리이다.</h3>
<p><img src="https://images.velog.io/images/chaean_7714/post/2dd22081-e922-4827-94eb-f81ef2b08b55/edit_vue.jpg" alt=""></p>
<h4 id="이러한-방식은-화면요소를-제어하는-코드와-데이터-제어로직을-분리하여-직관적으로-이해할-수-있고-유지보수에도-편리하다">이러한 방식은 화면요소를 제어하는 코드와 데이터 제어로직을 분리하여 직관적으로 이해할 수 있고, 유지보수에도 편리하다.</h4>
<h5 id="데이터-바인딩--뷰에-표시되는-내용과-모델의-데이터를-동기화">데이터 바인딩- 뷰에 표시되는 내용과 모델의 데이터를 동기화.</h5>
<h5 id="모델-데이터를-담는-용기-서버에서-가져온-데이터를-js-객체형태로-저장">모델-데이터를 담는 용기. 서버에서 가져온 데이터를 js 객체형태로 저장.</h5>
<p>EX)구글 버튼을 클릭했을 때 돔 리스너에서 버튼의 클릭을 감지.데이터 바인딩이 관여, 검색결과를 모델에서 가져와 화면에 나타내줌.</p>
<h3 id="특징2-뷰는-컴포넌트-개발-프레임-워크다">특징2 뷰는 컴포넌트 개발 프레임 워크다.</h3>
<p><img src="https://t1.daumcdn.net/cfile/tistory/9997ED4F5C7CB30E29" alt="Vue"></p>
<h4 id="컴포넌트는-레고와-같아서-잘-조합하면-원하는-모양을-만들-수-있듯이-뷰의-컴포넌트를-조합하여-화면을-구성한다-위-그림의-왼쪽은-각영역을-컴포넌트로-구분지은-것이고-오른쪽은-관계를-지정해-놓은-것이다">컴포넌트는 레고와 같아서 잘 조합하면 원하는 모양을 만들 수 있듯이, 뷰의 컴포넌트를 조합하여 화면을 구성한다. 위 그림의 왼쪽은 각영역을 컴포넌트로 구분지은 것이고 오른쪽은 관계를 지정해 놓은 것이다.</h4>
<h3 id="컴포넌트-기반방식은-코드를-재사용하기가-쉽다고-한다">컴포넌트 기반방식은 코드를 재사용하기가 쉽다고 한다.</h3>
<p>해봐야 알꺼 같다.........</p>
<h4 id="뷰의-컴포넌트를-사용하면html-코드에서-화면의-구조를-직관적으로-파악할-수-있다">뷰의 컴포넌트를 사용하면HTML 코드에서 화면의 구조를 직관적으로 파악할 수 있다.</h4>
<h4 id="뷰는-앵귤러의-양방향-데이터-바인딩과-리액트의-단방향-데이터-흐름의-장점을-모두-결합한-프레임-워크다-이-외-빠른-렌더링을-위해-가상-돔-렌더링-방식을-적용하여-사용자-인터랙션이-많은-요즘의-웹-화면에-적합한-동작-구조를-갖추고-있다-가상-돔을-사용하면-특정-돔을-추가하거나-삭제하는-변경이-일어날-때-화면-전체를-다시-그리지-않고-프레임-워크에서-정의한-방식에-따라-화면을-갱신한다-따라서-브라우저-입장에선-성능-부하가-적고-일반-렌더링-방식보다-빠르게-화면을-그린다">뷰는 앵귤러의 양방향 데이터 바인딩과 리액트의 단방향 데이터 흐름의 장점을 모두 결합한 프레임 워크다. 이 외 빠른 렌더링을 위해 가상 돔 렌더링 방식을 적용하여 사용자 인터랙션이 많은 요즘의 웹 화면에 적합한 동작 구조를 갖추고 있다. 가상 돔을 사용하면 특정 돔을 추가하거나 삭제하는 변경이 일어날 때 화면 전체를 다시 그리지 않고 프레임 워크에서 정의한 방식에 따라 화면을 갱신한다. 따라서 브라우저 입장에선 성능 부하가 적고 일반 렌더링 방식보다 빠르게 화면을 그린다.</h4>
<h3 id="02-1-뷰-학습을-위한-개발-환경-설정">02-1 뷰 학습을 위한 개발 환경 설정.</h3>
<h4 id="크롬-브라우저-아톰대신-vscode사용-노드제이에스--뷰-개발자-도구-크롬-확장-플러그인">크롬 브라우저, 아톰(대신 vscode사용), 노드제이에스 , 뷰 개발자 도구 (크롬 확장 플러그인)</h4>
<h4 id="👍-노드제이에스란">👍 노드제이에스란?</h4>
<h4 id="윈도우-맥-리눅스-등-다양한-플랫폼에서-서버-사이드웹-화면과-관련된-서버-로직을-처리하는-영역-자바스크립트-코드를-실행할-수-있는-실행-환경이다-노드제이에스-덕분에-자바스크립트는-웹뿐만-아니라-서버사이드-사물인터엣-로봇제어에도-활용되는-기반을-갖추게-되었다">*윈도우, 맥, 리눅스 등 다양한 플랫폼에서 서버 사이드(웹 화면과 관련된 서버 로직을 처리하는 영역) 자바스크립트 코드를 실행할 수 있는 실행 환경이다. 노드제이에스 덕분에 자바스크립트는 웹뿐만 아니라 서버사이드, 사물인터엣, 로봇제어에도 활용되는 기반을 갖추게 되었다.</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[Do it Vue.js 입문 차례 ]]></title>
            <link>https://velog.io/@chaean_7714/Do-it-Vue.js-%EC%9E%85%EB%AC%B8-%EC%B0%A8%EB%A1%80</link>
            <guid>https://velog.io/@chaean_7714/Do-it-Vue.js-%EC%9E%85%EB%AC%B8-%EC%B0%A8%EB%A1%80</guid>
            <pubDate>Sat, 30 Jan 2021 08:08:24 GMT</pubDate>
            <description><![CDATA[<h2 id="01-vuejs-소개">01 vue.js. 소개</h2>
<ul>
<li>01-1 Vue.js란 무엇인가.</li>
<li>01-2 Vue.js 의 특징.<h2 id="02-개발-환경-설정-및-첫-번째-프로젝트">02 개발 환경 설정 및 첫 번째 프로젝트</h2>
</li>
<li>02-1 뷰학습을 위한 개발 환경설정하기.</li>
<li>02-2 Hello Vue.js 프로젝트 만들기.</li>
</ul>
<h2 id="03-화면을-개발하기-위한-필수-단위">03 화면을 개발하기 위한 필수 단위</h2>
<ul>
<li>03-1 뷰 인스턴스</li>
<li>03-2 뷰 컴포넌트</li>
<li>03-3 뷰 컴포넌트  통신<h2 id="04-상용-웹을-개발하기-위한-필수-기술들">04 상용 웹을 개발하기 위한 필수 기술들</h2>
</li>
<li>04-1 뷰 라우터.</li>
<li>04-2 뷰 HTTP 통신.<h2 id="05-화면을-개발하기-위한-기본-지식과-팁">05 화면을 개발하기 위한 기본 지식과 팁</h2>
</li>
<li>05-1 뷰 템플릿</li>
<li>05-2 뷰 프로젝트 구성방법<h2 id="06-실전-애플리케이션-만들기">06 실전 애플리케이션 만들기</h2>
</li>
<li>06-1 할 일 관리 앱 살펴보기</li>
<li>06-2 프로젝트 생성하고 구조 확인하기</li>
<li>06-3 컴포넌트 생성하고 등록하기</li>
<li>06-4 컴포넌트 내용 구현하기</li>
<li>06-5 기존 애플리케이션 구조의 문제점 해결하기</li>
<li>06-6 더 나은 사용자 경험을 위한 기능 추가하기<h2 id="07-vuejs-고급-개발자-되기">07 Vue.js 고급 개발자 되기</h2>
</li>
<li>07-1 뷰 고급 레벨로 올라가기 위한 지식</li>
<li>07-2 뷰 개발을 위한 웹팩</li>
<li>07-3 뷰 개발을 위한 ES^</li>
<li>07-4 뷰 CLI에서 사용하는 NPM<h2 id="보너스---지금-당장-실무에서-써먹는-vuejs">보너스 - 지금 당장 실무에서 써먹는 Vue.js</h2>
</li>
<li>1 뷰와 제이쿼리를 같이 사용해도 되나요?</li>
<li>2 개발 기간이 너무 짧은데 기존 레거시 코드에 어떻게 뷰를 바로 적용하죠?</li>
<li>3 뷰에 UI 라이브러리와 차트를 어떻게 연동할까요?</li>
<li>4 뷰로 프로그레시브 웹 앱을 개발하려면 어떻게 시작해야 하죠?</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[port란?]]></title>
            <link>https://velog.io/@chaean_7714/port%EB%9E%80</link>
            <guid>https://velog.io/@chaean_7714/port%EB%9E%80</guid>
            <pubDate>Tue, 19 Jan 2021 00:45:02 GMT</pubDate>
            <description><![CDATA[<p><a href="https://run-it.tistory.com/19">port</a>
<a href="https://deftkang.tistory.com/119">port쉽게 이해하기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HeadFirst java(8.인터페이스, 추상클래스)]]></title>
            <link>https://velog.io/@chaean_7714/HeadFirst-java8-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EC%99%80-%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4</link>
            <guid>https://velog.io/@chaean_7714/HeadFirst-java8-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EC%99%80-%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4</guid>
            <pubDate>Sun, 17 Jan 2021 11:07:02 GMT</pubDate>
            <description><![CDATA[<h3 id="📌추상클래스란">📌추상클래스란?</h3>
<h4 id="상속편에서-나왔던-animal-tree를-머리-속으로-떠올려-보자">상속편에서 나왔던 Animal tree를 머리 속으로 떠올려 보자.</h4>
<h4 id="dog-cat-hippo-클래스를-객체로-만드는-것은-이해가-되지만">Dog, Cat, Hippo... 클래스를 객체로 만드는 것은 이해가 되지만,</h4>
<h4 id="animal-객체-뭔가-이상하다-하나의-외계생명체를-만드는-것과-같은-생각이-든다">Animal 객체, 뭔가 이상하다. 하나의 외계생명체를 만드는 것과 같은 생각이 든다.</h4>
<h4 id="상속과-다형성을-위해-animal-클래스는-필요하다">상속과 다형성을 위해 Animal 클래스는 필요하다.</h4>
<h4 id="프로그래머는-animal-클래스의-하위-클래스-객체만-만들-수-있으면-좋지-않을까">프로그래머는 Animal 클래스의 하위 클래스 객체만 만들 수 있으면 좋지 않을까?</h4>
<h4 id="실제로-우리가-만드는-객체는-하위클래스이기-때문이다">실제로 우리가 만드는 객체는 하위클래스이기 때문이다.</h4>
<h4 id="animal-클래스를-객체로-만들지-못하게-하고-대신에-그-레퍼런스를-사용-할-수-있으면-좋지-않을까">Animal 클래스를 객체로 만들지 못하게 하고, 대신에 그 레퍼런스를 사용 할 수 있으면 좋지 않을까?</h4>
<blockquote>
<h3 id="이-레퍼런스를-사용하는-것이-추상-클래스를-만드는-핵심적인-이유이다다형적인-인자나-리턴유형을-쓰기-위해-또는-다형적인-배열을-만들기-위해">이 레퍼런스를 사용하는 것이 추상 클래스를 만드는 핵심적인 이유이다.(다형적인 인자나 리턴유형을 쓰기 위해, 또는 다형적인 배열을 만들기 위해)</h3>
</blockquote>
<h4 id="추상클래스란-새로운-객체를-만들수-없는-클래스를-의미한다">추상클래스란 새로운 객체를 만들수 없는 클래스를 의미한다.</h4>
<h4 id="하지만-다형성을-활용하기-위해-레퍼런스-유형을-선언할-때-추상클래스를-쓸수-있다">하지만 다형성을 활용하기 위해 레퍼런스 유형을 선언할 때 추상클래스를 쓸수 있다.</h4>
<h3 id="📌추상-메소드">📌추상 메소드</h3>
<h4 id="추상클래스는-반드시-확장해야-하는-클래스이다">추상클래스는 반드시 확장해야 하는 클래스이다.</h4>
<h4 id="추상-메소드는-반드시-오버라이드-해야-하는-메소드이다-이유는">추상 메소드는 반드시 오버라이드 해야 하는 메소드이다. 이유는?</h4>
<h4 id="animal클래스에-bark메소드를-구체적으로-정의를-내릴수-있을까-적당한-코드를-생각할-수-없는-메소드를-추상-메소드로-만든다">Animal클래스에 Bark()메소드를 구체적으로 정의를 내릴수 있을까? 적당한 코드를 생각할 수 없는 메소드를 추상 메소드로 만든다.</h4>
<h4 id="각-하위클래스에서-알아서-맞게-정의-내려서-사용할-수-밖에-없다">각 하위클래스에서 알아서 맞게 정의 내려서 사용할 수 밖에 없다.</h4>
<h4 id="그래서-상위클래스에서-몸통-없는-메소드를-만들고-각-하위-클래스에서-만들게끔-강제시킨다">그래서 상위클래스에서 몸통 없는 메소드를 만들고 각 하위 클래스에서 만들게끔 강제시킨다.</h4>
<h4 id="이러면-어떤-점이-좋을까">이러면 어떤 점이 좋을까?</h4>
<blockquote>
<h3 id="물론-다형성이다-상위클래스-유형을-메소드의-인자나-리턴유형-또는-배열-유형으로-쓸수-있기-때문이다-br추상-메소드는-다형성을-활용하기-위해-이-유형에-속하는-모든-하위클래스-유형에는-이-메소드가-있어햐-한다-는-것을-지정하기-위해-필요한-것이다">물론 다형성이다. 상위클래스 유형을 메소드의 인자나 리턴유형 또는 배열 유형으로 쓸수 있기 때문이다. <br>추상 메소드는 다형성을 활용하기 위해 &quot;이 유형에 속하는 모든 하위클래스 유형에는 이 메소드가 있어햐 한다&quot; 는 것을 지정하기 위해 필요한 것이다.</h3>
</blockquote>
<h3 id="📌animal이-아닌-객체는-어떻게-하죠-어떤-것이든-받아들이는-더-포괄적인-클래스를-만드는-것은-어떨까요">📌Animal이 아닌 객체는 어떻게 하죠? 어떤 것이든 받아들이는 더 포괄적인 클래스를 만드는 것은 어떨까요?</h3>
<h4 id="자바에서-모든-클래스는-object라는-클래스를-확장한-것이다">자바에서 모든 클래스는 object라는 클래스를 확장한 것이다.</h4>
<h4 id="object-유형의-다형적-레퍼런스를-쓸-떄-치뤄야-할-대가">object 유형의 다형적 레퍼런스를 쓸 떄 치뤄야 할 대가...</h4>
<pre><code>ArrayList&lt;Object&gt; myDogArrayList = new ArrayList&lt;Object&gt;();
Dog adog = new Dog();
myDogArrayList.add(adog);

Dog d = myDogArrayList.get(0); //X  </code></pre><h4 id="arraylist-object--를-사용할-때는-get메소드에서의-리턴유형도-object가-됩니다-컴파일러에서는-그-객체가-object의-하위-클래스라는-것만-알-수-있을-뿐-dog인지-전혀-알-수가-없습니다">ArrayList&lt; Object &gt; 를 사용할 때는 get()메소드에서의 리턴유형도 Object가 됩니다. 컴파일러에서는 그 객체가 Object의 하위 클래스라는 것만 알 수 있을 뿐 Dog인지 전혀 알 수가 없습니다.</h4>
<p><img src="https://images.velog.io/images/chaean_7714/post/10caefc2-4852-4e37-a612-4effe28767cf/image.png" alt=""></p>
<h3 id="📌다형성은-여러-형태를-의미합니다">📌다형성은 여러 형태를 의미합니다.</h3>
<h4 id="dog를-dog-또는-object로-간주할-수-있다">Dog를 Dog 또는 Object로 간주할 수 있다.</h4>
<h4 id="중요한-점은-dog유형의-객체인-경우에도-그-dog객체에-대한-object-레퍼런스에서는-dog에만-있는-메소드를-사용할-수-가-없다는-점이다">중요한 점은 Dog유형의 객체인 경우에도 그 Dog객체에 대한 Object 레퍼런스에서는 Dog에만 있는 메소드를 사용할 수 가 없다는 점이다.</h4>
<pre><code>Dog adog = new Dog();
Object o = adog;
o.bark();//XX 컴파일이 안됨.Object객체 메소드만 사용할 수 있다.
(Dog)o.bark()//</code></pre><h3 id="📌동물-상속-트리에서-애완동물-트리를-만들어야-한다면pet-메소드를-추가하는-방법">📌동물 상속 트리에서 애완동물 트리를 만들어야 한다면....(Pet 메소드를 추가하는 방법.)</h3>
<p><img src="https://3.bp.blogspot.com/-CZNfTEN3weA/UQRD3muYAJI/AAAAAAAAAqs/5Vuugq1YQO0/s1600/2.jpg" alt=""></p>
<h3 id="📌그러면-다음과-같은-것이-필요하다">📌그러면 다음과 같은 것이 필요하다.</h3>
<h4 id="✨애완동물의-행동을-pet클래스에만-집어넣는-방법">✨애완동물의 행동을 Pet클래스에만 집어넣는 방법</h4>
<h4 id="✨모든-애완동물-클래스에-똑같은-메소드가-정의되게-하는-방법-이-때-모든-프로그래머가-그런-메소드를-제대로-사용할-수-있게-해야-한다똑같은-이름-똑같은-리턴유형을-가져야-하며-모든-메소드가-빠짐없이-있어야-합니다">✨모든 애완동물 클래스에 똑같은 메소드가 정의되게 하는 방법. 이 때 모든 프로그래머가 그런 메소드를 제대로 사용할 수 있게 해야 한다.(똑같은 이름, 똑같은 리턴유형을 가져야 하며 모든 메소드가 빠짐없이 있어야 합니다.)</h4>
<h4 id="✨각-애완동물-클래스마다-다른-인자-리턴유형-배열을-사용하지-않고도-다형성을-활용하여-모든-애완동물에-대해-애완동물용-메소드를-호출할-수-있게-하는-방법">✨각 애완동물 클래스마다 다른 인자 리턴유형 배열을 사용하지 않고도 다형성을 활용하여 모든 애완동물에 대해 애완동물용 메소드를 호출할 수 있게 하는 방법.</h4>
<p><img src="https://images.velog.io/images/chaean_7714/post/0f052f82-a052-48a9-bb51-1e1bf3e89d82/image.png" alt=""></p>
<h3 id="📌그런데-상위클래스를-두개-사용하는-경우-문제점이-있다">📌그런데 상위클래스를 두개 사용하는 경우 문제점이 있다.</h3>
<h4 id="그런-것을-다중-상속라고-부르는데-자바에서는-다중-상속을-사용할-수-없다-죽음의-다이아몬드라고-알려져-있는-문제가-있기-때문이다">그런 것을 &#39;다중 상속&#39;라고 부르는데, 자바에서는 다중 상속을 사용할 수 없다. 죽음의 다이아몬드라고 알려져 있는 문제가 있기 때문이다.</h4>
<p><img src="https://images.velog.io/images/chaean_7714/post/c2e39f8e-6770-4203-9166-f8839cc9e35a/image.png" alt=""></p>
<h4 id="위-그림-맨-아래-클래스인-combldrive-에서-burn메소드를-호출하면-어떤-메소드가-실행이-될까">위 그림 맨 아래 클래스인 ComblDrive 에서 burn()메소드를 호출하면 어떤 메소드가 실행이 될까?</h4>
<h3 id="📌우리에겐-인터페이스가-있다">📌우리에겐 인터페이스가 있다.</h3>
<h4 id="해결방법은-모든-메소드를-추상-메소드로-만드는-것이다-그러면-하위-클래스에서-반드시-메소드를-구현해야하므로-실행-중에jvm에서-상속받은-두-가지-버전-중-어떤-것을-호출해야-할-지-결정하지-못하는-문제가-생길-리-없다">해결방법은 모든 메소드를 추상 메소드로 만드는 것이다. 그러면 하위 클래스에서 반드시 메소드를 구현해야하므로 실행 중에JVM에서 상속받은 두 가지 버전 중 어떤 것을 호출해야 할 지 결정하지 못하는 문제가 생길 리 없다.</h4>
<pre><code>인터페이스 제작과 구현



public interface Pet{

    public abstract void beFriendly();
     void paly();             // 인터페이스 메소드는 자동으로 Public abstract이 되기 때문에 
                                 안 써도 된다.
                                (사실 사용하는 것은 그리 좋은 코딩 스타일이라고 할 수 없다.)
}

public class Dot extends Canine implements Pet{
    public void beFriendly(){...}
    public void play(){....}

    public void roam(){...}
    public void eat(){...}
}
</code></pre><blockquote>
<h4 id="질문-모든-메소드가-추상메소드라면-인터페이스를-왜-사용해야-하나요brspan-stylecolorred다형성span-때문입니다-br인자나-리턴-유형으로-구상-클래스-대신-인터페이스를-사용하면-그-인터페이스를-구현하는-것은-무엇이든-사용할-수-있다br-그리고-인터페이스가-있으면-클래스가-반드시-상속트리-하나로부터-나오지-않아도-됩니다-br클래스-하나는-클래스-하나를-확장하고-인터페이스-하나를-구현할-수-있습니다br하지만-완전히-다른-상속-트리에서-나온-또-다른-클래스에서-같은-인터페이스를-구현할-수-도-있습니다-br따라서-객체를-그-인스턴스의-클래스-유형이-아닌-그-span-stylecolorred역할span을-기준으로-처리할-수-있습니다">질문: 모든 메소드가 추상메소드라면 인터페이스를 왜 사용해야 하나요?<br><span style="color:red">다형성</span> 때문입니다. <br>인자나 리턴 유형으로 구상 클래스 대신 인터페이스를 사용하면 그 인터페이스를 구현하는 것은 무엇이든 사용할 수 있다.<br> 그리고 인터페이스가 있으면 클래스가 반드시 상속트리 하나로부터 나오지 않아도 됩니다. <br>클래스 하나는 클래스 하나를 확장하고 인터페이스 하나를 구현할 수 있습니다.<br>하지만 완전히 다른 상속 트리에서 나온 또 다른 클래스에서 같은 인터페이스를 구현할 수 도 있습니다. <br>따라서 객체를 그 인스턴스의 클래스 유형이 아닌 그 <span style="color:red">역할</span>을 기준으로 처리할 수 있습니다.</h4>
</blockquote>
<p><img src="https://images.velog.io/images/chaean_7714/post/46d5aa66-e5e0-4c58-9a1c-1858c537116b/image.png" alt=""></p>
<h3 id="📌정리암기필">📌정리(암기필)</h3>
<h4 id="👍클래스를-새로-만드려고-할-때-그-클래스가-다른-어떤-유형에-대해서도-a는-b-다-테스트를-통과할-수-없다면-그냥-클래스를-만든다">👍클래스를 새로 만드려고 할 때 그 클래스가 다른 어떤 유형에 대해서도 &#39;A는 B 다&#39; 테스트를 통과할 수 없다면 그냥 클래스를 만든다.</h4>
<h4 id="👍어떤-클래스의-더-구체적인-버전을-만들고-어떤-메소드를-오버라이드하거나-새로운-행동을-추가해야-한다면-하위클래스를-만듭니다즉-클래스를-확장합니다">👍어떤 클래스의 더 구체적인 버전을 만들고 어떤 메소드를 오버라이드하거나 새로운 행동을 추가해야 한다면 하위클래스를 만듭니다.(즉 클래스를 확장합니다.)</h4>
<h4 id="👍일련의-하위-클래스에서-사용할-틀을-정의하고-싶다면-그리고-모든-하위클래스에서-사용할-구현-코드가-조금이라도-있다면-추상클래스를-사용합니다-그리고-그유형의-객체를-절대-만들-수-없게-하고-싶다면-그-클래스를-추상-클래스도-만듭니다">👍일련의 하위 클래스에서 사용할 틀을 정의하고 싶다면, 그리고 모든 하위클래스에서 사용할 구현 코드가 조금이라도 있다면 추상클래스를 사용합니다. 그리고 그유형의 객체를 절대 만들 수 없게 하고 싶다면 그 클래스를 추상 클래스도 만듭니다.</h4>
<h4 id="👍상속트리에서의-위치에-상관없이-어떤-클래스의-역할을-정의하고-싶다면-인터페이스를-사용하면-됩니다">👍상속트리에서의 위치에 상관없이 어떤 클래스의 역할을 정의하고 싶다면 인터페이스를 사용하면 됩니다.</h4>
<h4 id="출처headfirst-저자케이시-시에라버트-베이츠">출처:headfirst (저자:케이시 시에라,버트 베이츠)</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[HeadFirst Java  study(7. 상속, 다형성 )]]></title>
            <link>https://velog.io/@chaean_7714/HeadFirst-Java-7%EC%83%81%EC%86%8D-%EB%8B%A4%ED%98%95%EC%84%B1-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@chaean_7714/HeadFirst-Java-7%EC%83%81%EC%86%8D-%EB%8B%A4%ED%98%95%EC%84%B1-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 17 Jan 2021 02:29:51 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👀이 글은 제가 공부한 것들을 잊어버리지 않기 위해 정리해 놓은 것입니다.</p>
</blockquote>
<h1 id="👿상속다형성-정리">👿상속,다형성 정리.</h1>
<hr>
<h5 id="상속을-먼저-이해하고-다형성을-이해하자">상속을 먼저 이해하고 다형성을 이해하자.</h5>
<h5 id="일단-상속-왜-사용하는가">일단 상속 왜 사용하는가?</h5>
<blockquote>
<h3 id="코드-중복을-방지하기-위해서-이다">코드 중복을 방지하기 위해서 이다.</h3>
</blockquote>
<h5 id="상속-예제로-많이-쓰이는-animal계층-구조를-보자">상속 예제로 많이 쓰이는 Animal계층 구조를 보자.</h5>
<p><img src="https://3.bp.blogspot.com/-CZNfTEN3weA/UQRD3muYAJI/AAAAAAAAAqs/5Vuugq1YQO0/s1600/2.jpg" alt=""></p>
<hr>
<h5 id="우선-인스턴스-변수를-모든-animal형식에-적용할-수-있다고-가정하자">우선 인스턴스 변수를 모든 Animal형식에 적용할 수 있다고 가정하자.</h5>
<h5 id="사자class가-있고-그사자의-고유-picturefoodhungerboundarieslocation-값이-있다">사자class가 있고 그사자의 고유 picture,food,hunger,boundaries,location 값이 있다.</h5>
<h5 id="하마class도-인스턴스의-변수의-값은-다르지만">하마class도 인스턴스의 변수의 값은 다르지만,</h5>
<h5 id="어쨌든-변수자체는-다른-animal-형식에-있는-것과-똑같은-것을-가지고-있다">어쨌든 변수자체는 다른 Animal 형식에 있는 것과 똑같은 것을 가지고 있다.</h5>
<h5 id="개-호랑이-등의-동물에서도-똑같다-하지만-행동도-그럴까">개, 호랑이 등의 동물에서도 똑같다. 하지만 행동도 그럴까?</h5>
<h5 id="사자와-개가-똑같은-소리를-낼까-고양이가-하마와-똑같은-식으로-먹을까">사자와 개가 똑같은 소리를 낼까? 고양이가 하마와 똑같은 식으로 먹을까?</h5>
<h3 id="그래서-override라는-것을-사용한다">그래서 override라는 것을 사용한다.</h3>
<h5 id="하위-클래스에서-상위클래스의-메소드를-사용하되-각-개체의-특성에-맞게-커스터마이징을-한다">하위 클래스에서 상위클래스의 메소드를 사용하되 각 개체의 특성에 맞게 커스터마이징을 한다.</h5>
<h4 id="✨오버라이드-정의-하위클래스에서-메소드의-역할을-변경하거나-확장할-필요가-있을때-상속받은-메소드를-새로-정의-하는것이다">✨오버라이드 정의: 하위클래스에서 메소드의 역할을 변경하거나 확장할 필요가 있을때 상속받은 메소드를 새로 정의 하는것이다.</h4>
<hr>
<h3 id="오버라이드-규칙">오버라이드 규칙</h3>
<h5 id="하위-클래스의-메소드는-상위-클래스의-메소드와-똑같아야-한다">하위 클래스의 메소드는 상위 클래스의 메소드와 똑같아야 한다.</h5>
<h5 id="즉-인자와-리턴형식이-동일해야-하는-것을-의미한다">즉 인자와 리턴형식이 동일해야 하는 것을 의미한다.</h5>
<h5 id="컴파일러에서는-어떤-레퍼런스에-대해-특정한-메소드가-제대로-호출할-수-있는지를-결정할-때-레퍼런스의-형식을-살펴본다">컴파일러에서는 어떤 레퍼런스에 대해 특정한 메소드가 제대로 호출할 수 있는지를 결정할 때 레퍼런스의 형식을 살펴본다.</h5>
<h5 id="dog에-대한-animal의-레퍼런스가-있을때">Dog에 대한 Animal의 레퍼런스가 있을때,</h5>
<pre><code>Animal a = new Dog();</code></pre><h5 id="컴파일러에서는-animal레퍼런스에-대해-호출하는-메소드가-animal-클래스에-있는지만-신경쓴다">컴파일러에서는 Animal레퍼런스에 대해 호출하는 메소드가 Animal 클래스에 있는지만 신경쓴다.</h5>
<h5 id="하지만-실행할-땐-jvm에서는-레퍼런스-형식이-아닌-힙에-들어있는-실제-dog객체를-사용한다">하지만 실행할 땐 JVM에서는 레퍼런스 형식이 아닌 힙에 들어있는 실제 Dog객체를 사용한다.</h5>
<h5 id="따라서-컴파일러에서-메소드-호출을--허가한-후에도-오버라이드하는-메소드의-인자와-리턴형식이-똑같을-때에만">따라서 컴파일러에서 메소드 호출을  허가한 후에도 오버라이드하는 메소드의 인자와 리턴형식이 똑같을 때에만,</h5>
<h5 id="그-메소드가-제대로-작동한다">그 메소드가 제대로 작동한다.</h5>
<hr>
<blockquote>
<h5 id="🅰일련의-클래스에-대한-상위클래스를-만들면-그-상위-클래스-형식이-들어갈-수-있는-모든-자리에-해당-클래스와-임의-하위-클래스에-속하는-객체를-마음대로-사용할-수-있다">🅰일련의 클래스에 대한 상위클래스를 만들면 그 상위 클래스 형식이 들어갈 수 있는 모든 자리에 해당 클래스와 임의 하위 클래스에 속하는 객체를 마음대로 사용할 수 있다.</h5>
</blockquote>
<h3 id="이것이-다형성을-사용하는-이유이다">이것이 다형성을 사용하는 이유이다.</h3>
<h5 id="아래-예제를-보면서-이해해-보자">아래 예제를 보면서 이해해 보자.</h5>
<h4 id="다형성을-사용하면-레퍼런스-유형을-실제-객체-유형의-상위-상위클래스-유형으로-지정-할-수-있다">다형성을 사용하면 레퍼런스 유형을 실제 객체 유형의 상위 상위클래스 유형으로 지정 할 수 있다.</h4>
<h5 id="a는-b다의-공식이-적용된-상속관계에서-모든-하위-객체doghippocat는-상위객체animal에-대입할-수-있다-이렇게-하면-배열을-만드는-것과-같은-일을-할-수-있다">&#39;A는 B다&#39;의 공식이 적용된 상속관계에서 모든 하위 객체(Dog,Hippo,Cat..)는 상위객체(Animal)에 대입할 수 있다. 이렇게 하면 배열을 만드는 것과 같은 일을 할 수 있다.</h5>
<pre><code>Animal[] a = new Animal[5];
a[0] = new Dog();
a[1] = new Cat();
a[2] = new Lion();
a[3] = new Hippo();

for(int i =0;i&lt;a.length;i++){
       a[i].eat(); //각 클래스에 들어있는 eat메소드가 실행.
}</code></pre><h5 id="또한-인자와-리턴-유형에-대해서도-다형성을-적용할-수-있다">또한 인자와 리턴 유형에 대해서도 다형성을 적용할 수 있다.</h5>
<pre><code>class Vet(){//주사를 맞으면 소리가 남.
 public void giveShot(Animal a){ //✨ 
     a.makeNois();
 }
}

class petOwner(){
 public void start(){
      Vet v = new Vet();
      Dog d = new Dog();
      Hippo h = new Hippo();
      v.giveShot(d);  //Dog의 노이즈가 실행
      v.giveShot(h);  //Hippo의 노이즈가 실행
 }
}</code></pre><h5 id="✨표시-부분에서-인자가-animal을-사용할-수-없다고-생각해보자">✨표시 부분에서 인자가 Animal을 사용할 수 없다고 생각해보자.</h5>
<h5 id="만약-다형성을-사용할-수-없었다면-vet클래스에선-giveshot-메소드가-하나가-아니라-하위클래스-갯수만큼의-메소드가-필요할-것이다-왜-petowner에서-giveshot을-호출할때-어떤-객체를-보낼지-모르기-때문이다">만약 다형성을 사용할 수 없었다면, Vet클래스에선 giveShot 메소드가 하나가 아니라 하위클래스 갯수만큼의 메소드가 필요할 것이다. 왜? petOwner에서 giveShot을 호출할때 어떤 객체를 보낼지 모르기 때문이다.</h5>
<blockquote>
<h3 id="🅰다형적인-인자를-사용하는-코드를-만들면-즉-메소드-매개변수를-상위-클래스-유형으로-선언하면-실행할-때-어떤-하위-클래스의-객체도-전달할-수-있다">🅰다형적인 인자를 사용하는 코드를 만들면, 즉 메소드 매개변수를 상위 클래스 유형으로 선언하면 실행할 때 어떤 하위 클래스의 객체도 전달할 수 있다.</h3>
</blockquote>
<blockquote>
<h3 id="🅰다형성을-활용하면-새로운-하위-클래스-형식을-프로그램에-추가하더라도-코드를-굳이-바꿀-필요가-없다-위에-나와있는-vet클래스-giveshot-메소드에서-선언된-인자는-새로운-하위클래스에-대한-사전-지식이-없어도-그-새로운-하위클래스-형식의-객체를-전달-받을-수-있다">🅰다형성을 활용하면 새로운 하위 클래스 형식을 프로그램에 추가하더라도 코드를 굳이 바꿀 필요가 없다. 위에 나와있는 Vet클래스 giveShot 메소드에서 선언된 인자는 새로운 하위클래스에 대한 사전 지식이 없어도 그 새로운 하위클래스 형식의 객체를 전달 받을 수 있다.</h3>
</blockquote>
<h4 id="출처headfirst-저자케이시-시에라버트-베이츠">출처:headfirst (저자:케이시 시에라,버트 베이츠)</h4>
]]></description>
        </item>
    </channel>
</rss>