<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>lxn_ee.log</title>
        <link>https://velog.io/</link>
        <description>개발 일기 ( •̀ ω •́ )✧</description>
        <lastBuildDate>Tue, 06 Aug 2024 13:00:14 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>lxn_ee.log</title>
            <url>https://velog.velcdn.com/images/lxn_ee/profile/841de6ca-a204-4b5e-9284-28ba9a93620a/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. lxn_ee.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/lxn_ee" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[날짜 및 시간]]></title>
            <link>https://velog.io/@lxn_ee/%EB%82%A0%EC%A7%9C-%EB%B0%8F-%EC%8B%9C%EA%B0%84</link>
            <guid>https://velog.io/@lxn_ee/%EB%82%A0%EC%A7%9C-%EB%B0%8F-%EC%8B%9C%EA%B0%84</guid>
            <pubDate>Tue, 06 Aug 2024 13:00:14 GMT</pubDate>
            <description><![CDATA[<h1 id="javatime-pakage">java.time Pakage</h1>
<ul>
<li>자바 8 부터 추가된 날짜와 시간을 조작하는 여러 가지 추가된 API</li>
</ul>
<h2 id="javatime-pakage에는-아래-5개의-클래스가-존재">java.time Pakage에는 아래 5개의 클래스가 존재</h2>
<ul>
<li><p><strong>LocalDate</strong></p>
<ul>
<li><p>로컬 날짜 클래스</p>
<pre><code class="language-java">package Java;

import java.time.LocalDate;

public class HelloJava {
  public static void main(String[] args) {
      LocalDate nowDate = LocalDate.now();
      System.out.println(nowDate.getYear()); // 2024
      System.out.println(nowDate.getMonthValue()); // 7
      System.out.println(nowDate.getDayOfMonth()); // 27
      System.out.println(nowDate.getDayOfYear()); // 209
      System.out.println(nowDate.getDayOfWeek()); // SATURDAY
      System.out.println(nowDate.getDayOfWeek().getValue()); // 6
      System.out.println(nowDate.lengthOfMonth()); // 31
      System.out.println(nowDate.lengthOfYear()); // 366
  }
}</code></pre>
</li>
</ul>
</li>
<li><p><strong>LocalTime</strong></p>
<ul>
<li><p>로컬 시간 클래스</p>
<pre><code class="language-java">package Java;

import java.time.LocalTime;

public class HelloJava {
  public static void main(String[] args) {
      LocalTime time = LocalTime.of(1,5,8,123456789);
      System.out.println(time.getHour()); // 1
      System.out.println(time.getMinute()); // 5
      System.out.println(time.getSecond()); // 8
      System.out.println(time.getNano()); // 123456789
  }
}</code></pre>
</li>
</ul>
</li>
<li><p><strong>LocalDateTime</strong></p>
<ul>
<li><p>로컬 날짜 및 시간 클래스 (LocalDate + LocalTime)</p>
<pre><code class="language-java">package Java;

import java.time.LocalDateTime;

public class HelloJava {
  public static void main(String[] args) {
      LocalDateTime now = LocalDateTime.now();
      System.out.println(now.getYear()); // 2024
      System.out.println(now.getMonthValue()); // 7
      System.out.println(now.getDayOfMonth()); // 27
      System.out.println(now.getDayOfYear()); // 209
      System.out.println(now.getDayOfWeek()); // SATURDAY
      System.out.println(now.getDayOfWeek().getValue()); // 6
      System.out.println(now.getHour()); // 1
      System.out.println(now.getMinute()); // 5
      System.out.println(now.getSecond()); // 8
      System.out.println(now.getNano()); // 123456789
  }
}</code></pre>
</li>
</ul>
</li>
<li><p><strong>ZonedDateTime</strong></p>
<ul>
<li><p>특정 타임존(TimeZone)의 날짜와 시간 클래스</p>
</li>
<li><p><code>2014-04-21T07:50:24.017+09:00[Asia/Seoul]</code> 처럼 타임존 정보가 추가</p>
<pre><code class="language-java">package Java;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class HelloJava {
  public static void main(String[] args) {
      LocalDateTime dateTime = LocalDateTime.now();
      System.out.println(dateTime); // 2024-07-28T15:25:12.047011100

      ZonedDateTime zoneDateTime = ZonedDateTime.now();
      System.out.println(zoneDateTime); // 2024-07-28T15:25:12.047011100+09:00[Asia/Seoul]

      ZonedDateTime utcDateTime = zoneDateTime.withZoneSameInstant(ZoneId.of(&quot;UTC&quot;));
      System.out.println(utcDateTime); // 2024-07-28T06:25:12.047011100Z[UTC]
  }
}</code></pre>
</li>
</ul>
</li>
<li><p><strong>Instant</strong></p>
<ul>
<li><p>특정 시점의 Time-Stamp 클래스</p>
</li>
<li><p>주로 특정한 두 시점 간의 시간적 우선순위를 따질 때 사용</p>
<pre><code class="language-java">package Java;

import java.time.Instant;
import java.time.temporal.ChronoUnit;

public class HelloJava {
  public static void main(String[] args) {
      Instant instant1 = Instant.now();
      Instant instant2 = Instant.now();

      if(instant1.isBefore(instant2)) {
          System.out.println(&quot;instant1이 빠릅니다.&quot;);
      } else if(instant1.isAfter(instant2)) {
          System.out.println(&quot;instant1이 늦습니다.&quot;);
      } else {
          System.out.println(&quot;동일한 시간입니다.&quot;);
      }

      // 두 시간의 차 구하기
      System.out.println(&quot;차이(nanos) : &quot; + instant1.until(instant2, ChronoUnit.NANOS));
  }
}</code></pre>
</li>
</ul>
</li>
</ul>
<h1 id="날짜-및-시간에-대한-정보-획득-메소드">날짜 및 시간에 대한 정보 획득 메소드</h1>
<ul>
<li><strong>LocalDate 메소드</strong></li>
</ul>
<pre><code>| 메소드 | 설명 |  |
| --- | --- | --- |
| LocalDate now() | 현재 날짜로 LocalDate 인스턴스 |  |
| LocalDate parse(CharSequence text) | DateTimeFormatter에는 표준화 된 포맷터를 이용하여 LocalDate 반환 |  |
| LocalDate parse(CharSequence text, DateTimeFormatter formatter) | 커스텀 된 DateTimeFormatter 포맷터를 이용하여 LocalDate 반환 |  |
| LocalDate of(int year, int month, int dayOfMonth)
LocalDate of(int year, Month month, int dayOfMonth) | 설정한 날짜로 LocalDate 인스턴스 |  |
| int getYear() | 연도(2024) |  |
| int getMonthValue() | 월(1~12) |  |
| int getDayOfMonth() | 일(1~31) |  |
| int getDayOfYear() | 해당 해의 1월 1일부터 몇번째 일(365) |  |
| DayOfWeek getDayOfWeek() | 요일(SUNDAY~SATURDAY)
getDayOfWeek().getValue() 를 통해 0(일)~6(토)로 획득 가능 |  |
| int lengthOfMonth() | 해당 달의 총 일수 |  |
| int lengthOfYear() | 해당 해의 총 일수 |  |</code></pre><ul>
<li><strong>LocalTime 메소드</strong></li>
</ul>
<pre><code>| 메소드 | 설명 |
| --- | --- |
| LocalTime now() | 현재 시간으로 LocalTime 인스턴스 |
| LocalTime parse(CharSequence text) | DateTimeFormatter에는 표준화 된 포맷터를 이용하여 LocalTime 반환 |
| LocalTime parse(CharSequence text, DateTimeFormatter formatter) | 커스텀 된 DateTimeFormatter 포맷터를 이용하여 LocalTime 반환 |
| LocalTime of(int hour, int minute)
LocalTime of(int hour, int minute, int second) LocalTime of(int hour, int minute, int second, int nanoOfSecond) | 설정한 시간으로 LocalTime 인스턴스 |
| int get Hour() | 시(0~23) |
| int getMinute() | 분(0~59) |
| int getSecond() | 초(0~59) |
| int geetNano() | 나노초(0~999999999) |</code></pre><ul>
<li><strong>LocalDateTime 메소드</strong></li>
</ul>
<pre><code>| 메소드 | 설명 |
| --- | --- |
| LocalDateTime now() | 현재 날짜로 LocalDate 인스턴스 |
| LocalDateTime parse(CharSequence text) | DateTimeFormatter에는 표준화 된 포맷터를 이용하여 LocalDateTime 반환 |
| LocalDateTime parse(CharSequence text, DateTimeFormatter formatter) | 커스텀 된 DateTimeFormatter 포맷터를 이용하여 LocalDateTime 반환 |
| LocalDateTime of(int year, int month, int dayOfMonth) | 설정한 날짜로 LocalDate 인스턴스 |
| int getYear() | 연도(2024) |
| int getMonthValue() | 월(1~12) |
| int getDayOfMonth() | 일(1~31) |
| int getDayOfYear() | 같은 해의 1월 1일부터 몇번째 일(365) |
| DayOfWeek getDayOfWeek() | 요일(SUNDAY~SATURDAY)
getDayOfWeek().getValue() 를 통해 0(일)~6(토)로 획득 가능 |
| int get Hour() | 시(0~23) |
| int getMinute() | 분(0~59) |
| int getSecond() | 초(0~59) |
| int geetNano() | 나노초(0~999999999) |
| LocalDate toLocalDate() | LocalDate 타입으로 반환 |
| LocalTime toLocalTime() | LocalTime 타입으로 반환 |</code></pre><ul>
<li><strong>ZonedDateTime 메소드</strong></li>
</ul>
<pre><code>| 메소드 | 설명 |
| --- | --- |
| ZonedDateTime now()ZonedDateTime now(ZoneId zone)
ZonedDateTime now(Clock clock) | Zone Date Time 인스턴스 생성 |
| ZonedDateTime parse(CharSequence text) | DateTimeFormatter에는 표준화 포맷터를 이용하여 ZonedDateTime 반환 |
| ZonedDateTime parse(CharSequence text, DateTimeFormatter formatter) | 커스텀 된 DateTimeFormatter 포맷터를 이용하여 ZonedDateTime 반환 |
| ZonedDateTime withZoneSameInstant(ZoneId zone) | zone 기준시로 DateTime 생성 |
| ZoneId getZone() | Zone ID 반환 |</code></pre><h1 id="날짜-및-시간-변경-관련-메소드">날짜 및 시간 변경 관련 메소드</h1>
<ul>
<li><p><strong><code>LocalDate</code>, <code>LocalDateTime</code>, <code>ZonedDateTime</code> 에서 모두 사용 가능</strong></p>
<ul>
<li><p>리턴 타입은 각 클래스와 동일</p>
<table>
<thead>
<tr>
<th>메소드</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>withYear(int year)</td>
<td>연 변경</td>
</tr>
<tr>
<td>withMonth(int month)</td>
<td>월 변경</td>
</tr>
<tr>
<td>withDayOfMonth(int dayOfMonth)</td>
<td>일 변경</td>
</tr>
<tr>
<td>withDayOfYear(int dayOfYear)</td>
<td>해당 연의 첫날 기준, dayOfYear일 후로 변경</td>
</tr>
<tr>
<td>withHour(int hour)</td>
<td>시 변경</td>
</tr>
<tr>
<td>withMinute(int minute)</td>
<td>분 변경</td>
</tr>
<tr>
<td>withSecond(int second)</td>
<td>초 변경</td>
</tr>
<tr>
<td>withNano(int nano)</td>
<td>나노초 변경</td>
</tr>
<tr>
<td>with(TemporalAdjuster.Method())</td>
<td>TemporalAdjuster의 Static Method를 이용하여 날짜 및 시간을 상대 변경</td>
</tr>
</tbody></table>
</li>
</ul>
</li>
<li><p><strong><code>TemporalAdjusters</code> Static Methods</strong></p>
</li>
</ul>
<pre><code>| 메소드 | 설명 |
| --- | --- |
| firstDayOfYear() | 해당 해의 첫 번째 일 |
| lastDayOfYear() | 해당 해의 마지막 일 |
| firstDayOfMonth() | 해당 달의 첫 번째 일 |
| lastDayOfMonth() | 해당 달의 마지막 일 |
| firstDayOfNextYear() | 다음 해의 첫 번째 일 |
| firstDayOfNextMonth() | 다음 달의 첫 번째 일 |
| firstInMonth(DayOfWeek dayOfWeek) | 해당 요일의 그 달 첫 번째 요일 |
| lastInMonth(DayOfWeek dayOfWeek) | 해당 요일의 그 달 마지막 요일 |
| next(DayOfWeek dayOfWeek) | 돌아오는 요일 |
| nextOrSame(DayOfWeek dayOfWeek) | 오늘 포함 돌아오는 요일 |
| previous(DayOfWeek dayOfWeek) | 지난 요일 |
| previousOrSame(DayOfWeek dayOfWeek) | 오늘 포함 지난 요일 |</code></pre><ul>
<li><strong>LocalDate 메소드</strong></li>
</ul>
<pre><code>| 메소드 | 설명 |
| --- | --- |
| boolean isBefore(ChronoLocalDate other) | other보다 이전 날짜인지 판별 후 리턴 |
| boolean isAfter(ChronoLocalDate other) | other보다 이후 날짜인지 판별 후 리턴 |
| boolean isEqual(ChronoLocalDate other) | other과 동일 날짜인지 판별 후 리턴 |
| Period until(ChronoLocalDate endDateExclusive) | endDateExclusive와 날짜의 차이를 반환
예) 2020-01-01 과 2024-07-28일 경우 27 반환 |
| long until(Temporal endExclusive, TemporalUnit unit) | 설정한 unit 단위로 날짜 및 시간의 차이를 반환
ChronoUnit unit은 DAYS, WEEKS, MONTHS, YEARS, DECADES, CENTURIES, MILLENNIA , ERAS 를 지원 
예) 2020-01-01 과 2024-07-28일을 DAYS로 차이를 구할 경우 1670 반환 |</code></pre><ul>
<li><strong>LocalTime 메소드</strong></li>
</ul>
<h1 id="날짜-및-시간-포맷팅-관련-메소드">날짜 및 시간 포맷팅 관련 메소드</h1>
<ul>
<li><strong>LocalDate 메소드</strong></li>
</ul>
<pre><code>| 메소드 | 설명 |
| --- | --- |
| String format(DateTimeFormatter formatter) | DateTimeFormatter 형식대로 문자열을 리턴 |</code></pre><ul>
<li><strong>LocalTime메소드</strong></li>
</ul>
<pre><code>| 메소드 | 설명 |
| --- | --- |
| String format(DateTimeFormatter formatter) | DateTimeFormatter 형식대로 문자열을 리턴 |</code></pre><ul>
<li><strong>LocalDateTime 메소드</strong></li>
</ul>
<pre><code>| 메소드 | 설명 |
| --- | --- |
| String format(DateTimeFormatter formatter) | DateTimeFormatter 형식대로 문자열을 리턴 |</code></pre><ul>
<li><strong>ZonedDateTime 메소드</strong></li>
</ul>
<pre><code> | 메소드 | 설명 |
| --- | --- |
| String format(DateTimeFormatter formatter) | DateTimeFormatter 형식대로 문자열을 리턴 |</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[콜렉션 프레임워크(Collection Framework)]]></title>
            <link>https://velog.io/@lxn_ee/%EC%BD%9C%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%ACCollection-Framework</link>
            <guid>https://velog.io/@lxn_ee/%EC%BD%9C%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%ACCollection-Framework</guid>
            <pubDate>Tue, 06 Aug 2024 12:52:50 GMT</pubDate>
            <description><![CDATA[<h1 id="콜렉션-프레임워크collection-framework란">콜렉션 프레임워크(Collection Framework)란?</h1>
<ul>
<li>각 자료 구조(Data Structure)들을 자바 클래스로 구현한 모음</li>
<li>데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 둔 것</li>
<li>콜렉션 프레임워크에는 객체만 저장 가능</li>
<li>표준화가 되어 있어 사용법이 편하고 재사용성이 높다.</li>
<li>웹 개발 현장에서 자주 사용되는 콜렉션 클래스는 ArrayList, LinkedList, HashMap, HashSet 정도</li>
</ul>
<h1 id="배열과-컬렉션의-비교">배열과 컬렉션의 비교</h1>
<table>
<thead>
<tr>
<th>특성</th>
<th>배열</th>
<th>컬렉션</th>
</tr>
</thead>
<tbody><tr>
<td>크기 관리</td>
<td>고정 크기</td>
<td>동적 크기</td>
</tr>
<tr>
<td>요소 타입</td>
<td>단일 타입</td>
<td>제네릭스로 다양한 타입 지원</td>
</tr>
<tr>
<td>성능</td>
<td>높은 성능</td>
<td>성능은 자료구조에 따라 다름</td>
</tr>
<tr>
<td>유연성</td>
<td>낮음</td>
<td>높음</td>
</tr>
<tr>
<td>메서드 제공</td>
<td>제한적</td>
<td>다양한 메서드 제공</td>
</tr>
<tr>
<td>타입 안전성</td>
<td>없음</td>
<td>제네릭스를 통한 타입 안전성 제공</td>
</tr>
<tr>
<td>동기화</td>
<td>없음</td>
<td>동기화 지원으로 멀티 스레딩 환경에서 안전</td>
</tr>
</tbody></table>
<h1 id="콜렉션-프레임워크collection-framework의-종류">콜렉션 프레임워크(Collection Framework)의 종류</h1>
<p><img src="https://velog.velcdn.com/images/lxn_ee/post/f58d684b-680f-40ec-b6a9-002cf4d9517e/image.png" alt=""></p>
<ul>
<li>크게 Collection Interface와 Map Interface로 나뉜다.</li>
<li>대부분의 콜렉션 클래스는 List, Set, Map 중 하나를 구현하고 있으며, 구현한 인터페이스명을 클래스명으로 사용</li>
</ul>
<h1 id="iterable-interface">Iterable Interface</h1>
<ul>
<li>콜렉션 인터페이스들의 최상위 인터페이스</li>
<li>이터레이터 객체를 관리하는 인터페이스<h2 id="구현-메소드">구현 메소드</h2>
</li>
</ul>
<table>
<thead>
<tr>
<th>메소드</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>default void forEach(Consumer&lt;? super T&gt; action)</td>
<td>함수형 프로그래밍 전용 루프 메소드</td>
</tr>
<tr>
<td>Iterator<T> iterator()</td>
<td>콜렉션에서 이터레이터 구현</td>
</tr>
<tr>
<td>default Spliterator<T> splierator()</td>
<td>파이프라이닝 관련 메소드</td>
</tr>
</tbody></table>
<h1 id="collection-interface">Collection Interface</h1>
<ul>
<li>List, Set, Queue에 구현되는 실질적 최상위 콜렉션 타입</li>
</ul>
<hr>
<p>더보기 
<a href="https://hill-sweatshirt-1f4.notion.site/Collection-Framework-fb268d37b9284ff9b37174fa69735efa">https://hill-sweatshirt-1f4.notion.site/Collection-Framework-fb268d37b9284ff9b37174fa69735efa</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[정규 표현식(Regular Expression)]]></title>
            <link>https://velog.io/@lxn_ee/%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9DRegular-Expression</link>
            <guid>https://velog.io/@lxn_ee/%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9DRegular-Expression</guid>
            <pubDate>Tue, 06 Aug 2024 12:50:17 GMT</pubDate>
            <description><![CDATA[<h1 id="정규-표현식regular-expression">정규 표현식(Regular Expression)</h1>
<h1 id="정규-표현식regular-expression이란">정규 표현식(Regular Expression)이란?</h1>
<ul>
<li>문자열을 검색하거나 변경하기 위해 사용되는 패턴을 나타내는 문자열</li>
<li>일반적으로 정규식(Regex) 로 줄여 부른다.</li>
<li>복잡한 패턴의 문자열 검증 절차를 간단하게 표현 가능</li>
<li>대부분의 언어에서 정규식 문법이 비슷하다.</li>
<li>여러 기호를 조합하여 사용하기에 가독성이 좋지 않다.</li>
<li>언어에 따라 시작기호와 종료기호를 생략하는 경우도 있다.</li>
</ul>
<h1 id="java에서의-정규-표현식regular-expression-사용법">Java에서의 정규 표현식(Regular Expression) 사용법</h1>
<ul>
<li><p><strong>String Class 이용</strong></p>
<pre><code class="language-java">  package Java;

  public class HelloJava {
      public static void main(String[] args) {
          String str = &quot;Hello World&quot;; // 체크할 문자열
          String pattern1 = &quot;[a-zA-Z]+&quot;; // 체크할 패턴, 1글자 이상 영어 대소문자만 허용
          String pattern2 = &quot;[0-9]+&quot;; // 체크할 패턴, 1글자 이상 숫자만 허용
          String pattern3 = &quot;[a-zA-Z ]+&quot;; // 체크할 패턴, 1글자 이상 영어 대소문자 및 공백 허용

          System.out.println(str.matches(pattern1)); // false
          System.out.println(str.matches(pattern2)); // false
          System.out.println(str.matches(pattern3)); // true
      }
  }</code></pre>
</li>
</ul>
<p>Regex Package 이용
정규식을 Pattern 객체로 미리 컴파일 해둘수 있어서 처리 속도가 좀 더 빠르다
매칭된 데이터를 좀더 상세히 다룰 수 있다.</p>
<pre><code class="language-java">package Java;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HelloJava {
    public static void main(String[] args) {
        String str = &quot;Hello World&quot;; // 체크할 문자열

        // 특정 패턴의 Pattern 객체 인스턴스
        Pattern pattern1 = Pattern.compile(&quot;[a-zA-Z]+&quot;); // 체크할 패턴, 1글자 이상 영어 대소문자만 허용
        Pattern pattern2 = Pattern.compile(&quot;[0-9]+&quot;); // 체크할 패턴, 1글자 이상 숫자만 허용
        Pattern pattern3 = Pattern.compile(&quot;[a-zA-Z ]+&quot;); // 체크할 패턴, 1글자 이상 영어 대소문자 및 공백 허용

        // Pattern.matcher() 메서드를 통해 문자열을 검사하고 필터링된 결과를 Matcher 객체로 반환
        Matcher matcher1 = pattern1.matcher(str);
        Matcher matcher2 = pattern2.matcher(str);
        Matcher matcher3 = pattern3.matcher(str);

        System.out.println(matcher1.matches()); // false
        System.out.println(matcher2.matches()); // false
        System.out.println(matcher3.matches()); // true
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/lxn_ee/post/bc01c4ea-149e-482c-acf4-7db6169f6188/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[예외처리(Exception Hnadling)]]></title>
            <link>https://velog.io/@lxn_ee/%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%ACException-Hnadling</link>
            <guid>https://velog.io/@lxn_ee/%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%ACException-Hnadling</guid>
            <pubDate>Wed, 24 Jul 2024 03:33:31 GMT</pubDate>
            <description><![CDATA[<h1 id="에러error와-예외exception">에러(Error)와 예외(Exception)</h1>
<ul>
<li><strong>에러(Error)</strong>
소스코드에 의해서 수습될 수 없는 심각한 오류</li>
<li><strong>예외(Exception)</strong>
소스코드에 의해서 수습될 수 있는 다소 미약한 오류</li>
</ul>
<h1 id="예외처리exception-handling이란">예외처리(Exception Handling)이란?</h1>
<ul>
<li>코드 실행 중에 발생하는 예외나 오류가 원인으로 전체 시스템의 비정상 동작을 방지하는 기술</li>
<li>예외가 주로 발생하는 원인은 아래와 같다.<ul>
<li>처리 로직이 잘못 작성된 경우</li>
<li>산술 연산이 잘못된 경우</li>
<li>잘못된 데이터가 입력 된 경우</li>
<li>하드웨어 및 소프트웨어의 오작동의 경우</li>
<li>시스템 및 네트워크의 과부하 등의 경우<h1 id="java-예외처리-인터페이스-및-클래스">Java 예외처리 인터페이스 및 클래스</h1>
<img src="https://velog.velcdn.com/images/lxn_ee/post/176470c2-68a3-4025-a17d-7fa48a4a29bf/image.png" alt=""></li>
</ul>
</li>
</ul>
<h1 id="try-catch-finally">try, catch, finally</h1>
<ul>
<li>예외처리를 위한 문법</li>
<li>각 블록은 아래와 같은 기능을 담당<ul>
<li>try
예외가 발생할 가능성이 있는 처리를 작성
예외처리를 좀 더 세세하게 처리하고 싶을 경우 catch 블럭을 여러개 작성 가능 </li>
<li>catch
발생한 예외의 처리를 작성</li>
<li>finally
예외 발생 여부와 상관없이 가장 마지막에 항상 실행되는 처리 작성<pre><code class="language-java">package Java;
</code></pre>
</li>
</ul>
</li>
</ul>
<p>public class HelloJava {
    public static void main(String[] args) {
        try {
            System.out.println(&quot;Try block&quot;);</p>
<pre><code>        double result = 10 / 0; // 예외가 발생하는 처리
    } catch (Exception e) {
        System.out.println(&quot;Catch block&quot;);
        System.out.println(e.getMessage()); // 예외 메세지 출력
    } finally {
        System.out.println(&quot;Finally block&quot;);
    }
}</code></pre><p>}</p>
<p>// --------------------
// 예외처리를 좀더 세세하게 하고 싶은 경우
package Java;</p>
<p>public class HelloJava {
    public static void main(String[] args) {
        try {
            System.out.println(&quot;Try block&quot;);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println(&quot;실행 매개값의 수가 부족 또는 숫자로 변환 불가&quot;); // 예외 메세지 출력
        } catch (Exception e) {
            System.out.println(&quot;알수없는 예외 발생&quot;); // 예외 메세지 출력
        } finally {
            System.out.println(&quot;Finally block&quot;);
        }
    }
}</p>
<pre><code>
# 강제 예외 발생
- throw 키워드와 예외 또는 에러 객체를 인스턴스화 하여 강제 예외 발생
    예) throw new Exception(’에러메세지’);
``` java
package Java;

public class HelloJava {
    public static void main(String[] args) {
        try {
            System.out.println(&quot;Try block&quot;);
            throw new Exception(&quot;강제 예외 발생&quot;); // 강제 예외 발생
        } catch (Throwable e) {
            System.out.println(&quot;Catch block&quot;);
            System.out.println(e.getMessage());
        } finally {
            System.out.println(&quot;Finally block&quot;);
        }
    }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[클래스(Class)]]></title>
            <link>https://velog.io/@lxn_ee/%ED%81%B4%EB%9E%98%EC%8A%A4Class</link>
            <guid>https://velog.io/@lxn_ee/%ED%81%B4%EB%9E%98%EC%8A%A4Class</guid>
            <pubDate>Wed, 24 Jul 2024 01:41:52 GMT</pubDate>
            <description><![CDATA[<h1 id="클래스class란">클래스(Class)란?</h1>
<ul>
<li>객체를 정의하기 위한 집합</li>
<li>객체란 실제로 존재하는 사물 또는 개념으로, 프로그래밍에서는 사용되는 데이터 또는 식별자(identifier)에 의해 참조되는 공간을 뜻한다.</li>
<li>클래스 명의 첫글자는 대문자로 작성</li>
<li>기본적으로 한 시스템 내에서 클래스명은 중복되면 안된다.</li>
<li>class는 크게 <strong>필드(field)</strong>와 <strong>메소드(Method)</strong>로 구성</li>
</ul>
<h1 id="인스턴스instance-생성-및-사용">인스턴스(Instance) 생성 및 사용</h1>
<ul>
<li><p><strong>인스턴스화(Instantiate)</strong></p>
<ul>
<li><p>작성한 class를 사용하기 위해 객체로 만드는 과정</p>
</li>
<li><p>일반적으로 인스턴스화를 통해 객체를 생성하고, 변수에 저장 후 사용</p>
<pre><code class="language-java">public class HelloJava {
  public static void main(String[] args) {
          // Method Class 인스턴스화
      Method Method = new Method();

      // 이후 변수 Method를 이용하여 사용
      System.out.println(Method.add(2, 3));
  }
}

class Method {
  public int add(int a, int b) {
      return a + b;
  }
}</code></pre>
</li>
</ul>
</li>
</ul>
<h1 id="필드field">필드(field)</h1>
<ul>
<li>class내에 정의 된 변수(variable)</li>
<li>선언된 위치에 따라 아래와 같이 구분<ul>
<li><strong>클래스 변수(static variable)</strong>
static 키워드를 가지는 변수로 모든 인스턴스가 공통된 저장공간을 공유
프로그램이 종료될 때 소멸</li>
<li><strong>인스턴스 변수(instance variable)</strong>
클래스가 생성 될때마다 생성되는 변수로 인스턴스마다 저장공간이 다르다.
인스턴스가 소멸할 때 소멸</li>
<li><strong>지역 변수(local variable)</strong>
메소드 내에 생성된 변수
메소드가 종료되면 소멸</li>
</ul>
</li>
</ul>
<pre><code class="language-java">// 예)
class While {
    public String gender; // 인스턴스 변수
    public static String name; // 클래스 변수

        // 메소드
    public void swimming() {
            String swimm = &quot;헤엄칩니다.&quot;; // 지역 변수
        System.out.println(swimm);
    }
}</code></pre>
<h1 id="메소드method"><strong>메소드(Method)</strong></h1>
<ul>
<li>class 내에 정의 된 함수</li>
<li>static 키워드 여부에 따라 아래와 같이 구분<ul>
<li><strong>스태틱 메소드</strong>
static 키워드를 가진 메소드
클래스 메소드 내부에서 인스턴스 변수를 사용할 수 없으므로 주의
프로그램이 종료될 때 소멸</li>
<li><strong>인스턴스 메소드</strong>
static 키워드가 없는 메소드
인스턴스가 소멸될 때 소멸</li>
</ul>
</li>
</ul>
<pre><code class="language-java">// 메소드의 기본 형태
// 접근제어지시자 리턴타입 메소드명([파라미터1, 파라미터2...]) {
        // 기능 작성
}

// 예)
public class HelloJava {
    public static void main(String[] args) {
        // 스태틱 메소드는 인스턴스 없이 사용 가능
        System.out.println(Method.addStatic(5, 3));

        // 인스턴스 메소드는 class의 인스턴스를 생성 후 사용 가능
        Method Method = new Method();
        System.out.println(Method.add(2, 3));
    }
}

class Method {
    // 스태틱 메소드
    public static int addStatic(int a, int b) {
        return a + b;
    }

    // 인스턴스 메소드
    public int add(int a, int b) {
        return a + b;
    }
}</code></pre>
<h1 id="매개변수parameter와-인수argument">매개변수(Parameter)와 인수(Argument)</h1>
<ul>
<li><strong>인수(Argument)</strong>
메소드를 호출할 때 전달 되는 값</li>
<li><strong>매개변수(Parameter)</strong>
메소드의 정의에서 전달 받은 인수(Argument)를 저장하는 변수</li>
</ul>
<pre><code class="language-java">public class HelloJava {
    public static void main(String[] args) {
        int num1 = 5;
        int num2 = 6;

                // HelloJava.sum() 호출시 사용한 num1과 num2는 Argument
        System.out.println(HelloJava.sum(num1, num2));
    }

        // HelloJava.sum() 정의에서 사용한 int a와 int b는 Parameter
    public static int sum(int a, int b) {
        return a + b;
    }
}</code></pre>
<h1 id="접근-제어-지시자access-modifier"><strong>접근 제어 지시자(Access Modifier)</strong></h1>
<ul>
<li><p>외부에서의 접근을 통제하기위해 필드나 메소드 앞에 작성</p>
<ul>
<li><p>public
class 내외부 어디에서나 접근 가능</p>
</li>
<li><p>protected
같은 패키지 또는 class 내부, 자식클래스에서 접근 가능</p>
</li>
<li><p>default
같은 패키지에 소속된 클래스에서 접근 가능</p>
</li>
<li><p>private
class 내부에서만 접근 가능</p>
<pre><code class="language-java">class Method {
public int num1; // 어디에서나 접근 가능
protected int num2;// 클래스 내부 &amp;&amp; 상속 관계에서 접근 가능
int num3; // 같은 패키지에 소속된 클래스에서 접근 가능
private int num4; // 클래스 내부에서만 접근 가능

public void method1() {
    System.out.println(&quot;Public Method&quot;);
}
protected void method2() {
    System.out.println(&quot;Protected Method&quot;);
}
void method3() {
    System.out.println(&quot;Protected Method&quot;);
}
private void method4() {
    System.out.println(&quot;Private Method&quot;);
}
}</code></pre>
</li>
</ul>
</li>
</ul>
<h1 id="오버로딩overloading">오버로딩(overloading)</h1>
<ul>
<li>메소드 시그니처(method signature)가 다르나 동일한 이름을 가지는 메소드를 중복하여 정의<ul>
<li>메소드 시그니처(method signature)
  메소드 선언부에 명싱되는 파라미터 리스트</li>
</ul>
</li>
<li>오버로딩은 리턴 타입과는 관계가 없다.</li>
<li>대표적인 오버로딩의 예는 System.out.println()<pre><code class="language-java">// println 호출
System.out.println(1); // 파라미터가 정수 타입으로 메소드 호출
System.out.println(3.157); // 파라미터가 실수 타입으로 메소드 호출
System.out.println(&quot;안녕&quot;); // 파라미터가 문자열 타입으로 메소드 호출
System.out.println(true); // 파라미터가 논리 타입으로 메소드 호출
</code></pre>
</li>
</ul>
<p>// println 메소드 정의
public static void println() { ... }
public static void println(boolean x) { ... }
public static void println(char x) { ... }
public static void println(char[] x) { ... }
public static void println(double x) { ... }
public static void println(float x) { ... }
public static void println(int x) { ... }
public static void println(long x) { ... }
public static void println(Object x) { ... }
public static void println(String x) { ... }</p>
<pre><code>
# **생성자(Construct)**

- 클래스를 인스턴스화할 때, 딱 한번 실행되는 메소드
- 주로 객체의 초기화 또는 인스턴스 생성시 실행 되어야 하는 작업을 위해 사용하는 특수한 메소드
- 개발자가 생성자 메소드를 생성하지 않을 경우 **기본 생성자(Default Constructor)**가 실행

    ```java
    class Test {
        // 기본 생성자
        public Test() {}
    }
    ```

- **생성자도 파라미터를 선언**하여 호출 시 값을 전달 받고, 인스턴스 초기화 작업에 사용

    ```java
    class Test {
        public int age;

        // 파라미터가 있는 생성자
        public Test(int age) {
            this.age = age; // 파라미터 age를 필드 age에 저장
        }
    }
    ```


# this() 메소드와 this 참조 변수
- this() 메소드
같은 클래스의 다른 생성자를 호출할 때 사용
- this() 메소드에 아규먼트를 전달하면 정의되어 있는 생성자를 찾아 호출
생성자 내부에서만 사용 가능
반드시 해당 생성자의 가장 첫 줄에서만 this()메소드 사용 가능
this 참조 변수
클래스 자기 자신을 뜻하는 키워드
this 참조 변수는 해당 인스턴스의 주소를 가리키고 있다.
모든 인스턴스 메소드에서는 this 참조 변수 사용 가능
스태틱 메소드는 this 참조 변수 사용 불가
``` java
class Drone {
    public int hp; // 체력
    public int damage; // 공격력
    public int armor; // 방어력

    public Drone() {
        // 기본 생성자의 경우, 고정값으로 `Drone(int hp, int damage, int armor)`생성자 호출
        this(40, 5, 0);
    }

    public Drone(int hp, int armor) {
        // hp와 armor는 파라마터 값으로, damage는 고정 값으로 `Drone(int hp, int damage, int armor)`생성자 호출
        this(hp, 5, armor);
    }

    public Drone(int hp, int damage, int armor) {
        // 파라미터로 넘겨 받은 값으로 필드 초기화
        this.hp = hp;
        this.damage = damage;
        this.armor = armor;
    }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Java 코테 예상문제]]></title>
            <link>https://velog.io/@lxn_ee/Java-%EC%BD%94%ED%85%8C-%EC%98%88%EC%83%81%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@lxn_ee/Java-%EC%BD%94%ED%85%8C-%EC%98%88%EC%83%81%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Mon, 22 Jul 2024 13:19:28 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-java">// 예제 입력: [1, 3, 5, 2, 4]
//예제 출력: 5
public class MaxValueFinder {
    public static int findMax(int[] arr) {
        int max = arr[0];
        for (int num : arr) {
            if (num &gt; max) {
                max = num;
            }
        }
        return max;
    }

    public static void main(String[] args) {
        int[] arr = {1, 3, 5, 2, 4};
        System.out.println(&quot;Maximum value: &quot; + findMax(arr));
    }
}

// 주어진 문자열이 팰린드롬인지 확인하는 함수를 작성하세요. 팰린드롬은 앞뒤가 똑같은 문자열을 말합니다.
// 예제 입력: &quot;racecar&quot;
//예제 출력: true
public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        int left = 0;
        int right = str.length() - 1;

        while (left &lt; right) {
            if (str.charAt(left) != str.charAt(right)) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }

    public static void main(String[] args) {
        String str = &quot;racecar&quot;;
        System.out.println(&quot;Is palindrome: &quot; + isPalindrome(str));
    }
}

// 설명: 두 개의 정렬된 정수 배열이 주어지면, 이 배열들을 합친 후 정렬된 새로운 배열을 반환하는 함수를 작성하세요.
//
//예제 입력: [1, 3, 5], [2, 4, 6]
//예제 출력: [1, 2, 3, 4, 5, 6]
public class MergeAndSortArrays {
    public static int[] mergeAndSort(int[] arr1, int[] arr2) {
        int[] merged = new int[arr1.length + arr2.length];
        System.arraycopy(arr1, 0, merged, 0, arr1.length);
        System.arraycopy(arr2, 0, merged, arr1.length, arr2.length);
        Arrays.sort(merged);
        return merged;
    }

    public static void main(String[] args) {
        int[] arr1 = {1, 3, 5};
        int[] arr2 = {2, 4, 6};
        int[] result = mergeAndSort(arr1, arr2);
        System.out.println(&quot;Merged and sorted array: &quot; + Arrays.toString(result));
    }
}

// 설명: 주어진 문자열에서 중복된 문자를 제거한 새로운 문자열을 반환하는 함수를 작성하세요.
//
//예제 입력: &quot;banana&quot;
//예제 출력: &quot;ban&quot;
public class RemoveDuplicates {
    public static String removeDuplicates(String str) {
        HashSet&lt;Character&gt; seen = new HashSet&lt;&gt;();
        StringBuilder sb = new StringBuilder();

        for (char c : str.toCharArray()) {
            if (!seen.contains(c)) {
                seen.add(c);
                sb.append(c);
            }
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        String str = &quot;banana&quot;;
        System.out.println(&quot;String after removing duplicates: &quot; + removeDuplicates(str));
    }
}</code></pre>
<p>기본</p>
<pre><code class="language-java">// 문제 설명: 주어진 문자열을 뒤집는 문제입니다.

//  설명:

// StringBuilder 객체를 사용하여 문자열을 뒤집습니다.
// reverse() 메서드를 사용하여 문자열을 뒤집고 toString() 메서드로 문자열로 변환합니다.


public class ReverseString {
    public String reverse(String s) {
        return new StringBuilder(s).reverse().toString();
    }

    public static void main(String[] args) {
        ReverseString rs = new ReverseString();
        System.out.println(rs.reverse(&quot;hello&quot;)); // &quot;olleh&quot;
    }
}
// 2. 팰린드롬 확인 (Palindrome Check)
// 문제 설명: 주어진 문자열이 팰린드롬(앞뒤가 같은 문자열)인지 확인하는 문제입니다.

// 코드 설명:

// 문자열의 양 끝에서 하나씩 비교하면서 팰린드롬 여부를 확인합니다.
// 문자가 다르면 false를 반환하고, 끝까지 비교를 마치면 true를 반환합니다.

public class PalindromeCheck {
    public boolean isPalindrome(String s) {
        int left = 0, right = s.length() - 1;
        while (left &lt; right) {
            if (s.charAt(left) != s.charAt(right)) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }

    public static void main(String[] args) {
        PalindromeCheck pc = new PalindromeCheck();
        System.out.println(pc.isPalindrome(&quot;racecar&quot;)); // true
        System.out.println(pc.isPalindrome(&quot;hello&quot;)); // false
    }
}
// 3. 배열에서 최대값 찾기 (Find Maximum in Array)
// 문제 설명: 주어진 배열에서 최대값을 찾는 문제입니다.

// 코드 설명:

// 배열의 첫 번째 값을 초기 최대값으로 설정합니다.
// 배열을 순회하며 각 요소가 현재 최대값보다 크면 최대값을 갱신합니다.

public class FindMaximum {
    public int findMax(int[] nums) {
        int max = nums[0];
        for (int num : nums) {
            if (num &gt; max) {
                max = num;
            }
        }
        return max;
    }

    public static void main(String[] args) {
        FindMaximum fm = new FindMaximum();
        int[] nums = {1, 3, 7, 2, 9};
        System.out.println(fm.findMax(nums)); // 9
    }
}
// 4. 배열에서 중복된 숫자 찾기 (Find Duplicates in Array)
// 문제 설명: 주어진 배열에서 중복된 숫자가 있는지 확인하는 문제입니다.

// 코드 설명:

// HashSet을 사용하여 중복을 체크합니다.
// 배열을 순회하며 각 요소를 HashSet에 추가합니다.
// 이미 HashSet에 존재하는 요소가 발견되면 중복이므로 true를 반환합니다.

import java.util.HashSet;
import java.util.Set;

public class FindDuplicates {
    public boolean hasDuplicate(int[] nums) {
        Set&lt;Integer&gt; set = new HashSet&lt;&gt;();
        for (int num : nums) {
            if (set.contains(num)) {
                return true;
            }
            set.add(num);
        }
        return false;
    }

    public static void main(String[] args) {
        FindDuplicates fd = new FindDuplicates();
        int[] nums1 = {1, 2, 3, 4, 5};
        int[] nums2 = {1, 2, 3, 4, 5, 3};
        System.out.println(fd.hasDuplicate(nums1)); // false
        System.out.println(fd.hasDuplicate(nums2)); // true
    }
}
// 5. 배열 합계 계산 (Sum of Array)
// 문제 설명: 주어진 배열의 모든 요소의 합을 구하는 문제입니다.

// 코드 설명:

// 배열을 순회하며 각 요소를 합계 변수에 더합니다.
// 최종 합계를 반환합니다.

public class SumOfArray {
    public int sum(int[] nums) {
        int sum = 0;
        for (int num : nums) {
            sum += num;
        }
        return sum;
    }

    public static void main(String[] args) {
        SumOfArray sa = new SumOfArray();
        int[] nums = {1, 2, 3, 4, 5};
        System.out.println(sa.sum(nums)); // 15
    }
}
// 6. 피보나치 수열 (Fibonacci Sequence)
// 문제 설명: 피보나치 수열의 n번째 수를 구하는 문제입니다.

// 코드 설명:

// 피보나치 수열의 정의에 따라 재귀적으로 값을 계산합니다.
// 기본 케이스로 n이 0 또는 1일 때는 n을 반환합니다.

public class Fibonacci {
    public int fib(int n) {
        if (n &lt;= 1) {
            return n;
        }
        return fib(n - 1) + fib(n - 2);
    }

    public static void main(String[] args) {
        Fibonacci f = new Fibonacci();
        System.out.println(f.fib(10)); // 55
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java 변수와 상수/데이터타입]]></title>
            <link>https://velog.io/@lxn_ee/Java-%EB%B3%80%EC%88%98%EC%99%80-%EC%83%81%EC%88%98%EB%8D%B0%EC%9D%B4%ED%84%B0%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@lxn_ee/Java-%EB%B3%80%EC%88%98%EC%99%80-%EC%83%81%EC%88%98%EB%8D%B0%EC%9D%B4%ED%84%B0%ED%83%80%EC%9E%85</guid>
            <pubDate>Mon, 22 Jul 2024 02:45:29 GMT</pubDate>
            <description><![CDATA[<h1 id="변수variable란">변수(Variable)란?</h1>
<ul>
<li>값을 저장할 수 있는 메모리상의 공간</li>
<li>하나의 변수는 단 하나의 값만을 저장</li>
<li>새로운 값을 저장하면 기존 값은 사라진다.</li>
</ul>
<h1 id="변수-선언-및-초기화">변수 선언 및 초기화</h1>
<ul>
<li><p><strong>변수 선언</strong></p>
<ul>
<li><p>데이터타입과 변수명으로 선언</p>
<pre><code class="language-java">// 변수 선언
int age;</code></pre>
</li>
</ul>
</li>
<li><p>변수 초기화
변수를 선언하고 사용하기 전, 처음으로 값을 저장하는 것</p>
<pre><code class="language-java">// 변수 선언
int age;

// 변수 초기화
age = 20;

// 변수 선언과 동시에 초기화
String name = &quot;홍길동&quot;;</code></pre>
<h1 id="변수-명명-규칙">변수 명명 규칙</h1>
</li>
<li><p>변수명은 영문 대소문자,숫자,언더바(_), 달러($) 사용 가능
(’_’, ‘$’ 이 외의 특수기호 사용 불가능 / 한글은 사용 가능하나 지양)</p>
</li>
<li><p>변수명은 숫자로 시작이 불가능</p>
</li>
<li><p>변수명은 공백이 포함 불가</p>
</li>
<li><p>변수명은 미리 지정되어 있는 예약어를 사용불가
ex) true, int 등등</p>
</li>
<li><p>변수명은 대소문자를 구분
ex) Age와 age는 서로 다른 변수로 인식</p>
</li>
</ul>
<h1 id="상수constants와-리터럴literal이란">상수(<strong>Constants</strong>)와 리터럴(Literal)이란?</h1>
<ul>
<li><p><strong>상수(Constants)</strong></p>
<ul>
<li>최초 대입한 값이 절대 변하지 않는 값</li>
<li>변수 선언 시 가장 앞에 <code>final</code> 키워드 추가하여 선언</li>
<li>상수명은 모두 대문자이며, 단어와 단어 사이는 언더바(_)로 연결</li>
<li>상수 선언과 동시에 초기화 필수</li>
</ul>
</li>
<li><p><strong>리터럴(Literal)</strong>
그 자체로 의미를 가지는 변하지 않는 값</p>
<pre><code class="language-java">// `USER_NAME`이라는 이름의 상수 선언, 리터럴은 `Java`
final String USER_NAME = &quot;Java&quot;;
</code></pre>
</li>
</ul>
<p>// 같은 이름의 상수 재할당 : 상수는 변하지 않는 값이므로 에러 발생
USER_NAME = &quot;Change&quot;;</p>
<pre><code># underscore 표기법
- 큰 숫자를 콤마 1000,000,000 로 표현하듯이 프로그래밍에선 언더바(_)로 표현해도 숫자로 인식
``` java
int num = 1_000_000;
System.out.println(num); // 1000000</code></pre><h1 id="두-변수의-값-스왑swap">두 변수의 값 스왑(Swap)</h1>
<ul>
<li>스왑할 두 변수(num1, num2)와, 값을 임시로 저장할 임시변수(tmp)를 준비<pre><code> - num1의 값을 tmp에 저장</code></pre><ul>
<li>num2의 값을 num1에 저장</li>
<li>tmp에 저장해둔 num1의 값을 num2에 저장<pre><code class="language-java">int num1 = 1;
int num2 = 200;
int tmp;
</code></pre>
</li>
</ul>
</li>
</ul>
<p>// num1 = 1, num2 = 200
System.out.printf(&quot;num1 = %d, num2 = %d\n&quot;, num1, num2);</p>
<p>tmp = num1; // num1의 값을 tmp에 저장
num1 = num2; // num2의 값을 num1에 저장
num2 = tmp; // tmp에 저장해둔 num1의 값을 num2에 저장</p>
<p>// num1 = 200, num2 = 1
System.out.printf(&quot;num1 = %d, num2 = %d\n&quot;, num1, num2);</p>
<h2 id="">```</h2>
<h1 id="데이터-타입data-type이란">데이터 타입(Data Type)이란?</h1>
<ul>
<li>여러 종류의 데이터를 식별하는 분류</li>
<li>저장하려는 값의 특성을 고려하여 데이터 타입을 결정</li>
<li><code>Java</code> 의 경우 크게 <code>기본형(primitive type)</code>과 <code>참조형(reference type)</code>으로 분류</li>
</ul>
<h1 id="기본형primitive-type">기본형(primitive type)</h1>
<ul>
<li>저장 공간에 실제 자료 값을 가지는 데이터 타입</li>
<li>비객체 타입이므로 null을 저장할 수 없다.</li>
<li>변수의 선언과 동시에 메모리 생성</li>
<li>모든 값 타입은 메모리의 스택(stack)에 저장</li>
<li>기본형 데이터 타입은 총 8개
<img src="https://velog.velcdn.com/images/lxn_ee/post/8f503ff5-6ee1-4ee6-9815-d06c45e4ed09/image.png" alt=""></li>
</ul>
<h1 id="참조형reference-type">참조형(reference type)</h1>
<ul>
<li>기본형 8가지를 제외한 나머지 (Class, Array, Enum 등)</li>
<li>저장 공간에 자료가 저장된 공간의 주소를 저장, 실제값을 저장하지 않는다.</li>
<li>null 저장 가능</li>
<li>메모리의 힙(Heap)에 실제 값이 저장되고, 그 참조값을 갖는 변수는 스택(stack)에 저장</li>
<li>할당되는 메모리 크기는 4byte</li>
</ul>
<h1 id="정수-및-실수의-overflow와-underflow">정수 및 실수의 Overflow와 Underflow</h1>
<ul>
<li><p>정수형 및 실수형 데이터타입을 사용시, 사용하고자 하는 <strong>데이터의 최대/최소 크기를 고려</strong></p>
</li>
<li><p>범위를 벗어난 값을 저장하면 Overflow/Underflow가 발생하여 전혀 다른값이 저장 될 수 있다.</p>
<ul>
<li><strong>Overflow</strong> : 최대 표현 범위보다 큰 수를 저장할 때 발생하는 현상</li>
<li><strong>Underflow</strong> : 최소 표현 범위보다 작은 수를 저장할 때 발생하는 현상<pre><code class="language-java">// byte의 표현 범위는 -128 ~ 127
byte max = 127;
byte min = -128;
</code></pre>
</li>
</ul>
<p>byte sumMax = max + 1; // Overflow Error
byte sumMin = min - 1; // Underflow Error</p>
<p>// 실수의 표현 범위는 3.4028235E38 ~ 1.4E-45
float fMax = 3.4028235E38;
float fMin = 1.4E-45;</p>
<p>float sumFMax = fMax + 0.1; // Overflow Error
float sumFin = fMin - 0.1; // Underflow Error</p>
<pre><code># 실수의 표현 오차</code></pre></li>
<li><p>메모리의 한계로 인해 실수의 소숫점 표현에 제한이 존재</p>
</li>
<li><p>실수 표현의 범위와 정확성을 위해 <strong>부동 소수점 방식</strong>을 이용</p>
</li>
<li><p>어디까지나 근사치를 저장하므로, <strong>필연적으로 오차</strong>가 발생    </p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java]]></title>
            <link>https://velog.io/@lxn_ee/Java</link>
            <guid>https://velog.io/@lxn_ee/Java</guid>
            <pubDate>Mon, 22 Jul 2024 00:43:00 GMT</pubDate>
            <description><![CDATA[<h1 id="java란">Java란?</h1>
<ul>
<li>1995년에 Sun Microsystems에서 개발한 객체 지향 프로그래밍(OOP) 언어</li>
<li>현재는 Oracle에서 인수하여 관리</li>
<li><code>Write Once, Run Anywhere</code>라는 철학을 기반으로 개발</li>
<li>다양한 표준 라이브러리가 많으며, 오래되고 활성화 된 커뮤니티</li>
</ul>
<h1 id="java의-장점">Java의 장점</h1>
<ul>
<li>JVM을 통해 다양한 운영체제에서 실행 가능한 <strong>플랫폼 독립성</strong></li>
<li>네트워킹, 데이터베이스 연결, GUI 개발 등 <strong>다양한 표준 API 제공</strong></li>
<li><strong>안정성과 보안성</strong>을 위한  ****철저한 메모리 관리와 강력한 보안 모델을 제공</li>
<li>동시에 여러 작업을 수행하기 위한 <strong>멀티 쓰레드를 쉽게 구현할 수 있는 내장 기능</strong> 지원</li>
</ul>
<h1 id="java의-단점">Java의 단점</h1>
<ul>
<li><strong>JVM의 추가적인 메모리를 소모</strong>하므로 타 언어보다 메모리 사용량이 높을 수 있다.</li>
<li>JVM에서 실행되므로 <strong>네이티브 코드에 비해 실행 속도가 느릴</strong> 수 있다.</li>
<li>다른 언어에 비해 <strong>문법이 다소 복잡</strong></li>
<li>JVM이 설치되어 있어야 코드 실행이 가능(<strong>JVM 종속성</strong>)</li>
</ul>
<h1 id="java-개발시-주의사항">Java 개발시 주의사항</h1>
<ul>
<li><strong>메모리 관리</strong><ul>
<li>Java는 GC(Garbage Collection)이 자동으로 메모리 관리하지만, GC가 언제 동작할지 예측할 수 없으므로 메모리 누수(Memory Leak)를 방지하는 코딩 습관이 필요</li>
</ul>
</li>
<li><strong>객체 관리</strong><ul>
<li>불필요한 객체 생성을 피하고, 객체 참조를 적절히 해제하여 메모리 사용을 최적화</li>
</ul>
</li>
<li><strong>적절한 예외 처리</strong><ul>
<li>발생할 수 있는 모든 예외에 대해 적절한 처리 로직을 작성</li>
</ul>
</li>
<li><strong>쓰레드 관리</strong><ul>
<li>멀티스레딩 환경에서 동기화 문제(예 : Deadlock)가 발생하지 않도록 주의</li>
<li>ExecutorService를 사용하여 쓰레드 풀을 관리</li>
</ul>
</li>
<li><strong>성능 최적화</strong><ul>
<li>성능 병목 지점을 파악하기 위해 프로파일링 도구를 사용</li>
<li>자료구조를 효율적으로 사용하여 성능을 최적화</li>
</ul>
</li>
<li><strong>코드 표준 및 문서화</strong><ul>
<li>가독성 고려하여 일관된 코딩 스타일과 표준을 준수</li>
<li>코드에 충분한 주석을 첨부</li>
</ul>
</li>
<li><strong>보안</strong><ul>
<li>모든 사용자 입력을 검증하여 SQL 인젝션, XSS 등의 보안 취약점을 방지</li>
<li>민감한 데이터는 반드시 암호화하여 저장하거나 전송</li>
</ul>
</li>
</ul>
<hr>
<p><a href="https://docs.oracle.com/javase/8/docs/api/">참고사이트</a></p>
<hr>
<p>개발환경에서 IntelliJ를 사용할 경우 Java 별도 설치 불필요</p>
<h1 id="java-설치">Java 설치</h1>
<p><a href="https://www.oracle.com/kr/java/technologies/downloads/#jdk17-windows">Java Install</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JWT]]></title>
            <link>https://velog.io/@lxn_ee/JWT</link>
            <guid>https://velog.io/@lxn_ee/JWT</guid>
            <pubDate>Mon, 22 Jul 2024 00:41:29 GMT</pubDate>
            <description><![CDATA[<h2 id="jwtjson-web-token이란">JWT(JSON Web Token)이란?</h2>
<ul>
<li>토큰 기반 인증 시스템에서 사용하는 토큰 작성 기술</li>
<li>인증에 필요한 정보들을 암호화 시킨 토큰</li>
<li>JSON객체를 사용하여 데이터를 생성</li>
<li>Base64 URL Encode를 통해 직렬화</li>
<li>위변조 방지를 위한 비밀키를 이용한 Signature(전자서명)이 포함</li>
<li>서버는 전자서명의 검증만 하여 결과를 응답</li>
<li>JWT의 목적은 정보보호가 아닌 위변조방지</li>
</ul>
<h2 id="jwt의-구조">JWT의 구조</h2>
<ul>
<li>헤더(Header), 내용(Payload), 서명(Signature) 로 구성</li>
<li>각각의 구분문자는 콤마(.)</li>
<li>예) <strong>Header.Payload.Signature</strong> eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSR & SSR]]></title>
            <link>https://velog.io/@lxn_ee/CSR-SSR</link>
            <guid>https://velog.io/@lxn_ee/CSR-SSR</guid>
            <pubDate>Thu, 16 May 2024 00:50:21 GMT</pubDate>
            <description><![CDATA[<h1 id="csrclient-side-rendering이란">CSR(Client Side Rendering)이란?</h1>
<ul>
<li>서버에서 최소한의 HTML을 받고, 내부에 위치한 JS 파일을 통해 클라이언트에서 페이지를 렌더링하는 방식</li>
<li>기술이 발전하면서 웹 페이지에서 제공하는 서비스가 복잡해짐으로서, React, Vue, Angular와 같은 프레임워크가 등장하며 CSR을 진행하는 경우가 많아졌다.</li>
</ul>
<h1 id="csrclient-side-rendering의-동작-방식">CSR(Client Side Rendering)의 동작 방식</h1>
<ol>
<li>사용자가 웹 페이지를 방문할 경우, 브라우저는 최소한의 HTML 파일을 다운로드</li>
<li>브라우저는 JS 번들 파일을 다운로드 하고, Ajax를 통해 동적으로 컨텐츠를 가져오며 화면을 렌더링</li>
<li>이후 사용자가 페이지를 이동할 경우, 별도의 HTML을 받지 않고 사전에 받은 JS 파일만을 활용하여 렌더링을 진행</li>
</ol>
<h1 id="csrclient-side-rendering의-장단점">CSR(Client Side Rendering)의 장단점</h1>
<ul>
<li>장점<ul>
<li>초기 렌더링 이후에 진행되는 렌더링의 경우 로딩 속도가 훨씬 빠르다.</li>
<li>서버와의 통신 과정에서 페이지의 UI를 다시 그릴 필요 없이, 동적으로 일부분만 변경</li>
</ul>
</li>
<li>단점<ul>
<li>초기에 구동에 필요한 파일 다운로드때문에 초기 페이지 구동 속도가 느리다.</li>
<li>SEO(Search Engine Optimization)의 최적화가 어렵다.</li>
<li>페이지 메타 데이터의 변경을 위한 추가 작업이 필요</li>
<li>클라이언트의 PC 성능이 좋지 못할 경우 렌더링을 빠르게 하지 못할 확률이 높다.</li>
</ul>
</li>
</ul>
<hr>
<h1 id="ssrserver-side-rendering이란">SSR(Server Side Rendering)이란?</h1>
<ul>
<li>서버에서 사전에 렌더링된 파일을 클라이언트에게 전송하고, 클라이언트는 이를 즉시 렌더링하는 방식</li>
<li>JS의 경우 정적 리소스 (HTML, CSS) 가 렌더링 된 이후 적용<h1 id="ssrserver-side-rendering의-동작-방식">SSR(Server Side Rendering)의 동작 방식</h1>
</li>
</ul>
<ol>
<li>사용자가 웹 페이지를 방문할 경우, 서버는 브라우저에게 제공할 HTML 컨텐츠를 컴파일</li>
<li>컴파일된 HTML은 브라우저에 제공되며, 브라우저는 이를 다운로드하고 렌더링</li>
<li>JS 파일을 다운로드 받은 후 실행</li>
<li>사용자가 다른 페이지로 이동을 진행할 경우, 1~3번의 과정을 반복</li>
</ol>
<h1 id="ssrserver-side-rendering의-장단점">SSR(Server Side Rendering)의 장단점</h1>
<ul>
<li>장점<ul>
<li>초기 페이지 로딩 속도가 빠르다.<ul>
<li>서버에서 페이지 로직 및 렌더링을 사전에 실행할 경우, JS 파일을 많이 보낼 필요가 없어지므로 TTI(Time to Interact) 또한 상대적으로 빠르게 수행 가능</li>
<li>SEO(Search Engine Optimization)의 최적화가 용이</li>
<li>클라이언트의 PC 성능에 크게 영향을 받지 않는다.</li>
</ul>
</li>
</ul>
</li>
<li>단점<ul>
<li>페이지를 이동할 때마다 매번 새로운 HTML을 받아야 하므로 TTFB (Time To First Byte) 가 느리다.</li>
<li>서버에서 각 페이지에 대한 정적 리소스를 보내야 하기 때문에 이를 위한 서버 호스팅이 필수적</li>
<li>각 페이지를 로드하는 과정이 오래 걸린다면, 사용자 경험을 해칠 수 있다.</li>
<li>CDN을 활용한 캐싱 전략이 곤란   </li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lxn_ee/post/c5a3b8cc-849a-4623-835e-39a5abc67ed9/image.webp" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Vue.js]]></title>
            <link>https://velog.io/@lxn_ee/Vue.js</link>
            <guid>https://velog.io/@lxn_ee/Vue.js</guid>
            <pubDate>Thu, 16 May 2024 00:42:10 GMT</pubDate>
            <description><![CDATA[<h1 id="vuejs란">Vue.js란?</h1>
<ul>
<li><p>사용자 인터페이스를 구축하기 위한 JavaScript 프레임워크</p>
</li>
<li><p>뷰는 CSR을 지원하는 프레임 워크이며, 뷰 라우터를 사용하여 SPA 구축이 용이</p>
<p>  <a href="https://velog.io/@lxn_ee/CSR-SSR">CSR &amp; SSR</a></p>
</li>
<li><p>뷰 파일은 싱글 파일 컴포넌트(SFC : Single-File Components) 파일로 구성</p>
<ul>
<li>컴포넌트의 템플릿, 로직 및 스타일을 하나의 파일로 묶어낸 특수한 파일 형식</li>
</ul>
</li>
<li><p>단순하고 직관적인 문법을 제공해 개발자가 쉽게 익히고 사용 가능</p>
</li>
<li><p>표준 HTML, CSS, 및 JavaScript 위에 구축</p>
</li>
<li><p>선언적이고 컴포넌트 기반의 프로그래밍 모델을 제공</p>
</li>
<li><p>복잡한 사용자 인터페이스도 효율적으로 개발 가능</p>
</li>
<li><p>핵심 기능으로는 선언적 렌더링(Declarative Rendering)과 반응성(Reactivity)이 있다.</p>
<ul>
<li><strong>선언적 렌더링(Declarative Rendering)</strong>
표준 HTML을 템플릿 문법으로 확장하여 JavaScript 상태(State)를 기반으로 화면에 출력될 HTML을 선언적(declaratively)으로 작성</li>
<li><strong>반응성(Reactivity)</strong>
JavaScript 상태(State) 변경을 추적하고, 변경이 발생하면 DOM을 효율적으로 업데이트하는 것을 자동으로 수행<h1 id="vuejs-요구사항">Vue.js 요구사항</h1>
</li>
</ul>
</li>
<li><p>Node.js 18.3 이상 설치
<a href="https://nodejs.org/en">Node.js 설치 링크</a></p>
</li>
</ul>
<h2 id="vue의-디렉토리-구조">Vue의 디렉토리 구조</h2>
<pre><code>node_modules\         : 프로젝트에 쓰이는 모든 라이브러리가 배치 되는 디렉토리
public\                    : html파일 및 기타파일 보관
src\                      : 소스코드가 배치 되는 디렉토리
.gitignore              : git 버전 관리 제외 대상 설정 파일
babel.config.js        : Babel 설정을 지정하는 JavaScript 파일
jsconfig.json          : JavaScript 프로젝트의 설정 파일
package-lock.json    : npm 패키지의 의존성 트리를 정확하게 재현하기 위한 정보를 포함하는 파일
package.json          : npm 프로젝트의 메타데이터 및 구성 정보를 포함하는 파일
vue.config.js          : Vue CLI 프로젝트의 설정 파일</code></pre><h1 id="vue-프로젝트-생성">Vue 프로젝트 생성</h1>
<ul>
<li><p><strong>터미널(cmd, Windows PowerShell, git bash 등)을 관리자 권한으로 열기</strong></p>
</li>
<li><p><strong>vue 프로젝트를 생성할 위치로 이동</strong></p>
</li>
<li><p><strong>아래 커멘드 실행</strong></p>
<pre><code># vue create 프로젝트명
vue create vue_edu</code></pre></li>
<li><p><strong>vue 3 를 선택해서 vue 프로젝트 생성</strong></p>
</li>
<li><p><strong>생성한 vue 프로젝트로 이동</strong></p>
</li>
<li><p>아래 커맨드로 dev 모드로 실행</p>
<pre><code># dev 모드로 실행
npm run serve</code></pre></li>
</ul>
<hr>
<ul>
<li>참조 
<a href="https://ko.vuejs.org/guide/introduction">Vue.js</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Blade Template]]></title>
            <link>https://velog.io/@lxn_ee/Blade-Template</link>
            <guid>https://velog.io/@lxn_ee/Blade-Template</guid>
            <pubDate>Thu, 09 May 2024 08:29:04 GMT</pubDate>
            <description><![CDATA[<h1 id="blade-template이란">Blade Template이란?</h1>
<ul>
<li><p>라라벨에 포함된 단순하지만 강력한 템플릿 엔진</p>
</li>
<li><p>블레이드 템플릿 구문이 php 코드로 컴파일 되어 동작</p>
</li>
<li><p>블레이드 지시어를 통해 템플릿 상속 및 데이터 표시, PHP 제어 구조에 대해 편의성 제공</p>
</li>
<li><p>파일 확장자는  .blade.php를 사용</p>
</li>
<li><p>일반적으로 파일은 resources/views 디렉토리에 배치</p>
<h2 id="주석">주석</h2>
<pre><code class="language-php">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;layout&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1&gt;이거는 보입니다.&lt;/h1&gt;
  {{-- &lt;h1&gt;주석 처리되서 안보입니다.&lt;/h1&gt; --}}
  &lt;p&gt;내용내용&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h2 id="데이터-출력">데이터 출력</h2>
</li>
<li><p>{{ 출력할 데이터 }} 로 작성</p>
</li>
<li><p>{{ }} 문은 XSS 공격을 방지하기 위해 PHP의 htmlspecialchars 함수를 통해 자동으로 처리</p>
<pre><code class="language-php">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;layout&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1&gt;{{ $name }}&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h2 id="include뷰-배열">@include(뷰[, 배열])</h2>
</li>
<li><p>다른 뷰를 포함</p>
</li>
<li><p>include할 뷰에 데이터를 보내고 싶을 경우 두번째 아규먼트에 배열 셋팅</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;layout&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  @include(&#39;layout.header&#39;)
  @include(&#39;layout.footer&#39;, [&#39;key1&#39; =&gt; &#39;홍길동&#39;])
&lt;/body&gt;
&lt;/html&gt;</code></pre>
</li>
</ul>
<pre><code class="language-html">&lt;h1&gt;헤더입니다.&lt;/h1&gt;</code></pre>
<pre><code class="language-html">&lt;h1&gt;풋터입니다.&lt;/h1&gt;
&lt;p&gt;파라미터로 받은 값은 {{ $key1 }} 입니다.&lt;/p&gt;</code></pre>
<h2 id="extends뷰">@extends(뷰)</h2>
<ul>
<li>자식 뷰가 상속해야 하는 레이아웃을 지정<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;layout&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1&gt;레이아웃 뷰 입니다.&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
</li>
</ul>
<pre><code class="language-html">{{-- 상속 --}}
@extends(&#39;layout.layout&#39;)</code></pre>
<h2 id="yield섹션명-기본값">@yield(섹션명[, 기본값])</h2>
<ul>
<li>자식 뷰에서 해당하는 section에게 자리를 양도</li>
<li>자식한테 section이 없을 경우는 기본값 출력<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;@yield(&#39;title&#39;, &#39;부모 타이틀&#39;)&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1&gt;레이아웃 뷰 입니다.&lt;/h1&gt;
  &lt;p&gt;@yield(&#39;content&#39;, &#39;부모 콘텐츠&#39;)&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
</li>
</ul>
<pre><code>
```html
{{-- 상속 --}}
@extends(&#39;layout.layout&#39;)

{{-- @yield &amp; @section --}}
@section(&#39;title&#39;, &#39;자식 타이틀&#39;)</code></pre><h2 id="section섹션명-출력값">@section(섹션명, 출력값)</h2>
<ul>
<li><p>부모 뷰에 해당하는 @yield 또는 @section~@show 에 삽입</p>
</li>
<li><p>@section~@show의 경우 자식 뷰에 해당하는 @section이 없을 경우 부모의 것이 실행</p>
</li>
<li><p>여러 처리를 할 필요가 있다면 @section ~ @endsection으로 묶어서 작성</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;@yield(&#39;title&#39;, &#39;부모 타이틀&#39;)&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  @section(&#39;main&#39;)
  &lt;h2&gt;부모 main입니다.&lt;/h2&gt;
  @show

  @section(&#39;card&#39;)
  &lt;h2&gt;부모 card입니다.&lt;/h2&gt;
  @show
&lt;/body&gt;
&lt;/html&gt;</code></pre>
</li>
</ul>
<pre><code class="language-html">{{-- 상속 --}}
@extends(&#39;layout.layout&#39;)

{{-- @yield &amp; @section --}}
@section(&#39;title&#39;, &#39;자식 타이틀&#39;)

@section(&#39;main&#39;)
&lt;h2&gt;자식 main입니다.&lt;/h2&gt;
@endsection</code></pre>
<h2 id="if-와-반복문">if 와 반복문</h2>
<pre><code class="language-php">{{-- @if : 조건문 --}}
@if($gender === &#39;F&#39; ) 
    &lt;span&gt;성별 : 여자&lt;/span&gt;
@elseif($gender === &#39;M&#39;)
    &lt;span&gt;성별 : 남자&lt;/span&gt;
@else
    &lt;span&gt;성별 : 기타&lt;/span&gt;
@endif
&lt;hr&gt;
{{-- 반복문 --}}
{{-- @for ~ @endfor : for 반복문 --}}
@for($i = 0; $i &lt; 5; $i++)
    &lt;span&gt;for : {{$i}}&lt;/span&gt;
@endfor
&lt;hr&gt;
{{-- @foreach ~ @endforeach : foreach 반복문 --}}
&lt;h2&gt;foreach 문&lt;/h2&gt;
{{-- $loop : foreach, forelse에서 루프의 정보를 담고 있는 자동으로 생성되는 객체 --}}
@foreach($data as $key =&gt; $val)
    &lt;h4&gt;남은 루프 횟수 : {{$loop-&gt;remaining}}&lt;/h4&gt;
    &lt;span&gt;{{$key.&quot; : &quot;.$val}}&lt;/span&gt;
    &lt;br&gt;
@endforeach
&lt;hr&gt;

{{-- @forelse ~ @empty ~ @endforelse : 루프를 할 데이터의 길이가 1이상이면 @forelse처리, 배열의 길이가 0이면 @empty의 처리를 합니다. --}}
&lt;h2&gt;forelse 문&lt;/h2&gt;
@forelse($data2 as $key =&gt; $val)
    &lt;span&gt;{{$key.&quot; : &quot;.$val}}&lt;/span&gt;
    &lt;br&gt;
@empty
&lt;span&gt;빈 배열입니다.&lt;/span&gt;
@endforelse

&lt;hr&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Laravel 시작]]></title>
            <link>https://velog.io/@lxn_ee/Laravel-%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@lxn_ee/Laravel-%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Wed, 08 May 2024 08:15:52 GMT</pubDate>
            <description><![CDATA[<h1 id="laravel">Laravel</h1>
<ol>
<li><p>Laravel 공식 사이트 <a href="https://laravel.kr">https://laravel.kr</a></p>
</li>
<li><p>PHP, DB, Apache Install 라라벨 프레임워크는 몇 가지 시스템 요구 사항이 있습니다. Laravel의 Version마다 상이하므로 확인이 필요합니다.</p>
</li>
<li><p>Laravel 9.x 기준으로 웹 서버에 최소 PHP 버전 및 extension이 다음과 같은지 확인해야 합니다. PHP &gt;= 8.0 BCMath PHP Extension Ctype PHP Extension Fileinfo PHP Extension JSON PHP Extension Mbstring PHP Extension OpenSSL PHP Extension PDO PHP Extension Tokenizer PHP Extension XML PHP Extension</p>
</li>
</ol>
<blockquote>
<p>Composer Install</p>
</blockquote>
<h1 id="laravel-install">laravel install</h1>
<ol>
<li><p>PHP 의존성 관리 도구
아래 사이트에 접속하여 다운로드
<a href="https://getcomposer.org/download/">https://getcomposer.org/download/</a></p>
</li>
<li><p>설치 완료 후, 터미널에서 &quot;composer&quot;를 입력하여 설치 확인</p>
</li>
<li><p>Laravel 프로젝트 생성 (이하 터미널에서 커멘드라인으로 작업)</p>
<p>3-1. Laravel 프로젝트를 생성할 위치로 이동 
3-2. 아래 커멘드로 라라벨 설치 </p>
<pre><code>composer create-project laravel/laravel=&quot;9&quot;</code></pre><p>laravel-board
(주의 : php.ini에 zip, fileinfo, openssl, pdo_mysql, mbstring Extension 주석 해제 필요) 
3-3. Apache 설정 - root 변경 
```
DocumentRoot &quot;${SRVROOT}/htdocs/&quot;라라벨디렉토리명&quot;/public&quot; 
&lt;Directory &quot;${SRVROOT}/htdocs/&quot;라라벨디렉토리명&quot;/public&quot;&gt; </p>
</li>
</ol>
<ul>
<li>mod_rewrite 모듈 활성 LoadModule rewrite_module modules/mod_rewrite.so <pre><code>&gt; (주의 : Apache 서버 재기동 필요) 
</code></pre></li>
</ul>
<p>3-4. Laravel 서버 실행 - larabel-board 디렉토리 안에서 아래 커멘드 실행 php artisan serve 
3-5. 접속 확인</p>
<hr>
<h3 id="유용한-확장프로그램">유용한 확장프로그램</h3>
<p>Laravel goto view : ctrl + 좌클릭으로 해당 뷰파일로 이동 기능 제공 Laravel Snippets : 일부 자동완성 기능 제공 laravel blasde snippets : 블레이드 문법 자동완성 기능 제공 Laravel Extra Intellisense : 일부 자동완성 기능 제공</p>
<h2 id="laravel-이란">Laravel 이란?</h2>
<p>오픈소스 PHP 웹 프레임워크 중 하나 MVC 모델로 웹 애플리케이션을 개발하기 위해 고안</p>
<ol>
<li>*<em>Laravel Application의 Life Cycle *</em>
1-1. Entry Point 시작지점 (public/index.php) 
1-2. HTTP Kernel Application 셋업 및 미들웨어를 설정하고, 라우터를 실행 
1-3. Router Request에 일치하는 경로를 찾고 정의된 Controller나 Action Method, Closure 등을 실행 
1-4. Middleware 경로에 지정된 처리의 실행 전후에 임의의 처리를 실행 Request나 Response에 포함 된 값의 갱신이나 암호화, 세션 실행, 인증 처리 등을 실행 여러 미들웨어를 조합하여 사용 가능 
1-5. Controller or Closure HTTP Request에 대응하는 처리를 실행 실질적인 비지니스 로직이 구현되는 곳으로 좁은 의미로의 Application의 실행 기점 처리를 완료하면 Response를 만들고 반환</li>
</ol>
<h3 id="디렉토리-구조">디렉토리 구조</h3>
<pre><code>root/
    |--    app/                : 컨트롤러나 모델, 미들웨어 등 주요한 처리 클래스가 모여있는 디렉토리
    |--    bootstrap/     : 가장 먼저 실행되는 처리나 autoloading 설정, 퍼포먼스 향상을 위한 cache 등을 배치 (일반적으로 수정 불필요)
    |--    config/             : 설정 파일을 배치 (composer로 프로젝트를 생성했을 경우 .env로 대체 됨, .env에 없는 설정을 config디렉토리의 설정을 사용)
    |--    database/         : DB 관련 파일을 배치
    |--    lang/               : 다국어 파일을 배치
    |--    public/             : 엔트리 포인트(index.php)가 배치되는 루트로 설정
    |--    resources/       : 뷰 파일, CSS, JavaScript 파일 등을 배치
    |--    routes/             : 루트 정의 파일을 배치
    |--    storage/           : 라라벨이 만드는 파일을 출력하는 위치로, 로그파일이나 캐시 및 컴파일 된 파일등을 배치
    |--    tests/             : 테스트 코드 파일을 배치
    |--    vendor/             : composer로 프로젝트를 생성했을 경우 다운로드된 패키지 및 Laravel 본체 코드가 배치, 버전관리에 비포함
  |-- .editorconfig     : IDE 또는 에디터에서 참고하는 코딩 표준 스타일 설정 파일
  |-- .env                  : 환경 변수를 지정하는 파일
  |-- .env.example     : 환경설정 예제 파일
  |-- .gitattributes : git 디렉토리 및 파일 단위로 설정을 적용하는 파일
  |-- .gitignore         : git 버전 관리 제외 대상 설정 파일
  |-- composer.json     : 개발자가 편집하는 composer 설정 파일, 프로젝트의 구성과 의존성에 대한 정보
  |-- composer.lock     : 자동으로 생성되는 composer 설정 파일, 프로젝트의 구성과 의존성에 대한 정보
  |-- package.json     : 프론트엔드의 파일과 의존성에 대한 정보가 있는 설정 파일
  |-- phpunit.xml         : 테스트에서 사용하는 PHPUnit 설정 파일
</code></pre><p>루트 디렉토리의 파일 .editorconfig </p>
<ul>
<li>IDE 또는 에디터에서 참고하는 코딩 표준 스타일 설정 파일 
.env :
환경 변수를 지정하는 파일 
.env.example : 
환경설정 예제 파일 
.gitattributes : 
git 디렉토리 및 파일 단위로 설정을 적용하는 파일 
.gitignore : 
git 버전 관리 제외 대상 설정 파일 composer.json : 
개발자가 편집하는 composer 설정 파일, 프로젝트의 구성과 의존성에 대한 정보 
composer.lock : 
자동으로 생성되는 composer 설정 파일, 프로젝트의 구성과 의존성에 대한 정보 
package.json : 
프론트엔드의 파일과 의존성에 대한 정보가 있는 설정 파일 
phpunit.xml : 테스트에서 사용하는 PHPUnit 설정 파일</li>
</ul>
<h3 id="restrepresentational-state-transfer-api란">REST(Representational State Transfer) API란?</h3>
<p>로이 필딩이 2000년에 정의한 네트워크 소프트웨어 아키텍처 네트워크에서 통신을 구성할 때 사용하는 설계 지침 태생 자체가 데이터 송수신에 최적화 되어 있다보니 웹 API 쪽에서 굉장히 많이 사용</p>
<h3 id="1-rest-api의-조건">1. REST API의 조건</h3>
<p>1-1. Client-Server 클라이언트와 서버로 분리되어야하며 서로 의존성이 없어야 한다. 
1-2. Stateless(무상태성) 상태 정보를 따로 저장하지 않으며, 이용자가 누구인지 혹은 어디서 접근하는지와 관계 없이 결과가 무조건 동일해야 한다. 따라서 REST API는 필연적으로 오픈될 수밖에 없다. 
1-3. Cache HTTP를 비롯한 네트워크 프로토콜에서 제공하는 캐싱 기능을 적용할 수 있어야 한다. 
1-4. Uniform Interface 데이터가 표준 형식으로 전송될 수 있도록 구성 요소 간 통합 인터페이스를 사용한다. REST API는 HTTP 표준인 URL과 응답 코드, Request-Response Method를 사용한다. 
1-5. Layered System API는 REST 조건을 만족하면 필연적으로 오픈될 수 밖에 없기 때문에, 요청된 정보를 검색하는데 있어 계층 구조로 분리되어야 한다. 
1-6. Self-descriptiveness API를 통해 전송되는 내용은 별도 문서 없이 쉽게 이해할 수 있도록 자체 표현 구조를 지녀야 한다. 현재는 주로 JSON이 가장 많이 사용되며, 간혹 XML이 사용된다.</p>
<h3 id="rest-api-설계-예시">REST API 설계 예시</h3>
<p>3-1. URI는 동사보다는 명사를, 대문자보다는 소문자를 사용하여야 한다. 
3-2. 마지막에 슬래시 (/)를 포함하지 않는다. 3-3. 언더바 대신 하이픈을 사용한다. 
3-4. 파일확장자는 URI에 포함하지 않는다. 
3-5. 행위를 포함하지 않는다. 
3-6. 복수형 명사를 사용한다.</p>
<p>EX) GET <a href="http://localhost/members/1">http://localhost/members/1</a> : 1번 회원 조회 POST <a href="http://localhost/members">http://localhost/members</a> : 회원 정보 리소스 생성 PUT <a href="http://localhost/members/1">http://localhost/members/1</a> : 1번 회원 정보 수정 DELETE <a href="http://localhost/members/1">http://localhost/members/1</a> : 1번 회원 정보 삭제</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[정규표현식(Regex)]]></title>
            <link>https://velog.io/@lxn_ee/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9DRegex</link>
            <guid>https://velog.io/@lxn_ee/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9DRegex</guid>
            <pubDate>Wed, 01 May 2024 08:27:16 GMT</pubDate>
            <description><![CDATA[<h1 id="정규-표현식regular-expression이란">정규 표현식(Regular Expression)이란?</h1>
<ul>
<li>문자열을 검색하거나 변경하기 위해 사용되는 패턴을 나타내는 문자열</li>
<li>일반적으로 정규식(Regex) 로 줄여 부른다.</li>
<li>복잡한 패턴의 문자열 검증 절차를 간단하게 표현 가능</li>
<li>대부분의 언어에서 정규식 문법이 비슷하다.</li>
<li>여러 기호를 조합하여 사용하기에 가독성이 좋지 않다.</li>
</ul>
<h1 id="정규-표현식regular-expression-플래그">정규 표현식(Regular Expression) 플래그</h1>
<table>
<thead>
<tr>
<th>Flag</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>g</td>
<td>문자열 내의 모든 패턴 검색</td>
</tr>
<tr>
<td>i</td>
<td>대소문자를 구별하지 않고 검색</td>
</tr>
<tr>
<td>m</td>
<td>문자열의 행이 바뀌더라도 계속 검색</td>
</tr>
<tr>
<td>s</td>
<td>. 이 개행문자(\n) 도 포함하여 검색</td>
</tr>
<tr>
<td>u</td>
<td>유니코드 전체 지원</td>
</tr>
<tr>
<td>y</td>
<td>특정 위치에서 검색 진행 모드 활성화</td>
</tr>
</tbody></table>
<h1 id="정규-표현식regular-expression-기호">정규 표현식(Regular Expression) 기호</h1>
<h2 id="특정-문자-및-숫자-매칭-패턴">특정 문자 및 숫자 매칭 패턴</h2>
<table>
<thead>
<tr>
<th>패턴</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>a-z</td>
<td>영어 소문자 (-로 범위 지정)</td>
</tr>
<tr>
<td>A-Z</td>
<td>영어 대문자 (-로 범위 지정)</td>
</tr>
<tr>
<td>ㄱ-ㅎ가-힣</td>
<td>한글 문자 (-로 범위 지정)</td>
</tr>
<tr>
<td>0-9</td>
<td>숫자 (-로 범위 지정)</td>
</tr>
<tr>
<td>.</td>
<td>모든 문자열(영어, 한글, 숫자, 특수기호, 공백 등), 단</td>
</tr>
<tr>
<td>\d</td>
<td>숫자</td>
</tr>
<tr>
<td>\D</td>
<td>숫자 이외</td>
</tr>
<tr>
<td>\w</td>
<td>영어 알파뱃과 숫자 및 _ 인것, [A-Za-z0-9_]와 동일</td>
</tr>
<tr>
<td>\W</td>
<td>\w 이외</td>
</tr>
<tr>
<td>\s</td>
<td>공백</td>
</tr>
<tr>
<td>\S</td>
<td>공백 이외</td>
</tr>
<tr>
<td>\특수기호</td>
<td>특수기호, 예) *  !  ?  … 등</td>
</tr>
<tr>
<td>\b</td>
<td>63개 문자(영문 대소문자 52개 + 숫자 10개 + _(underscore))가 아닌 나머지 문자에 일치하는 경계(boundary)</td>
</tr>
<tr>
<td>\B</td>
<td>63개 문자에 일치하는 경계</td>
</tr>
<tr>
<td>\x</td>
<td>16진수 문자에 일치/\x61/는 a에 일치</td>
</tr>
<tr>
<td>\0</td>
<td>8진수 문자에 일치/\141/은 a에 일치</td>
</tr>
<tr>
<td>\u</td>
<td>유니코드(Unicode) 문자에 일치/\u0061/는 a에 일치</td>
</tr>
<tr>
<td>\c</td>
<td>제어(Control) 문자에 일치</td>
</tr>
<tr>
<td>\f</td>
<td>폼 피드, (FF, U+000C) 문자에 일치</td>
</tr>
<tr>
<td>\n</td>
<td>줄 바꿈, (LF, U+000A) 문자에 일치</td>
</tr>
<tr>
<td>\r</td>
<td>캐리지 리턴, (CR, U+000D) 문자에 일치</td>
</tr>
<tr>
<td>\t</td>
<td>탭, (U+0009) 문자에 일치</td>
</tr>
</tbody></table>
<h2 id="검색-기준-패턴">검색 기준 패턴</h2>
<table>
<thead>
<tr>
<th>패턴</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td></td>
<td></td>
</tr>
<tr>
<td>예) a</td>
<td>b</td>
</tr>
<tr>
<td>[]</td>
<td>대괄호 안의 문자들 중 하나</td>
</tr>
<tr>
<td>예) /[abc]/ : &quot;a&quot;</td>
<td>&quot;b&quot;</td>
</tr>
<tr>
<td>[^문자]</td>
<td>대괄호 안의 문자를 제외한 문자</td>
</tr>
<tr>
<td>예) [^lgEn] &quot;l&quot; &quot;g&quot; &quot;E&quot; &quot;N&quot; 4개 문자를 제외</td>
<td></td>
</tr>
<tr>
<td>^문자열</td>
<td>특정 문자열로 시작</td>
</tr>
<tr>
<td>예) /^www/</td>
<td></td>
</tr>
<tr>
<td>문자열$</td>
<td>특정 문자열로 끝</td>
</tr>
<tr>
<td>예) /com$/</td>
<td></td>
</tr>
</tbody></table>
<h2 id="반복-패턴">반복 패턴</h2>
<table>
<thead>
<tr>
<th>패턴</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>?</td>
<td>없거나 or 최대 한개만</td>
</tr>
<tr>
<td>예) /apple?/</td>
<td></td>
</tr>
<tr>
<td>*</td>
<td>없거나 or 있거나 (여러개)</td>
</tr>
<tr>
<td>예) /apple*/</td>
<td></td>
</tr>
<tr>
<td>+</td>
<td>최소 한개 or 여러개</td>
</tr>
<tr>
<td>예) /apple+/</td>
<td></td>
</tr>
<tr>
<td>*?</td>
<td>없거나, 있거나 and 없거나, 최대한개 : 없음</td>
</tr>
<tr>
<td>{0} 과 동일</td>
<td></td>
</tr>
<tr>
<td>+?</td>
<td>최소한개, 있거나 and 없거나, 최대한개 : 한개</td>
</tr>
<tr>
<td>{1}과 동일</td>
<td></td>
</tr>
<tr>
<td>{n}</td>
<td>n개</td>
</tr>
<tr>
<td>예) ^[a-z]{2}$</td>
<td></td>
</tr>
<tr>
<td>{min,}</td>
<td>최소 Min개 이상</td>
</tr>
<tr>
<td>예) ^[a-z]{1,}$</td>
<td></td>
</tr>
<tr>
<td>{min, max}</td>
<td>최소 Min개 이상, 최대 Max개 이하</td>
</tr>
<tr>
<td>예) ^[a-z]{2,5}$</td>
<td></td>
</tr>
</tbody></table>
<h2 id="그룹-패턴">그룹 패턴</h2>
<table>
<thead>
<tr>
<th>패턴</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>()</td>
<td>그룹화 및 캡쳐</td>
</tr>
<tr>
<td>(?:패턴)</td>
<td>그룹화</td>
</tr>
<tr>
<td>(?=)</td>
<td>앞쪽 일치</td>
</tr>
<tr>
<td>예) /ab(?=c)/</td>
<td></td>
</tr>
<tr>
<td>(?!)</td>
<td>부정 앞쪽 일치</td>
</tr>
<tr>
<td>예) /ab(?!c)/</td>
<td></td>
</tr>
<tr>
<td>(?≤)</td>
<td>뒤쪽 일치</td>
</tr>
<tr>
<td>예) /(?&lt;=ab)c/</td>
<td></td>
</tr>
<tr>
<td>(?&lt;!)</td>
<td>부정 뒤쪽 일치</td>
</tr>
<tr>
<td>예) /(?&lt;!ab)c/</td>
<td></td>
</tr>
</tbody></table>
<h1 id="정규표현식regular-expression-샘플">정규표현식(Regular Expression) 샘플</h1>
<table>
<thead>
<tr>
<th>상황</th>
<th>샘플</th>
</tr>
</thead>
<tbody><tr>
<td>숫자만 허용</td>
<td>/^[0-9]+$/</td>
</tr>
<tr>
<td>한글만 허용</td>
<td>/^[ㄱ-ㅎ가-힣]+$/</td>
</tr>
<tr>
<td>휴대전화 번호</td>
<td>/^010-[0-9]{4}-[0-9]{4}$/</td>
</tr>
<tr>
<td>아이디</td>
<td>^[a-z][a-z0-9]{4,10}$ 영어 소문자로 시작하는 영어 소문자 및 숫자로 이루어진 4~10글자</td>
</tr>
<tr>
<td>이메일</td>
<td>/^<a href="?!.*?%5B-_.%5D%7B2%7D">0-9a-zA-Z</a>[a-zA-Z0-9-_.]{3,63}@<a href="?!.*?%5B-_.%5D%7B2%7D">0-9a-zA-Z</a>[a-zA-Z0-9-_.]{3,63}.[a-zA-Z]{2,3}$/</td>
</tr>
</tbody></table>
<ol>
<li>로컬 파트
영어 대소문자 및 숫자로 시작
영어 대소문자 및 숫자와 특수문자(- , _ , .)만 허용
특수는자는 연속으로 올 수 없음
글자수 4~64 제한</li>
<li>도메인 파트
2-1. 도메인명
 영어 대소문자 및 숫자로 시작
 영어 대소문자 및 숫자와 특수문자(- , _ , .)만 허용
 특수는자는 연속으로 올 수 없음
 글자수 4<del>64 제한
2-2 최상위 도메인
 영어 대소문자로 시작
 영어 대소문자만 허용
 글자수 2</del>3 제한</li>
<li>기타
로컬 파트와 도메인파트 사이에 @필수
도메인명과 최상위 도메인 사이에 . 필수 |</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[OOP(객체 지향 프로그래밍)]]></title>
            <link>https://velog.io/@lxn_ee/OOP%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</link>
            <guid>https://velog.io/@lxn_ee/OOP%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</guid>
            <pubDate>Tue, 30 Apr 2024 08:49:30 GMT</pubDate>
            <description><![CDATA[<h1 id="oop란-">OOP란 ?</h1>
<ul>
<li>객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, &#39;객체&#39;들의 상호작용(메시지 주고받기, 데이터 처리 등)으로 프로그램 로직을 구성</li>
<li>객체란 프로그램에서 사용되는 데이터 또는 식별자(identifier)에 의해 참조되는 공간을 의미</li>
</ul>
<h2 id="oop의-특징">OOP의 특징</h2>
<ol>
<li>캡슐화(Encapsulation)💊<ul>
<li>한 객체가 특정한 하나의 목적을 위해 필요한 데이터나 메소드를 하나로 묶는 것을 의미한다</li>
<li>데이터는 외부에서 직접 접근을 하면 안되고 함수를 통해서만 접근해야 한다</li>
</ul>
</li>
<li>상속(inheritance)👪</li>
</ol>
<ul>
<li>기존 메소드와 변수를 물려받되, 필요한 기능을 더 추가하거나 나(자식클래스)에게 맞게 재정의하는 방법</li>
</ul>
<ol start="3">
<li>추상화(abstraction)🎈</li>
</ol>
<ul>
<li>공통의 속성이나 기능을 묶어 이름을 붙이는 것이다
→ 보통 객체 지향 프로그래밍에서 클래스를 정의하는 걸 추상화라고 생각하면 된다</li>
</ul>
<ol start="4">
<li>다형성(polymorphism)🧿</li>
</ol>
<ul>
<li>하나의 변수명이 상황에 따라 다른 의미로 해석될 수 있다는 것을 뜻한다</li>
<li>보통 OOP에서 오버라이딩과 오버로딩을 의미<ul>
<li><strong>오버라이딩(Overriding)</strong> : 부모에게 상속받은 메소드를 자식이 재정의 하는 것</li>
<li><strong>오버로딩(Overloading)</strong> : 메소드명이 같고 파라미터의 갯수나 타입이 다르게 정의 하는 것</li>
</ul>
</li>
</ul>
<h2 id="oop의-장단점">OOP의 장단점</h2>
<ul>
<li>장점<ul>
<li>모듈화를 통해 개발하기 때문에 업무분담이 편하고, 대규모 소프트웨어 개발에 적합</li>
<li>클래스단위로 수정이 가능하기에 유지 보수가 용이</li>
<li>클래스의 재사용 및 상속을 통해 확장하므로 코드 재사용이 용이</li>
</ul>
</li>
<li>단점<ul>
<li>처리속도가 상대적으로 느려짐</li>
<li>객체의 수가 증가함에 따라 용량이 커질 수 있음</li>
<li>설계에 많은 시간과 노력이 필요 함</li>
<li>소규모 소프트웨어 개발의 경우 오히려 복잡해 질 수 있음<h2 id="oop-5원칙solid">OOP 5원칙(SOLID)</h2>
</li>
</ul>
</li>
<li><ul>
<li><strong>단일 책임 원칙(Single Responsibility Principle)</strong><ul>
<li>하나의 클래스는 단 하나의 책임만 가져야 한다.</li>
</ul>
</li>
</ul>
</li>
<li><strong>개방 폐쇄 원칙(Open/Closed Principle)</strong><ul>
<li>소프트웨어 요소는 확장에는 열려있으나, 변경에는 닫혀 있어야 한다.</li>
</ul>
</li>
<li><strong>리스코프 치환 원칙(Liskov Substitution Principle)</strong><ul>
<li>상위 타입의 객체를 하위 타입의 객체로 치환해도, 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.</li>
</ul>
</li>
<li><strong>인터페이스 분리 원칙(Interface Segregation Principle)</strong><ul>
<li>클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공해야 한다.</li>
</ul>
</li>
<li><strong>의존관계 역전 원칙(Dependency Inversion Principle)</strong><ul>
<li>고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되고, 저수준 모듈은 고수준 모듈에 의존해야 한다.<ul>
<li><strong>고수준 모듈</strong> : 비즈니스와 관련된 추상화된 모듈</li>
<li><strong>저수준 모듈</strong> : HTTP, 데이터베이스, 캐시 등과 관련된 구현 모듈</li>
</ul>
</li>
<li>비즈니스와 관련된 부분이 세부 사항에는 의존하지 않는 설계 원칙</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS AJAX]]></title>
            <link>https://velog.io/@lxn_ee/JS-AJAX</link>
            <guid>https://velog.io/@lxn_ee/JS-AJAX</guid>
            <pubDate>Fri, 26 Apr 2024 07:52:59 GMT</pubDate>
            <description><![CDATA[<h1 id="ajax란">AJAX란?</h1>
<ul>
<li>Asynchronous JavaScript And XML의 약어</li>
<li>웹페이지에서 비동기 방식으로 서버와 통신을 하는 기술</li>
<li>웹 페이지 전체를 갱신하지 않고 서버로부터 필요한 데이터를 받아와 일부분만 갱신 가능</li>
<li>대표적으로 Fetch API방식과 axios방식을 사용</li>
<li>일반적으로  JSON 또는 XML 형식으로 서로 데이터를 주고 받는다.</li>
</ul>
<pre><code class="language-javascript">function myAxiosGet(){
    // URL 획득
    const URL = document.querySelector(&#39;#input-url&#39;).value;

    // Axios 처리
    axios.get(URL)
    .then(response =&gt; {
        myMakeImg(response.data);
    })
    .catch()
    ;

}

// 사진 데이터를 화면에 추가 함수
function myMakeImg(data) {
    data.forEach(item =&gt; {
        // 부모요소 접근
        const CONTAINER = document.querySelector(&#39;.img-container&#39;);

        // img 태그 생성
        const ADD_IMG = document.createElement(&#39;img&#39;);
        ADD_IMG.setAttribute(&#39;src&#39;, item.download_url);
        ADD_IMG.style.width = &#39;200px&#39;;
        ADD_IMG.style.height = &#39;200px&#39;;

        // 이미지 화면에 추가
        CONTAINER.appendChild(ADD_IMG);
    });
}

// API호출 버튼 이벤트
const BTN_API = document.querySelector(&#39;#btn-api&#39;);
BTN_API.addEventListener(&#39;click&#39;, myAxiosGet);</code></pre>
<p><a href="src=%22https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js%22">CDN 이용 링크</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS Math, Date, String객체]]></title>
            <link>https://velog.io/@lxn_ee/JS-Math-Date-String%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@lxn_ee/JS-Math-Date-String%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Thu, 25 Apr 2024 08:11:26 GMT</pubDate>
            <description><![CDATA[<h2 id="수학math-객체란">수학(Math) 객체란?</h2>
<ul>
<li>수학적인 처리하기 위한 속성과 메서드를 가진 내장 객체</li>
<li><code>Number</code> 타입만 지원</li>
</ul>
<pre><code class="language-javascript">// 올림, 반올림, 버림
Math.ceil(0.1); // 1 
Math.round(0.5); // 1
Math.floor(0.9); // 0 </code></pre>
<ul>
<li>랜덤값<pre><code class="language-javascript">Math.random(); // 0 ~ 1 랜덤한 수를 반환
// 1~10 랜덤 숫자 획득
Math.ceil(Math.random() * 10);</code></pre>
</li>
<li>최소값, 최대값, 절대값<pre><code class="language-javascript">const ARR = [3,4,8,65,15,1,89,25,11] // 예시
let max = Math.max(...ARR); // 최대값
let min = Math.min(...ARR); // 최소값
</code></pre>
</li>
</ul>
<p>Math.abs(1); // 절대값
Math.abs(-1); // 절대값은 무조건 양수</p>
<pre><code>## 시간/날짜(Date) 객체란?

- 시간과 날짜를 처리하기 위한 속성과 메서드를 가진 내장 객체
- 내부적으로 로컬 타이존에 따른 유닉스 타임스탬프 기반으로 동작
- 1970년 1월 1일 00:00:00부터 현재까지의 경과된 밀리초 단위의 수

```javascript
// 앞에 0을 추가해주는 함수
const lpadZero = (val, length) =&gt; {
    return String(val).padStart(length, &#39;0&#39;)
}

// 현재날짜/시간획득
const NOW = new Date();

// getFullYear() : 연도만 가져오는 메소드 (yyyy)
const YEAR = NOW.getFullYear();

// getMonth() : 월만 가져오는 메소드, 0 ~ 11을 획득
const MONTH = lpadZero(NOW.getMonth() + 1, 2);

// getDate() : 일을 가져오는 메소드
const DATE = lpadZero(NOW.getDate(), 2);

// getHours() : 시를 가져오는 메소드
const HOUR = lpadZero(NOW.getHours(), 2);

// getminutes() : 분을 가져오는 메소드
const MINUTE = lpadZero(NOW.getMinutes(), 2);

// getSeconds() : 초를 가져오는 메소드
const SECOND = lpadZero(NOW.getSeconds(),3);

// getMilliseconds() : 미리초를 가져오는 메소드
const MILLISECONDS = lpadZero(NOW.getMilliseconds(), 3);

// getDay() : 요일을 가져오는 메소드, 0(일)~6(토) 반환
const DAY = NOW.getDay();

// 날짜 포맷
const FOMAT_DATE = `${YEAR}-${MONTH}-${DATE} ${HOUR}:${MINUTE}:${SECOND}, ${changeDayToKoreanDay(DAY)}`

// getTime() : UNIX 타임스탬프를 반환
const TIME = NOW.getTime();</code></pre><h2 id="문자열string-객체">문자열(String) 객체</h2>
<pre><code class="language-javascript">let str2 = new String(&#39;이렇게 만들어야해&#39;);

// length : 문자열의 길이를 반환
console.log(str.length);

// charAt() : 특정 인덱스의 문자를 반환
str.charAt(3);

// indexOf() : 문자열에서 특정 문자열을 찾아 최초의 인덱스를 반환
// 찾지못하면 -1 반환
str = &#39;안녕하세요. 안녕하세요.&#39;;
str.indexOf(&#39;녕&#39;);
if(str.indexOf(&#39;안녕&#39;) &lt; 0) {
    console.log(&#39;해당문자열없음&#39;)
}
// 검색을 시작할 인덱스 위치 지정 하는 방법
str.indexOf(&#39;녕&#39;, 5);

// includes() : 문자열에서 특정 문자열을 찾아 true/false 반환
if(str.includes(&#39;하세요&#39;)){
    console.log(&#39;검색 문자열 존재&#39;)
}

// replace() : 특정 문자열을 찾아서 지정한 문자열로 치환한 문자열을 반환
str = &#39;abcdefg dede&#39;;
str.replace(&#39;de&#39;,&#39;안녕&#39;);

// replaceAll() : 모든 특정 문자열을 찾아서 지정한 문자열로 치환한 문자열을 반환
str.replaceAll(&#39;de&#39;, &#39;안녕&#39;);

// substring() : 시작 인덱스부터 종료 인덱스까지 자른 문자열을 반환
str = &#39;안녕하세요. Javascript입니다.&#39;;
str.substring(0, 3);

let pattern = &#39;JavaScript&#39;;
let patternIndex = str.indexOf(pattern);
str.substring(patternIndex, patternIndex + pattern.length);

// split() : separator를 기준으로 문자열을 잘라서 배열 요소로 담은 배열을 반환
str = &#39;빵, 돼지숯불, 제육, 돈까스&#39;;
str.split(&#39;, &#39;);
str.split(&#39;,&#39; ,2); // 배열길이를 2로 제한

// trim() : 좌우의 공백을 제거해서 문자열 반환
str = &#39;     sadasda    &#39;
str.trim();

// toUpperCase(), toLowerCase() : 알파뱃을 대/소문자로 변환해서 반환
str = &#39;aBcD&#39;;
str.toUpperCase();
str.toLowerCase();</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS 프로미스(Promise) 객체, async/await]]></title>
            <link>https://velog.io/@lxn_ee/JS-%ED%94%84%EB%A1%9C%EB%AF%B8%EC%8A%A4Promise-%EA%B0%9D%EC%B2%B4-asyncawait</link>
            <guid>https://velog.io/@lxn_ee/JS-%ED%94%84%EB%A1%9C%EB%AF%B8%EC%8A%A4Promise-%EA%B0%9D%EC%B2%B4-asyncawait</guid>
            <pubDate>Thu, 25 Apr 2024 08:10:06 GMT</pubDate>
            <description><![CDATA[<h1 id="promise-객체">Promise 객체</h1>
<ul>
<li>JS의 비동기 프로그래밍에서 근간이 되는 기법</li>
<li>콜백지옥을 개선하기위해서 등장한 기법<h2 id="promise-생성">Promise 생성</h2>
<pre><code class="language-javascript">const PRO = (str, ms) =&gt; {
  return new Promise((resolve, reject) =&gt; {
      setTimeout(()=&gt;{
          if(str === &#39;A&#39;) {
              resolve(&#39;성공 : A임&#39;); // 작업 성공 resolve() 호출
          } else {
              reject(&#39;실패 : A아님&#39;); // 작업 실패 reject() 호출
          }
      }, ms);
  });
}</code></pre>
<h2 id="promise-호출">Promise 호출</h2>
<pre><code class="language-javascript">PRO(&#39;B&#39; , 5000)
.then(result =&gt; console.log(&#39;then : &#39; + result)) // resolve가 호출됐을 때
.catch(err =&gt; console.log(&#39;catch : &#39; + err)) // reject가 호출 됐을 때
</code></pre>
</li>
</ul>
<pre><code>
## 콜백지옥과 개선
```javascript
// 콜백지옥
setTimeout(() =&gt; {
    console.log(&#39;A&#39;);
    setTimeout( () =&gt; {
        console.log(&#39;B&#39;);
        setTimeout(() =&gt; {
            console.log(&#39;C&#39;)
        }, 1000);
    }, 2000);
}, 3000);

// 프로미스 객체로 개선
const PRO2 = (str, ms) =&gt; {
    return new Promise( (resolve) =&gt; {
        setTimeout(() =&gt; {
            console.log(str);
            resolve();
        }, ms);
    });
}

PRO2(&#39;A&#39;, 3000)
.then(() =&gt; PRO2(&#39;B&#39;, 2000))
.then(() =&gt; PRO2(&#39;C&#39;, 1000))
.catch(() =&gt; console.log(&#39;ERROR&#39;))
.finally(() =&gt; console.log(&#39;파이널리&#39;));</code></pre><h2 id="병렬-처리-방법promiseall">병렬 처리 방법(Promise.all())</h2>
<pre><code class="language-javascript">const myLoop = cnt =&gt; {
    for(let i = 0; i &lt; cnt; i++) {

    }
    console.log(&#39;myLoop 종료 : &#39; + cnt);
}

// myLoop(100000000);
// myLoop(10000000);
// myLoop(1000000);

Promise.all([myLoop(100000000), myLoop(10000000), myLoop(1000000)]); // 여러 개의 Promise 들을 비동기적으로 실행하여 처리</code></pre>
<h1 id="asyncawait란">async/await란?</h1>
<ul>
<li>Promise 체이닝 또한 연결이 많아 질 경우 코드가 난잡해 질 수 있어 <code>async &amp; await</code>를 도입</li>
<li>코드 작성 부분을 유지보수와 가독성 좋게 해주나, 내부적으로는 Promise를 사용해 비동기 처리를 하므로 <code>Promise</code>를 대체하는 방법은 아니다.</li>
<li>function 키워드 앞에 <code>async</code> 키워드를 붙여주고, 비동키 처리되는 부분 앞에 <code>await</code> 키워드를 붙여주어 구현</li>
</ul>
<pre><code class="language-javascript">const PRO2 = (str, ms) =&gt; {
    return new Promise( (resolve) =&gt; {
        setTimeout(() =&gt; {
            console.log(str);
            resolve();
        }, ms);
    });
}

PRO2(&#39;A&#39;, 3000)
.then(() =&gt; PRO2(&#39;B&#39;, 2000))
.then(() =&gt; PRO2(&#39;C&#39;, 1000))
.catch(() =&gt; console.log(&#39;ERROR&#39;))
.finally(() =&gt; console.log(&#39;파이널리&#39;));

const myAsync = async () =&gt; {
    try {
    await PRO2(&#39;A&#39;, 3000);
    await PRO2(&#39;B&#39;, 3000);
    await PRO2(&#39;C&#39;, 3000);
    } catch(err) {
        console.log(err);
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS 동기와비동기, 타이머(Timer)함수]]></title>
            <link>https://velog.io/@lxn_ee/JS-%EB%8F%99%EA%B8%B0%EC%99%80%EB%B9%84%EB%8F%99%EA%B8%B0-%ED%83%80%EC%9D%B4%EB%A8%B8Timer%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@lxn_ee/JS-%EB%8F%99%EA%B8%B0%EC%99%80%EB%B9%84%EB%8F%99%EA%B8%B0-%ED%83%80%EC%9D%B4%EB%A8%B8Timer%ED%95%A8%EC%88%98</guid>
            <pubDate>Thu, 25 Apr 2024 07:59:23 GMT</pubDate>
            <description><![CDATA[<h1 id="동기와-비동기">동기와 비동기</h1>
<ul>
<li>자바스크립트는 싱글 스레드 언어이기 때문에 한 번에 하나의 작업만 수행할 수 있다. 즉, 이전 작업이 완료되어야 다음 작업을 수행할 수 있게 된다. 우리가 프로그래밍을 하면서 일반적으로 각 함수와 코드들이 위에서 아래로 차례로 동작하는 방식이라고 할 수 있다. 이러한 코드 순차 실행을 동기(Synchronous) 라고 부른다.
따라서 자바스크립트로 여러 작업을 동시에 처리하기 위해 비동기(Asynchronous) 라는 개념을 도입하여, 특정 작업의 완료를 기다리지 않고 다른 작업을 동시에 수행할 수 있도록 하였다.</li>
</ul>
<h2 id="콜백지옥callback-hell">콜백지옥(CallBack Hell)</h2>
<ul>
<li>콜백함수를 이용하여 비동기 처리를 동기처리하도록 만들때 나타나는 소스코드의 난잡한 현상</li>
<li>이러한 콜백지옥을 해결하기위해 Promise나, Async/Await를 이용해 가독성을 향상 시킴</li>
</ul>
<hr>
<h1 id="타이머timer-함수">타이머(Timer) 함수</h1>
<ul>
<li>일정한 시간 간격으로 작업을 반복 실행하거나, 일정시간이 지난 후 작업을 실행하는데 사용</li>
<li>타이머 함수는 비동기적으로 코드를 실행</li>
</ul>
<hr>
<h2 id="settimeout콜백함수-시간ms">setTimeout(콜백함수, 시간(ms))</h2>
<ul>
<li>일정 시간이 흐른 후에 콜백 함수를 실행<pre><code class="language-javascript">setTimeout(() =&gt; console.log(&#39;타임아웃&#39;), 5000);
// 1초뒤 A, 2초 뒤 B, 3초뒤 C출력
setTimeout(() =&gt; console.log(&#39;A&#39;), 1000);
setTimeout(() =&gt; console.log(&#39;B&#39;), 2000);
setTimeout(() =&gt; console.log(&#39;C&#39;), 3000);
// A, B, C를 순선대로 찍고 싶으면 아래와 같이
console.log(&#39;A&#39;);
setTimeout(() =&gt; {
  console.log(&#39;B&#39;);
  console.log(&#39;C&#39;);
}, 1000);
</code></pre>
</li>
</ul>
<pre><code>---
## clearTimeout(타임아웃ID)
- 해당 타임아웃ID의 처리를 제거
```javascript
const TIMEOUT_ID = setTimeout(() =&gt; console.log(&#39;ttt&#39;), 5000);
clearTimeout(TIMEOUT_ID);
console.log(TIMEOUT_ID); // 1</code></pre><hr>
<h2 id="setinterval콜백함수-시간ms-아규먼트1-아규먼트2">setInterval(콜백함수, 시간(ms)[, 아규먼트1, 아규먼트2])</h2>
<ul>
<li>일정 시간마다 콜백함수 실행 <pre><code class="language-javascript">const INTERVAL_ID = setInterval(() =&gt; console.log(&#39;인터벌&#39;), 1000);
// let cnt = 1;
// setInterval(() =&gt; {
//     console.log(&#39;인터벌&#39; + cnt);
//     cnt++;
// }, 1000);</code></pre>
</li>
</ul>
<hr>
<h2 id="clearintervalintervalid">clearInterval(intervalID)</h2>
<ul>
<li>해당 intervalID 처리 제거 <pre><code class="language-javascript">clearInterval(INTERVAL_ID);
</code></pre>
</li>
</ul>
<pre><code>---</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[JS 이벤트(Event)]]></title>
            <link>https://velog.io/@lxn_ee/JS-%EC%9D%B4%EB%B2%A4%ED%8A%B8Event</link>
            <guid>https://velog.io/@lxn_ee/JS-%EC%9D%B4%EB%B2%A4%ED%8A%B8Event</guid>
            <pubDate>Wed, 24 Apr 2024 07:44:42 GMT</pubDate>
            <description><![CDATA[<h2 id="이벤트란-">이벤트란 ?</h2>
<ul>
<li><p>웹페이지에서 발생하는 사용자 상호작용을 말한다.</p>
<h2 id="addeventlistener">addEventListener</h2>
</li>
<li><p>DOM 요소에 이벤트 리스너를 추가하는 가장 현대적인 방법</p>
</li>
<li><p>이벤트를 등록하는 가장 권장되는 방식</p>
</li>
<li><p>동일한 이벤트를 여러번 사용 가능</p>
<pre><code class="language-javascript">const BTN3 = document.querySelector(&#39;#btn3&#39;);
BTN3.addEventListener(&#39;click&#39;, () =&gt; (alert(&#39;버튼3&#39;)));
BTN3.addEventListener(&#39;click&#39;, test);</code></pre>
<pre><code class="language-javascript">// removeEventListener() : 이벤트 추가시 사용했던 이벤트 형식과 콜백함수가 완전 동일해야함
BTN3.removeEventListener(&#39;click&#39;, test); // 제거할려면 함수만들어둔걸 호출해야함
</code></pre>
</li>
</ul>
<p>function test(){
    alert(&#39;test함수 알러트&#39;);
}</p>
<pre><code>## 이벤트 객체(Event Object)

- 이벤트가 발생했을 때 해당 이벤트에 대한 정보를 포함하는 객체
- 이벤트 핸들러 함수 내부에서 사용
```javascript
const BTN4 = document.querySelector(&#39;#btn4&#39;);
BTN4.addEventListener(&#39;click&#39;, e =&gt; {
    console.log(e); 
    console.log(e.target.value); 
    e.target.style.color = &#39;red&#39;; 
});</code></pre><h2 id="팝업창-만들기">팝업창 만들기</h2>
<pre><code class="language-javascript">const BTN_POPUP = document.querySelector(&#39;#popup&#39;);
BTN_POPUP.addEventListener(&#39;click&#39;, () =&gt; {
    window.open(&#39;https://www.naver.com/&#39;, &#39;&#39;, &#39;width=500 height=500&#39;);
}); // window 는 생략가능</code></pre>
<h2 id="모달창-만들기">모달창 만들기</h2>
<pre><code class="language-javascript">// 모달
const BTN_MODAL = document.querySelector(&#39;#btn-modal&#39;);
BTN_MODAL.addEventListener(&#39;click&#39;, toggleModalContainer)

function toggleModalContainer() {
    const MODAL_CONTAINER = document.querySelector(&#39;.modal-container&#39;);
    MODAL_CONTAINER.classList.toggle(&#39;display-none&#39;);
}

// 모달 컨테이너 영역 클릭시 모달 닫기
const MODAL_CONTAINER = document.querySelector(&#39;.modal-container&#39;);
MODAL_CONTAINER.addEventListener(&#39;click&#39;, toggleModalContainer);

// 모달 아이템 영역 눌렀을 때 안꺼지게 하는 방법 중 하나
const TEST = document.querySelector(&#39;.modal-item&#39;);
TEST.addEventListener(&#39;click&#39;, toggleModalContainer);</code></pre>
<h2 id="마우스-이벤트">마우스 이벤트</h2>
<pre><code class="language-javascript">// 마우스를 눌렀을 때 이벤트
const H1 = document.querySelector(&#39;h1&#39;);
H1.addEventListener(&#39;mousedown&#39;, e =&gt; {
    e.target.style.backgroundColor = &#39;pink&#39;;
});
// 마우스를 땟을 때 이벤트
H1.addEventListener(&#39;mouseup&#39;, e =&gt; {
    e.target.style.backgroundColor = &#39;#fff&#39;;
});
// 마우스 포인터가 진입했을 때 이벤트
H1.addEventListener(&#39;mouseenter&#39;, e =&gt; {
    e.target.style.color = &#39;orange&#39;; 
});

// 마우스 포인터가 벗어났을 때 이벤트
H1.addEventListener(&#39;mouseleave&#39;, e =&gt; { 
    e.target.style.color = &#39;#000&#39;; 
});

</code></pre>
]]></description>
        </item>
    </channel>
</rss>