<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>wwwj_in.log</title>
        <link>https://velog.io/</link>
        <description>Developer Record</description>
        <lastBuildDate>Wed, 23 Oct 2024 18:56:54 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>wwwj_in.log</title>
            <url>https://velog.velcdn.com/images/www_j/profile/99f3592b-c994-416f-ac8b-6b521f50d922/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. wwwj_in.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/www_j" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Javascript & Jquery] {} 와 [] 차이]]></title>
            <link>https://velog.io/@www_j/Javascript-Jquery-var-test-%EC%99%80-var-test2-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@www_j/Javascript-Jquery-var-test-%EC%99%80-var-test2-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Wed, 23 Oct 2024 18:56:54 GMT</pubDate>
            <description><![CDATA[<ol>
<li><strong><code>var test = {}</code> (객체):</strong></li>
</ol>
<ul>
<li><p>이는 객체를 생성합니다.</p>
</li>
<li><p>객체는 키-값 쌍의 컬렉션으로, 각 키는 고유한 문자열(또는 심볼)로 값에 접근하는 데 사용됩니다.</p>
</li>
<li><p>예시:</p>
<pre><code class="language-javascript">var test = {
name: &quot;John&quot;,
age: 30
};
console.log(test.name);  // 출력: &quot;John&quot;
console.log(test[&quot;age&quot;]);  // 출력: 30</code></pre>
</li>
</ul>
<ol start="2">
<li><strong><code>var test2 = []</code> (배열):</strong></li>
</ol>
<ul>
<li><p>이는 배열을 생성합니다.</p>
</li>
<li><p>배열은 값(항목)의 정렬된 목록으로, 각 항목은 인덱스를 통해 접근할 수 있습니다. 인덱스는 0부터 시작합니다.</p>
</li>
<li><p>예시:</p>
<pre><code class="language-javascript">var test2 = [&quot;apple&quot;, &quot;banana&quot;, &quot;cherry&quot;];
console.log(test2[0]);  // 출력: &quot;apple&quot;
console.log(test2.length);  // 출력: 3</code></pre>
<h4 id="주요-차이점">주요 차이점:</h4>
</li>
</ul>
<p>1.** 객체 (<code>{}</code>):**</p>
<ul>
<li><p>데이터를 키-값 쌍으로 저장하는 데 사용됩니다.</p>
</li>
<li><p>키는 일반적으로 문자열이며, 값은 어떤 데이터 타입이든 될 수 
있습니다.</p>
</li>
<li><p>키는 순서가 없습니다.</p>
</li>
</ul>
<p>2.** 배열 (<code>[]</code>):**</p>
<ul>
<li><p>항목의 목록을 저장하는 데 사용됩니다.</p>
</li>
<li><p>항목은 인덱스(0부터 시작)에 의해 정렬됩니다.</p>
</li>
<li><p>인덱스는 숫자로 되어 있으며 순차적입니다.</p>
</li>
</ul>
<h4 id="사용-예시">사용 예시:</h4>
<pre><code class="language-javascript">// 객체
var person = {
  firstName: &quot;Alice&quot;,
  lastName: &quot;Smith&quot;,
  age: 25
};
console.log(person.firstName); // 키로 접근, 출력: &quot;Alice&quot;

// 배열
var fruits = [&quot;apple&quot;, &quot;banana&quot;, &quot;cherry&quot;];
console.log(fruits[1]); // 인덱스로 접근, 출력: &quot;banana&quot;</code></pre>
<p>요약하자면, <strong>객체</strong>는 이름이 있는 데이터를 저장하는 데 사용되고, <strong>배열</strong>은 순서가 있는 데이터를 저장하는 데 사용됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Web] HTTP 상태 코드]]></title>
            <link>https://velog.io/@www_j/Web-HTTP-%EC%83%81%ED%83%9C-%EC%BD%94%EB%93%9C</link>
            <guid>https://velog.io/@www_j/Web-HTTP-%EC%83%81%ED%83%9C-%EC%BD%94%EB%93%9C</guid>
            <pubDate>Fri, 18 Oct 2024 16:35:53 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>등록, 조회, 수정, 삭제에 해당하는 HTTP 상태 코드</p>
</blockquote>
<br/>

<h3 id="등록-create">등록 (Create):</h3>
<ul>
<li><p><strong>201 Created:</strong> 요청이 성공적으로 처리되어 새로운 리소스가 생성됨.</p>
</li>
<li><p><strong>400 Bad Request:</strong> 잘못된 구문으로 인해 서버가 요청을 이해할 수 없을 때 발생 (예: 잘못된 데이터 입력).</p>
</li>
<li><p><strong>409 Conflict:</strong> 서버의 현재 상태와 충돌이 발생할 때 (예: 중복된 리소스 등록).</p>
</li>
</ul>
<br/>

<h3 id="조회-read">조회 (Read):</h3>
<ul>
<li><p><strong>200 OK:</strong> 요청이 성공적으로 처리되었고, 서버가 요청한 리소스를 반환함.</p>
</li>
<li><p><strong>204 No Content:</strong> 요청이 성공적으로 처리되었으나 반환할 콘텐츠가 없을 때 (예: 검색 결과가 없음).</p>
</li>
<li><p><strong>404 Not Found:</strong> 요청한 리소스를 찾을 수 없을 때.</p>
</li>
</ul>
<br/>

<h3 id="수정-update">수정 (Update):</h3>
<ul>
<li><p><strong>200 OK:</strong> 요청이 성공적으로 처리되었으며, 리소스가 성공적으로 수정됨.</p>
</li>
<li><p><strong>204 No Content:</strong> 요청이 성공적으로 처리되었지만, 수정 후에 반환할 콘텐츠가 없을 때.</p>
</li>
<li><p><strong>400 Bad Request:</strong> 잘못된 데이터나 구문으로 인해 서버가 요청을 처리할 수 없을 때.</p>
</li>
<li><p><strong>404 Not Found:</strong> 수정하려는 리소스를 찾을 수 없을 때.</p>
</li>
</ul>
<br/>

<h3 id="삭제-delete">삭제 (Delete):</h3>
<ul>
<li><p><strong>200 OK:</strong> 리소스가 성공적으로 삭제되었으며, 서버가 응답을 반환할 때.</p>
</li>
<li><p><strong>204 No Content:</strong> 리소스가 성공적으로 삭제되었고, 반환할 콘텐츠가 없을 때.</p>
</li>
<li><p><strong>404 Not Found:</strong> 삭제하려는 리소스를 찾을 수 없을 때.</p>
</li>
<li><p><strong>400 Bad Request:</strong> 요청이 잘못되었거나 필요한 데이터가 없을 때.</p>
</li>
</ul>
<br/>
이 상태 코드는 일반적인 RESTful API에서 사용



<h3 id="공통-에러-코드">공통 에러 코드</h3>
<ul>
<li>400 Bad Request: 잘못된 요청 (예: 유효하지 않은 데이터)</li>
<li>401 Unauthorized: 인증 필요</li>
<li>403 Forbidden: 권한 없음</li>
<li>404 Not Found: 요청한 리소스를 찾을 수 없음</li>
<li>405 Method Not Allowed: 허용되지 않은 HTTP 메소드</li>
<li>409 Conflict: 리소스의 현재 상태와 충돌 (예: 동시 업데이트)</li>
<li>500 Internal Server Error: 서버 내부 오류</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[용어] 비니즈스 로직 의미와 사용]]></title>
            <link>https://velog.io/@www_j/%EC%9A%A9%EC%96%B4-%EB%B9%84%EB%8B%88%EC%A6%88%EC%8A%A4-%EB%A1%9C%EC%A7%81-%EC%9D%98%EB%AF%B8%EC%99%80-%EC%82%AC%EC%9A%A9</link>
            <guid>https://velog.io/@www_j/%EC%9A%A9%EC%96%B4-%EB%B9%84%EB%8B%88%EC%A6%88%EC%8A%A4-%EB%A1%9C%EC%A7%81-%EC%9D%98%EB%AF%B8%EC%99%80-%EC%82%AC%EC%9A%A9</guid>
            <pubDate>Mon, 23 Sep 2024 14:22:59 GMT</pubDate>
            <description><![CDATA[<p><strong>비즈니스 로직(Business Logic)</strong>은 소프트웨어 애플리케이션에서 <strong>비즈니스 규칙과 절차</strong>를 구현하는 부분입니다. 쉽게 설명하자면, <strong>소프트웨어가 해야 하는 핵심 업무</strong>라고 생각하면 됩니다. </p>
<h3 id="비즈니스-로직의-역할">비즈니스 로직의 역할</h3>
<p>비즈니스 로직은 애플리케이션의 <strong>핵심 기능을 정의</strong>하며, 보통 <strong>Service 계층</strong>에 위치합니다. 여기서 데이터베이스와 상호작용하는 <strong>Repository나 DAO</strong>와는 별개로, 데이터의 흐름과 처리에 관한 주요 결정을 내립니다</p>
<h3 id="예를-들어">예를 들어:</h3>
<p>1.<strong>온라인 쇼핑몰</strong>을 운영한다고 생각해보세요. 쇼핑몰에서 상품을 주문하고, 결제하고, 재고를 관리하는 것들이 핵심 업무입니다.</p>
<ul>
<li><strong>비즈니스 로직</strong>은 <strong>주문을 처리</strong>하고, <strong>재고가 충분한지 확인</strong>하며, <strong>결제를 처리</strong>하는 규칙과 절차입니다.</li>
</ul>
<p>2.<strong>회원 가입</strong>을 예로 들면:</p>
<ul>
<li><p>사용자가 회원 가입을 할 때, 입력한 <strong>이메일이 이미 등록된 이메일인지 확인</strong>하는 것,</p>
</li>
<li><p><strong>비밀번호가 규칙에 맞는지 검사</strong>하는 것,</p>
</li>
<li><p>이 모든 과정이 성공하면 <strong>사용자를 데이터베이스에 저장</strong>하는 것 등이 <strong>비즈니스 로직</strong>에 해당합니다.</p>
</li>
</ul>
<h3 id="비즈니스-로직이-중요한-이유">비즈니스 로직이 중요한 이유</h3>
<p>비즈니스 로직이 없다면 프로그램은 그냥 <strong>데이터를 주고받는 통로</strong>에 불과합니다. 비즈니스 로직이 있어야만 프로그램이 회사의 업무나 목표를 달성하는 <strong>진짜 일</strong>을 할 수 있습니다.</p>
<h3 id="쉽게-생각하면">쉽게 생각하면:</h3>
<ul>
<li><p><strong>Controller</strong>는 마치 <strong>레스토랑의 웨이터</strong> 같아서, 고객의 요청(주문)을 받아오고, 그걸 <strong>주방에 전달</strong>합니다.</p>
</li>
<li><p><strong>Service</strong>(비즈니스 로직을 담당하는 부분)는 <strong>주방</strong>으로, 요청을 받은 후 실제로 음식을 만드는 곳입니다. 주방에서는 <strong>요리법(비즈니스 로직)</strong>에 따라 음식을 만듭니다.</p>
</li>
</ul>
<h3 id="주요-차이점-요약">주요 차이점 요약</h3>
<table border="1">
  <tr>
    <td style="font-weight:bold;">역할</td>
    <td style="font-weight:bold;">Controller</td>
    <td style="font-weight:bold;"> Service/ServiceImpl</td>
  </tr>
  <tr>
    <td style="font-weight:bold;">주요 목적</td>
    <td>HTTP 요청을 처리하고, 요청을 서비스에 전달한 후 응답 반환.</td>
    <td>비즈니스 로직을 처리하고, 데이터베이스와 상호작용.</td>
  </tr>
  <tr>
    <td style="font-weight:bold;">기능</td>
    <td>요청 매핑, 요청 파라미터 처리, 응답 반환 (JSON, XML 등).</td>
    <td>비즈니스 로직, 데이터 처리, 트랜잭션 관리, 데이터베이스 연동.</td>
  </tr>
  <tr>
    <td style="font-weight:bold;">구현</td>
    <td>클라이언트 요청 처리 및 결과 응답 (HTTP 레벨).</td>
    <td>인터페이스로 정의된 비즈니스 로직을 구현하고 DAO/Repository를 호출.</td>
  </tr>
  <tr>
    <td style="font-weight:bold;">구성 요소</td>
    <td>@RestController, @RequestMapping, @GetMapping 등.</td>
    <td>@Service, @Transactional, @Autowired 등을 사용.</td>
  </tr>
</table>

<ul>
<li><p><strong>Controller</strong>는 클라이언트 요청을 받아서 어떤 서비스를 호출할지 결정하고, 결과를 HTTP 응답으로 반환합니다.</p>
</li>
<li><p><strong>ServiceImpl</strong>은 실제 비즈니스 로직을 구현하는 곳으로, 데이터 처리, 외부 시스템 호출, 데이터베이스 연동 등을 담당합니다</p>
</li>
</ul>
<h3 id="요약">요약:</h3>
<ul>
<li><p><strong>비즈니스 로직</strong>은 프로그램이 <strong>실제 일을 처리하는 규칙과 절차</strong>입니다.</p>
</li>
<li><p>예를 들어, 쇼핑몰에서 상품을 주문할 때, 주문을 처리하고 재고를 확인하는 과정이 비즈니스 로직입니다.</p>
</li>
<li><p>프로그램의 핵심 기능을 담당하며, 이 기능을 제대로 설계해야만 프로그램이 목적을 달성할 수 있습니다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Javascript & Jquery] DOM이란]]></title>
            <link>https://velog.io/@www_j/Javascript-Jquery-DOM%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@www_j/Javascript-Jquery-DOM%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Fri, 20 Sep 2024 12:22:03 GMT</pubDate>
            <description><![CDATA[<p><strong>DOM (Document Object Model)</strong>은 웹 페이지의 구조를 표현하는 객체 기반의 트리 구조로, 브라우저가 HTML 문서를 읽고 각 요소를 객체로 변환해 구조화한 형태입니다. 즉, HTML 문서를 브라우저가 이해할 수 있도록 객체화한 버전이라고 보면 됩니다.</p>
<p>브라우저가 HTML 문서를 로드하면 그 문서를 DOM 트리로 변환하며, 자바스크립트는 이 DOM을 통해 HTML 요소에 접근하고 조작할 수 있습니다.</p>
<h3 id="dom-트리-예시">DOM 트리 예시</h3>
<p>만약 다음과 같은 HTML이 있다면:</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;DOM Example&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;Welcome to DOM&lt;/h1&gt;
    &lt;p&gt;This is a paragraph.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>이 HTML은 다음과 같은 트리 구조로 표현됩니다:</p>
<pre><code class="language-css">Document
 ├── html
 │   ├── head
 │   │   └── title (DOM Example)
 │   └── body
 │       ├── h1 (Welcome to DOM)
 │       └── p (This is a paragraph.)</code></pre>
<p>위 트리 구조에서,<code>Document</code>는 최상위 객체(문서 전체)이고, 그 아래에 <code>html</code>, <code>head</code>, <code>body</code>와 같은 노드들이 있습니다. 각 노드는 그 안에 다른 요소들을 포함할 수 있습니다.</p>
<h3 id="dom-예시">DOM 예시</h3>
<p>DOM은 HTML 요소에 접근하고, 변경할 수 있도록 해줍니다. 예를 들어, 자바스크립트를 사용해 <code>&lt;h1&gt;</code> 태그의 텍스트를 변경하는 것은 DOM을 통해 이루어집니다.</p>
<p><strong>HTML:</strong></p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;DOM Example&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1 id=&quot;heading&quot;&gt;Welcome to DOM&lt;/h1&gt;
    &lt;button id=&quot;changeTextButton&quot;&gt;Change Text&lt;/button&gt;

    &lt;script&gt;
        // 자바스크립트를 통해 DOM의 요소에 접근하여 텍스트 변경
        document.getElementById(&#39;changeTextButton&#39;).addEventListener(&#39;click&#39;, function() {
            // DOM을 통해 h1 요소에 접근하여 텍스트 변경
            document.getElementById(&#39;heading&#39;).textContent = &#39;DOM Changed!&#39;;
        });
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><strong>설명:</strong></p>
<ol>
<li><p>브라우저가 HTML을 읽고 DOM 트리를 구성합니다.</p>
</li>
<li><p><code>document.getElementById(&#39;heading&#39;)</code>는 DOM 트리에서 <code>&lt;h1 id=&quot;heading&quot;&gt;</code> 요소에 접근합니다.</p>
</li>
<li><p><code>textContent</code> 속성을 사용해 <code>&lt;h1&gt;</code> 태그의 텍스트를 변경합니다.</p>
</li>
<li><p>버튼을 클릭하면 DOM을 통해 <code>h1</code> 요소의 텍스트가 &quot;DOM Changed!&quot;로 바뀝니다.</p>
</li>
</ol>
<h3 id="dom의-주요-개념">DOM의 주요 개념</h3>
<ul>
<li><p><strong>노드 (Node):</strong> DOM 트리의 각 요소를 말합니다. <code>&lt;html&gt;</code>, <code>&lt;head&gt;</code>, <code>&lt;body&gt;</code> 등 모든 HTML 요소는 노드입니다.</p>
</li>
<li><p><strong>부모/자식 관계:</strong> DOM 트리에서 상위에 있는 노드는 부모 노드, 하위에 있는 노드는 자식 노드입니다.</p>
</li>
<li><p><strong>속성:</strong> 각 노드는 다양한 속성을 가지고 있으며, 자바스크립트를 통해 이 속성들을 조작할 수 있습니다.</p>
</li>
</ul>
<h3 id="dom을-통해-자주-사용되는-조작들">DOM을 통해 자주 사용되는 조작들</h3>
<ol>
<li><p><strong>HTML 요소 접근:</strong> <code>document.getElementById()</code>, <code>document.querySelector()</code></p>
</li>
<li><p><strong>속성 변경:</strong> <code>element.textContent</code>, <code>element.innerHTML</code></p>
</li>
<li><p><strong>클래스 추가/제거:</strong> <code>element.classList.add()</code>, <code>element.classList.remove()</code></p>
</li>
<li><p><strong>이벤트 바인딩:</strong> <code>element.addEventListener()</code></p>
</li>
</ol>
<p>DOM은 자바스크립트와 HTML이 상호작용하는 핵심적인 부분입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Javascript & Jquery] propertychange, change, keyup, paste, input]]></title>
            <link>https://velog.io/@www_j/Javascript-Jquery-propertychange-change-keyup-paste-input</link>
            <guid>https://velog.io/@www_j/Javascript-Jquery-propertychange-change-keyup-paste-input</guid>
            <pubDate>Fri, 20 Sep 2024 11:53:45 GMT</pubDate>
            <description><![CDATA[<p><code>propertychange</code>, <code>change</code>, <code>keyup</code>, <code>paste</code>, <code>input</code>는 모두 <strong>JavaScript/jQuery</strong>에서 특정 이벤트를 처리하기 위한 <strong>이벤트 타입</strong>입니다. 각 이벤트는 사용자가 웹 페이지나 애플리케이션과 상호작용할 때 발생하며, 주로 폼 요소나 입력 필드에서 자주 사용됩니다. <strong>주요 차이점</strong>은 어떤 종류의 사용자 입력을 감지하는지에 따라 다릅니다.</p>
<h3 id="1-propertychange">1. propertychange</h3>
<ul>
<li><p><strong>설명:</strong> IE에서 사용되는 이벤트로, HTML 요소의 속성이 변경되었을 때 발생합니다. 특히, <code>&lt;input&gt;</code> 요소의 값이 변경될 때 감지할 수 있습니다.</p>
</li>
<li><p><strong>특징:</strong> 모든 속성의 변경을 감지하며, IE8부터 IE11까지 사용되었습니다. 다른 브라우저에서는 거의 사용되지 않습니다.</p>
</li>
<li><p><strong>사용 예시:</strong></p>
<pre><code class="language-javascript">$(&#39;#input-field&#39;).on(&#39;propertychange&#39;, function() {
  console.log(&#39;Property changed!&#39;);
});</code></pre>
</li>
</ul>
<h3 id="2-change">2. change</h3>
<ul>
<li><p><strong>설명:</strong> <code>&lt;input&gt;</code>, <code>&lt;textarea&gt;</code>, <code>&lt;select&gt;</code> 같은 폼 요소의 값이 변경된 후 포커스가 벗어났을 때 발생합니다.</p>
</li>
<li><p><strong>특징:</strong> 값이 변경된 뒤에 요소에서 포커스를 잃거나 <code>enter</code> 키로 제출할 때 트리거됩니다.</p>
</li>
<li><p><strong>사용 예시:</strong></p>
<pre><code class="language-javascript">$(&#39;#input-field&#39;).on(&#39;change&#39;, function() {
  console.log(&#39;Input value changed!&#39;);
});</code></pre>
</li>
</ul>
<h3 id="3-keyup">3. keyup</h3>
<ul>
<li><p><strong>설명:</strong> 키보드를 눌렀다가 <strong>뗄 때</strong> 발생하는 이벤트입니다.</p>
</li>
<li><p><strong>특징:</strong> 입력 중인 키보드의 <strong>키가 릴리즈될 때</strong> 발생합니다. 이를 통해 사용자가 입력한 내용을 실시간으로 확인할 수 있습니다.</p>
</li>
<li><p><strong>사용 예시:</strong></p>
<pre><code class="language-javascript">$(&#39;#input-field&#39;).on(&#39;keyup&#39;, function() {
  console.log(&#39;Key released!&#39;);
});</code></pre>
</li>
</ul>
<h3 id="4-paste">4. paste</h3>
<ul>
<li><p><strong>설명:</strong> 요소에 <strong>붙여넣기(paste)</strong> 작업이 일어날 때 발생하는 이벤트입니다.</p>
</li>
<li><p><strong>특징:</strong> 사용자가 복사한 텍스트나 콘텐츠를 붙여넣었을 때 트리거됩니다.</p>
</li>
<li><p><strong>사용 예시:</strong></p>
<pre><code class="language-javascript">$(&#39;#input-field&#39;).on(&#39;paste&#39;, function() {
  console.log(&#39;Content pasted!&#39;);
});</code></pre>
<h3 id="5-input">5. input</h3>
</li>
<li><p><strong>설명:</strong> <code>&lt;input&gt;</code> 또는 <code>&lt;textarea&gt;</code> 요소에서 <strong>값이 변경될 때마다</strong> 발생하는 이벤트입니다.</p>
</li>
<li><p><strong>특징:</strong> 값이 변경될 때마다 실시간으로 트리거됩니다. 키보드로 입력, 붙여넣기, 드래그 앤 드롭 등 모든 방식의 입력을 감지할 수 있습니다. 가장 일반적으로 사용되는 이벤트 중 하나입니다.</p>
</li>
<li><p><strong>사용 예시:</strong></p>
<pre><code class="language-javascript">$(&#39;#input-field&#39;).on(&#39;input&#39;, function() {
  console.log(&#39;Input changed!&#39;);
});</code></pre>
<h3 id="이벤트들의-차이점">이벤트들의 차이점:</h3>
</li>
<li><p><code>propertychange</code>: 특정 속성의 변화(주로 IE에서 사용).</p>
</li>
<li><p><code>change</code>: 값이 바뀌고 포커스가 벗어났을 때 발생.</p>
</li>
<li><p><code>keyup</code>: 키를 눌렀다가 뗐을 때 발생.</p>
</li>
<li><p><code>paste</code>: 복사한 내용을 붙여넣을 때 발생.</p>
</li>
<li><p><code>input</code>: 입력 내용이 실시간으로 변할 때마다 발생 (가장 범용적).</p>
</li>
</ul>
<p><strong>실시간으로 사용자 입력을 감지하려면 주로 <code>input</code> 이벤트를 사용하고, 특정 상황에서는 다른 이벤트들과 함께 사용하여 더 나은 사용자 경험을 제공할 수 있습니다.</strong></p>
<h3 id="언제-무엇을-사용하는-것이-더-좋을까">언제 무엇을 사용하는 것이 더 좋을까?</h3>
<ol>
<li><p><strong>HTML에서 직접 <code>onchange</code>를 사용하는 경우:</strong></p>
<ul>
<li><p><strong>작고 간단한 프로젝트:</strong> 프로젝트가 작고, 복잡하지 않다면 HTML 내에서 직접 이벤트를 설정하는 것이 빠르고 효율적일 수 있습니다.</p>
</li>
<li><p><strong>빠른 프로토타이핑:</strong> 빠르게 화면을 구성하거나 프로토타입을 만들 때 유용할 수 있습니다.</p>
</li>
</ul>
</li>
<li><p><strong>JavaScript에서 이벤트 핸들러를 사용하는 경우:</strong></p>
<ul>
<li><p><strong>중대형 프로젝트:</strong> 프로젝트 규모가 크고, 유지보수와 코드의 확장성이 중요하다면 JavaScript로 이벤트를 관리하는 것이 좋습니다.</p>
</li>
<li><p><strong>재사용성:</strong> 여러 요소에서 동일한 이벤트를 처리해야 할 때 유리합니다.</p>
</li>
<li><p><strong>동적 요소:</strong> 동적으로 생성되는 요소들에도 이벤트를 쉽게 연결할 수 있습니다.</p>
</li>
<li><p><strong>복잡한 이벤트 관리:</strong> 여러 이벤트를 관리하거나 하나의 요소에 여러 이벤트 핸들러가 필요할 때 더 효율적입니다.</p>
</li>
</ul>
</li>
</ol>
<h3 id="결론">결론</h3>
<ul>
<li><p>작은 프로젝트나 빠르게 개발할 때는 <strong>HTML에서 onchange</strong>를 사용하는 것이 간편하고 빠를 수 있습니다.</p>
</li>
<li><p>큰 프로젝트나 유지보수성을 고려해야 하는 경우에는 <strong>JavaScript/jQuery에서 이벤트 핸들러</strong>를 사용하는 것이 더 효율적입니다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Javascript & Jquery] .html() 과 .text()]]></title>
            <link>https://velog.io/@www_j/Javascript-Jquery-.html-%EA%B3%BC-.text</link>
            <guid>https://velog.io/@www_j/Javascript-Jquery-.html-%EA%B3%BC-.text</guid>
            <pubDate>Fri, 20 Sep 2024 11:29:47 GMT</pubDate>
            <description><![CDATA[<p>jQuery의 <code>.html()</code>과 <code>.text()</code> 메서드는 요소의 콘텐츠를 가져오거나 설정하는 데 사용되지만, 주요 차이점은 다음과 같습니다:</p>
<h3 id="1-html">1. .html()</h3>
<ul>
<li><p><strong>설명:</strong> HTML 콘텐츠를 가져오거나 설정합니다.</p>
</li>
<li><p><strong>특징:</strong> 요소 내부에 있는 <strong>HTML 태그</strong>와 함께 콘텐츠를 처리합니다. 즉, HTML 태그를 포함하여 콘텐츠를 가져오거나 설정할 수 있습니다.</p>
</li>
<li><p><strong>사용 예시:</strong></p>
<pre><code class="language-html">&lt;div id=&quot;example&quot;&gt;&lt;strong&gt;Hello&lt;/strong&gt; World&lt;/div&gt;</code></pre>
<pre><code class="language-javascript">// .html() 사용 예시
</code></pre>
</li>
</ul>
<p>// HTML을 가져오기
var content = $(&#39;#example&#39;).html();
console.log(content);  // 출력: <strong>Hello</strong> World</p>
<p>// HTML을 설정하기
$(&#39;#example&#39;).html(&#39;<em>Goodbye</em> World&#39;);
// 결과: <div id="example"><em>Goodbye</em> World</div></p>
<pre><code>
### 2. .text()
* **설명:** 텍스트 콘텐츠를 가져오거나 설정합니다.

* **특징:** HTML 태그를 제외한 순수 텍스트만 처리합니다. 요소 내부의 모든 HTML 태그를 무시하고 텍스트만을 가져오거나 설정합니다.

* **사용 예시:**
```html
&lt;div id=&quot;example&quot;&gt;&lt;strong&gt;Hello&lt;/strong&gt; World&lt;/div&gt;</code></pre><pre><code class="language-javascript">// .text() 사용 예시

// 텍스트를 가져오기
var content = $(&#39;#example&#39;).text();
console.log(content);  // 출력: Hello World

// 텍스트를 설정하기
$(&#39;#example&#39;).text(&#39;Goodbye World&#39;);
// 결과: &lt;div id=&quot;example&quot;&gt;Goodbye World&lt;/div&gt;</code></pre>
<h3 id="주요-차이점">주요 차이점:</h3>
<ul>
<li><p><code>.html():</code> HTML 태그와 함께 콘텐츠를 가져오거나 설정할 수 있습니다.</p>
</li>
<li><p><code>.text():</code> 순수 텍스트만 처리하며, HTML 태그는 무시됩니다.</p>
</li>
</ul>
<p>이 차이점에 따라 HTML 태그를 포함해서 처리해야 하는 경우에는 <code>.html()</code>을, 순수 텍스트만 다루고 싶을 때는 <code>.text()</code>를 사용하면 됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[용어] 매개변수 (Parameter), 인자 (Argument)]]></title>
            <link>https://velog.io/@www_j/%EC%9A%A9%EC%96%B4-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98-Parameter-%EC%9D%B8%EC%9E%90-Argument</link>
            <guid>https://velog.io/@www_j/%EC%9A%A9%EC%96%B4-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98-Parameter-%EC%9D%B8%EC%9E%90-Argument</guid>
            <pubDate>Mon, 16 Sep 2024 07:48:33 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>함수 호출 시 인자(argument)와 매개변수(parameter)는 함수 호출과 함수 정의에서 사용되는 용어입니다. 둘은 서로 연관이 있지만, 맥락에 따라 구분됩니다.</p>
</blockquote>
<br/>

<h3 id="매개변수-parameter">매개변수 (Parameter):</h3>
<ul>
<li><p>함수가 정의될 때 사용되는 변수입니다. 함수가 어떤 값을 입력받아야 하는지 지정하는 변수이며, 함수 내부에서 사용됩니다.</p>
</li>
<li><p>매개변수는 함수 선언 시에 그 함수가 처리할 입력의 이름을 지정하는 부분입니다.</p>
</li>
<li><p>예:</p>
<pre><code class="language-java">void printName(String name) {
  System.out.println(name);
}</code></pre>
<p>여기서 <code>name</code>은 매개변수입니다. 이 함수는 호출될 때 어떤 String 값을 받아서 출력합니다.</p>
</li>
</ul>
<br/>

<h3 id="인자-argument">인자 (Argument):</h3>
<ul>
<li><p>함수가 실제로 호출될 때 함수에 전달되는 값입니다. 즉, 매개변수에 전달되는 실제 데이터를 인자라고 부릅니다.</p>
</li>
<li><p>함수가 호출될 때 사용자가 넘기는 값이 인자입니다.</p>
</li>
<li><p>예:</p>
<pre><code class="language-java">printName(&quot;Alice&quot;);</code></pre>
<p>여기서 <code>&quot;Alice&quot;</code>가 인자입니다. 함수가 호출될 때 매개변수 <code>name</code>에 이 값이 전달됩니다.</p>
</li>
</ul>
<br/>

<p><strong>예시로 설명:</strong></p>
<pre><code class="language-java">void greet(String message) {  // 여기서 &#39;message&#39;는 매개변수
    System.out.println(message);
}

greet(&quot;Hello, World!&quot;);  // 여기서 &#39;Hello, World!&#39;는 인자</code></pre>
<ul>
<li>매개변수는 함수가 정의될 때 사용되는 변수 이름이고,</li>
<li>인자는 함수가 호출될 때 매개변수로 전달되는 실제 값입니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring] @Builder 어노테이션]]></title>
            <link>https://velog.io/@www_j/Spring-Builder-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98</link>
            <guid>https://velog.io/@www_j/Spring-Builder-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98</guid>
            <pubDate>Sat, 14 Sep 2024 18:03:08 GMT</pubDate>
            <description><![CDATA[<p><code>@Builder</code>는 <strong>Lombok</strong> 라이브러리에서 제공하는 어노테이션으로, <strong>빌더 패턴(Builder Pattern)</strong>을 쉽게 구현할 수 있도록 도와줍니다. 빌더 패턴은 복잡한 객체를 생성할 때 유연하고 가독성 좋은 방식으로 객체를 생성할 수 있게 해줍니다. <code>@Builder</code>는 주로 <strong>객체 생성 시 필드가 많거나 선택적으로 값을 설정해야 할 때 유용합니다.</strong></p>
<h3 id="1-builder의-역할">1. @Builder의 역할</h3>
<p><code>@Builder</code>는 다음과 같은 역할을 수행합니다:</p>
<ul>
<li><p><strong>빌더 패턴</strong>을 자동으로 생성하여, 객체의 필드를 자유롭게 설정하고 객체를 생성할 수 있게 합니다.</p>
</li>
<li><p><strong>가독성</strong>을 높여, 필드가 많은 객체를 생성할 때 생성자나 setter를 사용하지 않고, <strong>명시적인 방식</strong>으로 객체를 구성할 수 있습니다.</p>
</li>
<li><p><strong>불변 객체</strong>(Immutable Object)나 <strong>값 객체</strong>(Value Object)를 생성하는 데도 유용합니다. 객체를 생성한 후 값이 변경되지 않도록 설계할 수 있습니다.</p>
</li>
</ul>
<br/>

<h3 id="2-빌더-패턴의-장점">2. 빌더 패턴의 장점</h3>
<ul>
<li><p><strong>가독성</strong>: 각 필드를 명시적으로 설정할 수 있어, 코드의 가독성이 향상됩니다.</p>
</li>
<li><p><strong>선택적 필드 설정</strong>: 필요 없는 필드는 설정하지 않고, 필요한 필드만 설정하여 객체를 생성할 수 있습니다.</p>
</li>
<li><p><strong>유연한 객체 생성</strong>: 다양한 방법으로 객체를 유연하게 생성할 수 있습니다.</p>
</li>
<li><p><strong>불변성</strong>: 생성 후 변경되지 않는 객체를 쉽게 만들 수 있습니다.</p>
</li>
</ul>
<br/>

<h3 id="3-builder-사용-예시">3. @Builder 사용 예시</h3>
<p><strong>간단한 예시</strong></p>
<pre><code class="language-java">import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
public class User {
    private String name;
    private int age;
    private String email;
}

// 사용법
public class Main {
    public static void main(String[] args) {
        // User 객체를 빌더 패턴으로 생성
        User user = User.builder()
                        .name(&quot;John Doe&quot;)
                        .age(30)
                        .email(&quot;john@example.com&quot;)
                        .build();

        System.out.println(user);
    }
}</code></pre>
<p>위 코드에서는 <code>@Builder</code>를 사용하여 <strong>User 객체</strong>를 생성할 때 빌더 패턴을 적용했습니다. 필드가 많거나 일부 필드만 설정하고 싶은 경우, 빌더 패턴은 유용하게 사용할 수 있습니다.</p>
<p><strong>@Builder로 생성된 빌더 메서드</strong>
<code>@Builder</code>는 클래스 내에 <strong>빌더 클래스</strong>와 메서드를 자동으로 생성해줍니다. 위 예시에서 <code>User.builder()</code>는 <code>UserBuilder</code>라는 클래스를 생성하고, <code>name()</code>, <code>age()</code>, <code>email()</code> 같은 메서드로 각 필드를 설정할 수 있게 합니다. <code>build()</code> 메서드를 호출하면 설정된 값들로 <code>User</code> 객체가 생성됩니다.</p>
<h3 id="4-빌더-패턴이-필요한-경우">4. 빌더 패턴이 필요한 경우</h3>
<ol>
<li><strong>매개변수가 많은 생성자 대신 사용</strong>:<ul>
<li>필드가 많거나 선택적으로 설정해야 할 필드가 있을 때, 생성자나 setter를 사용하는 -- 것보다 빌더 패턴을 사용하는 것이 훨씬 더 깔끔하고 안전합니다.<pre><code class="language-java"></code></pre>
</li>
</ul>
</li>
</ol>
<p>User user = new User(&quot;John Doe&quot;, 30, &quot;<a href="mailto:john@example.com">john@example.com</a>&quot;); // 가독성 떨어짐</p>
<pre><code>
대신 빌더 패턴을 사용하면:

```java

User user = User.builder()
                .name(&quot;John Doe&quot;)
                .age(30)
                .email(&quot;john@example.com&quot;)
                .build(); // 가독성 향상</code></pre><ol start="2">
<li><p><strong>불변 객체 생성:</strong></p>
<ul>
<li>객체를 생성할 때 값을 설정한 후, 더 이상 값이 변경되지 않도록 하기 위해 빌더 패턴을 사용합니다. 필드를 final로 설정하면 객체가 불변이 됩니다.</li>
</ul>
</li>
</ol>
<pre><code class="language-java">@Builder
public class ImmutableUser {
    private final String name;
    private final int age;
    private final String email;
}</code></pre>
<ol start="3">
<li><p><strong>선택적 필드:</strong></p>
<ul>
<li>필드 중 일부는 선택적일 수 있으며, 빌더 패턴은 이러한 필드를 생략하거나 선택적으로 설정할 수 있게 해줍니다.</li>
</ul>
</li>
</ol>
<br/> 

<h3 id="5-builder와-함께-자주-사용되는-lombok-어노테이션">5. @Builder와 함께 자주 사용되는 Lombok 어노테이션</h3>
<ul>
<li><p><code>@Getter</code> / <code>@Setter</code>: 빌더로 생성된 객체의 필드에 접근할 수 있게 합니다.</p>
</li>
<li><p><code>@ToString</code>: 객체를 문자열로 표현할 때 사용합니다.</p>
</li>
<li><p><code>@AllArgsConstructor</code>, <code>@NoArgsConstructor</code>: 생성자와 함께 사용할 수 있습니다.</p>
</li>
</ul>
<br/>

<h3 id="6-복잡한-객체-구성-예시">6. 복잡한 객체 구성 예시</h3>
<p>빌더 패턴은 복잡한 객체를 구성할 때 특히 유용합니다. 예를 들어, 객체 내에 리스트나 중첩된 객체가 있는 경우에도 쉽게 객체를 생성할 수 있습니다.</p>
<pre><code class="language-java">
import lombok.Builder;
import lombok.ToString;

import java.util.List;

@Builder
@ToString
public class Order {
    private String orderId;
    private List&lt;String&gt; itemList;
    private double totalAmount;
}

// 사용법
public class Main {
    public static void main(String[] args) {
        Order order = Order.builder()
                           .orderId(&quot;ORD12345&quot;)
                           .itemList(List.of(&quot;item1&quot;, &quot;item2&quot;, &quot;item3&quot;))
                           .totalAmount(150.75)
                           .build();

        System.out.println(order);
    }
}</code></pre>
<h3 id="7-builder의-다양한-활용">7. @Builder의 다양한 활용</h3>
<ul>
<li><p><strong>필드 초기화</strong>: 특정 필드를 빌더 패턴에서 기본 값으로 설정할 수 있습니다.</p>
</li>
<li><p><strong>다중 생성 패턴</strong>: <code>@Builder</code>를 생성자와 함께 사용하여 객체 생성 방법을 다변화할 수 있습니다.</p>
<pre><code class="language-java"></code></pre>
</li>
</ul>
<p>@Builder
public class Person {
    private final String firstName;
    private final String lastName;
    private final int age;</p>
<pre><code>@Builder.Default
private final String country = &quot;Unknown&quot;; // 기본값 설정</code></pre><p>}</p>
<pre><code>&lt;br/&gt;

### 8. @Builder와 상속
`@Builder`는 상속 관계에서 사용할 때 다소 주의가 필요합니다. Lombok은 상속받은 필드에 대해 빌더를 자동으로 생성하지 않기 때문에, 상속 관계에서 빌더 패턴을 사용하려면 하위 클래스에서 빌더를 다시 정의하거나, `@SuperBuilder`를 사용할 수 있습니다.

```java

import lombok.experimental.SuperBuilder;

@SuperBuilder
public class Parent {
    private String parentField;
}

@SuperBuilder
public class Child extends Parent {
    private String childField;
}</code></pre><p><strong>결론</strong>
<code>@Builder</code>는 복잡한 객체를 쉽게 생성하고, 선택적으로 필드를 설정할 수 있게 해주는 강력한 도구입니다. 특히 <strong>가독성, 유연성, 불변성</strong>을 강조하는 상황에서 빌더 패턴을 적용하면 코드 유지보수가 쉬워지고, 객체 생성 로직이 간결해집니다. <code>@Builder</code>를 사용하면 빌더 패턴을 수동으로 구현할 필요 없이 Lombok이 이를 자동으로 처리해주므로, 더 적은 코드로 동일한 기능을 구현할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[용어] 매핑(mapping), 바인딩(binding)]]></title>
            <link>https://velog.io/@www_j/Spring-%EB%A7%A4%ED%95%91mapping-%EB%B0%94%EC%9D%B8%EB%94%A9binding</link>
            <guid>https://velog.io/@www_j/Spring-%EB%A7%A4%ED%95%91mapping-%EB%B0%94%EC%9D%B8%EB%94%A9binding</guid>
            <pubDate>Fri, 13 Sep 2024 08:53:45 GMT</pubDate>
            <description><![CDATA[<p> <strong>매핑(mapping)</strong>과 <strong>바인딩(binding)</strong>은 비슷한 개념이지만, 미묘한 차이가 있습니다. 둘 다 어떤 데이터를 다른 데이터와 연결하는 과정에 사용되지만, 주로 쓰이는 맥락과 의미에 따라 다르게 사용됩니다.
 <br/></p>
<p><strong>매핑 (Mapping):</strong></p>
<p>두 개의 서로 다른 데이터 구조를 서로 연결하는 작업을 말합니다. 예를 들어, 데이터베이스의 테이블과 자바 객체 간의 필드를 연결하는 작업을 <code>&quot;매핑&quot;</code>이라고 합니다. MyBatis나 Hibernate와 같은 ORM(Object Relational Mapping) 프레임워크에서는 데이터베이스의 필드와 자바 객체의 속성을 매핑합니다.
<code>ex) SQL 쿼리 결과를 자바 객체의 필드에 매핑하는 작업.</code>
<br/></p>
<p><strong>바인딩 (Binding):</strong></p>
<p>변수를 특정 값이나 객체에 연결하거나, 함수 호출 시 인자와 매개변수를 연결하는 행위를 주로 말합니다. 주로 메모리상에서 변수를 특정 데이터에 연결하거나, UI 컴포넌트와 데이터를 연결할 때 <code>&quot;바인딩&quot;</code>이라고 많이 말합니다.
<code>ex) JDBC에서 SQL 쿼리의 파라미터에 값을 바인딩하는 작업.</code>
<br/></p>
<p>정리하면, 매핑은 주로 구조적인 연결을 의미하고, 바인딩은 주로 변수나 값과의 직접적인 연결을 의미하는 경우가 많습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[LeetCode] Check If N and Its Double Exist]]></title>
            <link>https://velog.io/@www_j/LeetCode-Check-If-N-and-Its-Double-Exist</link>
            <guid>https://velog.io/@www_j/LeetCode-Check-If-N-and-Its-Double-Exist</guid>
            <pubDate>Sun, 08 Sep 2024 13:36:49 GMT</pubDate>
            <description><![CDATA[<h3 id="probelm">Probelm</h3>
<p>정수 배열이 주어졌을 때 , <code>i</code>와 <code>j</code>두 개의 인덱스 가 <code>arr</code>존재하는지 확인합니다.</p>
<blockquote>
<ul>
<li>i != j</li>
</ul>
</blockquote>
<ul>
<li>0 &lt;= i, j &lt; arr.length</li>
<li>arr[i] == 2 * arr[j]</li>
</ul>
<br/>

<h3 id="soulution">Soulution</h3>
<pre><code class="language-java">class Solution {
    public boolean checkIfExist(int[] arr) {
        Set&lt;Integer&gt; set = new HashSet&lt;&gt;();

        for(int num: arr){
            if(set.contains(num*2) || (num % 2 == 0 &amp;&amp; set.contains(num/2))){
                return true;
            }
             set.add(num);
        }
        return false;
    }
}</code></pre>
<p><strong>1. 해시셋 사용:</strong></p>
<ul>
<li><p><code>set</code>이라는 해시셋을 사용하여 배열을 순회하면서 각 숫자를 기록합니다.</p>
</li>
<li><p>현재 숫자의 두 배가 이미 해시셋에 있는지, 또는 현재 숫자가 짝수이며 그 절반이 해시셋에 있는지를 확인합니다.</p>
</li>
<li><p>이 조건이 만족되면 <code>true</code>를 반환합니다.</p>
</li>
</ul>
<p><strong>2. 시간 복잡도:</strong></p>
<ul>
<li>이 방법은 배열을 한 번 순회하면서 각 요소를 상수 시간 내에 해시셋에서 검색할 수 있으므로, 전체 시간 복잡도는 O(n)입니다.</li>
</ul>
<p><strong>3. 음수, 0 처리:</strong></p>
<ul>
<li>이 방법은 음수, 0, 양수 모두 적절히 처리합니다. 0이 두 번 들어가면 두 번째 0을 만나면 바로 true를 반환합니다.</li>
</ul>
<p><strong>결론:</strong></p>
<ul>
<li>해시셋을 사용한 방법이 더 효율적이고, 코드가 직관적이며 다양한 경우를 보다 잘 처리합니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB] Oracle 테이블스페이스 생성 스크립트 추출]]></title>
            <link>https://velog.io/@www_j/DB-Oracle-%ED%85%8C%EC%9D%B4%EB%B8%94%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4-%EC%83%9D%EC%84%B1-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%B6%94%EC%B6%9C</link>
            <guid>https://velog.io/@www_j/DB-Oracle-%ED%85%8C%EC%9D%B4%EB%B8%94%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4-%EC%83%9D%EC%84%B1-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%B6%94%EC%B6%9C</guid>
            <pubDate>Thu, 05 Sep 2024 19:32:57 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>DB 구축시에 기존에 있던 테이블스페이스를 동일하게 구축하고자 할때 사용하는 방법</p>
</blockquote>
<pre><code class="language-sql">SELECT tablespace_name, DBMS_METADATA.GET_DDL(&#39;TABLESPACE&#39;,tablespace_name)||&#39;;&#39; SCRIPT
FROM dba_tablespaces
WHERE tablespace_name IN (&#39;TEMP&#39;,&#39;USERS&#39;);</code></pre>
<p><img src="https://velog.velcdn.com/images/www_j/post/8c971796-8a9a-43b9-b49a-4974164c3c65/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB] Oracle 테이블스페이스 및 유저 생성부터 등록 ]]></title>
            <link>https://velog.io/@www_j/DB-Oracle-%ED%85%8C%EC%9D%B4%EB%B8%94%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B0%8F-%EC%9C%A0%EC%A0%80-%EC%83%9D%EC%84%B1%EB%B6%80%ED%84%B0-%EB%93%B1%EB%A1%9D</link>
            <guid>https://velog.io/@www_j/DB-Oracle-%ED%85%8C%EC%9D%B4%EB%B8%94%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B0%8F-%EC%9C%A0%EC%A0%80-%EC%83%9D%EC%84%B1%EB%B6%80%ED%84%B0-%EB%93%B1%EB%A1%9D</guid>
            <pubDate>Thu, 05 Sep 2024 16:35:13 GMT</pubDate>
            <description><![CDATA[<p>Oracle에서 테이블스페이스를 생성하고 사용자를 등록하는 과정은 다음 단계로 나누어 설명할 수 있습니다. 각 단계는 데이터베이스 저장소의 구조를 정의하고, 사용자에게 데이터를 저장할 권한을 부여하는 작업입니다.</p>
<h3 id="1-테이블스페이스-생성">1. 테이블스페이스 생성</h3>
<p>Oracle에서 테이블스페이스는 데이터베이스 객체(테이블, 인덱스 등)가 물리적으로 저장되는 논리적 저장소입니다. 테이블스페이스는 하나 이상의 데이터 파일을 포함하며, 데이터 파일은 실제로 데이터가 저장되는 물리적 파일입니다.</p>
<p><strong>테이블스페이스 생성 명령:</strong></p>
<pre><code class="language-sql">CREATE TABLESPACE 테이블스페이스_이름
DATAFILE &#39;경로/파일이름.dbf&#39;
SIZE 크기M
AUTOEXTEND ON
NEXT 증가크기M MAXSIZE 최대크기M;</code></pre>
<p><strong>예제:</strong> 
아래는 <code>SHOP</code>이라는 이름의 테이블스페이스를 생성하는 예제입니다.</p>
<pre><code class="language-sql">CREATE TABLESPACE SHOP
DATAFILE &#39;/u01/oracle/oradata/SHOP.dbf&#39;
SIZE 100M
AUTOEXTEND ON
NEXT 10M MAXSIZE 500M;</code></pre>
<ul>
<li><code>DATAFILE</code>: 테이블스페이스에 속하는 물리적 데이터 파일의 경로와 파일 이름.</li>
<li><code>SIZE</code>: 데이터 파일의 초기 크기.</li>
<li><code>AUTOEXTEND ON</code>: 데이터 파일이 자동으로 확장되도록 설정.</li>
<li><code>NEXT</code>: 테이블스페이스가 다 차면 추가할 크기.</li>
<li><code>MAXSIZE</code>: 데이터 파일이 확장될 수 있는 최대 크기.</li>
</ul>
<br/>

<h3 id="2-사용자-생성-및-테이블스페이스-할당">2. 사용자 생성 및 테이블스페이스 할당</h3>
<p>다음 단계는 새로운 사용자를 생성하고, 그 사용자에게 테이블스페이스를 할당하는 것입니다. 사용자는 데이터를 저장할 테이블스페이스가 필요합니다.</p>
<p><strong>사용자 생성 명령:</strong></p>
<pre><code class="language-sql">CREATE USER 사용자_이름 IDENTIFIED BY 비밀번호
DEFAULT TABLESPACE 테이블스페이스_이름
QUOTA 크기M ON 테이블스페이스_이름;</code></pre>
<p><strong>예제:</strong>
<code>USER1</code>이라는 사용자를 생성하고, 그 사용자의 기본 테이블스페이스를 SHOP으로 설정하며, 할당량을 200MB로 설정합니다.</p>
<pre><code class="language-sql">CREATE USER USER1 IDENTIFIED BY password123
DEFAULT TABLESPACE SHOP
QUOTA 200M ON SHOP;</code></pre>
<ul>
<li><code>DEFAULT TABLESPACE</code>: 사용자가 데이터를 생성할 때 기본으로 사용할 테이블스페이스를 지정.</li>
<li><code>QUOTA</code>: 사용자가 해당 테이블스페이스에 데이터를 저장할 수 있는 최대 크기를 지정.</li>
</ul>
<br/>

<h3 id="3-사용자에게-권한-부여">3. 사용자에게 권한 부여</h3>
<p>생성한 사용자에게 데이터베이스 내에서 객체를 생성하고 접근할 수 있는 권한을 부여해야 합니다. 보통 아래와 같은 권한을 부여합니다.</p>
<p><strong>권한 부여 명령:</strong></p>
<pre><code class="language-sql">GRANT CONNECT, RESOURCE TO 사용자_이름;</code></pre>
<p><strong>예제:</strong></p>
<pre><code class="language-sql">GRANT CONNECT, RESOURCE TO USER1;</code></pre>
<ul>
<li><code>CONNECT</code>: 기본 연결 권한.</li>
<li><code>RESOURCE</code>: 테이블, 인덱스와 같은 데이터베이스 객체를 생성할 수 있는 권한.</li>
</ul>
<p>또한, <code>DBA</code> 권한을 부여하고 싶다면:</p>
<pre><code class="language-sql">GRANT DBA TO USER1;</code></pre>
<br/>

<h3 id="4-테이블스페이스-확인">4. 테이블스페이스 확인</h3>
<p>테이블스페이스가 정상적으로 생성되었는지 확인하려면 아래 명령을 사용할 수 있습니다.</p>
<pre><code class="language-sql">SELECT TABLESPACE_NAME, FILE_NAME, BYTES, MAXBYTES
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME = &#39;SHOP&#39;;</code></pre>
<p>이 명령은 테이블스페이스 <code>SHOP</code>의 파일 경로, 크기 등을 보여줍니다.</p>
<br/>

<h3 id="5-테이블스페이스-할당량-확인">5. 테이블스페이스 할당량 확인</h3>
<p>사용자가 테이블스페이스에서 사용할 수 있는 공간을 확인하려면 다음 쿼리를 사용할 수 있습니다.</p>
<pre><code class="language-sql">SELECT TABLESPACE_NAME, BYTES, MAX_BYTES FROM DBA_TS_QUOTAS WHERE USERNAME = &#39;USER1&#39;;</code></pre>
<br/>

<h3 id="6-테이블-생성-및-사용">6. 테이블 생성 및 사용</h3>
<p>이제 <code>USER1</code>로 로그인하고 <code>SHOP</code> 테이블스페이스에 테이블을 생성할 수 있습니다.</p>
<p><strong>예제:</strong></p>
<pre><code class="language-sql">CREATE TABLE MY_TABLE (
    ID NUMBER PRIMARY KEY,
    NAME VARCHAR2(50)
) TABLESPACE SHOP;</code></pre>
<p>이 명령은 <code>SHOP</code> 테이블스페이스에 <code>MY_TABLE</code>이라는 테이블을 생성합니다.</p>
<br/>


<h3 id="요약">요약:</h3>
<ol>
<li><p><strong>테이블스페이스 생성</strong>: <code>CREATE TABLESPACE</code> 명령을 사용하여 테이블스페이스를 생성.</p>
</li>
<li><p><strong>사용자 생성</strong>: <code>CREATE USER</code> 명령을 통해 사용자를 생성하고 테이블스페이스를 할당.</p>
</li>
<li><p><strong>사용자 권한 부여</strong>: <code>GRANT</code> 명령을 통해 사용자가 테이블스페이스에서 객체를 생성할 수 있도록 권한을 부여.</p>
</li>
<li><p><strong>테이블 생성</strong>: 테이블스페이스에 테이블 등의 데이터베이스 객체를 생성.</p>
</li>
</ol>
<p>이 단계를 완료하면 Oracle DB에서 테이블스페이스를 생성하고 사용자를 등록한 후, 해당 테이블스페이스에서 데이터를 저장하고 관리할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[LeetCode] Remove Element]]></title>
            <link>https://velog.io/@www_j/LeetCode-Remove-Element</link>
            <guid>https://velog.io/@www_j/LeetCode-Remove-Element</guid>
            <pubDate>Tue, 27 Aug 2024 01:14:40 GMT</pubDate>
            <description><![CDATA[<h3 id="probelm">Probelm</h3>
<p>주어진 <code>nums</code> 에서 <code>val</code> 원소를 지우는 문제
<code>nums</code> 인덱스 요소를 변화시키고, 리턴 값은 배열의 길이</p>
<hr>
<h3 id="soulution">Soulution</h3>
<p><code>val</code> 값이 일치하지 않을때 값을 넣어주고, 인덱스를 증가시킨다</p>
<pre><code class="language-java">class Solution {  
    public int removeElement(int[] nums, int val) {  
       int length = 0;
        for(int i = 0; i &lt; nums.length; i++){
            if(nums[i] != val){
                nums[length++] = nums[i];
            }
        }
        return length;
    }  
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[LeetCode] Merge Sorted Array]]></title>
            <link>https://velog.io/@www_j/LeetCode-Merge-Sorted-Array</link>
            <guid>https://velog.io/@www_j/LeetCode-Merge-Sorted-Array</guid>
            <pubDate>Mon, 19 Aug 2024 04:17:03 GMT</pubDate>
            <description><![CDATA[<p>두 개의 배열 <code>nums1</code>, <code>nums2</code> 를 <code>nums1</code> 에 하나로 합치는 문제입니다.</p>
<p>두 배열은 오름차순 정렬되어있고, 합쳐진 <code>nums1</code> 도 정렬되어야 합니다.</p>
<p><code>nums1</code> 은 <code>nums2</code> 의 길이인 <code>n</code> 만큼의 추가 공간이 있으며 해당 공간은 <code>0</code> 으로 채워져 있습니다.</p>
<hr>
<h4 id="✍풀이">✍풀이</h4>
<pre><code class="language-java">import java.util.Arrays;

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        // nums2의 요소를 nums1의 뒤쪽에 복사
        for (int i = 0; i &lt; n; i++) {
            nums1[m + i] = nums2[i];
        }
        // 전체 nums1 배열을 정렬
        Arrays.sort(nums1);
        // System.out.println(Arrays.toString(nums1));
    }
}</code></pre>
<p>이 코드는 두 개의 정렬된 배열 <code>nums1</code>과 <code>nums2</code>를 병합하는 작업을 수행합니다. <code>nums1</code> 배열의 크기는 <code>m + n</code>이며, 처음 <code>m</code>개의 요소는 <code>nums1</code>에 저장된 값이고, 나머지 <code>n</code>개의 요소는 <code>0</code>으로 초기화된 상태로 남아있습니다. <code>nums2</code>는 <code>n</code>개의 요소를 가진 배열입니다.</p>
<hr>
<pre><code class="language-java">class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {

        int p1 = m - 1;
        int p2 = n - 1;
        int p = m + n - 1;

        // nums1과 nums2의 요소를 비교하여 큰 요소부터 nums1의 뒤쪽에 채움
        while(p1 &gt;= 0 &amp;&amp; p2 &gt;= 0){
            // System.out.println(&quot;p1, p2, index : &quot; + p1 + &quot;, &quot; + p2);
            // System.out.println(&quot;p1, p2, array = &quot; + nums1[p1] + &quot;, &quot; + nums2[p2]);
            // System.out.println(&quot;배열 길이 : &quot; + p); 
            if(nums1[p1] &gt; nums2[p2]){
                nums1[p--] = nums1[p1--];
            }else{
                nums1[p--] = nums2[p2--];
            }
        }

        // nums2에 남은 요소가 있다면 채워넣음
        // nums1의 남은 요소들은 이미 제자리에 있기 때문에 따로 처리할 필요가 없습니다.
        while(p2 &gt;= 0){
            nums1[p--] = nums2[p2--];
        }
    }
}</code></pre>
<p>배열의 뒤에서부터 큰 요소를 하나씩 채우는 방법을 사용하면 정렬 없이도 효율적으로 병합할 수 있습니다.</p>
<p>배열의 뒤부터 비교해가며 넣어줍니다.</p>
<p><code>p1</code> 또는 <code>p2</code> 가 <code>0</code> 이 되고 나면 나머지 하나가 <code>0</code> 이 될때까지 배열을 채워야 합니다.</p>
<p><code>p1</code> 은 이미 배열에 채워져 있기 때문에 <code>p2</code> 가 <code>0</code> 이 될 때까지만 값을 넣어주면 됩니다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[LeetCode] Duplicate Zeros]]></title>
            <link>https://velog.io/@www_j/LeetCode-Duplicate-Zeros</link>
            <guid>https://velog.io/@www_j/LeetCode-Duplicate-Zeros</guid>
            <pubDate>Wed, 14 Aug 2024 02:59:44 GMT</pubDate>
            <description><![CDATA[<p>Given a fixed-length integer array arr, duplicate each occurrence of zero, shifting the remaining elements to the right.</p>
<p>Note that elements beyond the length of the original array are not written. Do the above modifications to the input array in place and do not return anything.</p>
<h4 id="example-1">Example 1:</h4>
<blockquote>
<p>Input: arr = [1,0,2,3,0,4,5,0]
Output: [1,0,0,2,3,0,0,4]
Explanation: After calling your function, the input array is modified to: [1,0,0,2,3,0,0,4]</p>
</blockquote>
<hr>
<h4 id="example-2">Example 2:</h4>
<blockquote>
<p>Input: arr = [1,2,3]
Output: [1,2,3]
Explanation: After calling your function, the input array is modified to: [1,2,3]</p>
</blockquote>
<hr>
<h4 id="constraints">Constraints:</h4>
<blockquote>
<p>1 &lt;= arr.length &lt;= 104
0 &lt;= arr[i] &lt;= 9</p>
</blockquote>
<hr>
<h4 id="✍풀이">✍풀이</h4>
<pre><code class="language-java">class Solution {
    public void duplicateZeros(int[] arr) {
        for(int i = 0; i &lt; arr.length; i++){
            if(arr[i] == 0){
            // 0을 발견하면
            // 배열의 끝에서부터 현재 위치까지 요소를 오른쪽으로 한 칸씩 이동
                for(int j = arr.length - 1; j &gt; i; j--){
                    arr[j] = arr[j - 1];
                }
                i++; // 복제된 0을 건너뛰기 위해 인덱스를 증가
            }
        }
    }
}
}</code></pre>
<p><strong>작동 방식</strong></p>
<ul>
<li><p>0의 발견: 배열을 처음부터 끝까지 순회하며 0을 찾습니다.</p>
</li>
<li><p>배열 요소 이동: 0을 발견하면, 배열의 끝에서부터 현재 위치까지 모든 요소를 오른쪽으로 한 칸씩 이동합니다. 이는 복제된 0을 추가하기 위한 공간을 만듭니다.</p>
</li>
<li><p>0 복제: 0을 복제한 후, 다음 0을 건너뛰기 위해 인덱스 i를 한 칸 더 증가시킵니다.</p>
</li>
</ul>
<p>** 코드의 문제점 및 개선 가능성 **
이 방법은 간단하지만, 중복 0을 처리할 때마다 배열 요소를 모두 한 칸씩 이동해야 하므로, 최악의 경우 시간 복잡도는 O(N^2)입니다. 배열의 크기가 크면 비효율적일 수 있습니다.</p>
<hr>
<p>더 효율적인 방법은 두 번의 패스를 사용하는 것입니다. 첫 번째 패스에서는 배열을 순회하며 복제된 0이 포함된 배열의 크기를 계산하고, 두 번째 패스에서는 실제로 0을 복제하며 배열을 뒤에서부터 채워나갑니다. 이를 통해 시간 복잡도를 O(N)으로 줄일 수 있습니다.</p>
<pre><code class="language-java">class Solution {
    public void duplicateZeros(int[] arr) {
        int zeros = 0;
        int length = arr.length - 1;

        // 첫 번째 패스: 복제될 0이 포함된 배열의 크기 계산
        for(int i = 0; i &lt;= length - zeros; i++) { 
            if(arr[i] == 0) {
                // 끝에서 0을 복제하는 경우를 고려하여 크기 조정
                if(i == length - zeros) {
                    arr[length] = 0;    // 마지막 위치에 0을 복제
                    length--;           // 배열의 크기를 하나 줄임
                    break;              // 0의 개수 추가 되는 것 방지
                }
                zeros++;    //0의 개수 증가
            }
        }

        // 두 번째 패스: 뒤에서부터 배열 채우기
        for(int j = length - zeros; j &gt;= 0; j--){
            if(arr[j] == 0){
                arr[j + zeros] = 0; // 첫 번째 0 복제
                zeros--;
                arr[j + zeros] = 0; // 두 번째 0 복제
            }else{
                arr[j + zeros] = arr[j];    // 일반 요소 이동
            }
        }
    }
}</code></pre>
<p><strong>작동 방식</strong></p>
<ul>
<li><p>첫 번째 패스 (0의 개수 계산):
배열을 처음부터 순회하며, 배열 내에서 0이 등장하는 횟수를 세어 zeros 변수에 저장합니다.
만약 배열의 끝에 0이 있을 경우, 이를 복제할 공간이 있는지 확인하고, 마지막 위치에 0을 추가하고 종료합니다.</p>
</li>
<li><p>두 번째 패스 (배열 재구성):
배열을 뒤에서부터 순회하며, 현재 요소가 0인 경우, 0을 두 번 복제하고, 그렇지 않은 경우에는 해당 요소를 그대로 이동시킵니다.
이 과정을 통해 배열 내에서 0이 복제되며, 복제된 결과는 배열 내에서 적절하게 반영됩니다.</p>
</li>
<li><p>이 개선된 접근 방법은 배열을 한 번만 이동시키기 때문에 훨씬 효율적입니다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[LeetCode] Squares of a Sorted Array]]></title>
            <link>https://velog.io/@www_j/LeetCode-Squares-of-a-Sorted-Array</link>
            <guid>https://velog.io/@www_j/LeetCode-Squares-of-a-Sorted-Array</guid>
            <pubDate>Thu, 08 Aug 2024 15:49:01 GMT</pubDate>
            <description><![CDATA[<p>Given an integer array nums sorted in non-decreasing order, return an array of the squares of each number sorted in non-decreasing order.</p>
<h4 id="example-1">Example 1:</h4>
<blockquote>
<p>Input: nums = [-4,-1,0,3,10]
Output: [0,1,9,16,100]
Explanation: After squaring, the array becomes [16,1,0,9,100].
After sorting, it becomes [0,1,9,16,100].</p>
</blockquote>
<hr>
<h4 id="example-2">Example 2:</h4>
<blockquote>
<p>Input: nums = [-7,-3,2,3,11]
Output: [4,9,9,49,121]</p>
</blockquote>
<hr>
<h4 id="constraints">Constraints:</h4>
<blockquote>
<p>1 &lt;= nums.length &lt;= 104
-104 &lt;= nums[i] &lt;= 104
nums is sorted in non-decreasing order.</p>
</blockquote>
<p>Follow up: Squaring each element and sorting the new array is very trivial, could you find an O(n) solution using a different approach?</p>
<hr>
<h4 id="✍풀이">✍풀이</h4>
<pre><code class="language-java">import java.util.Arrays;
class Solution {
    public int[] sortedSquares(int[] nums) {

        int[] result = new int[nums.length];
        for(int i = 0; i &lt; nums.length; i++){
            nums[i] *= nums[i];
            result[i] = nums[i];
        }
        Arrays.sort(result);
        return result;
    }
}</code></pre>
<hr>
<pre><code class="language-java">class Solution {
    public int[] sortedSquares(int[] nums) {

        //결과를 저장할 배열 생성
        int[] res = new int[nums.length];

        // 두 포인터 초기화
        int left = 0;
        int right = nums.length - 1;

        //4,3,2,1,0 감소하며 인덱스에 저장
        //큰 값부터 차례대로 제곱된 값을 res배열에 저장
        for(int i = nums.length - 1; i &gt;= 0; i--){
            //절대값을 비교하여 더 큰 값을 저장
            if(Math.abs(nums[left]) &gt; Math.abs(nums[right])){
                res[i] = nums[left] * nums[left];
                left++;
            }else{
                res[i] = nums[right] * nums[right];
                right--;
            }
        }
        return res;
    }
}</code></pre>
<p><strong>작동 방식</strong></p>
<ul>
<li><p>포인터 초기화: left 포인터는 배열의 시작에서, right 포인터는 배열의 끝에서 시작합니다.</p>
</li>
<li><p>제곱 값 비교: for 루프를 사용하여 배열의 끝에서부터 시작하여 채워나갑니다. nums[left]와 nums[right]의 절대값을 비교하여 더 큰 값을 제곱하여 결과 배열 res에 저장합니다.</p>
</li>
<li><p>포인터 이동: 더 큰 값을 제곱하여 저장한 후, 해당 포인터를 이동합니다 (left++ 또는 right--).</p>
</li>
<li><p>반복: 배열의 모든 요소에 대해 위 과정을 반복하여 결과 배열을 채웁니다.</p>
</li>
</ul>
<p><strong>예제</strong>
입력 배열: [-4, -1, 0, 3, 10]</p>
<p>left = 0, right = 4
비교: |nums[0]| = 4, |nums[4]| = 10
nums[4]가 더 크므로 res[4] = 10 * 10 = 100, right--</p>
<p>left = 0, right = 3
비교: |nums[0]| = 4, |nums[3]| = 3
nums[0]가 더 크므로 res[3] = 4 * 4 = 16, left++</p>
<p>left = 1, right = 3
비교: |nums[1]| = 1, |nums[3]| = 3
nums[3]가 더 크므로 res[2] = 3 * 3 = 9, right--</p>
<p>left = 1, right = 2
비교: |nums[1]| = 1, |nums[2]| = 0
nums[1]가 더 크므로 res[1] = 1 * 1 = 1, left++</p>
<p>left = 2, right = 2
비교: |nums[2]| = 0, |nums[2]| = 0
nums[2]가 같으므로 res[0] = 0 * 0 = 0, right--</p>
<p><code>결과 배열: [0, 1, 9, 16, 100]</code></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[LeetCode] Find Numbers with Even Number of Digits]]></title>
            <link>https://velog.io/@www_j/LeetCode-Find-Numbers-with-Even-Number-of-Digits</link>
            <guid>https://velog.io/@www_j/LeetCode-Find-Numbers-with-Even-Number-of-Digits</guid>
            <pubDate>Mon, 05 Aug 2024 09:07:43 GMT</pubDate>
            <description><![CDATA[<p>Given an array nums of integers, return how many of them contain an even number of digits.</p>
<h4 id="example-1">Example 1</h4>
<blockquote>
<p>Input: nums = [12,345,2,6,7896]
Output: 2
Explanation: 
12 contains 2 digits (even number of digits). 
345 contains 3 digits (odd number of digits). 
2 contains 1 digit (odd number of digits). 
6 contains 1 digit (odd number of digits). 
7896 contains 4 digits (even number of digits). 
Therefore only 12 and 7896 contain an even number of digits.</p>
</blockquote>
<hr>
<h4 id="example-2">Example 2</h4>
<blockquote>
<p>Input: nums = [555,901,482,1771]
Output: 1 
Explanation: 
Only 1771 contains an even number of digits.</p>
</blockquote>
<hr>
<h4 id="constraints">Constraints</h4>
<blockquote>
<p>1 &lt;= nums.length &lt;= 500
1 &lt;= nums[i] &lt;= 105</p>
</blockquote>
<hr>
<p><strong>Hint</strong></p>
<blockquote>
<p>How to compute the number of digits of a number ?
Divide the number by 10 again and again to get the number of digits.</p>
</blockquote>
<hr>
<h4 id="✍풀이">✍풀이</h4>
<p><strong>1. 숫자 추출</strong></p>
<pre><code class="language-java">class Solution {
    public int findNumbers(int[] nums) {

       int result = 0;
        for(int i = 0; i &lt; nums.length; i++){
            int count = 0;

            while(nums[i] != 0){
                nums[i] = nums[i] / 10;
                count = count + 1;
            }

            if(count % 2 == 0){
                result++;
            }
        }

        return result;

    }
}</code></pre>
<p><strong>2. 문자열 변환</strong></p>
<pre><code class="language-java">class Solution {
    public int findNumbers(int[] nums) {

        int count = 0;
        for(int num : nums){
            int length = String.valueOf(num).length();

            if(length % 2 == 0){
                count++;
            }
        }
    return count;
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[LeetCode] Max Consecutive Ones]]></title>
            <link>https://velog.io/@www_j/LeetCode-Max-Consecutive-Ones</link>
            <guid>https://velog.io/@www_j/LeetCode-Max-Consecutive-Ones</guid>
            <pubDate>Mon, 05 Aug 2024 09:05:39 GMT</pubDate>
            <description><![CDATA[<h4 id="example-1">Example 1.</h4>
<blockquote>
<p>Input: nums = [1,1,0,1,1,1]
Output: 3
Explanation: The first two digits or the last three digits are consecutive 1s. The maximum number of consecutive 1s is 3.</p>
</blockquote>
<hr>
<h4 id="example-2">Example 2.</h4>
<blockquote>
<p>Input: nums = [1,0,1,1,0,1]
Output: 2</p>
</blockquote>
<hr>
<h4 id="constraints">Constraints.</h4>
<blockquote>
<p>1 &lt;= nums.length &lt;= 105
nums[i] is either 0 or 1.</p>
</blockquote>
<hr>
<h4 id="✍풀이">✍풀이</h4>
<ol>
<li><p>최대 연속의수</p>
</li>
<li><p>배열에 담겨있어 for문을 length만큼 돌린후 if문을 통해 
nums[i]가 1일 경우 count를 더해주고,아닐경우 0으로 초기화</p>
</li>
<li><p>Math.max(a, b) - a, b 중에 큰 값을 사용</p>
</li>
</ol>
<pre><code class="language-java">class Solution {
    public int findMaxConsecutiveOnes(int[] nums) {


        int count = 0;
        int max = 0;

        for(int i = 0; i &lt; nums.length; i++){

            if(nums[i] == 1){
                count++;
            }else{
                count = 0;
            }

            max = max &gt; count ? max : count;
            // System.out.println(max);

        }

        return max;
    }
}</code></pre>
<pre><code class="language-java">class Solution {
    public int findMaxConsecutiveOnes(int[] nums) {

        int count = 0;
        int max = 0;
        for(int i : nums){
            System.out.println(i);
            if(i == 1){
                count++;
            }else{
                count = 0;
            }
            max = max &gt; count ? max : count;
        }

        return  max;
    }

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