<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Hellow world!!</title>
    <link>https://explored.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 18:53:44 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>주뇬</managingEditor>
    <image>
      <title>Hellow world!!</title>
      <url>https://tistory1.daumcdn.net/tistory/5067547/attach/b23c75485c0e430ca96f53edf602a31a</url>
      <link>https://explored.tistory.com</link>
    </image>
    <item>
      <title>[git] user.name과 user.gmail 설정하기</title>
      <link>https://explored.tistory.com/entry/git-username%EA%B3%BC-usergmail-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ [git] user.name과 user.gmail 설정하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 저장소의 user name과 user email 설정하기&lt;/p&gt;
&lt;pre id=&quot;code_1729560276207&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git config --global user.name &quot;My Name&quot;
$ git config --global user.email &quot;abc@gmail.com&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 저장소(프로젝트)에 user name과 user email 설정하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 특정 저장소(프로젝트의 디렉토리)에 가서 아래의 커맨드 입력&lt;/p&gt;
&lt;pre id=&quot;code_1729560326106&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git config user.name &quot;My Name&quot;
$ git config user.email &quot;abc@gmail.com&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설정된 user.name과 user.email 확인하기&lt;/h2&gt;
&lt;pre id=&quot;code_1729561668521&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git config user.name
$ git config user.email&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Develop/  CI &amp;amp; CD</category>
      <category>git gmail</category>
      <category>git name</category>
      <category>git user.gmail</category>
      <category>git user.name</category>
      <author>주뇬</author>
      <guid isPermaLink="true">https://explored.tistory.com/96</guid>
      <comments>https://explored.tistory.com/entry/git-username%EA%B3%BC-usergmail-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0#entry96comment</comments>
      <pubDate>Tue, 22 Oct 2024 10:48:13 +0900</pubDate>
    </item>
    <item>
      <title>디자인 패턴</title>
      <link>https://explored.tistory.com/entry/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 디자인 패턴이란?&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;디자인 패턴은 소프트웨어 설계에서 자주 발생하는 문제들을 해결하기 위해 개발된, 검증된 재사용 가능한 설계 구조입니다.&lt;br /&gt;&lt;br /&gt;디자인 패턴은 &lt;span style=&quot;letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;&lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot; href=&quot;https://qwercode.com/entry/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EC%84%A4%EA%B3%84-%EC%9B%90%EC%B9%99-SOLID&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;객체 지향 설계 원칙 SOLID&lt;/a&gt;을 기반으로 하며, 소프트웨어의 유지보수성과 확장성을 높이는 데 도움이 됩니다. 각 디자인 패턴은 특정 상황에서 어떻게 클래스를 구성하고 상호작용해야 하는지에 대한 명확한 방법을 제시합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;디자인 패턴은 크게 &lt;b&gt;생성&lt;/b&gt;, &lt;b&gt;구조&lt;/b&gt;, &lt;b&gt;행위&lt;/b&gt;로 분류됩니다.&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;1. &lt;b&gt;생성 패턴 (Creational Patterns)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성 패턴은 객체 생성 메커니즘에 중점을 두어, 객체 생성 과정에서의 복잡성을 숨기고, 유연성을 제공하는 패턴입니다. 객체를 어떻게 생성하고 관리할 것인가에 대한 방법을 다룹니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;싱글턴 패턴 (Singleton Pattern)&lt;/b&gt;: 클래스의 인스턴스를 &lt;b&gt;하나만 생성&lt;/b&gt;하고, 그 인스턴스를 어디서든지 접근할 수 있도록 하는 패턴.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;팩토리 메서드 패턴 (Factory Method Pattern)&lt;/b&gt;: 객체 생성의 책임을 서브클래스에 위임하여, 어떤 클래스의 인스턴스를 생성할지 서브클래스가 결정하도록 하는 패턴.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;추상 팩토리 패턴 (Abstract Factory Pattern)&lt;/b&gt;: 서로 관련된 객체들의 군을 생성할 수 있는 인터페이스를 제공하는 패턴.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;빌더 패턴 (Builder Pattern)&lt;/b&gt;: 복잡한 객체의 생성 과정을 단계별로 분리하여, 객체의 생성과정을 더 유연하게 하는 패턴.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로토타입 패턴 (Prototype Pattern)&lt;/b&gt;: 객체를 새로 생성하는 대신 &lt;b&gt;이미 존재하는 객체를 복제&lt;/b&gt;하여 새로운 객체를 생성하는 패턴.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;2. &lt;b&gt;구조 패턴 (Structural Patterns)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조 패턴은 클래스와 객체 간의 관계를 정의하여, 더 큰 구조를 형성하는 패턴입니다. 객체와 클래스의 구성 방식을 다루어, 그들의 관계와 구조를 쉽게 변경할 수 있게 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;어댑터 패턴 (Adapter Pattern)&lt;/b&gt;: 클래스의 인터페이스를 다른 인터페이스로 변환하여, 호환되지 않는 인터페이스를 가진 클래스들이 함께 동작할 수 있도록 하는 패턴.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데코레이터 패턴 (Decorator Pattern)&lt;/b&gt;: 객체에 동적으로 새로운 기능을 추가할 수 있는 패턴으로, 기존의 객체를 수정하지 않고도 기능을 확장할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프록시 패턴 (Proxy Pattern)&lt;/b&gt;: 실제 객체에 대한 대리 객체를 제공하여, 객체에 접근을 제어하는 패턴.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;브리지 패턴 (Bridge Pattern)&lt;/b&gt;: 추상화와 구현을 분리하여 각각 독립적으로 변화할 수 있도록 설계하는 패턴.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;컴포지트 패턴 (Composite Pattern)&lt;/b&gt;: 객체들을 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴. 클라이언트가 개별 객체와 복합 객체를 동일하게 다룰 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;퍼사드 패턴 (Facade Pattern)&lt;/b&gt;: 복잡한 서브 시스템에 대한 &lt;b&gt;단순화된 인터페이스&lt;/b&gt;를 제공하는 패턴.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;3. &lt;b&gt;행위 패턴 (Behavioral Patterns)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행위 패턴은 객체 간의 상호작용을 정의하고, 객체들 간의 통신과 책임 분담을 설계하는 패턴입니다. 객체들 간의 협력 방식이나 흐름을 다룹니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;옵저버 패턴 (Observer Pattern)&lt;/b&gt;: 한 객체의 상태 변화가 있을 때, 의존하는 다른 객체들에게 자동으로 알림을 보내는 패턴. 주로 &lt;b&gt;이벤트 시스템&lt;/b&gt;에서 사용됨.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;전략 패턴 (Strategy Pattern)&lt;/b&gt;: 행위의 알고리즘을 각각 별도의 클래스로 정의하고, 런타임에 행위의 알고리즘을 선택할 수 있도록 하는 패턴.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상태 패턴 (State Pattern)&lt;/b&gt;: 객체의 내부 상태에 따라 행동을 달리하는 패턴으로, 상태의 변화에 따라 객체의 행위가 달라짐.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;템플릿 메서드 패턴 (Template Method Pattern)&lt;/b&gt;: 상위 클래스에서 알고리즘의 구조를 정의하고, 하위 클래스에서 구체적인 단계를 구현하는 패턴.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커맨드 패턴 (Command Pattern)&lt;/b&gt;: 요청을 캡슐화하여 객체로 만들고, 요청을 저장하거나 로깅하는 등의 작업을 수행할 수 있게 하는 패턴.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;미디에이터 패턴 (Mediator Pattern)&lt;/b&gt;: 객체들이 직접 통신하지 않고 **중재자(Mediator)**를 통해 소통하게 하는 패턴. 객체들 간의 결합도를 줄일 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메멘토 패턴 (Memento Pattern)&lt;/b&gt;: 객체의 상태를 저장하고 복원할 수 있는 패턴으로, 객체의 이전 상태를 복구할 수 있도록 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;✅&lt;span&gt; 디자인 패턴의 장/단점&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;장점&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;재사용성 향상&lt;/b&gt;: 검증된 해결책을 제공하여 유사한 문제에 코드를 재사용할 수 있게 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유지보수성 개선&lt;/b&gt;: 코드의 구조화와 가독성을 높여 유지보수가 쉬워집니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;확장성 제공&lt;/b&gt;: 기존 코드 수정 없이 새로운 기능을 추가하거나 변경할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코드 품질 향상&lt;/b&gt;: 구조화된 접근 방식으로 코드의 전반적인 품질이 개선됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개발자&amp;nbsp;간&amp;nbsp;의사소통&amp;nbsp;개선&lt;/b&gt;:&amp;nbsp;공통&amp;nbsp;어휘를&amp;nbsp;제공하여&amp;nbsp;개발자&amp;nbsp;간&amp;nbsp;의사소통을&amp;nbsp;원활하게&amp;nbsp;합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;단점&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;과도한 사용 위험&lt;/b&gt;: 필요 이상으로 사용하면 시스템이 불필요하게 복잡해질 수 있습니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;성능 저하 가능성&lt;/b&gt;: 일부 패턴은 추가적인 추상화 레이어로 인해 성능에 부정적 영향을 줄 수 있습니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;학습 곡선&lt;/b&gt;: 패턴을 이해하고 적절히 적용하는 데 시간과 노력이 필요합니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코드 복잡성 증가&lt;/b&gt;: 일부 패턴은 추가적인 클래스와 인터페이스를 도입하여 코드 복잡성을 높일 수 있습니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오버엔지니어링&amp;nbsp;위험&lt;/b&gt;:&amp;nbsp;간단한&amp;nbsp;문제에&amp;nbsp;복잡한&amp;nbsp;패턴을&amp;nbsp;적용하면&amp;nbsp;불필요한&amp;nbsp;복잡성이&amp;nbsp;생길&amp;nbsp;수&amp;nbsp;있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;모든 문제의 해결책들이 디자인패턴에 꼭 정답이 있는게 아닙니다. &lt;/span&gt;상황에 맞게 적절히 사용해야 하며 각 패턴의 장단점을 이해하고, 문제의 특성과 요구사항을 고려하여 신중하게 적용해야 합니다.&lt;/blockquote&gt;</description>
      <category>  Develop/  Design Pattern</category>
      <category>디자인패턴</category>
      <category>디자인패턴 단점</category>
      <category>디자인패턴 장단점</category>
      <category>디자인패턴 장점</category>
      <author>주뇬</author>
      <guid isPermaLink="true">https://explored.tistory.com/94</guid>
      <comments>https://explored.tistory.com/entry/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4#entry94comment</comments>
      <pubDate>Fri, 18 Oct 2024 19:25:02 +0900</pubDate>
    </item>
    <item>
      <title>객체 지향 설계 원칙 SOLID</title>
      <link>https://explored.tistory.com/entry/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EC%84%A4%EA%B3%84-%EC%9B%90%EC%B9%99-SOLID</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 객체 지향 설계 원칙 SOLID&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;객체지향 설계 5대 원칙(SOLID)들은 코드의 &lt;span style=&quot;color: #ee2323;&quot;&gt;유지보수성, 확장성, 재사용성&lt;/span&gt;을 높이고 &lt;span style=&quot;color: #ee2323;&quot;&gt;결합도는 낮추&lt;/span&gt;며 &lt;span style=&quot;color: #ee2323;&quot;&gt;응집도는 높이&lt;/span&gt;는 것을 목표로 합니다. 이를 통해 변경에 유연하고 견고한 애플리케이션을 만들수 있습니다.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;1. 단위 책임 원칙 - SRP (Single Responsibility Principle)&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;하나의 클래스는 하나의 책임만 가져야 한다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;클래스는 하나의 기능 또는 역할을 가져야 하며, 그 외의 다른 책임을 맡지 않아야 한다는 원칙입니다. 이 원칙을 따름으로써 클래스가 명확한 목적을 가지게 되고, 변화가 필요한 부분이 생기면 한 곳만 수정할 수 있어 유지보수가 쉬워집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;사용자의 로그인과 데이터베이스의 처리를 동시에 담당하는 클래스 대신, 각각의 역할을 담당하는 loginService와 DatabaseService클래스를 분리하는 것이 좋습니다.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;2. 개방 폐쇄 원칙 - OCP (Open-Closed&amp;nbsp;Principle)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클래스는 확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 한다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;새로운 기능이 추가될 때 기존 코드를 수정하지 않고, 확장하여 사용할 수 있어야 한다는 원칙입니다. 이를 통해 기존 코드가 변경되지 않기 때문에 버그가 발생할 확률을 줄일 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;새로운 기능이 필요할 때 기존 클래스를 수정하는 대신, 기존 클래스를 상속하거나 인터페이스를 구현하여 새로운 기능을 추가하는 방법입니다.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;3. 리스코프 치환 원칙 - LSP&amp;nbsp;(Liskov&amp;nbsp;Substitution&amp;nbsp;Principle)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;서브 타입은 언제나 기반 타입으로 교체할 수 있어야 한다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;자식 클래스는 언제나 부모 클래스를 대체할 수 있어야 하며, 자식 클래스가 부모 클래스의 행위를 변경하지 않아야 한다는 원칙입니다. 이를 통해 상속 구조에서 일관성을 유지하고 예측 가능한 코드 동작을 보장할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;4. 인터페이스 분리 원칙 - ISP&amp;nbsp;(Interface&amp;nbsp;Segregation&amp;nbsp;Principle)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;하나의 큰 인터페이스 대신 여러 개의 작은 인터페이스로 분리하여, 사용하지 않는 메소드를 구현하지 않도록 해야 한다는 원칙입니다. 이를 통해 인터페이스는 더 명확하고, 필요하지 않은 기능 때문에 코드가 복잡해지는 것을 방지할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;동물 행동 인터페이스에 fly(), swim(), walk() 메소드를 모두 포함하기보다, 각각 Flyable, Swimmable, Walkable 인터페이스로 나눠서 필요한 행동만 구현하도록 하는 것이 더 바람직합니다.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;5. 의존 역전 원칙 - DIP&amp;nbsp;(Dependency&amp;nbsp;Inversion&amp;nbsp;Principle)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 한다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;구체적인 구현보다 인터페이스나 추상 클래스에 의존하도록 설계하여, 모듈 간의 결합도를 낮추는 원칙입니다. 이를 통해 코드 변경 시 서로 영향을 주지 않고 쉽게 확장하거나 교체할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;서비스 클래스가 직접 MySQLDatabase 클래스에 의존하기보다, Database라는 추상 인터페이스에 의존하게 함으로써 OracleDatabase로 쉽게 교체할 수 있게 설계하는 것이 좋습니다.&lt;/blockquote&gt;</description>
      <category>  Develop/  Design Pattern</category>
      <category>solid</category>
      <category>객체 지향 설계 원칙</category>
      <category>객체지향설계 solid</category>
      <author>주뇬</author>
      <guid isPermaLink="true">https://explored.tistory.com/93</guid>
      <comments>https://explored.tistory.com/entry/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EC%84%A4%EA%B3%84-%EC%9B%90%EC%B9%99-SOLID#entry93comment</comments>
      <pubDate>Fri, 18 Oct 2024 18:12:32 +0900</pubDate>
    </item>
    <item>
      <title>Java 8~21 버전별 차이점</title>
      <link>https://explored.tistory.com/entry/Java-821-%EB%B2%84%EC%A0%84%EB%B3%84-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;✅ Java 8~21 버전별 차이점&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.java.com/releases/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.java.com/releases/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1729226714388&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;JDK Releases&quot; data-og-description=&quot;The release information on this page covers the JDK releases that were widely distributed or significant to the development of Java. It does not cover patch releases or other one-off releases.&quot; data-og-host=&quot;www.java.com&quot; data-og-source-url=&quot;https://www.java.com/releases/&quot; data-og-url=&quot;https://www.java.com/releases/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.java.com/releases/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.java.com/releases/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;JDK Releases&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The release information on this page covers the JDK releases that were widely distributed or significant to the development of Java. It does not cover patch releases or other one-off releases.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.java.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;Java 8 (2014년 출시)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 8은 Java 언어에 큰 변화를 가져온 버전으로, 이후의 많은 기능들이 Java 8의 기능에 기반하고 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;32비트를 지원하는 공식적인 마지막 버전&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;람다 표현식 (Lambda Expressions):&lt;/b&gt; 함수형 프로그래밍을 도입하여 코드 간결화.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스트림 API (Stream API):&lt;/b&gt; 컬렉션 데이터를 처리하기 위한 선언형 API로, 필터링, 매핑, 축소(reduction) 등의 작업을 더 쉽게 수행.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인터페이스의 디폴트 메서드 (Default Methods):&lt;/b&gt; 인터페이스에 메서드 구현을 제공할 수 있도록 허용.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Optional 클래스:&lt;/b&gt; NullPointerException 방지를 위해 사용되는 객체 래핑 클래스.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;새로운 날짜 및 시간 API:&lt;/b&gt; java.time 패키지를 통해 더 나은 날짜 및 시간 처리를 제공.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Perm Gem 영역삭제&lt;/b&gt; (참고 : &lt;a href=&quot;https://johngrib.github.io/wiki/java8-why-permgen-removed/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://johngrib.github.io/wiki/java8-why-permgen-removed/&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 람다표현식&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729228315679&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ExampleLambda {
	public static void main(String[] args) {
    	List&amp;lt;String&amp;gt; names = Arrays.asList(&quot;Park&quot;, &quot;Kim&quot;, &quot;Choi&quot;, &quot;Lee&quot;);
        
        // 람다 표현식
        names.forEach(name -&amp;gt; System.out.println(name));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 스트림API&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729228387334&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ExampleStream {
    public static void main(String[] args) {
        List&amp;lt;Integer&amp;gt; numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // 스트림을 이용한 필터링과 출력
        numbers.stream()
               .filter(n -&amp;gt; n % 2 == 0) // 짝수만 필터링
               .forEach(System.out::println);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 인터페이스의 디폴트 메소드&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729228603556&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface MyInterface {
    default void defaultMethod() {
        System.out.println(&quot;This is a default method&quot;);
    }
}

public class DefaultMethodExample implements MyInterface {
    public static void main(String[] args) {
        DefaultMethodExample obj = new DefaultMethodExample();
        obj.defaultMethod(); // 디폴트 메소드 호출
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 새로운 날짜와 시간 API&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729228505735&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ExampleDateTime {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();
        System.out.println(&quot;현재 날짜: &quot; + date);

        LocalTime time = LocalTime.now();
        System.out.println(&quot;현재 시간: &quot; + time);

        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println(&quot;현재 날짜와 시간: &quot; + dateTime);

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(&quot;yyyy-MM-dd HH:mm:ss&quot;);
        String formattedDateTime = dateTime.format(formatter);
        System.out.println(&quot;형식화된 날짜와 시간: &quot; + formattedDateTime);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. Optional클래스&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729228539978&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ExampleOptional {
    public static void main(String[] args) {
        String name = &quot;John&quot;;
        Optional&amp;lt;String&amp;gt; optionalName = Optional.ofNullable(name);
        
        System.out.println(&quot;이름 길이: &quot; + optionalName.map(String::length).orElse(0));
        
        String nullName = null;
        Optional&amp;lt;String&amp;gt; optionalNullName = Optional.ofNullable(nullName);
        
        System.out.println(&quot;Null 이름 길이: &quot; + optionalNullName.map(String::length).orElse(0));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;Java 9 (2017년 출시)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 9에서는 주요한 시스템적인 변화가 있었으며, 특히 모듈 시스템 도입이 큰 변화였습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;모듈 시스템 (Project Jigsaw):&lt;/b&gt; 대규모 애플리케이션을 모듈화할 수 있는 module-info.java 도입.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JShell:&lt;/b&gt; 인터랙티브한 REPL(Read-Eval-Print Loop) 도구로, Java 코드를 바로 실행할 수 있게 함.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스트림 API 개선:&lt;/b&gt; takeWhile(), dropWhile(), iterate() 등의 메서드 추가.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HTTP/2 클라이언트:&lt;/b&gt; 비동기 HTTP/2 호출을 지원하는 새 HTTP 클라이언트 API 도입.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 모듈 시스템&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729228821340&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// module-info.java 파일을 프로젝트 루트에 생성
module mymodule {
    exports com.example.mymodule;
}

// 모듈사용예시
package com.example.mymodule;

public class MyModuleClass {
    public static void sayHello() {
        System.out.println(&quot;Hello from mymodule!&quot;);
    }
}

// 모듈을 통해서 서로 다른 패키지 간 의존성을 관리하고 접근 범위를 제어할수 있습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 인터페이스의 private메소드&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Java9부터 인터페이스에 private메소드를 정의할수 있어서 코드 재사용이 더 용이해짐&lt;/p&gt;
&lt;pre id=&quot;code_1729228956226&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface MyInterface {
    default void method1() {
        System.out.println(&quot;Method 1&quot;);
        commonMethod();
    }

    default void method2() {
        System.out.println(&quot;Method 2&quot;);
        commonMethod();
    }

    // private 메소드 정의
    private void commonMethod() {
        System.out.println(&quot;This is a common method&quot;);
    }
}

public class PrivateMethodInInterfaceExample implements MyInterface {
    public static void main(String[] args) {
        PrivateMethodInInterfaceExample obj = new PrivateMethodInInterfaceExample();
        obj.method1();
        obj.method2();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. Stream API 개선&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Java 9에서는 takeWhile, dropWhile, iterate 등의 새로운 메소드가 Stream API에 추가되었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1729228995794&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class StreamAPIExample {
    public static void main(String[] args) {
        // takeWhile 예제
        Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
              .takeWhile(n -&amp;gt; n &amp;lt; 5) // 조건이 true인 동안만 요소를 가져옴
              .forEach(System.out::println);

        // dropWhile 예제
        Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
              .dropWhile(n -&amp;gt; n &amp;lt; 5) // 조건이 true인 동안은 건너뛰고 나머지를 가져옴
              .forEach(System.out::println);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. Optional 클래스 개선&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ifPresentOrElse, or, stream 등의 새로운 메소드가 추가&lt;/p&gt;
&lt;pre id=&quot;code_1729229039344&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class OptionalExample {
    public static void main(String[] args) {
        Optional&amp;lt;String&amp;gt; optionalValue = Optional.of(&quot;Hello&quot;);

        // ifPresentOrElse 메소드
        optionalValue.ifPresentOrElse(
            System.out::println, 
            () -&amp;gt; System.out.println(&quot;Value is absent&quot;)
        );

        // stream 메소드
        optionalValue.stream()
                     .forEach(System.out::println);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. try-with-resources 개선&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729229086406&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class TryWithResourcesExample {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader(&quot;test.txt&quot;));

        // 이미 선언된 리소스를 try-with-resources에서 사용
        try (reader) {
            System.out.println(reader.readLine());
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;Java 10 (2018년 출시)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 10은 짧은 릴리스 주기로 제공되었으며, 주로 성능 향상 및 개발자 경험 개선에 초점을 맞췄습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;지역 변수 타입 추론 (var):&lt;/b&gt; 컴파일러가 자동으로 변수 타입을 추론하여 개발자가 명시적으로 타입을 선언할 필요가 없음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Garbage Collector 개선:&lt;/b&gt; G1 GC를 기본 GC로 지정하고 성능 최적화.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. var키워드를 통한 지역변수 타입 추론&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729229204029&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ExampleVar {
    public static void main(String[] args) {
        // var 키워드를 사용하여 타입 추론
        var message = &quot;Hello, Java 10!&quot;;
        System.out.println(message);

        var numbers = List.of(1, 2, 3, 4, 5);
        System.out.println(&quot;List: &quot; + numbers);

        var list = new ArrayList&amp;lt;String&amp;gt;();
        list.add(&quot;Java&quot;);
        list.add(&quot;10&quot;);
        System.out.println(&quot;ArrayList: &quot; + list);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. List.copyOf(), Set.copyOf(), Map.copyOf() 메소드&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 컬렉션을 복사하여 불변 컬렉션을 생성하는 메소드가 추가&lt;/p&gt;
&lt;pre id=&quot;code_1729229309249&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class CopyOfExample {
    public static void main(String[] args) {
        // 기존 리스트 복사하여 불변 리스트 생성
        List&amp;lt;Integer&amp;gt; originalList = List.of(1, 2, 3);
        List&amp;lt;Integer&amp;gt; copyList = List.copyOf(originalList);
        System.out.println(&quot;List.copyOf: &quot; + copyList);

        // 기존 셋 복사하여 불변 셋 생성
        Set&amp;lt;String&amp;gt; originalSet = Set.of(&quot;A&quot;, &quot;B&quot;, &quot;C&quot;);
        Set&amp;lt;String&amp;gt; copySet = Set.copyOf(originalSet);
        System.out.println(&quot;Set.copyOf: &quot; + copySet);

        // 기존 맵 복사하여 불변 맵 생성
        Map&amp;lt;String, Integer&amp;gt; originalMap = Map.of(&quot;one&quot;, 1, &quot;two&quot;, 2);
        Map&amp;lt;String, Integer&amp;gt; copyMap = Map.copyOf(originalMap);
        System.out.println(&quot;Map.copyOf: &quot; + copyMap);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. Optional.orElseThrow() 메소드&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729229355912&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class OptionalExample {
    public static void main(String[] args) {
        Optional&amp;lt;String&amp;gt; optional = Optional.of(&quot;Hello, Java 10!&quot;);

        // 값이 없을 때 NoSuchElementException을 던짐
        String value = optional.orElseThrow();
        System.out.println(value);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4&lt;b&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Collectors.toUnmodifiableList(), Collectors.toUnmodifiableSet(), Collectors.toUnmodifiableMap()&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Java 10에서는 스트림 처리 중 결과를 불변 컬렉션으로 수집하는 새로운 Collectors 메소드가 추가되었습니다. 이를 통해 수집된 컬렉션을 변경할 수 없도록 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1729229420490&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class UnmodifiableCollectorsExample {
    public static void main(String[] args) {
        // 스트림을 불변 리스트로 수집
        List&amp;lt;String&amp;gt; unmodifiableList = Stream.of(&quot;A&quot;, &quot;B&quot;, &quot;C&quot;)
                                              .collect(Collectors.toUnmodifiableList());

        System.out.println(&quot;Unmodifiable List: &quot; + unmodifiableList);

        // 리스트에 요소를 추가하려고 하면 UnsupportedOperationException 발생
        // unmodifiableList.add(&quot;D&quot;); // 실행 시 예외 발생
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5&lt;b&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;G1 가비지 컬렉터의 향상된 메모리 관리&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- G1 가비지 컬렉터가 기본 가비지 컬렉터로 설정되었으며, 전체 힙 영역을 동적으로 할당하는 기능이 추가되었습니다. 이로 인해 메모리 사용이 더욱 효율적이게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;Java 11 (2018년 출시, LTS)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 11은 장기 지원(Long-Term Support, LTS) 버전으로, 안정성과 기능을 제공하여 많은 기업에서 널리 사용됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Open JDK와 Oracle JDK 통합&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;람다 지역 변수 사용 방법 변경 (var)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;새로운 HTTP 클라이언트 API (HTTP/2 지원):&lt;/b&gt; HTTP/2 및 WebSocket을 지원하는 새 클라이언트 API가 정식으로 도입됨.&lt;br /&gt;- 버전11 부터 Java Http Client API는 최신 HTTP 표준 클라이언트를 구현하여 동기 및 비동기 프로그래밍 모델인 HTTP/1.1 및 HTTP/2를 지원함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;새로운 String 메서드:&lt;/b&gt; isBlank(), lines(), repeat(), strip() 등의 유용한 String 메서드 추가.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;표준화된 런타임 로드 가능성:&lt;/b&gt; Java 런타임에서 dynamic 클래스 파일을 로드할 수 있는 기능 추가.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;응용 프로그램의 일부로 포함할 수 있는 Java 런타임:&lt;/b&gt; 기존의 java --add-modules로 여러 모듈을 조합 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1&lt;b&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;var를 사용한 람다 표현식의 지역 변수 타입 추론&lt;/h4&gt;
&lt;pre id=&quot;code_1729229602656&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class LambdaVarExample {
    public static void main(String[] args) {
        BiFunction&amp;lt;Integer, Integer, Integer&amp;gt; add = (var a, var b) -&amp;gt; a + b;
        System.out.println(add.apply(10, 20));  // 출력: 30
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2&lt;b&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;새로운 String 메소드&lt;/h4&gt;
&lt;pre id=&quot;code_1729229652571&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class StringMethodsExample {
    public static void main(String[] args) {
        String str = &quot;  Hello Java 11!  &quot;;

        // isBlank() 메소드
        System.out.println(&quot;&quot;.isBlank());  // 출력: true

        // strip() 메소드
        System.out.println(&quot;[&quot; + str.strip() + &quot;]&quot;);  // 출력: [Hello Java 11!]

        // lines() 메소드
        String multiLineStr = &quot;Hello\nJava 11\n!&quot;;
        multiLineStr.lines().forEach(System.out::println);  
        // 출력:
        // Hello
        // Java 11
        // !

        // repeat() 메소드
        String repeated = &quot;Hello &quot;.repeat(3);
        System.out.println(repeated);  // 출력: Hello Hello Hello 
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3&lt;b&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;HTTP Client 표준화&lt;/h4&gt;
&lt;pre id=&quot;code_1729229661506&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class HttpClientExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        // HttpClient 생성
        HttpClient client = HttpClient.newHttpClient();

        // 요청 생성
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(&quot;https://postman-echo.com/get&quot;))
                .build();

        // 응답 받기
        HttpResponse&amp;lt;String&amp;gt; response = client.send(request, HttpResponse.BodyHandlers.ofString());

        // 응답 내용 출력
        System.out.println(response.body());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4&lt;b&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;파일 읽기 및 쓰기 간소화&lt;/h4&gt;
&lt;pre id=&quot;code_1729229669288&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class FileReadWriteExample {
    public static void main(String[] args) throws IOException {
        Path filePath = Path.of(&quot;example.txt&quot;);

        // 파일에 문자열 쓰기
        Files.writeString(filePath, &quot;Hello, Java 11!&quot;);

        // 파일에서 문자열 읽기
        String content = Files.readString(filePath);
        System.out.println(content);  // 출력: Hello, Java 11!
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5&lt;b&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Optional 클래스의 isEmpty() 메소드 추가&lt;/h4&gt;
&lt;pre id=&quot;code_1729229678042&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class OptionalExample {
    public static void main(String[] args) {
        Optional&amp;lt;String&amp;gt; optional = Optional.ofNullable(null);

        // isEmpty() 메소드 사용
        if (optional.isEmpty()) {
            System.out.println(&quot;Optional is empty!&quot;);  // 출력: Optional is empty!
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6&lt;b&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Java EE와 CORBA 모듈 제거&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 11에서는 자바 EE 및 CORBA 관련 모듈이 더 이상 포함되지 않으며, 자바 스크립트 엔진 사용도 중단되었습니다. 이런 모듈들은 자주 사용되지 않으며, 필요할 경우 외부 라이브러리로 대체 가능&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;Java 12 (2019년 출시)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 12는 성능 및 새로운 기능들을 실험적으로 도입한 버전입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Switch Expressions (미리보기 기능):&lt;/b&gt; switch 문을 표현식으로 사용 가능.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Garbage Collector 개선:&lt;/b&gt; G1 GC에 대한 성능 개선 및 Shenandoah GC 추가.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. switch 표현식 (Switch Expressions) - 프리뷰 기능&lt;/h4&gt;
&lt;pre id=&quot;code_1729230428729&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class SwitchExpressionExample {
    public static void main(String[] args) {
        int day = 2;

        // Java 12의 switch 표현식
        String dayName = switch (day) {
            case 1 -&amp;gt; &quot;Sunday&quot;;
            case 2 -&amp;gt; &quot;Monday&quot;;
            case 3 -&amp;gt; &quot;Tuesday&quot;;
            case 4 -&amp;gt; &quot;Wednesday&quot;;
            case 5 -&amp;gt; &quot;Thursday&quot;;
            case 6 -&amp;gt; &quot;Friday&quot;;
            case 7 -&amp;gt; &quot;Saturday&quot;;
            default -&amp;gt; throw new IllegalArgumentException(&quot;Invalid day: &quot; + day);
        };

        System.out.println(&quot;Day &quot; + day + &quot; is &quot; + dayName);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Collectors.teeing() 메소드&lt;/h4&gt;
&lt;pre id=&quot;code_1729230441044&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class TeeingCollectorExample {
    public static void main(String[] args) {
        List&amp;lt;Integer&amp;gt; numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // 평균과 합을 동시에 계산
        var result = numbers.stream()
            .collect(Collectors.teeing(
                Collectors.summingInt(Integer::intValue),
                Collectors.averagingInt(Integer::intValue),
                (sum, avg) -&amp;gt; &quot;Sum: &quot; + sum + &quot;, Average: &quot; + avg
            ));

        System.out.println(result);  // 출력: Sum: 55, Average: 5.5
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 새로운 String 메소드 (indent, transform)&lt;/h4&gt;
&lt;pre id=&quot;code_1729230451068&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class StringMethodsExample {
    public static void main(String[] args) {
        String text = &quot;Hello\nJava 12!&quot;;

        // indent() 메소드
        String indented = text.indent(4);
        System.out.println(&quot;Indented Text: &quot;);
        System.out.println(indented);

        // transform() 메소드
        String transformed = text.transform(str -&amp;gt; str.toUpperCase());
        System.out.println(&quot;Transformed Text: &quot; + transformed);  // 출력: HELLO\nJAVA 12!
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 파일 및 프로세스 API 개선&lt;/h4&gt;
&lt;pre id=&quot;code_1729230460754&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class FileMismatchExample {
    public static void main(String[] args) throws IOException {
        Path file1 = Files.writeString(Files.createTempFile(&quot;file1&quot;, &quot;.txt&quot;), &quot;Hello Java 12&quot;);
        Path file2 = Files.writeString(Files.createTempFile(&quot;file2&quot;, &quot;.txt&quot;), &quot;Hello Java 11&quot;);

        // 두 파일의 불일치 위치 찾기
        long mismatch = Files.mismatch(file1, file2);
        System.out.println(&quot;Mismatch at byte position: &quot; + mismatch);  // 출력: Mismatch at byte position: 9
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. Shenandoah 가비지 컬렉터&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 새로운 가비지 컬렉터인 &lt;b&gt;Shenandoah&lt;/b&gt;가 실험적으로 도입되었습니다. Shenandoah는 짧은 GC 지연 시간에 중점을 둔 가비지 컬렉터입니다. 이 예제는 Shenandoah GC를 직접 보여주지 않지만, GC를 활성화하는 방법은 다음과 같습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. JVM 개선 사항&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- JVM에 몇 가지 중요한 개선 사항이 추가되었습니다. 그 중 하나는 JEP 346: Promptly Return Unused Committed Memory입니다. 이 기능은 JVM이 더 이상 사용하지 않는 메모리를 시스템에 빠르게 반환할 수 있게 해줍니다. 이 기능은 특히 메모리 효율성을 높이는데 유용합니다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;Java 13 (2019년 출시)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 13은 간단한 개선 사항들을 도입했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;텍스트 블록 (Text Blocks, 미리보기):&lt;/b&gt; 여러 줄의 문자열을 더욱 가독성 있게 작성할 수 있는 기능.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Switch Expressions (미리보기):&lt;/b&gt; Switch 표현식이 더욱 간결하게 개선됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 텍스트 블록 (Text Blocks) - 프리뷰 기능&lt;/h4&gt;
&lt;pre id=&quot;code_1729230700614&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class TextBlockExample {
    public static void main(String[] args) {
        String textBlock = &quot;&quot;&quot;
                Hello, Java 13!
                This is a text block.
                It makes multi-line strings easier to write.
                &quot;&quot;&quot;;

        System.out.println(textBlock);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. switch 표현식의 정식 도입&lt;/h4&gt;
&lt;pre id=&quot;code_1729230719570&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class SwitchExpressionExample {
    public static void main(String[] args) {
        int day = 2;

        // Java 13의 switch 표현식
        String dayName = switch (day) {
            case 1 -&amp;gt; &quot;Sunday&quot;;
            case 2 -&amp;gt; &quot;Monday&quot;;
            case 3 -&amp;gt; &quot;Tuesday&quot;;
            case 4 -&amp;gt; &quot;Wednesday&quot;;
            case 5 -&amp;gt; &quot;Thursday&quot;;
            case 6 -&amp;gt; &quot;Friday&quot;;
            case 7 -&amp;gt; &quot;Saturday&quot;;
            default -&amp;gt; throw new IllegalArgumentException(&quot;Invalid day: &quot; + day);
        };

        System.out.println(&quot;Day &quot; + day + &quot; is &quot; + dayName);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. yield를 사용한 switch 표현식&lt;/h4&gt;
&lt;pre id=&quot;code_1729230734222&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class YieldInSwitchExample {
    public static void main(String[] args) {
        int score = 85;

        // Java 13의 switch 표현식에서 yield 사용
        String grade = switch (score / 10) {
            case 10, 9 -&amp;gt; &quot;A&quot;;
            case 8 -&amp;gt; &quot;B&quot;;
            case 7 -&amp;gt; &quot;C&quot;;
            case 6 -&amp;gt; &quot;D&quot;;
            default -&amp;gt; {
                // 여러 줄의 복잡한 로직이 있을 때 yield 사용 가능
                System.out.println(&quot;Failing grade.&quot;);
                yield &quot;F&quot;;
            }
        };

        System.out.println(&quot;Grade: &quot; + grade);  // 출력: Grade: B
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. ZGC (Z Garbage Collector) 개선&lt;br /&gt;5. 힙 영역 확장 (Dynamic CDS Archives)&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;Java 14 (2020년 출시)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 14는 생산성 향상을 위한 몇 가지 흥미로운 기능을 도입했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Pattern Matching for instanceof (미리보기):&lt;/b&gt; instanceof와 타입 캐스팅을 결합하여 코드 간소화.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Record 타입 (미리보기):&lt;/b&gt; 불변 데이터 구조를 간결하게 정의할 수 있는 Record 타입 추가.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;NPE 개선:&lt;/b&gt; NullPointerException 발생 시 더 구체적인 정보를 제공하도록 개선.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. switch 표현식의 개선 (Switch Expressions) - 정식 도입&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- switch 표현식이 정식 기능으로 도입되었습니다. 이 기능은 yield를 사용하여 결과를 반환할 수 있으며, 기존의 switch 문보다 간결한 코드를 작성할 수 있습니다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. NullPointerException의 상세 메시지 개선&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- NullPointerException의 메시지를 더 상세하게 표시할 수 있게 되었습니다. 이제 어디에서 null이 발생했는지 정확한 정보를 얻을 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 레코드 (Records) - 프리뷰 기능&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729231035804&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 레코드 정의
public record Person(String name, int age) {}

public class RecordExample {
    public static void main(String[] args) {
        // 레코드 인스턴스 생성
        Person person = new Person(&quot;John&quot;, 25);

        // 자동 생성된 메소드 사용
        System.out.println(person.name());  // 출력: John
        System.out.println(person.age());   // 출력: 25
        System.out.println(person);         // 출력: Person[name=John, age=25]
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 패턴 매칭을 이용한 instanceof&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- instanceof 구문에서 타입 캐스팅을 더 간결하게 할 수 있는 &lt;b&gt;패턴 매칭&lt;/b&gt; 기능이 추가되었습니다. 이제 instanceof로 타입을 확인한 후, 바로 해당 타입으로 변환할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729231062390&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class InstanceofPatternMatchingExample {
    public static void main(String[] args) {
        Object obj = &quot;Hello, Java 14!&quot;;

        // 패턴 매칭을 사용한 instanceof
        if (obj instanceof String s) {
            System.out.println(s.toUpperCase());  // 출력: HELLO, JAVA 14!
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. helpful NullPointerExceptions 옵션&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- NullPointerException에 대한 유용한 정보가 포함된 상세 메시지를 제공하는 &lt;b&gt;helpful NullPointerExceptions&lt;/b&gt; 옵션이 추가되었습니다. 이를 통해 디버깅이 훨씬 쉬워집니다. JVM을 실행할 때 다음과 같은 옵션을 추가할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729231102149&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java -XX:+ShowCodeDetailsInExceptionMessages MyApp.jar&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6. JEP 367: ZGC on macOS and Windows&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- ZGC(Z Garbage Collector)가 macOS와 Windows에서도 사용 가능하게 되었습니다. ZGC는 매우 짧은 지연 시간으로 동작하는 가비지 컬렉터입니다. 예제 코드로는 직접 확인하기 어렵지만, ZGC를 사용하는 방식은 다음과 같습니다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729231136248&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java -XX:+UseZGC -Xmx4g -Xms4g MyApp.jar&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;Java 15 (2020년 출시)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 15는 여러 실험적 기능들을 완성시키는 중요한 버전입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;텍스트 블록 (Text Blocks, 정식):&lt;/b&gt; 여러 줄 문자열을 쉽게 작성할 수 있도록 하는 기능이 정식으로 도입됨.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Sealed 클래스 (미리보기):&lt;/b&gt; 클래스 계층을 제한하는 기능으로, 특정 클래스만 상속할 수 있도록 허용.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hidden 클래스:&lt;/b&gt; 런타임에서 생성되고 이후 다시 사용되지 않는 클래스들을 위한 기능.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 레코드 (Records) - 개선&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Sealed Classes (봉인된 클래스) - 프리뷰 기능&lt;/h4&gt;
&lt;pre id=&quot;code_1729231299717&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 봉인된 클래스 정의
public sealed class Shape permits Circle, Square {}

final class Circle extends Shape {
    double radius;
}

final class Square extends Shape {
    double side;
}

public class SealedClassExample {
    public static void main(String[] args) {
        Shape shape1 = new Circle();
        Shape shape2 = new Square();
        System.out.println(&quot;Shape1 is a &quot; + shape1.getClass().getSimpleName());
        System.out.println(&quot;Shape2 is a &quot; + shape2.getClass().getSimpleName());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 텍스트 블록 (Text Blocks) - 정식 도입&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 패턴 매칭을 이용한 instanceof의 개선&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 숨겨진 클래스 (Hidden Classes)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- **숨겨진 클래스 (Hidden Classes)**라는 기능이 추가되었습니다. 이 클래스는 런타임에만 사용되고, 직접적으로 참조할 수 없는 클래스로, 주로 프레임워크에서 동적으로 클래스를 생성할 때 유용합니다. 예제 코드로는 다소 복잡하며, 프레임워크 수준에서 주로 사용됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;Java 16 (2021년 출시)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 16은 성능과 생산성 향상에 초점을 맞췄습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Record (정식):&lt;/b&gt; Record 타입이 정식 기능으로 도입되어 불변 객체의 선언이 간소화됨.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;패턴 매칭 for instanceof (정식):&lt;/b&gt; instanceof와 함께 사용 가능한 패턴 매칭이 정식으로 도입됨.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Stream.toList():&lt;/b&gt; 스트림을 리스트로 쉽게 변환할 수 있는 새로운 메서드 추가.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 레코드 (Records)&lt;/b&gt; - 정식 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 패턴 매칭을 이용한 instanceof&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; - 정식 도입&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Stream API 개선&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 프록시의 직렬화 기능 개선&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. Vector API (Incubator)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729231439852&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class VectorAPIExample {
    public static void main(String[] args) {
        // Int 벡터 연산 예제
        VectorSpecies&amp;lt;Integer&amp;gt; SPECIES = IntVector.SPECIES_256;
        int[] a = {1, 2, 3, 4, 5, 6, 7, 8};
        int[] b = {1, 2, 3, 4, 5, 6, 7, 8};
        int[] c = new int[8];

        var av = IntVector.fromArray(SPECIES, a, 0);
        var bv = IntVector.fromArray(SPECIES, b, 0);
        var cv = av.add(bv);
        cv.intoArray(c, 0);

        for (int value : c) {
            System.out.println(value);  // 출력: 2 4 6 8 10 12 14 16
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. Sealed Classes (봉인된 클래스)&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; - 프리뷰 기능 (계속 개선)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;Java 17 (2021년 출시, LTS)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 17은 Java 11 이후의 두 번째 장기 지원(LTS) 버전으로, 많은 새로운 기능과 안정성 개선이 포함되었습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Sealed 클래스 (정식):&lt;/b&gt; 서브클래스를 제한하는 기능이 정식으로 도입됨.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pattern Matching for switch (미리보기):&lt;/b&gt; switch 문에서 패턴 매칭을 사용할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Foreign Function &amp;amp; Memory API (미리보기):&lt;/b&gt; 외부 메모리 접근과 외부 함수 호출을 보다 효율적으로 할 수 있는 API 추가.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &lt;b&gt;패턴 매칭을 이용한 switch 표현식&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729231508806&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class PatternMatchingSwitchExample {
    public static void main(String[] args) {
        Object obj = &quot;Hello, Java 17!&quot;;

        // 패턴 매칭을 이용한 switch 표현식
        String result = switch (obj) {
            case Integer i -&amp;gt; &quot;Integer: &quot; + i;
            case String s -&amp;gt; &quot;String: &quot; + s;
            case null -&amp;gt; &quot;Null value&quot;;
            default -&amp;gt; &quot;Unknown type&quot;;
        };

        System.out.println(result);  // 출력: String: Hello, Java 17!
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 레코드 (Records)와 Sealed Classes의 조합&lt;/h4&gt;
&lt;pre id=&quot;code_1729231536921&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public sealed interface Shape permits Circle, Rectangle {}

public record Circle(double radius) implements Shape {}

public record Rectangle(double width, double height) implements Shape {}

public class SealedRecordExample {
    public static void main(String[] args) {
        Shape shape = new Circle(5.0);

        String description = switch (shape) {
            case Circle c -&amp;gt; &quot;Circle with radius: &quot; + c.radius();
            case Rectangle r -&amp;gt; &quot;Rectangle with width: &quot; + r.width() + &quot; and height: &quot; + r.height();
        };

        System.out.println(description);  // 출력: Circle with radius: 5.0
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 강력한 Random구현&lt;/h4&gt;
&lt;pre id=&quot;code_1729231566108&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class RandomExample {
    public static void main(String[] args) {
        // RandomGenerator 인터페이스를 이용한 랜덤 숫자 생성기
        RandomGenerator generator = RandomGeneratorFactory.of(&quot;Xoshiro256PlusPlus&quot;).create();

        for (int i = 0; i &amp;lt; 5; i++) {
            System.out.println(generator.nextInt(100));  // 0부터 100 사이의 난수 출력
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;Java 18 (2022년 출시)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 18은 주로 성능과 개발자 경험 향상에 초점을 맞춘 버전입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Simple Web Server:&lt;/b&gt; 간단한 개발 및 테스트용 웹 서버 추가.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;UTF-8 기본 문자 인코딩:&lt;/b&gt; 모든 플랫폼에서 UTF-8을 기본 인코딩으로 사용하도록 표준화.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Simple Web Server&lt;/h4&gt;
&lt;pre id=&quot;code_1729231615403&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class SimpleWebServerExample {
    public static void main(String[] args) throws IOException {
        // HTTP 서버 생성
        HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);

        // 요청에 대해 간단한 응답 작성
        server.createContext(&quot;/&quot;, exchange -&amp;gt; {
            String response = &quot;Hello, Java 18!&quot;;
            exchange.sendResponseHeaders(200, response.getBytes().length);
            exchange.getResponseBody().write(response.getBytes());
            exchange.close();
        });

        // 서버 시작
        server.start();
        System.out.println(&quot;Server started at http://localhost:8080&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Code Snippets in JavaDoc (JEP 413)&lt;/h4&gt;
&lt;pre id=&quot;code_1729231663918&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * 이 클래스는 Java 18의 JavaDoc 코드 스니펫 기능을 보여줍니다.
 * {@snippet :
 *  // JavaDoc에 코드 예시 삽입
 *  System.out.println(&quot;Hello, JavaDoc Snippets!&quot;);
 * }
 */
public class JavadocSnippetExample {
    public static void main(String[] args) {
        System.out.println(&quot;Hello, Java 18!&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;Java 19 (2022년 출시)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 19는 새로운 기능을 실험적으로 도입했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Virtual Threads (미리보기):&lt;/b&gt; Java의 동시성 모델을 개선하여 더 많은 스레드를 효율적으로 처리할 수 있도록 지원.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Structured Concurrency (미리보기):&lt;/b&gt; 여러 스레드 작업을 구조화하여 처리하는 API.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;Java 20 (2023년 출시)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 20에서는 주로 이전에 도입된 기능을 확장하거나 실험적 기능들을 개선했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Virtual Threads (확장된 미리보기):&lt;/b&gt; 가벼운 스레드로 성능 최적화 및 개선.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pattern Matching for switch (확장된 미리보기):&lt;/b&gt; switch 문에서 더 강력한 패턴 매칭 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;&lt;b&gt;Java 21 (2023년 출시, LTS)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 21은 새로운 LTS 버전으로 장기적으로 지원되며, 많은 주요 기능을 정식으로 도입했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Virtual Threads (정식):&lt;/b&gt; 동시성 프로그래밍을 쉽게 할 수 있도록 돕는 가벼운 스레드 기능이 정식으로 추가됨.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pattern Matching for switch (정식):&lt;/b&gt; switch 문에서 더 복잡한 패턴 매칭이 가능하게 되었음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Record Patterns (정식):&lt;/b&gt; record와 함께 사용할 수 있는 패턴 매칭 지원.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Sequenced Collections:&lt;/b&gt; 순서를 보장하는 새로운 컬렉션 인터페이스 도입.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &lt;b&gt;Virtual Threads (가상 스레드) - 정식 기능&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729231826467&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class VirtualThreadExample {
    public static void main(String[] args) throws InterruptedException {
        // 가상 스레드를 사용하는 ExecutorService 생성
        try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
            for (int i = 0; i &amp;lt; 10; i++) {
                executor.submit(() -&amp;gt; {
                    System.out.println(&quot;Running on virtual thread: &quot; + Thread.currentThread());
                });
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. &lt;b&gt;Pattern Matching for switch - 정식 기능&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729231837094&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class PatternMatchingSwitchExample {
    public static void main(String[] args) {
        Object obj = &quot;Java 21&quot;;

        // 패턴 매칭을 사용하는 switch 표현식
        String result = switch (obj) {
            case Integer i -&amp;gt; &quot;Integer: &quot; + i;
            case String s -&amp;gt; &quot;String: &quot; + s.toUpperCase();
            case null -&amp;gt; &quot;Null value&quot;;
            default -&amp;gt; &quot;Unknown type&quot;;
        };

        System.out.println(result);  // 출력: String: JAVA 21
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. &lt;b&gt;Sequenced Collections&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729231849751&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class SequencedCollectionExample {
    public static void main(String[] args) {
        SequencedCollection&amp;lt;String&amp;gt; sequencedList = new LinkedList&amp;lt;&amp;gt;();
        sequencedList.addFirst(&quot;First&quot;);
        sequencedList.addLast(&quot;Last&quot;);

        System.out.println(&quot;First element: &quot; + sequencedList.getFirst());
        System.out.println(&quot;Last element: &quot; + sequencedList.getLast());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. &lt;b&gt;String Templates - 프리뷰 기능&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729231889942&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class StringTemplateExample {
    public static void main(String[] args) {
        int age = 25;
        String name = &quot;Alice&quot;;

        // 문자열 템플릿을 사용한 간결한 표현
        String result = STR.&quot;Hello, \{name}! You are \{age} years old.&quot;;
        System.out.println(result);  // 출력: Hello, Alice! You are 25 years old.
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. &lt;b&gt;Unnamed Classes and Instance Main Methods - 프리뷰 기능&lt;/b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729231900864&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MainExample {
    void main() {
        System.out.println(&quot;Instance Main Method&quot;);
    }

    public static void main(String[] args) {
        new MainExample().main();  // 출력: Instance Main Method
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6. Foreign Function &amp;amp; Memory API - 정식 기능&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729231880184&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ForeignFunctionMemoryExample {
    public static void main(String[] args) {
        try (MemorySegment segment = MemorySegment.allocateNative(JAVA_INT)) {
            segment.set(JAVA_INT, 0, 42);
            int value = segment.get(JAVA_INT, 0);
            System.out.println(&quot;Value from native memory: &quot; + value);  // 출력: 42
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Java 8:&lt;/b&gt; 람다, 스트림 API, 새로운 날짜 및 시간 API 등.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Java 9~10:&lt;/b&gt; 모듈 시스템과 var 타입 추론 등.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Java 11:&lt;/b&gt; LTS 버전으로 HTTP 클라이언트 API와 새로운 String 메서드.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Java 12~15:&lt;/b&gt; Switch 표현식, 텍스트 블록, 패턴 매칭 등의 실험적 기능.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Java 16~17:&lt;/b&gt; Record와 Sealed 클래스 정식 도입, 패턴 매칭 기능 강화.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Java 18~21:&lt;/b&gt; Virtual Threads, Pattern Matching for switch 등의 동시성 및 패턴 매칭 기능 개선.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 버전마다 Java 언어와 런타임에 중요한 개선 사항들이 도입되었으며, 특히 Java 8, 11, 17, 21은 LTS 버전으로 장기적인 지원을 제공합니다.&lt;/p&gt;</description>
      <category>  Develop/✏️ JAVA</category>
      <category>자바버전차이</category>
      <author>주뇬</author>
      <guid isPermaLink="true">https://explored.tistory.com/92</guid>
      <comments>https://explored.tistory.com/entry/Java-821-%EB%B2%84%EC%A0%84%EB%B3%84-%EC%B0%A8%EC%9D%B4%EC%A0%90#entry92comment</comments>
      <pubDate>Fri, 18 Oct 2024 14:13:41 +0900</pubDate>
    </item>
    <item>
      <title>JAVA (JDK, JRE, JVM 차이점)</title>
      <link>https://explored.tistory.com/entry/JAVA-JDK-JRE-JVM-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ JAVA (JVM, JRE, JDK과 버전 명명법)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;1. &lt;b&gt;JVM (Java Virtual Machine)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정의:&lt;/b&gt; JVM은 &lt;b&gt;Java Virtual Machine&lt;/b&gt;으로, Java 애플리케이션을 실행하는 가상 머신입니다. Java는 플랫폼 독립적인 언어로 설계되었기 때문에, JVM은 운영체제에 따라 Java 애플리케이션을 실행할 수 있도록 도와줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;역할:&lt;/b&gt; 컴파일된 바이트코드(.class 파일)를 읽고, 이를 각 운영체제에 맞게 실행하는 역할을 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제와 상관없이 Java 애플리케이션이 실행될 수 있게 함.&lt;/li&gt;
&lt;li&gt;메모리 관리 및 가비지 컬렉션(Garbage Collection)을 수행.&lt;/li&gt;
&lt;li&gt;바이트코드를 해석하여 네이티브 코드로 변환.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;플랫폼 독립성:&lt;/b&gt; 한 번 작성된 Java 코드가 여러 운영체제에서 실행될 수 있는 &quot;Write Once, Run Anywhere&quot; 개념을 지원합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;2. &lt;b&gt;JRE (Java Runtime Environment)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정의:&lt;/b&gt; JRE는 &lt;b&gt;Java Runtime Environment&lt;/b&gt;로, Java 애플리케이션을 &lt;b&gt;실행&lt;/b&gt;하기 위해 필요한 환경입니다. JVM과 함께 Java의 핵심 라이브러리 및 리소스를 포함합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;역할:&lt;/b&gt; JVM을 포함하고, Java 애플리케이션이 실행되기 위해 필요한 라이브러리, 클래스 파일 등을 제공합니다. JRE는 Java 애플리케이션을 실행하는 데 필요한 모든 것들을 갖추고 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구성 요소:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;JVM&lt;/b&gt;: 애플리케이션을 실행하는 가상 머신.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;라이브러리&lt;/b&gt;: Java 애플리케이션이 필요로 하는 표준 클래스 라이브러리(rt.jar).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기타 리소스&lt;/b&gt;: 클래스 파일 및 구성 파일.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 시기:&lt;/b&gt; JRE는 Java 애플리케이션을 실행만 하고자 할 때 사용됩니다. &lt;b&gt;개발 도구&lt;/b&gt;는 포함되어 있지 않으므로, 코드를 작성하거나 컴파일할 수는 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;3. &lt;b&gt;JDK (Java Development Kit)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정의:&lt;/b&gt; JDK는 &lt;b&gt;Java Development Kit&lt;/b&gt;으로, Java 애플리케이션을 &lt;b&gt;개발하고 실행&lt;/b&gt;하는 데 필요한 도구 모음입니다. JRE와 개발 도구(컴파일러 등)가 포함되어 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;역할:&lt;/b&gt; JDK는 Java 애플리케이션을 &lt;b&gt;개발&lt;/b&gt;하고, &lt;b&gt;컴파일&lt;/b&gt;하고, &lt;b&gt;디버깅&lt;/b&gt;하고, &lt;b&gt;패키징&lt;/b&gt;하는 데 필요한 도구들을 제공합니다. JDK에는 JRE와 더불어 개발에 필요한 도구들이 추가되어 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구성 요소:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;JRE&lt;/b&gt;: Java 애플리케이션 실행을 위한 런타임 환경.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Javac&lt;/b&gt;: Java 컴파일러로, .java 파일을 .class 파일(바이트코드)로 변환.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;디버거 및 기타 도구&lt;/b&gt;: Java 애플리케이션을 개발하고 디버깅하는 데 필요한 도구들(javap, jdb 등).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 시기:&lt;/b&gt; JDK는 Java 애플리케이션을 &lt;b&gt;개발&lt;/b&gt;할 때 필요합니다. 개발 도구와 실행 환경(JRE)을 모두 포함하고 있기 때문에, 애플리케이션을 개발하고 실행할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;JAVA버전 JAVA1.8 or JAVA8 로 부르게 된 이유&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Java8 이전에는 다음과 같은 형태로 표시 하였습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Java SE 5 &amp;rarr; 1.5.0&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Java SE 6 &amp;rarr; 1.6.0&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Java SE 7 &amp;rarr; 1.7.0&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Java SE 8 &amp;rarr; 1.8.0&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JAVA SE 9 이후 부터는 앞의 1을 없애고, 주 버전 번호만 사용하는 방식으로 변했습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Java 9 &amp;rarr; 9&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Java 10 &amp;rarr; 10&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Java 11 &amp;rarr; 11&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Java 17 &amp;rarr; 17&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;상세 버전 정보를 말할때는 11.0.8 이렇게 표현하기 도 합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Develop/✏️ JAVA</category>
      <category>Java JDK</category>
      <category>java jre</category>
      <category>java jvm</category>
      <category>jvm jre jdk 차이</category>
      <author>주뇬</author>
      <guid isPermaLink="true">https://explored.tistory.com/91</guid>
      <comments>https://explored.tistory.com/entry/JAVA-JDK-JRE-JVM-%EC%B0%A8%EC%9D%B4%EC%A0%90#entry91comment</comments>
      <pubDate>Fri, 18 Oct 2024 13:36:57 +0900</pubDate>
    </item>
    <item>
      <title>소프트웨어 아키텍처란?</title>
      <link>https://explored.tistory.com/entry/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98%EB%9E%80</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ &lt;b&gt;소프트웨어 아키텍처란?&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-end=&quot;223&quot; data-start=&quot;156&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;소프트웨어 시스템을 구성하는 컴포넌트들, 그들의 관계, 상호작용 방식, 그리고 이를 지배하는 원칙들을 정의한 것.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;329&quot; data-start=&quot;228&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;246&quot; data-start=&quot;228&quot;&gt;&lt;b&gt;무엇이 어디에 위치하고&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;269&quot; data-start=&quot;247&quot;&gt;&lt;b&gt;무엇이 무엇과 연결되어 있으며&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;289&quot; data-start=&quot;270&quot;&gt;&lt;b&gt;어떻게 통신하고 협력하며&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;329&quot; data-start=&quot;290&quot;&gt;&lt;b&gt;변화에 어떻게 대응할 수 있는지&lt;/b&gt; 를 설계&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ &lt;b&gt;왜 중요한가?&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;381&quot; data-start=&quot;351&quot;&gt;&lt;b&gt;확장성&lt;/b&gt;: 트래픽이 늘어도 잘 버틸 수 있도록&lt;/li&gt;
&lt;li data-end=&quot;408&quot; data-start=&quot;382&quot;&gt;&lt;b&gt;유지보수성&lt;/b&gt;: 수정/추가가 쉬워야 하고&lt;/li&gt;
&lt;li data-end=&quot;440&quot; data-start=&quot;409&quot;&gt;&lt;b&gt;재사용성&lt;/b&gt;: 중복 없는 코드 구조를 만들기 위해&lt;/li&gt;
&lt;li data-end=&quot;473&quot; data-start=&quot;441&quot;&gt;&lt;b&gt;배포 유연성&lt;/b&gt;: 부분 배포, 롤백 등이 가능하도록&lt;/li&gt;
&lt;li data-end=&quot;517&quot; data-start=&quot;474&quot;&gt;&lt;b&gt;이해도&lt;/b&gt;: 팀원 누구든 시스템을 쉽게 이해하고 동작시킬 수 있어야 함&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-end=&quot;538&quot; data-start=&quot;524&quot; data-ke-size=&quot;size26&quot;&gt;✅ &lt;b&gt;핵심 구성 요소&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 136px;&quot; border=&quot;1&quot; data-end=&quot;853&quot; data-start=&quot;540&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;b&gt;요소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-end=&quot;628&quot; data-start=&quot;568&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;컴포넌트(Component)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;독립적인 기능 단위 (ex. 사용자 서비스, 결제 서비스 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-end=&quot;686&quot; data-start=&quot;629&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;모듈(Module)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;컴포넌트를 구성하는 코드 묶음 (ex. 도메인, 애플리케이션 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-end=&quot;748&quot; data-start=&quot;687&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;인터페이스(Interface)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;컴포넌트 간 통신 방법 (ex. REST API, 메시지 큐)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-end=&quot;804&quot; data-start=&quot;749&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;데이터 흐름(Data Flow)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;데이터가 시스템 안에서 어떻게 이동하고 처리되는지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-end=&quot;853&quot; data-start=&quot;805&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;구성(Configuration)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;외부 시스템, 설정값, 배포 전략 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-end=&quot;879&quot; data-start=&quot;860&quot; data-ke-size=&quot;size26&quot;&gt;✅ &lt;b&gt;대표적인 아키텍처 스타일&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1241&quot; data-start=&quot;881&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;아키텍처 스타일&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;980&quot; data-start=&quot;925&quot;&gt;
&lt;td&gt;&lt;b&gt;Monolithic&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;하나의 큰 애플리케이션으로 구성, 배포가 쉽지만 확장성이 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1041&quot; data-start=&quot;981&quot;&gt;
&lt;td&gt;&lt;b&gt;Layered (계층형)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;프레젠테이션, 서비스, 도메인, 인프라 등으로 나누는 전통적 구조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1118&quot; data-start=&quot;1042&quot;&gt;
&lt;td&gt;&lt;b&gt;Hexagonal (Ports &amp;amp; Adapters)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;의존성 방향을 도메인 중심으로 역전시켜 유연성과 테스트 용이성 확보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1187&quot; data-start=&quot;1119&quot;&gt;
&lt;td&gt;&lt;b&gt;Microservices (MSA)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;작은 서비스 단위로 분리, 독립 배포 가능, 복잡도와 운영 비용 증가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1241&quot; data-start=&quot;1188&quot;&gt;
&lt;td&gt;&lt;b&gt;Event-driven&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;이벤트 중심, 비동기 메시지 기반으로 느슨한 결합 구현&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-end=&quot;1271&quot; data-start=&quot;1248&quot; data-ke-size=&quot;size26&quot;&gt;✅ &lt;b&gt;좋은 소프트웨어 아키텍처의 특징&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1373&quot; data-start=&quot;1273&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1293&quot; data-start=&quot;1273&quot;&gt;&lt;b&gt;SOLID 원칙&lt;/b&gt;을 잘 반영&lt;/li&gt;
&lt;li data-end=&quot;1310&quot; data-start=&quot;1294&quot;&gt;&lt;b&gt;의존성 방향이 명확&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1328&quot; data-start=&quot;1311&quot;&gt;&lt;b&gt;도메인과 기술을 분리&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1347&quot; data-start=&quot;1329&quot;&gt;&lt;b&gt;테스트 가능성과 확장성&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1373&quot; data-start=&quot;1348&quot;&gt;&lt;b&gt;비즈니스 요구 변화에 유연하게 대응&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Develop/⚙️ Arch &amp;amp; Design</category>
      <category>소프트웨어 아키텍처</category>
      <author>주뇬</author>
      <guid isPermaLink="true">https://explored.tistory.com/90</guid>
      <comments>https://explored.tistory.com/entry/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98%EB%9E%80#entry90comment</comments>
      <pubDate>Mon, 14 Oct 2024 01:23:43 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 htop 시스템 모니터링</title>
      <link>https://explored.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-htop-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 리눅스 htop 시스템 모니터링&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;top 으로 리소스 사용량 모니터링 체크를 할수도있지만 자세히 보고 싶을경우 htop을 이용하자 시각적으로도 좋다&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# ubuntu&lt;br /&gt;sudo apt-get install htop&lt;br /&gt;# macbook&lt;br /&gt;brew install htop&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1555&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRktO/btsJ27mNKvA/kPwxPk4uLCrlktSyK9qEY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRktO/btsJ27mNKvA/kPwxPk4uLCrlktSyK9qEY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRktO/btsJ27mNKvA/kPwxPk4uLCrlktSyK9qEY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRktO%2FbtsJ27mNKvA%2FkPwxPk4uLCrlktSyK9qEY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1555&quot; height=&quot;281&quot; data-origin-width=&quot;1555&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&quot;특징&quot; style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;htop 화면을 살펴보면 왼쪽 상단에 CPU, swap메모리,메모리 사용률이 표현되어 있으며, 하단에는 모니터링되고 있는 프로세스가 보이며 1초에 한 번씩 갱신됩니다&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;선택된 프로세스를 죽이거나, 우선순위를 변경할 수 있습니다.특정 프로세스 이름으로 검색, 필터링하여 현황을 볼 수 있습니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;pstree와 top을 함께 보는 기능이 있습니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;cpu의 코어 갯수를 확인해서 각 프로세스의 정보를 top보다 더 디테일하게 모니터링이 가능합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;시스템-전체-cpu-사용률&quot; style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;시스템 전체 CPU 사용률&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;최상단 왼쪽에 CPU/코어별 사용률이 보이는데 게이지바의 색깔이 의미하는 바는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;파랑: 우선 순위가 낮은 프로세스(nice &amp;gt; 0)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;초록: 일반(사용자) 프로세스&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;빨강: 커널 프로세스&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;노랑: IRQ time&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;자주: Soft IRQ time&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;회색: IO Wait time&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;시스템-전체-메모리-사용률&quot; style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;시스템 전체 메모리 사용률&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;CPU 사용률 아래에 메모리와 스왑 사용량이 보이는데 게이지바의 색깔이 의미하는 바는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;초록: 사용 중인 메모리 페이지&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;파랑: 버퍼 페이지&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;노랑: 캐쉬 페이지&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;평균-부하율load-average&quot; style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;평균 부하율(Load average)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;일정 시간 동안의 평균 부하율로 top이나 uptime과 마찬가지로 1, 5, 15분 간격으로 평균 수치가 나옵니다. 싱글 코어 CPU일 때 1.0이면 사용률이 100% 임을 의미합니다. 쿼드 코어라면 4.0이 100%입니다. 다만 이때 1.0을 넘을 수도 있는데 이는 CPU를 할당받기 위해 프로세스들이 기다려야 함을 뜻합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;프로세스-정보&quot; style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;프로세스 정보&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PID&lt;/span&gt;&lt;/b&gt;: 프로세스의 프로세스 ID 번호&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;USER&lt;/b&gt;: 프로세스의 소유자&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;PR&lt;/b&gt;: 프로세스의 우선순위&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;NI&lt;/b&gt;: 우선순위에 영향을 주는 프로세스의 nice 값&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;VIRT&lt;/b&gt;: 프로세스가 사용 중인 가상 메모리 양&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;RES&lt;/b&gt;: 프로세스가 사용 중인 물리 RAM의 양(단위는 킬로바이트)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;SHR&lt;/b&gt;: 프로세스가 사용 중인 공유 메모리 양&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;S&lt;/b&gt;: 프로세스의 현재 상태(zombied, sleeping, running, uninterruptedly sleeping, traced)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;%CPU&lt;/b&gt;: 프로세스가 프로세서를 사용한 시간의 백분율&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;%MEM&lt;/b&gt; : 프로세스가 사용 중인 물리 RAM의 백분율&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;TIME+&lt;/b&gt;: 프로세스가 프로세서를 사용한 시간&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;COMMAND&lt;/b&gt;: 프로세스 시작에 사용한 명령어&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;단축키-설명&quot; style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;단축키 설명&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;F1&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: htop의 도움말을 볼 수 있으며, 단축키의 기능을 알 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;F2&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 설정, 설정에서는 상단에 보여줄 CPU. 메모리에 대한 정보를 추가/제거 할 수 있으며, 디스플레이 옵션 설정도 가능합니다.&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;F3&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: &amp;ldquo;/&amp;rdquo; 눌러 해당 프로세스를 검색할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;F4&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 원하는 프로세스만 모니터링&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;F5&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 프로세스의 부모 자식 관계를 트리 형태로 보여주는 기능&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;F6&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 프로세스 정렬&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;F7, F8&lt;/b&gt;: 프로세스의 우선 순위을 바꾸는 단축키.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;F9&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: htop에서 해 당 프로세스를 선택 후 F9 또는 &amp;ldquo;k&amp;rdquo;키를 입력하여 해당 프로세스를 종료&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;F10&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: htop을 종료 합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;l&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 그 프로세스가 열고 있는 파일들을 볼 수 있습니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;u&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 특정 사용자의 프로세스만 보기&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;k&lt;/b&gt;: 현재 또는 선택된 프로세스를 종료&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;M&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;메모리 사용량으로 프로세스를 정렬&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;b&gt;P&lt;/b&gt;: CPU 사용량으로 프로세스를 정렬&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>  Develop/  Server</category>
      <category>htop</category>
      <category>리눅스 htop</category>
      <category>리눅스 메모리</category>
      <category>리눅스 모니터링</category>
      <author>주뇬</author>
      <guid isPermaLink="true">https://explored.tistory.com/89</guid>
      <comments>https://explored.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-htop-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81#entry89comment</comments>
      <pubDate>Fri, 11 Oct 2024 15:33:40 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 netstat 열린 포트 확인(LISTEN)</title>
      <link>https://explored.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-netstat-%EC%97%B4%EB%A6%B0-%ED%8F%AC%ED%8A%B8-%ED%99%95%EC%9D%B8LISTEN</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 리눅스 netstat 열린 포트 확인(LISTEN)&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서버의 열린 포트를 확인 할때 자주 사용하는 명령어&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;옵션&lt;br /&gt;&lt;/b&gt;-n&amp;nbsp;:&amp;nbsp;호스트명,&amp;nbsp;포트명을&amp;nbsp;lookup하지&amp;nbsp;않고&amp;nbsp;그대로&amp;nbsp;IP,&amp;nbsp;Port번호로&amp;nbsp;보여준다.&lt;br /&gt;-a&amp;nbsp;:&amp;nbsp;모든&amp;nbsp;네트웍&amp;nbsp;상태를&amp;nbsp;보여준다.&lt;br /&gt;-l&amp;nbsp;:&amp;nbsp;LINTEN&amp;nbsp;상태인&amp;nbsp;서비스&amp;nbsp;포트를&amp;nbsp;보여준다.&lt;br /&gt;-t&amp;nbsp;:&amp;nbsp;TCP&amp;nbsp;프로토콜만&amp;nbsp;보여준다.&lt;br /&gt;-u&amp;nbsp;:&amp;nbsp;UDP&amp;nbsp;프로토콜만&amp;nbsp;보여준다.&lt;br /&gt;-p&amp;nbsp;:&amp;nbsp;해당&amp;nbsp;포트를&amp;nbsp;사용하는&amp;nbsp;프로그램과&amp;nbsp;프로세스ID(PID)를&amp;nbsp;보여준다.&lt;br /&gt;-r&amp;nbsp;:&amp;nbsp;라우팅&amp;nbsp;테이블&amp;nbsp;출력&lt;br /&gt;-s&amp;nbsp;:&amp;nbsp;프로토콜별(IP,&amp;nbsp;ICMP,&amp;nbsp;TCP,&amp;nbsp;UDP&amp;nbsp;등)로&amp;nbsp;통계를&amp;nbsp;보여준다&lt;br /&gt;-c&amp;nbsp;:&amp;nbsp;1초&amp;nbsp;단위로&amp;nbsp;결과값을&amp;nbsp;연속적으로&amp;nbsp;보여준다.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;netstat -antp&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv41al/btsJ13ZWZWh/GwMcFCJ2Ek6VR2wuW2FHG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv41al/btsJ13ZWZWh/GwMcFCJ2Ek6VR2wuW2FHG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv41al/btsJ13ZWZWh/GwMcFCJ2Ek6VR2wuW2FHG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv41al%2FbtsJ13ZWZWh%2FGwMcFCJ2Ek6VR2wuW2FHG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1020&quot; height=&quot;179&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  Develop/  Server</category>
      <category>리눅스 netstat</category>
      <category>리눅스 열린 포트 확인</category>
      <category>리눅스 포트</category>
      <author>주뇬</author>
      <guid isPermaLink="true">https://explored.tistory.com/88</guid>
      <comments>https://explored.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-netstat-%EC%97%B4%EB%A6%B0-%ED%8F%AC%ED%8A%B8-%ED%99%95%EC%9D%B8LISTEN#entry88comment</comments>
      <pubDate>Fri, 11 Oct 2024 15:17:18 +0900</pubDate>
    </item>
    <item>
      <title>vim 단축키</title>
      <link>https://explored.tistory.com/entry/vim-%EB%8B%A8%EC%B6%95%ED%82%A4</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ vim 단축키&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;585&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8837%;&quot; width=&quot;213&quot; height=&quot;24&quot;&gt;카테고리&lt;/td&gt;
&lt;td style=&quot;width: 24.6512%;&quot; width=&quot;100&quot;&gt;단축키&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot; width=&quot;272&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8837%;&quot; rowspan=&quot;15&quot; height=&quot;360&quot;&gt;삽입모드&lt;/td&gt;
&lt;td style=&quot;width: 24.6512%;&quot;&gt;i&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;현재 커서 앞에 삽입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;I&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;현재 커서 행 시작에 삽입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;a&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;현재 커서 뒤에 삽입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;A&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;현재 커서 행 끝에 삽입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;o&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;현재 커서 행 아래에 새 행을 삽입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;O&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;현재 커서 행 위에 새 행을 삽입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;Ctrl + h&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;이전 문자 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;Ctrl + w&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;이전 단어 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;Ctrl + j&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 줄 바꿈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;Ctrl + t&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 탭 들여쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;Ctrl + d&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 탭 내어쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;Ctrl + n&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;다음 단어 탐색 (자동완성)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;Ctrl + p&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;이전 단어 탐색 (자동완성)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;Ctrl + rx&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;레지스터 x의 내용 삽입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;Esc&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;삽입모드 종료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8837%;&quot; rowspan=&quot;19&quot; height=&quot;456&quot;&gt;편집모드&lt;/td&gt;
&lt;td style=&quot;width: 24.6512%;&quot;&gt;r&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 글자 바꾸기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;J&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;현재 행과 다음 행 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;gJ&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;현재 행과 다음 행 연결 (공백무시)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;gwip&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;단락 리플로우&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;g~&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;커서 이동으로 대&amp;middot;소문자 전환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;gu&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;커서 이동으로 소문자 전환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;gU&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;커서 이동으로 대문자 전환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;cc&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 행 전체 새로 쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;C&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 행 끝까지 새로 쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;c$&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 행 끝까지 새로 쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;ciw&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 단어 전체 새로 쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;cw&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 단어 끝까지 새로 쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;s&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 문자 새로 쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;S&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 행 전체 새로 쓰기 (cc와 동일)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;xp&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;잘라내고 붙여넣기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;u&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;실행취소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;U&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;최근 수정한 줄 복원(실행취소)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;Ctrl + r&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;다시실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;최근 명령어 반복&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8837%;&quot; rowspan=&quot;13&quot; height=&quot;312&quot;&gt;선택모드(비주얼모드)&lt;/td&gt;
&lt;td style=&quot;width: 24.6512%;&quot;&gt;v&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;비주얼 모드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;V&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;비주얼 라인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;o&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;선택 영역 반대쪽 끝으로 점프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;Ctrl + v&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;비주얼 블록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;O&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;블록의 반대쪽 모서리로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;aw&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;단어 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;ab&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;소괄호() 구간 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;aB&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;중괄호{} 구간 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;at&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;태그&amp;lt;&amp;gt; 구간 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;ib&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;소괄호() 내부 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;iB&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;중괄호{} 내부 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;it&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;태그&amp;lt;&amp;gt; 내부 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;Esc&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;선택 모드 종료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8837%;&quot; rowspan=&quot;24&quot; height=&quot;576&quot;&gt;레지스터&lt;/td&gt;
&lt;td style=&quot;width: 24.6512%;&quot;&gt;&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;선택 행 들여쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;&amp;lt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;선택 행 내어쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;y&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;선택 구간 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;d&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;선택 구간 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;~&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;대소문자 반전&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;u&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;선택 구간 소문자 전환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;U&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;선택 구간 대문자 전환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;:reg[isters]&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;레지스터 내용 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; width=&quot;100&quot; height=&quot;24&quot;&gt;&quot;xy&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;레지스터 x 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;&quot;xp&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;레지스터 x 붙여넣기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;&quot;+y&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;클립보드 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; width=&quot;100&quot; height=&quot;24&quot;&gt;&quot;+p&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;클립보드 붙여넣기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;최근 복사 레지스터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;&quot;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;최근 사용 레지스터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;%&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;현재 파일명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;#&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;대체 파일명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;*&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;클립보드 (X11 primary)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;+&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;클립보드 (X11 clipboard)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;/&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;최근 검색 패턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;:&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;최근 Vim 명령줄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;최근 삽입 텍스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;최근 제거 문자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;=&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;표현식 레지스터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;_&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;블랙홀 레지스터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8837%;&quot; rowspan=&quot;15&quot; height=&quot;360&quot;&gt;마킹&lt;/td&gt;
&lt;td style=&quot;width: 24.6512%;&quot;&gt;:marks&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;마킹 항목 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;ma&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;현재 위치를 a로 마킹&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;`a&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;마크 a로 점프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;y`a&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;마크 a까지 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;`0&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;종료 전 커서위치로 점프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;`&quot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;최근 편집한 커서 위치로 점프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;`.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;최근 변경한 커서 위치로 점프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;``&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;최근 점프 전 위치로 점프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;:ju[mps]&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;점프목록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;Ctrl + i&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;이전 점프목록 위치로 점프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;Ctrl + o&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;다음 점프목록 위치로 점프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;:changes&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;변경목록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;g,&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;이전 변경목록 위치로 점프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;g;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;다음 변경목록 위치로 점프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;Ctrl + ]&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;커서가 가리키는 태그로 점프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8837%;&quot; rowspan=&quot;4&quot; height=&quot;96&quot;&gt;매크로&lt;/td&gt;
&lt;td style=&quot;width: 24.6512%;&quot;&gt;qa&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;매크로 a 기록 시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;q&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;매크로 기록 중지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;@a&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;매크로 a 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;@@&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;최근 매크로 재실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8837%;&quot; rowspan=&quot;12&quot; height=&quot;288&quot;&gt;잘라내기 붙여넣기&lt;/td&gt;
&lt;td style=&quot;width: 24.6512%;&quot;&gt;yy&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 행 복사하기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;2yy&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;2줄 복사하기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;yw&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;다음 단어까지 복사하기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;y$&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 행 끝까지 복사하기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;p&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;커서 뒤에 붙여넣기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;P&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;커서 앞에 붙여넣기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;dd&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 행 잘라내기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;2dd&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;2줄 잘라내기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;dw&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;다음 단어까지 잘라내기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;D&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 행 끝까지 잘라내기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;d$&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 행 끝까지 잘라내기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;x&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 문자 잘라내기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8837%;&quot; rowspan=&quot;10&quot; height=&quot;240&quot;&gt;문단모양&lt;/td&gt;
&lt;td style=&quot;width: 24.6512%;&quot;&gt;&amp;gt;&amp;gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 탭 들여쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;&amp;lt;&amp;lt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;한 탭 내어쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;&amp;gt;%&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;중&amp;middot;소괄호 구간 들여쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;&amp;gt;ib&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;소괄호 내부 들여쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;&amp;gt;at&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;태그 구간 들여쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;3==&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;3줄 자동정렬&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;=%&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;중&amp;middot;소괄호 구간 자동정렬&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;#NAME?&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;중괄호 내부 자동정렬&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;gg=G&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;전체 버퍼 자동정렬&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;]p&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;붙여쓰고 현재 행 들여쓰기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8837%;&quot; rowspan=&quot;8&quot; height=&quot;192&quot;&gt;검색 바꾸기&lt;/td&gt;
&lt;td style=&quot;width: 24.6512%;&quot;&gt;/pattern&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;패턴 검색 (순방향)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;?pattern&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;패턴 검색 (역방향)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;\vpattern&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;특수 매직 패턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;n&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;다음 검색항목으로 점프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;N&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;이전 검색항목으로 점프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;:%s/old/new/g&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;모든 old를 new로 바꾸기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;:%s/old/new/gc&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;모든 old를 new로 확인하며 바꾸기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.6512%;&quot; height=&quot;24&quot;&gt;:noh[lsearch]&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.3488%;&quot;&gt;검색 하이라이트 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;세로모드 수정하기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Ctrl + v를 눌러 column mode에 진입&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;방향키를 이용하여 행 선택&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Shift + i 입력 수정 모드 진입&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;수정하기 -&amp;nbsp; 첫 줄에서만 수정하는 것 처럼 보임&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;ESC 2번 / 선택한 세로줄 수정 완료&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>  Develop/  Server</category>
      <category>VI 단축키</category>
      <category>vim 단축키</category>
      <author>주뇬</author>
      <guid isPermaLink="true">https://explored.tistory.com/87</guid>
      <comments>https://explored.tistory.com/entry/vim-%EB%8B%A8%EC%B6%95%ED%82%A4#entry87comment</comments>
      <pubDate>Tue, 8 Oct 2024 14:28:50 +0900</pubDate>
    </item>
    <item>
      <title>python chromedriver Exec format error</title>
      <link>https://explored.tistory.com/entry/python-chromedriver-Exec-format-error</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;  python chromedriver Exec format error&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맥북(m1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 되던게 갑자기 안된다??? 왜그런걸까??&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;OSError: [Errno 8] Exec format error: '/Users/naya/.wdm/drivers/chromedriver/mac64/127.0.6533.88/chromedriver-mac-arm64/THIRD_PARTY_NOTICES.chromedriver'&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러내용을 보니 이상한걸 실행하는것 같다??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크롬드라이버를 실행해야지?? 써드파티는 왜 실행하는거지??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 경로로 가보니&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFLTNI/btsIQxPi1pW/g6McHj9kceknnGL29Q50Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFLTNI/btsIQxPi1pW/g6McHj9kceknnGL29Q50Q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFLTNI/btsIQxPi1pW/g6McHj9kceknnGL29Q50Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFLTNI%2FbtsIQxPi1pW%2Fg6McHj9kceknnGL29Q50Q1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;429&quot; height=&quot;164&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chromedriver가 있는데 왜 써드를 실행시킬까? &lt;br /&gt;THIRD_PAR.... 파일을 지우고 실행해보았다.&lt;br /&gt;해당 파일이 없으면 파이선에서 chromedriver 파일을 실행 해 줄것이라고 예상을 했지만..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@_@???&lt;br /&gt;THIRD_PARTY_NOTICES.chromedriver 파일이 다시 생성이 되었고.. 내 예상의 chromedriver를 실행해 주지 않았다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;THIRD_PARTY_NOTICES.chromedriver 파일을 지워버리고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chromedriver 파일의&amp;nbsp; 파일명을 -&amp;gt; THIRD_PARTY_NOTICES.chromedriver 변경하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1724019125466&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;THIRD_PARTY_NOTICES.chromedriver&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CZeJV/btsIRditbep/Dv9lpdCEuYFN58ktfNpIOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CZeJV/btsIRditbep/Dv9lpdCEuYFN58ktfNpIOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CZeJV/btsIRditbep/Dv9lpdCEuYFN58ktfNpIOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCZeJV%2FbtsIRditbep%2FDv9lpdCEuYFN58ktfNpIOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;653&quot; height=&quot;123&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;123&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 파이선을 실행하니 예전처럼 정상동작을 하였습니다. ^^&lt;/p&gt;</description>
      <category>  Error Fixed</category>
      <category>chrome exec format error</category>
      <category>exec format errer</category>
      <category>python chrome exec format error</category>
      <category>python exec format error</category>
      <author>주뇬</author>
      <guid isPermaLink="true">https://explored.tistory.com/86</guid>
      <comments>https://explored.tistory.com/entry/python-chromedriver-Exec-format-error#entry86comment</comments>
      <pubDate>Thu, 1 Aug 2024 09:36:40 +0900</pubDate>
    </item>
  </channel>
</rss>