<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jisoo_log</title>
        <link>https://velog.io/</link>
        <description>Backend Developer 👩🏻‍💻</description>
        <lastBuildDate>Tue, 26 Jul 2022 10:20:16 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jisoo_log</title>
            <url>https://velog.velcdn.com/images/jisu_227/profile/14342ce1-bb4b-44cd-ae47-cd8ea70c25aa/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jisoo_log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jisu_227" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Graph]]></title>
            <link>https://velog.io/@jisu_227/Graph</link>
            <guid>https://velog.io/@jisu_227/Graph</guid>
            <pubDate>Tue, 26 Jul 2022 10:20:16 GMT</pubDate>
            <description><![CDATA[<h2 id="graph-란"><em>Graph 란?</em></h2>
<blockquote>
<p><em>자료구조의 그래프는 마치 거미줄처럼 여러 개의 점들이 선으로 이어져 있는 복잡한 네트워크망과 같은 모습을 갖는다.</em></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/jisu_227/post/e42030e2-4493-49ba-a756-b4e3cbaf6fb6/image.png" alt=""></p>
<br />
<br />
<br />

<h3 id="graph의-구조"><em>Graph의 구조</em></h3>
<ul>
<li>하나의 점을 그래프에서 정점(vertex) 이라고 하고, 하나의 선은 간선 (edge)라고 한다.</li>
</ul>
<br />
<br />

<h3 id="graph-의-표현방식"><em>Graph 의 표현방식</em></h3>
<p><img src="https://velog.velcdn.com/images/jisu_227/post/7427e153-7414-40ef-9ab7-0134db7c16a9/image.png" alt=""></p>
<p><code>인접 행렬</code> </p>
<ul>
<li><p>두 정점을 바로 이어주는 간선이 있다면 두 정점은 인접하다고 한다.</p>
</li>
<li><p>인접 행렬은 인접한 상태인지를 표시한 행렬로 2차원 배열의 형태로 나타낸다.</p>
<ul>
<li>이어져 있다면 1 (true)</li>
<li>이어져 있지 않다면 0 (false)로 표시한다.</li>
</ul>
</li>
<li><p>가중치 그래프라면 1 대신 관계에서 의미 있는 값을 저장한다. </p>
</li>
</ul>
<br />
<br />

<p><strong>인접 행렬은 언제 사용할까?</strong></p>
<ul>
<li><p>두 정점사이에 관계가 있는지 , 없는지 확인하기에 용이하다.</p>
<ul>
<li>ex ) A에서 B로 진출하는 간선이 있는지 파악하기 위해서는 0 번째 줄의 1 번째 열에 어떤 값이 저장되어 있는지 바로 확인 할 수 있다.</li>
</ul>
</li>
<li><p>가장 빠른 경로(shortest path)를 찾고자 할 때 사용</p>
</li>
</ul>
<br />
<br />
<br />

<p><code>인접 리스트</code></p>
<ul>
<li><p>인접 리스트는 각 정점이 어떤 정점과 인접하는지를 리스트의 형태로 표현한 것이다. </p>
</li>
<li><p>각 정점마다 하나의 리스트를 가지고 있으며, 이 리스트는 자신과 인접한 다른 정점을 담고 있다.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jisu_227/post/dbc015ba-e8fa-4319-9c72-5240c3b8f208/image.png" alt=""></p>
<p><strong>위는 인접리스트로 표현한 것을 나타낸 것이다. 이때 우리는 한가지 의문을 갖을 수 있다.</strong></p>
<ul>
<li><p>이 그림에서 B는 A와 C로 이어지는 간선이 2개가 있는데, 왜 A가 C보다 먼저일까? 이 순서는 중요한가?</p>
<ul>
<li>보통은 중요하지 않다. 그래프, 트리, 스택, 큐 등 모든 자료구조는 구현하는 사람의 편의와 목적에 따라 기능을 추가/삭제 할 수 있다.
그래프를 인접 리스트로 구현할 때, 정점별로 살펴봐야 할 우선 순위를 고려해 구현할 수 있는데 이때, 리스트에 담겨진 정점들을 우선 순위별로 정렬할 수 있다.<ul>
<li>우선 순위가 없다면 연결된 정점들을 단순하게 나열한 리스트가 된다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>우선 순위를 다뤄야 한다면 더 적합한 자료구조 (queue, heap)를 사용하는 것이 합리적이다.</p>
</li>
<li><p>인접 리스트는 언제 사용할까?</p>
<ul>
<li>메모리를 효율적으로 사용하고 싶을 때 인접 리스트를 사용한다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Wrapper 클래스 ]]></title>
            <link>https://velog.io/@jisu_227/Wrapper-%ED%81%B4%EB%9E%98%EC%8A%A4</link>
            <guid>https://velog.io/@jisu_227/Wrapper-%ED%81%B4%EB%9E%98%EC%8A%A4</guid>
            <pubDate>Sun, 17 Jul 2022 14:32:36 GMT</pubDate>
            <description><![CDATA[<h2 id="wrapper-클래스란--🤔">Wrapper 클래스란 ? 🤔</h2>
<blockquote>
<p>기본 타입에 해당하는 데이터를 객체로 포장해 주는 클래스를 래퍼 클래스(Wrapper class) 라고 한다.</p>
</blockquote>
<ul>
<li><p>래퍼 클래스는 각각의 타입에 해당하는 데이터를 인수로 전달받아, 해당 값을 가지는 객체로 만들어 준다.</p>
</li>
<li><p>기본 타입(byte, char, short, int, long , float, double, boolean)의 값을 갖는 객체를 포장(Wrapper) 객체라고 하는데, 기본 타입의 값을 내부에 두고 포장하기 때문이다.</p>
</li>
<li><p>래퍼 클래스는 모두 java.lang 패키지에 포함되어 제공된다.</p>
</li>
</ul>
<br />
<br />
<br />
<br />


<h3 id="wrapper-클래스를-사용하는-이유가-뭘까-❓">Wrapper 클래스를 사용하는 이유가 뭘까 ❓</h3>
<ol>
<li><p>Wrapper 클래스는 기본 데이터 타입을 Object로 변환할 수 있다. 메소드에 전달된 인수를 수정하려는 경우 오브젝트가 필요하다.</p>
<ul>
<li>기본 데이터 타입을 Object로 변환할 수 있다.</li>
</ul>
</li>
<li><p>java.util 패키지의 클래스는 객체만 처리하므로 Wrapper class 는 이 경우에도 도움이 된다.</p>
</li>
<li><p>ArrayList 등과 같은 Collection 프레임 워크의 데이터 구조는 기본 타입이 아닌 객체만 저장하게 되고 Wrapper Class를 사용하여 자동 박싱과 언박싱이 일어난다.</p>
</li>
</ol>
<ul>
<li><p>기본 타입의 값을 포장 객체로 만드는 과정 -&gt; 박싱</p>
</li>
<li><p>포장객체에서 기본타입의 값을 얻어내는 과정 -&gt; 언박싱</p>
</li>
<li><p>자동 박싱 &amp; 자동 언박싱 이란?</p>
<ul>
<li><p>기본 타입 값을 직접 박싱, 언박싱하지 않아도, 자동적으로 일어나는 경우가 있다.</p>
<ul>
<li>자동 박싱의 포장 클래스 타입에 기본값이 대입될 경우 발생한다
ex ) <pre><code>public class WrapperExample {
  public static void main(String[] args) {
      Integer num = 10; // 자동 박싱
      int n = num; // 자동 언박싱
  }
</code></pre></li>
</ul>
<p>}</p>
</li>
</ul>
</li>
</ul>
<ol start="4">
<li>멀티스레딩에서 동기화를 지원하려면 객체가 필요하다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[제네릭(Generic)]]></title>
            <link>https://velog.io/@jisu_227/%EC%A0%9C%EB%84%A4%EB%A6%ADGeneric</link>
            <guid>https://velog.io/@jisu_227/%EC%A0%9C%EB%84%A4%EB%A6%ADGeneric</guid>
            <pubDate>Thu, 14 Jul 2022 06:33:22 GMT</pubDate>
            <description><![CDATA[<h2 id="제네릭이란"><em>제네릭이란?</em></h2>
<blockquote>
<p><em>작성한 클래스 또는 메서드의 코드가 특정 데이터 타입에 얽매이지 않게 해둔 것을 의미한다.</em></p>
</blockquote>
<br />
<br />
<br />
<br />

<h3 id="제네릭-클래스-정의">제네릭 클래스 정의</h3>
<blockquote>
<p><em>제네릭이 사용된 클래스를 제네릭 클래스라고 한다.</em></p>
</blockquote>
<ul>
<li><p><code>T</code> 를 타입 매개변수라고 하며, <code>&lt;T&gt;</code> 와 같이 꺽쇠 안에 넣어 클래스 이름 옆에 작성해줌으로써 클래스 내부에서 사용할 타입 매개변수를 선언할 수 있다.</p>
</li>
<li><p>타입 매개변수는 임의의 문자로 지정할 수 있다.</p>
</li>
</ul>
<p><strong>제네릭 클래스를 정의할 때 주의할 점</strong></p>
<ul>
<li>클래스 변수에는 타입 매개변수를 사용할 수 없다.</li>
</ul>
<br />
<br />
<br />

<h3 id="제네릭-클래스-사용">제네릭 클래스 사용</h3>
<blockquote>
<p><em>제네릭 클래스는 멤버를 구성하는 코드에 특정한 타입이 지정되지 않은 클래스이므로, 제네릭 클래스를 인스턴스화할 때에는 의도하고자 하는 타입을 지정해주어야 한다.</em></p>
</blockquote>
<pre><code>Basket&lt;String&gt;  basket1 = new Basket&lt;&gt;(&quot;Hello&quot;);
Basket&lt;Integer&gt; basket2 = new Basket&lt;&gt;(10);
Basket&lt;Double&gt;  basket2 = new Basket&lt;&gt;(3.14);</code></pre><ul>
<li>단, 타입 매개변수에 치환될 타입으로 기본타입을 지정할 수 없다.<ul>
<li>ex ) int, double 과 같은 원시 타입을 지정해야 하는 맥락에서 Integer, Double 과 같은 래퍼 클래스를 활용해야한다.</li>
</ul>
</li>
</ul>
<p><strong>제한된 제네릭 클래스</strong></p>
<ul>
<li>특정 클래스를 상속받은 클래스만 타입으로 지정할 수 있도록 제한할 수 있다.</li>
</ul>
<pre><code>class Flower { ... }
class Rose extends Flower { ... }
class RosePasta { ... }

class Basket&lt;T extends Flower&gt; {
    private T item;

        ...
}

public static void main(String[] args) {

        // 인스턴스화 
        Basket&lt;Rose&gt; roseBasket = new Basket&lt;&gt;();
        Basket&lt;RosePasta&gt; rosePastaBasket = new Basket&lt;&gt;(); // 에러
}</code></pre><ul>
<li>또한 특정 인터페이스를 구현한 클래스만 타입으로 지정할 수 있도록 제한할 수도 있다.</li>
</ul>
<pre><code>interface Plant { ... }
class Flower implements Plant { ... }
class Rose extends Flower implements Plant { ... }

class Basket&lt;T extends Plant&gt; {
    private T item;

        ...
}

public static void main(String[] args) {

        // 인스턴스화 
        Basket&lt;Flower&gt; flowerBasket = new Basket&lt;&gt;();
        Basket&lt;Rose&gt; roseBasket = new Basket&lt;&gt;();
}</code></pre><br />
<br />
<br />
<br />

<h3 id="제네릭-메서드"><em>제네릭 메서드</em></h3>
<blockquote>
<p><em>클래스 전체를 제네릭으로 선언할 수도 있지만, 클래스 내부의 특정 메서드만 제네릭으로 선언할 수 있다.</em></p>
</blockquote>
<ul>
<li>제네릭 메서드의 타입 매개변수 선언은 반환타입 앞에서 이루어지며, 해당 메서드 내에서만 선언한 타입 매개변수를 사용할 수 있다.</li>
</ul>
<pre><code>class Basket {
        ...
        public &lt;T&gt; void add(T element) {
                ...
        }
}</code></pre><ul>
<li><p>제네릭 메서드의 타입 매개변수는 제네릭 클래스의 타입 매개변수와 별개의 것이다. </p>
</li>
<li><p>아래와 같이 동일하게 <code>T</code>라는 타입 매개변수명을 사용한다 하더라도, 같은 알파벳 문자를 이름으로 사용하는 것일뿐, 서로 다른 타입 매개변수로 간주된다.</p>
</li>
</ul>
<pre><code>class Basket&lt;T&gt; {                        // 1 : 여기에서 선언한 타입 매개변수 T와 
        ...
        public &lt;T&gt; void add(T element) { // 2 : 여기에서 선언한 타입 매개변수 T는 서로 다른 것입니다.
                ...
        }
}</code></pre><ul>
<li><p>클래스명 앞에서 선언한 타입 매개변수는 클래스가 인스턴스화 될 때 타입이 지정되지만</p>
</li>
<li><p>제네릭 메서드 타입 지정은 메서드가 호출될 될 때 이루어진다.</p>
</li>
<li><p>또한 클래스 타입 매개변수와 달리 메서드 타입의 매개변수는 <code>static</code> 메서드에서도 선언하여 사용할 수 있다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[인터페이스 ]]></title>
            <link>https://velog.io/@jisu_227/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4</link>
            <guid>https://velog.io/@jisu_227/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4</guid>
            <pubDate>Wed, 13 Jul 2022 02:24:44 GMT</pubDate>
            <description><![CDATA[<h2 id="인터페이스란-🧐"><em>인터페이스란? 🧐</em></h2>
<blockquote>
<p><em>일종의 추상클래스로이며, 추상클래스처럼 완성되지 않은 불완전한 것이기 때문에 그 자체만으로 사용되기보다는 다른 클래스를 작성하는데 도움 줄 목적으로 작성된다.</em></p>
</blockquote>
<ul>
<li><p>추상 클래스처럼 자바에서 추상화를 구현하는 데 활용된다는 점에서 동일하지만, 추상 클래스에 비해 더 높은 추상성을 가진다.</p>
</li>
<li><p>기본적으로 추상 메서드와 상수만을 멤버로 가질 수 있다.</p>
<ul>
<li>인터페이스 추상메서드의 집합으로 이뤄져있다.</li>
</ul>
</li>
<li><p>여러 하위 클래스가 동일한 구현으로 로직을 수행하면서, 그 중 일부 로직의 구현이 다를 때 추상 클래스를 고민한다.</p>
<ul>
<li>여러 하위 타입이 존재하는 경우 가능하면 최상위 타입은 인터페이스로 만드는것을 선호한다.</li>
</ul>
</li>
</ul>
<br />
<br />
<br />

<br />

<h3 id="인터페이스의-기본-구조--구현">인터페이스의 기본 구조 &amp; 구현</h3>
<br />

<pre><code>public interface InterfaceEx {
    public static final int rock =  1; // 인터페이스 인스턴스 변수 정의
    final int scissors = 2; // public static 생략
    static int paper = 3; // public &amp; final 생략

    public abstract String getPlayingNum();
        void call() //public abstract 생략 
}

class 클래스명 implements 인터페이스명 {
    ... // 인터페이스에 정의된 모든 추상메서드 구현
}</code></pre><ul>
<li><p><code>class</code> 키워드 대신 <code>interface</code> 키워드를 사용한다.</p>
</li>
<li><p>내부의 모든 필드가 <code>public static final</code> 로 정의 되고 static과 default 메서드 이외의 모든 메서드가 <code>public abstract</code> 로 정의 된다.(일부분 또는 전부 생략이 가능하다.)</p>
</li>
<li><p>인터페이스를 구현할 경우 <code>implements</code> 키워드를 사용한다.</p>
</li>
<li><p>인터페이스를 구현한다는 것은 그 인터페이스가 가진 모든 추상 메서드들을 해당 클래스 내에서 오버라이딩하여 바디를 완성한다.</p>
</li>
<li><p>인터페이스는 다중 구현이 가능하다.</p>
</li>
</ul>
<br />
<br />
<br />
<br />
<br />


<h3 id="인터페이스의-장점">인터페이스의 장점</h3>
<p><img src="https://velog.velcdn.com/images/jisu_227/post/af0fe0b4-65e8-4f88-a8ff-d2ee0fb43716/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jisu_227/post/e959e7ba-5244-4d02-8c7a-39a5b54b784c/image.png" alt=""></p>
<ul>
<li><p>일반적인 인터페이스의 기능처럼 역할과 구현을 분리시켜 사용자 입장에서 복잡한 구현의 내용 또는 변경과 상관없이 해당 기능을 사용할 수 있다.</p>
<ul>
<li>기능이 가지는 역활과 구현을 분리시켜 사용자로 하여금 복잡한 기능의 구현이나 교체/변경을 신경쓰지 않고도 코드 변경의 번거로움을 최소화하고 손쉽게 해당 기능을 사용할 수 있도록 한다.</li>
</ul>
</li>
<li><p>기능을 구현하는 개발자의 입장에서도 선언과 구현을 분리시켜 개발시간을 단추하고, 독립적인 프로그래밍을 통해 한 클래스의 변경이 다른 클래스에 미치는 영향을 최소화 할 수 있다는 장점이 있다.</p>
</li>
</ul>
<br />

<p><strong>사용 전</strong></p>
<pre><code>public class InterfaceExample {
    public static void main(String[] args) {
        User user = new User(); // User 클래스 객체 생성
        user.callProvider(new Provider()); // Provider객체 생성 후에 매개변수로 전달
    }
}

class User { // User 클래스
    public void callProvider(Provider provider) { // Provider 객체를 매개변수로 받는 callProvider 메서드
        provider.call();                        // Provider2를 매개변수로 바꿔주고 싶을 경우 Provider 로 바꿔주어야한다.
    }
}


class Provider { //Provider 클래스
    public void call() {
        System.out.println(&quot;무야호~&quot;);
    }
}

class Provider2 { //Provider 클래스
    public void call() {
        System.out.println(&quot;야호~&quot;);
    }
}

// 출력값
야호~</code></pre><ul>
<li>Provider 클래스에 의존하고 있기 때문에 Provider2를 의존하고 싶을 경우 User 클래스의 코드 변경이 불가피하다.</li>
</ul>
<br />
<br />




<p>*<em>사용 후 *</em></p>
<pre><code>interface Cover { // 인터페이스 정의
    public abstract void call();
}

public class Interface4 {
    public static void main(String[] args) {
        User2 user2 = new User2();
//        Provider provider = new Provider();
//        user.callProvider(new Provider());
        user.callProvider(new Provider2());
    }
}

class User {
    public void callProvider(Cover cover) { // 매개변수의 다형성 활용
        cover.call();
    }
}

class Provider implements Cover {
    public void call() {
        System.out.println(&quot;무야호~&quot;);
    }
}

class Provider2 implements Cover {
    public void call() {
        System.out.println(&quot;야호~&quot;);
    }
}

//출력값
야호~</code></pre><ul>
<li><p><code>User</code> 클래스에서는 매개변수의 다형성을 활용하여 구체적인 구현체가 아닌 인터페이스를 매개변수로 받도록 정의하였다.</p>
<ul>
<li>이에따라 이제 <code>Provider</code> 클래스의 내용 변경 또는 교체가 발생하더라도 <code>User</code> 클래스는 더이상 코드를 변경해주지 않아도 같은 결과를 출력해낼 수 있다.</li>
</ul>
</li>
<li><p>인터페이스를 사용하여 역할과 구현을 분리시켜 주면 코드를 일일이 변경해주어야 할 필요도 없어진다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[추상화]]></title>
            <link>https://velog.io/@jisu_227/%EC%B6%94%EC%83%81%ED%99%94</link>
            <guid>https://velog.io/@jisu_227/%EC%B6%94%EC%83%81%ED%99%94</guid>
            <pubDate>Wed, 13 Jul 2022 00:35:01 GMT</pubDate>
            <description><![CDATA[<h2 id="추상화란-🤔"><em>추상화란 ?🤔</em></h2>
<blockquote>
<p>_기존 클래스들의 공통적인 요소들을 뽑아서 상위 클래스를 만들어 내는 것 _</p>
</blockquote>
<ul>
<li>상속은 하위클래스를 정의하는데 상위 클래스를 사용하는 것.</li>
<li>공통적인 속성과 기능을 모아서 정의해주면 코드의 중복을 줄일 수 있고, 보다 효과적으로 클래스 간의 관계를 설정할 수 있으며, 유지/보수가 용이해진다.</li>
<li>주로 <strong>추상 클래스</strong>와 <strong>인터페이스</strong> 라는 문법 요소를 사용해서 추상화를 구현한다.</li>
</ul>
<br />
<br />
<br />


<h3 id="abstract-제어자">abstract 제어자</h3>
<blockquote>
<p><em>메서드 앞에 붙은 경우 &#39;추상 메서드 (abstract method)&#39;, 
클래스 앞에 붙은 경우를 &#39;추상 클래스(abstract method)&#39;라 부른다.</em></p>
</blockquote>
<ul>
<li>어떤 클래스에 추상 메서드가 포함되어 있는 경우 해당 클래스는 자동으로 추상 클래스가 된다.</li>
</ul>
<pre><code>abstract class AbstractExample {
    abstract void start(); // 메서드 바디가 없는 추상 메서드
}</code></pre><ul>
<li><code>abstract</code> 키워드는 &#39;추상적인&#39;, &#39;미완성&#39; 을 의미한다.</li>
</ul>
<br />
<br />
<br />


<h3 id="추상-클래스">추상 클래스</h3>
<blockquote>
<p><em>메서드 시그니처만 존재하고 바디가 선언되어있지 않은 추상 메서드를 포함하는 미완성 설계도이다 .</em></p>
</blockquote>
<ul>
<li><p>미완성된 구조를 가지고 있어 이를 기반으로 <strong>객체를 생성하는 것이 불가능</strong></p>
</li>
<li><p>추상 클래스는 상속 관계에 있어 새로운 클래스를 작성하는데 매우 유용하다. </p>
<ul>
<li>메서드의 내용이 상속을 받는 클래스에 따라서 종종 달라지기 때문에 상위 클래스에서는 선언부만을 작성하고, 실제 구체적인 내용은 상속을 받는 하위 클래스에서 구현하도록 비워둔다면 설계하는 상황이 변하더라도 보다 유연하게 대응할 수 있다.<ul>
<li>이 때 우리가 사용하게 되는 것이 &#39;오버라이딩&#39; 이다.</li>
<li>오버라이딩을 통해 각각 상황에 맞는 메서드 구현이 가능하다.</li>
</ul>
</li>
</ul>
</li>
<li><p>추상화는 상속 계층도의 상층부에 위치할 수록 추상화의 정도가 높고 그 아래로 내려갈수록 구체화 된다.</p>
<ul>
<li>상층부에 가까울수록 더 공통적인 속성과 기능들의 정의 </li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[캡슐화]]></title>
            <link>https://velog.io/@jisu_227/%EC%BA%A1%EC%8A%90%ED%99%94</link>
            <guid>https://velog.io/@jisu_227/%EC%BA%A1%EC%8A%90%ED%99%94</guid>
            <pubDate>Tue, 12 Jul 2022 01:39:05 GMT</pubDate>
            <description><![CDATA[<h2 id="캡슐화란--💊">캡슐화란 ? 💊</h2>
<blockquote>
<p><em>특정 객체 안에 관련된 속성과 기능을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것을 말한다.</em></p>
</blockquote>
<br />
<br />

<h3 id="캡슐화를-해야하는-이유">캡슐화를 해야하는 이유</h3>
<ul>
<li>데이터 보호의 목적 </li>
<li>내부적으로만 사용되는 데이터에 대한 불필요한 외부 노출을 방지하기 위함<ul>
<li>캡슐화의 가장 큰 장점은** 정보 은닉(data hiding)** 이다.</li>
<li>외부로부터 객체의 속성과 기능이 함부로 변경되지 못하게 막고, 데이터가 변경되더라도 다른 객체에 영향을 주지 않기에 독립성을 확보할 수 있다.</li>
</ul>
</li>
</ul>
<br />
<br />

<h3 id="접근-제어자-access-modifier">접근 제어자 (Access Modifier)</h3>
<ul>
<li>캡슐화를 구현하기 위한 핵심적인 방법으로 접근 제어자가 사용된다.</li>
<li>접근 제어자를 사용하면 클래스 외부로의 불필요한 데이터 노출을 방지(data hiding) 할 수 있다.</li>
<li>외부로부터 데이터가 임의로 변경되지 않도록 막을 수 있다.
<img src="https://velog.velcdn.com/images/jisu_227/post/e81e40a0-b8ba-4adc-9850-3d64b766da7b/image.png" alt=""></li>
</ul>
<br />
<br />


<h3 id="getter와-setter-메서드">getter와 setter 메서드</h3>
<blockquote>
<p><em>getter 와 setter 메서드를 사용하여 private 접근제어자가 포함되어 있는 객체의 변수의 데이터 값을 추가하거나 수정할 수 있다.</em></p>
</blockquote>
<ul>
<li>setter 메서드의 경우 외부에서 메서드에 접근하여 조건에 맞을 경우 데이터 값을 변경 가능하게 해준다.</li>
<li>getter의 메서드의 경우 설정한 변수 값을 읽어오는데 사용된다.</li>
<li>setter 와 getter를 활용하여 데이터를 효과적으로 보호하면서도 의도하는 값으로 값을 변경하여 캡슐화를 보다 효과적으로 달성할 수 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Object 클래스 ]]></title>
            <link>https://velog.io/@jisu_227/Object-%ED%81%B4%EB%9E%98%EC%8A%A4</link>
            <guid>https://velog.io/@jisu_227/Object-%ED%81%B4%EB%9E%98%EC%8A%A4</guid>
            <pubDate>Mon, 11 Jul 2022 11:07:09 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><em>Object 클래스는 자바의 클래스 상속계층도에서 최상위에 위치한 상위클래스이다.</em></p>
</blockquote>
<ul>
<li><p>자바의 모든 클래스는 Object 클래스로부터 확장된다.</p>
</li>
<li><p>실제로 자바 컴파일러는 컴파일링 과정에서 다른 클래스로부터 아무런 상속을 받지 않는 클래스에 자동적으로 <code>extends Object</code> 를 추가하여 <code>Object</code> 클래스를 상속받도록 한다.</p>
</li>
</ul>
<br />
<br />
<br />

<h3 id="object-클래스의-대표적인-메서드">Object 클래스의 대표적인 메서드</h3>
<p><img src="https://velog.velcdn.com/images/jisu_227/post/76e393b4-a84c-4a26-9790-c34b3754773d/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[상속 (Inheritance)]]></title>
            <link>https://velog.io/@jisu_227/%EC%83%81%EC%86%8D-Inheritance</link>
            <guid>https://velog.io/@jisu_227/%EC%83%81%EC%86%8D-Inheritance</guid>
            <pubDate>Mon, 11 Jul 2022 08:49:47 GMT</pubDate>
            <description><![CDATA[<h2 id="상속이란--👑"><em>상속이란 ? 👑</em></h2>
<blockquote>
<p><em>기존의 클래스를 재사용하여 새로운 클래스를 작성하는 자바의 문법 요소를 의미</em></p>
</blockquote>
<ul>
<li><p>상위 클래스와 하위 클래스로 나누어 상위 클래스의 멤버(필드, 메서드, 이너 클래스)를 하위 클래스와 공유하는 것을 의미한다.</p>
</li>
<li><p>하위 클래스는 상위 클래스가 가진 모든 멤버를 상속받는다.</p>
</li>
<li><p>하위 클래스의 멤버 개수는 언제나 상위 클래스보다 같거나 많다.</p>
</li>
<li><p>두 클래스 간 상속 관계를 설정할 때는 <code>extends</code> 키워드를 사용한다.</p>
</li>
<li><p>자바에서는 단일 상속(single ingeritance) 만을 허용한다.</p>
</li>
<li><p>인터페이스(interface)라는 문법 요소를 통해 다중 상속과 비슷한 효과를 낼 수 있는 방법이 존재한다.</p>
</li>
</ul>
<br />
<br />

<h3 id="상속-사용-시-장점">상속 사용 시 장점</h3>
<ul>
<li><p>코드를 재사용하여 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있어 코드의 중복을 제거 할 수 있다.</p>
</li>
<li><p>상속은 다형적 표현이 가능하다.</p>
</li>
</ul>
<br />
<br />

<p>*<em>상속예제
*</em></p>
<pre><code>public class Person {
    String name;
    int age;

    void learn() {
        System.out.println(&quot;공부를 합니다.&quot;);
    }

    void eat() {
        System.out.println(&quot;밥을 먹습니다.&quot;);
    }
}

class Programmer extends Person { // Person 클래스로 부터 상속. extends 키워드 사용
    String companyName;

    void coding() {
        System.out.println(&quot;코딩을 합니다.&quot;);
    }
}


class HelloJava {
    public static void main(String[] args) {
        //Person 객체 생성
        Person p = new Person();
        p.name = &quot;김코딩&quot;;
        p.age = 24;
        p.learn();
        p.eat();
        System.out.println(p.name);

        // Programer 객체 생성
        Programmer pg = new Programmer();
        pg.name = &quot;박해커&quot;;
        pg.age = 26;
        pg.learn(); // Persons 클래스에서 상속받아 사용가능
        pg.coding(); // Programmer의 개별 기능
        System.out.println(pg.name);
    }
}

// 출력
공부를 합니다.
밥을 먹습니다.
김코딩
공부를 합니다.
코딩을 합니다.
박해커 
</code></pre><br />
<br />
<br />
  <br />



<h3 id="포함관계-💡">포함관계 💡</h3>
<blockquote>
<p><em>포함(composite)은 상속처럼 클래스를 재사용할 수 있는 방법으로, 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는 것을 의미한다.</em> </p>
</blockquote>
<br />

<h4 id="포함관계-예시">포함관계 예시</h4>
<pre><code>class Employee {
    int id;
    String name;
    Address address;

    public Employee(int id, String name, Address address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    void showInfo() {
        System.out.println(id + &quot; &quot; + name);
        System.out.println(address.city + &quot; &quot; + address.country);
    }

    public static void main(String[] args) {
        Address address1 = new Address(&quot;서울&quot;, &quot;한국&quot;);
        Address address2 = new Address(&quot;도쿄&quot;, &quot;일본&quot;);

        Employee e = new Employee(1, &quot;김지수&quot; , address1);
        Employee e2 = new Employee(2, &quot;박해커&quot;, address2);

        e.showInfo();
        e2.showInfo();

    }
}

class Address {
    String city;
    String country;

    public Address(String city, String country) {
        this.city = city;
        this.country = country;
    }

}
// 출력

1 김지수
서울 한국
2 박해커
도쿄 일본
</code></pre><br /> 

<ul>
<li><p>원래라면 Address 클래스에 포함되어 있는 인스턴스 변수 city와 country 를 각각 Employee 클래스의 변수로 정의해주어야 하지만, Address 클래스로 해당 변수들을 묶어준다음 Employee 클래스 안에 참조변수를 선언하는 방법으로 코드의 중복을 없애고 포함관계로 재사용하고 있다.</p>
</li>
<li><p>클래스 간의 관계를 설정하는데 있어서 상속관계를 맺어 줄 것인지 포함 관계를 맺어 줄 것인지 판별 기준은 </p>
<ul>
<li><p>클래스 간의 관계가 <code>~은 ~이다(IS-A)</code> 인지 <code>~은 ~을 가지고 있다(HAS-A) 관계인지</code> 문장을 만들어 생각해 보자. </p>
</li>
<li><p>예시로 예를 들어보면, <code>Employee 는 Address 이다.</code> 라는 문장은 성립하지 않지만 <code>Employee는 Address를 가지고 있다</code> 는 어색하지 않기 때문에 상속보다는 포함관계가 적합하다.</p>
</li>
</ul>
</li>
</ul>
  <br />
  <br />
  <br />


<h3 id="메서드-오버라이딩"><em>메서드 오버라이딩</em></h3>
<blockquote>
<p><em>상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것을 의미한다.</em></p>
</blockquote>
<p><strong>예시</strong></p>
<pre><code>class Vehicle {

    void run() {
        System.out.println(&quot;Vehicle is running&quot;);
    }
}

class Bike extends Vehicle {
    void run() {
        System.out.println(&quot;Bike is running&quot;); // 메서드 오버라이딩
    }

    public static void main(String[] args) {
        Bike bike = new Bike();
        bike.run();
    }
}

// 출력
&quot;Bike is running&quot;</code></pre><ul>
<li><p>메서드 오버라이딩을 사용할 경우 3가지 조건을 만족시켜줘야 한다.</p>
<ul>
<li>메서드 선언부 (메서드 이름, 매개변수, 반환타입)이 상위클래스의 것과 완전히 일치해야 한다.</li>
<li>접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다.</li>
<li>예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.</li>
</ul>
<br />
</li>
<li><p>오버라이딩을 사용할 경우 상위 클래스로 타입을 선언하고 각각 타입으로 객체를 생성해주면 
간편하게 배열로 선언하여 관리 할 수 있다는 편리성이 있다.</p>
</li>
</ul>
<pre><code>// 배열로 한번에 관리하기

Vehicle[] vehicles = new Vehicle[] { new Bike(), new Car(), new MotorBike()};
for (Vehicle vehicle : vehicles) {
        vehicle.run();
}

// 출력값
Bike is running
Car is running
MotorBike is running</code></pre><br />
<br />
<br />
<br />

<h3 id="super-키워드---super-"><em>super 키워드 ,  super( )</em></h3>
<blockquote>
<p><em>super 키워드는 상위 클래스의 객체 , super( ) 는 상위 클래스의 생성자를 호출 할 때 사용한다.</em></p>
</blockquote>
<br>

<p><strong>super 예제</strong></p>
<pre><code>class Super {

    public static void main(String[] args) {
        Lower l = new Lower();
        l.calNum();
    }
}

class Upper {
    int count = 20; // super.count
}

class Lower extends Upper {
    int count = 15; // this.count 

    void calNum() {
        System.out.println(&quot;count = &quot; + count);
        System.out.println(&quot;this.count = &quot; + this.count);
        System.out.println(&quot;super.count = &quot; + super.count);
    }
}

// 출력
count = 15
count = 15
count = 20</code></pre><ul>
<li>상속관계에서 서로의 인스턴스 변수의 이름이 같이 구분이 필요할 경우 그것을 구분할 방법이 바로 <code>super</code> 키워드 이다.</li>
</ul>
<br />
<br />
<br />

<p><strong>super( ) 예제</strong></p>
<pre><code>public class Test {
    public static void main(String[] args) {
        Student s = new Student();
    }
}

class Human {
    Human() {
        System.out.println(&quot;휴먼 클래스 생성자&quot;);
    }
}

class Student extends Human { 
    Student() {
        super(); // Human 클래스의 생성자 호출
        System.out.println(&quot;학생 클래스 생성자&quot;);
    }
}
</code></pre><ul>
<li>super( ) 은 생성자 안에서만 사용가능하고, 반드시 첫 줄에 와야한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[생성자 ]]></title>
            <link>https://velog.io/@jisu_227/%EC%83%9D%EC%84%B1%EC%9E%90</link>
            <guid>https://velog.io/@jisu_227/%EC%83%9D%EC%84%B1%EC%9E%90</guid>
            <pubDate>Mon, 11 Jul 2022 06:49:52 GMT</pubDate>
            <description><![CDATA[<h2 id="생성자란"><em>생성자란?</em></h2>
<blockquote>
<p>객체를 생성하는 역할을 하는 구성 요소로서, 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드라고 정의한다.</p>
</blockquote>
<ul>
<li><p>new 키워드를 사용하여 객체를 생성할 때 호출되는 것이 생성자이다.</p>
</li>
<li><p>생성자는 인스턴스 변수들을 초기화하는 데 사용되는 특수한 메서드이다.</p>
</li>
<li><p>생성자의 이름은 반드시 클래스의 이름과 같아야 한다.</p>
</li>
<li><p>생성자는 리턴 타입이 없다. 하지만 메서드에서 리턴 값이 없을 때 표시하는 void 키워드를 사용하지 않는다. </p>
</li>
<li><p>생성자는 오버로딩이 가능하므로 한 클래스 내에 여러 개의 생성자가 존재할 수 있다.</p>
</li>
</ul>
<p>cf. 메서드 오버로딩 : 하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것을 의미한다.</p>
<ul>
<li><p>오버로딩의 조건 </p>
<ul>
<li>같은 이름의 메서드명 써주기</li>
<li>매개변수의 개수 or 타입이 다르게 정의되어야 한다.</li>
</ul>
<br />
<br />

</li>
</ul>
<h3 id="this-🤯"><em>this()</em> 🤯</h3>
<blockquote>
<p><em><strong>this() *<em>를 통하여 *</em>생성자</strong>도 <strong>상호 호출</strong>이 가능하다.</em></p>
</blockquote>
<ul>
<li><code>this()</code> 메서드는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우 사용한다.</li>
<li><code>this()</code> 메서드를 사용하기 위해서는 크게 2가지 문법요소를 충족시켜야 한다.<ul>
<li>첫 째, <code>this()</code> 메서드는 반드시 생성자의 내부에서만 사용할 수 있다.</li>
<li>둘 째, <code>this()</code> 메서드는 반드시 생성자의 첫 줄에 위치해야 한다.</li>
</ul>
</li>
</ul>
<br />

<pre><code>public class Test {

    public static void main(String[] args) {
        Example example = new Example();
        Example example2 = new Example(5);
    }
}

class Example {
    public Example() {
        System.out.println(&quot;Example의 기본 생성자 호출!&quot;);
    }

    public Example(int x) {
        this();
        System.out.println(&quot;Example의 두 번째 생성자 호출!&quot;);
    }
}

// 출력 
Example의 기본생성자 호출!

Example의 기본생성자 호출!
Example의 두 번재 생성자 호출!</code></pre><br />

<h3 id="_this_🔥">_this_🔥</h3>
<blockquote>
<p>_인스턴스 변수와 매개변수를 이름만으로는 구분하기가 어려워지는 문제가 발생하게 되는데, 이를 구분해주기 위한 용도로 주로 사용되는 방법이 this 키워드이다. _</p>
</blockquote>
<pre><code>public class ConstructorExample {

    public static void main(String[] args) {
        Car car = new Car(&quot;Model X&quot;, &quot;빨간색&quot;, 250);
        System.out.println(&quot;제 차는 &quot; + car.getModelName() + &quot;이고, 컬러는 &quot; + car.getColor() + &quot;입니다.&quot;);
    }
}

class Car {
    private String modelName;
    private String color;
    private int maxSpeed;

    public Car(String modelName, String color, int maxSpeed) {
        this.modelName = modelName;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }

    public String getModelName() {
        return modelName;
    }

    public String getColor() {
        return color;
    }
}
// 출력
제 차는 Model X이고, 컬러는 빨간색입니다.</code></pre><br />

<ul>
<li><p><code>this.modelName = modelName</code> 대신 <code>modelName = modelName</code> 라고 작성하면 둘 다 지역변수로 간주되게 된다.</p>
</li>
<li><p>모든 메서드에는 자신이 포함된 클래스의 객체를 가리키는 this 라는 참조변수가 있는데, 일반적인 경우 컴파일러가 <code>this.</code> 를 추가해주기 때문에 생략하는 경우가 많다.</p>
</li>
<li><p><code>this</code> 는 인스턴스 자기 자신을 가리키며, 우리가 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼 <code>this</code> 를 통해서 인스턴스 자신의 변수에 접근 할 수 있다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[객체의 생성과 활용]]></title>
            <link>https://velog.io/@jisu_227/%EA%B0%9D%EC%B2%B4%EC%9D%98-%EC%83%9D%EC%84%B1%EA%B3%BC-%ED%99%9C%EC%9A%A9</link>
            <guid>https://velog.io/@jisu_227/%EA%B0%9D%EC%B2%B4%EC%9D%98-%EC%83%9D%EC%84%B1%EA%B3%BC-%ED%99%9C%EC%9A%A9</guid>
            <pubDate>Mon, 11 Jul 2022 01:15:48 GMT</pubDate>
            <description><![CDATA[<h2 id="_객체-생성-시-메모리-구조-_">_객체 생성 시 메모리 구조 _</h2>
<br />

<pre><code>클래스명 참조_변수명 = new 생성자();
ex) Person p = new Person();
</code></pre><ul>
<li><p>new 키워드와 생성자를 통해 클래스의 객체를 생성한다는 것은 객체를 힙 메모리에 넣고 그 주소값을 참조변수에 저장하는 것과 같다.</p>
</li>
<li><p>클래스 <code>Person</code> 과 참조 변수 <code>p</code> 는 각각 클래스 영역과 스택 영역이라는 다른 위치에 저장된다.</p>
</li>
<li><p>생성자로 만들어진 인스턴스는 힙 메모리 영역에 들어가고 객체 내부에는 클래스의 멤버들이 위치한다.</p>
</li>
<li><p>참조변수는 객체의 실제값이 아닌 힙에 저장되어 있는 주소값을 가리키게 된다.</p>
</li>
</ul>
<br />
<br />
<br />

<h3 id="필드와field-메서드method">필드와(field) 메서드(method)</h3>
<p><img src="https://velog.velcdn.com/images/jisu_227/post/d77250ea-05f4-4791-899b-9e0516043067/image.png" alt=""></p>
<blockquote>
<p><em>자바에서 변수는 크게 클래스 변수 (cv, class variable), 인스턴스 변수(iv, instatnce varuable), 그리고 지역변수(lv, local variable) 세가지로 구분된다</em></p>
</blockquote>
<ul>
<li><p>필드라고 부르는 클래스 변수, 인스턴스 변수는 <code>static</code> 키워드의 유무로 구분된다.</p>
<ul>
<li><code>static</code> 키워드가 함께 선언된 변수는 *<em>클래스 변수 *</em></li>
<li>그렇지 않은 것은 <strong>인스턴스 변수</strong> 이다.</li>
<li>이 두 유형에 포함되지 않고 메서드 내에 포함된 모든 변수를 <strong>지역변수</strong>라고 부른다.<br />
</li>
</ul>
</li>
<li><p>인스턴스 변수(iv)는 인스턴스가 가지는 각각의 고유한 속성을 저장하기 위한 변수로 <code>new 생성자()</code> 를 통해 인스턴스가 생성될 때 만들어진다.</p>
<ul>
<li>클래스를 통해 만들어진 <strong>인스턴스</strong>는 <strong>힙 메모리</strong>의 독립적인 공간에 저장되고, 동일한 클래스로부터 생성되었지만 객체의 고유한 개별성을 가진다. </li>
</ul>
</li>
<li><p>클래스 변수(cv)는 독립적인 저장 공간을 가지는 인스턴스 변수와 다르게 공통된 저장공간을 공유한다.</p>
<ul>
<li>한 클래스로부터 생성되는 모든 인스턴스 들이 특정한 값을 공유해야하는 경우에 주로 <code>static</code> 키워드를 사용하여 클래스 변수를 선언하게 된다.</li>
</ul>
</li>
<li><p>지역변수(lv)는 메서드 내에 선언되며 메서드 내({}블록)에서만 사용가능한 변수이다.</p>
<ul>
<li>멤버 변수와 다르게 지역변수는 <code>스택 메모리</code> 에 저장되어 메서드가 종료되는 것과 동시에 함께 소멸되어 사용할 수 없게 된다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jisu_227/post/223d5054-4f31-42b1-a32d-785fcd7e5f93/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p><code>힙 메모리</code> 에 저장되는 필드 변수는 객체가 없어지지 않는 한 절대로 삭제되지 않는 반면, 스택 메모리에 저장되는 지역변수는 한동안 사용되지 않는 경우 가상 머신에 의해 자동 삭제 된다.</p>
</li>
<li><p><code>힙 메모리</code>에는 빈 공간이 저장될 수 없기 때문에 이곳에 저장되는 필드는 강제로 초기화되지만, <code>스택 메모리</code> 는 강제로 초기화되지 않으므로 <code>지역 변수</code> 는 선언시 반드시 초기화 해주어야 한다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[StringBuilder , StringBuffer]]></title>
            <link>https://velog.io/@jisu_227/StringBuilder-StringBuffer</link>
            <guid>https://velog.io/@jisu_227/StringBuilder-StringBuffer</guid>
            <pubDate>Fri, 08 Jul 2022 09:36:35 GMT</pubDate>
            <description><![CDATA[<br />


<h2 id="stringbuilder-언제-사용하면-좋을까-🤔"><em>StringBuilder 언제 사용하면 좋을까? 🤔</em></h2>
<blockquote>
<p><em>String 클래스는 여러 개의 문자열을 더할 때 매번 새로운 인스턴스를 생성해야 하는데 만들어야 하는 문자열이 많을 경우 인스턴스의 생성 또한 그만큼 이루어지기 때문에 매우 비효율적이다. 
이때, StringBuilder를 사용하면 이 문제를 해결 할 수 있다.</em></p>
</blockquote>
<ul>
<li>StringBuilder의 객체를 생성해준다. </li>
<li><code>append()</code> 의 인자로 연결하고자 하는 문자열을 넣어서 StringBuilder의 객체를 통해 호출한다.</li>
<li>문자열을 출력할 때, 변수에 문자열을 할당할 때에는 <code>toString()</code> 메서드를 사용하면 된다. </li>
</ul>
<br />
<br />
<br />


<h2 id="stringbuffer-란-🧐"><em>StringBuffer 란 🧐</em></h2>
<blockquote>
<p>String 클래스의 인스턴스는 한번 생성되면 그 값을 읽기만 할 수 있고, 변경할 수는 없다. 하지만 StringBuffer 클래스의 인스턴스는 그 값을 변경할 수도 있고, 추가할 수도 있다.</p>
</blockquote>
<ul>
<li><p>StringBuffer 클래스는 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 가진다.</p>
</li>
<li><p>버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기인데, 생성자를 통해 별도로 설정할 수 있다.(하지만 인스턴스 생성 시 사용자가 설정한 크기보다 더 저장할 수 있도록 여유 있는 크기로 생성된다.)</p>
<ul>
<li><p><code>append()</code> : 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 마지막에 추가한다. (String 클래스의 <code>concat()</code> 과 같은 결과를 반환하지만 , 내부적인 처리속도가 훨씬 빠르다.)</p>
</li>
<li><p><code>capacity()</code> : StringBuffer 인스턴스의 현재 버퍼 크기를 반환한다.</p>
<pre><code>StringBuffer str = new StringBuffer(&quot;jisoo&quot;);
System.out.println(jisoo.capacity()); 
// 이 경우 기본적으로 생성되는 여유 버퍼 크기인 16에 문자의 길이 5를 더한 총 21개의 문자를 저장할 수 있는 버퍼가 생성된다.</code></pre></li>
<li><p><code>delete()</code> : 전달된 인덱스에 해당하는 부분 문자열을 해당 문자열에서 제거한다.</p>
</li>
<li><p><code>deleteCharAt()</code> : 메서드를 사용하면 특정 위치의 문자 한 개만 제거할 수 있다.</p>
</li>
<li><p><code>insert()</code> : 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 지정된 인덱스 위치에 추가한다.</p>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바의 타입]]></title>
            <link>https://velog.io/@jisu_227/%EC%9E%90%EB%B0%94%EC%9D%98-%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@jisu_227/%EC%9E%90%EB%B0%94%EC%9D%98-%ED%83%80%EC%9E%85</guid>
            <pubDate>Tue, 05 Jul 2022 14:26:02 GMT</pubDate>
            <description><![CDATA[<h2 id="타입이란-무엇일까-🤔"><em>타입이란 무엇일까?</em> 🤔</h2>
<blockquote>
<p><em>타입은 어떤 값의 유형 및 종류를 의미하며, 타입에 따라 값이 차지하는 메모리 공간의 크기와, 값이 저장되는 방식이 결정된다.</em></p>
</blockquote>
<ul>
<li>값이 차지하는 메모리 공간의 크기<ul>
<li>ex ) 정수형 타입의 데이터는 4byte, 문자형 타입의 데이터는 1byte</li>
</ul>
</li>
<li>값이 저장되는 방식<ul>
<li>저장하고자 하는 값을 그대로 저장하는 <code>기본 타입</code></li>
<li>기본 타입은 <code>stack</code>에 실제 값을 저장<ul>
<li>정수 타입 (byte, short, int, long)</li>
<li>실수 타입 (float, double)</li>
<li>문자 타입 (char)</li>
<li>논리 타입 (boolean)</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>저장하고자 하는 값을 임의의 메모리 공간에 저장한 후, 그 메모리 공간의 주소를 저장하는 <code>참조타입</code><ul>
<li>객체의 주소를 저장, 8개의 기본형을 제외한 나머지 타입</li>
<li>참조 타입은 객체를 저장하는 것처럼 <code>Heap</code>에 실제값을 저장하고 해당 주소를 <code>stack</code>에 저장하는 방식을 사용한다.</li>
<li>cf ) String은 참조 타입에 해당한다. 실제 문자열 값을 가지고 있는 것이 아니라, 문자열이 존재하는 메모리 공간 상의 주소값을 가지고 있다. <ul>
<li>하지만 문자열을 출력해보면 <strong>주소값이 아닌 문자열의 내용이 출력</strong>된다.</li>
<li>이유는 String 타입의 변수를 참조하면 String 클래스의 메서드인 <code>toString()</code> 이 자동으로 호출되어 String 타입의 변수가 저장하고 있는 주소값에 위치한 String 인스턴스의 내용을 문자열로 변환해주기 때문이다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<br />
<br />
<br />

<h3 id="_reference-type-참조타입-_">_Reference type (참조타입) _</h3>
<blockquote>
<p><em>참조타입은 클래스 타입 또는 사용자 정의형 타입으로도 불리며 객체 연결을 위해 사용된다.</em></p>
</blockquote>
<pre><code>Car car = new Car(&quot;jisoo&quot;, red);</code></pre><ul>
<li>맨 처음 Car는 클래스 타입, 레퍼런스 타입이다.</li>
<li>소문자 c로 시작하는 car는 레퍼런스 변수명이다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SSH ]]></title>
            <link>https://velog.io/@jisu_227/SSH</link>
            <guid>https://velog.io/@jisu_227/SSH</guid>
            <pubDate>Fri, 01 Jul 2022 01:14:35 GMT</pubDate>
            <description><![CDATA[<h2 id="ssh이란-🤔"><em>SSH이란? 🤔</em></h2>
<blockquote>
<p><em>ssh는 Secure shell의 줄임말(Secure SHell)로, 보안이 강화된 shell 접속을 뜻한다.</em></p>
</blockquote>
<h3 id="언제-사용할까"><em>언제 사용할까</em>?</h3>
<ul>
<li>CLI환경(터미널)에서 다른 PC에 접속하거나 요청할 때 사용하며, 비대칭키를 이용해 사용자를 인증한다.</li>
</ul>
<h3 id="ssh-키-생성">SSH 키 생성</h3>
<pre><code>ssh-keygen  # ssh 키 페어(쌍) 생성</code></pre><ul>
<li>ssh 키는 비대칭키로 구성되며, 이름에서 유추할 수 있듯이 두 개의 키가 서로 대칭이 되지 않는 형태로 존재한다.</li>
<li><code>ssh-keygen</code> 명령어는 <code>id_rsa</code> 와 <code>id_rsa.pub</code> 를 생성한다.<ul>
<li><code>id_rsa.pub</code> 는 누구에게나 공개해도 되는 공개키(Public Key)라고 한다.</li>
<li><code>id_rsa</code> 는 공개되면 안 되고 나만 보관하고 있어야 하는 키라고 하여 개인키(Private key) 또는 비밀키(Secret Key) 라고 한다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[권한과 경로 그리고 환경변수 ]]></title>
            <link>https://velog.io/@jisu_227/%EA%B4%80%EB%A6%AC%EC%9E%90-%EA%B6%8C%ED%95%9C%EA%B3%BC-%EA%B2%BD%EB%A1%9C</link>
            <guid>https://velog.io/@jisu_227/%EA%B4%80%EB%A6%AC%EC%9E%90-%EA%B6%8C%ED%95%9C%EA%B3%BC-%EA%B2%BD%EB%A1%9C</guid>
            <pubDate>Thu, 30 Jun 2022 14:28:44 GMT</pubDate>
            <description><![CDATA[<h2 id="절대-경로와-상대-경로-🤔">절대 경로와 상대 경로 🤔</h2>
<blockquote>
<p><em>경로는 명령어 pwd로 확인할 수 있는 절대 경로와, 현재 위치로부터 상대적인 위치를 나타내는 상대 경로로 나뉜다.</em></p>
</blockquote>
<h3 id="절대-경로">절대 경로</h3>
<ul>
<li>절대 경로는 기준점으로부터의 절대적인 위치를 나타내는데, 그 기준점을 루트폴더(/)라고 한다.</li>
<li>특정 폴더나 파일이 루트 폴더로부터 어떤 폴더로 진입하는 경우 만날 수 있는지를 나타낸다.<ul>
<li>ex ) /Users/jisu/helloWorld/hello/ 등 </li>
</ul>
</li>
</ul>
<h3 id="상대-경로">상대 경로</h3>
<ul>
<li>상대 경로는 특정 폴더 또는 파일의 위치를 현재 위치를 기준점으로 나타낸다.</li>
<li>현재 위치한 폴더는 점(.)으로 표현하고, 상위 폴더는 두개의 점(..)으로 표현한다.</li>
</ul>
<pre><code> cd ./hi #현재 폴더 아래의 hi 폴더로 진입하는 명령</code></pre><h2 id="관리자root-권한-🧐">관리자(root) 권한 🧐</h2>
<blockquote>
<p><em>절대 경로의 기준점인 루트폴더(/)는 Linux의 관리자 영역이다. 일반 사용자의 권한으로는 어떤 폴더나 파일도 생성, 변경, 삭제 할 수 없다.</em></p>
</blockquote>
<h3 id="사용자가-관리자-권한이-필요할-땐">사용자가 관리자 권한이 필요할 땐?!</h3>
<ul>
<li>sudo : 관리자 권한을 획득하는 명령어 <ul>
<li>명령어 sudo를 이용해 생성한 폴더의 소유자는 루트이다.
ex ) <img src="https://velog.velcdn.com/images/jisu_227/post/cf58b0b0-8870-4fd8-acf3-db729a3d1c23/image.png" alt=""></li>
</ul>
</li>
</ul>
<h2 id="사용-권한-🥴">사용 권한 🥴</h2>
<p><img src="https://velog.velcdn.com/images/jisu_227/post/9a4ed963-9dbe-4e82-a8d0-43431a4ff90e/image.png" alt=""><img src="https://velog.velcdn.com/images/jisu_227/post/ef8de537-a982-4f18-99b2-47353cf35a03/image.png" alt=""></p>
<ul>
<li><p>표현의 첫 시작인 -와 d는 각각 not directory와 directory 를 나타낸다.</p>
<ul>
<li>폴더일 경우 d 로 파일일 경우 - 로 나타낸다.</li>
</ul>
</li>
<li><p>이어지는 r, w, x 는 각각 read permission, write permission, execute permission 으로 각각 읽기, 쓰기, 실행 권한을 나타낸다.(3번에 걸쳐 나타나는 이유는 사용자와 그룹, 나머지에 대한 권한을 표시하기 때문)</p>
<ul>
<li>ex ) 파일 hello.java의 권한은 rw-r--r--으로 <ul>
<li>소유자는 읽기와 쓰기가 가능하고, 다른 그룹은 읽기만 가능하다는 의미이다.</li>
</ul>
</li>
<li>ex ) 폴더 linux의 권한은 rwxr-xr-x 로 <ul>
<li>소유자는 읽기와 쓰기 , 실행이 가능하고, 다른 사용자 그룹은 읽기와 실행만 가능하다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="user-group-and-other-🙂">user, group, and other 🙂</h3>
<p><img src="https://velog.velcdn.com/images/jisu_227/post/660a6ed4-54b9-4a21-9527-fc68f767696e/image.png" alt=""></p>
<ul>
<li>user : 파일의 소유자, 기본적으로 파일을 만든 사람이 소유자가 된다.</li>
<li>group : group은 여러 user가 포함될 수 있다. 그룹에 속한 모든 user는 파일에 대한 동일한 group 액세스 권한을 갖는다.<ul>
<li>각 user에게 일일이 권한을 할당하는 대신에 모든 user를 의미한다.
따라서 other 권한을 설정하면, 해당 권한을 global 권한 설정이라고 볼 수 있다.</li>
</ul>
</li>
<li>other : 파일에 대한 엑세스 권한이 있는 다른 user이다. 파일을 만들지 않은 다른 모든 user를 의미한다. 따라서 other 권한을 설정하면 해당 권한을 global 권한 설정이라고 볼 수 있다.</li>
</ul>
<h3 id="chmod--권한을-변경하는-명령어-🤔">chmod : 권한을 변경하는 명령어 🤔</h3>
<blockquote>
<p><em>OS에 로그인한 사용자와, 폴더나 파일의 소유자가 같을 경우에 chmod로 폴더나 파일의 권한을 변경할 수 있다.</em></p>
</blockquote>
<ul>
<li><p>OS에 로그인한 사용자와 , 폴더나 파일의 소유자가 다를 경우 관리자 권한을 획득하는 명령어 sudo를 이용해 폴더나 파일의 권한을 변경할 수 있다.</p>
</li>
<li><p>명령어 chmod를 사용하여 권한을 변경하는 방식 </p>
<ul>
<li>첫번째 +, -, = 과 accessor 유형을 표기해서 변경하는 Symblic method 이다.</li>
<li>두번째는 rwx를 3bit로 해석하여, 숫자 3자리로 표기해서 변경하는 Absolute form이다.</li>
</ul>
</li>
</ul>
<h2 id="환경변수란--🤯">환경변수란 ? 🤯</h2>
<blockquote>
<p><em>환경에 따라 프로그램에 영향을 줄 수 있는 값들</em></p>
</blockquote>
<ul>
<li><p>운영체제와 관계없이 지역 환경변수와 전역 환경변수로 분류된다.</p>
<ul>
<li>지역 환경변수 : 환경변수를 생성한 특정 사용자만 사용할 수 있는 변수</li>
<li>전역 환경변수 : 모든 사용자가 사용할 수 있는 환경변수 </li>
</ul>
</li>
<li><p>명령어 export를 이용하면 새로운 환경변수 추가 가능</p>
</li>
<li><p>명령어 echo 를 사용하여 전역 및 지역 환경변수의 개별 값을 확인할 수 있다.</p>
<ul>
<li><p>이때 달러사인($)을 입력하는데, 이 달러사인 $ 뒤의 문자열이 환경변수라는 의미를 터미널에 전달한다.</p>
</li>
<li><p>ex ) 전역 환경변수 영구 적용하여 출력하기
<img src="https://velog.velcdn.com/images/jisu_227/post/795aff57-d585-4307-a1ad-4e4e3b03b045/image.png" alt=""></p>
<ul>
<li><code>source</code>  파일명 : 파일의 변경 내용 적용 </li>
<li><code>echo</code> : 내용 출력</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Linux]]></title>
            <link>https://velog.io/@jisu_227/Linux</link>
            <guid>https://velog.io/@jisu_227/Linux</guid>
            <pubDate>Thu, 30 Jun 2022 14:10:02 GMT</pubDate>
            <description><![CDATA[<h2 id="🧐-io">🧐 I/O</h2>
<blockquote>
<p><em>컴퓨터를 조작하기 위한 입력과 출력을 간단하게 I/O(Input/Output)라고 표기한다.</em></p>
</blockquote>
<ul>
<li>입력을 담당하는 키보드나 마우스를 입력소스(Input Source)라고 한다.</li>
<li>ex ) 키보드, 마우스 외에도 카메라나 마이크 등 컴퓨터에 새로운 명령을 전달하는 모든 소스가 입력소스이다.</li>
<li>시각적 출력을 담당하는 모니터나, 청각적 출력을 담당하는 스피커를 출력소스(Output source)라고 한다.</li>
<li>ex ) 모니터, 스피커 등</li>
</ul>
<h2 id="🧐-clicommand-line-interface">🧐 CLI(Command-Line Interface)</h2>
<blockquote>
<p><em>명령줄 인터페이스란 명령어를 사용하여 컴퓨터를 제어하는 방식을 말한다.</em></p>
</blockquote>
<ul>
<li>GUI(Graphic User Interface)란 그래픽 사용자 인터페이스 로써 우리가 컴퓨터를 사용할 때 적용되는 컴퓨터 제어 방식이다. </li>
<li>CLI는 화면에 나타날 내용에 그래픽 작업을 거치지 않아도 되기 때문에 컴퓨터의 자원을 적게 사용하며, 더 빠르게 동작한다.</li>
<li>터미널은 CLI이다.</li>
<li>키보드의 입력을 확인하고 편집할 수 있는 한줄의 공간을 프롬프트(Prompt)라고 한다.</li>
</ul>
<h3 id="🤔-cli-기본-명령어">🤔 CLI 기본 명령어</h3>
<ol>
<li>pwd : 현재 위치 확인하기 <ul>
<li>pwd를 프롬프트에 입력하고, enter를 누르면 현재 경로가 나타난다.</li>
</ul>
</li>
<li>mkdir : 새로운 폴더 생성하기 </li>
<li>ls : 특정 폴더에 포함된 파일이나 폴더 확인하기<ul>
<li>ls -l : 명령어 ls와 함께 옵셥 l을 사용하면, 가장 왼쪽에 출력되는 두 글자 d와 - 를 확인할 수 있다. <ul>
<li>여기서 d로 출력되는 경우는 디렉토리를 , -로 출력된 경우 파일을 나타낸다.<img src="https://velog.velcdn.com/images/jisu_227/post/69d37136-1f7a-4c84-b9cc-e39a56778e9a/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
</ol>
<pre><code>- ls -a(all)
- ls -al 또는 ls -la</code></pre><ol start="4">
<li>cd : 폴더에 진입하기 </li>
<li>touch : 파일 생성하기</li>
<li><strong>&gt;</strong> : 실행 결과를 파일로 저장하기</li>
<li>cat : 파일의 내용을 터미널에 출력하기 </li>
<li>rm : 폴더나 파일 삭제하기<ul>
<li>CLI에서 삭제된 파일은 즉시 삭제된다.</li>
</ul>
</li>
<li>mv : 폴더나 파일의 이름을 변경, 또는 폴더나 파일의 위치 옮기기</li>
<li>cp : 폴더나 파일을 복사하기 <ul>
<li>명령어 cp를 이용해 폴더를 복사할 대는 옵션 -r이 반드시 포함되어야 한다.</li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹 클라이언트와 웹 서버]]></title>
            <link>https://velog.io/@jisu_227/%EC%9B%B9-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EC%99%80-%EC%9B%B9-%EC%84%9C%EB%B2%84</link>
            <guid>https://velog.io/@jisu_227/%EC%9B%B9-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EC%99%80-%EC%9B%B9-%EC%84%9C%EB%B2%84</guid>
            <pubDate>Fri, 24 Jun 2022 02:41:50 GMT</pubDate>
            <description><![CDATA[<h2 id="🧐-클라이언트-서버-아키텍처">🧐 <em>클라이언트-서버 아키텍처</em></h2>
<p>우리는 쇼핑이 하고 싶을 때 스마트폰에서 쇼핑몰 앱을 실행시켜 쇼핑을 할 때가 있다.
혹시 그때 인터넷 연결없이 쇼핑몰 앱을 실행시켜 본 경험이 있었는지 떠올려 본다면, 아마도 쇼핑몰 앱은 인터넷 연결 없이는 정상적으로 동작하지 않았을 것이다.</p>
<p>그 이유는 바로 상품에 대한 정보를 인터넷 어딘가에 존재하는 <code>서버</code>로 부터 받아오기 때문이다.</p>
<p>앱 자체에 판매하려는 상품 정보가 전부 담긴 경우를 가정해보자. 하지만 앱과 연결된 서버가 존재하지 않는다면 어떤 문제가 생길까? </p>
<ul>
<li>앱을 사용하는 사람들에게 상품 정보를 실시간으로 전달하기 매우 어렵다.<ul>
<li>이 경우에는 끊임없이 앱을 업데이트 해야 한다.</li>
<li>빈번한 데이터 업데이트가 필요한 경우, 리소스가 존재하는 곳과 리소스를 사용하는 앱을 분리시키는 것이 유리하다.</li>
</ul>
</li>
<li>결제를 할 수 없다.(결제 또한 금전 정보를 주고 받는 은행 서버와
의 연결이 필요하다)</li>
</ul>
<p>위와 같은 문제를 해결하기 위하여 리소스가 존재하는 곳과 리소스를 사용하는 앱을 분리시킨 것을 <code>2-Tier 아키텍처</code> 또는 <code>클라이언트 - 서버 아키텍처</code>라고 부른다. </p>
<ul>
<li>리소스를 사용하는 앱 : 클라이언트 (client)</li>
<li>리소스를 제공(serve) 곳 : 서버 (server) </li>
</ul>
<p>클라이언트와 서버는 요청과 응답을 주고 받는 관계이다. 
클라이언트 - 서버 아키텍처에서는 요청이 선행되고 그 후 응답이 온다. </p>
<br />
<br />


<h2 id="🤔-3-tier-아키텍처">🤔 3 Tier 아키텍처</h2>
<p><img src="https://velog.velcdn.com/images/jisu_227/post/8c628ac6-db15-40be-942a-8516d243df61/image.png" alt=""></p>
<p>기존 2티어 아키텍처에 데이터 베이스가 추가된 형태를 <code>3 Tier 아키텍처</code>라고 부른다.</p>
<ul>
<li>일반적으로 서버는 리소스를 전달해주는 역할을 담당하는데 리소스를 저장하는 공간을 별도로 마련해 두는데 이 공간을 <code>데이터베이스</code>라고 부른다.</li>
</ul>
<br />
<br />


<h2 id="🧐-백엔드는-어떤-일을-하게-될까">🧐 백엔드는 어떤 일을 하게 될까?</h2>
<p><img src="https://velog.velcdn.com/images/jisu_227/post/e683b44b-bc34-444c-a774-101cbc5691a5/image.png" alt=""></p>
<ul>
<li>상품 정보를 API로 노출한다거나</li>
<li>로그인/ 로그아웃,권한 관리 등 사용자 인증을 주로 다루게 된다.</li>
<li>데이터베이스등의 시스템 설계까지 하는 경우도있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴퓨터 그리고 프로그래밍의 이해]]></title>
            <link>https://velog.io/@jisu_227/%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%98-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@jisu_227/%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%98-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Fri, 24 Jun 2022 02:12:22 GMT</pubDate>
            <description><![CDATA[<h2 id="🛠_-컴퓨터의-구성요소-_">🛠_ 컴퓨터의 구성요소 _</h2>
<p>컴퓨터의 구성요소를 살펴보기 전 컴퓨터란 무엇인가에 대하여 살펴보자.</p>
<blockquote>
<p>_ 컴퓨터란?_
<em>입력받은 데이터를 정해진 규칙대로 처리해서 처리 결과를 저장하고 출력하는 전자 장치이다.</em></p>
</blockquote>
<p>이 정의를 나누어 분석해 본다면 아래와 같이 정리해 볼 수 있다.</p>
<ul>
<li><em>&#39;정해진 규칙대로&#39;</em> -&gt; 소프트웨어 </li>
<li><em>&#39;입력받은 데이터를 처리해서 처리 결과를 저장하고 출력하는 장치이다.&#39;</em> -&gt; 하드웨어 </li>
</ul>
<p>즉, 컴퓨터는 <code>소프트웨어</code>와 <code>하드웨어</code>로 구성되며, 이 둘의 상호작용을 통해 동작한다.</p>
<h3 id="🤔-소프트웨어란">🤔 <em>소프트웨어란?</em></h3>
<blockquote>
<p><em>물리적인 형태가 존재하지 않는 컴퓨터의 구성요소로서, 하드웨어가 어떻게 동작해야하는지 규정해놓은 명령어의 집합이다.</em></p>
</blockquote>
<p>소프트웨어는 크게 2가지로 분류된다.</p>
<ul>
<li><code>시스템 소프트웨어(System Software)</code><ul>
<li>시스템 소프트웨어는 응용 소프트웨어를 실행하기 위한 일종의 플랫폼 역할을 수행하며, 하드웨어와 직접적으로 소통하며 하드웨어 장치들이 제대로 동작할 수 있도록 해준다.<ul>
<li>응용 소프트웨어의 실행 환경이다.<ul>
<li>ex) Mac, Windows, Linux와 같은 운영체제 및 Node.js, JRE와 같은 런타임 환경</li>
</ul>
</li>
<li>하드웨어 장치를 관리한다.<ul>
<li>ex) 키보드 드라이버, 마우스 드라이버, USB 드라이버와 같은 각종 장치 드라이버들</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p><code>응용 소프트웨어(Application Software)</code></p>
<ul>
<li><p>응용 소프트웨어는 소프트웨어에서 시스템 소프트 웨어를 제외한 모든 소프트웨어를 의미한다.</p>
<p>  줄여서 애플리케이션 및 앱이라고도 하며, 일반적으로 프로그램이라고 불린다.</p>
</li>
</ul>
</li>
</ul>
<h3 id="🤔-_하드웨어란-_">🤔 _하드웨어란? _</h3>
<blockquote>
<p><em>컴퓨터를 구성하는 기계적 장치들의 집합을 의미한다.
하드웨어는 <strong>중앙처리장치, 기억장치, 입력장치, 출력장치</strong>로 분류되고 각 장치들은 시스템 버스로 연결되어 있다.</em></p>
</blockquote>
<ul>
<li><p><code>중앙처리장치 (Central Processing Unit, CPU)</code></p>
<ul>
<li>CPU는 프로그램의 실행과 데이터 처리를 담당하는 컴퓨터의 핵심장치로, 프로세서라고도 한다. CPU는 제어장치, 연산장치, 레지스터로 구성되며 각 요소의 동작이 어우러져 기능을 수행한다.<ul>
<li><code>제어장치</code><ul>
<li>CPU의 모든 동작과 데이터 흐름을 통제, 관리한다.</li>
<li>운영체제와 소통하며 컴퓨터의 자원을 관리한다.</li>
</ul>
</li>
<li><code>연산장치</code><ul>
<li>프로그램이 기술되어져 있는 명령어를 수행한다.</li>
<li>코드를 실질적으로 실행시키는 장치이다.</li>
</ul>
</li>
<li><code>레지스터</code><ul>
<li>CPU 내에 존재하는 작고 빠른 기억장치이다.</li>
<li>연산장치의 동작에 필요한 데이터들을 임시적으로 보관하며 제공한다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p><code>기억장치 (Memory Device)</code></p>
<ul>
<li><p>기억장치는 저장장치라고도 하며, CPU의 동작에 필요한 데이터들을 장기적, 단기적으로 보관한다. 여기서 장기적으로 저장하는 장치를 보조기억장치라고 하며, 단기적으로 데이터를 저장하는 장치를 주기억장치라고 한다.</p>
<ul>
<li><code>보조기억장치</code><ul>
<li>컴퓨터에게 필요한 모든 정보를 반영구적 저장</li>
<li>큰 용량의 데이터를 저장할 수 있지만, 데이터를 읽고 쓰는 속도가 느리다.</li>
<li>CPU의 연산속도는 엄청나게 빠른 반면, 보조기억장치는 느리기 때문에 CPU 보조기억장치와 직접적으로 소통하지 않는다.<ul>
<li>ex) SSD(Solid State Drive), HDD(Hard Disk Drive)</li>
</ul>
</li>
</ul>
</li>
<li><code>주기억장치</code><ul>
<li>컴퓨터가 프로그램을 수행하는 동안 필요한 모든 데이터를 저장</li>
<li>큰 용량 데이터를 저장할 수 없지만, 데이터를 읽고 쓰는 속도가 빠르다.</li>
<li>CPU의 연산속도를 어느정도 따라 잡을 수 있을 정도로 빠르기 때문에 CPU는 주기억장치와 직접적으로 소통한다.<ul>
<li>ex) RAM(Random Access Memory), ROM(Read Only Memory)</li>
</ul>
</li>
</ul>
</li>
<li><code>캐시 메모리</code><ul>
<li>캐시 메모리란 한번 CPU가 사용한 데이터와 관련된 데이터 중, 재사용성이 높은 데이터를 주기억장치로부터 미리 불러와서 대기시켜놓는 역할을 한다.</li>
</ul>
</li>
</ul>
</li>
<li><p>기억장치의 계층 구조<img src="https://velog.velcdn.com/images/jisu_227/post/074ea978-bf7b-4a24-8a59-0a7ffdfbcfca/image.png" alt=""></p>
</li>
</ul>
</li>
<li><p><code>입력장치 (Input Device)</code></p>
<ul>
<li>사용자로부터 컴퓨터 내부로 데이터를 입력 받는 장치이다.<ul>
<li>ex) 키보드, 마우스, 마이크 등</li>
</ul>
</li>
</ul>
</li>
<li><p><code>출력장치 (Output Device)</code></p>
<ul>
<li>입력장치와 반대로, 출력장치는 컴퓨터 내부로부터 사용자에게 사람이 감각할 수 있는 형태로 데이터를 출력해주는 장치이다.<ul>
<li>ex) 모니터, 스피커, 프린터 등이 출력장치에 해당한다.</li>
</ul>
</li>
</ul>
</li>
<li><p><code>시스템 버스(System Bus)</code></p>
<ul>
<li>시스템 버스란 CPU를 포함한 각 하드웨어 장치 간의 통로이다. 즉, 하드웨어 장치를 물리적으로 연결한 전선을 의미하기 때문에 시스템 버스 또한 하드웨어에 포한된다.</li>
</ul>
</li>
</ul>
<h2 id="🧐-그렇다면-컴퓨터의-동작은-어떻게-이루어-지는-걸까">🧐 그렇다면 컴퓨터의 동작은 어떻게 이루어 지는 걸까?</h2>
<p><img src="https://velog.velcdn.com/images/jisu_227/post/b795c360-ce3e-4e68-befa-dfb88a8b8232/image.jpg" alt=""></p>
<p>예를 들어 컴퓨터에 계산기를 켜본다고 가정하자.
계산기를 켜면 <code>운영체제</code>가 <code>보조기억장치</code>에 저장되어 있던 계산기 프로그램을 <code>주기억장치</code>인 <code>RAM</code>에 로드시킨다. 이 과정을 <code>로딩(Loading)</code>이라고 한다.</p>
<p><strong>즉, 로딩이란 CPU가 작업할 수 있도록 보조기억장치 -&gt; 주기억장치 로 프로그램 파일을 옮겨오는 과정을 의미한다.</strong></p>
<p>로딩이 완료되면 계산기가 모니터상에 <code>출력</code>되어 나타나는데, 이렇게 실행중인 프로그램을 <code>프로세스</code> 라고 한다.
<strong>프로세스란, 메모리에 로드되어 실행 중인 프로그램들을 나타낸다.
**
이제 우리는 키보드나 마우스와 같은 입력장치를 통해 계산기에 데이터를 입력할 수 있다. 1 + 1 이라는 데이터를 입력하고 엔터를 누른다고 가정해보면, 
**CPU</strong>는 1 + 1을 <strong>계산기 프로그램의 소스코드에 작성된대로 해석</strong>하고, <strong>소스코드에 작성된 명령어들을 적용하여 계산을 시작</strong>한다.</p>
<p>계산이 완료되면 계산 결과는 주기억장치에 저장되며, 모니터를 통하여 우리에게 보여진다.</p>
<h2 id="👩🏻💻-프로그래밍-관련-개념설명">👩🏻‍💻 프로그래밍 관련 개념설명</h2>
<ul>
<li><p><code>컴파일</code>이란?</p>
<ul>
<li>컴퓨터는 프로그래밍 언어로 작성된 소스코드를 이해하지 못한다. 그래서 소스코드를 작성한 후 컴퓨터에게 내용을 전달할려면 소스코드를 기계어 코드로 변환시켜주어야한다. 이처럼 프로그래밍 언어로 작성된 소스코드를 컴퓨터가 이해할 수 있는 기계어 코드로 번역하는 과정을 컴파일(Compile)이라고 한다.</li>
</ul>
</li>
<li><p><code>빌드</code>란?</p>
<ul>
<li>위에서 설명한 컴파일(Compile)은 빌드(Build)라는 과정의 일부이다. 빌드는 작성한 소스코드를 실행할 수 있는 산출물로 변환시키는 과정을 의미하는데 그 과정 중 소스코드를 기계어 코드로 변역하는 컴파일 과정에 포함되어있다. 컴파일을 마친 코드는 기계어 코드로 번역되어 컴퓨터가 이해할 수 있을 뿐, 아직 사용자가 소스코드를 실행할 수는 없다. 프로그램이 실행되려면 .exe 또는 .msi 확장자를 가진 실행 파일로 만들어주는 빌드 과정이 필요하다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>