<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jay_so_.log</title>
        <link>https://velog.io/</link>
        <description>달리는 개발자</description>
        <lastBuildDate>Thu, 10 Mar 2022 09:03:04 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jay_so_.log</title>
            <url>https://images.velog.io/images/jay_so_/profile/42622e0a-84f6-446c-93de-9b7a90948c73/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jay_so_.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jay_so_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[컴공선배_22Days 챌린지 18일차]]></title>
            <link>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-18%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-18%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 10 Mar 2022 09:03:04 GMT</pubDate>
            <description><![CDATA[<h1 id="3월-10일-challengeday18">3월 10일 Challenge[Day18]</h1>
<p><strong>Title</strong></p>
<aside>
💡 SQL, 테이블 개념 알아보기

</aside>

<h1 id="✏️1-sql이란">✏️1. SQL이란</h1>
<hr>
<aside>
💡 SQL = Structured Qurery Language의 약자, DBMS가 이해하는 언어

</aside>

<ol>
<li><strong>Structured= 표를 작성하고 정돈하는 것 (구조화 되어 있다)</strong></li>
<li><strong>Qurery  = 데이터 베이스에게 삽입,갱신, 삭제 등의 열할을 질의한다.</strong></li>
<li><strong>Language = 데이터베이스가 이해하고 프로그래머가 이해할 수 있도록 사용하는 언어</strong></li>
</ol>
<h2 id="🏠데이터-베이스는-어떻게-sql을-이해할까">🏠데이터 베이스는 어떻게 SQL을 이해할까?</h2>
<hr>
<ol>
<li>띄어쓰기 단위로 구분</li>
</ol>
<blockquote>
<p>데이터 베이스가 SQL을 이해할때는 한국어나 영어와 비슷하게 띄어쓰기를 기준으로 단어를 구분한다.</p>
</blockquote>
<p>ex SELECT (띄어쓰기) 무엇무엇  from 테이블명</p>
<ul>
<li>해석: 테이블명에 있는 데이터 중 ~(무엇무엇)을 SELECT(선택한다)</li>
</ul>
<ol>
<li>예약어 매칭</li>
</ol>
<blockquote>
<p>SQL문법은 SQL 질의 요청에서 특별한 의미를 가지는 단어를 미리 정의해둔다 = 예약어</p>
</blockquote>
<p>ex) SELECT = 선택한다, from (~로 부터) 등등</p>
<ol>
<li>예약어 규칙</li>
</ol>
<blockquote>
<p>데이터베이스는  SQL 질의를 이해하기 위해서 각 예약어가 나오면 그 뒤에 어떤 단어들이 나와야하는지도 정의하고 있다.</p>
</blockquote>
<p>ex) SELECT의 경우 SELECT 다음에 반드시 FROM이 나와야 하고, FROM 뒤에는 데이터를 가지고 오고 싶은 테이블의 이름이 오도록 정의 되어야한다.</p>
<p><strong>why?) 데이터를 선택하기 위해서는 어떤 테이블에서 선책해야하는지가 반드시 존재해야 하기 때문</strong></p>
<p><strong>SQL의 언어의특징</strong></p>
<ul>
<li>SQL 언어는 대다수의 관계형 데이터베이스가 SQL 언어를 통해 동작한다. (SQL언어는 중요하다)</li>
</ul>
<h1 id="✏️2-sql언어의-용어-살펴보기">✏️2. SQL언어의 용어 살펴보기</h1>
<hr>
<aside>
💡 SQL에서는 표를 Table로 불린다.

</aside>

<p><img src="https://images.velog.io/images/jay_so_/post/021077b5-fd21-4a93-afbe-e4334f00e4e7/1.png" alt=""></p>
<ul>
<li>테이블은 데이타베이스의 기본적인 데이타 저장 단위 이다.</li>
<li>데이타베이스 테이블은 사용자가 접근 가능한 모든 데이타를 보유하며 레코드와 컬럼으로 구성 된다</li>
<li>관계형 데이타베이스가 아닌 예전의 데이타 베이스 용어에서는 파일과 테이블이, 필드와 컬럼이, 그리고 레코드와 행이 동일시 되었다.</li>
<li>테이블은 시스템내에서 독립적으로 사용되길 원하는 엔티티를 표현할수 있다. 예를 들면, 회사에서의 고용자나 제품에 대한 주문은 테이블로 표현 가능하다.</li>
<li>테이블은 두 엔티티간의 관계를 표현할 수 있다. 즉 테이블은 고용자와 그들의 작업 숙련도 혹은 제품과 주문과의 관계를 표현하는데 사용될 수 있다.</li>
</ul>
<br/>
<aside>
💡 행을 row로, 열을 column으로 불린다.

</aside>

<p><img src="https://images.velog.io/images/jay_so_/post/f0001139-07e0-4f29-9712-ac2313c95efe/2.png" alt=""></p>
<ul>
<li>컬럼 : 테이블의 각 컬럼은 엔티티의 한 속성을 표현 한다</li>
<li>행(ROW, 레코드) : 테이블의 데이타는 행에 저장 된다</li>
</ul>
<br/>

<p>참고 자료: <a href="https://opentutorials.org/course/3161/19536">https://opentutorials.org/course/3161/19536</a></p>
<p>참고 자료: <a href="https://brunch.co.kr/@dan-kim/18">https://brunch.co.kr/@dan-kim/18</a>
참고 자료: <a href="http://www.gurubee.net/lecture/1012">http://www.gurubee.net/lecture/1012</a> </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴공선배_22Days 챌린지 16일차]]></title>
            <link>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-16%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-16%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 08 Mar 2022 06:58:53 GMT</pubDate>
            <description><![CDATA[<p><strong>Title:</strong></p>
<aside>
💡 데이터베이스 개념, Mysql 설치

</aside>

<h1 id="⏰1-스프레드-시트와-데이터-베이스">⏰1. 스프레드 시트와 데이터 베이스</h1>
<hr>
<aside>
💡 공통점 : MySQL과 같이 관계형 데이터베이스의 중요한 특징은 스프레드시트와 마찬가지로 데이터를 표의 형태로 표현해준다는 것

</aside>

<ul>
<li><p>공통점에 걸맞게 스프레드 시트와 데이터 베이스의 기능이 서로 비슷함</p>
</li>
<li><p>가장 큰 차이점: 데이터베이스는 코딩을 통해서 컴퓨터 언어를 통해서 제어할 수 있음</p>
</li>
</ul>
<ol>
<li>스프레드시트는 사용자가 클릭해서 데이터를 조작한다면 관계형 데이터베이스는 SQL이라고 하는 컴퓨터 언어를 이용해서 데이터를 제어할 수 있음</li>
<li>데이터베이스를 구축하면 이런 특성을 이용해서 데이터베이스에 저장된 데이터를 웹을 통해서 사람들에게 공유할 수도 있고, 앱을 통해서도 공유할 수도 있고, 데이터를 빅데이터나 인공지능을 이용해서 분석할 수 있음</li>
</ol>
<p><img src="https://images.velog.io/images/jay_so_/post/b3321c77-574b-4241-b58d-e92723d0f6a9/1.png" alt=""></p>
<p>ex) 데이터베이스에서 <code>SELECT * FROM topic WHERE author = &#39;egoing&#39;;</code></p>
<ul>
<li><code>topic</code>이라는 테이블로부터 <code>author</code>라고 하는 열에 값이 <code>egoing</code>인 데이터만 선택해서 가져와서 출력함</li>
</ul>
<p>ex) 데이터 베이스에서 <code>SELECT * FROM topic WHERE author = &#39;egoing&#39; ORDER BY id DESC;</code></p>
<ul>
<li>큰 숫자가 먼저 나오게 출력</li>
<li><code>DESC</code> : Descending</li>
</ul>
<aside>
💡  데이터베이스를 내부적으로 일종의 중요한 부품으로 사용하는 수많은 사례 중에 하나, 웹사이트의 정보를 데이터베이스에 담을 때 이 두 가지의 기술을 결합하면 데이터베이스의 정보를 전 세계에 있는 누구나 이 웹사이트에 접속해서 볼 수 있게 할 수 있음

</aside>

<aside>
💡 누구나 글을 쓰면 우리가 직접 데이터베이스를 제어하도록 하지 않아도 사용자들이 이 사이트에 들어와서 글을 써서 저장할 수 있는데 그 정보는 결과적으로는 결국 데이터베이스에 저장되고 있음

</aside>

<h1 id="⏰2-데이터-베이스-설치">⏰2. 데이터 베이스 설치</h1>
<hr>
<ol>
<li><strong>mysql community edition download 검색</strong></li>
</ol>
<p><img src="https://images.velog.io/images/jay_so_/post/40494e6f-d431-47c2-bd33-61ed6cd8f1f4/2.png" alt="">
2. <strong>각 운영체제에 맞게 다운로드</strong></p>
<p><img src="https://images.velog.io/images/jay_so_/post/bf1dfc76-43fa-4565-a9a6-e29e1d8b250f/3.png" alt=""></p>
<ol start="3">
<li><strong>다운로드 후 설치 파일을 진행한다!</strong></li>
</ol>
<p>ex) 설치 파일을 다운로드 한 후  mysql workbench를 실행한 화면</p>
<p><img src="https://images.velog.io/images/jay_so_/post/2437dbe0-d918-43c2-80bb-05f190ae04c5/4.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴공선배_22Days 챌린지 15일차]]></title>
            <link>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-15%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-15%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 07 Mar 2022 14:38:24 GMT</pubDate>
            <description><![CDATA[<p><strong>Title</strong></p>
<aside>
💡 스프링부트 프로젝트 구조 살펴보기 / 의존성 / 내장 웹서버 / JAR / [Application.properties](http://Application.properties) 2

</aside>

<h1 id="✏️1-스프링-부트-프로젝트-구조">✏️1. 스프링 부트 프로젝트 구조</h1>
<hr>
<p><img src="https://images.velog.io/images/jay_so_/post/f573801c-c8b1-4a2a-b2ea-b5b7829ee648/1.png" alt=""></p>
<aside>
💡 src/main/java = 클래스 파일들을 모아 놓은 곳

</aside>

<ul>
<li>src/main/resources 경로 =  xml, properties를 저장하는 곳으로</li>
</ul>
<ol>
<li><strong>static = css,js,hteml의 파일을  관리하는 곳</strong></li>
<li><strong>templates = 스프링 부트에서 이용하는 타임리프(thymeleaf) 형식 템플릿 파일을 저장하는 곳</strong></li>
<li><a href="http://application.properties">**application.properties</a> = 스프링 부트 전체 프로젝트의 설정을 저장하는 곳**</li>
</ol>
<ul>
<li><strong>src/test/java 경로 = JUnit 등 테스트 케이스의 자바 클래스 파일들을 저장하는 곳</strong></li>
</ul>
<p>자료 출처: <a href="https://medium.com/@dlaudtjr07/spring-boot-unit-2-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B5%AC%EC%A1%B0-1893562186e0">https://medium.com/@dlaudtjr07/spring-boot-unit-2-프로젝트-구조-1893562186e0</a></p>
<h1 id="✏️2-스프링-부트의-의존성">✏️2. 스프링 부트의 의존성</h1>
<hr>
<pre><code class="language-java">&lt;!-- Inherit defaults from Spring Boot --&gt;
&lt;parent&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;
    &lt;version&gt;2.0.3.RELEASE&lt;/version&gt;
&lt;/parent&gt;

&lt;!-- Add typical dependencies for a web application --&gt;
&lt;dependencies&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
        &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
    &lt;/dependency&gt;
&lt;/dependencies&gt;</code></pre>
<blockquote>
<p>Spring Boot의 <strong>의존성 관리 기능</strong> , 스프링 부트는 자동 환경 설정을 제공한다.</p>
</blockquote>
<h2 id="2-의존성-관리-기능-활용">2. 의존성 관리 기능 활용</h2>
<h3 id="1-버전-관리-해주는-의존성-추가">(1) 버전 관리 해주는 의존성 추가</h3>
<p>Spring Data JPA라는 의존성을 추가</p>
<pre><code>&lt;dependency&gt;&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;&lt;artifactId&gt;spring-boot-starter-data-jpa&lt;/artifactId&gt;&lt;/dependency&gt;</code></pre><ul>
<li>spring-boot-starter 를 추가했기 때문에 자동으로 의존성이 추가된다</li>
</ul>
<h3 id="2-버전-관리-안해주는-외부-의존성-추가">(2) 버전 관리 안해주는 외부 의존성 추가</h3>
<blockquote>
<p><a href="https://mvnrepository.com/">https://mvnrepository.com/</a></p>
<p>Maven dependency 검색 사이트</p>
</blockquote>
<pre><code>&lt;dependency&gt;&lt;groupId&gt;org.modelmapper&lt;/groupId&gt;&lt;artifactId&gt;modelmapper&lt;/artifactId&gt;&lt;version&gt;2.1.0&lt;/version&gt;&lt;/dependency&gt;</code></pre><ul>
<li>외부에서 가져오는 의존성은 버전을 명시해주는 것이 좋다.</li>
</ul>
<h3 id="3-기존-의존성-버전-변경하기">(3) 기존 의존성 버전 변경하기</h3>
<p><code>spring-boot-dependencies-2.0.3.RELEASE.pom</code>에 버전들이 정리되어있다</p>
<pre><code>...

&lt;snakeyaml.version&gt;1.19&lt;/snakeyaml.version&gt;&lt;solr.version&gt;6.6.4&lt;/solr.version&gt;&lt;spring.version&gt;5.0.7.RELEASE&lt;/spring.version&gt;&lt;spring-amqp.version&gt;2.0.4.RELEASE&lt;/spring-amqp.version&gt;&lt;spring-batch.version&gt;4.0.1.RELEASE&lt;/spring-batch.version&gt;&lt;spring-cloud-connectors.version&gt;2.0.2.RELEASE&lt;/spring-cloud-connectors.version&gt;&lt;spring-data-releasetrain.version&gt;Kay-SR8&lt;/spring-data-releasetrain.version&gt;&lt;spring-hateoas.version&gt;0.24.0.RELEASE&lt;/spring-hateoas.version&gt;

...</code></pre><p>Spring Boot에서 관리해주는 의존성 버전을 변경하고 싶을 때는 <code>properties</code>에 버전을 추가해 Overriding 해주면 된다.</p>
<pre><code>&lt;properties&gt;&lt;spring.version&gt;5.0.6.RELEASE&lt;/spring.version&gt;&lt;/properties&gt;</code></pre><ul>
<li>5.0.7 RELESASE 에서 5.0.6 RELEASE로 변경된 것을 확인할 수 있다.</li>
</ul>
<p>자료 출처: <a href="https://velog.io/@dsunni/Spring-Boot-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%9B%90%EB%A6%AC-%EC%9D%98%EC%A1%B4%EC%84%B1-%EA%B4%80%EB%A6%AC-%EC%9E%90%EB%8F%99-%EC%84%A4%EC%A0%95">https://velog.io/@dsunni/Spring-Boot-스프링부트-원리-의존성-관리-자동-설정</a></p>
<h1 id="✏️3-스프링-부트의-내장-웹서버">✏️3. 스프링 부트의 내장 웹서버</h1>
<hr>
<h1 id="스프링-부트-≠-서버">스프링 부트 ≠ 서버</h1>
<p>Spring 프레임워크를 쉽게 사용할 수 있게해주는 Tool일 뿐, 스프링 부트 자체는 웹 서버가 아니다.</p>
<h2 id="내장-서블릿-컨테이너-개요">내장 서블릿 컨테이너 개요</h2>
<p>spring-boot-starter-web을 사용한 프로젝트엔 톰캣(Tmcat)이 기본적으로 내장되어 있다. 톰캣은 데이터를 동적으로 처리하기 위한 서블릿 컨테이너로, JSP, 서블릿 처리, HTTP 요청과 응답 등을 처리한다.</p>
<p>자동 설정이 없다고 가정하고 Servlet을 만들어서 톰캣에 등록해보자.</p>
<pre><code>@SpringBootApplicationpublicclassApplication {

publicstaticvoidmain(String[] args) {
        Tomcat tomcat =new Tomcat();// 톰캣 객체 생성
        tomcat.setPort(8080);// 포트 설정
        Context context = tomcat.addContext(&quot;/&quot;, &quot;/&quot;);// 톰캣에 컨텍스트 추가// 서블릿 객체 생성
        HttpServlet servlet =new HttpServlet() {
@OverrideprotectedvoiddoGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
                PrintWriter writer = resp.getWriter();
                writer.println(&quot;&lt;h1&gt;Hello world!&lt;/h1&gt;&quot;);
            }
        };

final String servletName = &quot;myServlet&quot;;
// 톰캣에 서블릿 추가
        tomcat.addServlet(&quot;/&quot;, servletName, servlet);
// 컨텍스트에 서블릿 매핑
        context.addServletMappingDecoded(&quot;/home&quot;, servletName);

try {
// 톰캣 실행 및 대기
            tomcat.start();
            tomcat.getServer().await();
        }catch (LifecycleException e) {
            e.printStackTrace();
        }
    }
}</code></pre><p>웹 브라우저를 켜서 <code>[http://localhost:8080/home](http://localhost:8080/home)</code>으로 접속해보면 doGet()에서 작성한 내용이 HTML 문서로 반환된다.</p>
<p><img src="https://blog.kakaocdn.net/dn/bmIgsI/btqFXhIuBuU/vVjJ938sRiElFIYOUkcuiK/img.png" alt="https://blog.kakaocdn.net/dn/bmIgsI/btqFXhIuBuU/vVjJ938sRiElFIYOUkcuiK/img.png"></p>
<p>스프링에서는 이렇게 Tomcat에 Servlet을 등록하고 실행하는 일련의 작업이 자동 설정으로 정의되어 있다. 자동 설정 덕분에 이 모든 작업을 상세하고 유연하게 설정 후 실행해준다.</p>
<ul>
<li><p><code>ServletWebServerFactoryAutoConfiguration</code> : 서블릿 웹 서버 생성하는 설정 파일</p>
<ul>
<li><p><code>TomcatServletWebServerFactory</code>를 들어가보면 톰캣을 생성하고 서블릿, 디스패처 설정을 하는 코드가 있다.</p>
<pre><code>  public WebServer getWebServer(ServletContextInitializer... initializers) {
            Tomcat tomcat = new Tomcat();
            File baseDir =this.baseDirectory != null ?this.baseDirectory :this.createTempDir(&quot;tomcat&quot;);
            tomcat.setBaseDir(baseDir.getAbsolutePath());
            Connector connector = new Connector(this.protocol);
            tomcat.getService().addConnector(connector);
  this.customizeConnector(connector);
            tomcat.setConnector(connector);
            tomcat.getHost().setAutoDeploy(false);
  this.configureEngine(tomcat.getEngine());
  // ...
    }</code></pre><p>  <code>ServletWebServerFactoryAutoConfiguration</code>에서는 <code>TomcatServletWebServerFactory</code>를 사용하는 <code>TomcatServletWebServerFactoryCustomizer</code>를 반환한다.</p>
<pre><code>    @Configuration
    @AutoConfigureOrder(-2147483648)
    @ConditionalOnClass({ServletRequest.class})
    @ConditionalOnWebApplication(
        type = Type.SERVLET
    )
    @EnableConfigurationProperties({ServerProperties.class})
    @Import({ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class, EmbeddedTomcat.class, EmbeddedJetty.class, EmbeddedUndertow.class})
    public class ServletWebServerFactoryAutoConfiguration {
  // ...publicTomcatServletWebServerFactoryCustomizertomcatServletWebServerFactoryCustomizer(ServerProperties serverProperties) {
  returnnewTomcatServletWebServerFactoryCustomizer(serverProperties);
          }
  // ...
    }</code></pre></li>
</ul>
</li>
<li><p><code>DispatcherServletAutoConfiguration</code> : 서블릿을 만들고 등록해주는 설정 파일</p>
</li>
</ul>
<p>자료 출처: <a href="https://zion830.tistory.com/115">https://zion830.tistory.com/115</a></p>
<h1 id="✏️4-스프링-부트의-jar">✏️4. 스프링 부트의 JAR</h1>
<hr>
<h3 id="jar-war"><strong>JAR? WAR?</strong></h3>
<blockquote>
<p>기본적으로 JAR, WAR 모두 Java의 jar 옵션 (java -jar)을 이용해 생성된 압축(아카이브) 파일로, 애플리케이션을 쉽게 배포하고 동작시킬 수 있도록 관련 파일(리소스, 속성 파일 등)을 패키징 한 것이다.</p>
</blockquote>
<p>자세한 정의는 아래와 같다.</p>
<p><strong>JAR (Java Archive)</strong></p>
<ul>
<li>JAVA 어플리케이션이 동작할 수 있도록 자바 프로젝트를 압축한 파일</li>
<li>Class (JAVA리소스, 속성 파일), 라이브러리 파일을 포함함</li>
<li>JRE(JAVA Runtime Environment)만 있어도 실행 가능함 (java -jar 프로젝트네임.jar)</li>
</ul>
<h3 id="2-jar-file-structure"><strong>2. JAR File Structure</strong></h3>
<p>스프링 부트 공식문서에서 소개하는 JAR 파일은 아래 이미지처럼 BOOT-INF, META-INF, org 세 폴더로 이루어져 있다.</p>
<p><img src="https://blog.kakaocdn.net/dn/2ncFq/btqQstqXBgc/L36edy6NEXwjZMZvnkP0y0/img.png" alt="https://blog.kakaocdn.net/dn/2ncFq/btqQstqXBgc/L36edy6NEXwjZMZvnkP0y0/img.png"></p>
<p><strong>2.1. BOOT-INF</strong></p>
<p>: 개발자가 직접 작성한 클래스 파일들(classes)과, 의존성 주입을 통한 jar 파일(lib)들로 구성되어 있다.</p>
<ul>
<li>classpath.idx</li>
</ul>
<p>그림에는 없지만 classpath.idx라는 파일도 포함되어 있는데, 이는 classpath에 추가될 jar 파일들의 목록(lib 폴더 안에 있는 jar 파일)을 정의한 것이다.</p>
<p>이는 &quot;일반적인 JAR 파일은 중첩된 JAR 구조를 지원하지 않는다&quot;는 단점을 보완하기 위해 스프링 부트가 고안해 낸 방법으로, jar 파일 리스트를 확인하여 중첩된 JAR 구조를 지원할 수 있도록 한다.</p>
<pre><code>- &quot;ojdbc8.jar&quot;
- &quot;sitemesh-3.0.1.jar&quot;
- &quot;querydsl-apt-4.1.4.jar&quot;
- &quot;spring-boot-starter-web-2.3.4.RELEASE.jar&quot;
- &quot;spring-boot-starter-data-jpa-2.3.4.RELEASE.jar&quot;
- &quot;querydsl-jpa-4.3.1.jar&quot;
- &quot;spring-boot-starter-security-2.3.4.RELEASE.jar&quot;
…
</code></pre><p><strong>2.2. META-INF</strong></p>
<p>: 프로젝트 매니페스트 파일(MANIFEST.MF)을 포함하는 폴더이다. 매니페스트 파일은 파일 그룹을 위한 메타데이터(이름, 버전 번호, 라이선스, 프로그램의 구성 등)를 포함하는 파일이다.</p>
<ul>
<li>MANIFEST.MF</li>
</ul>
<pre><code>Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Start-Class: com.example.demo.DemoApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.3.4.RELEASE
Main-Class: org.springframework.boot.loader.JarLauncher
</code></pre><p>일반적인 JAR File의 MANIFEST에서 Main-Class는 Main메서드가 존재하는 클래스로 설정되지만, 스프링 부트의 Main-Class에서는 JarLauncher라는 클래스로 설정되어있다. (cf. WAR File에서는 WarLauncher)</p>
<ul>
<li>JarLauncher를 통한 Jar의 실행방식은 아래 순서로 이루어진다.</li>
</ul>
<ol>
<li>org.springframework.boot.loader.jar.JarFile: 내장 jar 인식</li>
<li>org.springframework.boot.loader.Launcher 실행</li>
<li>Start-Class에 선언된 클래스의 Main메서드 실행 (com.example.demo.DemoApplication)</li>
</ol>
<p><strong>2.3. org</strong></p>
<p>: org 폴더 안에는 위에서 설명한 Springboot loader classes 모듈이 저장되어 있다.</p>
<h3 id="3-war-file-structure"><strong>3. WAR File Structure</strong></h3>
<p>WAR 파일은 아래 이미지처럼 WEB-INF, META-INF, org 세 폴더로 이루어져 있다. JAR File과의 차이점은 BOOT-INF 대신 WEB-INF가 있다는 것인데, 웹 애플리케이션의 사전 정의된 구조를 따르기 위한 것으로 보인다.</p>
<p><img src="https://blog.kakaocdn.net/dn/b3I5DE/btqQnZdExug/9CzHEfibO7jkadZBIhEeeK/img.png" alt="https://blog.kakaocdn.net/dn/b3I5DE/btqQnZdExug/9CzHEfibO7jkadZBIhEeeK/img.png"></p>
<p><strong>3.1. WEB-INF</strong></p>
<p>: 개발자가 직접 입력한 class와 jar 파일, JSP 일 경우 view 파일들까지 포함되어 있는 디렉터리 이다. 아래 이미지는 Tomcat 사이트에서 설명하는 기본 디렉토리 구조로, WAR File Structure의 구조와 유사하단 것을 알 수 있다. 이처럼 웹 애플리케이션의 사전 정의된 구조를 따르고 있기 때문에, 외장 WAS 나 JSP를 사용할 일이 있다면 WAR를 이용하여 배포해야 한다.</p>
<p><img src="https://blog.kakaocdn.net/dn/bXYMLZ/btqQt6bV22b/3w0S4zlIlzmtx1ncfXSyy0/img.png" alt="https://blog.kakaocdn.net/dn/bXYMLZ/btqQt6bV22b/3w0S4zlIlzmtx1ncfXSyy0/img.png"></p>
<p>https:// tomcat.apache.org/tomcat-9.0-doc/appdev/deployment.html</p>
<p><strong>3.2. META-INF</strong></p>
<p>: JAR File과 동일하게 MANIFEST.MF 파일을 확인할 수 있다. 간혹 WAR파일은 단독으로 실행이 불가능하다는 이야기를 듣곤 했는데, Spring boot의 WAR는 단독으로 실행이 가능하다(bootWar로 빌드하였을 경우). 그 이유는 Main-Class에 Spring loader로 설정되어 있기 때문이다.</p>
<p>동작 원리는 JarLauncher와 유사하므로, MANIFEST.MF 파일 구조만 기재하고 넘어간다.</p>
<pre><code>Manifest-Version: 1.0
Start-Class: com.example.demo.DemoApplication
Spring-Boot-Classes: WEB-INF/classes/
Spring-Boot-Lib: WEB-INF/lib/
Spring-Boot-Version: 2.3.4.RELEASE
Main-Class: org.springframework.boot.loader.WarLauncher</code></pre><p>자료출처:<a href="https://hye0-log.tistory.com/27">https://hye0-log.tistory.com/27</a></p>
<h1 id="✏️5-스프링-부트의-applicationproperties">✏️5. 스프링 부트의 application.properties</h1>
<hr>
<h2 id="외부-설정-파일-이란">외부 설정 파일 이란?</h2>
<p>애플리케이션에서 사용하는 여러가지 설정 값들을 애플리케이션의 밖이나 안에 정의할 수 있는 기능을 말한다.</p>
<h2 id="applicationproperties">application.properties</h2>
<p>이 파일은 스프링부트가 애플리케이션을 구동할 때 자동으로 로딩하는 파일이다.key - value 형식으로 값을 정의하면 애플리케이션에서 참조하여 사용할 수 있다.</p>
<p><img src="https://media.vlpt.us/post-images/max9106/135408e0-481c-11ea-a88c-f789d2a39495/-2020-02-05-10.33.03.png" alt="https://media.vlpt.us/post-images/max9106/135408e0-481c-11ea-a88c-f789d2a39495/-2020-02-05-10.33.03.png"></p>
<p>값을 참조할 때는 여러가지 방법이 있다. @Value 어노테이션으로 값을 받아올 수도 있다.</p>
<p><img src="https://media.vlpt.us/post-images/max9106/561b1100-481c-11ea-a88c-f789d2a39495/-2020-02-05-10.35.03.png" alt="https://media.vlpt.us/post-images/max9106/561b1100-481c-11ea-a88c-f789d2a39495/-2020-02-05-10.35.03.png"></p>
<h3 id="프로퍼티-random-값-사용">프로퍼티 random 값 사용</h3>
<p>application.properties에 ${random.무엇}으로 랜덤 값을 줄 수도 있다.</p>
<p><img src="https://media.vlpt.us/post-images/max9106/726de720-4820-11ea-8902-81f0568c92bb/-2020-02-05-11.04.17.png" alt="https://media.vlpt.us/post-images/max9106/726de720-4820-11ea-8902-81f0568c92bb/-2020-02-05-11.04.17.png"></p>
<h3 id="프로퍼티-place-holder">프로퍼티 place holder</h3>
<p>application.properties에 정의해준 값을 변수를 사용하듯이 그대로 사용할 수도 있다.</p>
<p><img src="https://media.vlpt.us/post-images/max9106/895d86b0-4821-11ea-8221-4da73859da2d/-2020-02-05-11.12.17.png" alt="https://media.vlpt.us/post-images/max9106/895d86b0-4821-11ea-8221-4da73859da2d/-2020-02-05-11.12.17.png"></p>
<h3 id="프로퍼티-우선순위">프로퍼티 우선순위</h3>
<p>프로퍼티를 설정할 수 있는 방법은 매우 다양하다. 따라서 각 방법마다 우선순위가 있다. 여러 방법으로 같은 프로퍼티를 정의하고 있으면 우선순위가 제일 높은 방법으로 정의한 프로퍼티 값이 오버라이딩된다.</p>
<p>우선순위는 아래와 같다.1. 유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties</p>
<ol>
<li>테스트에 있는 @TestPropertySource</li>
<li>@SpringBootTest 애노테이션의 properties 애트리뷰트</li>
<li>커맨드 라인 아규먼트</li>
<li>SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로티) 에 들어있는 프로퍼티</li>
<li>ServletConfig 파라미터</li>
<li>ServletContext 파라미터</li>
<li>java:comp/env JNDI 애트리뷰트</li>
<li>System.getProperties() 자바 시스템 프로퍼티</li>
<li>OS 환경 변수</li>
<li>RandomValuePropertySource</li>
<li>JAR 밖에 있는 특정 프로파일용 application properties</li>
<li>JAR 안에 있는 특정 프로파일용 application properties</li>
<li>JAR 밖에 있는 application properties</li>
<li>JAR 안에 있는 application properties</li>
<li>@PropertySource</li>
<li>기본 프로퍼티 (SpringApplication.setDefaultProperties)</li>
</ol>
<p>resources - application.properties는 15번 순위이다.</p>
<p>우선 순위가 높은 test에서 프로퍼티를 설정해보겠다.</p>
<p>test 디렉토리 밑에 java에 클래스를 만들고 @SpringBootTest, @RunWith(SpringRunner.class) 어노테이션을 붙여준다.</p>
<p>@Test 어노테이션을 붙여 메서드를 하나 만들어준다.</p>
<p><img src="https://media.vlpt.us/post-images/max9106/40077cc0-481f-11ea-a6f2-cff7049c3a58/-2020-02-05-10.55.53.png" alt="https://media.vlpt.us/post-images/max9106/40077cc0-481f-11ea-a6f2-cff7049c3a58/-2020-02-05-10.55.53.png"></p>
<p>모든 프로퍼티들을 기본적으로 Environment를 통해서 확인할 수 있다. 따라서 Environment를 주입받아 getProperty로 프로퍼티를 받아온다.</p>
<p><img src="https://media.vlpt.us/post-images/max9106/eac41840-481e-11ea-8221-4da73859da2d/-2020-02-05-10.53.17.png" alt="https://media.vlpt.us/post-images/max9106/eac41840-481e-11ea-8221-4da73859da2d/-2020-02-05-10.53.17.png"></p>
<p>그리고 test 디렉토리에 resources 디렉토리를 만들고 project structure에서 Modules 부분에서 만들어준 resources를 Test Resources로 바꿔준다.</p>
<p><img src="https://media.vlpt.us/post-images/max9106/500878e0-481f-11ea-834a-33d2e85ab84e/-2020-02-05-10.50.39.png" alt="https://media.vlpt.us/post-images/max9106/500878e0-481f-11ea-834a-33d2e85ab84e/-2020-02-05-10.50.39.png"></p>
<p>그 후, 하위에 application.properties를 만들어준다. 그리고, 프로퍼티의 키는 그대로두고, 값을 바꿔준다.</p>
<p><img src="https://media.vlpt.us/post-images/max9106/8d0da850-481f-11ea-8221-4da73859da2d/-2020-02-05-10.57.59.png" alt="https://media.vlpt.us/post-images/max9106/8d0da850-481f-11ea-8221-4da73859da2d/-2020-02-05-10.57.59.png"></p>
<p>그 후 테스트 파일을 돌려보면 우선순위가 높은 테스트파일의 프로퍼티가 출력된다.</p>
<p><img src="https://media.vlpt.us/post-images/max9106/a6c2ed00-481f-11ea-8902-81f0568c92bb/-2020-02-05-10.58.42.png" alt="https://media.vlpt.us/post-images/max9106/a6c2ed00-481f-11ea-8902-81f0568c92bb/-2020-02-05-10.58.42.png"></p>
<p>테스트코드를 실행하면, 먼저 테스트코드가 빌드가 되고, 빌드를 할 때, src를 전부 빌드하여 classpath에 놓는다. 그 다음에 테스트코드를 빌드하여 classpath에 놓는다. 그 때, application.properties가 바뀌는 원리이다.</p>
<p>그렇기 때문에 만약 main의 application.properties에 정의되어 있는 값이 있고, test의 application.properties에는 그 값이 없으면 테스트가 깨진다. 실행 시 application.properties가 테스트 것으로 덮어쓰여지기 때문이다. 그래서 버그가 안나게 하기 위해서는 test의 것에도 똑같은 key값을 넣어줘야한다.</p>
<p>@TestPropertySource라는 어노테이션을 사용해서도 프로퍼티를 정해줄 수 있다. 우선순위가 2순위인 방법이다.</p>
<p><img src="https://media.vlpt.us/post-images/max9106/43765d60-4822-11ea-a6f2-cff7049c3a58/-2020-02-05-11.17.24.png" alt="https://media.vlpt.us/post-images/max9106/43765d60-4822-11ea-a6f2-cff7049c3a58/-2020-02-05-11.17.24.png"></p>
<p>만약 설정해주고 싶은 프로퍼티 값이 여러개일 경우 .properties 파일을 만들어 적용해 줄 수도 있다.</p>
<p><img src="https://media.vlpt.us/post-images/max9106/99a75630-4822-11ea-bdb4-d32ebadf49cc/-2020-02-05-11.19.22.png" alt="https://media.vlpt.us/post-images/max9106/99a75630-4822-11ea-bdb4-d32ebadf49cc/-2020-02-05-11.19.22.png"></p>
<p>classpath 기준으로 만들어준 파일의 위치를 적어준다.</p>
<p><img src="https://media.vlpt.us/post-images/max9106/9b033cb0-4822-11ea-a6f2-cff7049c3a58/-2020-02-05-11.19.42.png" alt="https://media.vlpt.us/post-images/max9106/9b033cb0-4822-11ea-a6f2-cff7049c3a58/-2020-02-05-11.19.42.png"></p>
<h3 id="applicationproperties의-우선순위">application.properties의 우선순위</h3>
<p>application.properties를 같은 위치가 아니라 다른 위치에 둘 경우는 컴파일해도 덮어쓰지 않게된다.</p>
<p>이 때 우선순위는 아래와 같다.1. file:./config/ :프로젝트 디렉토리 바로 아래에 config라는 디렉토리를 만들고 그 안에 application.properties 만들어주는 방법</p>
<ol>
<li>file:./ :프로젝트 루트 바로 아래에 application.properties 만들어주는 방법</li>
<li>classpath:/config/ :classpath 아래에 config라는 디렉토리를 만들고 그 안에 application.properties 만들어주는 방법</li>
<li>classpath:/ :classpath 아래에 application.properties 만들어주는 방법</li>
</ol>
<p><img src="https://media.vlpt.us/post-images/max9106/79a991c0-4824-11ea-841e-717d6f58d90d/-2020-02-05-11.32.54.png" alt="https://media.vlpt.us/post-images/max9106/79a991c0-4824-11ea-841e-717d6f58d90d/-2020-02-05-11.32.54.png"></p>
<p>자료 출처: <a href="https://velog.io/@max9106/Spring-Boot-%EC%99%B8%EB%B6%80%EC%84%A4%EC%A0%95-uik69crax3">https://velog.io/@max9106/Spring-Boot-외부설정-uik69crax3</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴공선배_22Days 챌린지 13일차]]></title>
            <link>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-13%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-13%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sat, 05 Mar 2022 13:51:16 GMT</pubDate>
            <description><![CDATA[<p><strong>Title</strong></p>
<aside>
💡 **Itellij 툴 설치하고 스프링부트 시작하기**

</aside>

<h1 id="✏️-1-spring-boot의-시작">✏️ 1. Spring Boot의 시작</h1>
<hr>
<ol>
<li><strong>Intellij에서 새로 만들기 → 프로젝트 → 선택</strong></li>
</ol>
<p><img src="https://images.velog.io/images/jay_so_/post/205d6233-ecab-4a3e-9a38-6f832651faa2/7.png" alt=""></p>
<ol>
<li><a href="https://start.spring.io/">**https://start.spring.io/</a>로 이동하여 스프링 부트 만들기**
<img src="https://images.velog.io/images/jay_so_/post/65c2ea83-c295-4171-87da-fa177e80ed68/2.png" alt=""></li>
</ol>
<h1 id="2-스프링-부트-실행">2. 스프링 부트 실행</h1>
<hr>
<p><img src="https://images.velog.io/images/jay_so_/post/740c1f04-d998-4127-88f3-59914fb8ea27/8.png" alt=""></p>
<p>메인 메소드의  실행 버튼을 클릭하면</p>
<p><img src="https://images.velog.io/images/jay_so_/post/c6ef0f5f-33ce-473f-9cbb-b28c8e1d9026/9.png" alt=""></p>
<p>콘솔창에 startes Application이 표시되며 실행된다.</p>
<p>로그를 보면 localhost의 8080포트로 실행되는 것을 알 수 잇다.</p>
<h1 id="3-스프링-부트-화면-띄우기">3. 스프링 부트 화면 띄우기</h1>
<hr>
<p><img src="https://images.velog.io/images/jay_so_/post/ef869816-f7df-41c7-8b74-04f52457196a/10.png" alt=""></p>
<ol>
<li>새로운 Controller 패키지를 만들고 HelloController 클래스를 만든다</li>
<li>hello 메소드를 만들고 “hello Spring Boot”를 문자열을 리턴해준다.</li>
<li>그리고 @GetMapping(”/hello”)라고 이름을 짓는다.</li>
<li>다시 스프링 부트를 실행한다.</li>
<li><a href="http://localhost:8080/hello%EB%A5%BC">localhost:8080/hello를</a> 입력하여 확인해본다.</li>
</ol>
<p>확인</p>
<p><img src="https://images.velog.io/images/jay_so_/post/3e242c4b-aa6f-48a6-9734-a74603749644/4.png" alt=""></p>
<ul>
<li>입력했던 Hello Spring Boot의 문자열이 출력되는 것을 확인할 수 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[3월 4일Challenge[Day12]]]></title>
            <link>https://velog.io/@jay_so_/3%EC%9B%94-4%EC%9D%BCChallengeDay12</link>
            <guid>https://velog.io/@jay_so_/3%EC%9B%94-4%EC%9D%BCChallengeDay12</guid>
            <pubDate>Fri, 04 Mar 2022 13:09:40 GMT</pubDate>
            <description><![CDATA[<p><strong>Tilte:</strong></p>
<aside>
💡 스프링 부트의 개념 찾아보고 정리하기

</aside>




<h1 id="✏️1-스프링-부트란">✏️1. 스프링 부트란?</h1>
<hr>
<p><img src="https://images.velog.io/images/jay_so_/post/ceea0b23-edf6-48c4-8c3a-8cd02f562f81/1.png" alt=""></p>
<aside>
💡 Spring boot란 복잡한 설정 없이 쉽게 자바 웹 어플리케이션 환경을 만들어주는 프레임워크

</aside>

<h1 id="✏️2-spring-boot의-장점">✏️2. Spring Boot의 장점</h1>
<hr>
<p><strong>1. 라이브러리 관리 자동화.</strong></p>
<p>스프링부트의 Starter  라이브러리를 등록해서 라이브러리 의존성을 간단히 관리할 수 있다.</p>
<p><strong>2. 라이브러리 버전 자동관리</strong>기존 스프링 라이브러리는 버전을 직접 입력해야 했지만, 스프링 부트는 pom.xml에 스프링 부트 버전을 입력해놓으면 spring 라이브러리 뿐만 아니라 third party라이브러리들도 호환되는 버전으로 알아서 다운로드 및 관리해준다.</p>
<p><strong>3. 설정 자동화</strong></p>
<p>스프링 부트는 @EnableAutoConfiguration 어노테이션을 선언해서 스프링에서 자주 사용했던 설정들을 알아서 등록해준다. 이 기능이 스프링 부트의 마법이라고 불린다고 한다.</p>
<p><strong>4. 내장Tomcat.</strong>스프링 부트는 WAS인 Tomcat을 내장하고 있다. @SpringBootApplication 어노테이션이 선언되어 있는 클래스의 mail()메소드를 실행하는 것만으로 서버를 구동시킬 수 있다.내장 톰캣을 사용하기 위한 별도 설정없이 web starter 의존성만 추가해주면 된다.</p>
<p><strong>5. 독립적으로 실행가능함 JAR</strong>웹 프로젝트라면 war파일로 패키징 해야하는데 스프링 부트는 내장 톰캣을 지원하기 때문에 jar 파일로 패키징해서 웹 애플리케이션을 실행시킬 수 있다 !</p>
<p>자료 출처:<a href="https://cheershennah.tistory.com/194">https://cheershennah.tistory.com/194</a></p>
<h1 id="✏️3-spring-boot를-적용한-웹-어플리케이션과-적용하지-않은-웹-어플리케이션과의-비교">✏️3. Spring Boot를 적용한 웹 어플리케이션과 적용하지 않은 웹 어플리케이션과의 비교</h1>
<hr>
<p><img src="https://images.velog.io/images/jay_so_/post/b4592e84-2d65-4ecb-8712-8c823e6b1912/2.png" alt=""></p>
<p><strong>스프링 부트를 사용하지 않은 웹 어플리케이션의 경우</strong></p>
<ul>
<li>Tocat에 대한 설정이 필요하다!</li>
<li>추가해야 하는 웹 어플리케이션의 종속성에 대하여 라이브러리들에 대한 의존성을 직접 작성해야 한다.</li>
</ul>
<p>참고 자료: <a href="https://www.youtube.com/watch?v=MFT2s6ijTws&amp;list=PLOSNUO27qFbv95vD0Cc5Vwtro4vcMZGiy&amp;index=2">https://www.youtube.com/watch?v=MFT2s6ijTws&amp;list=PLOSNUO27qFbv95vD0Cc5Vwtro4vcMZGiy&amp;index=2</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[3월 2일Challenge[Day10]]]></title>
            <link>https://velog.io/@jay_so_/3%EC%9B%94-2%EC%9D%BCChallengeDay10</link>
            <guid>https://velog.io/@jay_so_/3%EC%9B%94-2%EC%9D%BCChallengeDay10</guid>
            <pubDate>Wed, 02 Mar 2022 13:31:19 GMT</pubDate>
            <description><![CDATA[<p><strong>Title</strong></p>
<aside>
💡 JAVA로 간단한 프로젝트 만들어보기

</aside>

<p><img src="https://images.velog.io/images/jay_so_/post/3b0be845-342d-45e9-9049-7599e81c7e81/1.png" alt=""></p>
<p>참고 자료: <a href="https://www.youtube.com/watch?v=KGaixc-ExXA">https://www.youtube.com/watch?v=KGaixc-ExXA</a></p>
<p><strong>실행</strong></p>
<p><img src="https://images.velog.io/images/jay_so_/post/0b8d0cec-f82d-4c32-a240-c60ea90a6926/%EC%8B%A4%EC%8A%B5%20%ED%9B%84.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴공선배_22Days 챌린지 9일차]]></title>
            <link>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-9%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-9%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 01 Mar 2022 14:01:11 GMT</pubDate>
            <description><![CDATA[<p><strong>Title</strong></p>
<aside>
💡 JAVA로 간단한 프로젝트 만들어보기  - JAVAFX part1

</aside>

<p><img src="https://images.velog.io/images/jay_so_/post/8133c605-435e-482f-8aa9-df507f77fd82/%EC%8B%A4%EC%8A%B5.png" alt=""></p>
<p>링크: <a href="https://www.youtube.com/watch?v=boAJUSN8fOU">https://www.youtube.com/watch?v=boAJUSN8fOU</a></p>
<p><strong>part1까지의 코딩</strong></p>
<p><img src="https://images.velog.io/images/jay_so_/post/494d9d42-55da-4b4f-8beb-9cc45b7c3005/%EC%8B%A4%EC%8A%B52.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴공선배_22Days 챌린지 8일차]]></title>
            <link>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-8%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-8%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 28 Feb 2022 11:35:38 GMT</pubDate>
            <description><![CDATA[<p><strong>Title</strong></p>
<aside>
💡 자바 기본 라이브러리의 종류 살펴보기

</aside>

<h1 id="✏️api">✏️API</h1>
<hr>
<aside>
💡 API = Application Programming Interface

</aside>

<ul>
<li>라이브러리로 프로그램에서 자주 사용되는 클래스 및 인터페이스의 모음</li>
</ul>
<p><img src="https://images.velog.io/images/jay_so_/post/e7fbb3c2-693e-46a2-b8bd-e2f059f70bfe/1.png" alt=""></p>
<p>링크: <a href="https://docs.oracle.com/javase/8/docs/api/">https://docs.oracle.com/javase/8/docs/api/</a></p>
<h2 id="️javalang-패키지">⁉️java.lang 패키지</h2>
<hr>
<aside>
💡 자바 프로그램의 기본적인 클래스를 담고 있는 패키지

</aside>

<ul>
<li><strong>java.lang 패키지에 있는 클래스와 인터페이스는 import 없이 사용할 수 있다.</strong></li>
</ul>
<table>
<thead>
<tr>
<th>클래스</th>
<th>용도</th>
</tr>
</thead>
<tbody><tr>
<td>Object</td>
<td>자바 클래스의 최상위 클래스로 사용됨</td>
</tr>
<tr>
<td>System</td>
<td>표준 입력 장치(키보드)로부터 데이터를 입력받을 때 사용됨</td>
</tr>
<tr>
<td>Class</td>
<td>클래스를 메모리로 로딩할 때 사용</td>
</tr>
<tr>
<td>String</td>
<td>문자열을 저장하고 여러 가지 정보를 얻을 때 사용됨</td>
</tr>
<tr>
<td>StringBuffer,StringBuilder</td>
<td>문자열을 저장하고 내부 문자열을 조작할때 사용됨</td>
</tr>
<tr>
<td>Math</td>
<td>수학 함수 이용시 사용</td>
</tr>
<tr>
<td>Wrapper</td>
<td>기본 타입의 데이터를 갖는 객체를 만들 때 사용됨,  문자열을 기본 타입으로 변환할 때 주로 사용된다.</td>
</tr>
</tbody></table>
<h3 id="⏰object-클래스">⏰Object 클래스</h3>
<hr>
<aside>
💡  모든 자바 클래스의 최상위 부모 클래스

</aside>

<ul>
<li>자바 컴파일러가 자동으로 상속처리함</li>
<li>자바의 모든 클래스들은 Object 클래스와 동일한 메소드를 가짐</li>
</ul>
<h3 id="🏠object-클래스의-주요-메소드">🏠Object 클래스의 주요 메소드</h3>
<hr>
<ul>
<li>toString() 메소드 : 객체에 대한 정보를 문자열로 반환</li>
<li>equals() 메소드 : 두 객체를 비교하여 동일한지 판단함</li>
</ul>
<h3 id="⏰wrapper-클래스">⏰Wrapper 클래스</h3>
<hr>
<aside>
💡 기본 자료형에 대응하는 클래스

</aside>

<p>• 클래스의 다양한 메소드 활용 가능</p>
<h3 id="🏠오토-박싱auto-boxing-오토-언박싱auto-unboxing">🏠오토 박싱(auto boxing), 오토 언박싱(auto unboxing)</h3>
<hr>
<aside>
💡 오토 박싱 = 기본 자료형 값을 Wrapper  클래스의 객체로 자동 변환해주는 것

</aside>

<aside>
💡 오토 언박싱 = Wrapper 클래스의 객체에 있는 값을 기본 자료형으로 자동 변환해 주는 것

</aside>

<h3 id="⏰stringbuffer-클래스">⏰StringBuffer 클래스</h3>
<hr>
<aside>
💡 문자열을 수정 및 변경할 수 있어서 다양한 문자열 처리가 가능함

</aside>

<ul>
<li>버퍼 메모리를 확보해 놓고 문자열을 처리</li>
<li>String 클래스 보다 처리 속도가 빠름</li>
</ul>
<h3 id="⏰math-클래스">⏰Math 클래스</h3>
<hr>
<aside>
💡 수학 함수 이용시 사용

</aside>

<ul>
<li>수학과 관련된 메소드를 제공하는 클래스</li>
<li>대부분 정적 멤버 메소드로 정의되어 있음</li>
</ul>
<h2 id="️javautil-패키지">⁉️java.util 패키지</h2>
<hr>
<aside>
💡 자바 프로그램 개발에 도움을 주는 클래스를 담고 있는 패키지

</aside>

<ul>
<li>컬렉션 클래스들이 대부분을 차지한다.</li>
</ul>
<table>
<thead>
<tr>
<th>클래스</th>
<th>용도</th>
</tr>
</thead>
<tbody><tr>
<td>Arrays</td>
<td>배열을 조작(비교,복사,정렬, 검색)할 때 사용한다.</td>
</tr>
<tr>
<td>Calender</td>
<td>날짜와 시간 정보를 얻을 때 사용한다.</td>
</tr>
<tr>
<td>Date</td>
<td>날짜와 시간 정보를 저장하는 클래스</td>
</tr>
<tr>
<td>Objects</td>
<td>객체 비교, 널(null) 여부 등을 조사할 때 사용한다.</td>
</tr>
<tr>
<td>StringTokenizer</td>
<td>특정 문자로 구분된 문자열을 뽑아낼 때 사용한다.</td>
</tr>
<tr>
<td>Random</td>
<td>난수를 얻을 때 사용한다.</td>
</tr>
</tbody></table>
<h3 id="⏰random-클래스">⏰Random 클래스</h3>
<hr>
<aside>
💡 난수를 얻을 때 사용

</aside>

<ul>
<li>임의의 값을 발생시키는 클래스</li>
<li>객체 생성 후 여러 번 임의의 값을 가져올 수 있음</li>
</ul>
<h3 id="⏰calendar-클래스">⏰Calendar 클래스</h3>
<hr>
<aside>
💡 날짜와 시간 정보를 얻을 때 사용

</aside>

<p>• 시스템의 날짜와 시간을 가져오기 위해서 getInstance() 메소드로 객체를 생성</p>
<p>참고자료: <a href="https://velog.io/@ljsk99499/java8">https://velog.io/@ljsk99499/java8</a>, <a href="https://kephilab.tistory.com/91?category=395679">https://kephilab.tistory.com/91?category=395679</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴공선배_22Days 챌린지 6일차]]></title>
            <link>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-6%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-6%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sat, 26 Feb 2022 13:19:43 GMT</pubDate>
            <description><![CDATA[<p><strong>Title</strong></p>
<aside>
💡 상속 / 캡슐화 / 다형성

</aside>

<h1 id="✏️-상속">✏️ 상속</h1>
<hr>
<h2 id="❓-상속이란-무엇일까">❓ 상속이란 무엇일까?</h2>
<ul>
<li>상속이란 무엇일까?</li>
</ul>
<p>ex) A가 부모로부터 건물을 물려 받는다, 재산을 상속 받는다.</p>
<p>이처럼 <strong>상속은 자식이 부모로 부터 “무엇인가”를 물려 받는다 라고 한다.</strong></p>
<p><strong>자바의 상속</strong></p>
<aside>
💡 자바의 상속 = 부모 (클래스)로 부터 자식(클래스)이 “변수와 메소드”를 물려 받는다

</aside>

<p><strong>상속의 장점</strong></p>
<ol>
<li>중복된 코드를 줄일 수 있다.</li>
<li>유지 보수가 편리하다.</li>
<li>다형성을 구현할 수 있다.</li>
</ol>
<p><strong>상속의 형식</strong></p>
<ul>
<li><strong>extends 키워드에 상속 받을 부모 클래스 명을 적는다</strong></li>
</ul>
<p><img src="https://images.velog.io/images/jay_so_/post/2aa2fbb9-76b0-4481-a791-9d03d2e5c6c1/5.png" alt=""></p>
<p><strong>자바에서의 자식 클래스는 여러 부모로부터 다중 상속을 받는 것은 불가능하다. 즉, 1개의 부모 클래스로부터 단일 상속만 허용된다. but 부모 클래스는 여러 개의 자식 클래스에게 상속이 가능하다</strong>.</p>
<p><img src="https://images.velog.io/images/jay_so_/post/166f17fc-c2ef-4624-b387-d2851a32b9d2/4.png" alt=""></p>
<p>예시 </p>
<pre><code class="language-java">class A {
    String aField = &quot;클래스 A 필드&quot;;
    public void aMethod() {
        System.out.println(aField);
    }
}

class B extends A {
    String bField = &quot;클래스 B 필드&quot;;
    public void bMethod() {
        System.out.println(aField); // 부모 클래스 필드 사용
        System.out.println(bField); // 본인 클래스 필드 사용
    }
}

class C extends B {
    String cField = &quot;클래스 C 필드&quot;;
    public void cMethod() {
        System.out.println(aField); // 조부모 클래스 필드 사용
        System.out.println(bField); // 부모 클래스 필드 사용
        System.out.println(cField); // 본인 클래스 필드 사용
    }
}

public class SuperSubEx01 {
    public static void main(String[] args) {
        System.out.println(&quot;----------A----------&quot;);
        A a = new A();
        a.aMethod(); // 본인 메소드 사용
        // a.bMethod(); // A(부모) 객체로 B(자식) 메소드 접근 불가
        System.out.println(&quot;----------A----------&quot;);
        System.out.println(&quot;----------B----------&quot;);
        B b = new B();
        b.aMethod(); // 부모 메소드 사용
        b.bMethod(); // 본인 메소드 사용
        // b.cMethod(); // B(부모) 객체로 C(자식) 메소드 접근 불가
        System.out.println(&quot;----------B----------&quot;);
        System.out.println(&quot;----------C----------&quot;);
        C c = new C();
        c.aMethod(); // 조부모 메소드 사용
        c.bMethod(); // 부모 메소드 사용
        c.cMethod(); // 본인 메소드 사용
        System.out.println(&quot;----------C----------&quot;);
    }
}</code></pre>
<ol>
<li>먼저 A, B, C클래스를 각각 정의하고 각 클래스 별로 필드(전역변수)와 메소드를 정의하였다.</li>
<li>그리고 <strong>B는 A에게 C는 B에게 상속을 받는다</strong>(A→B→C) </li>
<li><strong>각 메소드에서 부모 클래스의 필드를 자식 클래스가 사용하여 데이터를 출력</strong> 한다.</li>
<li><strong>main 메소드에서는 각 클래스 별로 인스턴스를 생성하고 자식 클래스 인스턴스에서 부모 클래스의 메소드를 호출한다.</strong></li>
</ol>
<p>참고 자료: <a href="https://blog.naver.com/PostView.nhn?blogId=heartflow89&amp;logNo=220960019390">https://blog.naver.com/PostView.nhn?blogId=heartflow89&amp;logNo=220960019390</a></p>
<h1 id="✏️-캡슐화">✏️ 캡슐화</h1>
<hr>
<h2 id="❓-캡슐화란-무엇일까">❓ 캡슐화란 무엇일까?</h2>
<aside>
💡 캡슐화 = 연관된 목적을 가지는 변수와 함수를 하나의 클래스로 묶어 외부에서 쉽게 접근하지 못하도록 숨기는 것 (주로 중요한 데이터를 쉽게 바꾸지 하지 못하도록 할 때 사용함)

</aside>

<h2 id="❓-캡슐화를-왜-할까">❓ 캡슐화를 왜 할까?</h2>
<aside>
💡 접근을 제한함으로써 유지보수나 확장 시 오류의 범위를 최소화할 수 있고 객체 내의 정보 손상과 오용을 방지한다.

</aside>

<ul>
<li>자바의 캡슐화는 접근 제어자를 통해 이루어진다.</li>
</ul>
<p><strong>자바의 접근 제어자</strong></p>
<table>
<thead>
<tr>
<th>접근 제어자</th>
<th>범위</th>
</tr>
</thead>
<tbody><tr>
<td>public</td>
<td>접근 제한 없음</td>
</tr>
<tr>
<td>protected</td>
<td>동일한 패키지 내에 존재하거나 파생 클래스에서만 접근 가능</td>
</tr>
<tr>
<td>default</td>
<td>아무런 접근 제어자를 명시하지 않음, 동일 패키지 내에서만 접근 가능</td>
</tr>
<tr>
<td>private</td>
<td>자기 자신만의 클래스 내에서만 접근 가능</td>
</tr>
</tbody></table>
<p>예시</p>
<pre><code class="language-java">
public class EncapsulationClass {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

//메인 클래스
public class Main {

    public static void main(String[] args) {
    // write your code here
        EncapsulationClass cap = new EncapsulationClass();

        cap.setId(123);
        cap.setName(&quot;jay&quot;);

        System.out.println(cap.getId());
        System.out.println(cap.getName());
    }
}
</code></pre>
<p>출력값</p>
<pre><code class="language-java">123
jay</code></pre>
<ul>
<li>private 접근 제어자를 통해 변수를 선언하였기에 외부에서 접근할 수 없다.</li>
<li>따라서 getter, setter 메소드를 통해 변수에 값을 저장하고 가져올 수 있게 한다.</li>
</ul>
<p>참고 자료: <a href="https://jaynamm.tistory.com/entry/JAVA-%EC%9E%90%EB%B0%94-%EC%BA%A1%EC%8A%90%ED%99%94-Encapsulation">https://jaynamm.tistory.com/entry/JAVA-자바-캡슐화-Encapsulation</a></p>
<h1 id="✏️-다형성">✏️ 다형성</h1>
<hr>
<h2 id="❓-다형성이란-무엇일까">❓ 다형성이란 무엇일까?</h2>
<aside>
💡 다형성 = 하나라는 객체가 여러가지 타입을 가질 수 있다는 것을 의미한다.

</aside>

<h2 id="❓-참조-변수의-다형성">❓ 참조 변수의 다형성</h2>
<ul>
<li>자바에서는 다형성을 위해 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 한다.</li>
<li>이때 참조 변수가 사용할 수 있는 멤버의 개수가 실제 인스턴스의 멤버 개수보다 같거나 적어야 참조 할 수 있다.</li>
</ul>
<p>예시</p>
<pre><code class="language-java">class Parent { ... }

class Child extends Parent { ... }

...

Parent pa = new Parent(); // 허용

Child ch = new Child();   // 허용

Parent pc = new Child();  // 허용

Child cp = new Parent();  // 오류 발생.</code></pre>
<ul>
<li>부코 클래스 타입의 참조 변수로도 자식 클래스 타입의 인스턴스를 참조할 수 있다.</li>
<li>하지만 반대인 경우인 자식 클래스 타입의 참조 변수로는 부모 클래스 타입의 인스턴스를 참조할 수 없다.</li>
</ul>
<h2 id="❓-참조-변수의-타입-변환">❓ 참조 변수의 타입 변환</h2>
<ul>
<li>자바에서의 참조 변수는 다음과 같은 조건에 따라 타입 변환을 할 수 있다.</li>
</ul>
<p><strong>조건</strong></p>
<ol>
<li>서로 상속 관계에 있는 클래스 사이에만 타입 변환을 할 수 있다.</li>
<li>자식 클래스 타입에서 부모 클래스 타입으로의 타입 변환은 생략할 수 있다.</li>
<li>하지만 부모 클래스 타입에서 자식 클래스 타입으로의 타입 변환은 반드시 명시해야 한다.</li>
</ol>
<p><strong>문법</strong></p>
<pre><code class="language-java">(변환할타입의클래스이름) 변환할참조변수</code></pre>
<p>예시</p>
<pre><code class="language-java">class Parent { ... }

class Child extends Parent { ... }

class Brother extends Parent { ... }

...

Parent pa01 = null;

Child ch = new Child();

Parent pa02 = new Parent();

Brother br = null;



pa01 = ch;          // pa01 = (Parent)ch; 와 같으며, 타입 변환을 생략할 수 있음.

br = (Brother)pa02; // 타입 변환을 생략할 수 없음.

br = (Brother)ch;   // 직접적인 상속 관계가 아니므로, 오류 발생.</code></pre>
<p>참고 자료:  <a href="http://www.tcpschool.com/java/java_polymorphism_concept">http://www.tcpschool.com/java/java_polymorphism_concept</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴공선배_22Days 챌린지 5일차]]></title>
            <link>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-5%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-5%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 25 Feb 2022 14:15:23 GMT</pubDate>
            <description><![CDATA[<p><strong>Title</strong></p>
<aside>
💡 객체지향 프로그래밍, 클래스와 인스턴스 개념 알아보고 실습하기

</aside>

<h1 id="⏰-객체-지향-프로그래밍">⏰ 객체 지향 프로그래밍</h1>
<hr>
<h2 id="✏️객체-지향이란-무엇일까">✏️객체 지향이란 무엇일까??</h2>
<aside>
💡 **객체 = 간단히 말해 다른 것과 구분할 수 있는 것,**

</aside>

<p>ex) </p>
<p>학생, 회원, 주문, 생산, 배송을 객체가 될 수 있다.</p>
<h2 id="✏️-객체의-구성">✏️ 객체의 구성</h2>
<aside>
💡 객체 = 속성과 동작으로 구성되어 있다.

</aside>

<p>ex)</p>
<p>속성 = 사람의 나이, 이름</p>
<p>동작 = 달리다, 잠자다, 공부하다</p>
<p><strong>객체의 속성은 필드(field),</strong></p>
<p><strong>객체의 동작은 메소드(method)라고 불린다.</strong></p>
<p>다음의 그림을 살펴보자</p>
<p><img src="https://images.velog.io/images/jay_so_/post/77a4b450-f90e-4a40-b916-d5be999ef83a/%EA%B0%9D%EC%B2%B4%EB%9E%801.png" alt=""></p>
<p>여기서 <strong>객체란 “본문, 댓글, 글목록”</strong>으로 <strong>구분할 수 있으며</strong> </p>
<p>오른쪽의 그림처럼 </p>
<ul>
<li>본문은 변수(속성), 메소드(동작)</li>
<li>댓글의 변수(속성), 메소드(동작)으로 표현할 수 있다.</li>
</ul>
<p>자료출처: <a href="https://www.opentutorials.org/course/1223/5399">https://www.opentutorials.org/course/1223/5399</a>, <a href="https://computer-science-student.tistory.com/288">https://computer-science-student.tistory.com/288</a></p>
<h1 id="⏰클래스와-인스턴스-개념">⏰클래스와 인스턴스 개념</h1>
<hr>
<h3 id="❓클래스와-인스턴스란-무엇일까">❓클래스와 인스턴스란 무엇일까?</h3>
<ul>
<li>다음의 그림을 살펴보자</li>
</ul>
<p><img src="https://images.velog.io/images/jay_so_/post/316732ab-e346-4331-9d97-5a702f7e23d1/%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80%20%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4.png" alt=""></p>
<aside>
💡 클래스 = 설계도, 틀

</aside>

<aside>
💡 인스턴스 = 틀을 바탕으로 만들어진 제품

</aside>

<ul>
<li>코드를 이용하여 살펴보자</li>
</ul>
<pre><code class="language-java">//클래스
class Calculator{
    //변수 선언 (속성)
    int left,right;

    //메소드 (행위)
    //setOprands - 초기화 (left 값, right 값)
    public void setOprands(int left, int right) {
        this.left = left;
        this.right = right;
    }

    //메소드(행위)
    //sum - 덧셈
    public void sum(){
        System.out.println(this.left+this.right);
    }

    //메소드(행위)
    //avg - 평균
    public void avg(){
        System.out.println((this.left+this.right)/2);
    }
}

//클래스
public class CalculatorDemo4 {

    public static void main(String[] args) {

        //인스턴스 생성
         Calculator c1 = new Calculator();
          //left = 10. right = 20으로 설정
          c1.setOprands(10, 20);
          //덧셈
          c1.sum(); //10 + 20 = 30
          // 평균
          c1.avg(); // 10 +20 /2 = 15

         //인스턴스 생성
         Calculator c2 = new Calculator();
         //left = 20, right = 40
         c2.setOprands(20, 40);
         //덧셈
         c2.sum();  //20 + 40 = 60      
         //평균   
         c2.avg(); // 20 + 40 / 2 = 30

        }

}</code></pre>
<p><strong>출력값</strong></p>
<pre><code class="language-java">30
15
60
30</code></pre>
<p>자료 출처: <a href="https://whatisthenext.tistory.com/36">https://whatisthenext.tistory.com/36</a>, <a href="https://www.opentutorials.org/course/1223/5400">https://www.opentutorials.org/course/1223/5400</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴공선배_22Days 챌린지 4일차]]></title>
            <link>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-4%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-4%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 24 Feb 2022 12:07:25 GMT</pubDate>
            <description><![CDATA[<p><strong>Titile</strong></p>
<aside>
💡 연산자 / 조건문 / 반복문 2 + 백준 문제 풀이

</aside>

<h1 id="🧡-연산자-조건문-반복문-1-정리">🧡 연산자, 조건문, 반복문 1 정리</h1>
<hr>
<ul>
<li><p>Day3에 연산자, 조건문, 반복문1을 정리해 두었습니다.</p>
</li>
<li><p><a href="https://www.notion.so/2-23-Challenge-Day3-ee3793ae905143b0bcc789108db564ad">2월 23일 Challenge[Day3]</a></p>
</li>
</ul>
<h1 id="🧡-for문">🧡 for문</h1>
<hr>
<aside>
💡 while문과 같은 반복문이지만 로직의 응집성, 간편화를 위해  (초기화,종료조건, 반복문)을 으로 정리한 반복문

</aside>

<p><strong>형식</strong></p>
<pre><code class="language-java">for(초기화;종료조건;반복실행) {
        반복적으로 실행할 구문
}</code></pre>
<ul>
<li><strong>초기화 : 반복문이 실행될 때 1회 실행</strong></li>
<li><strong>종료조건 : 초기화가 실행된 후에 종료조건이 실행된다. 종료조건의 값이 false일 때까지 반복문의 중괄호 구간의 코드가 반복 실행된다.</strong></li>
<li><strong>중괄호 구간의 실행이 끝나면 반복 실행이 실행된다. 일반적으로 이 곳에 i++와 같이 변수를 증가시키는 로직이 위치하고, 이것이 실행된 후에 종료조건이 실행된다. 종료조건이 false가 될 때까지 이 과정이 반복된다.</strong></li>
</ul>
<p><strong>다음의 while문과 for문은 동일한 결과를 출력한다!</strong></p>
<p><strong>while문</strong></p>
<pre><code class="language-java">int i = 0;

while(i&lt;10){
        System.out.prinltn(&quot;computer Challenge +i&quot;);
    i++;
}</code></pre>
<p><strong>for문</strong></p>
<pre><code class="language-java">for(int i = 0; i++ ; i&lt;10){
    System.out.printnln(&quot;computer Challenge + i&quot;);
}</code></pre>
<p><strong>출력 결과</strong></p>
<pre><code class="language-java">computer Challenge 1
computer Challenge 2
computer Challenge 3
computer Challenge 4
computer Challenge 5
computer Challenge 6
computer Challenge 7
computer Challenge 8
computer Challenge 9</code></pre>
<h1 id="🧡-반복문의-제어">🧡 반복문의 제어</h1>
<hr>
<h2 id="break">Break</h2>
<aside>
💡 반복문의 작업에서 중간에 중단시키고 싶을 때 사용한다.

</aside>

<ul>
<li>마치 집에서 영화를 보다가 밖으로 나가야 될 일이 있을 경우 영화를 종료하는 버튼을 누르는 것이라고 생각하면 된다.</li>
</ul>
<pre><code class="language-java">for (int i = 0; i &lt; 10; i++) {
            if (i == 5) //만약 i의 값이 5라면
                break;  //종료해라
            System.out.println(&quot;Coding Everybody &quot; + i);
        }</code></pre>
<p><strong>출력문</strong></p>
<pre><code class="language-java">coding everybody 0
coding everybody 1
coding everybody 2
coding everybody 3
coding everybody 4</code></pre>
<h2 id="continue">continue</h2>
<aside>
💡 반복문 작업에서 일정 조건의 실행은 멈추면서 전체의 반복은 지속하게 한다

</aside>

<ul>
<li>마치 집에서 영화를 보다가 잔인한 장면이 나오자 앞으로 가기 버튼을 선택하여 잔인한 장면 이외의 장면부터 보기 시작한다 라고 생각하면 된다.</li>
</ul>
<pre><code class="language-java">for (int i = 0; i &lt; 10; i++) {
            if (i == 5) //만약 i의 값이 5라면 
                continue; // 뛰어 넘고 실행해라
            System.out.println(&quot;Coding Everybody &quot; + i);
        }

    }</code></pre>
<p><strong>출력결과</strong></p>
<pre><code class="language-java">Coding Everybody 0
Coding Everybody 1
Coding Everybody 2
Coding Everybody 3
Coding Everybody 4
Coding Everybody 6 //5를 뛰어 넘고 6을 출력한다.
Coding Everybody 7
Coding Everybody 8
Coding Everybody 9</code></pre>
<h1 id="🧡-백준-알고리즘-풀이">🧡 백준 알고리즘 풀이</h1>
<hr>
<p><strong>14681번</strong></p>
<pre><code class="language-java">import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        int X = in.nextInt();
        int Y = in.nextInt();

        if(X &gt; 0) {
            if(Y &gt; 0) {
                System.out.print(1);
            } 
            else {
                System.out.print(4);
            }
        } 

        else {
            if(Y &gt; 0) {
                System.out.print(2);
            } 
            else {
                System.out.print(3);
            }
        }
    }

}</code></pre>
<p><strong>2884번</strong></p>
<pre><code class="language-java">import java.util.Scanner;

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

        Scanner in = new Scanner(System.in);

        int H = in.nextInt(); // 시
        int M = in.nextInt(); // 분
        in.close();

        if(M &lt; 45) {
            H--;        // 시(hour) 1 감소
            M= 60 - (45 - M);     // 분(min) 감소
            if(H &lt; 0) {
                H = 23;
            }
            System.out.println(H + &quot; &quot; + M);
        }
        else {
            System.out.println(H + &quot; &quot; + (M - 45));
        }
    }
}</code></pre>
<p><strong>2525번</strong></p>
<pre><code class="language-java">import java.util.*;

class Main {
      public static void main(String[] args) {
          Scanner sc=new Scanner(System.in);
          int h=sc.nextInt();
          int m=sc.nextInt();
          int value =sc.nextInt();

          m+=value;
          if(m&gt;=60) {
              while(m&gt;=60) {
                  m-=60;
                  h++;
                  if(h&gt;=24) {
                      h=0;
                  }
              }
          }
          System.out.println(h+&quot; &quot;+m);
     }
}</code></pre>
<p><strong>2480번</strong></p>
<pre><code class="language-java">import java.util.*;

public class Main {

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int a = sc.nextInt();
    int b = sc.nextInt();
    int c = sc.nextInt();
    if(a == b &amp;&amp; a == c &amp;&amp; b == c){
        System.out.print(10000+(a*1000));
        }else if(a == b || a == c){
        System.out.print(1000+(a*100));
    }else if(b == c){
        System.out.print(1000+(b*100));
    }else{
        System.out.print((Math.max(a, Math.max(b, c))*100));
        }
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴공선배_22Days 챌린지 3일차]]></title>
            <link>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-3%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-3%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 23 Feb 2022 13:38:55 GMT</pubDate>
            <description><![CDATA[<p><strong>Title</strong></p>
<aside>
💡 연산자 / 조건문 / 반복문 1 + 백준 문제 풀이
</aside>

<h1 id="⏰-연산자">⏰ 연산자</h1>
<hr>
<h3 id="️연산자란-무엇일까">⁉️연산자란 무엇일까?</h3>
<aside>
💡 연산자 = 계산을 하기 위해 사용하는 기호

</aside>

<ul>
<li>간단히 말해 연산자란 연산을 실행는 +, - , * , / 등의 기호를 연산자라고 하며 연산의 대상을 피연산자라고 한다.</li>
</ul>
<p>ex)  x + y </p>
<p>다음에서 연산의 대상이 되는 x와 y는 피연산자, 더하기(+) 는 연산자라고 한다.</p>
<h1 id="🏠-연산자의-종류">🏠 연산자의 종류</h1>
<hr>
<h2 id="✏️-이항-연산자란">✏️ 이항 연산자란?</h2>
<hr>
<ul>
<li><strong>피 연산자가 2개인 연산자를 의미한다.</strong></li>
</ul>
<aside>
💡 이항 연산자 = 피연산자 연산자 피연산자

</aside>

<p>ex) x + y </p>
<p>다음에서 피 연산자는 2개( x와  y), 연산자는 + 이다.</p>
<p>따라서 위와 같은 식은 이항 연산자라고 한다.</p>
<h2 id="✏️-산술-연산자">✏️ 산술 연산자</h2>
<hr>
<aside>
💡 산술 연산자는 수학적인 계산에 사용되는 연산자

</aside>

<table>
<thead>
<tr>
<th>연산자</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td>+</td>
<td>더하기</td>
</tr>
<tr>
<td>-</td>
<td>빼기</td>
</tr>
<tr>
<td>*</td>
<td>곱하기</td>
</tr>
<tr>
<td>/</td>
<td>나누기</td>
</tr>
<tr>
<td>%</td>
<td>나머지</td>
</tr>
</tbody></table>
<pre><code class="language-public">    public static void main(String [] args) {

//산술 연산자 (덧셈)
    int result = 1 +2; //result값은 3
  System.out.println(result);

 //산술 연산자 (뺄셈)
            result = result -1;
    System.out.println(result); //result값은 3 - 1 =2

 //산술 연산자 (곱셈)
         result = result *2;
    System.out.prinltn(result);  //result값은 2 * 2 = 4

//산술 연산자 (나누기)
    result = result / 2;
    System.out.prinltn(result); //result 값은 4 / 2 = 2

//산술 연산자 (나머지)
   result = result + 8; //result 값은 10
     result = result % 7; //result 값을 7로 나누기
    System.out.println(result); //result값은 10 % 7 =3 
    }
}</code></pre>
<p>💡 연산자는 숫자와 숫자를 더할 때 사용되지만, 문자열과 문자열을 결합할 때도 사용된다.</p>
<pre><code>public class Main {
    public static viod main(String [] args) {
        String firstStiring = &quot; This is&quot;;
        String secondString = &quot; java programming&quot;;
        String thirdString = firstString + secondString;
        System.out.println(thirdString);

    }
}</code></pre><p>출력 값</p>
<p>💡 This is java programming</p>
<p>✏️ 단항 연산자란?</p>
<hr>
<ul>
<li>피 연산자가 1개인 연산자를 의미한다.</li>
</ul>
<p>💡 단항 연산자 = 연산자 피연산자 혹은 피연산자 연산자</p>
<p>ex) +1, -1, 1 ++, 1—**</p>
<p>| 연산자 | 의미 |</p>
<ul>
<li>: 양수를 표현한다.(대개 생략한다) <ul>
<li>: 음수를 의미한다 </li>
<li><ul>
<li>: 증가 연산자, 값을 1씩 증가한다. 
— : 감소 연산자 </li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>public class Main {
    public static viod main(String [] args) {
        int i = 3;
            //단항 연산자 (증가 연산자) 
       i++; //1을 증가한다.
        System.out.println(i); // 4 출력
            //단항 연산자 (증가 연산자) 
        ++i;
        System.out.println(i); // 5 출력

    }
}</code></pre><p>자료 출처: <a href="https://www.opentutorials.org/course/1223/5331">https://www.opentutorials.org/course/1223/5331</a></p>
<h2 id="✏️-다양한-연산자의-종류">✏️ 다양한 연산자의 종류</h2>
<hr>
<p>위의 예를 제외하고 연산자에는 수 많은 종류가 존재한다.</p>
<p>💡 각 연산자의 종류는 외우는 것이 아니라 하나하나 타자를 치면서 해당 기능을 배우면 된다!</p>
<p><img src="https://images.velog.io/images/jay_so_/post/f85507f2-548e-48ea-89d5-ff34d7055be5/%EC%97%B0%EC%82%B0%EC%9E%90%20%EC%B5%9C%EC%A2%85.png" alt=""></p>
<h2 id="✏️-연산자의-우선순위">✏️ 연산자의 우선순위</h2>
<hr>
<p>💡 연산자의 우선순위는 전혀 외울 필요가 없다!!!  그냥 수학 공식에서 1순위: 괄호가 처진 수는 먼저 계산한다, 곱셈, 나누기가 덧셈, 뺄셈보다 먼저 실행된다! 이렇게만 간단히 확인만 하고 넘어가면 된다!!</p>
<p>우선순위와 결합방향은 외우는 것이 아니다!!</p>
<table>
<thead>
<tr>
<th>우선순위</th>
<th>연산자</th>
<th>결합방향</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>[ ]</td>
<td>→</td>
</tr>
<tr>
<td></td>
<td>()</td>
<td></td>
</tr>
<tr>
<td></td>
<td>.</td>
<td></td>
</tr>
<tr>
<td>2</td>
<td>++</td>
<td>←</td>
</tr>
<tr>
<td></td>
<td>--</td>
<td></td>
</tr>
<tr>
<td></td>
<td>+(양수) -(음수)</td>
<td></td>
</tr>
<tr>
<td></td>
<td>~</td>
<td></td>
</tr>
<tr>
<td></td>
<td>!</td>
<td></td>
</tr>
<tr>
<td></td>
<td>(type)</td>
<td></td>
</tr>
<tr>
<td></td>
<td>new</td>
<td></td>
</tr>
<tr>
<td>3</td>
<td>* / %</td>
<td>→</td>
</tr>
<tr>
<td>4</td>
<td>+(더하기) -(빼기)</td>
<td>→</td>
</tr>
<tr>
<td></td>
<td>+(문자 결합 연산자)</td>
<td></td>
</tr>
<tr>
<td>5</td>
<td>&lt;&lt;</td>
<td>→</td>
</tr>
<tr>
<td></td>
<td>&gt;&gt;</td>
<td></td>
</tr>
<tr>
<td></td>
<td>&gt;&gt;&gt;</td>
<td></td>
</tr>
<tr>
<td>6</td>
<td>&lt; &lt;=</td>
<td>→</td>
</tr>
<tr>
<td></td>
<td>&gt; &gt;=</td>
<td></td>
</tr>
<tr>
<td></td>
<td>instanceof</td>
<td></td>
</tr>
<tr>
<td>7</td>
<td>==</td>
<td>→</td>
</tr>
<tr>
<td></td>
<td>!=</td>
<td></td>
</tr>
<tr>
<td>8</td>
<td>&amp;</td>
<td>→</td>
</tr>
<tr>
<td></td>
<td>&amp;</td>
<td></td>
</tr>
<tr>
<td>9</td>
<td>^</td>
<td>→</td>
</tr>
<tr>
<td></td>
<td>^</td>
<td></td>
</tr>
<tr>
<td>10</td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>11</td>
<td>&amp;&amp;</td>
<td>→</td>
</tr>
<tr>
<td>12</td>
<td></td>
<td></td>
</tr>
<tr>
<td>13</td>
<td>? :</td>
<td>←</td>
</tr>
<tr>
<td>14</td>
<td>=</td>
<td>←</td>
</tr>
<tr>
<td></td>
<td>*= /= += -= %=&lt;&lt;= &gt;&gt;= &gt;&gt;&gt;=&amp;= ^=</td>
<td>=</td>
</tr>
</tbody></table>
<h1 id="🏠-조건문">🏠 조건문</h1>
<hr>
<h2 id="✏️-조건문이란">✏️ 조건문이란?</h2>
<hr>
<aside>
💡 조건문이란 설정된 조건에 맞으면 실행되도록 하는 명령문이다.

</aside>

<h3 id="✏️-if문">✏️ if문</h3>
<hr>
<p> <img src="https://images.velog.io/images/jay_so_/post/82f78c5e-4e01-41bd-ad4f-4d9bc8606a2b/if%EB%AC%B8.png" alt=""></p>
<aside>
💡 조건문 if문이란 주어진 조건(괄호) 안에 있는 값이 참(true)일 때 실행되도록 하는 명령문이다.

</aside>

<aside>
💡 “만약 ~가 맞다면 then절을(행동)을 해라” 라는 의미이다.

</aside>

<pre><code class="language-java">public class Main{
    public static void main(String[] args){
        if(true) { //참이라면
            System.out.println(1); //1을 출력해라
      System.out.println(2); //2을 출력해라
      System.out.println(3); //3을 출력해라
      System.out.println(4); //4을 출력해라    }
    }
}</code></pre>
<ul>
<li><strong>다음과 같은 결과가 출력된다</strong></li>
</ul>
<p>출력문</p>
<pre><code class="language-java">1
2
3
4</code></pre>
<h2 id="✏️-else문-else-if-문">✏️ else문, else if 문</h2>
<hr>
<h3 id="⏰else문">⏰else문</h3>
<hr>
<p><img src="https://images.velog.io/images/jay_so_/post/1ec861ab-9af0-48d3-a56a-9f0b4f9daa20/else%EB%AC%B8.png" alt=""></p>
<aside>
💡 “만약 ~가 아니라면 else절을 실행해라” 라는 의미이다.

</aside>

<pre><code>public class Main{
    public static void main(String[] args){
        if(true) { //참이라면
            System.out.println(1); //1을 출력해라
            }else{   //거짓이라면
            System.out.println(2); //2을 출력해라
        }
    }
}</code></pre><h3 id="⏰else-if문">⏰else if문</h3>
<hr>
<p><img src="https://images.velog.io/images/jay_so_/post/e3c50c25-2ba7-4232-868a-d24192895e4a/else%20if%20%EB%AC%B8.png" alt=""></p>
<aside>
💡 “만약 ~가 아니라 ~라면 else if절을 실행해라, 그것도 아니면 else문을 실행하라” 라는 의미이다.

</aside>

<pre><code class="language-java">public class Main{
    public static void main(String[] args){

        int a = 2;

        if(a == 1) { //a가 1이라면
            System.out.println(1); //1을 출력해라

        else if (a == 2){// a가 1이 아닌 2 라면
            System.out.println(2); //2을 출력해

            }else{   //a가 1,2도 아니면 라면
            System.out.println(3); //3을 출력해라
        }
    }
}</code></pre>
<h2 id="✏️-switch문">✏️ Switch문</h2>
<hr>
<aside>
💡 Switch문은 조건이 많을 때 수 많은 if문을 사용하기 보다 효율적으로 실행하기 위해 사용하는 조건문이다.

</aside>

<p><strong>형식</strong></p>
<pre><code class="language-java">switch(입력변수) {
    case 입력값1: // 변수 값이 1이라면
                    ....
         break; //실행 후 Switch문 실행 종료
    case 입력값2: // 변수 값이 2이라면
                    ....
         break; //실행 후 Switch문 실행 종료
    default:  //모든 조건에 해당하지 않다면 
                    ...
         break;  //실행 후 Switch문 실행 종료
}</code></pre>
<p><strong>예시</strong></p>
<pre><code class="language-java">public class Sample {
    public static void main(String[] args) {
        int month = 8; //8월달이라면 
        String monthString = &quot;&quot;;
        switch (month) {
            case 1:  monthString = &quot;January&quot;;
                     break;
            case 2:  monthString = &quot;February&quot;;
                     break;
            case 3:  monthString = &quot;March&quot;;
                     break;
            case 4:  monthString = &quot;April&quot;;
                     break;
            case 5:  monthString = &quot;May&quot;;
                     break;
            case 6:  monthString = &quot;June&quot;;
                     break;
            case 7:  monthString = &quot;July&quot;;
                     break;
            case 8:  monthString = &quot;August&quot;;
                     break;
            case 9:  monthString = &quot;September&quot;;
                     break;
            case 10: monthString = &quot;October&quot;;
                     break;
            case 11: monthString = &quot;November&quot;;
                     break;
            case 12: monthString = &quot;December&quot;;
                     break;
            default: monthString = &quot;Invalid month&quot;;
                     break;
        }
        System.out.println(monthString); //8월달인 August출력
    }
}</code></pre>
<p><strong>출력문</strong></p>
<aside>
💡  August

</aside>

<p>참고 자료 : <a href="https://wikidocs.net/263">https://wikidocs.net/263</a></p>
<h1 id="🏠-반복문">🏠 반복문</h1>
<hr>
<h2 id="✏️-반복문이란">✏️ 반복문이란?</h2>
<hr>
<aside>
💡 반복문이란 설정된 조건에 맞으면 실행되도록 하는 명령문이다.

</aside>

<aside>
💡 “만약 ~라면 게속 ~해라”라는 의미이다.

</aside>

<h2 id="✏️-while문">✏️ While문</h2>
<hr>
<pre><code class="language-java">while(조건){    //만약 조건이라면 게속 ~해라
    반복 실행 영역
}</code></pre>
<pre><code class="language-java">public class main{
        public static void main(String[] args){
        int treeHit = 0;

        while (treeHit &lt; 10) {   //1~9번까지 게속해라
        treeHit++;
    System.out.println(&quot;나무를  &quot; + treeHit + &quot;번 찍었습니다.&quot;);

            if (treeHit == 10) { //10이라면 
        System.out.println(&quot;나무 넘어갑니다.&quot;);
    }
    }
}</code></pre>
<p><strong>출력 결과:</strong> </p>
<pre><code class="language-java">나무를  1번 찍었습니다.
나무를  2번 찍었습니다.
나무를  3번 찍었습니다.
나무를  4번 찍었습니다.
나무를  5번 찍었습니다.
나무를  6번 찍었습니다.
나무를  7번 찍었습니다.
나무를  8번 찍었습니다.
나무를  9번 찍었습니다.
나무를  10번 찍었습니다.
나무 넘어갑니다.</code></pre>
<h1 id="⏰-백준-문제-풀이">⏰ 백준 문제 풀이</h1>
<hr>
<p><strong>1000번</strong></p>
<pre><code class="language-java">import java.util.Scanner;
public class Main {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int A = in.nextInt();
        int B = in.nextInt();

        System.out.println(A+B);

        in.close();
    }
}</code></pre>
<p><strong>1001번</strong></p>
<pre><code class="language-java">import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int A = in.nextInt();
        int B = in.nextInt();

        System.out.println(A-B);

        in.close();
    }
}</code></pre>
<p><strong>10998번</strong></p>
<pre><code class="language-java">import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int A = in.nextInt();
        int B = in.nextInt();

        System.out.println(A*B);

        in.close();
    }
}</code></pre>
<p><strong>1008번</strong></p>
<pre><code class="language-java">import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner in=new Scanner(System.in);

        double a=in.nextDouble();
        double b=in.nextDouble();

        in.close();
        System.out.print(a/b);

    }
}</code></pre>
<p><strong>10869번</strong></p>
<pre><code class="language-java">import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        sc.close();

        System.out.println(a + b);
        System.out.println(a - b);
        System.out.println(a * b);
        System.out.println(a / b);
        System.out.println(a % b);
    }
}</code></pre>
<p><strong>10926번</strong></p>
<pre><code class="language-java">import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(str+&quot;??!&quot;);
    }
}</code></pre>
<p><strong>18108번</strong></p>
<pre><code class="language-java">import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.print(n-543);
    }
}</code></pre>
<p><strong>10430번</strong></p>
<pre><code class="language-java">import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int A = in.nextInt();
        int B = in.nextInt();
        int C = in.nextInt();

        in.close();

        System.out.println( (A+B)%C );
        System.out.println( (A%C + B%C)%C );
        System.out.println( (A*B)%C );
        System.out.println( (A%C * B%C)%C );

    }

}</code></pre>
<p><strong>2588번</strong></p>
<pre><code class="language-java">import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int A = in.nextInt();
        String B = in.next();

        in.close();

        System.out.println(A * (B.charAt(2) - &#39;0&#39;));
        System.out.println(A * (B.charAt(1) - &#39;0&#39;));
        System.out.println(A * (B.charAt(0) - &#39;0&#39;));
        System.out.println(A * Integer.parseInt(B));

    }
}</code></pre>
<p><strong>1330번</strong></p>
<pre><code class="language-java">import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int A = in.nextInt();
        int B = in.nextInt();

        in.close();

        if(A&gt;B) System.out.println(&quot;&gt;&quot;);
        else if(A&lt;B) System.out.println(&quot;&lt;&quot;);
        else System.out.println(&quot;==&quot;);

    }
}</code></pre>
<p><strong>9498번</strong></p>
<pre><code class="language-java">import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int A = in.nextInt();
        in.close();

        if(A&gt;=90) System.out.println(&quot;A&quot;);
        else if(A&gt;=80) System.out.println(&quot;B&quot;);
        else if (A&gt;=70) System.out.println(&quot;C&quot;);
        else if(A&gt;=60) System.out.println(&quot;D&quot;);
        else System.out.println(&quot;F&quot;);
    }
}</code></pre>
<p><strong>2753번</strong></p>
<p>```java
import java.util.Scanner;</p>
<p>public class Main {</p>
<pre><code>public static void main(String[] args) {
    Scanner in = new Scanner(System.in);

    int y = in.nextInt();
    in.close();

    if(y%4==0) {
        if(y%400==0) System.out.println(&quot;1&quot;);
        else if(y%100==0) System.out.println(&quot;0&quot;);
        else System.out.println(&quot;1&quot;);
    }
    else System.out.println(&quot;0&quot;);
}</code></pre><p>}</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴공선배_22Days 챌린지 2일차]]></title>
            <link>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-2%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-2%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 22 Feb 2022 14:17:13 GMT</pubDate>
            <description><![CDATA[<p><strong>Title</strong></p>
<aside>
💡 변수 / 상수 / 자료형 / 특수문자 + 백준 문제 풀이

</aside>

<h1 id="❤️🔥변수">❤️‍🔥변수</h1>
<hr>
<aside>
💡 변수(Variable)이란 (숫자나 문자와 같은) 데이터를 담는 상자이다, 값이 변한다.

</aside>

<p><img src="https://images.velog.io/images/jay_so_/post/0efc7509-52c8-4689-b421-41c78730d007/%EB%B3%80%EC%88%98.png" alt=""></p>
<ul>
<li><strong>변수에 있는 값(데이터) 다른 값(데이터)로 변경할 수 있다.</strong></li>
</ul>
<p>다음 아래와 같이 값을 변경할 수 있다.</p>
<p><strong>ex)</strong></p>
<p><strong>(변경전)</strong>  eggs의 15 → <strong>(변경 후)</strong> 20</p>
<p><strong>(변경전)</strong>  fizz의 10 → <strong>(변경 후 )</strong> 10</p>
<aside>
💡 결론적으로 변수는 “데이터를 담는 상자이며 이 상자에 넣는 값(데이터) 우리가 원할때 마다 변경할 수 있다.

</aside>

<p><strong>다음을 통해 변수의 선언, 변수의 필요성에 대하여 살펴 보자!</strong></p>
<h2 id="️-변수는-왜-필요할까">⁉️ 변수는 왜 필요할까?</h2>
<hr>
<p><strong>출력1</strong></p>
<pre><code class="language-java">System.out.println(100 + 10); //출력값 = 110
System.out.println((100 + 10) / 10); // 출력값 = 11
System.out.println(((100 + 10) / 10) - 10); //출력값 = 1
System.out.println((((100 + 10) / 10) - 10) * 10); //출력값 = 10</code></pre>
<p><strong>출력2</strong></p>
<pre><code class="language-java">int a = 100;
System.out.println(a + 10); //출력값 = 110
System.out.println((a+ 10) / 10); // 출력값 = 11
System.out.println(((a + 10) / 10) - 10); //출력값 = 1
System.out.println((((a + 10) / 10) - 10) * 10); //출력값 = 10</code></pre>
<aside>
💡 결론부터 말하자면 다음의 두개의 코드는 모두 동일한 값을 출력한다.

</aside>

<h3 id="❓만약-100을-모두-90으로-변경해야-한다면">❓만약 100을 모두 90으로 변경해야 한다면?</h3>
<p><strong>출력1의 경우</strong></p>
<ul>
<li>모든 100을 90으로 변경해야 한다.</li>
</ul>
<p>ex) 모든 100을 90으로 변경</p>
<p><strong>출력2의 경우</strong></p>
<ul>
<li>변수a라고 선언된 값을 90으로 변경하면 된다.</li>
</ul>
<p>ex) <strong>(변경 전)</strong>int a = 100 ⇒ <strong>(변경 후)</strong>int a = 90</p>
<p><strong>이로 인해 우리는 변수를 사용하면 우리가 원하는 데이터 값이 변할 때마다</strong></p>
<p><strong>손쉽게 변경하여 사용할 수 있다.</strong></p>
<aside>
💡 결론:변수는 우리가 원하는 값을 쉽게 넣고 변경할 수 있어 코드의 재활용을 높혀준다.

</aside>

<p>참고 자료: <a href="https://opentutorials.org/course/1223/5293">https://opentutorials.org/course/1223/5293</a></p>
<h2 id="️-변수의-선언">⁉️ 변수의 선언</h2>
<hr>
<ul>
<li><strong>변수 선언은 2가지 방법이 있는데 다음과 같다.</strong></li>
</ul>
<aside>
💡 1. 변수를 생성한 후 값을 넣는 방법(변수를 선언한 후 값을 할당)    <br> 
  </aside>
  <aside>
    💡 2. 변수의 생성과 같이 값을 넣는 방법 (선언과 동시에 값을 할당)

</aside>

<pre><code class="language-java">//case 1)
int a; //변수 a를 생성한다.
a = 1;  // 변수 a에 1이라는 값을 넣는다.
System.out.println(a+1); // 출력값: 2

//case 2) 
int b = 2; //변수 b를생성하고 2라는 값을 넣는다.
System.out.println(b+1); // 출력값: 3</code></pre>
<h3 id="⏰변수를-생성한-후-값을-넣는-방법변수를-선언한-후-값을-할당">⏰변수를 생성한 후 값을 넣는 방법<strong>(변수를 선언한 후 값을 할당)</strong></h3>
<hr>
<p><strong>case1의 과정이다.</strong></p>
<ol>
<li>먼저 변수 a라는 값을 선언한다.</li>
<li>변수 a에 1이라는 값을 넣는다.</li>
</ol>
<h3 id="⏰변수를-생성과-같이-값을-넣는-방법--선언과-동시에-값을-할당">⏰변수를 생성과 같이 값을 넣는 방법  <strong>(선언과 동시에 값을 할당)</strong></h3>
<hr>
<p><strong>case2과정이다. (보통 변수의 초기화라고 부른다.)</strong></p>
<ol>
<li>변수 b를 생성하면서 값을 2로 지정한다.</li>
</ol>
<h3 id="🏠-변수-선언을-뜯어보자-변수-선언은-어떻게-구성되어-있을까">🏠 변수 선언을 뜯어보자, 변수 선언은 어떻게 구성되어 있을까?</h3>
<hr>
<ul>
<li>변수의 선언은 다음과 같이 되어 있다.</li>
</ul>
<p><img src="https://images.velog.io/images/jay_so_/post/fc87bdfe-64be-4372-ad7d-b108aae13561/%EB%B3%80%EC%88%98%EB%AA%85.png" alt=""></p>
<h3 id="1-자료형">1. 자료형</h3>
<aside>
💡 변수 값의 종류에 따라 자료형이 달라진다.

</aside>

<h3 id="2-변수명">2. 변수명</h3>
<aside>
💡 선언된 변수의 이름이다.

</aside>

<h3 id="3-변수값">3. 변수값</h3>
<aside>
💡 변수에 넣을 값을 의미한다.

</aside>

<h1 id="❤️🔥자료형데이터-타입">❤️‍🔥자료형(데이터 타입)</h1>
<hr>
<aside>
💡 JAVA의 변수는 데이터 타입마다 달라지며 엄격하게 자료형(데이터 타입)을 구분한다!

</aside>

<h2 id="자바의-변수의-잘못된-변수에-따른-실행-오류">자바의 변수의 잘못된 변수에 따른 실행 오류</h2>
<p>다음은 자바의 데이터 타입의 잘못된 구분에 따른 실행 오류의 예시를 보여준다.</p>
<p> 문자와 문자열을 구분하지 못한 경우, 정수와 상수를 구분하지 못한</p>
<p><strong>case1) “문자열”과 “문자”를 구분하지 못한 경우</strong></p>
<pre><code class="language-java">//정상 출력
System.out.println(&quot;코딩선배&quot;); //출력 가능, 출력값: 코딩 선배
System.out.println(&#39;코&#39;); // 출력 가능, 출력값: 코

//오류
System.out.println(&#39;코딩선배&#39;); //출력 불가능, 오류 발생

//정상 출력
System.out.println(&quot;생&quot;); //출력 가능, 출력값: 코</code></pre>
<aside>
💡 자바에서의 문자는 한 문자를 의미하며 데이터 타입은 char으로 정의, 출력할때는 작은 따옴표( ‘     ‘ )를이용한다.

</aside>

<aside>
💡 자바에서의 문자열은 여러개의 문자가 결합한 것을 의미하며 데이터 타입은 String으로 정의, 출력할때는 (”    “)을 이용한다.

</aside>

<p>마지막 예시에서 다음과 같은 궁금점이 들 것이다.</p>
<p>❓ <strong>문자열은 마지막 예시 처럼 (“   “)출력이 되는데?</strong> </p>
<aside>
💡 자바의 문자열은 한 문자라도 (”   “)으로 출력되거나 String으로 선언되면 문자열로 인식하여 내부에서 처리한다!!

</aside>

<p><strong>case2) “정수”과 “실수”를 구분하지 못한 경우</strong></p>
<pre><code class="language-java">//정상 출력
int a = 1; //정수 값
System.out.println(a); //출력 가능, 출력 값: 1

//오류
int b = 2.5;
System.out.prinltn(b); //출력 불가능

//정상 출력
double c = 3.5; //실수 값
System.out.println(c); //출력 가능, 출력 값:3.5</code></pre>
<aside>
💡 자바에서의 정수는 byte,short,int,long형으로 구분되며 이에 맞는 자료형을 사용해야 한다.

</aside>

<h2 id="정수와-실수란">정수와 실수란?</h2>
<aside>
💡 정수 = - 3, -2, -1, 0, 1 ,2 ,3 처럼 소수점이 없는 수

</aside>

<aside>
💡 실수= -1, -0.1 ,0, 0.1, 0.01, ....., 1 처럼 소수점이 있는 수

</aside>

<ul>
<li>다음의 사진처럼 <strong>정수보다 실수가 더 큰 개념이다!!</strong></li>
</ul>
<p><img src="https://images.velog.io/images/jay_so_/post/1a9ea310-1bce-4163-a6eb-a633ef999fa0/%EC%A0%95%EC%88%98%EC%99%80%20%EC%8B%A4%EC%88%98.png" alt=""></p>
<p>참고 자료: <a href="https://mathbang.net/258">https://mathbang.net/258</a></p>
<aside>
💡 자바에서의 자료형(데이터 타입)은 다음과 같이 구분된다!

</aside>

<p><strong>정수형</strong></p>
<table>
<thead>
<tr>
<th>타입</th>
<th>내용</th>
<th>표현 범위</th>
</tr>
</thead>
<tbody><tr>
<td>byte</td>
<td>1byte</td>
<td>-128 ~ 127</td>
</tr>
<tr>
<td>short</td>
<td>2byte</td>
<td>-32,768 ~ 32,767</td>
</tr>
<tr>
<td>int (기본)</td>
<td>4byte</td>
<td>-2,147,483,648~2,147,483,647</td>
</tr>
<tr>
<td>long</td>
<td>8byte</td>
<td>-9,223,372,036,854,775,808 ~  9,223,372,036,854,775,807</td>
</tr>
</tbody></table>
<p><strong>실수형</strong></p>
<table>
<thead>
<tr>
<th>타입</th>
<th>내용</th>
<th>표현 범위</th>
</tr>
</thead>
<tbody><tr>
<td>float</td>
<td>4byte</td>
<td>±(1.40129846432481707e-45 ~ 3.40282346638528860e+38)</td>
</tr>
<tr>
<td>double (기본)</td>
<td>8byte</td>
<td>±(4.94065645841246544e-324d ~ 1.79769313486231570e+308d)</td>
</tr>
</tbody></table>
<p><strong>문자형(한 글자, 출력형태(’     ‘))</strong></p>
<table>
<thead>
<tr>
<th>타입</th>
<th>내용</th>
<th>표현 범위</th>
</tr>
</thead>
<tbody><tr>
<td>char</td>
<td>2byte</td>
<td>모든 유니코드 문자</td>
</tr>
</tbody></table>
<p><strong>문자열(여러 글자, 출력형태 (”   “ ) )</strong></p>
<table>
<thead>
<tr>
<th>타입</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td>string</td>
<td>12byte</td>
</tr>
</tbody></table>
<p><strong>논리형(true 또는 false 값)</strong></p>
<ul>
<li>참, 거짓의 값을 갖는 자료형</li>
<li>대입되는 값은 참(true) 또는 거짓(false)만 가능하다.</li>
</ul>
<table>
<thead>
<tr>
<th>타입</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td>boolean</td>
<td>1byte</td>
</tr>
</tbody></table>
<pre><code class="language-java">boolean boolean2 = false; 
boolean boolean3 = true;</code></pre>
<p>참고 자료: <a href="https://stanleykou.tistory.com/entry/Java-%EA%B8%B0%EB%B3%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85">https://stanleykou.tistory.com/entry/Java-기본-데이터-타입</a></p>
<h1 id="❤️🔥변수명변수-이름">❤️‍🔥변수명(변수 이름)</h1>
<hr>
<ul>
<li>변수를 작성할때에는 일정한 규칙이 존재한다.</li>
</ul>
<h3 id="💓-1-변수의-이름은-대소문자를-구분한다">💓 1. 변수의 이름은 대소문자를 구분한다.</h3>
<hr>
<p>다음의 예시를 살펴보자</p>
<pre><code class="language-java">int a = 10;
System.out.println(a); //출력 값 = 10

int A = 20;
System.out.println(A); //출력 값 = 20</code></pre>
<ul>
<li>int a와 int A는 서로 다른 변수로 인식된다.</li>
</ul>
<h3 id="💓-2-변수의-이름은-_언더바와--문자-이외의-특수-문자는-사용할-수-없다">💓 2. 변수의 이름은 _(언더바)와 $ 문자 이외의 특수 문자는 사용할 수 없다.</h3>
<hr>
<h3 id="💓-3-자바의-키워드는-변수명으로-사용할-수-없다">💓 3. 자바의 키워드는 변수명으로 사용할 수 없다.</h3>
<hr>
<aside>
💡 키워드 = 자바에서 특정 목적으로 사용하기 위해 정의한 예약어 이며 소문자로 되어 있다.

</aside>

<ul>
<li>다음과 같은 글자는 키워드로 정의되어 있다.</li>
</ul>
<blockquote>
<p>abstract  continue  for         new        switch
assert    default   goto        package    synchronized
boolean   do        if          private    this
break     double    implements  protected  throw
byte      else      import      public     throws
case      enum      instanceof  return     transient
catch     extends   int         short      try
char      final     interface   static     void
class     finally   long        strictfp   volatile
const     float     native      super      while</p>
</blockquote>
<p>참고 자료: <a href="https://wikidocs.net/277">https://wikidocs.net/277</a></p>
<h1 id="❤️🔥변수값">❤️‍🔥변수값</h1>
<hr>
<aside>
💡 선언된 변수에 넣을 값을 의미한다.

</aside>

<pre><code class="language-java"> int number = 30; //변수 number에 넣을 값인 30이 변수값을 의미한다.</code></pre>
<h1 id="❤️🔥상수">❤️‍🔥상수</h1>
<hr>
<aside>
💡 상수란 항상 같은 수, 변하지 않는 수를 의미한다. 변수랑 정 반대의 개념이다!

</aside>

<ul>
<li>다음의 그림을 살펴보자</li>
<li>다음은 수학 공식의 변수, 상수의 개념이다.</li>
</ul>
<p><img src="https://images.velog.io/images/jay_so_/post/b5ec648f-3c9c-45d3-9a93-1e986873489c/%EC%83%81%EC%88%981.png" alt=""></p>
<aside>
💡 변수 = ”데이터를 넣는 상자이자 변하는 값”을 의미한다

</aside>

<aside>
💡 상수 =  “변하지 않는 수”를 의미한다. **(변수의 반대 개념)

</aside>

<ul>
<li>예시</li>
</ul>
<aside>
💡 자바의 변수 앞에 “final”이라는 키워드와 함께 사용한다.(선언과 동시에 값을 할당한다(초기화 한다))

</aside>

<pre><code class="language-java">final int f_num = 100; // 선언과 동시에 초기화
final int f_num;
f_num = 50; // 선언 후 초기화는 할 수 없다.</code></pre>
<h2 id="️-상수의-특징">⁉️ 상수의 특징</h2>
<hr>
<aside>
💡 상수는 선언 이후에 값을 변경할 수 없으므로 선언과 동시에 초기화를 해야 한다.

</aside>

<p>참고자료: <a href="https://velog.io/@jahommer/%EB%B3%80%EC%88%98%EC%83%81%EC%88%98">https://velog.io/@jahommer/변수상수</a></p>
<h2 id="️-상수를-왜-사용할까">⁉️ 상수를 왜 사용할까?</h2>
<hr>
<aside>
💡  상수는 선언 이후에 값을 변경할 수 없으므로 코드에서 중요한 값 (ex. ip값 등)을 사용할 때 선언 이후에 변경하지 못하게 함으로써 유지보수에 편함                                                           - 만약 ip값 등의 변경이 있을 경우 선언부에서 변경하면됨

</aside>

<h1 id="❤️🔥특수문자이스케이프">❤️‍🔥특수문자(이스케이프)</h1>
<hr>
<aside>
💡 만약 문자열 안에 큰 따옴표를 넣고 싶다면 어떻게 해야 할까?

</aside>

<pre><code class="language-java">//오류
System.out.println(&quot;egoing said &quot;Welcome programming world&quot;&quot;); //출력 오류

//정상 출력
System.out.println(&quot;egoing said \&quot;Welcome programming world\&quot;&quot;); //정상 출력</code></pre>
<p>❓<strong>왜 백슬레시()를 넣으면 정상 출력이 될까?</strong></p>
<hr>
<aside>
💡 자바에서 백슬래시(\)와 따옴표는 문자 출력되지 않는 특수 문자이기에 출력되지 않는다.

</aside>

<ul>
<li>따라서 백슬레시를 앞에 넣어 문자로 해석하도록 해야 한다!</li>
</ul>
<p>특수문자의 입출력을 정리해보자!</p>
<p><strong>&lt;특수문자 입출력표&gt;</strong></p>
<table>
<thead>
<tr>
<th>입력</th>
<th>출력</th>
</tr>
</thead>
<tbody><tr>
<td>\</td>
<td>에러</td>
</tr>
<tr>
<td>\</td>
<td>\</td>
</tr>
<tr>
<td>\’</td>
<td>‘</td>
</tr>
<tr>
<td>\”</td>
<td>“</td>
</tr>
<tr>
<td>(</td>
<td>(</td>
</tr>
<tr>
<td>(</td>
<td>에러</td>
</tr>
<tr>
<td>/</td>
<td>/</td>
</tr>
<tr>
<td>/</td>
<td>에러</td>
</tr>
<tr>
<td>- 주의 : 괄호나 일반 슬래시는 \를 붙이지 않아도 된다.</td>
<td></td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th>입력</th>
<th>출력</th>
</tr>
</thead>
<tbody><tr>
<td>\n</td>
<td>줄바꿈</td>
</tr>
<tr>
<td>\r</td>
<td>줄의 맨 처음으로</td>
</tr>
<tr>
<td>\t</td>
<td>탭</td>
</tr>
<tr>
<td>\b</td>
<td>커서를 한 문자 앞으로(백 스페이스</td>
</tr>
<tr>
<td>\0</td>
<td>빈칸 (null)</td>
</tr>
</tbody></table>
<h1 id="❤️🔥백준-알고리즘-문제-풀이">❤️‍🔥백준 알고리즘 문제 풀이</h1>
<hr>
<p><strong>2월 22일 문제 제출</strong></p>
<p><img src="https://images.velog.io/images/jay_so_/post/89a92c63-7fa3-41a6-9030-48d66d6475b0/%EB%B0%B1%EC%A4%80%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%ED%91%BC%20%EB%AC%B8%EC%A0%9C.png" alt=""></p>
<p><strong>문제 풀이</strong></p>
<p><strong>2557번</strong></p>
<pre><code class="language-java">public class Main{
    public static void main(String [] args){
        System.out.println(&quot;Hello World!&quot;);
    }
}</code></pre>
<p><strong>10718번</strong></p>
<pre><code class="language-java">public class Main{
    public static void main(String [] args){
        System.out.println(&quot;강한친구 대한육군&quot;);
        System.out.println(&quot;강한친구 대한육군&quot;);
    }
}</code></pre>
<p><strong>10171번</strong></p>
<pre><code class="language-java">public class Main {
    public static void main(String[] args) {

        System.out.println(&quot;\\    /\\&quot;);
        System.out.println(&quot; )  ( &#39;)&quot;);
        System.out.println(&quot;(  /  )&quot;);
        System.out.println(&quot; \\(__)|&quot;);    

    }
}</code></pre>
<p><strong>10172번</strong></p>
<pre><code class="language-java">public class Main {

    public static void main(String[] args) {
        System.out.println(&quot;|\\_/|&quot;);
        System.out.println(&quot;|q p|   /}&quot;);
        System.out.println(&quot;( 0 )\&quot;\&quot;\&quot;\\&quot;);
        System.out.println(&quot;|\&quot;^\&quot;`    |&quot;);
        System.out.println(&quot;||_/=\\\\__|&quot;);
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴공선배_22Days 챌린지 1일차]]></title>
            <link>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-1%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@jay_so_/%EC%BB%B4%EA%B3%B5%EC%84%A0%EB%B0%B022Days-%EC%B1%8C%EB%A6%B0%EC%A7%80-1%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 21 Feb 2022 14:03:52 GMT</pubDate>
            <description><![CDATA[<h1 id="2월-21일-challenge-task-list">2월 21일 Challenge Task List</h1>
<p><strong>Title</strong></p>
<strong>
💡 JAVA의 언어적 특성을 찾아보고 정리하기

</strong>

<p><img src="https://images.velog.io/images/jay_so_/post/40308eb1-50cd-4d87-8e0d-b870675ac2ad/java%20%ED%91%9C%EC%A7%80.png" alt=""></p>
<h1 id="✏️---java-언어의-특성">✏️   Java 언어의 특성</h1>
<h2 id="1-이식성이-높은-언어">1. 이식성이 높은 언<strong>어</strong></h2>
<hr>
<aside>
💡 Java는 JVM을 이용하여 서로 다른 운영체제 및 실행 환경에서도 프로그램을 옮겨서 실행할 수 있음

</aside>

<ul>
<li><strong>JVM = 자바 가상 머신</strong></li>
</ul>
<h3 id="️-jvm이-뭐길래-서로-다른-운영체제에서도-돌릴-수-있을까">⁉️ <strong>JVM이 뭐길래 서로 다른 운영체제에서도 돌릴 수 있을까?</strong></h3>
<ul>
<li>먼저 자바의 실행 과정을 이해하면 서로 다른 운영체제에서 왜 돌릴 수 있는지 이해할 수 있다.</li>
</ul>
<h3 id="✏️3-자바의-실행-과정">✏️3. 자바의 실행 과정</h3>
<h2 id="컴파일">컴파일</h2>
<aside>
💡 자바의 Javac, 컴퓨터가 이해할 수 있는 코드로 변환하는 과정                                                          컴파일을 하고 나면 실행할 수 있는 파일인 “~.class(바이트 코드)”가 생성된다.

</aside>

<ul>
<li>바이트 코드 = 컴퓨터가 이해할 수 있는 2진수(0과 1)</li>
</ul>
<h2 id="실행">실행</h2>
<aside>
💡 자바의 java, 컴파일된 파일을 실행할 수 있는 런처(lanuncher)를 이용하여 실행하여야 한다. <br>  
  <p>런처는 “~.class”파일을 실행하도록 하며 최종적으로 JVM을 통해 동작하게 된다.</p>

</aside>

<p><img src="https://images.velog.io/images/jay_so_/post/0b93b6b4-5ac1-471a-aa4e-83cd6cee38b2/java%20%EC%9E%91%EB%8F%99%20%EA%B3%BC%EC%A0%95.png" alt=""></p>
<p>참고자료: <a href="https://opentutorials.org/module/516/5559">https://opentutorials.org/module/516/5559</a></p>
<strong>
결론: JVM이 컴파일 된 자바의 코드인 바이트 코드(~.class)를 인식하여 실행하기 때문에 서로 다른 운영체제에 상관 없이 실행할 수 있다.

</strong>

<p><img src="https://images.velog.io/images/jay_so_/post/92d6fd86-8607-4914-aac2-d663284bc35e/%EC%9D%B4%EC%8B%9D%EC%84%B1.png" alt=""></p>
<h2 id="2-객체-지향-언어-이다">2. 객체 지향 언어 이다.</h2>
<hr>
<h3 id="⏰객체-지향-언어란">⏰객체 지향 언어란?</h3>
<aside>
💡 객체 = 주변의 사물이나 생명체 등

</aside>

<p><img src="https://images.velog.io/images/jay_so_/post/3c4fbcd3-bd42-4784-ba2e-34587924807e/%EA%B0%9D%EC%B2%B4.png" alt=""></p>
<p><strong>우리 주위의 객체 예시</strong></p>
<p>ex) 자동차, 옷, 콘센트 등</p>
<aside>
💡 객체 지향 언어 = 프로그램 언어로 다수의 객체를 만들고 사용하는 언어

</aside>

<ul>
<li>프로그램을 다수의 “객체”로 만들고, 이들이 서로 상호작용을 통해 만들어지는 방식</li>
</ul>
<p>장점:</p>
<ol>
<li>각 부품들의 역할이 나누어져 있고 사용하는 각 부품들이 작동하게 되므로 고장이 나면 해당 부품만 수리 및 교체하여 간단하게 해결할 수 있다.</li>
<li>이로 인해 유지보수가 쉽고 편해진다.</li>
</ol>
<h3 id="특징">특징</h3>
<ul>
<li>객체 지향 언어는 “하나의 조립 PC와 같다”라고 생각하면 된다.</li>
</ul>
<h3 id="1-캡슐화">1. 캡슐화</h3>
<aside>
💡 데이터와 코드의 형태를 외부로부터 알 수 없게 하고, 데이터의 구조와 역할, 기능을 하나의 캡슐 형태로 만드는 방법

</aside>

<p><img src="https://images.velog.io/images/jay_so_/post/55dfe33e-f9a6-40d5-b4ac-8c8861667572/%EA%B0%AD%EC%8A%90%ED%99%94.png" alt=""></p>
<h3 id="2-상속">2. 상속</h3>
<aside>
💡 상위 클래스의 모든걸 하위 클래스가 모두 이어 받는것 <br>
  ex) 부모가 자식에게 유전자를 물려주듯이 부모의 특징을 자식이 모두 물려받게 된다.

</aside>

<p><img src="https://images.velog.io/images/jay_so_/post/7e245e18-f967-4e55-a490-3fbc6c2fc185/%EC%83%81%EC%86%8D.png" alt=""></p>
<h3 id="3-다형성">3. 다형성</h3>
<aside>
💡 상속과 연관되는 개념으로 한 객체가 다른 여러 형태(객체)로 재구성 되는 것을 의미                         ex) 한 부모의 밑에서 태어난 자식이 똑같지 않는 것과 같은 것이 있다.

</aside>

<p><img src="https://images.velog.io/images/jay_so_/post/1d1afa8b-b726-44aa-be94-63f37bd01277/%EB%8B%A4%ED%98%95%EC%84%B1.png" alt=""></p>
<h3 id="4-추상화">4. 추상화</h3>
<aside>
💡 **객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 의미**                                                ex) 실제로 존재하는 객체들을 프로그램으로 만들기 위한 공통적인 특성을 파악하여 필요없는 특성을 제거하는 과정

</aside>

<p><img src="https://images.velog.io/images/jay_so_/post/e61caaac-8e15-46ba-8c5b-8459f7f875a1/%EC%B6%94%EC%83%81%ED%99%94.png" alt=""></p>
<h3 id="객체-지향-언어의-장점">객체 지향 언어의 장점</h3>
<ol>
<li><strong>재사용성</strong></li>
</ol>
<ul>
<li>상속을 통해 프로그램 시 코드의 재사용을 높일 수 잇음</li>
</ul>
<ol>
<li><strong>생산성 향상</strong></li>
</ol>
<ul>
<li>잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상</li>
</ul>
<ol>
<li><strong>자연적인 모델링</strong></li>
</ol>
<ul>
<li>우리 일상의 모습의 구조가 객체에 자연스럽게 녹아들어 있기 때문에 생각하고 있는 것을 그대로 자연스럽게 구현할 수 있음</li>
</ul>
<ol>
<li><strong>유지 보수의 우수성</strong></li>
</ol>
<ul>
<li>프로그램 수정 시 추가, 수정을 하더라도 캡슐화를 통해 주변 영향이 적기에 유지보수가 쉽다.</li>
</ul>
<h3 id="객체-지향-언어의-단점">객체 지향 언어의 단점</h3>
<ol>
<li><strong>개발 속도가 느림</strong></li>
</ol>
<ul>
<li>객체가 처리하려는 것에 대한 정확한 이해가 필요하기 때문에 설계 단계부터 많은 시간이 소모됨</li>
</ul>
<ol>
<li><strong>실행 속도가 느림</strong></li>
</ol>
<ul>
<li>객체 지향 언어는 대체적으로 실행 속도가 느림</li>
</ul>
<ol>
<li><strong>코딩 난이도의 상승</strong></li>
</ol>
<ul>
<li>자바는 단일 상속, C++의 경우에는 다중 상속을 지원하여 코딩의 난이도가 상승된다.</li>
</ul>
<p>참고자료: <a href="https://radait.tistory.com/4">https://radait.tistory.com/4</a></p>
<h2 id="3-함수적-스타일-코딩을-지원한다">3. 함수적 스타일 코딩을 지원한다.</h2>
<hr>
<p><img src="https://images.velog.io/images/jay_so_/post/d28aa02d-a953-47b4-a03c-465220e4f107/%EB%9E%8C%EB%8B%A4.png" alt=""></p>
<h3 id="람다란">람다란?</h3>
<aside>
💡 람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions)를 지칭하는 용어

</aside>

<p><strong>예시</strong></p>
<p><img src="https://images.velog.io/images/jay_so_/post/7059134b-ed1b-487b-beb6-b1fc0b67c4b1/%EB%9E%8C%EB%8B%A4%EC%8B%9D.png" alt=""></p>
<h2 id="4-메모리를-자동으로-관리한다">4. 메모리를 자동으로 관리한다.</h2>
<hr>
<aside>
💡 자바는 C 또는 C++과 다르게 메모리를 직접 관리하는 것이 아닌 자동적으로 관리한다.      ex)객체 생성 시 자동적으로 메모리 영역을 찾아 할당하고 사용이 완료되면 쓰레기 수집기(가비지 컬렉션)를 실행하여 사용하지 않는 객체를 제거한다.

</aside>

<h2 id="5-다양한-어플리케이션을-개발할-수-있다">5. 다양한 어플리케이션을 개발할 수 있다.</h2>
<hr>
<aside>
💡 자바는 서버용 웹 어플리케이션, 모바일 용 어플리케이션 등 여러가지 어플리케이션 개발에 사용된다.

</aside>

<p><img src="https://images.velog.io/images/jay_so_/post/d753a57f-8601-4aea-af87-1e0c2b244247/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C.png" alt=""></p>
<p><img src="https://images.velog.io/images/jay_so_/post/670034fc-9bee-46b4-be6b-e30998a06c59/%EC%8A%A4%ED%94%84%EB%A7%81%20%EB%B6%80%ED%8A%B8.png" alt=""></p>
<h2 id="6-멀티쓰레드를-쉽게-구현-가능하다">6. 멀티쓰레드를 쉽게 구현 가능하다</h2>
<hr>
<aside>
💡 자바는 쓰레드 생성 및 제어와 관련된 라이브러리 API를 제공하고있기 때문에 실행되는 운영체제에 관계없이 멀티 쓰레드를 쉽게 구현 가능하다.

</aside>

<h3 id="️쓰레드란">⁉️쓰레드란?</h3>
<p><img src="https://images.velog.io/images/jay_so_/post/dceb6699-3909-48e9-b51d-67f8f701eaa3/%EC%93%B0%EB%A0%88%EB%93%9C.png" alt=""></p>
<aside>
💡 하나의 독립된 실행 라인이라고 할 수 있다.                                                                     대개 프로그램의 경우 하나의 쓰레드를 가지고 있어서 동시에 하나의 함수만 실행 할 수 있지만, 여러개의 쓰레드를 사용하면 동시에 여러개의 함수를 실행 할 수 있다

</aside>

<p>참고자료: <a href="https://gusdnd852.tistory.com/208">https://gusdnd852.tistory.com/208</a></p>
<h2 id="7-동적로딩dynamic-loading을-지원한다">7. 동적로딩(Dynamic Loading)을 지원한다.</h2>
<hr>
<aside>
💡 애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적로딩해서 객체를 생성한다.또한 개발완료후 유지보수가 발생하더라도 해당 클래스만 수정하면 되므로 전체 애플리케이션을 다시 컴파일 할 필요가 없습니다.                                     따라서 유지보수를 쉽고 빠르게 진행할 수 있다.

</aside>

<h2 id="8-오픈-소스-라이브러리가-풍부하다">8. 오픈 소스 라이브러리가 풍부하다.</h2>
<hr>
<aside>
💡 자바는 오픈소스언어이므로 자바 프로그램에서 사용하는 라이브러리 또한 오픈소스가 많다. 따라서 검증된 오픈소스 라이브러리를 이용하면 개발기간을 단축하며 안전성이 높은 애플리케이션을 쉽게 개발할 수 있다.

</aside>

<p>참고자료: <a href="https://radait.tistory.com/4">https://radait.tistory.com/4</a></p>
<p><a href="https://jwprogramming.tistory.com/117">https://jwprogramming.tistory.com/117</a> </p>
<p><a href="https://khj93.tistory.com/entry/JAVA-%EB%9E%8C%EB%8B%A4%EC%8B%9DRambda%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%82%AC%EC%9A%A9%EB%B2%95">https://khj93.tistory.com/entry/JAVA-람다식Rambda란-무엇이고-사용법</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[인터넷은 어떻게 동작될까?]]></title>
            <link>https://velog.io/@jay_so_/%EC%9D%B8%ED%84%B0%EB%84%B7%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%99%EC%9E%91%EB%90%A0%EA%B9%8C</link>
            <guid>https://velog.io/@jay_so_/%EC%9D%B8%ED%84%B0%EB%84%B7%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%99%EC%9E%91%EB%90%A0%EA%B9%8C</guid>
            <pubDate>Sat, 01 Jan 2022 11:26:25 GMT</pubDate>
            <description><![CDATA[<h2 id="📌인터넷의-사전적-정의">📌인터넷의 사전적 정의</h2>
<hr>
<p>인터넷의 사전적 정의는 다음과 같다.</p>
<p><img src="https://images.velog.io/images/jay_so_/post/74a718f4-3df5-47a4-b2a3-490047a67578/%EC%9D%B8%ED%84%B0%EB%84%B7%EC%9D%B4%EB%9E%80.PNG" alt=""></p>
<blockquote>
<p>전 세계에 걸쳐 원거리 접속이나 파일 전송, 전자 메일 등의 데이터 통신 서비스를 받을 수 있는, 컴퓨터 네트워크의 시스템</p>
</blockquote>
<h2 id="📌네트워크-관점의-인터넷">📌네트워크 관점의 인터넷</h2>
<hr>
<p>네트워크 관점에서 인터넷을 볼 때 의미는 다음과 같다.</p>
<blockquote>
<p>Internet = 여러 통신망을 하나로 연결한다는 인터 네트워크(Inter-network)라는 단어에서 시작되었으며 전세계 컴퓨터들을 하나로 연결하는 거대한 컴퓨터 통신망</p>
</blockquote>
<aside>
  💡 <strong>“그렇다면 인터넷은 어떤 방식으로 동작하는가?”</strong>
</aside>


<h2 id="📌인터넷의-동작-방식">📌인터넷의 동작 방식</h2>
<hr>
<p>🧭 인터넷은 기본적으로 <strong>클라이언트(사용자)와 서버를 연결하며, TCP/IP</strong>를라는 <strong>통신 프로토콜</strong>을 이용하여 정보를 주고 받는다.</p>
<p><img src="https://images.velog.io/images/jay_so_/post/a87e5be8-a082-49d6-8c24-90158b7c5b64/%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EC%99%80%20%EC%84%9C%EB%B2%84.png" alt=""></p>
<h2 id="📌tcpip">📌TCP/IP</h2>
<hr>
<blockquote>
<p><strong>TCP(Transmission Control Protocol)</strong>                                                                                                    = 서버와 클라이언트 간에 데이터를 신뢰성있게 전달하기 위해 만들어진 프로토콜</p>
</blockquote>
<blockquote>
<p><strong>IP(Internet Protocol)</strong>                                                                                                                                     =컴퓨터들의 네트워크 상에서 구분되기 위한 주소</p>
</blockquote>
<p><img src="https://images.velog.io/images/jay_so_/post/f939b6c8-7247-47eb-aec5-97c48c7e1308/tcp%EB%9E%91ip.jpg" alt=""></p>
<h2 id="📌인터넷-연결-방식-변화">📌인터넷 연결 방식 변화</h2>
<hr>
<ol>
<li><strong>1:1 연결</strong></li>
</ol>
<ul>
<li><strong>컴퓨터 1대와 컴퓨터 1대끼리 연결하는 방식을 의미</strong>한다.</li>
<li>컴퓨터 ↔ 컴퓨터</li>
<li>두 대의 컴퓨터가 서로 간 통신이 필요할 때 물리적(케이블) 혹은 무선으로 서로 연결하는 방식을 의미한다.</li>
</ul>
<p><img src="https://images.velog.io/images/jay_so_/post/e5e80981-1b02-422a-ae0d-3447c03d701a/1%EB%8C%801%EB%B0%A9%EC%8B%9D.png" alt=""></p>
<ol>
<li><strong>다 대 다 연결</strong></li>
</ol>
<ul>
<li>여러개의 컴퓨터를 원하는 만큼 연결하는 것을 의미한다.</li>
</ul>
<p><img src="https://images.velog.io/images/jay_so_/post/a1bfc5bb-f345-4de8-9591-fade50046e53/%EB%8B%A4%EB%8C%80%EB%8B%A4%20%EC%97%B0%EA%B2%B0.png" alt=""></p>
<aside>
  💡 <strong>만약 연결하는 대상이 많이 늘어날 수록 굉장히 많은 이더넷 케이블을 필요로 한다.</strong>
</aside>

<h2 id="📌-해결책-라우터">📌 해결책: 라우터</h2>
<hr>
<ul>
<li>컴퓨터 ↔ <strong>라우터</strong> ↔ 컴퓨터</li>
<li><strong>라우터</strong>는 <strong>주어진 컴퓨터에서 보낸 메시지가 올바른 대상 컴퓨터에 도착하는지 확인하는 작업을 수행</strong>한다.</li>
<li><strong>컴퓨터 B</strong>에게 메시지를 보내려면 <strong>컴퓨터 A</strong>가 메시지를 <strong>라우터</strong>로 보내야하며, <strong>라우터</strong>는 메시지를 <strong>컴퓨터 B</strong>로 전달하고 메시지가  다른 컴퓨터로 전달되지 않도록 한다.</li>
</ul>
<p><img src="https://images.velog.io/images/jay_so_/post/a494bff3-9553-4299-a374-c91d20fdae6d/%EB%9D%BC%EC%9A%B0%ED%84%B0.png" alt=""></p>
<h2 id="📌네트워크-속의-네트워크">📌네트워크 속의 네트워크</h2>
<hr>
<aside>
  💡 <strong>그렇다면 한 국가에서 사용하는 수 백, 수 천, 수 십억의 컴퓨터는 어떻게 연결해야하는가?</strong>
</aside>

<ul>
<li><strong>두 대 이상의 라우터는 서로 연결이 가능</strong>하다.</li>
<li>즉, 컴퓨터 ↔ <strong>라우터 ↔ 라우터</strong> ↔ 컴퓨터 연결</li>
</ul>
<p><img src="https://blog.kakaocdn.net/dn/cvJRuj/btqJ4GwxUhl/SVvgQfle7Uf2p209hDjusk/img.png" alt="https://blog.kakaocdn.net/dn/cvJRuj/btqJ4GwxUhl/SVvgQfle7Uf2p209hDjusk/img.png"></p>
<aside>
  💡 <strong>만약 집과 먼 다른 지역에는 어떻게 해야할까? 먼 곳까지 케이블이 닿지 않는 경우에는 어떻게 해결해야 하는가?</strong>
</aside>

<ul>
<li><p>이런 경우 <strong>모뎀</strong>을 이용하여 전세계 전화 시설에 네트워크 정보를 구축한다.</p>
</li>
<li><p>컴퓨터 ↔ 라우터 ↔ <strong>모뎀</strong> ↔ 전화 시설</p>
</li>
<li><p>네트워크를 <strong>인터넷 서비스 제공 업체 (Internet Service Provider, ISP)에 연결</strong>한다.</p>
<pre><code> ex) **ISP = KT,SK 브로드밴드, LG U+를 의미**합니다.</code></pre></li>
<li><p><strong>ISP</strong>는 모두 함께 연결되는 몇몇 특수한 <strong>라우터</strong>를 관리하고 다른 <strong>ISP의 라우터</strong>에도 액세스 가능(접근 가능)함</p>
</li>
<li><p>따라서 우리 네트워크의 메시지는 <strong>ISP</strong> 네트워크의 네트워크를 통해 대상 네트워크로 전달된다.</p>
</li>
<li><p>인터넷은 이러한 전체 네트워크 인프라로 구성된다.</p>
</li>
</ul>
<h2 id="자료-출처">자료 출처:</h2>
<hr>
<p><a href="https://upload.wikimedia.org/wikipedia/commons/c/c9/Client-server-model.svg">https://upload.wikimedia.org/wikipedia/commons/c/c9/Client-server-model.svg</a></p>
<p><a href="https://tcpschool.com/webbasic/intro">https://tcpschool.com/webbasic/intro</a></p>
<p><a href="https://kkoon9.tistory.com/68">https://kkoon9.tistory.com/68</a></p>
<p><a href="https://terms.naver.com/entry.naver?docId=2271913&amp;cid=51207&amp;categoryId=51207">https://terms.naver.com/entry.naver?docId=2271913&amp;cid=51207&amp;categoryId=51207</a></p>
<p><a href="https://codinghero.tistory.com/25">https://codinghero.tistory.com/25</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[📌백엔드 로드맵 & 프론트 엔드 로드맵]]></title>
            <link>https://velog.io/@jay_so_/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%A1%9C%EB%93%9C%EB%A7%B5-%ED%94%84%EB%A1%A0%ED%8A%B8-%EC%97%94%EB%93%9C-%EB%A1%9C%EB%93%9C%EB%A7%B5</link>
            <guid>https://velog.io/@jay_so_/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%A1%9C%EB%93%9C%EB%A7%B5-%ED%94%84%EB%A1%A0%ED%8A%B8-%EC%97%94%EB%93%9C-%EB%A1%9C%EB%93%9C%EB%A7%B5</guid>
            <pubDate>Fri, 31 Dec 2021 05:53:26 GMT</pubDate>
            <description><![CDATA[<h2 id="🧭-백엔드-로드맵">🧭 백엔드 로드맵</h2>
<hr>
<p><img src="https://images.velog.io/images/jay_so_/post/084adad3-23a3-479e-bcb1-165755e47b56/%EB%B0%B1%EC%97%94%EB%93%9C%20%EB%A1%9C%EB%93%9C%EB%A7%B5.png" alt=""></p>
<h2 id="🧭-프론트엔드-로드맵">🧭 프론트엔드 로드맵</h2>
<hr>
<p><img src="https://images.velog.io/images/jay_so_/post/0b2210fb-85fa-4c08-9301-47b33d2b9f99/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%20%EB%A1%9C%EB%93%9C%EB%A7%B5.png" alt=""></p>
<hr>
<h3 id="출처-httpsgithubcomdevjangdeveloper-roadmap">출처: <a href="https://github.com/devJang/developer-roadmap">https://github.com/devJang/developer-roadmap</a></h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[안드로이드 스튜디오 ]]></title>
            <link>https://velog.io/@jay_so_/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%8A%A4%ED%8A%9C%EB%94%94%EC%98%A4-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@jay_so_/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%8A%A4%ED%8A%9C%EB%94%94%EC%98%A4-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Tue, 27 Jul 2021 15:51:40 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/jay_so_/post/03720645-4084-48aa-bd74-7dd63bf0b035/%ED%91%9C%EC%A7%80.PNG" alt=""></p>
<hr>
<h3 id="1-1-스마트폰-운영체제">1-1. 스마트폰 운영체제</h3>
<ul>
<li>스마트폰에는 각기 다른 운영체제(OS)가 있으며 주로 안드로이드 진형과 IOS진형으로 구분됩니다.</li>
</ul>
<p><img src="https://images.velog.io/images/jay_so_/post/b0d393d5-df19-402e-826d-eb830f1ce395/1.PNG" alt=""></p>
<ul>
<li><p>(2021년 7월 기준) 안드로이드 OS는 72.83%, IOS OS는 26.35%의 점유률을 보여줍니다.</p>
</li>
<li><p>안드로이드의 주요 개발 언어로는 Java와 Kotlin이 있으며 ios의 개발 언어로는 Object C가 있습니다.</p>
</li>
<li><p>다음은 2021년 7월 기준 전세계 스마트폰 OS 점유률입니다.</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/jay_so_/post/34e72165-d0f4-4ec7-87d6-cb19edf9fce3/5.PNG" alt=""></p>
<ul>
<li><p>링크를 클릭하시면 전세계 스마트폰 OS 점유률을 확인할 수 있습니다.</p>
<p>&lt;a href = &quot;<a href="https://gs.statcounter.com/os-m">https://gs.statcounter.com/os-m</a></p>
<pre><code>     arket-share/mobile/worldwide&quot;&gt; 스마트폰 OS 점유률 &lt;/a&gt;</code></pre></li>
</ul>
<hr>
<h3 id="1-2-안드로이드-os에-대하여">1-2. 안드로이드 OS에 대하여</h3>
<p><img src="https://images.velog.io/images/jay_so_/post/eab86ed6-b9f7-41c1-afaa-4fcf8996d45b/2.PNG" alt=""></p>
<ul>
<li><p>안드로이드는 2005년 구글에서 인수한 이후 2007년 11월 안드로이드를 무료로 공개한다고 선언하였습니다.</p>
</li>
<li><p>안드로이드 OS는 2008년 9월 20일 최초로 출시되었습니다.</p>
</li>
</ul>
<h3 id="안드로이드-버전">안드로이드 버전</h3>
<p><img src="https://images.velog.io/images/jay_so_/post/949a3678-e3ed-4593-80ba-32e7577e2dcf/3.PNG" alt=""></p>
<ul>
<li><p>안드로이드는 10버전 이전까지 캔디 또는 과자 등 디저트 이름을 주로 사용하였습니다.</p>
</li>
<li><p>그러나 10버전부터는 기존 네이밍 규칙과 다르게 Android Studio 10을 공식적으로 사용하였으며 현재 Android Studio 11버전까지 출시되었습니다.</p>
</li>
<li><p>자세한 버전별 네이밍 이름은 다음의 안드로이드 공식 사이트를 통해 확인할 수 있습니다.</p>
<p><a href ="https://source.android.com/setup/start/build-numbers">안드로이드 스튜디오 버전별 네이밍 </a></p>
</li>
</ul>
<hr>
<h3 id="1-3-안드로이드의-구조">1-3. 안드로이드의 구조</h3>
<p><img src="https://images.velog.io/images/jay_so_/post/25141a15-670f-4913-934b-47e6a7d3960d/4.PNG" alt=""></p>
<ul>
<li>안드로이드의 구조는 <strong>응용 프로그램, 응용 프로그램 프레임 워크, 안드로이드 런타임, 라이브러리,리눅스 커널</strong>로 구분됩니다.</li>
</ul>
<p><img src="https://images.velog.io/images/jay_so_/post/3b80ea89-38ab-4b6b-bb95-1cadb74a7825/5.PNG" alt=""></p>
<p><strong>1. 응용프로그램</strong></p>
<ul>
<li>일반적으로 안드로이드 OS 스마트폰에서 사용할 수 있는 어플리케이션입니다.</li>
<li>웹 브라우저, 연락처 등이 여기에 속합니다.</li>
</ul>
<p><strong>2.응용 프로그램 프레임 워크</strong></p>
<ul>
<li>안드로이드 API가 존재하는 곳입니다. 어플리케이션은 API를 통해 커널에 접근할 수 있습니다.</li>
<li>안드로이드 OS의 스마트폰 하드웨어를 접근할 때 Java로 직접 접근하는 것이 아닌 API를 통해서만 접근이 가능합니다.</li>
</ul>
<Blockquote>
  API란?<br>
  - 애플리케이션 프로그래밍 인터페이스 (Application Programming  Interface)<br>
  - 응용 프로그램에서 사용할 수 있도록, 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 의미합니다.<br>
  <br>
  ex) open API, 공공 API
</Blockquote>

<p><img src="https://images.velog.io/images/jay_so_/post/ddeeca7f-902a-4d7c-8012-65227a2ebf58/6.PNG" alt=""></p>
<p><strong>3. 안드로이드 런타임</strong></p>
<ul>
<li><p>java코어 라이브러리와 달빅 가상머신 또는 아트 런타임으로 구성되어 있습니다.</p>
</li>
<li><p>java 가상머신(JVM:Java Virtual Machine)을 사용하지 않고 모바일 환경에 최적화된 달빅 가상머신이나 아트 런타임을 사용합니다.</p>
</li>
</ul>
<Blockquote>
  런타임이란?<br>
  - 애플리케이션을 관리하기 위해 특정한 컴파일러나 가상머신이 사용하는 기본 코드 라이브러리 또는 애플리케이션이 실행되고 있는 동안의 동작을 의미합니다.<br>
  <br>
  달빅 가상머신이란?<br>
  - 레지스터 머신 형태의 가상머신입니다.<br>
  - 적은 메모리 요구사항에 최적화되어 있으며 자바 바이트 코드를 사용하지 않아 자바 가상 머신과 다릅니다.<br>
  <br>
  아트 런타임이란?<br>
  - 안드로이드 운영체제 아래 만들어진 런타임 환경의 VM(Virtual Machine)입니다.<br>
  - 애플리케이션의 바이트 코드를 네이티브 명령어로 변환을 수행한 후 나중에 장치의 런타임 환경에 의해 실행됩니다.
</Blockquote>



<p><img src="https://images.velog.io/images/jay_so_/post/57705bff-766b-4ed9-bb15-f99ffa4d9977/7.PNG" alt="">
<strong>4. 라이브러리</strong></p>
<ul>
<li><p>소프트웨어를 개발할 때 필요한 자원(미리 작성된 코드, 서브루틴(함수), 클래스 등)들의 모임입니다.</p>
</li>
<li><p>반복적인 코드 작성을 없애기 위해 필요한 곳에서 언제든지 호출할 수 있도록 클래스나 함수로 미리 만들어진 것입니다.</p>
</li>
</ul>
<p><strong>5.리눅스 커널</strong></p>
<ul>
<li><p>하드웨어 운영과 관련된 저수준의 관리 기능이 들어 있고 주로 메모리 관리, 디바이스 드라이버, 보안 등을 관리합니다.</p>
</li>
<li><p>리눅스는 오픈 소스라는 장점이 있으며 카메라, GPS등 많은 스마트폰 장치를 지원합니다.</p>
</li>
</ul>
<Blockquote>
  커널이란?<br>
  - OS의 핵심으로 컴퓨터 자원을 관리합니다.<br>
  - 보안, 추상화 자원을 관리합니다.

</Blockquote>


<hr>
<h3 id="1-4-안드로이드의-개발환경">1-4. 안드로이드의 개발환경</h3>
<p><img src="https://images.velog.io/images/jay_so_/post/95b42536-0fa8-41b2-a2d1-1bbc91c4ee27/8.PNG" alt=""></p>
<ul>
<li>안드로이드의 개발환경은 <strong>JDK, 안드로이드 SDK, 안드로이드 스튜디오, ADT</strong>로 구분됩니다.</li>
</ul>
<p><strong>1.JDK(Java Development Kit)</strong></p>
<ul>
<li>Android Studio 2.2 버전부터는 Open JDK가 내장되어 있어 JDK를 별도로 설치하지 않아도 됩니다.</li>
</ul>
<p><strong>2.안드로이드 SDK(Android Studio Software Development Kit)</strong></p>
<ul>
<li>안드로이드 소프트웨어를 개발하기 위한 툴 킷을 의미합니다.</li>
<li>모든 API가 들어 있지 않기에 추가로  API를 다운로드하여 사용할 수 있습니다.</li>
</ul>
<p><strong>3.Android Studio</strong></p>
<ul>
<li>개발을 위한 안드로이드 스튜디오 IDE(Integrated Development Enviornment)입니다.</li>
</ul>
<p><strong>4.ADT(Android Development Tools)</strong></p>
<ul>
<li>이클립스 또는 안드로이드 SDK, 안드로이드 AVD(Android Virtual Device:안드로이드 에뮬레이터)를 연결시키는 프로그램입니다.</li>
</ul>
<p><img src="https://images.velog.io/images/jay_so_/post/114dad81-7685-4206-a916-d924f777d76f/9.PNG" alt=""></p>
<ul>
<li><p>안드로이드 개발은 위의 사진과 동일하게 <strong>응용 프로그램 개발, 시스템 응용 프로그램 개발,하드웨어 및 커널 개발단계</strong>로 구분됩니다.</p>
</li>
<li><p>응용프로그램 단계에서는  Java를 주로 사용하며 시스템 응용 및 하드웨어,커널 제어 개발 단계에서는  C, C++를 사용합니다.</p>
</li>
</ul>
<hr>
<h3 id="참고-자료">참고 자료</h3>
<h4 id="1-2-안드로이드-os에-대하여-1">1-2. 안드로이드 OS에 대하여</h4>
<p><a href = "https://ko.wikipedia.org/wiki/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C_(%EC%9A%B4%EC%98%81_%EC%B2%B4%EC%A0%9C) " > 위키피디아 안드로이드 운영체제</a></p>
<h4 id="1-3-안드로이드의-구조-1">1-3. 안드로이드의 구조</h4>
<p><a href = "https://ko.wikipedia.org/wiki/API" > 위키피디아 API</a>
<a href = "https://ko.wikipedia.org/wiki/%EB%8B%AC%EB%B9%85_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4)" > 위키피디아 달빅 (소프트웨어)</a>
<a href = "https://blog.naver.com/PostView.nhn?blogId=kbh3983&logNo=221292870568&categoryNo=101&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView">레지스터 기반 vs 스택 기반 vm 정리글 </a></p>
<ul>
<li>스택 기반 vm (java 가상 머신)과 레지스터 기반 vm(달빅 가상 머신)을 더 알고 싶으시다면 해당 블로그를 방문하는 것을 추천합니다.</li>
</ul>
<p><a href = "https://develoid.github.io/android/android-runtime.html" >안드로이드 런타임 정리글 </a></p>
<ul>
<li>안드로이드 런타임에 대하여 더 알고 싶으시다면 해당 블로그를 방문하는 것을 추천합니다.</li>
</ul>
<p><a href = " https://ko.wikipedia.org/wiki/%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC_(%EC%BB%B4%ED%93%A8%ED%8C%85)" >위키 피디아 라이브러리 </a>
<a href = "https://ko.wikipedia.org/wiki/%EC%BB%A4%EB%84%90_(%EC%BB%B4%ED%93%A8%ED%8C%85) "> 위키피디아 커널</a></p>
<h4 id="1-4-안드로이드의-개발환경-1">1-4. 안드로이드의 개발환경</h4>
<p><a href = "https://m.blog.naver.com/me5343/221707644528" >안드로이드 개발 환경 종류 정리글</a></p>
]]></description>
        </item>
    </channel>
</rss>