<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Larry_22.log</title>
        <link>https://velog.io/</link>
        <description>Be yourself, no matter what they say</description>
        <lastBuildDate>Sat, 07 Mar 2026 13:58:44 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Larry_22.log</title>
            <url>https://images.velog.io/images/larry_dino/profile/e2fd742a-cc59-4a65-96cc-e340c73f0f7b/겅디가 만들어준 자캐.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Larry_22.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/larry_dino" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[빅데이터 분석기사 필기 정리]]></title>
            <link>https://velog.io/@larry_dino/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D%EA%B8%B0%EC%82%AC-%ED%95%84%EA%B8%B0-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@larry_dino/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D%EA%B8%B0%EC%82%AC-%ED%95%84%EA%B8%B0-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sat, 07 Mar 2026 13:58:44 GMT</pubDate>
            <description><![CDATA[<h1 id="1-빅데이터의-이해">1. 빅데이터의 이해</h1>
<h4 id="-데이터의-구분">• 데이터의 구분</h4>
<p>정량적 데이터 : 주로 숫자로 이루어진 데이터
정성적 데이터 : 문자와 같은 텍스트로 구성되며 함축적 의미</p>
<h4 id="-데이터의-유형">• 데이터의 유형</h4>
<p>정형 : 테이블 구조 (DB), RDB, CSV, 스프레드시트
반정형 : 웹로그, 알람, XML, HTML, JSON, RSS
비정형 : 이미지, 오디오, 문자, NoSQL</p>
<hr>
<h4 id="-데이터-기반-지식-구분">• 데이터 기반 지식 구분</h4>
<p align="center">
  <img src="https://velog.velcdn.com/images/larry_dino/post/d6a63a51-b991-4269-ab95-974bc2f9cad4/image.png" width="500" height="400">
</p>

<ul>
<li>암묵지<ul>
<li>학습과 경험을 통해 개인에게 체화되어 있지만 겉으로 드러나지 않은 지식</li>
<li>사회적으로 중요하지만 다른 사람에게 공유되기 어려움</li>
</ul>
</li>
<li>형식지 <ul>
<li>명시적으로 알 수 있는 형태, 형식을 갖추어 표현되고 공유가 가능한 지식</li>
<li>전달과 공유가 용이함</li>
</ul>
</li>
</ul>
<h4 id="-dikw-피라미드">• DIKW 피라미드</h4>
<p align="center">
  <img src="https://velog.velcdn.com/images/larry_dino/post/80f40461-e902-4f4d-b99f-892ca2aa6964/image.png" width="500" height="400">
</p>

<ul>
<li><strong>Data</strong><ul>
<li>개별 데이터 자체로는 의미가 중요하지 않은 객관적 사실</li>
</ul>
</li>
<li><strong>Infotmation</strong><ul>
<li>데이터의 가공, 처리와 데이터 간 연관 관계 속에서 의미가 도출된 것</li>
</ul>
</li>
<li><strong>Knowledge</strong><ul>
<li>데이터를 통해 도출된 다양한 정보를 구조화하여 유의미한 정보를 분류하고 개인적인 경험을 결합시켜 고유의 지식으로 내재화된 것</li>
</ul>
</li>
<li><strong>Wisdom</strong><ul>
<li>지식의 축적과 아이디어가 결합된 창의적인 산물</li>
</ul>
</li>
</ul>
<hr>
<h4 id="-빅데이터의-특징">• 빅데이터의 특징</h4>
<p>3V : Volume(규모), Variety(유형, 다양성), Velocity(속도)
5V : Value(가치), Veracity(품질)</p>
<h4 id="-빅데이터의-가치">• 빅데이터의 가치</h4>
<p>경제적 자산, 불확실성 제거, 리스크 감소, 타분야 융합, 스마트 경쟁력</p>
<h4 id="-빅데이터의-가치-측정의-어려움">• 빅데이터의 가치 측정의 어려움</h4>
<p>데이터 활용 방식, 가치 창출 방식, 분석 기술 발전, 데이터 수집 원가</p>
<h4 id="-빅데이터의-본질적인-변화">• 빅데이터의 본질적인 변화</h4>
<blockquote>
</blockquote>
<ol>
<li>사전처리 -&gt; 사후처리</li>
<li>표본조사 -&gt; 전수조사</li>
<li>질 -&gt; 양</li>
<li>인과관계 -&gt; 상관관계</li>
</ol>
<h4 id="-빅데이터-활용을-위한-3요소">• 빅데이터 활용을 위한 3요소</h4>
<blockquote>
</blockquote>
<ol>
<li>인력 : 데이터사이언티스트</li>
<li>자원 : 빅데이터</li>
<li>기술 : 빅데이터플랫폼, AI</li>
</ol>
<h4 id="-분석조직의-구조">• 분석조직의 구조</h4>
<blockquote>
<ol>
<li>집중구조(전담조직구성)<ol start="2">
<li>분산구조(분석인력들을 현업부서로 직접배치)</li>
<li>기능구조(별도의 조직이 없고, 해당 부서에서 수행)</li>
</ol>
</li>
</ol>
</blockquote>
<hr>
<h4 id="-데이터-사이언티스트-요구역량">• 데이터 사이언티스트 요구역량</h4>
<ul>
<li>Hard Skill : 이론적 지식, 분석기술 숙련(<strong>이과적 지식</strong>)</li>
<li>Soft Skill : 통찰력, 설득력 있는 전달, 협업 능력(<strong>문과적 지식</strong>)</li>
</ul>
<h4 id="-데이터베이스-특징">• 데이터베이스 특징</h4>
<p>공용 데이터, 통합 데이터, 저장된 데이터, 변화되는 데이터(<strong>공통저변</strong>)</p>
<h4 id="-데이터웨어하우스dw-특징">• 데이터웨어하우스(DW) 특징</h4>
<blockquote>
<p>특징 : 주제지향성, 통합성, 시계열성, 비휘발성
구성요소 : 데이터모델, ETL(Extract, Transform, Load), ODS, DW메타데이터, OLAP, 데이터마이닝, 분석도구, 경영기반솔루션</p>
</blockquote>
<ul>
<li>ETL <ul>
<li>기업의 내부 또는 외부로부터 데이터를 추출, 정제 및 가공하여 데이터웨어하우스에 적재</li>
</ul>
</li>
<li>ODS<ul>
<li>DBMS 시스템에서 추출한 데이터를 통합적으로 관리</li>
</ul>
</li>
<li>데이터 마이닝<ul>
<li>대용량 데이터로부터 인사이트를 추출</li>
</ul>
</li>
</ul>
<h4 id="-데이터-산업의-진화순서">• 데이터 산업의 진화순서</h4>
<p>처리 -&gt; 통합 -&gt; 분석 -&gt; 연결 -&gt; 권리</p>
<h4 id="-인공지능-경쟁력-3요소">• 인공지능 경쟁력 3요소</h4>
<p>알고리즘, GPU, 풍부한 데이터</p>
<hr>
<h1 id="2-데이터-분석-계획">2. 데이터 분석 계획</h1>
<h4 id="-분석의-기획">• 분석의 기획</h4>
<p align="center">
  <img src="https://velog.velcdn.com/images/larry_dino/post/3a5d4f6b-a4c3-44b6-b84a-f4828a4a31d1/image.png" width="500" height="400">
</p>

<ul>
<li><p>하향식 접근법(Top-Down)</p>
<ul>
<li>비즈니스 문제 -&gt; 분석 과제 도출</li>
<li>전략중심, 문제 중심 접근</li>
</ul>
</li>
<li><p>상향식 접근법(Bottom-Up)</p>
<ul>
<li>데이터 분석 -&gt; 인사이트 발견</li>
<li>데이터 중심 접근</li>
</ul>
</li>
<li><p>디자인 사고(Design Thinking)</p>
<ul>
<li>사용자 문제 해결 중심 분석</li>
</ul>
</li>
<li><p>데이터 분석 거버넌스 구성요소</p>
<ul>
<li>조직, 운영 프로세스, 분석 인프라, 데이터 거버넌스, 분석교육 </li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><p>KDD 분석방법론</p>
<ul>
<li><strong>통계적 패턴</strong>이나 지식을 찾기 위해 정리한 데이터</li>
</ul>
</li>
<li><p>CRISP-DM 분석방법론</p>
<ul>
<li>유럽연합의 ESPRIT에서 시작, 주요 5개 업체들이 주도</li>
</ul>
</li>
</ul>
<p align="center">
  <img src="https://velog.velcdn.com/images/larry_dino/post/918844b0-129e-49d5-bcaa-23bb29788903/image.png" width="500" height="400">
</p>


<ul>
<li>SEMMA 분석방법론<ul>
<li>SAS사의 주도로 만들어진 기술중심, 통계중심의 방법론</li>
<li>추출 -&gt; 탐색 -&gt; 수정-&gt; 모델링 -&gt; 평가</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><p>데이터 거버넌스</p>
<ul>
<li>전사 차원의 모든 데이터에 대해 정책 및 지침, 표준화, 운영조직과 책임 등 표준화된 관리 체계 수립</li>
<li>데이터의 가용성, 유용성, 통합성, 보안성을 확보<blockquote>
<p>  마스터 데이터 : 마스터 파일을 형성하는 데이터
메타 데이터 : 다른 데이터를 설명하기 위해 사용되는 데이터
데이터 사전 : 자료의 이름, 표현방식, 의미, 사용방식 등을 저장</p>
</blockquote>
</li>
</ul>
</li>
<li><p>데이터 분석 성숙도</p>
</li>
</ul>
<table>
<thead>
<tr>
<th>단계</th>
<th align="left">설명</th>
</tr>
</thead>
<tbody><tr>
<td>Descriptive</td>
<td align="left">무엇이 일어났는가</td>
</tr>
<tr>
<td>Diagnostic</td>
<td align="left">왜 발생했는가</td>
</tr>
<tr>
<td>Predictive</td>
<td align="left">미래 예측</td>
</tr>
<tr>
<td>Prescriptive</td>
<td align="left">최적 의사결정</td>
</tr>
</tbody></table>
<ul>
<li><p>데이터 처리 프로세스</p>
<p align="center">
<img src="https://velog.velcdn.com/images/larry_dino/post/2426ff82-ebfe-461d-bdfb-dce409564745/image.png">
</p>
</li>
<li><p>사분면 분석</p>
<p align="center">
<img src="https://velog.velcdn.com/images/larry_dino/post/27585e53-c953-43de-b1f4-48d855ae90d1/image.png" width="500" height="400">
</p>


</li>
</ul>
<hr>
<h1 id="3-데이터-수집-및-저장-계획">3 데이터 수집 및 저장 계획</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바_오버라이딩]]></title>
            <link>https://velog.io/@larry_dino/%EC%9E%90%EB%B0%94%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9</link>
            <guid>https://velog.io/@larry_dino/%EC%9E%90%EB%B0%94%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9</guid>
            <pubDate>Mon, 12 Jul 2021 05:22:30 GMT</pubDate>
            <description><![CDATA[<h2 id="오버라이딩overriding">오버라이딩(overriding)</h2>
<h4 id="오버라이딩이란">오버라이딩이란?</h4>
<p>조상클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.
상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스의 메서드에 맞게 변경해야하는 경우가 많아 조상의 메서드를 오버라이딩을 한다.</p>
<h4 id="오버라이딩의-조건">오버라이딩의 조건</h4>
<p>오버라이딩은 메서드의 내용만을 새로 작성하는 것이므로, 메서드의 선언부는 조상의 것과 완전히 일치해야 한다.</p>
<blockquote>
<p>자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와
<strong>1. 이름이 같아야 한다.
2. 매개변수가 같아야 한다.
3. 반환타입이 같아야 한다.</strong></p>
</blockquote>
<h4 id="오버로딩과-오버라이딩">오버로딩과 오버라이딩</h4>
<p>많은 자바에 입문하는 사람들이 헷갈려하는 부분 중 하나가 오버로딩과 오버라이딩의 차이에 대해 헷갈려하는 경우가 많다. 필자 또한 둘의 차이를 이해하지 못해 많은 도서를 읽어보며 이해하게 되었다.
일단 형식적인 둘의 차이는 다음과 같다.</p>
<blockquote>
<p>오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는 것(new)
오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것(change, modify)</p>
</blockquote>
<p>즉 새로운 메서드를 만들면 오버로딩, 상속받은 메서드의 내용만을 바꾼다면 오버라이딩이라고 생각하면 된다.</p>
<pre><code class="language-java">class Parent {
    void parentMethod() {}
}

class Child extends Parent {
    void parentMEthod() {}    // 오버라이딩
        void parentMethod(int i) {} // 오버로딩

        void childMethod() {}
        void childMethod(int i) {} // 오버로딩
}</code></pre>
<h2 id="super">super</h2>
<p>super는 자손 클래스에서 조상클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다. 멤버변수와 지역변수의 이름이 같을 떄 this를 붙여서 구별했듯이 상속받은 멤버와 자신의 멤버와 이름이 같을 때는 super를 붙여서 구별할 수 있다.</p>
<pre><code class="language-java">class SuperTest
{
    public static void main(String args[]){
        Child c = new Child();
        c.method();
    }
}

class Parent
{
   int x = 10;
}

class Child extends Parent {
   void method() {
    System.out.println(&quot;x = &quot; + x);
        System.out.println(&quot;this.x = &quot; + this.x);
        System.out.println(&quot;super.x = &quot; + super.x);
    }
}</code></pre>
<blockquote>
<p>실행결과
x = 10
this.x = 10
super.x = 10</p>
</blockquote>
<p>이 경우에는 x, this.x, super.x 모두 같은 변수를 의미하여 모두 같은 값이 출력되었다.</p>
<pre><code class="language-java">class SuperTest
{
    public static void main(String args[]){
        Child c = new Child();
        c.method();
    }
}

class Parent
{
   int x = 10;
}

class Child extends Parent {
   int x = 20;
   void method() {
    System.out.println(&quot;x = &quot; + x);
        System.out.println(&quot;this.x = &quot; + this.x);
        System.out.println(&quot;super.x = &quot; + super.x);
    }
}</code></pre>
<blockquote>
<p>실행결과
x = 20
this.x = 20
super.x = 10</p>
</blockquote>
<p>super.x는 조상 클래스(Parent)로부터 상속받은 멤버변수 x를 뜻하며, this.x는 자손 클래스(Child)에 선언된 멤버변수를 뜻한다.</p>
<h2 id="super---조상-클래스의-생성자">super() - 조상 클래스의 생성자</h2>
<p>super() 또한 this()와 같이 생성자이다. this()는 같은 클래스의 다른 생성자를 호출하는 데 사용되지만, super()는 조상 클래스의 생성자를 호출하는데 사용된다.</p>
<pre><code class="language-java">class PointTest {
    public static void main(String[] args) {
        Point3D p3 = new Point3D();

        System.out.println(&quot;p3.x = &quot; + p3.x);
        System.out.println(&quot;p3.y = &quot; + p3.y);
        System.out.println(&quot;p3.z = &quot; + p3.z);
    }
}

class Point {
    int x = 10;
    int y = 20;

    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

class Point3D extends Point{
    int z = 30;

    Point3D()
    {
        this(100, 200, 300);    // Point3D(int x, int y, int z)를 호출한다.
    }

    Point3D(int x, int y, int z)
    {
        super(x, y);    //  Point(int x, int y)를 호출한다.
        this.z = z;
    }
}</code></pre>
<p>위의 코드를 보면 어떤 클래스의 인스턴스를 생성하면, 클래스 상속관계의 최고조상인 Object클래스까지 거슬러 올라가면서 모든 조상클래스의 생성자가 순서대로 호출된다는 것을 알 수 있다.</p>
<p>참고 자바의 정석 p327 ~ p335</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바_상속]]></title>
            <link>https://velog.io/@larry_dino/%EC%9E%90%EB%B0%94%EC%83%81%EC%86%8D</link>
            <guid>https://velog.io/@larry_dino/%EC%9E%90%EB%B0%94%EC%83%81%EC%86%8D</guid>
            <pubDate>Wed, 07 Jul 2021 08:02:21 GMT</pubDate>
            <description><![CDATA[<h1 id="상속inheritance">상속(inheritance)</h1>
<h4 id="상속의-정의">상속의 정의</h4>
<blockquote>
<p>기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고, 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다.</p>
</blockquote>
<h4 id="상속을-구현하는-방법">상속을 구현하는 방법</h4>
<pre><code class="language-java">class Parent{}
class Child extends Parent{
    // ...
}</code></pre>
<blockquote>
<p>조상 클래스 : 부모(parent)클래스, 상위(super)클래스
자손 클래스 : 자식(child)클래스, 하위(sub)클래스</p>
</blockquote>
<h4 id="상속의-예시">상속의 예시</h4>
<pre><code class="language-java">class Tv {
    boolean power; // 전원 상태(on/off)
    int channel;    // 채널

    void power() {
        power = !power;}
    void channelUp() {
        ++channel;
    }
    void channelDown(){
        --channel;
    }
}

class CaptionTv extends Tv{
    boolean caption;    // 캡션 상태(on/off)
    void displayCaption(String text) {
        if(caption){ // 캡션 상태가 on(true)일 때만 text를 보여준다.
            System.out.println(text);
        }
    }
}

class CaptionTvTest {
    public static void main(String[] args) {
        CaptionTv ctv = new CaptionTv();
        ctv.channel = 10;
        ctv.channelUp();
        System.out.println(ctv.channel);
        ctv.displayCaption(&quot;Hello World!&quot;);
        ctv.caption = true;
        ctv.displayCaption(&quot;Hello World!&quot;);
    }
}</code></pre>
<blockquote>
<p>실행결과
11
Hello World!</p>
</blockquote>
<h4 id="상속에-대해서-알-수-있는-것들">상속에 대해서 알 수 있는 것들</h4>
<blockquote>
<ol>
<li>부모와 자식 관계에서 클래스의 멤버변수와 메서드를 상속 받았을 때, 자식은 부모클래스의 멤버변수와 메서드를 사용할 수 있다.</li>
<li>상속을 통해서 하나의 클래스에 다양한 기능을 넣어서 편한 코드작성이 가능하다.</li>
</ol>
</blockquote>
<h2 id="포함관계">포함관계</h2>
<p>상속이외에도 클래스를 재사용하는 또 다른 방법이 있다. 그것은 클래스간에 &#39;포함(Composite)&#39;관계를 맺어 주는 것이다.
클래스 간의 포함관계를 맺어 주는 것은 <strong>한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언</strong>하는 것을 뜻한다.</p>
<pre><code class="language-java">class Circle {
    int x;    // 원점의 x좌표
    int y;    // 원점의 y좌표
    int z;    // 반지름(radius)
}

class Point {
    int x;    // x좌표
    int y;    // y좌표
}</code></pre>
<p>이때 포함관계를 활용해서 Circle클래스를 다음과 같이 작성할 수 있다.</p>
<pre><code class="language-java">class Circle{
    Point c = new Point();    // 원점
    int r;
}</code></pre>
<blockquote>
<p>원(Circle)은 점(Point)이다. - Circle is a Point.
원(Circle)은 점(Point)를 가지고 있다. - Circle has a Point.</p>
</blockquote>
<blockquote>
<p>상속관계 : &#39;<del>은 ~이다.(is-a)&#39;
포함관계 : &#39;</del>은 ~을 가지고 있다.(has-a)&#39;</p>
</blockquote>
<h4 id="상속과-포함관계의-예시">상속과 포함관계의 예시</h4>
<pre><code class="language-java">class DrawShape {
    public static void main(String[] args) {
        Point [] p = { new Point(100, 100), new Point(140, 50), new Point(200, 100)};
        Triangle t = new Triangle(p);
        Circle c = new Circle(new Point(150, 150), 50);

        t.draw();   // 삼각형을 그린다.
        c.draw();   // 원을 그린다.
    }
}

class Shape {
    String color = &quot;black&quot;;
    void draw(){
        System.out.printf(&quot;[color=%s]%n&quot;, color);
    }
}

class Point {
    int x;
    int y;

    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    Point() {
        this(0,0);
    }

    String getXY() {
        return&quot;(&quot; + x + &quot;, &quot; + y + &quot;)&quot;;     // x와 y의 값을 문자열로 반환
    }
}

class Circle extends Shape {
    Point center;   //  원의 원점좌표
    int r;      // 반지름

    Circle() {
        this(new Point(0,0), 100); // Circle(Point center, int r)를 호출
    }

    Circle(Point center, int r){
        this.center = center;
        this.r = r;
    }

    void draw() {
        System.out.printf(&quot;[center = (%d, %d), r = %d, color = %s]%n&quot;, center.x, center.y, r, color);
    }
}

class Triangle extends Shape{
    Point [] p = new Point[3];

    Triangle(Point[] p){
        this.p = p;
    }

    void draw() {
        System.out.printf(&quot;[p1 = %s, p2 = %s, p3 = %s, color = %s]%n&quot;, p[0].getXY(), p[1].getXY(), p[2].getXY(), color);
    }
}</code></pre>
<blockquote>
<p>실행결과
[p1 = (100, 100), p2 = (140, 50), p3 = (200, 100), color = black]<br>[center = (150, 150), r = 50, color = black]</p>
</blockquote>
<pre><code class="language-java">class Circle extends Shape {    //  Circle과 Shape는 상속관계
    Point center;           //  Circle과 Point는 포함관계
    int r;              // 반지름</code></pre>
<p>위와 같이 상속과 포함의 관계를 구분할 수 있다면 클래스의 함수를 보다 유기적으로 활용할 수가 있다.</p>
<pre><code class="language-java">class Shape {
    String color = &quot;black&quot;;
    void draw(){    
        System.out.printf(&quot;[color=%s]%n&quot;, color);
    }
}</code></pre>
<p>Circle클래스는 Shape클래스로부터 모든 멤버를 상속받았으므로, Shape클래스에 정의된 color이나 draw()를 사용할 수 있다.</p>
<pre><code class="language-java">class Circle extends Shape {
      ...
    void draw() {    // 원을 그리는 대신에 원의 정보를 출력하도록 했다.
        System.out.printf(&quot;[center = (%d, %d), r = %d, color = %s]%n&quot;, center.x, center.y, r, color);
    }
}</code></pre>
<p>Circle클래스에도 Shape클래스에 있는 draw()메서드가 정의되어 있는 것을 알 수가 있다. 이때 draw()를 호출할 경우 Circle클래스에 정의된 draw()가 호출된다.
이를 <strong>오버라이딩(overriding)</strong>이라고 부른다.</p>
<p>참고 자바의 정석 p310 ~ p321</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바_오버로딩과 생성자]]></title>
            <link>https://velog.io/@larry_dino/%EC%9E%90%EB%B0%94%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9%EA%B3%BC-%EC%83%9D%EC%84%B1%EC%9E%90</link>
            <guid>https://velog.io/@larry_dino/%EC%9E%90%EB%B0%94%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9%EA%B3%BC-%EC%83%9D%EC%84%B1%EC%9E%90</guid>
            <pubDate>Sat, 03 Jul 2021 01:37:08 GMT</pubDate>
            <description><![CDATA[<h2 id="오버로딩이란">오버로딩이란</h2>
<p>하나의 클래스 내에서 같은 이름의 메서드를 여러 개 정의하는 것을 &#39;메서드 오버로딩(method overloading)&#39; 또는 간단히 &#39;오버로딩(overloading)&#39;이라고 한다.</p>
<h4 id="오버로딩의-조건">오버로딩의 조건</h4>
<blockquote>
<ol>
<li>메서드 이름이 같아야 한다.</li>
<li>매개변수의 개수 또는 타입이 달라야 한다.</li>
</ol>
</blockquote>
<h4 id="오버로딩의-예">오버로딩의 예</h4>
<pre><code class="language-java">class OverloadingTest {
    public static void main(String[] args) {
        Mymath3 mm = new Mymath3();
        System.out.println(&quot;mm.add(3, 3) 결과 :&quot; + mm.add(3,3));
        System.out.println(&quot;mm.add(3L, 3) 결과 :&quot; + mm.add(3L,3));
        System.out.println(&quot;mm.add(3, 3L) 결과 :&quot; + mm.add(3,3L));
        System.out.println(&quot;mm.add(3L, 3L) 결과 :&quot; + mm.add(3L,3L));

        int [] a = {100, 200, 300};
        System.out.println(&quot;mm.add(a) 결과 : &quot; + mm.add(a));
    }
}

class Mymath3 {
    int add(int a, int b){
        System.out.print(&quot;int add(int a, int b) - &quot;);
        return a + b;
    }

    long add(int a, long b){
        System.out.print(&quot;long add(int a, long b) - &quot;);
        return a + b;
    }

    long add(long a, int b){
        System.out.print(&quot;long add(long a, int b) - &quot;);
        return a + b;
    }

    long add(long a, long b){
        System.out.print(&quot;long add(long a, long b) - &quot;);
        return a + b;
    }

    int add(int[] a){ // 배열의 모든 요소의 합을 결과로 돌려준다.
        System.out.print(&quot;int add(int[] a) - &quot;);
        int result = 0;
        for(int i = 0; i &lt; a.length; i++){
            result += a[i];
        }
        return result;
    }
}</code></pre>
<blockquote>
<p>실행결과
int add(int a, int b) - mm.add(3, 3) 결과 :6
long add(long a, int b) - mm.add(3L, 3) 결과 :6
long add(int a, long b) - mm.add(3, 3L) 결과 :6
long add(long a, long b) - mm.add(3L, 3L) 결과 :6
int add(int[] a) - mm.add(a) 결과 : 600</p>
</blockquote>
<p>위와 같은 결과가 나오기 위해서 오버로딩을 사용한 것이 보여진다. Mymath3클래스의 add메서드들을 오버로딩해줌으로써 각각 메서드가 받는 매개변수에 따라 그에 따른 반환값과 출력문이 나오도록 했다.
이렇게 오버로딩을 함으로써 하나의 메서드로 여러개의 메서드를 정의할 수 있게 되어 복잡하지 않은 코딩을 할 수 있게 되었다.</p>
<h2 id="생성자란">생성자란</h2>
<p>생성자는 인스턴스가 생성될 때 호출되는 &#39;인스턴스 초기화 메서드&#39; 즉, 메서드명이 클래스명과 동일하며 리턴자료형이 존재하지 않는 메서드라고 생각하면 된다.</p>
<h4 id="생성자의-조건">생성자의 조건</h4>
<blockquote>
<ol>
<li>생성자의 이름은 클래스의 이름과 같아야 한다.</li>
<li>생성자는 리턴 값이 없다.</li>
</ol>
</blockquote>
<h4 id="생성자의-정의">생성자의 정의</h4>
<pre><code class="language-java">클래스이름(타입 변수명, 타입 변수명, ... ) {
    // 인스턴스 생성 시 수행될 코드,
        // 주로 인스턴스 변수의 초기화 코드를 적는다.
}

class Card{
    Card(){        // 매개변수가 없는 생성자
           ...
        }

        Card(String k, int num){    // 매개변수가 있는 생성자
           ...
        }
        ...
}</code></pre>
<blockquote>
<p>여기서 주의할 점은 <strong>연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다</strong>라는 것을 알고 가야한다.</p>
</blockquote>
<blockquote>
<p><strong>Card c = new Card();</strong></p>
<ol>
<li>연산자 new에 의해서 메모리(heap)에 Card클래스의 인스턴스가 생성된다.</li>
<li>생성자 Card()가 호출되어 수행된다.</li>
<li>연산자 new의 결과로, 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장된다.</li>
</ol>
</blockquote>
<h4 id="생성자의-예시">생성자의 예시</h4>
<pre><code class="language-java">class Car {
    String color;   // 색상
    String gearType; // 변속기 종류 - auto(자동), manual(수동)
    int door;   // 문의 개수

    Car() {}
    Car(String c, String g, int d){
        color = c;
        gearType = g;
        door = d;
    }
}

class CarTest {
    public static void main(String[] args) {
        Car c1 = new Car();
        c1.color = &quot;white&quot;;
        c1.gearType = &quot;auto&quot;;
        c1.door = 4;

        Car c2 = new Car(&quot;white&quot;, &quot;auto&quot;, 4);
        System.out.println(&quot;c1의 color=&quot; + c1.color + &quot;, gearType=&quot; + c1.gearType + &quot;, door=&quot; + c1.door);
        System.out.println(&quot;c2의 color=&quot; + c2.color + &quot;, gearType=&quot; + c2.gearType + &quot;, door=&quot; + c2.door);
    }
}</code></pre>
<h4 id="생성자에서-다른-생성자-호출---this-this">생성자에서 다른 생성자 호출 - this, this()</h4>
<p>같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자간에도 서로 호출이 가능하다.</p>
<blockquote>
<ol>
<li>생성자의 이름으로 클래스이름 대신 this를 사용한다.</li>
<li>한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.</li>
</ol>
</blockquote>
<p>이때 생성자를 작성할 때 첫 줄에서만 호출해야 되는 이유는 생성자 내에서 초기화 작업 도중에 다른 생성자를 호출하게 되면, 호출된 다른 생성자 내에서도 멤버변수들의 값을 초기화를 할 것이므로 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있기 때문이다.</p>
<h4 id="생성자-예시">생성자 예시</h4>
<pre><code class="language-java">class Car {
    String color;   // 색상
    String gearType;    // 변속기 종류 - auto (자동), manual (수동)
    int door;   // 문의 개수

    Car(String color, String gearType, int door){
        this.color = color;
        this.gearType = gearType;
        this.door = door;
    }

    Car() {
        this(&quot;White&quot;, &quot;auto&quot;, 4);
    }

    Car(String color) {
        this(color, &quot;auto&quot;, 4);
    }

}

class CarTest2 {
    public static void main(String[] args) {
        Car c1 = new Car();
        Car c2 = new Car(&quot;Blue&quot;);

        System.out.println(&quot;c1의 color=&quot; + c1.color + &quot;, gearType=&quot; + c1.gearType + &quot;, door=&quot; + c1.door);
        System.out.println(&quot;c2의 color=&quot; + c2.color + &quot;, gearType=&quot; + c2.gearType + &quot;, door=&quot; + c2.door);
    }
}</code></pre>
<blockquote>
<p>실행결과
c1의 color=White, gearType=auto, door=4
c2의 color=Blue, gearType=auto, door=4</p>
</blockquote>
<p>나는 생성자를 쉽게 생각하여 손님들이 받는 상세하게 무슨 재료가 들어간 수프인지 적혀있는 메뉴판으로 생각하며 생성자를 이해하고 있다.
위의 코드를 예로 들어, 제일 첫번째 생성자 Car(String color, String gearType, int door)에서는 색깔과 기어타입, 문의 개수를 미리 주문자의 오더에 따라 바뀔 수가 있지만, 두번째 세번째 생성자 Car에서는 오더가 없거나, 3개중의 1개를 설정하면 나머지에 대해서는 미리 정해져 있는 값을 반환한다.
<strong>즉, 생성자를 통해서 변수를 설정하는 것에 대해서 간략하게 변경할 수 있게 된다는 것을 이해해야한다.</strong></p>
<blockquote>
<p>this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.
this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.</p>
</blockquote>
<h4 id="생성자를-이용한-인스턴스의-복사">생성자를 이용한 인스턴스의 복사</h4>
<pre><code class="language-java">class Car {
    String color;   // 색상
    String gearType;    // 변속기 종류 - auto (자동), manual (수동)
    int door;   // 문의 개수

    Car(String color, String gearType, int door){
        this.color = color;
        this.gearType = gearType;
        this.door = door;
    }

    Car() {
        this(&quot;White&quot;, &quot;auto&quot;, 4);
    }

    Car(Car c) { // 인스턴스의 복사를 위한 생성자
        color = c.color;
        gearType = c.gearType;
        door = c.door;
    } // this(c.color, c.gearType, c.door);

}

class CarTest3 {
    public static void main(String[] args) {
        Car c1 = new Car();
        Car c2 = new Car(c1); // c1의 복사본 c2를 생성한다.

        System.out.println(&quot;c1의 color=&quot; + c1.color + &quot;, gearType=&quot; + c1.gearType + &quot;, door=&quot; + c1.door);
        System.out.println(&quot;c2의 color=&quot; + c2.color + &quot;, gearType=&quot; + c2.gearType + &quot;, door=&quot; + c2.door);

        c1.door = 100;
        System.out.println(&quot;c1.door=100; 수행 후&quot;);

        System.out.println(&quot;c1의 color=&quot; + c1.color + &quot;, gearType=&quot; + c1.gearType + &quot;, door=&quot; + c1.door);
        System.out.println(&quot;c2의 color=&quot; + c2.color + &quot;, gearType=&quot; + c2.gearType + &quot;, door=&quot; + c2.door);
    }
}
</code></pre>
<blockquote>
<p>실행결과
c1의 color=White, gearType=auto, door=4
c2의 color=White, gearType=auto, door=4
c1.door=100; 수행 후
c1의 color=White, gearType=auto, door=100
c2의 color=White, gearType=auto, door=4</p>
</blockquote>
<p><strong>인스턴스 c2는 c1을 복사하여 생성된 것이므로 서로 같은 상태를 갖지만, 서로 독립적으로 메모리공간에 존재하는 별도의 인스턴스이므로 c1의 값들이 변경되어도 c2는 영향을 받지 않는다.</strong></p>
<p>참고 자바의 정석 p283 ~ 299</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바_클래스 메서드(Static메서드)]]></title>
            <link>https://velog.io/@larry_dino/%EC%9E%90%EB%B0%94%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%A9%94%EC%84%9C%EB%93%9CStatic%EB%A9%94%EC%84%9C%EB%93%9C</link>
            <guid>https://velog.io/@larry_dino/%EC%9E%90%EB%B0%94%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%A9%94%EC%84%9C%EB%93%9CStatic%EB%A9%94%EC%84%9C%EB%93%9C</guid>
            <pubDate>Wed, 23 Jun 2021 13:31:12 GMT</pubDate>
            <description><![CDATA[<p>클래스 메서드는 쉽게 말하면 메서드 앞에 static이 있으면 클래스 메서드이고, 없으면 인스턴스 메서드이다.</p>
<h3 id="클래스-메서드의-특징">클래스 메서드의 특징</h3>
<br>

<h4 id="1-클래스를-설계할-때-멤버변수-중-모든-인스턴스에-공통으로-사용하는-것에-static을-붙인다">1. 클래스를 설계할 때 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.</h4>
<blockquote>
<p>생성된 각 인스턴스는 서로 독립적이기 때문에 각 인스턴스의 변수는 서로 다른 값을 유지한다. 그러나 <strong>모든 인스턴스에서 같은 값이 유지되어야 하는 변수는 static을 붙여서 클래스변수로 정의</strong>해야 한다.</p>
</blockquote>
<h4 id="2-클래스-변수static-변수는-인스턴스를-생성하지-않아도-사용할-수-있다">2. 클래스 변수(static 변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.</h4>
<blockquote>
<p>static이 붙은 변수(클래스변수)는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문이다.</p>
</blockquote>
<h4 id="3-클래스-메서드static-메서드는-인스턴스-변수를-사용할-수-없다">3. 클래스 메서드(static 메서드)는 인스턴스 변수를 사용할 수 없다.</h4>
<blockquote>
<p>인스턴스 메서드에서는 static이 붙은 변수를 사용하는 것이 언제든 가능하지만, 클래스 메서드(static 메서드)에서는 인스턴스 생성 없이 호출이 가능하여, 클래스 메서드가 호출되었을 때 인스턴스가 존재하지 않을 수도 있기 때문에 <strong>클래스 메서드에서는 인스턴스변수의 사용을 금지</strong>한다.</p>
</blockquote>
<h4 id="4-메서드-내에서-인스턴스-변수를-사용하지-않는다면-static을-붙이는-것을-고려한다">4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.</h4>
<blockquote>
<p>인스턴스 변수를 필요로 하지 않는 상황에서 static을 붙임으로써 메서드 호출시간이 짧아져 성능이 향상된다.</p>
</blockquote>
<br>

<h3 id="클래스메서드-예제">클래스메서드 예제</h3>
<pre><code class="language-java">class MyMath2 {
    long a, b;

    // 인스턴스변수 a, b만을 이용해서 작업하므로 매개변수가 필요없다.
    long add() { return a + b; } // a, b는 인스턴스변수
    long subtract() { return a - b; }
    long multiply() { return a * b; }
    double divide() { return a / b; }

    // 인스턴스변수와 관계없이 매개변수만으로 작업이 가능하다.
    static long add(long a, long b) { return a + b; } // a, b는 지역변수
    static long subtract(long a, long b) { return a - b; }
    static long multiply(long a, long b) { return a * b; }
    static double divide(double a, double b) { return a / b; }
}

class MyMathTest2 {
    public static void main(String[] args) {
        // 클래스메서드 호출. 인스턴스 생성없이 호출가능
        System.out.println(MyMath2.add(200L, 100L));
        System.out.println(MyMath2.subtract(200L, 100L));
        System.out.println(MyMath2.multiply(200L, 100L));
        System.out.println(MyMath2.divide(200.0, 100.0));

        MyMath2 mm = new MyMath2(); // 인스턴스를 생성
        mm.a = 200L;
        mm.b = 100L;
        // 인스턴스메서드는 객체생성 후에만 호출이 가능함.
        System.out.println(mm.add());
        System.out.println(mm.subtract());
        System.out.println(mm.multiply());
        System.out.println(mm.divide());
    }
}</code></pre>
<p>예제코드를 보면 클래스메서드와 인스턴스메서드의 차이에 대해서 알 수 있다.</p>
<blockquote>
<p>클래스메서드는 객체생성없이 바로 호출이 가능했고, 인스턴스메서드는 MyMath2클래스의 인스턴스를 생성한 후 호출이 가능했다.</p>
</blockquote>
<h3 id="멤버간의-참조와-호출">멤버간의 참조와 호출</h3>
<p>같은 클래스에 속한 멤버들 같에는 별도의 인스턴스를 생성하지 않고도 서로 참조 또는 호출이 가능하다. 단, 클래스멤버가 인스턴스 멤버를 참조 또는 호출하고자 하는 경우에는 인스턴스를 생성해야 한다.</p>
<blockquote>
<p><strong>인스턴스 멤버</strong>(인스턴스 변수와 메서드)가 존재하는 시점에 클래스 멤버는 항상 존재하지만, 클래스멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수도 있기 때문이다.</p>
</blockquote>
<pre><code class="language-java">class TestClass{
    void instanceMethod() {}    // 인스턴스메서드
        static void staticMethod() {} // static메서드

        void instanceMethod2() { // 인스턴스메서드
            instanceMethod(); // 다른 인스턴스메서드를 호출
            staticMethod(); // static메서드를 호출
        }

        static void staticMethod2() { // static메서드
            instanceMethod();    // 에러! 인스턴스메서드를 호출할 수 없다.
            staticMethod();        // static메서드는 호출
        }
} // end of class</code></pre>
<p>위의 코드는 같은 클래스 내의 인스턴스 메서드와 static메서드 간의 호출에 대해서 설명하고 있다.</p>
<blockquote>
<p>같은 클래스 내의 메서드는 서로 객체의 생성이나 참조변수 없이 직접 호출이 가능하지만, static메서는 인스턴스 메서드를 호출할 수 없다.</p>
</blockquote>
<p>참고 자바의 정석 p277 ~ p282</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바_참조형 매개변수]]></title>
            <link>https://velog.io/@larry_dino/%EC%9E%90%EB%B0%94%EC%B0%B8%EC%A1%B0%ED%98%95-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98</link>
            <guid>https://velog.io/@larry_dino/%EC%9E%90%EB%B0%94%EC%B0%B8%EC%A1%B0%ED%98%95-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98</guid>
            <pubDate>Tue, 22 Jun 2021 04:23:11 GMT</pubDate>
            <description><![CDATA[<h2 id="기본형-매개변수와-참조형-매개변수">기본형 매개변수와 참조형 매개변수</h2>
<p>자바에서는 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다. 메서드의 매개변수를 <strong>기본형</strong>으로 선언하면 <strong>단순히 저장된 값</strong>만 얻지만, <strong>참조형</strong>으로 선언하면 값이 <strong>저장된 곳의 주소</strong>를 알 수 있기 때문에 값을 읽어 오는 것은 물론 값을 변경하는 것도 가능하다.</p>
<blockquote>
<p><strong>기본형 매개변수</strong> : 변수의 값을 읽기만 할 수 있다. (read only)
<strong>참조형 매개변수</strong> : 변수의 값을 읽고 변경할 수 있다. (read &amp; write)</p>
</blockquote>
<h3 id="기본형-매개변수">기본형 매개변수</h3>
<pre><code class="language-java">class Data { int x; }

class PrimitiveParamEx {
    public static void main(String[] args) {
        Data d = new Data();
        d.x = 10;
        System.out.println(&quot;main() : x = &quot; + d.x);

        change(d.x);
        System.out.println(&quot;After change(d.x)&quot;);
        System.out.println(&quot;main() : x = &quot; + d.x);
    }

    static void change(int x) { //  기본형 매개변수
        x = 1000;
        System.out.println(&quot;change() : x = &quot; + x);
    }
}</code></pre>
<blockquote>
<p>실행결과
main() : x = 10
change() : x = 1000
After change(d.x)
main() : x = 10</p>
</blockquote>
<h3 id="기본형-매개변수의-설명">기본형 매개변수의 설명</h3>
<p>위의 코드에서 기본형 매개변수를 받아 호출하는 change를 보면 기본형 매개변수 int x를 썼다. 이때 int x는 change 메서드에서 1000으로 바뀌었음에도 d.x는 10으로 나온다.
그 이유는 &#39;d.x&#39;의 값이 변경된 것이 아니라, change메서듸 매개변수 x의 값이 변경된 것이기 때문에 원본에는 아무런 영향을 미치지 못한다.</p>
<blockquote>
<p>기본형 매개변수는 변수에 저장된 값만 읽을 수만 있을 뿐 변경할 수 없기 때문에 d.x의 값에는 변화가 없다.</p>
</blockquote>
<h3 id="참조형-매개변수">참조형 매개변수</h3>
<pre><code class="language-java">class Data { int x; }

class ReferenceParamEx {
    public static void main(String[] args) {
        Data d = new Data();
        d.x = 10;
        System.out.println(&quot;main() : x = &quot; + d.x);

        change(d.x);
        System.out.println(&quot;After change(d.x)&quot;);
        System.out.println(&quot;main() : x = &quot; + d.x);
    }

    static void change(Data d) { //  기본형 매개변수
        d.x = 1000;
        System.out.println(&quot;change() : x = &quot; + d.x);
    }
}</code></pre>
<blockquote>
<p>실행결과
main() : x = 10
change() : x = 1000
After change(d.x)
main() : x = 1000</p>
</blockquote>
<h3 id="참조형-매개변수의-설명">참조형 매개변수의 설명</h3>
<p>기본형 매개변수의 코드와는 달리 change 메서드를 호출한 후에 d.x의 값이 변경되었다. change메서드의 매개변수가 참조형이기 때문에 &#39;값이 저장된 주소&#39;를 change 메서드에게 넘겨주었기 때문에 값을 읽어오는 것뿐만이 아닌 변경하는 것도 가능하기 위와 같은 결과가 나왔다.</p>
<blockquote>
<p>참조형 매개변수는 값이 저장된 주소를 사용하기 때문에 변수의 값을 읽거나 변경할 수 있다.</p>
</blockquote>
<h3 id="참조형-반환타입">참조형 반환타입</h3>
<p>매개변수뿐만 아니라 반환타입도 참조형이 될 수 있다.
모든 참조형 타입의 값은 &#39;객체의 주소&#39;이므로 그저 정수값이 반환되는 것일 뿐 특별할 것이 없다.</p>
<pre><code class="language-java">class Data { int x; }

class ReferenceReturnEx {
    public static void main(String[] args) {
        Data d = new Data();
        d.x = 10;

        Data d2 = copy(d);
        System.out.println(&quot;d.x =&quot; + d.x);
        System.out.println(&quot;d2.x =&quot; + d2.x);
    }

    static Data copy(Data d){
        Data tmp = new Data();
        tmp.x = d.x;

        return tmp;
    }
}</code></pre>
<blockquote>
<p>실행결과
d.x = 10 
d2.x = 10</p>
</blockquote>
<p>위의 코드에서 주의깊게 봐야할 것은 copy메서드이다.</p>
<pre><code class="language-java">static Data copy(Data d){ 
        Data tmp = new Data(); // 새로운 객체 tmp를 생성
        tmp.x = d.x; // d.x의 값을 tmp.x에 복사

        return tmp; // 복사한 객체의 주소를 반환
    }</code></pre>
<p>copy메서드의 반환타입은 &#39;Data&#39;이며, 호출결과를 저장하는 변수의 타입 역시 &#39;Data&#39;타입의 참조변수이다. 
위의 copy메서드는 반환값 tmp를 가지며, tmp는 d.x의 값을 복사했다. copy메서드가 <strong>복사한 객체의 주소</strong> d.x를 가진 tmp를 d2.x로 반환했기 때문에 실행결과에서 d2.x가 10이 나온것이다.</p>
<blockquote>
<p>&quot;반환타입이 &#39;<strong>참조형</strong>&#39;이라는 것은 메서드가 &#39;<strong>객체의 주소</strong>&#39;를 반환한다는 것을 의미한다.&quot;</p>
</blockquote>
<p>참조 자바의 정석 p264 ~ p269</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바_변수와 메서드]]></title>
            <link>https://velog.io/@larry_dino/%EC%9E%90%EB%B0%94%EB%B3%80%EC%88%98%EC%99%80-%EB%A9%94%EC%84%9C%EB%93%9C</link>
            <guid>https://velog.io/@larry_dino/%EC%9E%90%EB%B0%94%EB%B3%80%EC%88%98%EC%99%80-%EB%A9%94%EC%84%9C%EB%93%9C</guid>
            <pubDate>Mon, 21 Jun 2021 13:25:21 GMT</pubDate>
            <description><![CDATA[<h2 id="변수의-종류">변수의 종류</h2>
<table>
<thead>
<tr>
<th>변수의 종류</th>
<th>선언 위치</th>
<th>생성시기</th>
</tr>
</thead>
<tbody><tr>
<td>클래스 변수<br>(class variable)</td>
<td>클래스 영역</td>
<td>클래스가 메모리에 올라갈 때</td>
</tr>
<tr>
<td>인스턴스 변수<br>(instance variable)</td>
<td>클래스 영역</td>
<td>인스턴스가 생성되었을 때</td>
</tr>
<tr>
<td>지역 변수<br>(local variable)</td>
<td>클래스 영역 이외의 영역<br>(메서드, 생성자, 초기화 블럭 내부)</td>
<td>변수 선언문이 수행되었을 때</td>
</tr>
</tbody></table>
<pre><code class="language-java">class Variables
{
    int iv;        // 인스턴스 변수
    static int cv;  // 클래스 변수(static 변수, 공유변수)

    void method()
    {
        int lv = 0;    // 지역변수
    }
}</code></pre>
<p><strong>1. 인스턴스변수(instance variable)</strong></p>
<blockquote>
<p>클래스의 인스턴스를 생성할 때 만들어진다. 인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있으며, 인스턴스마다 고유한 상태를 유지해야하는 속성의 경우, 인스턴스로 선언한다.</p>
</blockquote>
<p><strong>2. 클래스변수(class variable)</strong></p>
<blockquote>
<p>클래스 변수를 선언하는 방법은 인스턴수변수 앞에 static을 붙이기만 하면 된다.</p>
</blockquote>
<p><strong>3. 지역변수(local variable)</strong></p>
<blockquote>
<p>메서드 내에 선언되어 메서드 내에서만 사용 가능하며, 메서드가 종료되면 소멸되어 사용 할 수 없게 된다.</p>
</blockquote>
<pre><code class="language-java">class CardTest{
    public static void main(String args[]){
    System.out.println(&quot;Card.width = &quot; + Card.width);
    System.out.println(&quot;Card.height = &quot; + Card.height);

    Card c1 = new Card();
    c1.kind = &quot;Heart&quot;;
    c1.number = 7;

    Card c2 = new Card();
    c2.kind = &quot;Spade&quot;;
    c2.number = 4;

    System.out.println(&quot;c1은 &quot; + c1.kind + &quot;, &quot; + c1.number + &quot;이며, 크기는 (&quot; + c1.width + &quot;, &quot; + &quot; c1.height + &quot;)&quot; );
    System.out.println(&quot;c2은 &quot; + c2.kind + &quot;, &quot; + c2.number + &quot;이며, 크기는 (&quot; + c2.width + &quot;, &quot; + &quot; c2.height + &quot;)&quot; );
    System.out.println(&quot;c1의 width와 height를 각각 50, 80으로 변경합니다.&quot;);

    c1.width = 50;
    c1.height = 80;

    System.out.println(&quot;c1은 &quot; + c1.kind + &quot;, &quot; + c1.number + &quot;이며, 크기는 (&quot; + c1.width + &quot;, &quot; + &quot; c1.height + &quot;)&quot; );
    System.out.println(&quot;c2은 &quot; + c2.kind + &quot;, &quot; + c2.number + &quot;이며, 크기는 (&quot; + c2.width + &quot;, &quot; + &quot; c2.height + &quot;)&quot; );
    }
}

class Card{
    String kind;
        int number;
        static int width = 100;
        static int height = 250;
}</code></pre>
<blockquote>
<p>인스턴스변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다.</p>
</blockquote>
<h2 id="메서드">메서드</h2>
<p>&#39;메서드(method)&#39;는 특정작업을 수행하는 일련의 문장들을 하나로 묶은 것이며, 기본적으로 수학의 함수와 유사하다.</p>
<h4 id="메서드를-사용하는-이유">메서드를 사용하는 이유</h4>
<ol>
<li>높은 재사용성(reusability)<blockquote>
<p>한번 만들어 놓은 메서드는 몇 번이고 호출 할 수 있으며, 다른 프로그램에서도 사용이 가능하다.</p>
</blockquote>
</li>
<li>중복된 코드의 제거<blockquote>
<p>반복되는 문장들을 묶어서 하나의 메서드로 작성해 놓으면, 메서드를 호출하는 한 문장으로 대체할 수 있다. </p>
</blockquote>
</li>
<li>프로그램의 구조화<blockquote>
<p>큰 규모의 프로그램에서 문장들을 작업단위로 나눠서 여러 개의 메서드에 담아 프로그램의 구조를 단순화시킴으로써 프로그램의 전체 흐름이 한눈에 들어올 수 있어 나중에 프로그램에 문제가 발생해도 쉽게 찾아서 해결할 수 있다.</p>
</blockquote>
</li>
</ol>
<pre><code class="language-java">public static void main(String args[]){
    int[] numArr = new int[10];

    initArr(numArr);    // 1. 배열을 초기화
    printArr(numArr);    // 2. 배열을 출력
    sortArr(numArr);     // 3. 배열을 정렬
    printArr(numArr);    // 4. 배열을 출력
}</code></pre>
<p>위의 코드처럼 각 메서드의 역할과 기능들을 구조화함으로써 전체의 흐름을 쉽게 파악할 수 있고, 오류발생 메서드의 위치를 찾아서 빠르게 수정이 가능하다.</p>
<h2 id="메서드의-선언과-구현">메서드의 선언과 구현</h2>
<p>메서드는 크게 &#39;선언부(header, 머리)&#39;와 &#39;구현부(body, 몸통)&#39;로 이루어져 있다.</p>
<pre><code class="language-java">int add(int a, int b) // =&gt; 선언부
{
    int result = a + b;
        return result; // 호출한 메서드로 결과를 반환한다.
} // =&gt; 구현부</code></pre>
<p><strong>메서드 선언부</strong>는 &#39;메서드의 이름&#39;과 &#39;매개변수 선언&#39;, 그리고 &#39;반환타입&#39;으로 구성되어 있으며, 메서드가 작업을 수행하기 위해 어떤 값들을 필요로 하고 작업의 결과로 어떤 타입의 값을 반환하는지에 대한 정보를 제공한다.</p>
<p><strong>메서드 구현부</strong>는 메서드 선언부 다음에 오는 괄호{}를 뜻하며, 여기에 메서드를 호출했을 때 수행될 문장들을 넣는다.</p>
<blockquote>
<p>int add(int <strong>a</strong>, int <strong>b</strong>)
{
int <strong>result</strong> = a + b;
return <strong>result</strong>; 
}</p>
</blockquote>
<p>위에 정의 된 메서드 add에 선언된 변수 x,y,result는 메서드 내에 선언된 변수로 &#39;<strong>지역변수</strong>(local variable)&#39;라고 한다.</p>
<h2 id="메서드의-호출">메서드의 호출</h2>
<blockquote>
<p>메서드이름(값1, 값2, ...) // 메서드를 호출하는 방법
print99danAll();    // void print99danAll()을 호출
int result = add(3, 5); // int add(int x, int y)를 호출하고, 결과를 result에 저장</p>
</blockquote>
<p>메서드를 호출할 때 괄호()안에 지정해준 값인 &#39;인자(argument)&#39; 또는 &#39;인수&#39;의 개수 또는 순서는 호출된 메서드에 선언된 매개변수와 일치해야만 호출이 가능하다.</p>
<pre><code class="language-java">class MyMathTest {
    public static void main(String[] args) {
        MyMath mm = new MyMath();
        long result1 = mm.add(5L, 3L);
        long result2 = mm.subtract(5L, 3L);
        long result3 = mm.multiply(5L, 3L);
        double result4 = mm.divide(5L, 3L);

        System.out.println(&quot;add(5L, 3L) = &quot; + result1);
        System.out.println(&quot;subtract(5L, 3L) = &quot; + result2);
        System.out.println(&quot;multiply(5L, 3L) = &quot; + result3);
        System.out.println(&quot;divide(5L, 3L) = &quot; + result4);
    }
}

class MyMath {
    long add(long a, long b){
        long result = a+b;
        return result;
        // return a + b;  // 위의 두줄을 이와 같이 한 줄로 간단히 할 수 있다.
    }
    long subtract(long a, long b) { return a - b; }
    long multiply(long a, long b) { return a * b; }
    double divide(double a, double b) { return a / b;}
}</code></pre>
<blockquote>
<p>위의 코드를 보면 각 메서드에는 각각의 반환타입(long, double)을 가지고 있고, 타입에 따른 매개변수들 또한 가지고 있다. 그리고 메인 메서드를 통해서 호출받은 MyMath의 메서드들은 그에 맞는 타입의 수를 입력받아 다음과 같은 결과를 얻는다.</p>
</blockquote>
<blockquote>
<p>실행결과
add (5L, 3L) = 8
subtract (5L, 3L) = 2
multiply (5L, 3L) = 15
divide (5L, 3L) = 1.66666666666667</p>
</blockquote>
<p>여기에서 &#39;divide (5L, 3L) = 1.66666666666667&#39;가 나오는 이유는 <br> long형의 값인 5L,3L이 double형 값인 5.0, 3.0으로 <strong>자동 형변환</strong>되어 divide의 매개변수로서 저장되어 호출되었다.</p>
<p>참고 자바의 정석 p246 ~ p257</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바_객체지향언어]]></title>
            <link>https://velog.io/@larry_dino/%EC%9E%90%EB%B0%94</link>
            <guid>https://velog.io/@larry_dino/%EC%9E%90%EB%B0%94</guid>
            <pubDate>Fri, 18 Jun 2021 09:40:03 GMT</pubDate>
            <description><![CDATA[<h2 id="객체지향이론의-기본-개념">객체지향이론의 기본 개념</h2>
<blockquote>
<p>실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다.</p>
</blockquote>
<h2 id="객체지향언어가-갖는-장점">객체지향언어가 갖는 장점</h2>
<blockquote>
<p><strong>1. 코드의 재사용성이 높다.</strong>
    새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.<br>
<strong>2. 코드의 관리가 용이하다.</strong>
    코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.<br>
<strong>3. 신뢰성이 높은 프로그래밍을 가능하게 한다.</strong>
    제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.</p>
</blockquote>
<p>이러한 객체지향언어의 장점은 프로그램의 개발과 유지보수에 드는 시간과 비용을 획기적으로 개선하였다.</p>
<h2 id="클래스와-객체">클래스와 객체</h2>
<h4 id="1-클래스의-정의와-용도">1. 클래스의 정의와 용도</h4>
<blockquote>
<p>클래스의 정의 : 클래스란 객체를 정의해 놓은 것이다.
클래스의 용도 : 클래스는 객체를 생성하는데 사용된다.</p>
</blockquote>
<h4 id="2-객체의-정의와-용도">2. 객체의 정의와 용도</h4>
<blockquote>
<p>객체의 정의 : 실제로 존재하는 것. 사물 또는 개념.
객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름</p>
</blockquote>
<p>클래스와 객체의 관계를 우리가 살고 있는 실생활에서 예를 들면, 제품의 설계도(<span style="color:red">클래스</span>)와 제품(<span style="color:red">객체</span>)과의 관계라고 할 수 있다.</p>
<h2 id="객체와-인스턴스">객체와 인스턴스</h2>
<h4 id="1-인스턴스">1. 인스턴스</h4>
<blockquote>
<p>클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다.</p>
</blockquote>
<h4 id="2-객체">2. 객체</h4>
<blockquote>
<p>객체는 <span style="color:red">속성과 기능</span>, 두 종류의 구성요소로 이루어져 있다.
그리고 객체가 가지고 있는 속성과 기능을 그 객체의 멤버(구성원, member)라 한다.</p>
</blockquote>
<blockquote>
<p>속성(property) : 멤버변수, 특성, 필드, 상태 등
기능(function) : 메서드(method), 함수(function) 등</p>
</blockquote>
<h4 id="3-인스턴스의-생성과-사용">3. 인스턴스의 생성과 사용</h4>
<blockquote>
<p>클래스명 변수명; &nbsp; //클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); &nbsp; // 클래스의 객체를 생성한 후, 객체의 주소를 참조변수에 저장</p>
</blockquote>
<pre><code class="language-java">public class Tv {
    // Tv의 속성(멤버변수)
    String color;       // 색상
    boolean power;      // 전원상태(On/Off)
    int channel;        // 채널

    // Tv의 기능(메서드)
    void power() {
        power = !power;
    } // TV를 켜거나 끄는 기능을 하는 메서드
    void channelUp() {
        ++channel;
    } // TV의 채널을 높이는 기능을 하는 메서드
    void channelDown(){
        --channel;
    } // TV의 채널을 낮추는 기능을 하는 메서드
}

public class TvTest {
    public static void main(String[] args) {
        Tv t;          // Tv인스턴스를 참조하기 위한 변수 t를 선언
        t = new Tv();  // Tv인스턴스를 생성한다.
        t.channel = 7; // Tv인스턴스의 멤버변수 channel의 값을 7로 한다.
        t.channelDown(); // Tv인스턴스의 메서드 channelDown()을 호출한다.
        System.out.println(&quot;현재 채널은 &quot; + t.channel + &quot; 입니다.&quot;);
    }
}</code></pre>
<blockquote>
<p>Tv t; &nbsp; // Tv클래스 타입의 참조변수 t를 선언한다.
t = new Tv(); &nbsp; // Tv인스턴스를 생성한 후, 대입연산자(=)에 의해서 생성된 객체(<span style="color:red">Tv인스턴스</span>)의 주소값이 t에 저장된다.</p>
</blockquote>
<p><strong>인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.</strong></p>
<blockquote>
<p>이는 즉 Tv클래스의 인스턴스와 Tv클래스 타입의 참조변수가 같은 클래스 타입이어야 한다고 표현한 것이다.</p>
</blockquote>
<h2 id="객체-배열">객체 배열</h2>
<pre><code class="language-java">public class Tv {
    String color;
    boolean power;
    int channel;

    void power() {
        power = !power;
    }
    void channelup() {
        ++channel;
    }
    void channelDown() {
        --channel;
    }
}

public class TvTest4 {
    public static void main(String[] args) {
        Tv [] tvArr = new Tv[3];    // 길이가 3인 Tv객체 배열

        // Tv객체를 생성해서 Tv객체 배열의 각 요소에 저장
        for(int i = 0; i &lt; tvArr.length; i++) {
            tvArr[i] = new Tv(); /// Tv의 객체의 주소값이 배열 tvArr[i]에 저장
            tvArr[i].channel = i + 10; // tvArr[i]의 channel에 i + 10을 저장
        }

        for(int i = 0; i &lt; tvArr.length; i++) {
            tvArr[i].channelup(); // tvArr[i]의 메서드를 호출. 채널이 1증가
            System.out.printf(&quot;tvArr[%d].channel=%d%n&quot;, i, tvArr[i].channel);
        }
    }
}</code></pre>
<blockquote>
<p>다른 언어에서 배운 배열에 대한 내용을 객체의 배열로서 쓸 수 있다.
모든 배열에서 그렇듯이 객체배열도 같은 타입의 객체만 저장할 수 있다.</p>
</blockquote>
<p>참고 자바의 정석 p230 ~ p241</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 약수의 개수와 덧셈]]></title>
            <link>https://velog.io/@larry_dino/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@larry_dino/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Wed, 19 May 2021 08:13:53 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<blockquote>
<p>두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.</p>
</blockquote>
<h2 id="제한사항">제한사항</h2>
<blockquote>
<p>1 ≤ left ≤ right ≤ 1,000</p>
</blockquote>
<h2 id="입출력">입출력</h2>
<p><img src="https://images.velog.io/images/larry_dino/post/66fa2dbc-5b64-4a85-ac63-3c0504433b9d/image.png" alt=""></p>
<h2 id="입출력의-예">입출력의 예</h2>
<p>다음 표는 13부터 17까지의 수들의 약수를 모두 나타낸 것입니다.
<img src="https://images.velog.io/images/larry_dino/post/99a493a3-2f22-49b2-8f8e-e4c2ba0e280c/image.png" alt="">
따라서, 13 + 14 + 15 - 16 + 17 = 43을 return 해야 합니다.</p>
<pre><code class="language-python">def solution(left, right):
    answer = 0

    for i in range(left, right + 1): # left ~ right까지를 반복한다.
        tes = 0
        for a in range(1, i + 1): # 약수의 개수를 구하는 반복문
            if i % a == 0:
                tes += 1

        if tes % 2 == 0:
            answer += i
        else:
            answer -= i

    return answer


print(solution(13, 17)) # 43
print(solution(24, 27)) # 52</code></pre>
<h2 id="풀이">풀이</h2>
<blockquote>
<p>해당 코드는 반복문과 조건문을 조합하였으며 첫번째 반복문은 13 ~ 17까지 반복을 하도록 하였고, 다음 반복문은 약수의 개수를 구하도록 하였다.
이후 구해지는 약수의 개수를 통해서 조건문을 이용하여 tes의 값이 짝수의 경우 더하고, 홀수의 경우 빼도록 함으로써 answer의 값이 구해진다.</p>
</blockquote>
<h2 id="어려웠던-점">어려웠던 점</h2>
<blockquote>
<p>해당 코드를 짜기 위해서 알아야 했던 것이 2가지가 있다.
약수의 개수를 구하는 것과 그 약수의 개수를 통해서 answer의 값을 구하는 것이다.
약수의 개수를 구하는 코드를 만들고 최종적인 answer의 값을 구하는 공식을 세우기까지 많은 시간이 걸렸다.
tes = 0의 위치와 두번째 (answer의 값을 구하는)조건문의 위치를 설정하는 구간에서 많은 실수가 있었으며 이를 통해서 for문과 if문을 적절한 부문에 설정할 수 있도록 추가적인 복습이 필요하다.</p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>