<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>레조_개발자 비기너 레벨 </title>
        <link>https://velog.io/</link>
        <description>어쩌다보니 백엔드 개발자/ 번아웃 없이 재밌게 개발하고 싶어요 </description>
        <lastBuildDate>Fri, 12 Aug 2022 08:02:46 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>레조_개발자 비기너 레벨 </title>
            <url>https://images.velog.io/images/rememberme_jhk/profile/754f15b0-fa26-4ec2-8b37-981eccb9ab14/minions.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 레조_개발자 비기너 레벨 . All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/rememberme_jhk" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[JAVA] JAVA INTRO]]></title>
            <link>https://velog.io/@rememberme_jhk/day-01</link>
            <guid>https://velog.io/@rememberme_jhk/day-01</guid>
            <pubDate>Fri, 12 Aug 2022 08:02:46 GMT</pubDate>
            <description><![CDATA[<h3 id="java">JAVA</h3>
<ul>
<li>단순성, 사용자에게 혼란을 줄 수 있는 요소 삭제</li>
<li>설정의 단순화</li>
<li>불필요한 기능의 삭제</li>
<li>cpp기반의 객체지향 프로그래밍 언어 </li>
<li>고급언어(High-level programming language)   </li>
</ul>
<h3 id="인터프린터-방식하이브리드-방식-vs-컴파일-방식">인터프린터 방식(하이브리드 방식) vs 컴파일 방식</h3>
<p> 고급언어로 작성된 프로그램을 실행하는데에는 두가지 방법이 있는데 가장 일반적인 방법은 프로그램을 컴파일하는 것이고, 다른 하나는 프로그램을 인터프린터에 통과시키는 방법이다. </p>
<ul>
<li><p>인터프린터(하이브리드) 방식: 인터프리터는 고급언어로 작성된 원시코드 명령어들을 한번에 한줄씩 읽어들여서 실행하는 프로그램이다. 운영체제에 독립적이고 컴파일 방식보다는 속도가 느리다. </p>
</li>
<li><p>컴파일 방식(C계열): 컴퓨터는 기계어를 이해할 수 없다. 그걸 이해할 수 있도록 작성해주는 것! 운영체제에 종속적이며 인터프린트 방식(자바)보다 빠르다. </p>
</li>
</ul>
<h3 id="java-개발-환경-구축">JAVA 개발 환경 구축</h3>
<ul>
<li>JDK: 컴파일러와 자바 실행 환경을 제공해주는 프로그램(파일) </li>
<li>JRE: 자바 실행 환경을 제공(JVM포함) 
JDK &gt; JRE &gt; JVM 이 포함되어 있다 </li>
<li>JVM(JAVA Virtual Machine): JAVA 프로그램을 실행할 수 있도록 하는 가상의 운영체제, 자동 메모리 관리</li>
</ul>
<h3 id="ide통합개발환경툴">IDE(통합개발환경툴)</h3>
<ul>
<li>EditPlus (코드편집기에 가깝다, 공부하는데 도움이 많이 된다) </li>
<li>Eclipse(eclipse.org)</li>
<li>IntelliJ</li>
</ul>
<h3 id="레지스트">레지스트</h3>
<p>소프트웨어와 하드웨어 사이에서 중개하는 역할, 문제는 우리가 완전 기계를 알아야 한다. A컴퓨터에서 개발을 했으면 B컴퓨터에서도 사용할 수 있어야하는데 사용할 수 없다(이식성 없다).</p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/8f772fe0-f533-4ad1-ba67-32bde3726843/image.jpg" alt=""></p>
<ul>
<li><p>사용자, 프로그램 비율에 따라 결정되는 것이지 좋다 나쁘다의 문제가 아니다. </p>
</li>
<li><p>C언어를 기준으로 보통 저급언어와 고급언어가 나뉜다 </p>
</li>
<li><p>저급언어(기계가 쉽게 사용할 수 있는 언어)</p>
</li>
<li><p>고급언어(사람이 쉽게 사용할 수 있는 언어)</p>
</li>
<li><p>고급언어일수록 기계는 쓰기 어렵단 뜻&gt; 구동이 느려진다</p>
</li>
<li><p>저급언어는 사람이 개발하기 어렵단 뜻&gt; 개발하는데 오래걸린다 </p>
</li>
<li><p>C언어가 나오면서 기라성같은 IT기업이 생겼다. </p>
</li>
<li><p>절차지향: 위에서부터 아래로 간다는 뜻이 아니라 <strong>함수단위</strong>로 프로그램을 작성하는 방식이라는 뜻이다. 함수가 함수를 호출하는 것처럼! 개발하기가 쉽지 않아서 많은 인력이 필요해졌고 자연스레 비용이 증가했다. 프로그램의 가격이 올라가고 이익률이 낮아졌다.  </p>
</li>
<li><p>객체지향: 데이터(공간)을 여러개 묶어놓고 기능(메소드-함수), 객체중심의 프로그램 언어, 객체끼리 상호작용해서 프로그램을 작성하는 방식을 말한다. 간단히 &#39;찍어낸다&#39;고 생각하면 된다. &#39;데이터를 쓰겠대요, 근데 기능을 미리 다 만들어놓고 필요한거 있음 갖다가 써!&#39; 이런 식으로! 설계도만 존재하면 그냥 그 설계도대로 찍어내면 끝! </p>
</li>
<li><p>자바는 C언어를 기반으로(CPP)해서 개선할 것들을 개선, 걷어내고 나온 언어이다.  </p>
</li>
<li><p>사실 자바보다 CPP가 더 안정적이고 이전에 개발할 때 C로 다 했었다. 근데 웹이 발전하면서 자바가 다시 흥해졌다. </p>
</li>
</ul>
<ul>
<li>.c &gt; 컴파일 &gt; .obj &gt; 빌드(각각의 운영체제에 맞춰진 최적의 프로그램을 만들기 위해서 하는 것) 통해서 &gt; .exe &gt; 실행</li>
<li>.java &gt; 컴파일 &gt; (바이트 코드로 변환한다) .class &gt; .jvm &gt; 실행 
자바를 하이브리드방식이라고 하는 이유는 컴파일 과정이 들어가있기 때문이다. C나 자바는 파일 전체를 변환해서 작동시키고 파이썬은 한줄한줄 실행시킨다. </li>
</ul>
<ul>
<li><p>jre설치했는데 한번 더 설치하라고 나온다 &gt; 자바는 외부 응용 프로그램과 연동되는 경우가 많다. </p>
</li>
<li><p>.metadata가 생기는데 이건 workspace 관리해주는 폴더이다.  </p>
</li>
<li><p>package(=폴더같은 것): 비슷한 기능을 가진 파일들을 관리하기 쉽도록 하나의 폴더로 모아둔다. 회원관련-회원폴더에, 게시판관련-게시판폴더에 모아두는 식이다.  </p>
</li>
<li><p>project: 프로그램의 기본 틀 </p>
</li>
<li><p>class: 필요한 기능들의 모음(클래스 포함)  </p>
</li>
</ul>
<h3 id="프로그램-기본-구조">프로그램 기본 구조</h3>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/37c2f7c7-b138-499e-a4c8-eb8fa52a60fa/image.jpg" alt=""></p>
<pre><code>import java.lang.*;

/* 
01.import 경로; 
프로그램에서 필요한 기능을 가져다 쓰기 위한 키워드 
import는 위치 알려줄테니 갖다 써, 
include는 포함시킴(include 용량이 커질 수밖에 없음)

02.java.lang 패키지 
프로그램에서 기본적으로 필요한 기능들을 정의한 패키지
기본적으로 모든 파일이 자동으로 import 하고 있다 

03. 패키지
비슷한 기능들의 파일들을 모아 놓은 폴더 

04. * 
&#39;모든 것&#39; 의미  

05. {} 
영역 또는 지역 표시
데이터의 묶음 처리 (여러 개의 데이터가 나올 때 그 데이터들을 
묶음 처리하기 위해 중괄호 사용 ex: 배열) 
*/

public class AugTue09{
    //class 영역 
    /*
    자바에서는 모든 프로그래밍 코드를 class영역 안에 적어야 한다
    클래스명은 camel case로 작성
    실행 시, 클래스를 찾을 때는 파일명을 통해 클래스를 찾는다 
    파일명과 클래스명은 동일하게 작성해야 한다 
    */
    public static void main(String[], args){
        //main method 영역
        /*
        01. method vs 함수(function) 
        클래스 내부에 정의한 함수(method), 클래스의 멤버 .lang 이런 식
        여러 문장들이 하나의 기능을 구현하도록 구성한 것(function)
        즉, 함수 중에서 클래스 내부에 정의한 함수를 method라고 한다 
        02. 한가지 기능을 실행할 수 있도록 정의한 작은 프로그램 

        */

        system.out.println(&quot;Heavy rain today!&quot;); 

    }
}
</code></pre><h3 id="프로그램에서-자주-사용되는-데이터">프로그램에서 자주 사용되는 데이터</h3>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/6bad69c1-de63-4d80-821c-0935b58effbc/image.jpg" alt=""></p>
<pre><code>import java.lang.*; 

public class AugWed10_01{
    public static void main(String[], args){
        // &#39;.&#39; 멤버 참조 연산자 - 클래스의 멤버를 참조(호출)하는 연산자 

        // 프로그래밍에서 자주 사용되는 데이터 
        // 1. 정수 
        System.out.println(10); 
        // 2. 실수
        System.out.println(10.234); 
        // 3. 문자 - 문자형 데이터를 구별하기 위해서 &#39;&#39; 안에 작성 
        System.out.println(&#39;S&#39;); 
        // 4. 문자열 - 모든 프로그래밍 언어에서는 문장을 문자열이라 부른다, 구별하기 위해서 &quot;&quot; 안에 작성 
        System.out.println(&quot;System.out.println&quot;); 

        // package - 비슷한 기능의 파일들을 하나로 모아놓은 것, name 다 소문자로 
    }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 인스턴스 만들기]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Mon, 27 Jun 2022 08:31:28 GMT</pubDate>
            <description><![CDATA[<p>객체지향의 양대산맥은 클래스와 인스턴스이다. 
인스턴스는 하나의 클래스를 복제해서 서로 다른 데이터의 값(상태)과 서로 같은 메소드를 가진 복제본을 만드는 것이다. 또 클래스를 실제로 실행시킨 실체화된 클래스라고도 할 수 있다. 이를 통해 다양한 상태에 있는 여러 개의 클래스를 돌릴 수 있다. </p>
<p>여러 조건에 따라서 다른 출력을 내고 싶다고 가정해 본다.</p>
<ol>
<li><p>OO 상품
공급가 : 10000
부가가치세율 10%
공급가 대비 비용률 : 30%</p>
</li>
<li><p>XX 상품
공급가 : 20000
부가가치세율 5%
공급가 대비 비용률 : 20%
and so on...</p>
</li>
</ol>
<p>이럴 경우 기존의 방식으로 프로그램을 실행하게 된다면, 변수를 조정하는 과정에서 프로그램이 꼬일 수 있다. 이 때 각각의 상태에 따라 인스턴스를 생성해서 실행하는 것이 방법이다. </p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/21141e61-b474-4d29-bae7-f9263ce7a1cb/image.jpg" alt=""> </p>
<p>a1 인스턴스는 a2 인스턴스의 작업이 끝난 후에도 여전히 남아 있다. 그래서 마지막에 a1 인스턴스의 print 메소드를 실행해도 같은 결과를 낸다.</p>
<p>인스턴스를 만들어주는데 옆의 노란 부분을 클릭해보면 &#39;static&#39;이라는 것을 사용하지 말라고 나온다. </p>
<p>위의 코드에서 static을 모두 지워준 다음 코드를 실행시켜주면 정상 작동한다. </p>
<pre><code>class Accounting{
    public double valueOfSupply; 
    public double vatRate;
    public double expenseRate; 
    public void print() {
        System.out.println(&quot;Value of Supply: &quot; + valueOfSupply); 
        System.out.println(&quot;VAT: &quot; + getVAT()); 
        System.out.println(&quot;Total: &quot; + getTotal()); 
        System.out.println(&quot;Expense: &quot; + getExpense()); 
        System.out.println(&quot;Income: &quot; + getIncome()); 
        System.out.println(&quot;Dividend 1: &quot; + (getIncome() * getDividend1())); 
        System.out.println(&quot;Dividend 2: &quot; + (getIncome() * getDividend2()));
        System.out.println(&quot;Dividend 3: &quot; + (getIncome() * getDividend3()));
    }

    private double getDividend3() {
        return getIncome() * 0.2;
    }

    private double getDividend2() {
        return getIncome() * 0.3;
    }

    private double getDividend1() {
        return getIncome() * 0.5;
    }

    private double getIncome() {
        return valueOfSupply - getExpense();
    }

    private double getExpense() {
        return valueOfSupply*expenseRate;
    }

    private double getTotal() {
        return valueOfSupply+getVAT();
    }

    private double getVAT() {
        return valueOfSupply*vatRate;
    }
}

public class AccountingClassApp {


    public void main(String[] args) {

//        Accounting.valueOfSupply = 10000.0; 
//        Accounting.vatRate = 0.1;
//        Accounting.expenseRate = 0.3; 
//        Accounting.print(); 
//        
//        Accounting.valueOfSupply = 20000.0; 
//        Accounting.vatRate = 0.05; 
//        Accounting.expenseRate = 0.3;  
//        
        Accounting a1 = new Accounting(); // Accounting 클래스를 복제 - instance  
        a1.valueOfSupply = 10000.0; 
        a1.vatRate = 0.1;
        a1.expenseRate = 0.3; 
        a1.print(); 

        Accounting a2 = new Accounting(); 
        a2.valueOfSupply = 10000.0; 
        a2.vatRate = 0.1;
        a2.expenseRate = 0.3; 
        a2.print(); 

        a1.print();

    }
}</code></pre><p>추가)</p>
<p>댓글에 클래스와 인스턴스의 차이에 대해 기가막힌 비유를 해둔 분의 덧글이 있어서 기억하기 위해 추가해둔다. 
<a href="https://www.boostcourse.org/cs126/lecture/142312/?isDesc=false">내용출처</a></p>
<p>예를 들어 &#39;가수&#39; 클래스가 있다면 그 인스턴스로 &#39;아이유&#39;, &#39;김범수&#39; 등을 만들 수 있다. &#39;가수&#39; 클래스가 &#39;노래하기&#39; &#39;안무하기&#39; 등의 메서드를 가지고 있다면 &#39;아이유&#39;와 &#39;김범수&#39; 인스턴스는 모두 &#39;노래하기&#39; &#39;안무하기&#39; 메서드를 실행할 수 있다. 새 가수를 추가해야 한다고 해서 다시 &#39;가수&#39; 클래스를 만들 필요는 없고, &#39;박효신&#39;이라는 인스턴스를 만들면 된다. </p>
<p>역시나 쉽지 않다 클래스, 인스턴스, 객체지향! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 클래스 만들기 ]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Mon, 27 Jun 2022 08:12:50 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>객체(Object)</strong>는 클래스라는 표현을 쓰기도 한다(객체와 클래스가 완전 동일하지 않다). <strong>클래스</strong>는 서로 연관된 변수와 메소드를 그룹핑하고 거기에 이름을 붙인 것이다. 역시나 정리정돈의 상자이다. </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/7dfe72ab-f215-42e3-9be9-c3324d3b6e97/image.jpg" alt=""></p>
<p>우선은 이클립스에서 Window&gt; Show View&gt; Outline을 선택하면 우측에 AccountingClassApp이라는 클래스에 속해있는 멤버들(변수들과 메소드들)을 확인할 수 있다. 멤버들의 관계를 한번 유심히 봐둔다. </p>
<p>이 상태에서 Accounting이라는 클래스로 한번 묶어서 정리를 해보려고 한다. Accounting 클래스를 생성한다. 그리고 AccountingClassApp 내의 전역변수(fields)들을 Accounting의 멤버로 옮겨준다. 아래의 메소드들도 옮겨준다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/2ea22515-8aa2-4850-8026-edd6077d6ea7/image.jpg" alt=""></p>
<p>그리고 다시 우측의 outline을 통해 class에 따른 멤버들의 관계를 살펴보면 결과가 동일한 코드임에도 구조가 확실히 달라졌음을 알 수 있다. </p>
<p>아, 마지막에 Accounting 클래스의 변수를 가져다 쓴다는 것을 처리해주기 위해서 main 함수 안에 Accounting. 처리를 해줘야 한다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/da0d45e3-0fb1-4add-a195-9d97bffb3394/image.jpg" alt=""></p>
<p>결과는 같지만 accounting에 속해있는 멤버들의 소속관계를 분명하게 함으로써 다른 코드들과 섞여도 상관이 없고, 단순한 이름이어도 그 경계를 분명하게 할 수 있게 된다. </p>
<p>객체지향과 클래스, 인스턴스 참 이해하기 쉽지 않은 개념들이다. 조금 더 자주 마주치고 생각하면서 익숙하게 하도록 노력이 필요할 것 같다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 메소드 만들어보기]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%EB%A9%94%EC%86%8C%EB%93%9C-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%EB%A9%94%EC%86%8C%EB%93%9C-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Mon, 27 Jun 2022 07:46:20 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>메소드(method)</strong>는 서로 연관된 코드를 그룹핑해서 이름을 붙인 정리정돈의 상자로 클래스의 동작을 나타내는 함수이다. </p>
</blockquote>
<pre><code>public class methodApp {

    public static void main(String[] args) {


        double valueOfSupply = Double.parseDouble(args[0]); 
        double vatRate = 0.1;
        double expenseRate = 0.3; 
        double vat = valueOfSupply*vatRate; //여기부터 메소드 만들기 시작! 
        double total = valueOfSupply+vat;
        double expense = valueOfSupply*expenseRate;
        double income = valueOfSupply - expense;
        double dividend1 = income * 0.5;
        double dividend2 = income * 0.3;
        double dividend3 = income * 0.2;

        System.out.println(&quot;Value of Supply: &quot; + valueOfSupply); 
        System.out.println(&quot;VAT: &quot; + vat); 
        System.out.println(&quot;Total: &quot; + total); 
        System.out.println(&quot;Expense: &quot; + expense); 
        System.out.println(&quot;Income: &quot; + income); 
        System.out.println(&quot;Dividend 1: &quot; + (income * dividend1)); 
        System.out.println(&quot;Dividend 2: &quot; + (income * dividend2));
        System.out.println(&quot;Dividend 3: &quot; + (income * dividend3));

    }

}
</code></pre><h3 id="메소드로-추출하기extract-method">메소드로 추출하기(Extract Method)</h3>
<p>오늘 vat부분을 시작으로 메소드를 한번 설정해줘보고자 한다. 해당 부분을 블록처리 해주고 마우스 오른쪽을 클릭 refactor &gt; Extract Method에 들어간다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/25c7d6bc-5655-4654-913c-dfdfe27ba262/image.jpg" alt=""> 
Method name을 입력하고 OK 버튼 누르기! 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/bc5a37b6-836b-4939-86ba-babb152fb426/image.jpg" alt="">
그리고 코드를 돌아가서 확인해보면, 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/1ef246e7-3de5-445a-b533-021fcaa4fcda/image.jpg" alt="">
이렇게 새로운 코드가 추가된다. 코드의 정확한 의미까지는 알 수 없지만(private이라든지 하는) 29, 30번째 줄에서 vat값을 return시켜주기 때문에 변수를 선언해주는 부분에 덕지덕지 수식이 들어가지 않아서 코드가 굉장히 깔끔해졌다. 지금은 1-2줄에 불과한 코드지만 1만줄, 1억줄 이상의 코드였다면 훨씬 더 깔끔해졌음을 체감할 수 있었을 것이다. </p>
<h3 id="지역변수local-variable-vs-전역변수field">지역변수(Local variable) vs 전역변수(Field)</h3>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/a929e76d-0197-4a30-8358-84bd55a455f1/image.jpg" alt=""></p>
<p>여기서 코드를 더 깔끔하게 만들어보고 싶어져서 분홍색 상자에 나온 것처럼 parameters를 위쪽과 아래쪽 모두에서 지워버리면 32번째 줄(빨간 상자)에서 에러가 뜬다. </p>
<p>이유는 valueOfSupply와 vatRate라는 변수는 main함수 내에서만 사용가능한(노란상자 안) 지역변수이기 때문이다. 하지만 30, 31번째 줄의 getVAT() 메소드의 경우 노란색 상자 밖에 선언되어있기 때문에 지역변수를 methodApp(노란색 상자) 전체에서 사용할 수 있는 전역변수로 바꿔주는 작업이 필요하다. </p>
<p>방법은 1. 전역변수로 바꾸고 싶은 지역변수 부분을 복사해서 main함수 위로 붙여넣기해 위치를 바꾸어준다 2. 바꿔줄 변수 블록&gt; 마우스 오른쪽 클릭&gt; refactor &gt; Convert Local Variable to Field (local variable: 지역변수, field: 전역변수) &gt; Access modifier에서 public 선택 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/8a149579-cb28-49d7-b24a-ac949136978c/image.jpg" alt=""></p>
<p>이런 과정을 반복해서 코드 내에서 바꿀 수 있는 것들은 모두 바꾸어 메소드화 시켜준다. </p>
<pre><code>public class methodApp {
    public static double valueOfSupply; 
    public static double vatRate;
    public static double expenseRate; 

    public static void main(String[] args) {

        valueOfSupply = 10000.0; 
        vatRate = 0.1;
        expenseRate = 0.3; 
        //double vat = getVAT(valueOfSupply, vatRate);

        print();
        getIncome(); 
    }

    private static void print() {
        System.out.println(&quot;Value of Supply: &quot; + valueOfSupply); 
        System.out.println(&quot;VAT: &quot; + getVAT()); 
        System.out.println(&quot;Total: &quot; + getTotal()); 
        System.out.println(&quot;Expense: &quot; + getExpense()); 
        System.out.println(&quot;Income: &quot; + getIncome()); 
        System.out.println(&quot;Dividend 1: &quot; + (getIncome() * getDividend1())); 
        System.out.println(&quot;Dividend 2: &quot; + (getIncome() * getDividend2()));
        System.out.println(&quot;Dividend 3: &quot; + (getIncome() * getDividend3()));
    }

    private static double getDividend3() {
        return getIncome() * 0.2;
    }

    private static double getDividend2() {
        return getIncome() * 0.3;
    }

    private static double getDividend1() {
        return getIncome() * 0.5;
    }

    private static double getIncome() {
        return valueOfSupply - getExpense();
    }

    private static double getExpense() {
        return valueOfSupply*expenseRate;
    }

    private static double getTotal() {
        return valueOfSupply+getVAT();
    }

    //private static double getVAT(double valueOfSupply, double vatRate) {
        private static double getVAT() {
        return valueOfSupply*vatRate;
    }
}</code></pre><p>이제 main 메소드 안의 지역 변수들은 필요가 없어졌기 때문에 모두 삭제해도 상관이 없고 이로 인해 main 메소드 안의 동작들은 단순해졌고, 세부적인 동작들은 다른 메소드 안에서 정의되어 프로그램을 사용하는 입장에서 보기 단정한 코드가 되었다. </p>
<p>개인적으로 자바스크립트를 공부할때도 지역변수, 전역변수를 이해하는 것이 쉽지는 않았다. 하지만 예제를 통해서 코드의 에러를 확인하며 작업하니 훨씬 더 이해하기가 편했다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 반복문(while)]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%EB%B0%98%EB%B3%B5%EB%AC%B8while</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%EB%B0%98%EB%B3%B5%EB%AC%B8while</guid>
            <pubDate>Mon, 27 Jun 2022 06:25:54 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>배열과 반복문은 선행 후행의 개념은 아니지만 함께 사용하면 엄청난 효과를 가져온다. </p>
</li>
<li><p>반복문은 조건이 참인 한(&#39;()&#39; 구간), 해당되는 구간을 계속 반복한다. 
배결과 반복문을 같이 사용하면 프로그램을 훨씬 간결하게 만들 수 있다. </p>
</li>
<li><p>앞에서 작성한 APP의 내용을 참고했을 때, 만약 우리가 배당금을 나누어야하는 주주가 1만명이라면? 코드를 몇줄이나 더 추가해야 할까? 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/840d2e37-0313-4bfd-846e-08ac4fca173c/image.jpg" alt=""></p>
</li>
<li><p>While문을 사용한다. </p>
</li>
<li><p>괄호안의 조건이 참이되는 구간까지 계속해서 &#39;{}&#39;안의 내용을 반복한다.</p>
</li>
<li><p>arguments를 10000.0을 넣어주면 이전 코드와 결과가 동일하게 나온다.</p>
</li>
<li><p>사람 수가 몇명이든, 저 부분에서 버그가 발생했든 유지보수도 용이해졌다. </p>
</li>
<li><p>이 부분도 자바스크립트와 유사해서 이해하는게 어렵지는 않았다. </p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 배열(Array)]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%EB%B0%B0%EC%97%B4Array</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%EB%B0%B0%EC%97%B4Array</guid>
            <pubDate>Mon, 27 Jun 2022 05:51:05 GMT</pubDate>
            <description><![CDATA[<p>앞에 작성한 코드에서 코드의 가독성을 좀더 높이기 위해 변수로 설정할 수 있는 것들은 조금 더 변수로 설정해 본다. (하늘색 상자) </p>
<p>이 작업을 통해 코드의 가독성 자체는 높아졌다. 하지만 코드가 길어지고 변수가 많아질수록 변수의 의미를 파악하기가 점점 어려워진다는 한계가 생긴다. 이럴 때 배열(Array)의 사용을 고려해볼 수 있다. </p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/330c3d22-dcfd-4861-96b7-a44fa83ef9a0/image.jpg" alt=""></p>
<p>배열은 쉽게 말해 공구상자와 같은 역할을 한다. rate 1,2,3을 담는 dividenRates라는 상자를 하나 만든다. 거기에 rate1,2,3을 담는다. 배열을 사용하면 코드는 연관된 것들끼리 묶이게 되고 정리정돈 된다. </p>
<p>해당 코드의 실행 결과는 당연히 변화 없이 동일하다. 오히려 코드 자체는 보기가 더 편해졌다. 이 배열은 자바스크립트와 크게 다르지 않아서 이해하는데 어렵지는 않았다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 제어문 - 조건문(if) ]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%EC%A0%9C%EC%96%B4%EB%AC%B8-%EC%A1%B0%EA%B1%B4%EB%AC%B8if</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%EC%A0%9C%EC%96%B4%EB%AC%B8-%EC%A1%B0%EA%B1%B4%EB%AC%B8if</guid>
            <pubDate>Mon, 27 Jun 2022 05:22:57 GMT</pubDate>
            <description><![CDATA[<h2 id="제어문">제어문</h2>
<p>프로그램의 실행 과정을 조건에 따라 바꾸는 것 </p>
<ol>
<li>조건문</li>
<li>반복문 </li>
</ol>
<h3 id="조건문">조건문</h3>
<p>앞에서 작성한 APP에 추가조건을 더 넣고 싶은 경우 어떻게 하면 될까? 
추가 조건은 이익이 10000원을 넘는 경우 세 사람이 5:3:2로 배당금을 가져가고 이익이 10000원을 넘지 않는 경우 한 사람에게 배당금을 몰아주는 것이다. </p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/093a5900-8a2a-4b1c-8722-cc570447e415/image.jpg" alt=""></p>
<ul>
<li>조건문을 작성하고 run을 한뒤 console을 보면 에러다. arguments 값을 입력해주지 않았기 때문이다. </li>
</ul>
<h3 id="1-이익이-10000원을-넘지-않는-경우-5000원일-때">1) 이익이 10,000원을 넘지 않는 경우 (5,000원일 때)</h3>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/63df246e-af05-4a1d-a94f-5ac3be8fd992/image.jpg" alt="">
실행 결과를 보면 Dividend1에게 배당금 3500.0원이 모두 지급되었음을 확인할 수 있다. </p>
<h3 id="2-이익이-10000원을-넘었을-경우-50000원일-때">2) 이익이 10,000원을 넘었을 경우 (50,000원일 때)</h3>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/70c3f6c8-ee32-4088-81a1-036af62e3656/image.jpg" alt="">
실행 결과를 보면 Dividend 1, 2, 3에게 5:3:2로 배당금이 지급되었음을 확인할 수 있다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 배운 기초 내용으로 APP 만들기 ]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%EB%B0%B0%EC%9A%B4-%EA%B8%B0%EC%B4%88-%EB%82%B4%EC%9A%A9%EC%9C%BC%EB%A1%9C-APP-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%EB%B0%B0%EC%9A%B4-%EA%B8%B0%EC%B4%88-%EB%82%B4%EC%9A%A9%EC%9C%BC%EB%A1%9C-APP-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Mon, 27 Jun 2022 04:47:24 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/c11289e6-c701-49da-9387-a3c2b912639a/image.png" alt=""></p>
<h2 id="문제-파악하기">문제 파악하기</h2>
<ul>
<li>판매자(seller)인 우리가 소비자(buyer)에게 물건을 공급할 때 공급가(Value of supply)를 받는다.</li>
<li>공급가의 10%만큼 소비자는 부가가치세(VAT, Value added tax)를 지불하고 판매자는 국세청에 부가가치세를 납부한다. </li>
<li>물건을 판매하기까지 30%의 비용이 들고 나머지 70%가 이익이다.</li>
<li>이익은 투자한 동업자들에게 5:3:2의 비율로 배당한다. </li>
</ul>
<h3 id="1차-작업-내가-할-수-있는-수식을-활용해-굉장히-간단하게-코드-작성해보기">1차 작업: 내가 할 수 있는 수식을 활용해 굉장히 간단하게 코드 작성해보기</h3>
<ul>
<li><p>MyApp이라는 프로젝트를 만들고 그 안에 AccountingApp이라는 class 만들기 </p>
</li>
<li><p>위에 작성한 &#39;문제 파악하기&#39; 단계에서 수식으로 작성 가능한 것들은 한번 해보기 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/f635ee17-d5ee-440a-88c4-a2674e767769/image.jpg" alt=""></p>
</li>
<li><p>문제점: 가격이 변하게 되면 코드를 하나하나 모두 수정해주어야 하는 불편함 존재</p>
</li>
</ul>
<h3 id="2차-작업-변수-도입해보기">2차 작업: 변수 도입해보기</h3>
<ul>
<li><p>변수로 만들고 싶은 것 블록 설정 후 마우스 오른쪽 클릭: 
Refactor&gt; Extract Local Variables 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/3203ad73-9c2d-4e15-b0a3-dece4a34b039/image.jpg" alt=""></p>
</li>
<li><p>변수 이름 입력하고 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/35e495cb-12ee-4378-8e96-fd9ca8cc524c/image.jpg" alt=""></p>
</li>
<li><p>OK 설정하면 변수가 저절로 생성되고, 코드 내의 모든 변수가 바뀐다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/3324809a-05f9-40d8-ada5-2b0944176372/image.jpg" alt=""></p>
</li>
<li><p>OK 옆의 Preview를 누르면 변수 생성 전후를 비교할 수 있다.<br><img src="https://velog.velcdn.com/images/rememberme_jhk/post/ade839cb-18af-49c7-806f-9d08773bc097/image.jpg" alt=""></p>
</li>
<li><p>다른 변수로 바꿀 수 있을 만한 것들을 찾아서 변수 설정을 해준다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/1c779d16-7654-476c-a5c1-acb32f99e816/image.jpg" alt=""></p>
</li>
<li><p>문제점: 공급가를 바꾸면 쉽게 다른 값들도 계산할 수 있게 되었지만 여전히 공급가를 바꾸려면 이클립스를 거쳐서 공급가를 바꾸어야 하는 한계가 존재. Arguments를 받아서 자동으로 필요한 값을 계산할 수 있도록 만들면 좀 더 편하지 않을까! </p>
</li>
</ul>
<h3 id="3차-작업-arguments-입력하고-실행해보기">3차 작업: Arguments 입력하고 실행해보기</h3>
<ul>
<li><p>개발자는 data가 바뀌었다고 코드를 바꾸거나 로직을 바꾸는 것을 선호하지 않는다.
입력값을 주면(argument) 서로 다른 출력값을 주는 APP을 만들어보고 싶다. </p>
</li>
<li><p>Run&gt; Run Configurations&gt; Arguments&gt; Program arguments: 원하는 값 40000.0으로 입력 후 Name도 AccountingApp-40000.0으로 수정 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/6dcf57b1-4b4a-46af-b936-bba13ca3ef38/image.jpg" alt=""></p>
</li>
<li><p>결과를 보면 value of supply가 40000.0으로 바뀌어서 결과가 나오는 것을 확인할 수 있다. </p>
</li>
<li><p>문제점: 여전히 이클립스를 열어서 값을 입력해줘야하는 것이 번거롭다. </p>
<h3 id="4차-작업-이클립스가-아닌-cmd에서-실행여부-확인해보기">4차 작업: 이클립스가 아닌 cmd에서 실행여부 확인해보기</h3>
</li>
<li><p>경로 확인: 프로젝트에 마우스 오른쪽&gt; Property&gt; Resource의 Location에서 확인 가능&gt; 복사 &gt; cmd 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/dd6bcb65-13a2-46b7-9f09-b2393216e001/image.jpg" alt=""></p>
</li>
<li><p>cmd에서 해당 app이 잘 돌아가는지 확인을 해본다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/f9597a6a-3dce-407b-85a5-517df7a507d1/image.jpg" alt=""></p>
</li>
</ul>
<ol>
<li>cd &quot;lacation에서 복사한 경로&quot; 붙여넣기&gt; 해당 경로로 이동  </li>
<li>dir &gt; 디렉터리 확인하기 </li>
<li>AccountingApp.class파일 확인 </li>
<li>java AccountingApp 하면 Exception 메시지: arguments를 입력하지 않았기 때문에 7번째 줄에서 에러가 생긴다는 말 </li>
<li>java AccountingApp 뒤에 30000.0을 입력해줌 </li>
<li>결과가 제대로 나오는 것 확인 </li>
</ol>
<ul>
<li><p>문제점: 다른 컴퓨터에서도 이 App을 실행하고 싶을 수 있다. 소스코드를 가져가고 싶은 경우 AccountingApp.java파일 까지만 가져가도 되지만 .class가 실행파일이기 때문에 저 파일을 실행해주면 된다. 단, 해당 컴퓨터에 JVM이나 JRE가 설치되어 있어야한다. </p>
</li>
<li><p>문제점: JVM이 설치되어 있지 않다면???? 그럼 &#39;launch4j&#39;와 같은 솔루션을 사용하는 방법이 있다. 우리가 짠 파일을 솔루션 파일이 감싸는데 그 솔루션 안에 JVM이 있기 때문에 해당 컴퓨터에 JVM이 설치되어 있지 않아도 APP을 실행할 수 있게 된다. </p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 상속, 오버라이드(override), 트리(tree) ]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%EC%83%81%EC%86%8D-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%93%9Coverride-%ED%8A%B8%EB%A6%ACtree</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%EC%83%81%EC%86%8D-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%93%9Coverride-%ED%8A%B8%EB%A6%ACtree</guid>
            <pubDate>Fri, 24 Jun 2022 07:36:50 GMT</pubDate>
            <description><![CDATA[<h2 id="inheritance상속">Inheritance(상속)</h2>
<p>공식문서에서 PrintWriter를 조금 더 살펴보자. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/ce8c2f05-9cec-4d2a-bdde-cd12a6410b5c/image.jpg" alt=""></p>
<ul>
<li>PrintWriter(보라색 박스, 자식)라는 클래스는 Writer(노란색 박스, 부모)클래스의 상속을 받았고 Writer(자식)는 Object(연두색 박스,부모)라는 클래스의 상속을 받았다. </li>
<li>상속받은 자식은 부모의 변수와 메소드를 모두 사용할 수 있다. </li>
<li>PrintWriter는 Writer가 가진 변수와 메소드를 그대로 가지고 오면서 동시에 필요한 변수와 메소드를 추가한 것이다. </li>
<li>Writer는 Object가 가진 변수와 메소드를 그대로 가지고 오면서 동시에 필요한 변수와 메소드를 추가한 것이다. </li>
</ul>
<p>이클립스 상에서 상속관계를 확인하려면 클래스를 드래그하고 오른쪽 마우스를 클릭, Open Type Hierarchy를 선택해준다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/e2a20530-c7cf-4008-b1a5-ea00e22f88f2/image.jpg" alt=""></p>
<p>그럼 왼쪽에 상속관계를 보여주는 섹션이 생긴다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/a9cfbd1c-6576-4f5e-b883-6784f1e4ce50/image.jpg" alt=""></p>
<ul>
<li>Object &gt; Writer &gt; PrintWriter의 상속관계를 확인할 수 있다. </li>
<li>Object에 toString()이라고 하는 메소드가 있다. Writer와 PrintWriter에서는 toString()이라는 코드를 작성한 적이 없지만, Object의 상속을 받았기 때문에 toString() 메소드를 사용할 수 있다. </li>
</ul>
<h2 id="extends">extends</h2>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/60cd8762-4aef-4ab3-b3fd-beb0bdce37a9/image.jpg" alt=""></p>
<ul>
<li>PrintWriter 클래스를 사용해서 p1이라는 인스턴스를 만든다. </li>
<li>p1.toString()을 실행하게 되면 우선은 PrintWriter 클래스에서 toString()을 찾는다. 없으면 &#39;PrintWriter extends Writer(Writer를 확장에서 PrintWriter를 만듦)&#39;에 따라 Writer로 올라가서 메소드를 찾아보고, Writer 클래스에도 toString()이 없으면 Object 클래스로 올라가서 toString()을 사용하게 된다. </li>
<li>맨 위까지 올라갔는데 toString() 메소드가 없으면 에러가 난다. </li>
</ul>
<h2 id="override">override</h2>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/c4b086b3-f411-4f4c-b9d7-5d2aacedfff6/image.jpg" alt=""></p>
<ul>
<li>toString()의 경우 PrintWriter에도 있고 Writer 클래스에도 있는 메소드이다. </li>
<li>이런 경우 코드를 실행시키면 PrintWriter에 있는 toString()을 가져다 쓴다. </li>
<li>개발자가 Writer에 있는 toString()이 마음에 들지 않아서 PrintWriter에 다시 toString()을 만들어 &#39;덮어 씌우기&#39;를 해버린 것이다. </li>
<li>덮어씌우기 = override </li>
</ul>
<h2 id="tree">Tree</h2>
<ul>
<li>상속관계를 나무에 비유해 보여주는 것 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/9a5bd2e5-750e-4ef7-984f-99632940b449/image.jpg" alt=""></li>
<li>공식 문서에서 자바 라이브러리들의 상속관계를 확인할 수 있다.</li>
<li>모든 라이브러리의 정점에 Object가 있다.</li>
<li>Object가 가진 메소드들은 모든 클래스들이 공통적으로 사용할 수 있다. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 인스턴스(Instance) ]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4Instance</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4Instance</guid>
            <pubDate>Fri, 24 Jun 2022 07:00:00 GMT</pubDate>
            <description><![CDATA[<p>InstanceApp이라는 프로젝트를 만들고 주석에 적힌 내용 순서대로 코드를 작성해준다. </p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/ff9b66a5-ecab-4bb1-91cc-b743dcf54aa2/image.jpg" alt=""></p>
<p>이전에 Math 클래스를 이용해서 코드를 작성했던 것을 기억해보면 PrintWriter도 코드 작성을 저렇게 해주면 이상이 없어야 한다. 그런데 빨간 줄이 생긴다. PrintWriter는 자바에 내장되어 있기는 한데 특별한 작업, 즉 패키지를 가져오는(import) 작업이 필요하기 때문이다.<br><img src="https://velog.velcdn.com/images/rememberme_jhk/post/2ca2f761-d467-4217-82ec-6ffad0938424/image.jpg" alt="">
공식문서에서 PrintWriter를 찾아보면 PrintWriter는 java.io라는 패키지에 들어있음을 확인할 수 있다. 해당 패키지를 import를 해준다. 이 파일 내에서 PrintWriter라는 이름의 클래스는 java.io에 소속되어 있다는 의미를 갖는다. 근데! import를 해줘도 빨간 줄이 남아있다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/d93ab356-0f39-48ce-884b-6239b7f3ba3e/image.jpg" alt=""></p>
<p>파일을 읽다보면 파일이 없다보면 문제가 될 수 있다 즉, 예외상황(exception)이 발생했을 때 그것을 어떻게 처리할지에 대해 정해주지 않았기 때문이다. 여기서 예외상황은 파일을 읽어내려가며 코드를 실행하는 와중에 파일이 없을 경우 생길 수 있는 문제 등을 의미할 수 있다. 일단 예외상황 처리에 대해서는 이해하기 너무 어렵기 때문에 엑스표시를 클릭하고 권장사항 중 하나로 나오는 add throws declaration을 선택해준다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/a730f5d7-d179-4cdc-86cc-a4021b0df2ec/image.jpg" alt="">
남은 코드 작성을 마치고 저장과 실행버튼을 눌러주면 프로젝트 폴더에 result1.txt와 result2.txt파일이 생긴다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/dcc06e4f-e86f-4e0b-a4f5-fc8278a41e5b/image.jpg" alt="">
그리고 각 파일을 클릭해서 들어가면 원했던 것처럼 hello1과 hello2라는 텍스트가 잘 들어가있다.
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/16104cf0-9e9c-424f-a949-5bed310b8b39/image.jpg" alt=""></p>
<p>이제 이전에 사용했던 Math 클래스와 PrintWriter 클래스의 차이를 살펴보자. Math의 경우 그냥 클래스 Math에 변수(PI)와 메소드(floor, ceil)를 써줬다. 그런데 PrintWriter는 변수와 메소드를 바로 쓰지 않고 new를 붙여줬다. 그리고 그 복제한 결과를 p1과 p2에 담았다. 왜 이렇게 해야할까? 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/67bcaeef-c631-465e-b6ca-aff3d568b4e7/image.jpg" alt=""></p>
<p>만약을 생각해보면 왜 인스턴스가 필요한지 알 수 있다. PrintWriter가 바로 Write라는 메소드를 붙여 사용할 수 있다면? 실제로는 동작하지 않지만 &#39;PrintWriter.write(&quot;&quot;)라고 쓸 수 있다고 가정하면,</p>
<pre><code>PrintWriter.write(&quot;result1.txt&quot;, &quot;hello 1&quot;);</code></pre><p>이렇게 코드를 작성할 수 있을 것이다. 그럼 result2부터 수십억개의 결과를 나오도록 해야 한다면? write를 할때마다 어떤 파일을 수정할지 하나하나 지정하고 있는데 이것은 상당히 비효율적이다. 하지만 인스턴스를 사용하게 되면, 예를 들어서 내가 result151.txt에 내용을 기록하고 싶은 경우</p>
<pre><code>PrintWriter p151 = new PrintWriter(&quot;result151.txt&quot;);
p151.write(&quot;hello151&quot;);
p151.close(); </code></pre><p>만 해주면 작업이 끝난다. </p>
<p>그런데 클래스에 직접 write를 하는 방식은 어떤 파일을 수정하고 싶을 때마다 상태를 그때그때 이야기해주어야 하는 귀찮음이 생긴다. 이유는 PrintWriter라는 하나의 클래스를 write라는 메소드가 돌려쓰고 있기 때문이다. </p>
<p>하지만 new를 통해서 인스턴스를 생성해주는 순간! 그 인스턴스는 내부적으로 각자의 상태를 가지게 된다. 즉, p1은 result1.txt를 p2는 result2.txt라는 내부적인 상태를 내장하게 되기 때문에 p1.write를 하게 되면 그건 result1에 관한 것이 되고 p2.write는 result2에 관한 것을 담당하게 된다. </p>
<p>Math는 일회적인 작업을 하지만 PrintWriter는 여러 개의 파일을(긴 맥락의) 작업하게 될 수도 있는 연속성을 가진다. 이럴 경우 하나의 클래스를 사용하기 보다는 new를 붙여 각각의 다른 상태를 가지고 있는 인스턴스를 만들어서 그 인스턴스를 사용하는 것이 더 효율적일 수 있다. </p>
<p>그럼 어떤 클래스는 인스턴스를 만드는게 좋은지 알 수 있는 방법이 있을까? 공식 문서에 가서 constructor Summary가 있는 경우 인스턴스를 만드는 게 허용된다고 우선은 간단하게 생각해두자. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/19ab2159-c6d2-46da-92fa-b9da95a9ec35/image.jpg" alt=""></p>
<p>실제로 공식문서에 들어가서 확인해보면 Math에는 constructor에 관한 내용이 없는데 PrintWriter에는 constructor에 관한 내용이 있다. 이번에 사용한 건 네모박스 쳐둔 것이고 해당 내용을 클릭하면 detail한 내용이 나온다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/797d7d56-780c-4914-98cf-5909025da20a/image.jpg" alt=""></p>
<p>정리해보면,
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/8f05e6c4-2528-44cb-b0e7-c1b393b5133c/image.jpg" alt=""></p>
<p>우리가 어떤 클래스를 사용할 때 그 클래스를 만든 사람이 클래스를 인스턴스로 활용하기를 원한다면 constructor라는 것을 가지고 있고 노란박스로 처리한 부분이 constructor가 된다. 그 constructor앞에 new를 붙이면 그게 복제되서(연두색 박스) 인스턴스가 되고 그 인스턴스에 어떤 값이 올수 있느냐를 규제하기 위해서 앞에 PrintWriter라고 하는 클래스 이름(보라색 박스)을 적는다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 클래스(Class), 패키지(Package) ]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%ED%81%B4%EB%9E%98%EC%8A%A4Class-%ED%8C%A8%ED%82%A4%EC%A7%80Package</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%ED%81%B4%EB%9E%98%EC%8A%A4Class-%ED%8C%A8%ED%82%A4%EC%A7%80Package</guid>
            <pubDate>Fri, 24 Jun 2022 05:33:46 GMT</pubDate>
            <description><![CDATA[<h2 id="java-api-documentation">JAVA API Documentation</h2>
<p><a href="https://docs.oracle.com/javase/8/docs/api/">Java™ Platform, Standard Edition 8 API Specification</a></p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/84fff94e-9a5e-4651-91df-3eca154e5a6d/image.jpg" alt="">
해당 링크를 타고 들어오면 왼쪽에 packages와 classes 정보가 나온다. packages의 것 중 하나를 누르면 아래에 그 패키지에 속한 class의 정보가 주룩 펼쳐진다. 익숙한 Math class를 왼쪽 아래 섹션에서 찾아본다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/8120f4b8-be63-49a2-a49e-cde9d98d0fab/image.jpg" alt="">
Math class는 위와 같은 형식으로 구성되어 있는데 java.lang 패키지(package)에 속해 있다는 것을 알 수 있다. </p>
<p>조금 더 스크롤해서 보면 PI와 같은 변수(Variable/Field)들에 대해서도 나와있고 이전에 사용했던 floor, ceil등 메소드(method)들의 정보도 나와 있다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/ee012709-9108-4e8d-b9f6-5f84db4ca3be/image.jpg" alt=""></p>
<h3 id="클래스class">클래스(Class)</h3>
<p>&#39;하나의 프로그램이다 혹은 디렉토리다&#39;라고 간단히 생각한다. Math 클래스처럼 클래스 안에는 PI와 같은 변수, floor, ceil과 같은 메소드들이 포함되어 있다. 서로 연관된 변수와 메소드를 묶어서(Grouping) 이름을 붙인 것이라고 생각하면 간단하다.<br><img src="https://velog.velcdn.com/images/rememberme_jhk/post/a57353a1-67be-4f2d-beb1-4475c24c5254/image.png" alt=""></p>
<h3 id="패키지packages">패키지(Packages)</h3>
<p>클래스가 엄청나게 많은데 정리정돈되지 않고 흩어져 있으면 필요한 것을 찾아 사용하는게 매우 어렵다. 또 이미 Math라는 클래스가 있는데 우리가 Math라는 이름의 새로운 클래스를 또 만들고 싶을 때, 같은 공간에 Math가 있으면 충돌할 수도 있다. 이처럼 연관되어 있고 비슷한 속성을 가진 클래스끼리 하나의 묶음으로 정리한 것이 패키지(Package)이다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/2a7bf900-bcd2-4b91-b366-9e20f67aa687/image.png" alt="">
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/d8496315-9c13-489b-8138-73f15977edb5/image.jpg" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] API, UI ]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA</guid>
            <pubDate>Fri, 24 Jun 2022 05:04:36 GMT</pubDate>
            <description><![CDATA[<h2 id="apiapplication-programming-interface">API(Application Programming Interface)</h2>
<ul>
<li>응용 프로그램에서 사용할 수 있도록, 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스 (위키피디아)</li>
<li>프로그램과 또 다른 프로그램을 연결해주는 일종의 다리 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/024387fa-d890-442e-999a-8f79b5a4e8a7/image.png" alt=""></li>
</ul>
<p>우리는 컴퓨터를 사고 그 위에 window, linux, ubuntu와 같은 운영체제(OS)를 설치하고 자바를 이용해 프로그램을 만든다. 자바는 우리가 쉽게 프로그램을 만들 수 있도록 기본적으로 내장하고 있는 기능들을 제공하는데(Date, Math, PrintWriter와 같은) 이것들을 라이브러리라고 한다. 우리는 자바가 제공하는 문법을 통해서 시간의 순서에 따라(Programming) 자바가 제공하는 기본 라이브러리를 실행되도록해 프로그램을 만드는 것이다. </p>
<p>프로그램을 만들 때 자바의 도구들을 응용해서(Application) 우리가 원하는 작업을 시간적 순서에 따라(Programming) 동작하도록 만든다. 우리가 자바를 응용해서 프로그래밍적으로 실행되는 프로그램을 만들기 위해서 사용해야하는 조작장치들, 조작방법을 API라고 부르는 것이다. </p>
<p>조금 더 예를 들어 스마트폰에 있는 홈버튼을 생각해 볼 수 있다. 홈버튼은 사용자로 하여금 홈화면으로 돌아갈 수 있게끔 도와주는 방법이자 수단이다. 즉, 사용자와 스마트폰을 이어주는 매개체인 셈이다. </p>
<p>또 다른 예로 웹서비스를 제작한다고 가정했을 때 일기예보 정보를 내가 만든 웹페이지에 띄우려고 하거나 지도를 이용한 웹서비스를 제작하고 싶다면 어떻게 해야할까? 보통 일반 사람들에게는 위의 기능들을 제공할만한 기반이 되는 데이터도 없고 관련 프로그램도 없다. 하지만 인터넷상에서 제공되는 API를 이용한다면? </p>
<p>운영체제나 프로그래밍 언어가 제공하는 기능을 날씨정보, 지도정보라고 하고 응용 프로그램을 우리가 만든 서비스라고 이해하면 편하다. </p>
<p>간단하게 AIP란 내가 만든 프로그램이 개인 개발자, 기업, 기관이 제공하는 기능, 프로그램 등을 활용할 수 있게끔 도와주는 중간 매개체이다.</p>
<p>어떤 API가 있고, 어떻게 API를 사용하는지를 많이 알고 개발을 풍부하게 하는 데 좋다. </p>
<h2 id="uiuser-interface">UI(User Interface)</h2>
<p>우리가 만든 자바 프로그램을 사람이 사용한다고 했을 때, 사용자가 자바 프로그램을 사용할 수 있도록 만들어둔 장치들을 UI라고 한다. 예를 들어, 커맨드라인 시스템의 arguments, 데스크톱 앱의 버튼, 웹 페이지의 link 등이 있다. </p>
<ul>
<li>국가에서 제공하는 공공API <a href="https://www.data.go.kr">공공데이터포털</a></li>
<li>관련된 또다른 글 <a href="https://velog.io/@rememberme_jhk/JS-%ED%83%80%EC%9D%B4%EB%A8%B8-API">타이머 API</a></li>
<li>자바 API 관련 공식페이지 <a href="https://docs.oracle.com/javase/8/docs/api/">Java platform, API specification</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 직접 컴파일 실행하기 ]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%EC%A7%81%EC%A0%91-%EC%BB%B4%ED%8C%8C%EC%9D%BC-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%EC%A7%81%EC%A0%91-%EC%BB%B4%ED%8C%8C%EC%9D%BC-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 22 Jun 2022 07:24:21 GMT</pubDate>
            <description><![CDATA[<h2 id="간단한-프로그램-직접-컴파일-하기">간단한 프로그램 직접 컴파일 하기</h2>
<ul>
<li>javac - java를 컴파일해주는 역할  </li>
<li>java와 javac 설치경로 확인<br>C: &gt; Program files &gt; Java &gt; bin(binary) &gt; java.exe / javac.exe </li>
<li>환경변수: 자바라고 명령을 내렸을 때, 저 명령이 현재 어디에 있든 실행되는 이유는 path라고 불리는 환경변수 때문이다. </li>
<li>환경변수: 내 컴퓨터 &gt; 속성 &gt; 고급 시스템 설정 &gt; 환경 변수 </li>
<li>내 컴퓨터에만 설정된 것 (위쪽 사용자 변수)
이 시스템을 사용하는 모든 사람에게 적용되는 설정 (아래쪽 시스템 변수) </li>
</ul>
<p>*<em>추가정보 *</em>
<a href="https://www.java.com/ko/download/help/path.html">Path 시스템 변수 설정</a></p>
<h3 id="cmd에서-컴파일-하기윈도우-기준">cmd에서 컴파일 하기(윈도우 기준)</h3>
<ul>
<li>검색창에 cmd라고 입력한다. </li>
<li>테스트를 위해 기존에 있던 .java와 .class파일을 활용해본다.</li>
<li>미리 작성해둔 파일에서 .java만 남기고 .class파일은 삭제한다.</li>
</ul>
<h4 id="프로젝트-디렉토리로-이동하기">프로젝트 디렉토리로 이동하기</h4>
<p>cmd에 javac 라고 입력한다. javac는 java파일을 컴파일해서 class파일을 만들어주는 역할을 한다. cmd를 자세히보면 Usage가 있다. </p>
<pre><code>Usage: javac &lt;options&gt; &lt;source files&gt;</code></pre><p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/1b6661ac-3257-48ad-ba36-d823cdc0cf46/image.jpg" alt=""></p>
<ul>
<li>.java파일의 경로 확인(source files 입력을 위해)을 위해서 윈도우 검색창에 &#39;파일 탐색기&#39;를 입력한다. .java파일이 있는 곳까지 찾아서 들어간 뒤 파일 경로를 복사한다. </li>
<li>cmd에서 cd 명령어 뒤에 파일 경로를 복붙해서 프로젝트 디렉토리로 이동시켜 준다. </li>
<li>dir 명령어로 디렉토리 내부 구조를 확인할 수 있다(.java파일만 있고 .class는 없음을 알 수 있다). </li>
</ul>
<h4 id="자바-파일-컴파일하기">자바 파일 컴파일하기</h4>
<ul>
<li><p>앞에서 이미 찾아둔 Usage에 맞게 cmd에 입력해준다. &quot;javac + (Source files)파일경로&quot; </p>
</li>
<li><p>이때, javac.exe가 위치해 있는 경로가 path에 등록되어 있는 상태여야 javac를 사용할 수 있다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/334322e0-76df-41c0-a28e-7e2e25a75503/image.jpg" alt=""></p>
</li>
<li><p>dir 명령어로 디렉토리 내부 구조를 다시 보면 .class파일이 생긴 것을 확인할 수 있다. </p>
</li>
<li><p>이 class파일은 컴퓨터가 이해할 수 있는 상태로 바꾼 것이다(compile).</p>
</li>
<li><p>JVM(java)이 OS에 설치되어 있다는 전제하에 컴퓨터가 이해할 수 있다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/5132a2e6-8879-475f-bb9a-e1ff07ca1d8b/image.jpg" alt=""></p>
</li>
</ul>
<h4 id="실행하기">실행하기</h4>
<ul>
<li>컴파일된 프로그램을 실행하기 위해서는 cmd에서 java 명령어를 사용하면 되는데 이때 .class는 붙이지 않는다. </li>
<li>출력 순서: 
java는 우리가 작성한 코드에서 
1) cmdtest라는 이름을 가진 class를 찾는다 
2)class 내부에서 main이라는 이름을 가진 method를 찾아서
3) main 내부의 코드를 실행시킨다. </li>
<li>결과가 나오는 것을 확인할 수 있다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/5dd07136-8e33-4600-94f0-6a48577d5da8/image.jpg" alt=""></li>
</ul>
<h2 id="라이브러리-사용하는-프로그램-직접-컴파일하기">라이브러리 사용하는 프로그램 직접 컴파일하기</h2>
<p>이전에 만든 파일 중 외부 라이브러리 객체를 사용하는 프로그램을 선택해 직접 컴파일을 해본다. &#39;OKJavaGoinHome&#39;이라는 프로그램이다. 코드에서 Elevator와 관련된 코드가 없음에도 사용할 수 있는 이유는 위에서 import를 통해 OKJavaGoinHome 클래스가 있는 폴더의 org.opentutorials.iot의 클래스들을 불러들이고 있기 때문이다. </p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/e16be633-cef2-4443-bfb2-a7d5a854d58d/image.jpg" alt=""></p>
<p>테스트를 위해서 lib라는 parent폴더를 만들어주고 org 폴더를 그 아래로 복붙한다. .class파일은 모두 삭제한다. org.opentutorials.iot 패키지는 OKJavaGoinHome과 동일한 위치에 있지 않고 lib 라이브러리의 일부가 되었다. 이때 다시 컴파일 한다면? </p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/8797164b-a014-4db1-a85c-00f70921c38e/image.jpg" alt=""></p>
<p>우리가 컴파일하는 파일과 같은 디렉토리에 있지 않기 때문에 error가 나오게 된다. 해결을 위해 cmd에 javac 명령어를 입력해본다. 그럼 아래 class path라는 것이 나온다. 컴파일하려고 하는 클래스들이 어디에 있는지 이야기해주어야 찾아가서 실행할 수 있다는 내용이다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/ddf558fb-6fc6-4f3c-b3dc-b82624c9488b/image.jpg" alt=""></p>
<p>cmd에 javac를 입력하고 &#39;-cp&#39;를 입력한다. &#39;-cp&#39;는 클래스를 여기서 찾아주세요&#39;라는 것으로 쌍따옴표 안에 &quot;.;lib&quot;를 쓰면 &#39;.&#39;은 현재 디렉토리를 말하고 &#39;;(윈도우의 경우는 세미콜론)&#39;, lib 디렉토리에서도 추가로 찾아봐달라는 뜻이다. 엔터를 했을 때 아무런 에러도 뜨지 않으면 제대로 컴파일 되어서 삭제했던 모든 class 파일들이 다시 생긴 것이다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/6671d4e8-60c1-41b5-9c8d-12f72c4c1893/image.jpg" alt=""></p>
<p>그럼 제대로 실행하는지 다시 cmd에 &#39;java OKJavaGoinHome&#39;을 입력해보는데 Exception이 나오면서 Elevator를 찾을 수 없다고 나온다. 이유는 Elevator가 lib 아래에 있기 때문이다. &#39;-cp&#39;를 통해서 lib 아래도 찾아보라고 명령해준다. &#39;-cp&#39;에 lib만 입력해주면 자바를 실행시키는 디렉토리에서만 &#39;OKJavaGoinHome&#39; 클래스파일을 찾도록 약속되어 있기 때문에 현재 디렉토리에서도 찾도록 표시해주어야 한다.  </p>
<p>현재 디렉토리에서 OKJavaGoinHome.class 파일을 열어서 실행시키다가 elevator가 있으면 lib의 클래스 파일을 찾아서 실행시키는 것이 되는 것이다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/4af5cb1c-e861-4dbf-a5c3-a25d58b2516c/image.jpg" alt=""></p>
<ul>
<li>라이브러리: 타인이 만든 잘 정리된 프로그램 </li>
</ul>
<h2 id="터미널-환경에서-arguments-입력해서-출력하기">터미널 환경에서 Arguments 입력해서 출력하기</h2>
<ul>
<li>OKJavaGoinHomeInput.java를 컴파일</li>
<li>OKJavaGoinHomeInput 프로그램 실행: 에러가 나오는데 이유는 기존 코드에서 args 파라미터를 이용해 값을 받고 있는데 터미널에서 arguments를 주지 않고 있기 때문이다. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/7db3835a-77c0-4a7d-9d55-2654b32c283c/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/aab33880-0ee2-43b0-8178-66db30e33ae8/image.jpg" alt=""></p>
<ul>
<li>cmd에 java OKJavaGoinHomeInput을 입력하고 그 뒤에 args에 넣고 싶은 arguments 2개의 문자열을 차례로 입력한다. </li>
<li>잘 출력되어서 나온다. </li>
<li>arguments를 다른 것으로 바꾸어도(&quot;Pusan APT 803&quot; 45.2) 잘 출력된다. 두번째 인자의 따옴표는 생략 가능하다. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 입력과 출력 ]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%EC%9E%85%EB%A0%A5%EA%B3%BC-%EC%B6%9C%EB%A0%A5</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%EC%9E%85%EB%A0%A5%EA%B3%BC-%EC%B6%9C%EB%A0%A5</guid>
            <pubDate>Wed, 22 Jun 2022 04:30:19 GMT</pubDate>
            <description><![CDATA[<h2 id="프로그램의-입력과-출력">프로그램의 입력과 출력</h2>
<p>프로그램은 입력정보를 받아서 출력을 하는 것이라고 할 수 있다. 입력 정보는 문자열, 숫자 등의 Arguments가 될 수도 있고, 파일(File), 네트워크(Network)를 통해 받은 정보, 소리(Audio), 다른 프로그램에서 출력된 정보 등이 될 수도 있다.</p>
<p>출력 정보 역시 화면에 출력할 수 있고 파일에 쓸 수도, 소리로 내보낼 수도 있다. 또 다른 프로그램을 출력할 수도 있다. </p>
<p>기존에 작성했던 코드에서 변수 id를 사용자가 입력하도록 해서 프로그램을 실행할 때마다 다른 값을 가질 수 있게 한다면 어떨까? 사용자가 입력한 값에 따라서 다른 동작을 할 수 있게 한다면 범용적으로 사용할만한, 일반인도 사용할 수 있는 프로그램이 되지 않을까. </p>
<h3 id="팝업에-사용자가-id-입력하도록-하기">팝업에 사용자가 id 입력하도록 하기</h3>
<p>이전에 작성해둔 코드의 카피본을 만들어서 테스트해본다. </p>
<ol>
<li>새로운 파일 이름(OkJavaGoinHomeInput)과 class 이름을 통일해준다. </li>
<li>id 부분을 &quot;JAVA APT 803&quot;으로 고정하지 않고 POPUP을 띄워서 사용자가 아파트 정보를 입력하도록 하고 싶다.
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/ea875cb8-85b8-44a3-a268-dccd59dfa60c/image.jpg" alt=""></li>
</ol>
<ol start="3">
<li>구글에 &quot;java popup input text swing&quot;이라고 검색해본다. </li>
<li>&quot;JOptionpane.showInputDialog()&quot;라는 것이 있다는 것을 알 수 있다(stack over flow). </li>
<li>복붙해서 id 자리에 대신 넣어주면 빨간 줄이 가는데 이유는 해당 내용(JOptionpane)을 import 해주지 않았기 때문이다. &quot;import javax.swing.JOptionPane&quot;을 한다. </li>
<li>그리고 실행해보면 팝업이 나온다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/39e849e4-000d-4adf-b0f2-de835790f76e/image.jpg" alt=""></li>
<li>팝업창에 새로운 ID를 입력하고 저장 후 실행해보면 콘솔에 새로 입력한 값으로 모두 바뀌어 실행되는 것을 볼 수 있다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/8072939b-1af4-41f6-92f5-8815dbbd205f/image.jpg" alt="">
매우 신기하다.. </li>
</ol>
<h3 id="입력값-추가하기">입력값 추가하기</h3>
<p>이번에는 무드등에 불을 들어오게 하고 싶고, 아까와 마찬가지로 사용자가 무드등의 밝기를 입력하도록 하고 싶다면? </p>
<ol>
<li><p>기존 org package에서 DimmingLights라는 것을 import해준다(빨간 박스).
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/97472e6c-e959-462f-9aa7-8fb765730cc9/image.jpg" alt=""></p>
</li>
<li><p>moodLamp에 &#39;.setBrihgt&#39;라는 method를 쓰고 싶은데 ()안에 double이 들어간다(이건 설정되어 있는 것이라, 마우스를 대면 알 수 있다). </p>
</li>
<li><p>상단에 bright라는 변수를 설정해주고 아까 위의 id와 동일하게 할당한다. </p>
</li>
<li><p>그런데 초록색 박스의 결과는 string이다.</p>
</li>
<li><p>보라색 박스 안에 들어갈 인자는 double이기 때문에 string을 double로 convert해주어야 한다.</p>
</li>
<li><p>구글에 &quot;java string convert to double&quot;이라고 검색해본다. </p>
</li>
<li><p>&quot;Double.parseDouble()&quot;이라는 것이 있다는 것을 알 수 있다.</p>
</li>
<li><p>입력해준다. 그러면 팝업이 나오고, 팝업 안에 숫자를 입력해주고 실행하면! 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/bf9f28e2-bee2-4d61-a94e-5cd68777af08/image.jpg" alt=""></p>
</li>
<li><p>PUSAN APT 101에 moodLamp가 bright 10으로 켜졌음을 알 수 있다! </p>
</li>
</ol>
<p>*<em>추가자료 *</em>
<a href="https://docs.oracle.com/javase/7/docs/api/javax/swing/JOptionPane.html">Class JOptionPane</a></p>
<h2 id="arguments인자를-입력받아-프로그램-실행시키기">Arguments(인자)를 입력받아 프로그램 실행시키기</h2>
<p>Dialogue popup을 통해 입력값을 받아서 프로그램을 실행시키는 방법 이외에도 main method의 args 파라미터(parameter)를 이용해 입력값을 받는 방법도 있다. </p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/e25a8431-9199-43d6-82fc-c8e529111789/image.jpg" alt=""></p>
<ul>
<li>Run Configuration 선택
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/3a60bc1c-4357-46a4-a6f1-283f6a4f829c/image.jpg" alt=""></li>
<li>Arguments 선택 </li>
<li>Program arguments에 입력값 입력, 문자열의 경우 하나로 인식되도록 하기 위해서 따옴표(&#39;&#39;)로 묶어준다. 작은따옴표로 에러가 나면 큰 따옴표(&quot;&quot;)로 묶어준다. (나의 경우 &quot;&quot;로 묶어주니 에러가 나지 않았다)  </li>
<li>Apply</li>
<li>file 이름 바꾸어서 구분 </li>
<li>Run </li>
</ul>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/bfb77c84-b3fa-4f76-8a98-37ea3ffd525b/image.jpg" alt=""></p>
<ul>
<li>args는 변수 중에서도 사용자와 프로그램의 값을 매개해주는 역할을 하는 변수로, 매개변수(parameter)라고 한다.</li>
<li>arguments를 입력하게 되면 main 메소드의 args parameter는 arguments 값을 받아서 동작하게 된다.</li>
<li>args는 문자열 배열(array)로 여러 개의 string 데이터가 들어있을 수 있다. </li>
<li>인덱스(index)를 통해 배열의 데이터를 꺼내 쓸 수 있고 index는 0부터 시작한다. </li>
<li>앞에서 변수로 2개(PUSAN APT 302, 45.0)를 입력해주었기 때문에 처음 id는 &#39;args[0]&#39;으로 두번째는 &#39;args[1]&#39;로 할당한다. </li>
<li>&#39;String[]&#39;은 문자열로만 이루어져 있는 배열(Array)을 말한다. </li>
</ul>
<h3 id="arguments인자와-parameter매개변수의-차이">Arguments(인자)와 Parameter(매개변수)의 차이</h3>
<p>출처: <a href="https://stackoverflow.com/questions/156767/whats-the-difference-between-an-argument-and-a-parameter">stack over flow</a></p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/c1526c6f-1046-44b5-8180-2be379ae2535/image.png" alt=""></p>
<ul>
<li><p>Parameter is variable in the declaration of function. PLACEHOLDER (This means a placeholder belongs to the function naming and be used in the function body)</p>
</li>
<li><p>Argument is the actual value of this variable that gets passed to function. ACTUAL VALUE (This means an actual value which is passed by the function calling)</p>
</li>
</ul>
<h2 id="값을-어떻게-받아오는지-확인하기">값을 어떻게 받아오는지 확인하기</h2>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/c512c508-4720-4208-b62e-5cc7c1da8560/image.jpg" alt=""></p>
<ul>
<li>디버깅을 통해서 값을 어떻게 받아오는지 확인해볼 수 있다.</li>
<li>String[2]로 &quot;PUSAN APT 302&quot;와 &quot;45.0&quot;으로 값이 잘 들어가는 것을 확인할 수 있고 각 코드의 id에도 &quot;PUSAN APT 302&quot;가 잘 들어감을 확인할 수 있다. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 디버거 ]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%EB%94%94%EB%B2%84%EA%B1%B0</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%EB%94%94%EB%B2%84%EA%B1%B0</guid>
            <pubDate>Tue, 21 Jun 2022 07:38:51 GMT</pubDate>
            <description><![CDATA[<p>bug: 우리가 짠 코드에서 발생한 의도하지 않은 문제 
debug, debugging: bug를 잡는 것 
debugger: bug를 잡는 도구 </p>
<h2 id="디버거-버튼-누르기-전">디버거 버튼 누르기 전</h2>
<h3 id="브레이크-포인트break-point-지정하기">브레이크 포인트(break point) 지정하기</h3>
<p>실행시키고 싶은 줄의 왼편을 더블클릭하면 화살표가 생기는데 여기가 바로 브레이크 포인트가 된다.<br>브레이크 포인트를 다시 더블클릭하면 브레이크 포인트를 지울 수 있다.
우측 상단에 Perspective(관점)가 Java EE로 되어 있다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/a9be0cdf-e686-4ddb-a8b0-f238506e0a8f/image.jpg" alt=""></p>
<h2 id="디버깅-시작">디버깅 시작</h2>
<p>브레이크 포인트를 지정한 상태에서 벌레모양 버튼(debugger)을 클릭하면 브레이크 포인트까지 코드가 실행되고 그 이후 코드까지는 실행이 되지 않은 채 일시정지를 한다. 
perspective가 Debug로 전환되면서 스크린 구성이 아예 달라지게 된다. </p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/525e1428-861d-45b5-bbca-474bb070a5b0/image.jpg" alt=""></p>
<h3 id="step-over">step over</h3>
<p>step over 버튼을 클릭하면 다음 줄에 브레이크 포인트가 생성되어서(빨간 박스) 그 지점까지만 코드가 실행된다. 명령어를 한줄 한줄 실행해주기 때문에 variables 창에서 변수 하나하나의 상태를 확인할 수 있다.  </p>
<h3 id="resume">resume</h3>
<p>resume 버튼을 누르면 그 다음 브레이크 포인트를 설정해 놓은 곳까지 코드가 실행되고(파란 박스) 브레이크 포인트를 설정해두지 않았다면 끝까지 코드가 실행된다. 우측의 variables 탭에서 변수 하나하나의 상태를 확인할 수 있다. </p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/99d80fa2-31bc-44b1-a8bd-7246bb4a6e8f/image.jpg" alt=""></p>
<h2 id="자세한-실행-과정-들여다보기">자세한 실행 과정 들여다보기</h2>
<h3 id="step-into">step into</h3>
<p>메소드가 실행되는 줄에서 Step into 버튼을 누르면 코드의 자세한 실행 과정을 들여다볼 수 있다. Security 변수의 on 메소드가 실행되는 줄을 더블클릭하고 step into 버튼을 누르면 해당 코드가 있는 페이지로 넘어가서(Security.java) Security 객체의 off 메소드 코드가 실행되는 과정을 확인할 수 있다. 상단에서는 어느 thread의 몇번째 줄 method가 동작하는지까지 확인할 수 있다. </p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/dd8e7eee-f9f5-446b-a041-f3f41f22209d/image.jpg" alt=""></p>
<h3 id="step-return">step return</h3>
<p>다시 원래 코드로 돌아가고자 할 경우 step return 버튼을 클릭해 돌아간다. </p>
<h2 id="디버깅-종료">디버깅 종료</h2>
<p>terminate 버튼을 클릭한다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] IoT 프로그램 만들기 ]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-IoT-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-IoT-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Tue, 21 Jun 2022 06:24:13 GMT</pubDate>
            <description><![CDATA[<p><strong>org라는 package</strong>가 있다. 이 안에 들어있는 부품(소스코드)를 활용해서 나만의 애플리케이션을 만들어본다. </p>
<p>일이 일어나는 순서를 먼저 생각하고 주석으로 간단히라도 작성해본다. </p>
<ol>
<li>엘레베이터를 1층으로 부른다</li>
<li>우리집 보안이 해제된다</li>
<li>불이 켜진다 </li>
<li>에어컨이 켜진다 </li>
</ol>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/ca626c94-9406-4121-b30b-8b0df45b4747/image.jpg" alt=""></p>
<ul>
<li><p>org&gt;opentutorials&gt;iot의 Elevator라는 코드를 가져다 쓰고 싶으면 &#39;org.opentutorials.iot.Elevator&#39;라고 작성해주면 되지만 귀찮기 때문에 상단에 import(불러온다)해준다. 더 간단하게는 Elevator, Security, Lighting, Aircon같은 클래스를 입력하고 <strong>ctrl+space</strong>를 누르면 저절로 import가 된다.</p>
</li>
<li><p>그럼 Elevator라는 클래스(class)가 만들어지고 사용할 수 있게 된다. </p>
</li>
<li><p>Elevator는 myElevator의 datatype이고, myElevator는 변수이다. </p>
</li>
<li><p>.callForUp()이나 .off(), .on()처럼 괄호로 시작해서 끝나는 것들을 메소드(method)라고 한다. </p>
</li>
<li><p>&quot;JAVA APT 803&quot;이 반복되는데 이걸 id라는 변수로 상단에서 지정해버리면 코드가 간결해지고 id만 바꿔주면 모든 변수가 자동으로 변하게 되어서 편리하다. </p>
</li>
</ul>
<p>지금은 상상의 나래를 펼쳐서 코드를 작성한 것이지만 이게 정말로 실생활에서 적용가능해진다면 정말 어마어마한 일들을 해낼 수 있을 것 같다! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 변수(variable) ]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%EB%B3%80%EC%88%98variable</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%EB%B3%80%EC%88%98variable</guid>
            <pubDate>Tue, 21 Jun 2022 05:05:40 GMT</pubDate>
            <description><![CDATA[<h2 id="변수와-데이터-타입">변수와 데이터 타입</h2>
<ul>
<li>변수 지정 시 데이터 타입을 먼저 선언 
(자바스크립트의 경우 데이터타입을 먼저 선언해주지 않고 let, const 등을 이용해 변수 선언을 했기 때문에 처음에 좀 헷갈렸다) </li>
<li>수학에서 변수는 &#39;수식에 따라 변하는 값&#39;으로 숫자만 사용할 수 있는데 자바에서의 변수는 &#39;데이터 저장과 참조를 위해 할당된 메모리 공간&#39;으로 어떠한 value값을 저장하고 이를 나중에 사용하기 위해 이름을 부여하는 것과 비슷한 의미이다. 또한 정수, 실수, 문자열을 구분하며 문자(열)을 담을 수 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/5a497228-68ad-4d2d-b6a9-183e7d5e698c/image.png" alt=""></p>
<ul>
<li><strong>데이터 타입을 지정하는 이유:</strong> 
변수의 데이터 타입을 바로 판단할 수 있고 저장공간을 효율적으로 사용하기 위함이다. 
기가 막힌 비유로, 빈 물컵에 보라색 액체가 있을 때 물컵의 액체가 무엇인지를 알아보기 위해서는 향도 맡아보고 맛도 보는 여러 과정을 거쳐야하지만 라벨이 붙어있는 포도주스 병에 담긴 보라색 액체는 보기만 해도 바로 포도주스라는 것을 알아차릴 수 있다.</li>
</ul>
<h2 id="숫자정수-실수와-문자열-변수-지정하기">숫자(정수, 실수)와 문자열 변수 지정하기</h2>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/3eb883f3-003e-4b73-bed3-c8550c42b252/image.jpg" alt=""></p>
<ul>
<li>정수 데이터: Integer(int) </li>
<li>실수 데이터: double  </li>
<li>문자열 데이터: String </li>
</ul>
<h3 id="숫자-데이터의-세부적인-분류">숫자 데이터의 세부적인 분류</h3>
<ul>
<li><p>byte: 8-bit, 최소값 -128, 최대값 127 (0의 존재 때문에 -1이 됨), 큰 배열(array)에 사용한다면 메모리 절약에 유용</p>
</li>
<li><p>short: 16-bit, 최소값 -32,768, 최대값 32,767</p>
</li>
<li><p>int : 32-bit, 최소값 -(2^31), 최대값 (2^31)-1, -1을 해주는 이유는 &#39;0&#39;의 존재 때문</p>
</li>
<li><p>long: 64-bit, 최소값 -(2^63), 최대값 (2^63)-1, int의 범위를 넘어서는 큰 숫자들을 다룰 때 long을 쓴다.</p>
</li>
<li><p>float: 32-bit, 정수(int)에서 큰 배열에서 사용할 때, byte와 short를 쓰면 메모리 효율이 좋아지는 것처럼 실수에서는 아래의 double 대신에 float를 쓰면 메모리를 아낄 수 있음. 정교한 실수 값을 다룰 때는 float 타입을 추천하지 않는다. 대신에 java.math에 있는 &#39;BigDecimal&#39; class를 추천함.</p>
</li>
<li><p>double: 64-bit, 실수를 사용할 때 일반적으로 자주 사용하는 타입, float와 마찬가지로 정교한 실수 계산에서 사용하는건 절대(never) 사용하지 않는다.</p>
</li>
</ul>
<p><strong>추가자료</strong> 
 <a href="https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html">Primitive Data Types</a>
 <a href="https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html">Variables</a></p>
<h2 id="변수의-효용">변수의 효용</h2>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/a3f02d4b-e407-40eb-9580-d54d42b4359c/image.jpg" alt=""></p>
<h3 id="1-변수의-재사용">1. 변수의 재사용</h3>
<ul>
<li>수백 번 이상 사용되는 데이터의 경우 변수로 만들어두면 편리하게 사용 가능 </li>
<li>name이라는 변수를 지정하면, 자주 사용하는 데이터를 여러 번 재사용할 수 있고</li>
<li>name을 수정할 경우 변수의 값만 수정하면 하나하나 수정해주지 않아도 되기 때문에 효율적으로 처리 가능 
ex) 이름 부분만 바뀌는 뉴스레터 </li>
</ul>
<h3 id="2-코드의-가독성">2. 코드의 가독성</h3>
<ul>
<li>변수의 이름을 잘 지으면 코드 의미 파악에 도움</li>
<li>VAT(부가가치세)라는 이름을 붙이게 되면 단순히 실수 10.0이 아닌 &#39;부가가치세&#39;의 의미를 가지게 됨 </li>
<li>위의 name 변수도 마찬가지로 단순한 문자열 &quot;Lezzo&quot;가 아닌 &#39;이름&#39;이란 의미를 가진다는 것을 파악할 수 있게 됨 </li>
<li>미래의 나 혹은 프로젝트 동료에게도 코드가 쉽게 읽힐 수 있게 되는 장점 </li>
</ul>
<h2 id="데이터-타입의-변환casting">데이터 타입의 변환(Casting)</h2>
<p><strong>캐스팅(Casting)이란</strong> 
자바에서는 변수의 데이터타입을 굉장히 엄격하게 통제하기 때문에 자바를 사용하다보면 어떠한 변수에 들어갈 값 또는 변수에 들어있는 값을 다른 데이터 타입으로 컨버팅(converting)해야하는 경우가 생긴다. 이때 사용하는 키워드가 &#39;캐스팅(casting)&#39;이다. </p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/ac2d88f4-2ba0-4e5e-9fce-0c868b537799/image.jpg" alt=""></p>
<h3 id="1-정수를-실수로widening-casting-automatically">1. 정수를 실수로(Widening Casting, automatically)</h3>
<ul>
<li>정수 1은 int형이라 실수형(double)로 바꾸어도 손실이 생기지 않기 때문에 자동으로 casting된 결과가 console에 나온다. </li>
<li>정수를 실수로 바꾼 것이기 때문에 결과는 1이 아닌 1.0으로 나온다. </li>
<li>자동 casting된 것이지만 실제로는 &#39;double b2 = (double) 1;&#39;의 과정을 거친 것이다. </li>
</ul>
<h3 id="2-실수를-정수로narrowing-casting-manually">2. 실수를 정수로(Narrowing Casting, manually)</h3>
<ul>
<li>실수(double)은 정수(integer)로 바꾸게되면 소수점만큼 손실이 생긴다. 실수 1.1을 정수 integer 1로 바꾸게되면 0.1만큼을 잃게 되기 때문에 &#39;int g = 1.1&#39;을 하게 되면 에러가 발생한다. </li>
<li>그래서 자동 casting이 아닌 수동 casting을 해주어야 한다. </li>
<li>에러를 없앨 수 있는 2가지 방법은 int를 double로 바꾸어서 데이터 타입을 맞춰주거나, casting을 해주는 방법이 있다. </li>
</ul>
<h3 id="3-숫자를-문자열로">3. 숫자를 문자열로</h3>
<p>&#39;toString()&#39;을 이용하며 숫자가 문자로 잘 바뀌었는지 확인하기 위해서 &#39;.getClass()&#39;를 쓴다. </p>
<p><strong>추가자료</strong>
<a href="https://www.w3schools.com/java/java_type_casting.asp">Java Type Casting</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 데이터 타입 ]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85</guid>
            <pubDate>Tue, 21 Jun 2022 01:14:18 GMT</pubDate>
            <description><![CDATA[<h2 id="조금-더-간단하게-class-생성하는-방법">조금 더 간단하게 class 생성하는 방법</h2>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/a2f3b69d-71c1-4e1f-ba5a-b1411341f3aa/image.jpg" alt=""></p>
<ul>
<li><p>이전: File &gt; New에서 새로운 java파일 생성 </p>
</li>
<li><p><em>새로운 방법: File &gt; Class에서 새로운 java 파일을 바로 생성하고 class도 생성하면서 main method도 자동으로 생성  *</em></p>
</li>
<li><p>소스코드를 입력하고 저장하면 .class 파일이 생성된다. 
class의 이름은 파일의 이름(Datatype)과 동일해야 한다. 
데이터의 종류에 따라 수행할 수 있는 연산이 달라진다.</p>
</li>
</ul>
<h2 id="숫자와-문자-데이터-타입과-연산">숫자와 문자 데이터 타입과 연산</h2>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/288e6938-fbc5-485c-8166-13210d577725/image.jpg" alt=""></p>
<h3 id="숫자">숫자</h3>
<ul>
<li>자바에서 숫자는 다른 기호와 함께 입력하지 않고 그대로 입력한다.</li>
<li>&#39;+&#39; 연산자는 덧셈의 연산을 수행한다.</li>
</ul>
<h3 id="문자">문자</h3>
<ul>
<li>자바에서는 문자열은 쌍따옴표(&quot;&quot;)안에 적는다(&#39;&#39;하면 에러)</li>
<li>&#39;+&#39; 연산자는 결합의 연산을 수행한다.</li>
<li>문자열 간에는 &#39;*&#39; 연산자를 사용할 수 없다. </li>
<li>length 연산은 문자열의 길이를 반환한다. </li>
</ul>
<h2 id="숫자와-연산">숫자와 연산</h2>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/0a852824-13fe-499b-81f1-edf437f95741/image.jpg" alt=""></p>
<ul>
<li>Number라는 클래스(class)</li>
<li>main이라는 메소드(method) </li>
<li>수학과 관련된 것들을 모아놓는 캐비닛같은 Math라는 클래스 존재 </li>
<li>Math.까지 입력하면 옆에 네모상자가 뜨면서 이클립스가 관련 메소드를 추천해준다.  </li>
<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html">Math(Java Platform SE 8)</a></li>
</ul>
<h2 id="문자열의-표현">문자열의 표현</h2>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/73589a9d-941a-4c39-9cc9-8cf242238e77/image.jpg" alt=""></p>
<ul>
<li>문자열은 문자의 나열로 쌍따옴표(&quot;&quot;)로 표현 </li>
<li>문자는 따옴표(&#39;&#39;)로 표현 </li>
<li>이스케이프 기호는 줄바꿈 기호나 쌍따옴표같은 특수한 기호를 문자열에 넣기 위해 사용 </li>
<li>이스케이프 기호는 특정 문자와 결합해 제어문자로 기능하기도 하며, 쌍따옴표와 같은 특수한 문자와 결합하여 특수한 문자가 일반 문자라고 나타내주는 역할을 하기도 한다. </li>
<li>줄바꿈이 하고 싶을 때 &#39;\n&#39; </li>
<li>쌍따옴표를 문자열에 입력하고 싶을 때 쌍따옴표 앞에 역슬래시&#39;&#39; 삽입 </li>
</ul>
<h2 id="문자열-다루기">문자열 다루기</h2>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/a5044096-6a6b-40cf-a30c-da8807278774/image.jpg" alt=""></p>
<ul>
<li>&#39;.length&#39;는 문자열의 길이를 산출</li>
<li>replace는 두 개의 인자 oldChar, newChar를 받는다. (oldChar 기존의 문자열, newChar는 바꾸고 싶은 문자열) </li>
<li>문자열을 다루는 것이기 때문에 쌍따옴표(&quot;&quot;)를 써야 한다. </li>
<li>문자열에서는 문자의 길이를 알아내거나, 문자열의 일부를 조작하는 등의 연산을 수행할 수 있다. </li>
<li><a href="https://docs.oracle.com/javase/7/docs/api/java/lang/String.html">String(Java Platform SE7)</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] HelloWorld 나오게 하기 ]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%EC%8B%A4%ED%96%89HelloWorld</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%EC%8B%A4%ED%96%89HelloWorld</guid>
            <pubDate>Mon, 20 Jun 2022 07:18:31 GMT</pubDate>
            <description><![CDATA[<p>드디어 이클립스 실행!  
이클립스에 대한 제대로 된 이해없이 일을 시작하다보니 어려움이 많았다. 사소하게는 단축키부터 화면 설정까지, 특히 이클립스라는 IDE로 무엇을 할 수 있는지에 대한 지식이 전혀 없어서 하나하나 클릭해봐야 했다. 이참에 이클립스랑 좀더 친해져봐야지. </p>
<h1 id="프로젝트-만들기">프로젝트 만들기</h1>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/aef8895e-7754-442e-887e-ca0a158392dc/image.png" alt="">
outline은 당장 중요하지 않으니 없애준다. 하나하나 찬찬히 들여다봐야하는데, Package Explorer부터! 프로젝트를 하게 되면 여러 소스코드나 이미지파일을 모아놓는 프로젝트 폴더가 있는데, 그 프로젝트 폴더를 관리하는 것이 package explorer이다.
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/01c2a3e2-69c8-410a-876a-f1ae9bb36a8b/image.png" alt=""></p>
<p>그런데 이것보다 조금 더 좋은 도구가 있다. 바로 navigator다. package explorer는 프로그램을 개발하는데 필요한, 개발할 때 편리하도록 화면을 바꾸어서 보여준다. 다시 말해 어떤 파일은 숨기기도 한다는 것이다. 초심자 입장에서 너무 많은 정보가 감추어져 있으면 파악하기 어렵기 때문에 프로젝트 폴더를 있는 그대로 보여주는 navigator를 사용하는 것이 좀 더 좋다. navigator는 window&gt;Show view에서 찾을 수 있다. </p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/1ddc8325-8b83-476e-ac7f-cc19c87d1fec/image.png" alt=""></p>
<p>Package explorer와 비교하기 쉽게 navigator 위치를 조절해주고, </p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/c115cac7-50b3-4ef4-9e25-f5c3ac90db1e/image.png" alt="">
&#39;create a java project&#39;를 눌러 기본 설정을 해본다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/f8a655c4-af14-4e6a-bf65-d54047354ac3/image.png" alt=""></p>
<ul>
<li>우선 project name을 설정하고, </li>
<li>Location의 경우는 본인이 원하는 경로로 설정할 수 있다. 나의 경우는 바탕화면에 새로운 폴더를 만들었고 해당 경로로 설정을 해주었다. </li>
<li>JRE(Java Runtime Environment)라는 뜻으로 앞에서 설치한 자바 프로그램이(JVM: Java Virtual Machine)의 버전을 설정하는 부분인데 그대로 두어도 오케이 </li>
<li>project layout은 우리가 진행하게 될 프로젝트의 폴더 구조를 어떻게 할 것인지 선택하는 부분이다. 1) 소스코드를 저장할 폴더 2) 소스코드를 컴파일한 결과를 저장할 폴더를 설정하는 것인데, 첫번째의 경우 소스코드와 컴퍼일한 파일을 root라는 최상위 폴더에 함께 저장하겠다는 것이고 두번째의 경우는 소스코드는 src에 컴파일한 것은 bin에 저장하겠다는 것이다. 나의 경우는 첫번째를 선택했다. </li>
</ul>
<p>이 모든 것들을 설정하고 &#39;next&#39;버튼을 눌러준다. 마지막으로 &#39;finish&#39;를 눌러주면 드디어 첫번째 프로젝트의 이클립스 설정 끝! 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/646ae637-4b71-44c5-857a-44da05e85af3/image.png" alt=""></p>
<p>이제 화면에 Hello World를 띄워보자! 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/ebe4d5ac-eddc-415f-aefc-f1dde9de4720/image.jpg" alt=""></p>
<ul>
<li>한 java파일에 한개의 class를 만들 수 있는데 그 클래스 이름이 파일 이름과 동일해야 한다. </li>
<li>해당 코드는 아직 정확한 내용을 알지 못해도 앞으로 계속 보게될 것이니 우선은 그냥 넘어간다! </li>
<li>위의 코드를 작성하고 저장을 하면 자바파일과 동일한 &#39;HelloWorldApp.class&#39; 파일이 생성되는 것을 볼 수 있다. .class 파일은 개발자가 작성한 .java 파일을 컴파일한 것이다. </li>
<li>상단의 run 버튼을 누르면 콘솔창에 &#39;Hello World!&#39;가 출력된다. </li>
</ul>
<h2 id="자바java파일이-동작하는-원리">자바(Java)파일이 동작하는 원리</h2>
<p>콘솔에 &quot;Hello World!&quot;를 출력하는 기능을 구현하는 프로그램, 즉 애플리케이션을 만들었다. 이 기능을 구현하기 위해서 &#39;소스(source) = 코드(code)&#39;를 만들었다. </p>
<blockquote>
<p>*<em>Java Source code(.java) &gt; compile(JVM이 알아들을 수 있는 class파일로 변환) &gt; Java Application(.class) &gt; run &gt; Java Virtual Machine(JVM, 자바 가상 머신) &gt; run &gt; computer *</em></p>
</blockquote>
<ol>
<li>프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당 받고, JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.</li>
<li>자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트코드(.class)로 변환시킨다.</li>
<li>class loader를 통해 class 파일들을 JVM으로 로딩한다.</li>
<li>로딩된 class 파일들은 execution engine을 통해 해석된다.</li>
<li>해석된 바이트코드는 runtime data areas에 배치되어 실질적인 수행이 이루어지게 된다. 이러한 실행과정 속에서 JVM은 필요에 따라 Thread Synchronization과 같은 GC 관리작업을 수행한다.
(출처: <a href="https://asfirstalways.tistory.com/158">자바프로그램 실행과정</a>) </li>
</ol>
<h2 id="java-virtual-machine-jvm-자바가상머신">Java Virtual Machine (JVM, 자바가상머신)</h2>
<p>가상머신이란 프로그램을 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것이다. JVM의 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것이다. 그리고 JVM은 JAVA와 OS 사이에서 중개자 역할을 수행하여 JAVA가 OS에 구애받지 않고 재사용을 가능하게 해준다. 그리고 가장 중요한 메모리관리, Garbage collection을 수행한다. 그리고 JVM은 스택기반의 가상머신이다. 자바 가상머신을 알아야하는 이유는 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위해서다. 
(출처: <a href="https://asfirstalways.tistory.com/158">JVM이란</a>) </p>
<p>추가 지식) 
src: source, 이클립스 소스 코드가 저장되는 폴더 
bin: binary, 실행 파일이 저장되는 폴더 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 이클립스(eclipse) 설치하기 ]]></title>
            <link>https://velog.io/@rememberme_jhk/JAVA-%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4eclipse-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@rememberme_jhk/JAVA-%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4eclipse-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 11 Jun 2022 15:18:32 GMT</pubDate>
            <description><![CDATA[<h1 id="ideintergrated-development-environment-통합-개발-환경">IDE(Intergrated Development Environment), 통합 개발 환경</h1>
<p>자바를 이용하기 위해서 코드를 작성하는 것은 메모장같은 간단한 문서 편집기로도 가능하다. 하지만 메모장보다 코드를 작성하고 실행하는데 더 쉽게 할 수 있게 하는 도구들이 있다. 이런 도구를 IDE라고 한다. 이클립스도 그 중 하나이다. </p>
<p>이클립스는 자바만이 아니라 여러 언어를 개발할 수 있는 툴이지만 나는 자바를 개발하기 위해 설치했다. </p>
<p><img src="https://velog.velcdn.com/images/rememberme_jhk/post/6a192526-b4b9-4d74-9cf2-f9a914f61ae7/image.png" alt="">
구글에 &#39;이클립스&#39;를 검색하고 &#39;Eclipse Downloads&#39;를 클릭한다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/faa0d584-5342-4336-822e-98281bb631df/image.png" alt="">
다운로드 버튼이 나오면 계속 눌러준다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/843d0982-851e-420e-a241-57ace75d7fea/image.png" alt="">
클릭을 하면, 아래와 같은 화면이 나온다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/c07886bc-7fae-41b7-834a-8e21a061e760/image.png" alt="">
내가 관심이 있는 것은 JAVA이기 때문에 Eclipse IDE for Java Developers를 선택한다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/78ebcb9d-34cb-49b7-92bb-6541c583766e/image.png" alt="">
그러면 아래와 같은 내용이 나오는데 JAVA파일이 어디에 설치되어 있는지 나와있는지를 보여주는 것으로 특별한 경우를 제외하면 따로 손댈 필요가 없다. INSTALL버튼을 눌러서 마저 설치한다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/a70934be-1a23-49df-ad5e-93f6eca9ab8f/image.png" alt="">
설치가 끝나면 LAUNCH 버튼이 생성되고 그 버튼을 누른다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/7fd0fc49-d693-46f9-9112-92c75f20223c/image.png" alt="">
workspace라는 항목을 선택한다. 앞으로 이클립스라는 도구를 사용해서 여러가지 프로젝트를 하게 될텐데, 그 프로젝트를 하는데 필요한 여러가지 파일들을 저장하는 디렉터리를 형성해주는 작업이다. 이제 이 경로 밑에 프로젝트 폴더가 만들어지게 될 것이다. 
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/5f44b66f-0b74-43de-beb1-d70a031562c7/image.png" alt="">
드디어, 이클립스 설치 완료!
<img src="https://velog.velcdn.com/images/rememberme_jhk/post/a91f7f8c-ed93-454b-a886-e3daddc22320/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>