<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Wooni's Tech blog</title>
    <description>An amazing website.</description>
    <link>https://woonis.github.io/</link>
    <atom:link href="https://woonis.github.io/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Wed, 28 Aug 2019 12:38:45 +0000</pubDate>
    <lastBuildDate>Wed, 28 Aug 2019 12:38:45 +0000</lastBuildDate>
    <generator>Jekyll v3.8.5</generator>
    
      <item>
        <title>Study</title>
        <description>&lt;h3 id=&quot;access-modifier&quot;&gt;Access Modifier&lt;/h3&gt;

&lt;p&gt;Java의 접근제어자는 총 4가지가 존재한다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Public : 같은 프로젝트 내 어느 프로젝트에서나 참조가 가능한 접근제어자.&lt;/li&gt;
  &lt;li&gt;Protected: 상속 관계의 존재하는 클래스들만이 접근이 가능한 접근제어자.&lt;/li&gt;
  &lt;li&gt;Package-private : 자바의 디폴트 접근제어자로써, 같은 패키지내에 존재하는 클래스 들이 접근 가능한 접근제어자.&lt;/li&gt;
  &lt;li&gt;Private: 외부에서의 접근이 불가능하고, 현재 클래스 내에서만 접근이 가능한 접근 제어자.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;cache&quot;&gt;Cache&lt;/h3&gt;

&lt;p&gt;중복적인 데이터의 호출이 많은데 응답이 같거나, 데이터의 로딩의 오랜 시간이 걸리는 경우 캐시를 통해 데이터의 접근을 최소하 하여 같은 응답을 보내줄 수 있음. ex) Redis, Guava 캐시&lt;/p&gt;

&lt;p&gt;또한 스프링 부트에서는 어노테이션으로도 캐시를 제공하지만, 인스턴스가 여러대가 뜨는 경우 각 인스턴스 별로 캐시의 적용이나 익스파이어의 차이 갭이 발생할 수 있으므로 주의해야 한다.&lt;/p&gt;

&lt;h3 id=&quot;checked-vs-unchecked-vs-error&quot;&gt;Checked vs UnChecked vs Error&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Error: 정상적인 어플리케이션에서는 발생이 불가능 한 것. 네트워크, 데이터 베이스 에러 등.&lt;/li&gt;
  &lt;li&gt;Checked Exception: 컴파일 시에 해결해야하는 Try Catch또는 Throws를 통해. 예외의 처리를 미리 진행할 수 있는 익셉션.&lt;/li&gt;
  &lt;li&gt;UnChecked Exception(Runtime Exception): 어플리케이션 동작중에 발생하여 동작을 멈추게하는 익셉션. NullPointerException, IndexOutOfBoudException등이 대표적이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;class-vs-object-vs-instance&quot;&gt;Class vs Object vs Instance&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Class : 변수와 메소드로 구성된 객체를 만들어 내기 위한 설계도.&lt;/li&gt;
  &lt;li&gt;Object : 클래스에 선언된 모양 그대로 생성된 실체. 클래스의 인스턴스라고도 부름.&lt;/li&gt;
  &lt;li&gt;Instance : Class를 바탕으로 구현된 구체적인 실체. 메모리의 할당된 상태. 인스턴스는 객체에 포함됨.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;collections&quot;&gt;Collections&lt;/h3&gt;

&lt;p&gt;Java 에서는 같은 타입의 데이터를 가지는 변수들을 한번에 저장하기 위해 Array와 Collection을 제공함.&lt;/p&gt;

&lt;p&gt;배열의 경우에는 처음 사용시에 사이즈 정보에 대한 부분이 같이 명시되어야 하고, 해당 공간을 할당한 후 사용하지 않으면 메모리에 낭비가 발생할 수 있으므로, 동적으로 데이터의 공간을 생성하여 저장하는 Collection을 많이 사용.&lt;/p&gt;

&lt;p&gt;Collection Interface는 크게 Collection / Map의 큰 두가지의 자료 구조로 나눌 수 있다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;List : 순서가 있는 저장 공간으로 중복을 허용함. Array에 비해 인덱스를 통한 접근이 조금 느릴 수는 있음. 삭제는 리스트가 훨씬 유용하고 빠름. ex) ArrayList, Stack and so on.&lt;/li&gt;
  &lt;li&gt;Set : 순서가 없는 저장 공간으로 중복을 허용하지 않음. ex) HashSet, SortedSet and so on.&lt;/li&gt;
  &lt;li&gt;Map: Key-Value의 집합으로 이루어진 자료구조이며, 순서는 유지되지 않고 키는 중복을 허용하지 않지만 값의 경우는 중복을 허용한다. ex) HashMap, SortedMap and so on.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;cqrscommand-and-query-responsibility-segregation&quot;&gt;CQRS(Command and Query Responsibility Segregation)&lt;/h3&gt;

&lt;p&gt;전통적인 CRUD 아키텍처에서 Application을 개발 및 운영하다보면, 자연스레 Domain Model의 복잡도가 증가함.
이로인한 유지보수 비용이 늘어나고, 처음 설계와는 다르게 변질되기도 함.&lt;/p&gt;

&lt;p&gt;Application의 Business 정책이나 제약은 거의 C,U,D의 영향을 주고, R의 작업은 대부분 조회이므로 두 업무를 동일한 Domain Model로 처리하다보면 각 업무영역에 필요치 않은 도메인 정보들을 가지며 복잡도가 증가함.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;DB는 분리하지 않고, Modelrhk Command Query Model만 분리함.&lt;/li&gt;
  &lt;li&gt;Command용과 Query용 디비를 분리하고, 이 두개의 디비를 동기화 함.&lt;/li&gt;
  &lt;li&gt;이벤트 소싱을 적용한 구조.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;final-vs-enum&quot;&gt;Final vs Enum&lt;/h3&gt;

&lt;p&gt;Final의 경우는 영역에 따라 아래와 같은 역할을 하게된다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Class : 상속 불가. ex) String&lt;/li&gt;
  &lt;li&gt;Method: 오버라이딩 불가.&lt;/li&gt;
  &lt;li&gt;Field: 값의 초기화 이후 값의 변경 불가. 값의 불변을 보장하기 위해 사용.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;따라서 주로 클래스 내의 값이나 프로젝트 전체내에서 상수 형식으로 선언할 수 있는 경우 final field로 선언하여 주로 사용함.&lt;/p&gt;

&lt;p&gt;Enum은 상수의 집합을 위한 타입.&lt;/p&gt;

&lt;p&gt;따라서 하나의 이넘타입내의 여러 연관 있는 상수의 집합을 가지고 있으며, 경우에 따라 기본적으로 제공해야하는 메소드나, 필드에 대한 추가 선언도 가능하다.&lt;/p&gt;

&lt;h3 id=&quot;gcgarbage-collection&quot;&gt;GC(Garbage Collection)&lt;/h3&gt;

&lt;p&gt;C언어에서는 개발자가 직접 메모리에 대한 할당과 해제를 진행해야 했지만, 자바에서는 JVM을 통해 OS메모리에 접근하므로 GC가 자동으로 오래된 메모리 영역을 확보해주는 GC가 있기때문에 굳이 개발자가 신경쓸 필요가 없음.&lt;/p&gt;

&lt;p&gt;JVM의 GC의 첫번째 타킷은 Stack에서 더 이상 도달 할 수 없는 Heap영역의 객체 Unreachable Object해당 객체.&lt;/p&gt;

&lt;p&gt;GC의 과정을 &lt;strong&gt;Mark and Sweep&lt;/strong&gt;라고도 부르는데, GC의 Mark는 Unreachable Object를 찾기위해 스레드를 중단하고 Stack에 있는 모든 내용을 스캔하며 Reachable Object를 마킹하는 작업을 말한다. 따라서 System.gc()를 함부로 호출하면 안됨. 이후 Sweep을 통해 더이상 참조하지 않는 객체들을 힙 영역에서 삭제한다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;VisualVM을 통해 모니터링이 가능함.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;일반적인-gc&quot;&gt;일반적인 GC&lt;/h5&gt;

&lt;p&gt;Heap영역은 크게 Young Zone과 Old Zone으로 나누게 됨.&lt;/p&gt;

&lt;p&gt;Young Zone은 Old Zone보다 작은 메모리 영역을 가지며, Young Zone을 주기 적으로 삭제한 후 오랜 영역 참조를 가지는 메모리들을 Old Zone으로 이동시키게 됨.&lt;/p&gt;

&lt;p&gt;따라서 전체 모든 영역을 스캔하는 것보다 더 빠르게 스캔이 가능하며, Young Zone을 한번에 비우기 때문에 연속된 여유 공간이 만들어지게 됨.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GC가 Young Zone을 정리하는 것을 Minor GC, Old Zone을 정리하는 것을 Full FC라고 함.&lt;/strong&gt;&lt;/p&gt;

&lt;h5 id=&quot;gc-종류&quot;&gt;GC 종류&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;Serial: 32bit 싱글 스레드 어플리케이션에서 사용되는 기본 GC. Minor/Full GC Single Thread 모두 All Stop.&lt;/li&gt;
  &lt;li&gt;Parallel: 64 bit JVM이나 멀티 CPU 머신에서 사용되는 기본 GC. Minor/Full GC 모두 Multi Thread로 모두 All Stop.&lt;/li&gt;
  &lt;li&gt;CMS Collector: Full GC의 stop-the-world를 줄이기 위함. Minor GC는 Multi Thread의 Stop이지만, Full GC는 거의 Stop-the-world가 발생하지 않음. 백그라운드의 별도의 쓰레드를 통해서 삭제될 영역을 체크하기 때문에 stop-the-world는 줄었지만, 항상 GC Thread가 별도로 동작하므로 CPU 리소스를 많이 사용하고, 메모리 파편화가 많이 발생한다.&lt;/li&gt;
  &lt;li&gt;G1(Garbage First): 힙영역이 4GB 이상에서 동작하기 적합한 GC. CMS Collector의 메모리 파편화 이슈를 해결함. Minor GC는 Multi Thread로 정리를 하며, Old Zone을 여러개의 Region으로 나누어 관리함.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;generic&quot;&gt;Generic&lt;/h3&gt;

&lt;p&gt;컴파일시에 형변환의 문제점을 방지위해 사용. 클래스나 메소드에 &lt;특정 캐릭터=&quot;&quot;&gt;를 통해 제너릭하게 받을 타입을 선언할 수 있음.&lt;/특정&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;E: 요소(Element)
K: 키(Key)
N: 숫자(Number)
T: 타입(Type)
V: 값(Value)
S, U, V: 두번째, 세번째, 네번째에 선언된 타입&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;? 라는 whildcard를 통해 모든 타입에 대해 열려있도록 선언할 수도 있지만, 해당 부분을 ? extends “some class”로 선언하여 특정 클래스 하위 클래스들만이 해당 클래스에 접근이 가능하게 할 수도 있음.&lt;/p&gt;

&lt;h3 id=&quot;immutable-object---integer-character-byte-boolean-long-double-float-short-wrapping-class&quot;&gt;Immutable Object - Integer, Character, Byte, Boolean, Long, Double, Float, Short (Wrapping Class)&lt;/h3&gt;

&lt;p&gt;변경하는 연산이 수행되면 변경하는 것처럼 보이지만 실제로는 Heap영역 안에 새로운 메모리에 새로운 객체가 할당 됨.
String 내부의 this는 Final변수임으로, 실질적으로 재 할당이 불가능함. 즉, +연산이나 replace()등의 String의 메소드가 호출되게 되면, 이는 현재 final변수로 부터 값을 읽은 후 메소드를 수행하고 새로운 객체로 값을 반환하는 형태임.&lt;/p&gt;

&lt;h3 id=&quot;java-compile&quot;&gt;JAVA Compile&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Text 편집기를 통해 *.java file로 코딩.&lt;/li&gt;
  &lt;li&gt;javac *.java 를 통해 *.class파일(바이트 코드)로 변환.&lt;/li&gt;
  &lt;li&gt;JVM에서 *.class 파일로딩을 통한 프로그램 실행.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Java는 JIT(Just In Time) Compiler를 통해 이미 변환된 코드는 캐싱하는 방식을 사용하여 인터프리터의 속도를 개선하였다.
JIT란 JVM등의 가상머신이 중간 언어인 바이트 코드를 가지고 코드를 수행함으로써 플랫폼의 제약이 없이 런타임에 컴파일을 할수 있도록 하는 방식.&lt;/p&gt;

&lt;h3 id=&quot;java-memory-stack-vs-heap&quot;&gt;JAVA Memory (Stack vs Heap)&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Stack
    &lt;ul&gt;
      &lt;li&gt;Heap영역의 생성된 Object 타입의 데이터의 참조값이 할당.&lt;/li&gt;
      &lt;li&gt;Primitive Type 변수의 데이터 값이 할당.&lt;/li&gt;
      &lt;li&gt;지역변수의 visibility. -&amp;gt; 지역변수의 호출 순서를 가지기 때문에 자신의 해당 블럭이 끝나면 함께 pop됨.&lt;/li&gt;
      &lt;li&gt;각 Thread는 자신만의 Stack을 가짐. -&amp;gt; 즉 다른 Thread에서는 외부 Thread의 Stack에 접근이 불가함.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Heap
    &lt;ul&gt;
      &lt;li&gt;긴 생명 주기를 가지는 데이터가 저장.&lt;/li&gt;
      &lt;li&gt;Application의 메모리 중 stack의 데이터를 제외한 부분이 저장.&lt;/li&gt;
      &lt;li&gt;Thread와 상관없이 단 1개의 Heap이 존재.&lt;/li&gt;
      &lt;li&gt;Heap영역의 오브젝트들을의 참조 값이 Stack에 저장됨. -&amp;gt; 파라미터 변수로 전달되었다 하더라도 종료시점에 변경 값이 반영됨.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;java-8&quot;&gt;JAVA 8&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;람다 제공(익명 함수). 따라서 람다를 통해 익명 함수로써 메소드의 선언이 없이 처리가 가능.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Stream API제공. Collection Type의 Stream API가 제공되면서 해당 타입의 처리가 쉬워짐. -&amp;gt; 대용량 처리의 경유 성능 이슈 고려.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Joda Time 제공. 조다 타임을 통해 각 로컬 데이트 기준의 시간 처리가 간편 해짐.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;join-nested-loop-merge-sort-hash&quot;&gt;Join (Nested-Loop, Merge Sort, Hash)&lt;/h3&gt;

&lt;p&gt;조인이란, 두 릴레이션으로 부터 관련된 튜플들을 결합하여 하나의 튜플로 만드는 가장 대표적인 데이터 연결 방법.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Inner Join : A,B 테이블의 교집합을 결과로 리턴.&lt;/li&gt;
  &lt;li&gt;Left, Right Outer Join : 각 Left, Right 테이블을 기준으로 해당 테이블의 결과 + 중복 결과를 리턴.&lt;/li&gt;
  &lt;li&gt;Cross: 모든 경우의 수를 조합한 결과를 리턴.&lt;/li&gt;
  &lt;li&gt;Self: 자기 자신과 자기자신을 조인.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;Join 수행 방식&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
  &lt;li&gt;Nested-Loop : 선행테이블의 처리범위를 하나씩 액세스하면서 추출된 값으로 연결할 테이블을 조인.
Loop를 줄이기 위해, 테이블의 로우수가 적은 테이블을 선행테이블로 하여, inner테이블의 연결고리를 결합 인덱스를 통해 최적화 해야함.&lt;/li&gt;
  &lt;li&gt;Sort Merge : 양쪽 테이블 처리범위를 각자 액세스 하여 정렬한 결과를 차례로 scan하면서 연결고리의 조건으로 조인.
정렬이 되어 있지 않은 경우는 외부 정렬을 사용한 후 조인을 하며, 각 정렬되어 있는 애트리뷰트 A,B의순서에 따라 동시에 스캔하면서 조인함. 
join의 연결고리가 ‘&amp;gt;’ , ‘&amp;lt;’인 경우 Nested Join보다 유리함.
하지만 두 집합의 크기의 차이가 큰 경우에는 비효율 적임.&lt;/li&gt;
  &lt;li&gt;Hash : 해시 함수를 기준으로 하여 선행과 후행 테이블을 조인. 더 적은 테이블을 선행으로 하여 해시 함수를 적용한 후 후행 레코드들의 해시 함수를 적용하여 실제로 동일한 주소를 갖는 레코드들을 조인함.
많은 메모리와 CPU가 사용되지만, 대용량 데이터를 처리하기 쉽고, 랜덤 엑세스와 정렬에 대한 부담을 해결할 수 있음. 단, 연결 조건 연산자가 ‘=’ 인 경우에만 사용이 가능함.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;msamicro-service-architecture&quot;&gt;MSA(Micro Service Architecture)&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Monolithich&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;일부 모듈의 변경사항으로 전체 어플리케이션의 개발과 운영에 영향을 줌.&lt;/p&gt;

    &lt;p&gt;모듈별 신기술이나 특정 구조를 맞추기가 어렵고, 확장이 어려움&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;MSA&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;장 : Application을 각자 책임 명확한 작은 컴포넌트들로 나눔으로써 각 어플리케이션 별 신기술이나 구조를 적용할 수 있으며, 배포가 용이해짐. 각 Application의 통신을 위해서는 HTTP와 JSON 같은 경량 프로토콜을 사용한다.&lt;/p&gt;

    &lt;p&gt;단 :각 어플리케이션이 분산되어 있기때문에 장애 추적, 모니터링 또는 전체 통합 테스팅이 어렵다. 또한 디펜던시가 있는 배포인 경우에는 서로의 배포 디펜던시를 가지기 때문에 까다로울 수 있다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;oomeout-of-mermory-exception&quot;&gt;OOME(Out Of Mermory Exception)&lt;/h3&gt;

&lt;p&gt;JVM의 Heap 메모리에 더이상 Object를 할당할 수 없을 때 발생.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Java Heap Space
    &lt;ul&gt;
      &lt;li&gt;Heap 메모리가 작음. -&amp;gt; -Xmx 옵션을 사용하여 메모리를 증가 시킬 수 있음.&lt;/li&gt;
      &lt;li&gt;로직의 의해서 발생. -&amp;gt; Heap Dump를 통해 많은 메모리를 사용하고 있는 부분을 찾아 로직 수정이 필요.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;PermGen Space
    &lt;ul&gt;
      &lt;li&gt;Permanaet : String pool, Class Method와 관련된 각종 Meta Data 저장을 위함.&lt;/li&gt;
      &lt;li&gt;JVM 수행 시 로딩되는 Class나 String의 수가 너무 많아 진 경우. WAS 혹은 JDK의 버그를 의심해 봐야함.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;oopobject-oriented-programming&quot;&gt;OOP(Object Oriented Programming)&lt;/h3&gt;

&lt;p&gt;객체의 관점에서 프로그래밍을 하는 것. 어플리케이션을 구성하는 요소들을 객체로 바라보고, 객체를 유기적으로 연결하여 프로그래밍 하는 것.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;추상화 
객체들의 공통된 특징을 파악해 정의해 놓은 설계의 특징.&lt;/li&gt;
  &lt;li&gt;캡슐화
정보 은닉을 위하여 외부에 노출되지 않아야 하는 속성을 노출하지 않는 특징.&lt;/li&gt;
  &lt;li&gt;상속
코드의 중복을 없애기 위해, IS-A 관계에 대해 정의하여 재사용 하는 특징.&lt;/li&gt;
  &lt;li&gt;다형성
오버라이딩을 통하여 각 하위 객체들이 하나의 상위 객체를 상속 받아도, 각자 자신의 역할에 맞게 재정의 한다는 특징.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;ormobject-relational-mapping&quot;&gt;ORM(Object Relational Mapping)&lt;/h3&gt;

&lt;p&gt;데이터의 영속성을 위해 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해 주는 것.&lt;/p&gt;

&lt;p&gt;대표적인 프레임 워크로는 Hibernate가 있고, 이를 Java 표준으로 정의한 것이 JPA이다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;장 : 개발자가 데이터를 검색하고 업데이트하고 환경을 셋팅하기 위한 시간을 줄여주고 재사용 및 유지보수의 편리성을 증가 시켜줌.&lt;/li&gt;
  &lt;li&gt;단 : 설계에 신중해야 하며, 잘못된 구현의 경우 문제가 발생할 수 있고, 대용량 쿼리를 사용하기 위해서는 Store Procedure등을 사용하는 등의 별도의 튜닝이 필요한 경우가 있음.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;overloading-vs-overriding&quot;&gt;Overloading vs Overriding&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Overloading&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;함수의 메소드 명은 같지만, 파라미터의 수나 타입 다른경우.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Overridng (다형성)&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;상위 클래스에서 정의해둔 메소드를 하위 클래스에서 재정의 하는 경우. 함수의 리턴타입, 이름 그리고 파라미터의 수가 모두 동일.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;process-vs-thread&quot;&gt;Process Vs Thread&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Process&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램. 메모리에서 실행되고 있는 프로그램의 독립적인 인스턴스.
독립적인 Code, Data, Stack, Heap의 영역을 OS로 부터 할당 받음
최소 1개의 메인스레드가 있으며, 각 프로세스는 별도의 주소에서 실행되기 때문에 다른 프로세스에 접근하려면 프로세스 간의 통신이 필요함.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Thread&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;프로세스 내에서 실행되는 여러 흐름의 단위. 프로세스 내의 주소 공간이나 자원을 같은 프로세스 내의 스레드끼리 공유하면서 실행.
프로세스로 부터 각 Stack만 할당 받고, Code, Data, Heap은 공유함.
한 스레드가 프로세스의 자원을 변경하면, 다른 스레드에서도 그 변경 결과를 볼 수 있음.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Java Thread&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;일반 스레드와 차이가 없으며, JVM이 OS역할을 함. JVM에 의해 스케줄 되는 싱행 단위 코드 블럭.
JVM이 해당 스레드를 실행하며, 현재 몇개의 스레드가 존재하고, 프로그램의 위치가 어디이며 상태는 어떤지 그리고 우선순위는 어떤지에 대한 정보들을 관리함.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Multi Processing and Multi Thread.&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Multi Processing : 하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하게 하는 것.
장 : 여러개의 프로세스 중 하나가 문제가 발생해도 다른 프로세스는 영향이 없음.
단 : Context Switching 과정에서 오버헤드가 발생.&lt;/p&gt;

    &lt;p&gt;Multi Thread : 프로세스 내에서 작업의 단위를 여러 스레드의 단위로 나누어 처리하게 하는 것.
장 : 시스템 자원 소모 감소 및 처리량 증가.
단 : 주의 깊은 설계가 필요하고, 디버깅이 까다롭다. 또한 하나의 스레드에 영향이 생기면 전체 프로세스가 영향을 받음.&lt;/p&gt;

    &lt;p&gt;일반적으로 프로그램을 여러개 키는 Multi Processing보다는 자원을 효율적으로 나누어 사용할 수 있고, 처리 시간이 감소하는 Multi Thread를 주로 사용.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;reflection&quot;&gt;Reflection&lt;/h3&gt;

&lt;p&gt;Class의 내부 정보를 조회하고 조작할 수 있는 기법.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Class : Object Class에 있는 getClass() 메소드를 주로 이용.&lt;/li&gt;
  &lt;li&gt;Method : Class 클래스에 getMethod() 또는 getDeclaredMethod()를 주로 이용.&lt;/li&gt;
  &lt;li&gt;Field: Class 클래스에 getField() 또는 getDeclaredField()를 주로 이용.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;restful-api&quot;&gt;RESTful API&lt;/h3&gt;

&lt;p&gt;REST = Representational State Transfer&lt;/p&gt;

&lt;p&gt;즉, 자원을 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든 것.&lt;/p&gt;

&lt;p&gt;HTTP URI를 통해 자원을 명시하고, HTTP Method를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;장 : HTTP 프로토콜의 인프라를 그대로 사용하기 때문에 별도 인프라 구축이 필요 없음. 메시지가 의도하는 바를 명확하게 나타낼 수 있고, 서버와 클라이언트의 역할을 명확하게 분리한다.&lt;/li&gt;
  &lt;li&gt;단 : 표준이 존재하지 않고, Http Method 형태가 제한적이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;scale-up-scale-out&quot;&gt;Scale-up, Scale-out&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Sacle-Up&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;수직 스케일.
서버 자체의 성능을 증가 시키는 것. ex) 기존 서버에서 더욱 고성능 서버로 변경하는 것.
스토리지의 확장성의 한계가 있고, 한계에 다다른 경우 새로운 시스템으로 전환하는 마이그레이션 비용이 발생.
Ex) 제어가 힘들거나 분할 구성이 필요한 복잡한 서비스 오라클.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h5 id=&quot;scale-out&quot;&gt;Scale-Out&lt;/h5&gt;

    &lt;p&gt;수평 스케일.
기존의 서버와 같은 사양 또는 비슷한 사양의 서버 대수를 증가 시키는 방법.
스케일 업보다는 다소 유연하지만, 병렬 구조된 서버의 데이터 동기화 및 세션 공유에 대한 고민이 필요.
Ex) 접속 하는 세션의 수가 급속도로 증가한다면 스케일 아웃이 유리할 수도, 하지만 스케일 업의 비용이 더욱 저렴하거나 하다면 스케일 업을 하는 것도 방법일 수 있음.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;solid&quot;&gt;SOLID&lt;/h3&gt;

&lt;p&gt;객체지향의 5대 원칙.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- SRP(Single Resposibility Principle) - 단일 책임 원칙&lt;/strong&gt;
하나의 객체는 하나의 책임을 가지도록 설계되어야 한다는 원칙.
ViewController -&amp;gt; ButtonEventListener의 예제.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- OCP(Open-Closed Principle) - 개방 폐쇄 원칙&lt;/strong&gt;
확장에는 열려있지만 변경에는 닫혀있어야 한는 원칙. 즉, 최한의 변경으로 확장이 가능해야 함.
ButtoneEvenListener가 여러가지 타입의 버튼을 가지게 추가되는 예제.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- LSP(Liskov Substitution Principle) - 리스코프 치환의 원칙&lt;/strong&gt; (계약에 의한 원칙)
하위 클래스로의 변환이 자유로워야 하며, 상위 클래스의 객체에서 제공하는 메소드는 하위 클래스 객체에서 항상 같은 동작을 해야한다.
Rectangle -&amp;gt; Sqaure 를 직사각형에서 제공하는 SetHeigh()등의 메소드에 위배될 수 있음.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- ISP(Interface Segregation Principle) - 인터페이스 분리의 원칙&lt;/strong&gt;
클라이언트는 자기가 디펜던시를 가지는 인터페이스에만 의존을 해야함.
Component -&amp;gt; Button, Modal의 경우 Modal의 변경이 생기면 Button도 변경해야함.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- DIP(Dependency Inversin Principle) - 의존 역전 원칙&lt;/strong&gt;
고수준의 모듈의 저수준의 모듈을 의존하는 것이 아닌, 저수준의 모듈이 고수준의 모듈을 의존해야함.
그래야 확장에 유연한 구조가 되며, 단일 책임을 지킬 수 있음.&lt;/p&gt;

&lt;h3 id=&quot;spring-aop&quot;&gt;Spring AOP&lt;/h3&gt;

&lt;p&gt;관점 지향 프로그래밍.&lt;/p&gt;

&lt;p&gt;어떤 로직을 핵심적인 관점, 부가적인 관점으로 나누어보고 프로그래밍을 하겠다는 것.&lt;/p&gt;

&lt;p&gt;각 클래스 별로 흩어진 로직을 Aspect로 모듈화 하고, 비즈니스 로직에서는 분리하겠다는 것.&lt;/p&gt;

&lt;p&gt;ex) @transactional, logging을 위한 것을 추가하고자 할 때.&lt;/p&gt;

&lt;h3 id=&quot;spring-filter-vs-interceptor&quot;&gt;Spring Filter vs Interceptor&lt;/h3&gt;

&lt;p&gt;Filter : Request가 들어온 후 DispatcherServlet으로 요청이 전달되기 전에 호출되는 것. 요청과 응답을 가로채는 것.&lt;/p&gt;

&lt;p&gt;Interceptor :  DispatcherServlet으로 요청을 받은 후 컨트롤러의 전달 전에 호출되는 것. 요청의 작업 전후를 가로채는 것.&lt;/p&gt;

&lt;h3 id=&quot;spring-ioc-di-dl&quot;&gt;Spring IOC, DI, DL&lt;/h3&gt;

&lt;h5 id=&quot;ioc-inversion-of-control&quot;&gt;IOC (Inversion of Control)&lt;/h5&gt;

&lt;p&gt;제어의 역전이라 부르며, 컨테이너가 등장하면서 객체의 생성 및 관리의 역할이 컨테이너로 위임된 것을 의미함.&lt;/p&gt;

&lt;h5 id=&quot;dl-dependeny-lookup&quot;&gt;DL (Dependeny Lookup)&lt;/h5&gt;

&lt;p&gt;의존 대상을 검색을 통해 반환 받는 방식.  ex) (Bean Factory )factory.getBean(id), ApplicationContext&lt;/p&gt;

&lt;h5 id=&quot;di-dependency-injection&quot;&gt;DI (Dependency Injection)&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;Setter : 클래스 사이의 의존 관를 연결하기 위해 Setter메소드를 사용. 객체를 생성한 후 Set을 호출하지 않으면 디펜던시가  null로 되어있는 상태로 nullPointer가 발생할 수 있지만, 생성자를 통해 주입받아야 할 객체가 너무 많을 때 유용.&lt;/li&gt;
  &lt;li&gt;Constructor : (가장 추천) 클래스 사이의 의존 관계를 연결시키기 위하여 constructor를 사용. 컴포넌트로 항상 의존성을 전달. 생성을 하면서 의존을 모두 주입받음으로써, 의존 관계가 명확해짐. 즉 SRP를 지키기 쉬워짐.&lt;/li&gt;
  &lt;li&gt;Method : 어떤 메소드의 실행을 다른 메소드로 대체하거나 메소드의 리턴형을 추상 클래스로 지정 후 필요에 따라 추상클래스의 구현체를 리턴하도록 구현.&lt;/li&gt;
  &lt;li&gt;Variable : @Autowried&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;autowired&quot;&gt;@Autowired&lt;/h5&gt;

&lt;p&gt;@Component가 붙은 클래스들 중 빈을 찾아서 인젝션 해줌. 인젝션 할 수 있는 클래스형은 반드시 하나여야함.
여러개의 클래스 타입으로 상속 구현 클래스가 발생했다면 ? @Primary를 부여하거나 @Qulifier를 사용.&lt;/p&gt;

&lt;h5 id=&quot;component&quot;&gt;@Component&lt;/h5&gt;

&lt;p&gt;@Controller : 스프링 MVC용.
@Service : 서비스용. @Component와 동일.
@Repository: 데이터 엑세스를 위한용.
@Configuration: 설정용.&lt;/p&gt;

&lt;h3 id=&quot;spfing-mvc&quot;&gt;Spfing MVC&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;클라이언트가 서버에 요청을 하면 스프링에서 제공하는 DispatcherServlet라는 클래스가 요청을 가로챔.&lt;/li&gt;
  &lt;li&gt;DispatcherServlet은 어떤 컨트롤러에게 요청을 위임할지 HandlerMappding을 통해 판단.&lt;/li&gt;
  &lt;li&gt;매핑된 컨트롤러가 있다면 @RequestMapping을 통하여 처리 메소드를 수행.&lt;/li&gt;
  &lt;li&gt;컨트롤러는 Service를 주입받아 서비스 내 처리메소드를 수행.&lt;/li&gt;
  &lt;li&gt;Service는 비즈니스 로직을 주로 수행하며, 디비 접근이 필요한 경우 Dao를 주입받아 디비 처리는 위임.&lt;/li&gt;
  &lt;li&gt;Dao는 ORM을 통해 디비작업을 수행한 후 서비스에게 결과를 리턴&lt;/li&gt;
  &lt;li&gt;모든 로직을 끝낸 서비스는 컨트롤러에게 결과를 리턴&lt;/li&gt;
  &lt;li&gt;컨트롤러는 Model객체에 결과의 응답페이지를 어떻게 보여줄지의 정보를 담아서 DispatcherServlet에게 전달.&lt;/li&gt;
  &lt;li&gt;ViewResolver는 해당 View를 찾아 DispatcherSevlet에게 전달.&lt;/li&gt;
  &lt;li&gt;DispatcherServlet은 응답할 View에 렌더를 지시하고 View는 응답 로직을 처리.&lt;/li&gt;
  &lt;li&gt;DispatcherServlet이 클라이언트에게 렌더링된 View를 응답.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;static&quot;&gt;Static&lt;/h3&gt;

&lt;p&gt;메모리 사용에 이점. 데이터 공유의 개념.&lt;/p&gt;

&lt;p&gt;method : 클래스 객체를 생성하지 않고, 클래스 명으로 접근이 가능한 메소드를 생성함.&lt;/p&gt;

&lt;p&gt;variable : 클래스의 객체들이 공유하는 변수로 생성됨.&lt;/p&gt;

&lt;h3 id=&quot;string-string-buffer-stringbuilder&quot;&gt;String, String Buffer, StringBuilder&lt;/h3&gt;

&lt;p&gt;String은 문자열을 저장하기 위한 자바의 타입으로써 유일하게 new 생성자를 통하지 않고 객체를 생성하는 Reference Type.
String은 자바에서 기본연산 중 “+”연산을 제공함.
하지만 스트링 객체의 “+” 연산을 사용하게 되면, 해당 기존 객체의 재사용성이 떨어지게 됨.
따라서 String Buffer와 String Builder가 생김.
두 클래스 모두 문자열을 다루기 때문에 CharSequence를 구현하고, 문자열의 더하기 연산을 위한 목적은 같지만, String Buffer는 Thread Safe하고 String Builder는 Thread Safe하지 않음.
그러므로 여러 쓰레드에서 한 변수의 접근을 통하여 값의 연산을 하는 경우에는 StringBuilder가 아닌 StringBuffer를 사용하는 것이 좋음.&lt;/p&gt;

&lt;h3 id=&quot;sync-vs-async-and-blocking-vs-non-blocking&quot;&gt;Sync vs Async And Blocking vs Non-Blocking&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Sync vs Async (순서)&lt;/p&gt;

    &lt;p&gt;Sync는 작업의 순서를 보장. Ex) A, B, C 순서로 호출 했다면, A, B, C 순서로 작업이 완료.
ASync는 작업의 순서를 보장하지 않음. Ex) A, B, C 순서로 호출했어도, 호출의 순서대로 완료되지 않을 수 있음.
Java에서 Sync처리는 CompletableFuture로 처리함.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Blocking vs Non-Blocking(통지)&lt;/p&gt;

    &lt;p&gt;Blocking은 작업이 끝날때 까지 대기하다가 즉석에서 완료 통지를 받음.
Non-Blocking은 작업의 완료를 나중에 통지 받음.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;tddtest-driven-development&quot;&gt;TDD(Test Driven Development)&lt;/h3&gt;

&lt;p&gt;테스트를 먼저 만들고 테스트를 통과하기 위해 실제 코딩을 하는 것.
장 : 결함이 줄어들고, 코드복잡도가 떨어짐.
단 : 개발 시간이 증가하고, 적응하는 것에 시간이 걸림.&lt;/p&gt;

&lt;h3 id=&quot;thread&quot;&gt;Thread&lt;/h3&gt;

&lt;p&gt;Java에서는 Thread Class를 상속하거나 Runnable 클래스를 구현함으로써 구현 가능.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Runnable : 스레드가 실행되기 위한 준비 단계.&lt;/li&gt;
  &lt;li&gt;Running: CPU를 점유하여 실행하고 있는 상태.&lt;/li&gt;
  &lt;li&gt;Dead : 스레드 실행 완료 상태.&lt;/li&gt;
  &lt;li&gt;Blocked: CPU 점유를 상실한 상태&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Object Locking : Shared Resource에 접근하기 위하여 각 스레드가 Lock을 획득 하기 위해 대기하게 되면서 시간이 길어지면 Hang이 걸린 것 처럼 보임.&lt;/p&gt;

&lt;h3 id=&quot;-vs-equals&quot;&gt;== vs equals&lt;/h3&gt;

&lt;p&gt;Java 에서 == 는 stack에 저장된 주소 값 또는 값을 비교하는 연산자이며, equals는 실제 객체의 값이 동일한지를 비교한다.
따라서 stack에 주소 값이 저장되지 않고 실제 값이 저장되는 prmitive type의 변수들에 대해서는 실 ==와 각 타입의 Wrapping class를 통해 equals로 값을 비교해도 값의 비교를 확인할 수 있다. 하지만 new 생성자를 통해 Reference 타입의 객체를 생성하는 경우에는 stack에 주소 값이 저장되고 실제 각 객체의 값의 디테일은 Heap에 저장되므로 클래스별 equals 메소드 오버라이딩을 통해 각 객체의 밸류가 정말 동일한지 확인할 수 있는 구현이 필요하다.&lt;/p&gt;
</description>
        <pubDate>Sun, 18 Aug 2019 12:10:00 +0000</pubDate>
        <link>https://woonis.github.io/spring/Study/</link>
        <guid isPermaLink="true">https://woonis.github.io/spring/Study/</guid>
        
        
        <category>Spring</category>
        
      </item>
    
      <item>
        <title>God of Java #2</title>
        <description>&lt;h1 id=&quot;god-of-java-2&quot;&gt;God of Java #2&lt;/h1&gt;

&lt;h2 id=&quot;1-api&quot;&gt;1. API&lt;/h2&gt;

&lt;p&gt;API : Application Programming Interface&lt;/p&gt;

&lt;p&gt;많은 클래스를 사용할 때 참조하는 문서.&lt;/p&gt;

&lt;h5 id=&quot;deprecated&quot;&gt;Deprecated&lt;/h5&gt;

&lt;p&gt;문제를 야기시키거나 혼동을 가져오거나 더이상 사용가치가 없을 때 호환성을 유지하기 위하여 사용.&lt;/p&gt;

&lt;p&gt;Deprecated된 메소드나 생성자는 사용하지 않는 것이 좋음.&lt;/p&gt;

&lt;h2 id=&quot;2-string&quot;&gt;2. String&lt;/h2&gt;

&lt;p&gt;클래스 중에더 유일하게 더하기 연산을 제공하는 클래스.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Serializeable&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Comparable&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CharSequence&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;final class이기 때문에 상속이 불가한 클래스&lt;/li&gt;
  &lt;li&gt;모든 클래스의 부모 클래스는 Object클래스 이므로 이외의 별도로 확장한 클래스는 없음.&lt;/li&gt;
  &lt;li&gt;Serializeable : 객체를 파일로 저장하거나 다른 서버에 전송이 가능하도록 함. 구현해야 하는 메소드가 하나도 없는 인터페이스.&lt;/li&gt;
  &lt;li&gt;Comparable : 객체의 값을 비교가 가능하게 만듬. compareTo() 메소드가 존재.&lt;/li&gt;
  &lt;li&gt;CharSequence: 문자열을 다루기 위한 클래스를 명시적으로 나타냄.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;캐릭터-셋&quot;&gt;캐릭터 셋&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;ISO-8859-1 : ISO 라틴 알파벳&lt;/li&gt;
  &lt;li&gt;UTF-8 : 8비트 UCS 변환 포맷&lt;/li&gt;
  &lt;li&gt;MS949: MS에서 만든 한글 확장 완성형 인코딩&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;잘못된 캐릭터 셋으로 변환을 하면 알 수 없는 문자로 변환이 되기도 함으로, 캐릭터 셋을 잘 지정하고 변환할 것.&lt;/p&gt;

&lt;h5 id=&quot;null-check&quot;&gt;NULL Check&lt;/h5&gt;

&lt;p&gt;어떤 참조 자료형도 null이 될 수 있음.&lt;/p&gt;

&lt;p&gt;객체가 널이라는 말은 아무런 초기화가 되어있지 않으며, 클래스에 선언되어 있는 어떤 메소드도 사용이 불가한 상태.&lt;/p&gt;

&lt;h5 id=&quot;string-method&quot;&gt;String Method&lt;/h5&gt;

&lt;p&gt;length() : 문자열의 길이를 확인.&lt;/p&gt;

&lt;p&gt;isEmpty() : 문자열이 비어있는지 확인.&lt;/p&gt;

&lt;p&gt;equals(): 문자열이 같은지 비교.&lt;/p&gt;

&lt;p&gt;contains() : 문자열을 포함하고 있는지 확인.&lt;/p&gt;

&lt;p&gt;startwith() / endswith(): 문자열이 특정 문자열로 시작하거나 끝나는지 확인.&lt;/p&gt;

&lt;p&gt;substring() : 문자열을 자르기 위함. 시작할 인덱스와 자를 범위의 인덱스를 매개변수로 전달.&lt;/p&gt;

&lt;p&gt;split(): 문자열을 특정 캐릭터나 정규표현식으로 나눔.&lt;/p&gt;

&lt;p&gt;concat(): 문자열을 합침.&lt;/p&gt;

&lt;p&gt;trim(): 문자열의 좌/우 공백을 제거함.&lt;/p&gt;

&lt;p&gt;replace() / replaceAll(): 문자열을 대체함.&lt;/p&gt;

&lt;p&gt;format(): %s-문자열, %d-정수형, %f-소숫점이 있는 수, %%-%&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;안녕하세요. 저는 %s이며, %d살 입니다.&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Wooni&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;valueOf(): 기본 자료형을 문자열로 변환하는 메소드. String으로 변환만하고 문자열을 합치는 과정을 하지 않을 경우 권장. 참조 자료형의 경우 NullPointerException이 발생할 수 있기때문에 toString()보다 valueOf()의 사용을 권장.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Integer&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;valueOf&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 0&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;valueOf&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// null&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;test2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;test2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// occur Null Pointer Exception.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;intern(): 절대 사용하지 말아야할 메소드. pool에 재사용이 가능한 객체가 있는지 확인하고, 해당 객체가 있으면 그 객체의 주소 값을 리턴함. 즉 같은 값을 가지는 객체는 같은 주소값을 가질 수 있도록 하는 메소드.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Regular Expression : 이메일을 점검하거나 URL을 점검하는 등의 특정 문자의 포맷을 공식에 따라 만든 식.&lt;/li&gt;
  &lt;li&gt;정규표현식으로 문자열을 나누려면 split을, 특정 문자열로 나누려면 StringTokenizer를 사용하는 것이 좋음.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;stringbuffer-and-stringbuilder&quot;&gt;StringBuffer and StringBuilder&lt;/h5&gt;

&lt;p&gt;String의 더하기 연산을 해야하는 경우 한 String변수의 값을 더하면 이전 값을 사용할 수 없어짐.&lt;/p&gt;

&lt;p&gt;StringBuffer는 Thread Safe하지만 StringBuilder는 ThreadSafe하지 않음.&lt;/p&gt;

&lt;p&gt;StringBuilder 하나의 메소드 내에서 문자열을 생성하여 더할 경우.
StringBuffer는 어떤 클래스 변수로 문자열을 더하기 위한 문자열이 선언되어있고, 여러 쓰레드에서 이 변수를 동시에 접근해야 하는 경우.&lt;/p&gt;

&lt;p&gt;두 클래스 모두 문자열을 다루기때문에 CharSequence 인터페이스를 구현했음.&lt;/p&gt;

&lt;h2 id=&quot;3-javalang&quot;&gt;3. Java.lang&lt;/h2&gt;

&lt;p&gt;Java.lang은 별도의 import를 하지 않고도 사용할 수 있음.&lt;/p&gt;

&lt;h5 id=&quot;oomout-of-memory-vs-stackoverflowerror&quot;&gt;OOM(Out Of Memory) vs StackOverflowError&lt;/h5&gt;

&lt;p&gt;OOM: 메모리가 부족하여 발생.&lt;/p&gt;

&lt;p&gt;StackOverflow: 호출된 메소드가 너무 많을때.&lt;/p&gt;

&lt;p&gt;Java에서 스택은 메소드의 호출 순서나 메소드내의 변수들의 대한 정보를 관리하고 실제 Heap에 객체를 가지는 주소 값을 참조하고 있음.&lt;/p&gt;

&lt;p&gt;기본 자료형은 Heap이 아닌 Stack에 저장되어 관리.&lt;/p&gt;

&lt;h5 id=&quot;number를-확장하는-기본-자료형의-wrapper-class&quot;&gt;Number를 확장하는 기본 자료형의 Wrapper Class&lt;/h5&gt;

&lt;p&gt;자바 컴파일러에서 자동으로 형변환을 하기 때문에 겉보기로는 참조 자료형이지만 기본자료형처럼 사용 가능.&lt;/p&gt;

&lt;p&gt;Character를 제외하고 문자열 값을 기본 자료형으로 리턴하는 parse()와 참조자료형으로 리턴하는 valueOf()라는 static 메소드를 제공함.&lt;/p&gt;

&lt;p&gt;각 Wrapper Class는 클래스 변수로 Min과 Max값을 가지고 있음.&lt;/p&gt;

&lt;p&gt;돈계산과 같이 중요한 계산을 하는 경우에는 BigInteger나 BigDecimal을 사용해야 정확한 계산이 가능.&lt;/p&gt;

&lt;h5 id=&quot;각종-정보를-확인하기-위한-system-class&quot;&gt;각종 정보를 확인하기 위한 System Class&lt;/h5&gt;

&lt;p&gt;System에는 3개의 클래스 변수가 선언되어 있음.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;static PrintStream err : 에러 및 오류 출력&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;static InputStream in: 입력 값을 처리&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;static PrintStream out: 출력 값을 처리.&lt;/p&gt;

    &lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cm&quot;&gt;/* 
   System : class이름
   out: System class내 static변수
   println(): PrintStream 클래스에서 출력을 위해 제공하는 static 메소드.
*/&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;절대-사용하지-말아야할-system클래스의-메소드&quot;&gt;절대 사용하지 말아야할 System클래스의 메소드&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;gc() : gc()를 명시적으로 호출.&lt;/li&gt;
  &lt;li&gt;runFinalization(): Object에 선언되어있는 finalize()메소드를 호출하는 메소드.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;-&amp;gt; JVM에서 보통 자신의 참조하는 객체가 없으면 자동으로 수행되기 때문에 개발자가 명시적으로 호출할 필요가 없음.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;exit() : 어플리케이션을 강제로 종료하는 메소드.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;system-class내의-currenttimemillis-vs-nanotime&quot;&gt;System Class내의 currentTimeMillis() vs nanoTime()&lt;/h5&gt;

&lt;p&gt;currentTimeMillis()는 현재 시간을 나타날때 사용.&lt;/p&gt;

&lt;p&gt;nanoTime()은 시간의 차이를 계산할 때 사용.&lt;/p&gt;

&lt;h5 id=&quot;javalang의-math와-strictmath&quot;&gt;Java.lang의 Math와 StrictMath&lt;/h5&gt;

&lt;p&gt;Math는 시스템의 따라 결과가 달라질 수 있지만 StrictMath는 환경에 상관없이 동일한 값을 리턴.&lt;/p&gt;

&lt;p&gt;Math는 대부분 StrictMath클래스의 메소드를 호출하도록 되어있고, StrictMath는 Native로 선언되어 있음.&lt;/p&gt;

&lt;h2 id=&quot;4-실수를-방지하기-위한-generic&quot;&gt;4. 실수를 방지하기 위한 Generic.&lt;/h2&gt;

&lt;h5 id=&quot;junit&quot;&gt;Junit&lt;/h5&gt;

&lt;p&gt;메소드나 클래스 같은 작은 단위 테스를 쉽게할 수 있는 프레임 워크.&lt;/p&gt;

&lt;h5 id=&quot;generic은-사전에-형변환의-문제점을-방지하기-위함&quot;&gt;Generic은 사전에 형변환의 문제점을 방지하기 위함.&lt;/h5&gt;

&lt;p&gt;여기서 사전이라는 의미는 실행시 예외가 발생하는 것이 아니라, 컴파일 시에 점검할 수 있도록 하는 것.&lt;/p&gt;

&lt;p&gt;&amp;lt;&amp;gt;안에는 현존하는 클래스를 사용해도 되고, 존재하지 않는 클래스를 사용해도 됨. 즉 가상의 타입 이름이라고 생각하면 됨.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;GenericTest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Serializeable&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;testObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;setObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;testObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;testObject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;testObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(){&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;testObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;GenericTest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GenericTest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;();&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;abc&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;	&lt;span class=&quot;c1&quot;&gt;/// &quot;abc&quot;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;E: 요소&lt;/li&gt;
  &lt;li&gt;K: 키&lt;/li&gt;
  &lt;li&gt;N: 숫자&lt;/li&gt;
  &lt;li&gt;T: 타입&lt;/li&gt;
  &lt;li&gt;V: 값&lt;/li&gt;
  &lt;li&gt;S,U,V: 2,3,4번째 선언된 타입.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;generic의-는-뭐지&quot;&gt;Generic의 ?는 뭐지&lt;/h5&gt;

&lt;p&gt;whilecard라고 부르며, 어떤 타입이 제네릭 타입이 되더라도 상관 없을 때.&lt;/p&gt;

&lt;p&gt;?로 명시적 타입을 받은것이 아니기 때문에 받은 값은 Object로만 처리해야함.&lt;/p&gt;

&lt;p&gt;어떤 객체는 wildcard로 선언하고, 그 객체의 값을 가져올 수는 있지만 타입으로 값을 지정하는것은 불가능.&lt;/p&gt;

&lt;p&gt;상속이 된 객체만을 받기위해서는 &amp;lt;T extends “parent class”&amp;gt;로 범위를 한정지을 수도 있음.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;GenericTest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Serializeable&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;testObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;setObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;testObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;testObject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;testObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(){&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;testObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;GenericTest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GenericTest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;();&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;genericMethod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;abc&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// 객체의 값을 추가하는 방법.&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;genericMethod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GenericTest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;addedValue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addedValue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;/// &quot;abc&quot;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;5-collection---list&quot;&gt;5. Collection - List&lt;/h2&gt;

&lt;p&gt;Data Structure - 자료 구조 : 어떤 정보를 담는 것. 하나의 데이터가 아닌 여러 데이터를 담을 때. Ex) 배열, 리스트, 큐, 맵&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;List: 순서가 있는 목록&lt;/li&gt;
  &lt;li&gt;Set: 순서와 중복이 없는 목록&lt;/li&gt;
  &lt;li&gt;Queue: 먼저 들어온 것이 먼저가는 목록&lt;/li&gt;
  &lt;li&gt;Map: Key-Value의 쌍의 목록&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Collection&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Iterabla&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Iterable의 상속 받았기 때문에 반복을 하는 iterator(), hasNext(), next(), remove() 메소드 구현이 필요.&lt;/p&gt;

&lt;h5 id=&quot;arraylist&quot;&gt;ArrayList&lt;/h5&gt;

&lt;p&gt;한가지 종류의 객체를 저장할때.&lt;/p&gt;

&lt;p&gt;만일 여러 종류의 객체가 필요하다면? DTO를 만들어서 하나의 객체로 담음.&lt;/p&gt;

&lt;p&gt;아무런 값의 선언이 없이 생성자를 호출하면 기본 크기는 10으로 만들어짐.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;add(): 값을 추가할때.&lt;/li&gt;
  &lt;li&gt;addAll(): 컬렉션의 값들을 한번에 추가할때&lt;/li&gt;
  &lt;li&gt;size(): 배열에 담겨져있는 객체들의 사이즈. 배열의 length는 선언된 크기를 의미.&lt;/li&gt;
  &lt;li&gt;toArray(): 리스트를 배열로 변환할때.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;arraylist-vs-vector&quot;&gt;ArrayList vs Vector&lt;/h5&gt;

&lt;p&gt;ArrayList는 Thread Safe하지 않지만, Vector는 Thread Safe함.&lt;/p&gt;

&lt;h5 id=&quot;stackfifo--first-input-last-out&quot;&gt;Stack(FIFO : First Input Last Out)&lt;/h5&gt;

&lt;p&gt;목록에서 가장 처음들어간 값이 가장 마지막으로 나옴.&lt;/p&gt;

&lt;h2 id=&quot;6-set-and-queue&quot;&gt;6. Set And Queue&lt;/h2&gt;

&lt;h5 id=&quot;set&quot;&gt;Set?&lt;/h5&gt;

&lt;p&gt;순서에 상관 없이, 데이터가 존재하는지 확인하는 용도. 중복을 방지하면서, 원하는 값이 포함되어 있는지 확인.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;HashSet: 데이터의 순서가 전혀 필요 없음.&lt;/li&gt;
  &lt;li&gt;TreeSet: 데이터의 값에 따라 red-black 정렬.&lt;/li&gt;
  &lt;li&gt;LinkedHashSet: 저장된 순서에 따라 값이 정렬.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;로드-팩터&quot;&gt;로드 팩터&lt;/h5&gt;

&lt;p&gt;로드 팩터 = 데이터의 개수 / 저장공간.&lt;/p&gt;

&lt;p&gt;로드팩터가 증가하게되면, 저장 공간의 크기가 증가하기 때문에 재정리 작업이 필요해짐.&lt;/p&gt;

&lt;p&gt;HashSet의 값은 For문을 돌면서 꺼낼 수 있음.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;temp:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;carSet&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;temp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이외에도 contains()를 통해 값이 존재하는지, remove()를 통해 값을 삭제할 수 있음.&lt;/p&gt;

&lt;h5 id=&quot;queuelifo--list-in-first-out&quot;&gt;Queue(LIFO : List In First Out)&lt;/h5&gt;

&lt;p&gt;LinkedList에 A를 넣으면 A는 시작이자 끝.&lt;/p&gt;

&lt;p&gt;다음으로 B를 넣으면 리스트의 시작은 A이고, 끝은 B임.&lt;/p&gt;

&lt;p&gt;다음으로 C를 넣으면, 시작은 A 끝은 C 그리고 B의 다음은 C임. 하지만 A는 B의 다음이 어떤 값인지 모르고, C역시 B의 앞이 누구인지 모름.&lt;/p&gt;

&lt;p&gt;따라서 큐는 마지막의 들어온 값을 먼저 빼내면서, 리스트를 소비하고 싶을때 사용.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;push(): 리스트의 앞에 값을 추가.&lt;/li&gt;
  &lt;li&gt;add(), offer(), set(): 리스트의 뒤에 값을 추가.&lt;/li&gt;
  &lt;li&gt;peek(): 맨앞 데이터를 리턴.&lt;/li&gt;
  &lt;li&gt;get(): 값을 가져옴.&lt;/li&gt;
  &lt;li&gt;pop(): 리스트의 가장 뒤에 있는 값을 삭제하고 리턴.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;7-map&quot;&gt;7. Map&lt;/h2&gt;

&lt;h1 id=&quot;참조&quot;&gt;참조&lt;/h1&gt;

&lt;p&gt;자바의 신 VOL.2 - 이 상민 지음&lt;/p&gt;
</description>
        <pubDate>Sun, 14 Jul 2019 12:10:00 +0000</pubDate>
        <link>https://woonis.github.io/java/developer/God-of-Java-2/</link>
        <guid isPermaLink="true">https://woonis.github.io/java/developer/God-of-Java-2/</guid>
        
        
        <category>Java</category>
        
        <category>Developer</category>
        
      </item>
    
      <item>
        <title>God of Java #1</title>
        <description>&lt;h1 id=&quot;god-of-java-1&quot;&gt;God of Java #1&lt;/h1&gt;

&lt;h2 id=&quot;1-프로그래밍이란-무엇인가&quot;&gt;1. 프로그래밍이란 무엇인가?&lt;/h2&gt;

&lt;p&gt;사람과 컴퓨터 사이의 언어&lt;/p&gt;

&lt;h5 id=&quot;자바의-가장-작은-단위는-클래스&quot;&gt;자바의 가장 작은 단위는 클래스&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;public : 접근제어자&lt;/li&gt;
  &lt;li&gt;class : 클래스 선언을 나타내는 예약어&lt;/li&gt;
  &lt;li&gt;DoorLockManager : 클래스 이름&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;클래스는-상태와-행위를-가진다&quot;&gt;클래스는 상태와 행위를 가진다.&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;상태 : 클래스의 특성을 결정짓는 것.&lt;/li&gt;
  &lt;li&gt;행동 : Method
메소드는 어떤 값을 주고 결과값을 돌려받는 것.
void - 메소드의 결과 값이 없을 때 사용하는 예약어&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;-은-무엇인가요&quot;&gt;= 은 무엇인가요?&lt;/h5&gt;

&lt;p&gt;변수에 어떤 값을 할당 할 때 쓰는 연산자.&lt;/p&gt;

&lt;h5 id=&quot;자바에서는-문장의-끝을-나타낼-때-을-사용한다&quot;&gt;자바에서는 문장의 끝을 나타낼 때 “;”을 사용한다.&lt;/h5&gt;

&lt;h2 id=&quot;2-hello-basic-java&quot;&gt;2. Hello Basic Java&lt;/h2&gt;

&lt;p&gt;자바는 대소문자를 중요하게 구분하는 언어.&lt;/p&gt;

&lt;h5 id=&quot;컴파일이-뭐예요&quot;&gt;컴파일이 뭐예요?&lt;/h5&gt;

&lt;p&gt;텍스트 파일을 작성한 것을 JVM이 실행가능한 파일로 변환하는 것. 자바 프로그램 자체적으로는 텍스트로 된 파일을 실행 할 수 없기때문에, “.java”라는 확장자의 파일을 컴파일하면 “.class” 파일로 변환한 후 실행함.&lt;/p&gt;

&lt;h5 id=&quot;main&quot;&gt;main()?&lt;/h5&gt;

&lt;p&gt;java명령으로 프로그램을 실행하면 기본적으로 가장 처음 실행되는 함수.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Public static void main(String[] args) {}&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;주석&quot;&gt;주석?&lt;/h5&gt;

&lt;p&gt;컴파일은 되지 않으면서, 작업에 대한 내용 공유나 히스토리 공유를 위해 남기는 부가 설명.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;// - 한줄 주석&lt;/li&gt;
  &lt;li&gt;/* - 블록 주석&lt;/li&gt;
  &lt;li&gt;/** - 문서용 주석&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;3-객체는-무엇인가요&quot;&gt;3. 객체는 무엇인가요?&lt;/h2&gt;

&lt;p&gt;자바는 객체 지향 언어.&lt;/p&gt;

&lt;h5 id=&quot;클래스-vs-객체&quot;&gt;클래스 vs 객체&lt;/h5&gt;

&lt;p&gt;클래스 : 사물을 상태와 행동으로 정의한 명세 ex) 차&lt;/p&gt;

&lt;p&gt;객체 : 실제 사물 ex) 우니의 차, 크레용의 차. - 생성자를 통해 생성&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Person&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// class&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  
  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;speak&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(){&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;my name is&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Person&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wooni&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Person&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// wooni is instance.&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;wooni&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;speack&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;4-정보를-담는-공간&quot;&gt;4. 정보를 담는 공간&lt;/h2&gt;

&lt;p&gt;변수 : 값이 변하는 수. 내용을 어디에 담기 위한 공간을 말함.&lt;/p&gt;

&lt;h5 id=&quot;지역-변수&quot;&gt;지역 변수&lt;/h5&gt;

&lt;p&gt;{ } 영역 범위 내에서의 공유하는 변수.&lt;/p&gt;

&lt;h5 id=&quot;매개-변수&quot;&gt;매개 변수&lt;/h5&gt;

&lt;p&gt;함수의 호출을 할때 넘겨주는 변수.&lt;/p&gt;

&lt;h5 id=&quot;인스턴스-변수&quot;&gt;인스턴스 변수&lt;/h5&gt;

&lt;p&gt;클래스 안에 선언된 변수(클래스 상태)&lt;/p&gt;

&lt;h5 id=&quot;클래스-변수&quot;&gt;클래스 변수&lt;/h5&gt;

&lt;p&gt;static이라는 변수로 선언되어 클래스 객체들이 공유하는 변수&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Person&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// class&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// instance&lt;/span&gt;
  
  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;speack&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sentence&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;// parameter) {&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;louder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// local&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;자바에는-기본-자료형과-참조-자료형이-있다&quot;&gt;자바에는 기본 자료형과 참조 자료형이 있다.&lt;/h5&gt;

&lt;p&gt;기본자료형 : Bsil FD - Byte, Short, Int, Long, Float, Double, Boolean, char&lt;/p&gt;

&lt;p&gt;new 연산자를 통해 객체를 초기화 하면 참조 자료형이다. 단 하나 “String”을 빼고.&lt;/p&gt;

&lt;h2 id=&quot;5-계산을-해볼까요&quot;&gt;5. 계산을 해볼까요?&lt;/h2&gt;

&lt;p&gt;대입 연산자 : =&lt;/p&gt;

&lt;p&gt;더하기, 빼기, 곱하기, 나누기, 나머지 연산자 : +,-,*,/,% :&lt;/p&gt;

&lt;p&gt;단항 연산자 : +,-,++,—,!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;++, —가 변수의 앞과 뒤에서의 차이 - 해당 줄을 실행하기 전에 값을 계산할지 아님 줄을 실행 한 후 값을 계산할지.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;calculate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 1&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(++&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 3&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;등가 비교 연산자 : ==,!=&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;기본자료형은 같은 타입형끼리만 비교가 가능, 참조 자료형의 경우 주소값이 같은지 확인함.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;대소 비교 연산자 : &amp;gt;=, &amp;lt;=, &amp;lt;, &amp;gt;&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;논리 연산자 : “&amp;amp;&amp;amp;, ||, &amp;amp;,&lt;/td&gt;
      &lt;td&gt;”&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;table&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;“&amp;amp;&amp;amp;,&lt;/td&gt;
          &lt;td&gt; &lt;/td&gt;
          &lt;td&gt;“는 계산의 결과를 좌에서 우로 읽으며 하나라도 조건을 충족하면 이후를 보지 않지만, &amp;amp;와&lt;/td&gt;
          &lt;td&gt;는 모두 계산을 한 후 결과를 리턴함.&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;number&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;isOdd&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;number&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;number&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;삼항 연산자 : ? - (조건) ? 참 값 : 거짓 값&lt;/p&gt;

&lt;p&gt;형변환 : 변수의 자료형을 변경하고 싶을 때 괄호로 묶어서 사용. ex) long a; a = (int) a;
-&amp;gt; boolean / 기본-&amp;gt;참조 &amp;amp; 참조-&amp;gt;기본은 절대 형변환이 되지 않음.&lt;/p&gt;

&lt;h2 id=&quot;6-조건과-반복&quot;&gt;6. 조건과 반복&lt;/h2&gt;

&lt;h5 id=&quot;조건--if-if-and-else-if-and-else-and-if-else&quot;&gt;조건 : If, If and Else, If and Else and If else&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;if : 조건문의 예약어&lt;/li&gt;
  &lt;li&gt;(조건) : boolean 결과 타입의 조건.&lt;/li&gt;
  &lt;li&gt;{ 조건이 참일때의 처리 문장 }&lt;/li&gt;
  &lt;li&gt;else if (조건) : 두번째 조건&lt;/li&gt;
  &lt;li&gt;{ 두번째 조건이 참일때의 처리문장 }&lt;/li&gt;
  &lt;li&gt;else : 모든 조건에 해당하지 않을 때&lt;/li&gt;
  &lt;li&gt;{ 디폴트 처리 문장}&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;number&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;number&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;This is even&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;number&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;This is odd&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;This is not a number&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;타입별로-나누고-싶을-때--swith-case&quot;&gt;타입별로 나누고 싶을 때 : Swith case&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;switch : 예약어&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;(비교대상변수) : Enum을 비롯하여, long을 제외한 정수형과 몇몇 특별한 자료형만 들어갈 수 있음.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;case: 예약어&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;break: 해당 실행 영역을 빠져 나가고 싶을 때 사용&lt;/p&gt;

    &lt;p&gt;-&amp;gt; case이후 해당 break를 사용하지 않으면, 해당 조건 이외의 영역들도 실행이 될 수 있음.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;default: 조건문의 가장 디폴트 처리를 위한 예약어.&lt;/p&gt;

    &lt;p&gt;-&amp;gt; 중간에 적게되면 원치 않은 결과를 볼 수 있기때문에 항상 case를 다 적은 후 마지막이 적을 것.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;number&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;switch&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;This is even&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;This is odd&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;This is not a number&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;반복문--while-and-do-while&quot;&gt;반복문 : While and Do While&lt;/h5&gt;

&lt;p&gt;While은 0~반복 횟수 만큼, Do while은 최소 1~반복횟수 만큼 실행항.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;while : 반복을 위한 예약어&lt;/li&gt;
  &lt;li&gt;(조건) : boolean 결과 타입의 조건.&lt;/li&gt;
  &lt;li&gt;{ 처리문장} : 처리 문장.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sum&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;sum&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 55&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Do : 최소 1번의 실행을 위한 예약어&lt;/li&gt;
  &lt;li&gt;{ 처리문장 } : 실행 문장&lt;/li&gt;
  &lt;li&gt;while(조건); : 반복의 조건을 정의, 반드시 세미콜론을 적을 것.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sum&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;sum&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 55&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;가장-확실한-반복문--for&quot;&gt;가장 확실한 반복문 : For&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;For : for문을 위한 예약어&lt;/li&gt;
  &lt;li&gt;int i = 1 : 변수 초기화 부분 - for문에서 한 번 실행&lt;/li&gt;
  &lt;li&gt;i &amp;lt; 5 : 반복을 위한 조건문&lt;/li&gt;
  &lt;li&gt;i++ : 변수의 조건 반복을 위해 사용하는 인덱스의 증가 영역&lt;/li&gt;
  &lt;li&gt;{ 처리 문장 } : 반복 처리 될 문장.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sum&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;sum&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 55&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;7-배열이란&quot;&gt;7. 배열이란&lt;/h2&gt;

&lt;p&gt;한 변수에 여러개의 값을 넣을 수 있는 것을 배열이라고함.&lt;/p&gt;

&lt;h5 id=&quot;자료구조는-무엇인가요&quot;&gt;자료구조는 무엇인가요?&lt;/h5&gt;

&lt;p&gt;데이터를 저장하기 위한 구조. ex) 배열, 리스트, Queue, Stack등&lt;/p&gt;

&lt;p&gt;배열을 선언하기 위한 방법&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;[]를 통해 배열을 선언함 -&amp;gt; 타입과 변수명 사이 또는 변수명 끝.&lt;/li&gt;
  &lt;li&gt;{}를 통해 배열 초기화 후 선언. -&amp;gt; 절대 변경되지 않는 값을 선언하며, 각 값들은 공백이 없는 “,”로 이어짐.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;배열의 위치는 1이 아닌 0부터 시작한다!!&lt;/p&gt;

&lt;h5 id=&quot;arrayindexoutofexception&quot;&gt;ArrayIndexOutOfException&lt;/h5&gt;

&lt;p&gt;배열의 인덱스가 벗어난 범위의 값을 참조 하려고 하거나 그 인덱스의 값을 초기화 하려고 할때 발생하는 익셉션&lt;/p&gt;

&lt;p&gt;모든 참조자료형은 new를 통해서 초기화함&lt;/p&gt;

&lt;h5 id=&quot;배열을-출력하면&quot;&gt;배열을 출력하면?&lt;/h5&gt;

&lt;p&gt;[L : 해당 객체가 배열이라는 뜻&lt;/p&gt;

&lt;p&gt;S : 해당 배열이 스트링이라는 뜻, Long은 J, Boolean은 Z 나머지는 자신의 가장 첫번째 캐릭터 값&lt;/p&gt;

&lt;p&gt;@해시코드 값 : 배열의 주소 해시코드 값&lt;/p&gt;

&lt;h5 id=&quot;2차원-배열&quot;&gt;2차원 배열&lt;/h5&gt;

&lt;p&gt;int[] a[] 형식의 2차원 배열.&lt;/p&gt;

&lt;p&gt;배열의 1차 부분만 초기화 하고 2차 부분은 초기화 하지 않고 선언이 가능 ex) int[1] a[]&lt;/p&gt;

&lt;p&gt;하지만 2차 배열 부분에 접근하려 고할때 초기화 필요. ex) a[0] = int[10]&lt;/p&gt;

&lt;h5 id=&quot;또다른-for문의-형태&quot;&gt;또다른 For문의 형태&lt;/h5&gt;

&lt;p&gt;Index가 필요 없이 값 자체에만 접근을 하려고 하는 경우는&lt;/p&gt;

&lt;p&gt;for(타입 이름 임시변수명 : 반복대상 객체)의 for문을 통해 반복이 가능함.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;months&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;months&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;pringln&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;배열은-선언-시에-크기가-고정되어야-하기때문에-이런한-유동적인-크기의-객체의-배열을-위해-collection이-존재함&quot;&gt;배열은 선언 시에 크기가 고정되어야 하기때문에 이런한 유동적인 크기의 객체의 배열을 위해 Collection이 존재함.&lt;/h5&gt;

&lt;h2 id=&quot;8-참조-데이터-자료형&quot;&gt;8. 참조 데이터 자료형&lt;/h2&gt;

&lt;p&gt;기본 자료형 8가지를 제외한 나머지 자료형을 참조 자료형 이라고함.&lt;/p&gt;

&lt;p&gt;new를 통해서만 객체를 생성할 수 있음.&lt;/p&gt;

&lt;p&gt;생성자는 클래스 이름과 메소드의 이름이 똑같고 리턴타입이 존재 하지 않으며, 메소드의 최상단에 위치.&lt;/p&gt;

&lt;p&gt;기본 생성자는 생성자를 하나도 선언하지 않은 경우에 자동으로 생성됨. 즉, 생성자를 하나라도 선언한 경우에는 기본 생성자는 생성되지 않기 때문에 수동으로 생성이 필요.&lt;/p&gt;

&lt;p&gt;This는 매개변수와 객체 변수의 이름이 같을 때 객체 변수를 지정하려고 사용한다.&lt;/p&gt;

&lt;h5 id=&quot;메소드가-종료되는-조건&quot;&gt;메소드가 종료되는 조건&lt;/h5&gt;

&lt;p&gt;메소드가 끝나거나, return을 만나거나, 예외가 발생하거나&lt;/p&gt;

&lt;h5 id=&quot;static메소드와-일반-메소드의-차이&quot;&gt;static메소드와 일반 메소드의 차이.&lt;/h5&gt;

&lt;p&gt;static메소드는 객체를 생성하지 않고, 클래스 명으로만으로도 접근이 가능. 또한 static메소드에서는 static 필드만 접근이 가능함.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;StaticTextClass&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;INITIAL&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  
  &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getStatus&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(){&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;static--block&quot;&gt;static  block&lt;/h5&gt;

&lt;p&gt;객체를 선언하는 부분전에 클래스에 변수등을 초기화 하기위해 딱 한번만 호출이 되는 함수.&lt;/p&gt;

&lt;h5 id=&quot;pass-by-value-or-pass-by-referenct&quot;&gt;pass by Value or pass by Referenct&lt;/h5&gt;

&lt;p&gt;기본 자료형과 참조 자료형은 매개변수로 넘어갈때 Pass by Value로 넘어감.&lt;/p&gt;

&lt;p&gt;참조 자료형 안에 있는 변수들은 Pass by Reference로 넘어감.&lt;/p&gt;

&lt;h5 id=&quot;대신-&quot;&gt;[]대신 …&lt;/h5&gt;

&lt;p&gt;한 타입의 변수를 한 번에 여러개 받고 싶을때 [] 대신 … 사용 가능.&lt;/p&gt;

&lt;p&gt;대신 이 타입은 메소드의 가장 끝에 위치해야하며, 하나의 메소드에서 한 번만 사용이 가능.&lt;/p&gt;

&lt;h2 id=&quot;9-패키지와-접근제어자&quot;&gt;9. 패키지와 접근제어자&lt;/h2&gt;

&lt;p&gt;패키지를 사용하지 않는다면? 클래스가 중복되거나 클래스가 어떤일을하는지 혼동될 수 있음.&lt;/p&gt;

&lt;p&gt;”/”로 각 패키지를 구분, 윈도우는 “\“로도 컴파일이 가능함.&lt;/p&gt;

&lt;h5 id=&quot;패키지의-특징&quot;&gt;패키지의 특징&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;소스의 가장 첫 줄에 한줄로만 있어야 함.&lt;/li&gt;
  &lt;li&gt;예약어는 사용이 불가.&lt;/li&gt;
  &lt;li&gt;패키지의 이름과 폴더의 이름이 같아야함.&lt;/li&gt;
  &lt;li&gt;모두 소문자 여야함.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;다른 패키지에 접근하고 싶다면? import, import static&lt;/p&gt;

&lt;p&gt;해당 패키지 하위의 모든 패키지에 접근하고 싶다면? *&lt;/p&gt;

&lt;h5 id=&quot;접근제어자의-범위&quot;&gt;접근제어자의 범위&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;public : 누구나 접근&lt;/li&gt;
  &lt;li&gt;protected: 상속 받은 클래스에서 접근&lt;/li&gt;
  &lt;li&gt;package-private: 같은 패키지 내에서 접근 - default&lt;/li&gt;
  &lt;li&gt;private: 해당 클래스만 접근&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;10-상속&quot;&gt;10. 상속&lt;/h2&gt;

&lt;h5 id=&quot;extends&quot;&gt;Extends&lt;/h5&gt;

&lt;p&gt;부모의 클래스를 상속받겠다는 예약어이며, 부모 클래스 내의 package-private 과 private 접근제어 이외의 나머지 모든 변수와 메소드에 접근이 가능해짐.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;자식 클래스의 객체를 생성하면 자동으로 부모의 매개변수가 없는 생성자가 호출 됨. 부모의 클래스의 매개변수가 없는 생성자가 없다면 super()를 통해서 부모의 생성자를 호출 가능.&lt;/li&gt;
  &lt;li&gt;1개의 클래스만 상속이 가능함.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;메소드-overriding&quot;&gt;메소드 Overriding&lt;/h5&gt;

&lt;p&gt;자식 클래스에서 부모 클래스의 메소드의 리턴타입, 시그니처와 이름이 같은 메소드를 재 정의 하는 것.&lt;/p&gt;

&lt;p&gt;접근제어자는 확대는 가능하지만 축소는 가능하지 않음.&lt;/p&gt;

&lt;h5 id=&quot;overriding-vs-overloading&quot;&gt;Overriding vs Overloading&lt;/h5&gt;

&lt;p&gt;메소드를 덮어쓰느냐 확장하느냐.&lt;/p&gt;

&lt;h5 id=&quot;형변환&quot;&gt;형변환&lt;/h5&gt;

&lt;p&gt;자식 클래스 -&amp;gt; 부모 클래스로의 형변환 : 명시적으로 적어줌&lt;/p&gt;

&lt;p&gt;부모 클래스-&amp;gt; 자식 클래스로의 형변환: 불가. 하지만 부모 클래스의 변수가 자식 클래스의 객체를 가지고 있다면, 명시적으로 적어줌으로 써 가능.&lt;/p&gt;

&lt;h5 id=&quot;클래스의-타입이-무엇인지-체크하고-싶다면-instance-of&quot;&gt;클래스의 타입이 무엇인지 체크하고 싶다면? Instance of&lt;/h5&gt;

&lt;h5 id=&quot;다형성polymorphism&quot;&gt;다형성(Polymorphism)&lt;/h5&gt;

&lt;p&gt;부모 클래스로부터 상속받은 자식 클래스들의 객체들은 부모 클래스로 형변환이 가능하고, 부모 클래스로 부터 상속받은 공통의 메소드들을 오버라이드 구현이 가능함.&lt;/p&gt;

&lt;p&gt;즉, 부모 클래스로 보여도 선언이 되었던 객체들 마다 다른 메소드의 수행이 가능함.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Parent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;printObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ChildTest1&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Parent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;printObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(){&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;child 1&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;


&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ChildTest2&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Parent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;printObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(){&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;child 2&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Parent&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ChildTest1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;printObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// child 1 print&lt;/span&gt;
  
  &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ChildTest2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;printObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// child 2 print&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;11-javalangobject&quot;&gt;11. java.lang.Object&lt;/h2&gt;

&lt;p&gt;모든 클래스의 부모.&lt;/p&gt;

&lt;p&gt;즉 컴파일 시에 모든 클래스는 자동으로 “extends Object”가 추가됨.&lt;/p&gt;

&lt;h5 id=&quot;이중-상속이-안된다고-했잖아요&quot;&gt;이중 상속이 안된다고 했잖아요?&lt;/h5&gt;

&lt;p&gt;단계별 상속은 가능. 즉 A 클래스는 B클래스를 상속받고, B클래스는 C클래스를 상속받는 것이라면, A는 B와 C를 상속받은 클래스가 됨.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;C&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Object 클래스의 메소드들&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;toString() : 클래스 객체의 정보를 문자열로 내보냄. 오버라이드를 통해서 클래스의 문자열 출력을 지정할 수 있음.&lt;/li&gt;
  &lt;li&gt;equals(): 클래스가 객체 같은지를 비교할 때 호출.&lt;/li&gt;
  &lt;li&gt;clone(): 클래스 객체가 복사되어질 때.&lt;/li&gt;
  &lt;li&gt;hashcode(): 클래스의 객체가 가지고 있는 주소값이 리턴됨.&lt;/li&gt;
  &lt;li&gt;getClass(): 클래스 타입을 가져옴.&lt;/li&gt;
  &lt;li&gt;finalize(): 객체가 메모리에서 할당이 끝날때, GC가 호출될 때 수행.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;객체의-비교&quot;&gt;객체의 비교&lt;/h5&gt;

&lt;p&gt;기본 자료형의 값을 비교할때는 ==를 사용했음.&lt;/p&gt;

&lt;p&gt;하지만 참조자료형의 경우 ==로 비교를 하게되면, 객체의 주소값을 비교하게 됨으로 equals()메소드를 통해서 객체의 같음을 비교해야함.&lt;/p&gt;

&lt;h2 id=&quot;12-abstract-class와-enum&quot;&gt;12. Abstract Class와 Enum&lt;/h2&gt;

&lt;h5 id=&quot;interface-vs-abstract&quot;&gt;interface vs abstract&lt;/h5&gt;

&lt;p&gt;interface는 메소드의 명세를 정의하기 위한 것으로 메소드의 구현이 전혀 없는 메소드의 선언만을 가지고 있음.&lt;/p&gt;

&lt;p&gt;interface는 클래스가 아니기 때문에 extends가 아니라 implements로 구현을 해야함.&lt;/p&gt;

&lt;p&gt;class와는 다르게 여러 인터페이스의 구현이 가능함.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;interfact&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Itest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;abstract는 메소드 중에 하나라도 선언이 되지 않고 abstract method가 존재한다면 abstract클래스 여야함.&lt;/p&gt;

&lt;p&gt;abstrac클래스는 선언부가 있는 메소드와 선언부가 없는 메소드의 공존이 가능함.&lt;/p&gt;

&lt;p&gt;static, final 메소드의 선언도 가능함.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;abstract&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Test&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;abstract&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;mandatoryOverride&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 하위 클래스에서 선언이 필요함.&lt;/span&gt;
	&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;printTest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(){&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;test&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;final&quot;&gt;final&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;Class: 상속이 불가한 클래스&lt;/li&gt;
  &lt;li&gt;Method: 오버라이딩이 불가한 메소드&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;변수: 값의 초기화 이후 변경이 불가한 변수&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;참조 자료형의 객체가 final로 선언이 된경우에는, 객체 자체를 변경할 수는 없지만 안쪽의 인스턴스 변수나 클래스 변수가 final이 아니라면 접근이 가능.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;enum&quot;&gt;Enum&lt;/h5&gt;

&lt;p&gt;고정된 값(상수)의 집합.&lt;/p&gt;

&lt;p&gt;부모 클래스는 java.lang.Enum&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;compareTo: enum타입과 순서를 리턴&lt;/li&gt;
  &lt;li&gt;getDeclaringClass(): enum이 선언된 클래스를 반환.&lt;/li&gt;
  &lt;li&gt;name(): enum의 값을 반환&lt;/li&gt;
  &lt;li&gt;Ordinal(): enum의 선언된 순서를 반환&lt;/li&gt;
  &lt;li&gt;valueOf(): static 메소드로써, enum의 값을 매칭해서 반환.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;13-nested-inner-and-anonymous-class&quot;&gt;13. Nested, Inner and Anonymous Class&lt;/h2&gt;

&lt;h5 id=&quot;static-nested&quot;&gt;Static Nested&lt;/h5&gt;

&lt;p&gt;한 곳에서 선언되는 클래스를 논리적으로 묶어서 처리하고 싶을 때.&lt;/p&gt;

&lt;p&gt;클래스 내부에 선언된 static 클래스.&lt;/p&gt;

&lt;p&gt;선언은 외부 클래스.Static Nested클래스의 이름으로 new 로 생성. ex) A안에 B가 스태틱 네스티드 클래스인 경우 : new A.B()&lt;/p&gt;

&lt;p&gt;static 변수에만 접근이 가능.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;inner&quot;&gt;Inner&lt;/h5&gt;

&lt;p&gt;안쪽으로 클래스를 감추어 캡슐화를 하고 싶을 때.&lt;/p&gt;

&lt;p&gt;클래스 안에 static이 없는 또다른 클래스가 선언되어 있는 케이스.&lt;/p&gt;

&lt;p&gt;선언은 외부 클래스의 객체.new Inner 클래스의 이름으로 생성. ex) A안에 B가 내부 클래스인 경우: A a= new a(); a.new B()&lt;/p&gt;

&lt;p&gt;모든 변수 접근 가능.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;anonymous&quot;&gt;Anonymous&lt;/h5&gt;

&lt;p&gt;클래스의 객체가 많이 선언될 수록, 메모리를 많이 사용하기 때문에 해당 영역 내에서만 해당 객체를 명확히 사용하고 참조를 끊고 싶을 때. 즉, 재사용이 필요 없는 경우 가장 많이 사용.&lt;/p&gt;

&lt;p&gt;interface를 통한 객체의 선언만 있고, 그것을 구현한 클래스가 없지만 메소드 내에서 동적으로 선언해서 사용하는 클래스.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Button&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setListener&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventListener&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

	&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;onClick&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{}&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;모든 변수 접근 가능.&lt;/p&gt;

&lt;h2 id=&quot;14-exception&quot;&gt;14. Exception&lt;/h2&gt;

&lt;h5 id=&quot;try---catch---finally&quot;&gt;try - catch - finally&lt;/h5&gt;

&lt;p&gt;메소드 내부가 실행되면서, 예상치 못한 익셉션이 발생했을 때 해당 에러를 처리하기 위한 블럭.&lt;/p&gt;

&lt;p&gt;catch에서는 다양한 checkedException이나 Runtime Exception을 처리할 수 있음.&lt;/p&gt;

&lt;p&gt;catch에서는 여러 익셉션을 잡을 수 있으며, 해당 익셉션들의 포함 범위는 아래로 갈 수록 더 넓은 범위여야함.&lt;/p&gt;

&lt;p&gt;finally 에러가 발생하든 안하든 무조건 호출되는 영역 ex) 파일 처리가 끝낸 후 파일의 객체를 닫을 때 사용.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nullText&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;nullText&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;equals&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sc&quot;&gt;'a'&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NullPointerException&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getMessage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// print here.&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Systems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getMessage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;error의-종류&quot;&gt;Error의 종류&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;Error: 자바 프로그램 밖에서의 예외. ex) 네트워크가 단전되었거나 idc에서 장애가 발생하거나 등.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;runtime exception: 예외가 발생할 것을 미리 감지하지 못했을 때 발생. 그 중 실행시에 해당 예외의 발생을 인지할 수 있는 익셉션들.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;checked exception : Exception을 상속받은 클래스들로 컴파일 시에 확인되는 익셉션.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;throw-vs-throws&quot;&gt;throw vs throws&lt;/h5&gt;

&lt;p&gt;메소드 내에서 익셉션을 발생하고 싶을 때 : throw new Exception()&lt;/p&gt;

&lt;p&gt;메소드의 선언에서 익셉션이 발생될 것을 미리 선언하고 싶을 때: public void exceptionTest() throws Exception {}&lt;/p&gt;

&lt;p&gt;thorws가 포함된 메소드를 호출하는 쪽에서는 try - catch로 메소드의 익셉션 발생 케이스를 핸들링 하는 것이 좋음.&lt;/p&gt;

&lt;h2 id=&quot;15-anotation&quot;&gt;15. Anotation&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;@Override: 부모 객체로 부터 상속받은 메소드를 오버라이드 한 경우&lt;/li&gt;
  &lt;li&gt;@Deprecated: 메소드가 새롭게 선언되어 사용하지 않음을 명시하고 싶은 경우&lt;/li&gt;
  &lt;li&gt;@SuppressWarnings: 미리 인지하고 있는 컴파일러의 에러의 경우 워닝으로 처리하고 싶은 경우.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;나만의-anotation을-만들어-보고-싶다면&quot;&gt;나만의 anotation을 만들어 보고 싶다면?&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;@Target: 어노테이션을 어느 영역에 적용할 지. ex) METHOD or TYPE(Class, interface and Enum)&lt;/li&gt;
  &lt;li&gt;@Retention: 어노테이션의 정보 유지를 얼마나 할지.&lt;/li&gt;
  &lt;li&gt;@Documented: 문서를 정의할 때.&lt;/li&gt;
  &lt;li&gt;@Ingerited: 부모의 어노테이션을 자식의 클래스에게도 물려 줄지.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;어노 테이션의 값을 확인해 보고싶다면, 해당 메소드인 경우에는 클래스로부터 메소드의 명세를 꺼내 어노테이션에 접근이 가능.&lt;/p&gt;

&lt;p&gt;어노테이션 역시 상속이 불가함.&lt;/p&gt;

&lt;h2 id=&quot;자바의-garbage-collector&quot;&gt;자바의 Garbage Collector&lt;/h2&gt;

&lt;p&gt;JVM의 경우 C언어 처럼 명시적으로 메모리의 영역 할당을 해제하지 않음.&lt;/p&gt;

&lt;p&gt;자바는 재귀 함수나 메소드 내에서 메소드를 호출하는 순차적인 호출인 경우에는 stack에 호출순서를 Heap에 해당 변수와 메소드들을 할당.&lt;/p&gt;

&lt;p&gt;클래스나 기타 다른 객체들의 경우에는 heap에 할당하게 됨.&lt;/p&gt;

&lt;p&gt;heap은 young + old + perm으로 구성이 되어있음.&lt;/p&gt;

&lt;p&gt;변수나 객체를 처음 생성하게 되면 young의 eden영역에 할당이 되고, 이후 참조가 끊기거나 하면서 gc에 의해 삭제됨.&lt;/p&gt;

&lt;p&gt;하지만 계속 참조가 유지되는 경우 Survivor영역으로 이동이되고, 해당 survivor이 가득 차게 되면 Young(Minor) GC가 발생하게 됨.&lt;/p&gt;

&lt;p&gt;Young영역에서 계속해서 참조가 유지되는 경우는 old영역으로 이동하게 되고, 이 old영역이 가득차게 되면 Major(Full) GC가 발생.&lt;/p&gt;

&lt;h1 id=&quot;참조&quot;&gt;참조&lt;/h1&gt;

&lt;p&gt;자바의 신 VOL.1 - 이 상민 지음&lt;/p&gt;
</description>
        <pubDate>Sun, 30 Jun 2019 12:10:00 +0000</pubDate>
        <link>https://woonis.github.io/java/developer/God-of-Java-1/</link>
        <guid isPermaLink="true">https://woonis.github.io/java/developer/God-of-Java-1/</guid>
        
        
        <category>Java</category>
        
        <category>Developer</category>
        
      </item>
    
      <item>
        <title>Mastering Spring Cloud</title>
        <description>&lt;h1 id=&quot;00-서론&quot;&gt;00 서론&lt;/h1&gt;

&lt;p&gt;이 책은 개발자가 &lt;a href=&quot;https://12factor.net/ko/&quot;&gt;12 팩터&lt;/a&gt;를 기반으로하여 새로운 스프링 클라우드 기술을 기반으로 구축하고 하는 사용자를 위한 책입니다.&lt;/p&gt;

&lt;h1 id=&quot;01-마이크로-서비스-소개&quot;&gt;01 마이크로 서비스 소개&lt;/h1&gt;

&lt;h2 id=&quot;마이크로서비스의-장점&quot;&gt;마이크로서비스의 장점&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;대규모 복잡한 애플리케이션도 션을 지속해서 배포하는 능력.&lt;/li&gt;
  &lt;li&gt;소스 코드 규모가 상대적으로 작아서 프로젝트에 새로 참여하는 개발자가 이해하기 쉬움.&lt;/li&gt;
  &lt;li&gt;분리가 쉬움.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;스프링-프레임-워크로-마이크로-서비스-만들기&quot;&gt;스프링 프레임 워크로 마이크로 서비스 만들기&lt;/h2&gt;

&lt;p&gt;스프링 클라우드란 ? 서비스 레지스트리와 컨피규레이션 서버, 서킷 브레이커, 클라우드 버스, OAuth2 패턴, API Gateway 와 같은 마이크로서비스 기반 아키텍처에서 사용되는 모든 검증된 패턴을 구현 한것.&lt;/p&gt;

&lt;h2 id=&quot;클라우드-네이티브-개발&quot;&gt;클라우드 네이티브 개발&lt;/h2&gt;

&lt;p&gt;클라우드 네이티브 어플리케이션이란? 클라우드 환경을 위해 잘 설계된 프로그램.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;확장성과 신뢰성, 낮은 유지보수 비용.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;모놀리식 어플리케이션을 무조건적으로 바꾼다 ? No, 비용면에서 혜택을 줄 수 있는것인지 확인해야함.&lt;/li&gt;
  &lt;li&gt;이로 개발된 어플리케이션은 피보탈 클라우드 파운드리나 도커에 쉽게 배포가 가능.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;마이크로-서비스-아키텍처-배우기&quot;&gt;마이크로 서비스 아키텍처 배우기&lt;/h2&gt;

&lt;p&gt;모놀리식 어플리케이션이란? 하나의 어플리케이션에서 모든 코드를 관리하는 단일 구조의 어플리케이션.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;기존의 하나의 코드안에서 큰 모듈로 관리 되던 부분이 각 마이크로서비스의 도메인으로 분리가능.&lt;/li&gt;
  &lt;li&gt;기존 클라이언트의 요청을 받던 부분은 API Gateway가 대체함.&lt;/li&gt;
  &lt;li&gt;각 도메인이 분리되면서 기존의 1개이던 데이터 소스도 각 도메인이 자신의 데이터 소스를 가지도록 변경됨.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;서비스-디스커버리의-필요성-이해하기&quot;&gt;서비스 디스커버리의 필요성 이해하기&lt;/h2&gt;

&lt;p&gt;서비스 디스커버리란? 컴퓨터 네트워크상의 디바이스가 제공하는 디바이스와 서비스를 자동으로 감지하는 서비스.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;마이크로 서비스 아키텍처에서는 필수. Why? 각 도메인이 분리되고 배포도 각 도메인 안에서 진행되기 때문에 어느 부분으로 라우팅 되어야하는지에 대한 정보를 관리하는 부분이 필요함.&lt;/li&gt;
  &lt;li&gt;서비스 디스커버리를 서버 설정 기능과 함께 중앙에서 관리할수 있도록 만들 수도 있음.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;서비스-간-통신&quot;&gt;서비스 간 통신&lt;/h2&gt;

&lt;p&gt;부하 분산기란? 클라이 언트로 들어온 요청을 처리할때 하나의 인스턴스로 요청이 몰리지 않도록 분산하는 서비스.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;시스템의 신뢰성을 보장하려면 서비스가 최소 2개의 인스턴스로 유지가 필요함. Why? 장애를 방지하기 위해.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;서비스를-나누는-기준&quot;&gt;서비스를 나누는 기준&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;One-to-One or One-to-Many : 서로의 요청이 단일인지 분산처리 되는지.&lt;/li&gt;
  &lt;li&gt;Sync or Async : 응답을 바로 받는지 처리가 끝난 후 받는지.&lt;/li&gt;
  &lt;li&gt;Publish And Subscribe : 메세지 기반의 처리. Ex) MQ, Kafka&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;장애와-서킷-브레이커&quot;&gt;장애와 서킷 브레이커&lt;/h2&gt;

&lt;p&gt;시스템을 아키텍팅 할때는 항상 장애에 대비해야함.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;가장 좋은 방법은 응답을 기다릴 때의 네트워크 타임을 활용하여 응답이 오래걸리는 쓰레드에 에러코드를 반환할 수 있음.&lt;/li&gt;
  &lt;li&gt;서킷브레이커 패턴을 이용.
서킷브레이커란? 요청을 보내면서 실패와 성공 카운트를 세어 성공 카운트가 늘어나면 요청에 대한 처리를 하지만 실패 카운트가 일정 수치이상 증가하면 요청을 블로킹 처리하고 에러를 리턴함.&lt;/li&gt;
  &lt;li&gt;폴백(fall-back)을 이용
폴백 이란? 에러가 나는 상황에 에러가 아닌 기본적으로 에러라고 지칭할 수 있는 디폴트 값을 리턴함.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;요약&quot;&gt;요약&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;스프링 클라우드의 가장 큰 장점은 모든 패턴과 매커니즘의 구현을 제공한다는 것.&lt;/li&gt;
  &lt;li&gt;마이크로 서비스는 태생적으로 클라우드 네이티브.&lt;/li&gt;
  &lt;li&gt;클라우드 네이티브로 이동하는 가장 큰 장점은 품질은 유지하면서 어플리케이션의 구현과 배포를 빠르게 할 수 있기 때문.&lt;/li&gt;
  &lt;li&gt;마이크로 서비스는 중앙에 무언가로 부터 관리됨.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;02-마이크로서비스를-위한-스프링&quot;&gt;02 마이크로서비스를 위한 스프링&lt;/h1&gt;

&lt;h2 id=&quot;스프링-부트-소개&quot;&gt;스프링 부트 소개&lt;/h2&gt;

&lt;p&gt;스프링 부트란? 스프링 프레임워크를 더욱더 간편하고 쓸수 있도록 이니셜라이즈를 제공하며, 스프링 클라우드 내의 디펜던시와 버젼관리를 편하도록 도와줌. 독립 실행형 어플리케이션을 jave -jar로 실행함.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;spring-boot-starter를 통해서 모든 스프링 기반의 프로젝트 설정을 쉽게 할 수 있도록 도와줌.&lt;/li&gt;
  &lt;li&gt;다른 스프링 프레임워크를 역할에 맞도록 디펜던시를 쉽게 제공해주는 역할.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;왜-마이크로-서비스에-적합한-것인가&quot;&gt;왜 마이크로 서비스에 적합한 것인가?&lt;/h2&gt;

&lt;p&gt;기존의 스프링 컨피규레이션은 웹 컨테이너를 포함하는 대신 WAR 형태로 웹 컨테이너에 배포를 함.&lt;/p&gt;

&lt;p&gt;즉, 웹이 웹 도메인 외의 여러 WAR와 함께 웹 컨테이너에 배포됨으로써 독립성이 떨어졌기 때문에, 마이크로 서비스에서 단일 배포를 위해 도메인을 분리하기 힘듬.&lt;/p&gt;

&lt;h2 id=&quot;스프링-부트를-이용해-어플리케이션-개발하기&quot;&gt;스프링 부트를 이용해 어플리케이션 개발하기&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Initialize 를 이용&lt;/li&gt;
  &lt;li&gt;목적에 맞는 각 starter를 추가해서 내부의 디펜던시를 사용.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;@SpringBootApplication = @Configuration + @EnableAutoConfiguration + @ComponentScan&lt;/p&gt;

&lt;h2 id=&quot;컨피규레이션-파일-사용자-정의하기&quot;&gt;컨피규레이션 파일 사용자 정의하기&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;spring.config.name / spring.config.location 설정을 오버라이드 함으로써 자신의 패스내에 다른 이름으로 존재하는 설정파일 로드가 가능&lt;/li&gt;
  &lt;li&gt;정의한 설정파일은 @Value 또는 @ConfigurationProperties를 통해 주입 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@ConfigurationProperties&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prefix&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{설정에서 지정한 이름}&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Class&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;servers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ArrayList&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getServers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// this.servers = 설정파일에서 지정한 값을 리스트로 반환함.&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;servers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;properties, yml 사용 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;restful-웹서비스-생성하기&quot;&gt;RESTful 웹서비스 생성하기&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;기존의 @RequestMapping(method.Method.GET or POST or DELETE or PUT)을 각 분리된 어노테이션으로 사용가능(@GetMapping, @PostMapping, @DeleteMapping, @PutMapping)&lt;/li&gt;
  &lt;li&gt;바디가 리턴되는 컨트롤러에 대해서 기존의 @Controller&amp;amp;@ResponseBody대신 @RestController사용 가능.&lt;/li&gt;
  &lt;li&gt;@RequestBody로 자신의 오브젝트 객체를 매핑하기위해 스프링부트는 루트에서 jackson 디펜던시를 의존하고 있음.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;? SOAP(Simple Object Access Protocol) : XML 기반의 메세지를 주고받는 프로토콜&lt;/p&gt;

&lt;h2 id=&quot;api-문서화&quot;&gt;API 문서화&lt;/h2&gt;

&lt;p&gt;스웨거란? RESTful API를 설계하고 빌드하고 문서화 하기위해 가장 많이 사용되는 도구.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;swagger와 swagger ui를 디펜던시 추가&lt;/li&gt;
  &lt;li&gt;@EnableSwagger2를 통해 사용 가능&lt;/li&gt;
  &lt;li&gt;Docket빈의 정보를 기반으로 어플리케이션이 실행될때 자신의 API문서를 생성함&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;스프링-부트-액추에이터의-기능&quot;&gt;스프링 부트 액추에이터의 기능&lt;/h2&gt;

&lt;p&gt;스프링부트 액추에이터란? 모니터링과 메트릭 수집을 위해 사용하는 디펜던시.&lt;/p&gt;

&lt;h2 id=&quot;상태정보&quot;&gt;상태정보&lt;/h2&gt;

&lt;p&gt;디스크의 사용량, 메일서비스 등을 모니터 할 수 있음.&lt;/p&gt;

&lt;h2 id=&quot;매트릭스&quot;&gt;매트릭스&lt;/h2&gt;

&lt;p&gt;힙과 힙이 아닌 메모리의 사용량을 알 수 있음. CounterService와 GaugeService를 통해서 메트릭 추가 가능.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@Service&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PersonCounterService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@Autowired&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PersonCounterService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CounterService&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counterService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;counterService&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counterService&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;addPerson&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;counterService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;services.person.add&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;   
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;어플리케이션-빌드하기&quot;&gt;어플리케이션 빌드하기&lt;/h2&gt;

&lt;p&gt;내장 데이터 베이스는 운영용이 아닌 개발 또는 단위테스트용.&lt;/p&gt;

&lt;p&gt;운영에 배포가 나갈때는 실제 사용하려는 데이터 베이스를 별도로 셋팅하거나 인스턴스를 샤딩 클러스터로 구성해 연결하는 것이 좋다.&lt;/p&gt;

&lt;h2 id=&quot;요약-1&quot;&gt;요약&lt;/h2&gt;

&lt;p&gt;스프링부트를 사용해서 어떻게 프로젝트를 셋팅하고 배포할 수 있는지에 대한 팁을 공유함.&lt;/p&gt;

&lt;h1 id=&quot;03-스프링-클라우드-개요&quot;&gt;03 스프링 클라우드 개요&lt;/h1&gt;

&lt;h2 id=&quot;기본부터-시작하기&quot;&gt;기본부터 시작하기&lt;/h2&gt;

&lt;p&gt;스프링 클라우드는 원격 서버에서 컨피규레이션을 가저옴.
부트스트랩 컨텍스는 bootstrap.yml를 사용하며 일반적인 어플리케이션의 부모임.
일반적인 어플리케이션은 application.yml을 사용함.&lt;/p&gt;

&lt;p&gt;부트스트랩 설정을 비활성화 하려면? spring.cloud.bootstrap.enable = false&lt;/p&gt;

&lt;h2 id=&quot;넷플릭스-oss&quot;&gt;넷플릭스 OSS&lt;/h2&gt;

&lt;p&gt;마이크로 서비스를 처음으로 성공적으로 도입한 회사.
스프링 클라우드를 기본으로 유레카, 히스트릭스, 리본, 주울 등을 통합함.&lt;/p&gt;

&lt;h2 id=&quot;유레카를-사용한-서비스-디스커버리&quot;&gt;유레카를 사용한 서비스 디스커버리&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;spring-cloud-stater-eureka 스타터를 사용.&lt;/li&gt;
  &lt;li&gt;클라이언트와 서버를 구분함.&lt;/li&gt;
  &lt;li&gt;클라이언트는 항상 어플리케이션의 일부로 서버에 연결하는 일을 담당함.&lt;/li&gt;
  &lt;li&gt;서버는 독립적인 스프링 부트 어플리케이션으로 실행됨.(spring-cloud-starter-eureka-server)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;zuul을-사용한-라우팅&quot;&gt;Zuul을 사용한 라우팅&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;JVM 기반의 라우터이며, 서버측의 부하 분산이나 일부 필터링을 수행.&lt;/li&gt;
  &lt;li&gt;Spring-cloud-starter-zuul을 사용.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;ribbon을-사용한-부하-분산&quot;&gt;Ribbon을 사용한 부하 분산&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;TCP, UDP, HTTP 등 가장 유명한 프로토콜을 지원.&lt;/li&gt;
  &lt;li&gt;비동기 또는 리엑티브 모델도 지원함.&lt;/li&gt;
  &lt;li&gt;Spring-colud-starter-ribbon을 사용&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;히스트릭스를-사용해-대기-시간-및-장애-내성-다루기&quot;&gt;히스트릭스를 사용해 대기 시간 및 장애 내성 다루기&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;서킷브레이커 패턴을 구현함&lt;/li&gt;
  &lt;li&gt;spring-cloud-starter-hystrix를 사용&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;디스커버리와-분산-컨피규레이션&quot;&gt;디스커버리와 분산 컨피규레이션&lt;/h2&gt;

&lt;p&gt;Vault란? 토큰이나 패스워드, 자격 증명을 관리할 수 있는 해시코프에서 만든 오픈 소스 도구.&lt;/p&gt;

&lt;h2 id=&quot;아파치-주키퍼&quot;&gt;아파치 주키퍼&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;컨피규레이션과 이름을 쥬이하는 중앙 서비스로의 분산 동기화, 그룹서비스를 가능하게함.&lt;/li&gt;
  &lt;li&gt;spring-cloud-starter-zookeepr-discovery를 사용&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;기타-프로젝트&quot;&gt;기타 프로젝트&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;쿠버네틱스 
배포, 확장, 어플리케이션 컨테이너를 자동으로 관리하는 시스템.
컨테이너 오케스트레이션 및 서비스 디스커버리, 부하 분산 등의 기능 제공.&lt;/li&gt;
  &lt;li&gt;스프링 클라우드 에티시디(ETCD)
쿠버네틱스와 같이 분산 설정, 서비스 등록, 디스커버리를 제공하지만 쿠버네틱스 보다는 강력하지 않음.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;메시징과-통합&quot;&gt;메시징과 통합&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;스프링 클라우드 버스 : 컨피규레이션의 속성 변경이나 다른 명령등의 상태 변경을 이벤트로 어플리케이션에 알릴 수 있음.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;스프링 클라우드 스트림 : 
메세지 중심(MQ, Kafka)의 마이크로 서비스를 구현하기 위함. 
11장 메시지 중심 마이크로 서비스에서 자세한 설명을 할 예정.&lt;/p&gt;

    &lt;p&gt;Publish/Subscribe구조는 해당 인스턴스의 갯수만큼 구독이 가능하기 때문에 그루핑 기능도 함께 제공함.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;다른-유용한-라이브러리&quot;&gt;다른 유용한 라이브러리&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;보안 : spring-cloud-starter-security 를 통해서 싱글사인온, 토큰 리플레이와 같은 일반적인 패턴을 구현하는 시스템을 쉽게 개발 함.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;릴리즈-트레인&quot;&gt;릴리즈 트레인&lt;/h2&gt;

&lt;p&gt;하위 프로젝트의 혼란을 피하기 위해서 릴리즈 이름이 아니라 런던 지하철 역의 이름으로 구분함.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;M : Milestone&lt;/li&gt;
  &lt;li&gt;X : Version Number&lt;/li&gt;
  &lt;li&gt;SR(X) : Service Release - 중요한 버그 수정을 나타냄.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;릴리즈 트레인을 사용하기 위해서는 아래와 같이 설정함.&lt;/p&gt;

&lt;div class=&quot;language-gradle highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;dependencyManagement&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;imports&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;mavenBom:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'spring-cloud-dependencies:Finchley.M2'&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;요약-2&quot;&gt;요약&lt;/h2&gt;

&lt;p&gt;각 서비스 디스커버리, 분산 설정, 서킷브레이커를 어떻게 사용할 수 있고 어떤 특징을 가지고 있는지 알아봄.&lt;/p&gt;

&lt;h1 id=&quot;04-서비스-디스커버리&quot;&gt;04 서비스 디스커버리&lt;/h1&gt;

&lt;p&gt;Euraka란? 넷플릭스에서 디스커버리 서버를 지칭하는 말.
서버와 클라이언트로 구성되며, 서버는 주로 API의 수집과 등록을 담당하고 클라이언트는 서버의 등록, 해제 및 조회를 담당함.&lt;/p&gt;

&lt;h2 id=&quot;서버-측에서-유레카-서버실행하기&quot;&gt;서버 측에서 유레카 서버실행하기&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;spring-cloud-starter-eureka-server 의존성 추가.&lt;/li&gt;
  &lt;li&gt;Main Application에 @EnableEurekaServer 추가.&lt;/li&gt;
  &lt;li&gt;서버 스타터에는 클라이언트가 포함되어 있음으로, 분리를 위해서는 eureka.client.registerWithEureka와 eureka.client.fetchRegistry를 false로 지정한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;클라이언트-측에서-유레카-활성화하기&quot;&gt;클라이언트 측에서 유레카 활성화하기&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;spring-cloud-starter-eureka 의존성 추가.&lt;/li&gt;
  &lt;li&gt;자신을 등록하고 호스트, 포트, 상태 정보, 홈페이지 URL을 보내거나 서버로 부터 데이터를 가져와 캐싱하는 일을 담당.&lt;/li&gt;
  &lt;li&gt;@EnableDiscoveryClient(spring-common) 나 @EnalbeEurekaClient(netflix)로 활성화 시킴.&lt;/li&gt;
  &lt;li&gt;어플리케이션의 이름은 spring.application.name 속성을 통해 등록이 가능함.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;종료-시-등록-해제&quot;&gt;종료 시 등록 해제&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;어플리케이션의 중단은 Graceful하게 발생되어야 함.&lt;/li&gt;
  &lt;li&gt;스프링 액추에이터의 /shutdown API를 사용함으로써 구현이 가능.&lt;/li&gt;
  &lt;li&gt;하지만 실제로는 서버 머신이 재시작하거나 어플리케이션 장애, 네트워크 문제 등 많은 문제가 발새할 수 있음.&lt;/li&gt;
  &lt;li&gt;이것을 피하기 위해 서버의 기본 설정을 변경해야함.&lt;/li&gt;
  &lt;li&gt;Self-preservation mode는 자신의 서비스 상태를 갱신하지 않는 서비스가 일정 수를 넘으면 해제를 멈추는 것을 의미함. eureka.server.enableSelfPreservation속성의 값을 통해 비활성화가 가능함.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;프로그램-방식으로-디스커버리-클라이언트-사용하기&quot;&gt;프로그램 방식으로 디스커버리 클라이언트 사용하기&lt;/h2&gt;

&lt;p&gt;DiscoveryClient 객체를 주입받아 해당 서버의 리스트를 가져올 수 있음.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@Autowired&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DiscoveryClient&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ServiceInstance&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ping&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getInstances&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;CLIENT_SERVICE&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;레지스트리-갱신하기&quot;&gt;레지스트리 갱신하기&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Client&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;모든 클라이언트는 30초 마다 서버에게 자신의 생존여부를 알리는 Heartbeat를 보냄.
eureka.instance.leaseRenealIntervalInSecond 속성으로 설정 가능.&lt;/li&gt;
  &lt;li&gt;등록을 해제하여 트래픽을 전달하지 않도록 함.
eureka.instance.leaseExpirationdurationInSeconds 속성으로 설정 가능.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
  &lt;li&gt;Server&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;서버는 60초마다 Heartbeat가 수신되는지 확인.
즉, 임대를 만료하기까지 최악의 경우 60초까지 걸릴 수 있음.&lt;/li&gt;
  &lt;li&gt;eureka.server.envictionIntervaltimerInMs 속성으로 설정 가능.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;인스턴스-식별자-변경하기&quot;&gt;인스턴스 식별자 변경하기&lt;/h2&gt;

&lt;p&gt;인스턴스는 이름으로 묶임.&lt;/p&gt;

&lt;p&gt;다음의 방법을 통해 일련변호를 사용하도록 식별자를 변경할 수 있음.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;808${SEQUENCE_NO}&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;eureka&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;instance&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;		&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;instanceId&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${spring.application.name}-${SEQUENCE_NO}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;ip-주소-우선하기&quot;&gt;IP 주소 우선하기&lt;/h2&gt;

&lt;p&gt;기본적으로 모든 인스턴스는 호스트명으로 등록됨.&lt;/p&gt;

&lt;p&gt;유레카의 컨피규레이션 설정에서도 IP등록이 가능함. - eureka.instance.preferIpAddress를 true로 변경해야함.&lt;/p&gt;

&lt;p&gt;다만, 머신에 하나 이상의 네트워크 인터페이스가 존재하는 경우 문제가 발생할 수 있으니 주의가 필요함.&lt;/p&gt;

&lt;p&gt;이런 경우에는 제외 목록(spring.cloud.inetutils.ignoredInterfaces)이나 선호 목록(spring.cloud.inetutils.preferredNetworks)의 설정을 통해 관리가 가능함.&lt;/p&gt;

&lt;h2 id=&quot;응답-캐시&quot;&gt;응답 캐시&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;유레카 서버
유레카 서버는 기본적으로 응답을 30초 동안 캐싱함.
responseCacheUpdateIntervalMs 속성을 통해 캐시 시간을 설정할 수 있음.&lt;/li&gt;
  &lt;li&gt;유레카 클라이언트
유레카 클라이언트도 30초 동안 데이터를 캐싱함.
registryFetchIntervalSeconds 속성을 통해 캐시 시간을 설정할 수 있음.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;클라이언트와-서버-간의-보안-통신-사용하기&quot;&gt;클라이언트와 서버 간의 보안 통신 사용하기&lt;/h2&gt;

&lt;p&gt;보안을 설정하는것이 개발에는 중요하지 않지만, 보안이 부족하면 문제가 될 수 있음.&lt;/p&gt;

&lt;p&gt;스프링 클라우드 참조문서 에서는 “HTTP 기본 인증은 유레카 클라이언트에 자동으로 추가된다”고 했지만,&lt;/p&gt;

&lt;p&gt;실제로는 security 스타터를 추가하고, 보안 활성화 설정을 해야함.&lt;/p&gt;

&lt;h2 id=&quot;복제와-고가용성&quot;&gt;복제와 고가용성&lt;/h2&gt;

&lt;p&gt;디스커버리 서버를 1대로 운영해도 되지만, 운영인 경우 장애 상황에 대비해 최소 2대의 운영이 필요.&lt;/p&gt;

&lt;p&gt;이런 경우 Peer To Peer 복제 모델에 기반하여 서로의 유레카 서버 사이의 통신을 함.&lt;/p&gt;

&lt;p&gt;따라서 하나의 인스턴스에 연결되었던 유레카 서버가 장애가 발생하여도, 다른 유레카 서버와의 연결을 통해 서비스가 정상적으로 작동될 수 있음.&lt;/p&gt;

&lt;h2 id=&quot;존zones&quot;&gt;존(Zones)&lt;/h2&gt;

&lt;p&gt;단일 디스커버리 인스턴스에서도 eureka.client.serviceUrl.defaultZone 설정을 해야함.&lt;/p&gt;

&lt;h2 id=&quot;요악&quot;&gt;요악&lt;/h2&gt;

&lt;p&gt;유레카의 서버와 클라이언트 설정을 통해 넷플릭스의 디스커버리 서버를 어떻게 설정하고 운영할 수 있는지 알수 있음.&lt;/p&gt;

&lt;h1 id=&quot;05-스프링-클라우드-컨피그를-사용한-분산-컨피규레이션&quot;&gt;05 스프링 클라우드 컨피그를 사용한 분산 컨피규레이션&lt;/h1&gt;

&lt;p&gt;기존에는 컨피규레이션을 JAR안에 포함해서 제공했기때문에, 컨피규레이션이 변경될 때마다 재빌드와 배포가 필요함.
하지만 이를 spring.config.location속성을 통해 원격에서 가져올 수 있도록 쉽게 구성이 가능함.&lt;/p&gt;

&lt;p&gt;분산 컨피규레이션은 클라우드 네이티브 환경에서 가장 인기있는 표준 중 하나.&lt;/p&gt;

&lt;h2 id=&quot;http-api-자원의-소개&quot;&gt;HTTP API 자원의 소개&lt;/h2&gt;

&lt;p&gt;컨피규레이션을 가져오기위한 여러 API가 존재함.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/{application}/{profile}/{label}
/{application}-{profile}.xml
/{label}/{application}-{profile}.xml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;application : spring.application or config.name 으로 지정한 어플리케이션의 이름.&lt;/li&gt;
  &lt;li&gt;profile: 현재 활성화 중인 모드.&lt;/li&gt;
  &lt;li&gt;label: 옵셔널 밸류로써 git의 브랜치를 의미하며, default는 master브랜치.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;네이티브-프로파일-지원&quot;&gt;네이티브 프로파일 지원&lt;/h2&gt;

&lt;p&gt;spring.profile.active옵션을 native로 하고 서버를 시작.&lt;/p&gt;

&lt;p&gt;서버는 classpath:/, classpath:/config, file:./, file:./config에서 컨피규레이션파일을 찾음.
즉, yaml파일이 jar파일 안에 위치할 수 있음을 의미.&lt;/p&gt;

&lt;p&gt;컨피규레이션을 서버로 옮기기로 했다면 어플리케이션 이름을 주의할 것.
어플리케이션 마다 주어질 설정 이름이 유일해야함.&lt;/p&gt;

&lt;h2 id=&quot;서버-측-어플리케이션-개발하기&quot;&gt;서버 측 어플리케이션 개발하기&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;spring-cloud-config-server 의존성 추가.&lt;/li&gt;
  &lt;li&gt;@EnalbeConfigServer 어노테이션 추가.&lt;/li&gt;
  &lt;li&gt;기본 포트는 8888, client에서 접근하려는 포트도 8888이기 때문에 바꾸지 않는 것이 좋음.
바꾸려면 server.port의 값을 변경하거나 spring.config.name=configserver를 통해 해당 설정들을 configserver.yml에 오버라이드 할 수 있음.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;클라이언트-측-어플리케이션-개발하기&quot;&gt;클라이언트 측 어플리케이션 개발하기&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;spring-cloud-starter-config 의존성 추가.&lt;/li&gt;
  &lt;li&gt;application.yml을 bootstrap.yml로 바꿈.&lt;/li&gt;
  &lt;li&gt;spring.profiles.active 옵션 값에 따라 해당하는 설정 파일을 가져올 수 있음.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;유레카-서버-추가하기&quot;&gt;유레카 서버 추가하기&lt;/h2&gt;

&lt;p&gt;클라이언트 속성에는 디스커버리 서비스의 내트워크 위치주소를 설정함.
즉, 컨피규레이션 서버가 작동하기 전에 유레카 서버가 먼저 실행중이어야함.&lt;/p&gt;

&lt;p&gt;유레카는 서버가 시작할때 지정된 프로파일에 할당되는 컨피그를 컨피규레이션 서버로부터 가져옴.&lt;/p&gt;

&lt;p&gt;06 마이크로서비스 간의 커뮤니케이션&lt;/p&gt;

&lt;p&gt;07 고급 부하 분산 및 서킷 브레이커&lt;/p&gt;

&lt;p&gt;08 API 게이트웨으를 사용한 라우팅과 필터링&lt;/p&gt;

&lt;p&gt;09 분산 로깅과 추적&lt;/p&gt;

&lt;p&gt;10 추가 컨피규레이션 및 디스커버리 기능&lt;/p&gt;

&lt;p&gt;11 메시지 주도 마이크로 서비스&lt;/p&gt;

&lt;p&gt;12 API 보안 강화하기&lt;/p&gt;

&lt;p&gt;13 자바 마이크로서비스 테스팅&lt;/p&gt;

&lt;p&gt;14 도커 지원&lt;/p&gt;

&lt;p&gt;15 클라우드 플랫폼상의 스프링 마이크로서비스&lt;/p&gt;

&lt;h1 id=&quot;출처&quot;&gt;출처&lt;/h1&gt;

&lt;p&gt;마스터링 스프링 클라우드 - 피요트르 민코프스키 지음(위키북스)&lt;/p&gt;
</description>
        <pubDate>Sun, 11 Nov 2018 19:34:00 +0000</pubDate>
        <link>https://woonis.github.io/spring/springcloud/developer/spring-cloud/</link>
        <guid isPermaLink="true">https://woonis.github.io/spring/springcloud/developer/spring-cloud/</guid>
        
        
        <category>Spring</category>
        
        <category>SpringCloud</category>
        
        <category>Developer</category>
        
      </item>
    
      <item>
        <title>Jekyll, Minimal Mistakes Theme Apply Guide</title>
        <description>&lt;h1 id=&quot;github-io-minimal-mistakes-적용하기&quot;&gt;GitHub io Minimal Mistakes 적용하기&lt;/h1&gt;

&lt;p&gt;참조의 사이트를 통해서 기본 구조를 포크하거나 다운로드 받음.&lt;/p&gt;

&lt;h2 id=&quot;1-configyml&quot;&gt;1. Config.yml&lt;/h2&gt;

&lt;p&gt;전체적인 블로그에 해당 테마를 적용하기위한 설정을 변경하는 파일.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;remote_theme           &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;mmistakes/minimal-mistakes&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;minimal_mistakes_skin    &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;default&quot;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# &quot;air&quot;, &quot;aqua&quot;, &quot;contrast&quot;, &quot;dark&quot;, &quot;dirt&quot;, &quot;neon&quot;, &quot;mint&quot;, &quot;plum&quot;, &quot;sunrise&quot; - 테마 선택 가능(공식 홈페이지 참조)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;2-author정보-설정하기&quot;&gt;2. Author정보 설정하기&lt;/h2&gt;

&lt;p&gt;Profile 이미지는 config.yml의 author.avatar 의 값을 지정함으로써 지정할 수 있음.&lt;/p&gt;

&lt;p&gt;Image를 로컬에 저장하기 위한 경로는 : /assets/images&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name             &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Suji&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Woo,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Wooni&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;avatar           &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/assets/images/Wooni.jpeg&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;bio              &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Hello&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;:)&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;This&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;is&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Wooni.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;lt;br&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;I'm&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;developer&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;at&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Coupang.&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;location         &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Seoul,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Korea&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;email            &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;sjchu91@gmail.com&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;3--_drafts&quot;&gt;3.  _drafts&lt;/h2&gt;

&lt;p&gt;_posts에는 실제로 포스트할 포스트를 저장하는 반면, _drafts에는 현재 작성중인 포스트에 대해서 저장하고 Git을 통해 관리할 수 있음.&lt;/p&gt;

&lt;h2 id=&quot;4--_posts&quot;&gt;4.  _posts&lt;/h2&gt;

&lt;p&gt;실제로 포스트 될 포스트를 저장하는 폴더.
포스트의 파일명은 “{year}-{mm}-{dd}-{file name : space is “-“}” 규칙을 따른다.&lt;/p&gt;

&lt;h2 id=&quot;5-포스트md&quot;&gt;5. 포스트(.md)&lt;/h2&gt;

&lt;p&gt;실제로 게시물에 포함될 내용을 작성하는 포스트.
상단의 메타정보를 포함할 수 있음.
더욱 편리하게 작성하기 위해 &lt;a href=&quot;https://typora.io/&quot;&gt;Typora&lt;/a&gt;를 추천&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;title &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;post의 title이 될 제목&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;data &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;작성 할 날짜&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;categories &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;해당 포스트가 포함되는 카테고리를 분류(구분자는 Space)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;6-css-override&quot;&gt;6. Css Override&lt;/h2&gt;

&lt;p&gt;실제로 기본의 css가 적용되면서, 화면의 크기에 따라 글씨체나 화면의 비율이 정해져 있음.
하지만 해당 css들을 오버라이드 할 수 있음.&lt;/p&gt;

&lt;p&gt;css를 오버라이드 하기 위한 경로는 : /assets/css/main.scss&lt;/p&gt;

&lt;div class=&quot;language-scss highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;#&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;Only&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;Sass&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;needs&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;front&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;matter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;dashes&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;are&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;enough&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;---&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;charset&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;minimal-mistakes/skins/default&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// skin
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;minimal-mistakes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// main partials
&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Page의 padding을 0으로 바꿈
&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.page&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;nl&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0px&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;important&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; 

&lt;span class=&quot;c1&quot;&gt;// font-size change
&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.page__content&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;nl&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;16px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;참조&quot;&gt;참조&lt;/h1&gt;

&lt;p&gt;Minimal Mistakes - &lt;a href=&quot;https://github.com/mmistakes/minimal-mistakes&quot;&gt;https://mmistakes.github.io/minimal-mistakes/&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Sun, 11 Nov 2018 12:10:00 +0000</pubDate>
        <link>https://woonis.github.io/minimal-mistakes/developer/jekyll-minimal-mistakes-guide/</link>
        <guid isPermaLink="true">https://woonis.github.io/minimal-mistakes/developer/jekyll-minimal-mistakes-guide/</guid>
        
        
        <category>Minimal-Mistakes</category>
        
        <category>Developer</category>
        
      </item>
    
  </channel>
</rss>