<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>robyn1_.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Mon, 08 May 2023 08:12:13 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. robyn1_.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/robyn1_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[예외처리 Exception]]></title>
            <link>https://velog.io/@robyn1_/%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC-Exception</link>
            <guid>https://velog.io/@robyn1_/%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC-Exception</guid>
            <pubDate>Mon, 08 May 2023 08:12:13 GMT</pubDate>
            <description><![CDATA[<h2 id="프로그램-오류">프로그램 오류</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/2e6bc0a0-8fb3-4151-a804-8b84680fb346/image.png" alt=""></p>
<p>예외처리 Exception</p>
<ul>
<li><p>프로그램 오류
프로그램 수행 시 치명적인(혹은 예기치 못한) 상황이 발생하여 비정상 종료 상황이 발생한 것, 
프로그램 에러라고도 함</p>
</li>
<li><p>오류의 종류</p>
</li>
</ul>
<ol>
<li>컴파일 에러 : 프로그램의 실행을 막는 소스 상의 문법 에러(like 빨간 줄), 소스 구문을 수정하여 해결</li>
<li>런타임 에러 : 입력 값이 틀렸거나, 배열의 인덱스 범위를 벗어났거나(ArrayIndexOutOfBoundsException), 계산식의 오류 등 주로 조건문 등의 사용으로 에러 처리</li>
<li>시스템 에러 : 컴퓨터 오작동으로 인한 에러, 소스 구문으로 해결 불가</li>
</ol>
<ul>
<li>오류 해결 방법
소스 수정으로 해결 가능한 에러(컴파일 에러, 런타임 에러)를 예외(Exception)라고 하는데
이러한 예외 상황(예측 가능한 에러) 구문을 처리하는 방법인 예외처리를 통해 해결<pre><code>java.lang.Object
  java.lang.Throwable
      java.lang.Exception    // 여기까지는 공통으로 상속받는다.</code></pre><h2 id="예외-클래스-계층-구조">예외 클래스 계층 구조</h2>
<img src="https://velog.velcdn.com/images/robyn1_/post/c9cdf6be-9c47-48cc-a251-7f72c273867d/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/19d8f09d-f5ea-4cd1-b939-26f0eae91b25/image.png" alt=""></li>
<li>Cast연산자 사용 시 타입 오류
instanceof연산자로 객체타입 확인 후 cast연산
ex) String, Math같이 Object 아래의 형제일 뿐 부모자식 상속 관계가 아닌데 어느 하나를 형변환했을 때</li>
</ul>
<hr>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/f803723c-4f7b-4b1d-9584-80f83d865285/image.png" alt=""></p>
<h2 id="예외-처리-방법">예외 처리 방법</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/f222b863-8286-485f-857a-5a70ec24dd0b/image.png" alt=""></p>
<ol start="2">
<li>Exception이 발생한 곳에서 직접 처리
try~catch문을 이용하여 예외처리</li>
</ol>
<ul>
<li><p>try: exception 발생 가능성이 있는 코드를 안에 기술
exception이 발생하지 않을 것 같은 코드를 넣어도 상관은 없지만 try문 안에 있는 모든 코드가 exception이 발생하지 않을 것 같은 코드라면 빨간 줄이 뜬다.</p>
</li>
<li><p>catch : try 구문에서 exception 발생 시 해당하는 exception에 대한 처리 기술
catch문은 여러개 가능하나(여러 개의 exception 처리가 가능하나) 상속 관계를 고려하여 순서에 맞게 써줘야한다.</p>
</li>
<li><p>finally : exception 발생 여부와 관계없이 꼭 처리해야 하는 로직 기술
finally가 들어갈 수도 있고 안 들어갈 수도 있다. 꼭 수행해야하는 것들을 넣어준다.
중간에 return문을 만나도 finally 구문은 실행되지만 System.exit();을 만나면 무조건 프로그램 종료
주로 java.io나 java.sql 패키지의 메소드 처리 시 이용</p>
</li>
</ul>
<h3 id="throws로-예외-던지기">throws로 예외 던지기</h3>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/f279c2ef-3129-4a92-be5d-d8243fa0939e/image.png" alt="">
throw&#39;s&#39; =&gt; 위임
throw =&gt; Exception 강제 발생
<img src="https://velog.velcdn.com/images/robyn1_/post/f3c94cca-a45d-419d-a25a-21361bcf1040/image.png" alt="">
메소드나 생성자가 Exception을 발생시킬 수 있다.</p>
<hr>
<h3 id="trycatch로-예외-잡기">try~catch로 예외 잡기</h3>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/06f23394-a492-48c8-9d85-d35ef6af5063/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/2dda167c-1f5e-489a-b0bf-26a8b6853354/image.png" alt=""></p>
<pre><code>public FileReader(String fileName)
           throws FileNotFoundException</code></pre><p>String을 매개변수로 가지는 FileReader라는 생성자가 FileNotFoundException이라는 예외를 발생시킬 수 있다.</p>
<hr>
<pre><code>public String readLine()
                throws IOException</code></pre><p>BufferedReader의 생성자 readLine()이 IOException을 발생시킬 수 있다.</p>
<hr>
<pre><code>public void close()
           throws IOException</code></pre><p>BufferedReader의 메소드 close()가 IOException을 발생시킬 수 있다.</p>
<h3 id="trywithresource">try<del>with</del>resource</h3>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/2e26738a-ad27-4d44-93be-2d36551bbdb0/image.png" alt=""></p>
<h2 id="exception과-오버라이딩">Exception과 오버라이딩</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/f0065e65-0f44-471e-994b-714d35152a4e/image.png" alt=""></p>
<pre><code>Class IOException
    java.lang.Object
        java.lang.Throwable
            java.lang.Exception
                java.io.IOException</code></pre><p>Direct Known Subclasses: EOFException
            end of file</p>
<p>IOException이 처리할 수 있는 범위가 EOFException보다 훨씬 크다.
<img src="https://velog.velcdn.com/images/robyn1_/post/f0035c64-fb11-4183-a15c-d50c318e34f2/image.png" alt=""></p>
<h2 id="사용자-정의-예외">사용자 정의 예외</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/3214fa25-9f62-440a-8474-4b40f57dc66b/image.png" alt=""></p>
<p>※ 사용자 정의 클래스 - 내가 직접 만든 클래스 (Academy, Teacher, Student, Parent, Child 등)
사용자 정의 예외 - 내가 직접 만든 예외
★Exception 클래스를 상속받아★ 예외 클래스를 작성하는 것으로
Exception 발생하는 곳에서 throw new 예외클래스명()으로 발생
※ Object가 모든 클래스의 최상위 클래스라면 Exception은 모든 예외 클래스의 상위 클래스</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[기본 API]]></title>
            <link>https://velog.io/@robyn1_/%EA%B8%B0%EB%B3%B8-API</link>
            <guid>https://velog.io/@robyn1_/%EA%B8%B0%EB%B3%B8-API</guid>
            <pubDate>Mon, 08 May 2023 05:20:10 GMT</pubDate>
            <description><![CDATA[<p>기본 API
&quot;지금 이 메소드의 반환값은 무엇이며, 이 메소드는 어떤 매개변수를 가지며(각 매개변수는 어떤 역할을 하며) 어떻게 동작하고 흘러가는지 주석을 다는 게 좋다.&quot;</p>
<h2 id="string-관련-클래스">String 관련 클래스</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/d1d624e8-6e38-4f83-a91d-ca5733abe469/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/62609012-e049-4751-9e5c-2eba691091a2/image.png" alt=""></p>
<p>String str = &quot;안녕&quot;;
String str2 = &quot;안녕&quot;;
똑같이 String pool(Constant pool, Literal pool)의 안녕을 가리킴 =&gt; str과 str2가 가지고 있는 주소값이 같게 된다.</p>
<pre><code>
    public int hashCode() {
        int h = hash;
        if (h == 0 &amp;&amp; value.length &gt; 0) {
            char val[] = value;

            for (int i = 0; i &lt; value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }</code></pre><p>이 코드는 자바에서 객체의 해시코드를 계산하기 위한 메소드입니다. 이 메소드는 문자열(String) 객체를 대상으로 작성된 것으로 추정됩니다.</p>
<p>해시코드(hash code)란 객체를 식별하기 위한 정수값입니다. 자바에서 모든 객체는 hashCode() 메소드를 가지며, 객체의 내용이 같으면 항상 동일한 해시코드를 반환해야 합니다. 해시코드를 사용하여 객체를 빠르게 비교하거나 검색하는 등의 용도로 활용됩니다.</p>
<p>위 코드는 먼저 변수 h를 선언하고, 이 변수에 객체의 현재 해시코드 값을 저장합니다. 그 다음, h가 0이고 value 배열의 길이가 0보다 큰 경우에 한해서, value 배열의 각 요소에 대해 31을 곱하고 이전 해시코드 값에 더하여 새로운 해시코드 값을 계산합니다. 이 때, value 배열은 문자열의 문자들을 저장하고 있으므로, val[i]는 i번째 문자를 나타냅니다. 계산된 해시코드 값을 변수 h에 저장한 후, 이 값을 리턴합니다.</p>
<p>이 메소드는 문자열의 내용이 변경되지 않는 한, 동일한 문자열 객체에 대해서는 항상 동일한 해시코드 값을 반환합니다. 그러나 문자열의 내용이 변경될 경우에는 해시코드 값도 변경될 수 있습니다. 이 때문에 문자열은 불변(immutable) 객체로 구현되어 있습니다.</p>
<hr>
<p>int    hashCode()
Returns a hash code value for the object.
주소값을 가지고 해싱기법 사용해서 int로 반환한 게 hashCode()라는 메소드</p>
<pre><code>public int hashCode() {
    int h = hash;
    if (h == 0 &amp;&amp; value.length &gt; 0) {
        char val[] = value;

        for (int i = 0; i &lt; value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}</code></pre><p>public static int identityHashCode(Object x)
Returns the same hash code for the given object as would be returned by the default method hashCode(), whether or not the given object&#39;s class overrides hashCode(). The hash code for the null reference is zero.</p>
<pre><code>public static native int identityHashCode(Object x);</code></pre><hr>
<ul>
<li>쓰레드
메모리라는 한정된 공유자원을 가지고 일을 하는데, 여러 가지에 줄을 세워서 들어오는 게 safe 기능</li>
</ul>
<hr>
<ul>
<li><p>StringBuffer()
Constructs a string buffer with no characters in it and an initial capacity of 16 characters.</p>
</li>
<li><p>String[] java.lang.String.split(String regex)</p>
</li>
<li><p>regex
정규표현식은 줄여서 정규식(영어로는 Regular Expression이고 줄여서 Regex, Regexp 등으로 불린다.) 이라고도 하는데, 컴퓨터 과학의 정규언어로부터 유래한 것으로 특정한 규칙을 가진 문자열의 집합을 표현하기 위해 쓰이는 형식언어이다.</p>
</li>
</ul>
<hr>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/dd227498-f470-47db-8a49-e7d8b324ed4a/image.png" alt=""></p>
<p>함수&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp길이를 반환하는 데이터 타입
length&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp배열
length()&amp;nbsp&amp;nbsp문자열 (String Object)</p>
<ul>
<li><p>String 관련 클래스 - StringTokenizer 클래스</p>
<ul>
<li>String클래스에서 제공하는 split()메소드와 같은 기능을 하는 클래스로 
생성 시 전달받은 문자열을 구분자로 나누어 각 토큰에 저장</li>
<li>split() 메소드는 하나로만 구분이 가능하지만, StringTokenizer클래스는 여러 개로 구분이 가능하다.</li>
</ul>
</li>
<li><p>StringTokenizer(String str, String delim)
delim은 구분 문자(영어: Delimiter)를 뜻한다.</p>
</li>
</ul>
<h2 id="wrapper-클래스">Wrapper 클래스</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/567171b9-97dc-4ea4-8be5-d261c8e279f5/image.png" alt=""></p>
<ul>
<li>Wrapper 클래스
Primitive Data Type을 객체화 해주는 클래스 (primitive data type은 객체가 아니라 갖다 쓰는 예약어)
<img src="https://velog.velcdn.com/images/robyn1_/post/a67f2181-dd30-4841-94de-1f38e44afffb/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/c7ae5842-0210-4498-b49a-7c15dfb8b12c/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/cb457b5e-01f5-49dc-80ab-9f938d671262/image.png" alt="">
int의 기본값은 0인데, 이게 JVM기본값으로 0인지 아님 0을 집어넣은 상태인지 알 수 없을 때, Integer를 통해 판단할 수 있다. (null인지 0인지)</li>
</ul>
<p>JDK 1.5부터 오토박싱, 오토언박싱이 가능하게됐다.
기본 자료형을 Wrapper Class로 바꾸는 것을 박싱이라고 하고,
Wrapper Class을 기본 자료형으로 바꾸는 것을 언박싱이라고 한다.</p>
<pre><code>    Integer num1 = new Integer(4);
    Integer num2 = 4;    // 오토박싱
    int num3 = num1;    // 오토언박싱</code></pre><h2 id="날짜-관련-클래스">날짜 관련 클래스</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/b31f1807-836a-46e9-9991-ebb516e8796e/image.png" alt=""></p>
<h2 id="format-관련-클래스">Format 관련 클래스</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/d677f01f-4da0-4d32-a38f-345698123338/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/3b572b22-90ad-43d1-aff2-67daf7e7be58/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[무작위 정수에 'a'를 더해 알파벳 범위의 영소문자를 생성한다는 게 무슨 뜻이야?]]></title>
            <link>https://velog.io/@robyn1_/%EB%AC%B4%EC%9E%91%EC%9C%84-%EC%A0%95%EC%88%98%EC%97%90-a%EB%A5%BC-%EB%8D%94%ED%95%B4-%EC%95%8C%ED%8C%8C%EB%B2%B3-%EB%B2%94%EC%9C%84%EC%9D%98-%EC%98%81%EC%86%8C%EB%AC%B8%EC%9E%90%EB%A5%BC-%EC%83%9D%EC%84%B1%ED%95%9C%EB%8B%A4%EB%8A%94-%EA%B2%8C-%EB%AC%B4%EC%8A%A8-%EB%9C%BB%EC%9D%B4%EC%95%BC</link>
            <guid>https://velog.io/@robyn1_/%EB%AC%B4%EC%9E%91%EC%9C%84-%EC%A0%95%EC%88%98%EC%97%90-a%EB%A5%BC-%EB%8D%94%ED%95%B4-%EC%95%8C%ED%8C%8C%EB%B2%B3-%EB%B2%94%EC%9C%84%EC%9D%98-%EC%98%81%EC%86%8C%EB%AC%B8%EC%9E%90%EB%A5%BC-%EC%83%9D%EC%84%B1%ED%95%9C%EB%8B%A4%EB%8A%94-%EA%B2%8C-%EB%AC%B4%EC%8A%A8-%EB%9C%BB%EC%9D%B4%EC%95%BC</guid>
            <pubDate>Wed, 03 May 2023 00:52:53 GMT</pubDate>
            <description><![CDATA[<p>컴퓨터에서 문자는 내부적으로 숫자로 표현됩니다. 예를 들어, 아스키 코드(ASCII code)에서는 영문 대소문자와 일부 기호를 각각 0부터 127까지의 숫자로 대응시켰습니다. 따라서, 문자 &#39;a&#39;의 아스키 코드 값은 97이며, &#39;b&#39;는 98, &#39;c&#39;는 99, ... &#39;z&#39;는 122입니다.</p>
<p>위에서 제시한 printAlphabet 메소드에서는 Random 클래스의 nextInt 메소드로 발생시킨 0부터 25까지의 무작위 정수에 &#39;a&#39;를 더하여, 영소문자 &#39;a&#39;부터 &#39;z&#39;까지의 문자를 무작위로 생성합니다. 예를 들어, num 변수에 0이 저장되면 num + &#39;a&#39;는 97이 되어 문자 &#39;a&#39;를 생성하고, 1이 저장되면 98이 되어 &#39;b&#39;를 생성합니다.</p>
<p>따라서, 무작위로 발생시킨 정수를 이용하여 문자를 생성하는 방법은 매우 일반적인 방법입니다. 이와 같은 방법으로 문자를 생성할 수 있는 이유는 문자의 내부적인 표현 방식이 숫자로 되어 있기 때문입니다.</p>
<pre><code>public static char printAlphabet() {
    Random random = new Random();
    int num = random.nextInt(26); // 0~25 사이의 무작위 정수를 발생시킵니다.
    char c = (char) (num + &#39;a&#39;); // 무작위 정수에 &#39;a&#39;를 더해 알파벳 범위의 영소문자를 생성합니다.
    return c;
}</code></pre><hr>
<pre><code>    // 실행 요청 시 알파벳 범위의 영소문자를 하나 발생시켜 리턴하는 메소드
    // 메소드명 : printAlphabet

    public char printAlphabet() {
        // a b c d e f g h i j k l m n o p q r s t u v w x y z
        return (char)((int)(Math.random()*26) + &#39;a&#39;);        
    }    // 반환 값은 있고 매개변수는 없는 메소드</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[메소드 Method]]></title>
            <link>https://velog.io/@robyn1_/%EB%A9%94%EC%86%8C%EB%93%9C-Method</link>
            <guid>https://velog.io/@robyn1_/%EB%A9%94%EC%86%8C%EB%93%9C-Method</guid>
            <pubDate>Wed, 03 May 2023 00:40:16 GMT</pubDate>
            <description><![CDATA[<p>객체지향언어, 클래스, 필드, 생성자, 그리고 메소드 중 메소드가 제일 중요하다.
기능을 수행한다.
<img src="https://velog.velcdn.com/images/robyn1_/post/dfd78387-33a8-4ea9-bc2d-01b12c98f76d/image.png" alt="">
수학의 함수와 비슷하며 호출을 통해 사용(Run의 main메소드에서 객체를 만든 다음 호출했었다.)
<img src="https://velog.velcdn.com/images/robyn1_/post/1b155270-3750-4ea9-806a-c8a5a5f38810/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/84477929-e76f-49c5-8ba9-e347615c5151/image.png" alt="">
메소드 접근제한자 ==&gt; 필드 접근제한자와 같다
<img src="https://velog.velcdn.com/images/robyn1_/post/99096ddc-6c06-4b60-8ebc-2fc45172eff7/image.png" alt=""></p>
<p>메소드 예약어</p>
<ul>
<li>static
static 영역에 할당하여 객체 생성 없이 사용
클래스명.메소드명 이렇게 호출 ex. Math 등</li>
<li>final
종단의 의미, 상속 시 오버라이딩 불가능</li>
<li>abstract
미완성된, 상속하여 오버라이딩으로 완성시켜 사용해야 함
중괄호가 없다. 소괄호만 넣고 끝난다. 상속받은 자식이 완성시킨다.</li>
<li>synchronized
동기화 처리, 공유 자원에 한 개의 스레드만 접근 가능함</li>
<li>static final (final static)
static과 final의 의미를 둘 다 가짐
<img src="https://velog.velcdn.com/images/robyn1_/post/e3985c58-c139-42a2-b1d2-4dbf96bb65a5/image.png" alt="">
예약어보다 중요한 게 반환형</li>
</ul>
<p>메소드 반환형</p>
<ul>
<li>void
반환형이 없음을 의미, 반환 값이 없을 경우 반드시 작성</li>
<li>기본 자료형
연산 수행 후 반환 값이 기본 자료형일 경우 사용 ex. int, char, boolean</li>
<li>배열
연산 수행 후 반환 값이 배열인 경우 ★배열의 주소값★을 반환 
(실제 데이터가 넘어가는 게 아니다)</li>
<li>클래스
연산 수행 후 반환 값이 해당 클래스 타입의 객체일 경우 해당 객체의 주소값이 반환
(클래스 == 타입)
<img src="https://velog.velcdn.com/images/robyn1_/post/3d6d8d9c-2e37-4b3b-a43e-aba8ff35b756/image.png" alt="">
PrintStream    printf(String format, Object... args)    ==&gt; ...이 가변인자를 나타내는 것
A convenience method to write a formatted string to this output stream using the specified format string and arguments.</li>
</ul>
<hr>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/60145693-9008-4c6d-851a-a5365bf345d8/image.png" alt="">
리턴 값이 없으므로 void이다.</p>
<hr>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/ad8e2b31-197c-43cb-ab5b-ac042ebdc88a/image.png" alt="">
리턴 값이 있으므로 void가 아니다.</p>
<hr>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/823b1e37-751c-4141-9275-1f27b020013d/image.png" alt="">
리턴 값이 있으므로 void가 아니다.</p>
<hr>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/7f37ac51-1c6a-48a0-a6bb-c79e888b0630/image.png" alt="">
리턴 값이 있으므로 void이다.</p>
<hr>
<p>리턴 값이 없다 ==&gt; void
리턴 값이 있다 ==&gt; return</p>
<hr>
<p>어떤 메소드가 다른 곳으로부터 값을 전달받았으면 좋겠다면 매개변수가 존재해야한다.
매개변수는 호출할 때 값을 집어넣으면서 호출하는 것.
어떤 메소드가 다른 곳에 값을 전달했으면 좋겠다면 return 값이 존재해야한다.
return은 다 끝나고 돌아갈 때 값을 가지고 돌아가느냐의 여부</p>
<h2 id="getter와-setter-메소드">getter와 setter 메소드</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/39beb9bf-80b5-4eba-9e21-9658a1f5c297/image.png" alt="">
setter 메소드
필드에 변경할 값을 (매개변수로부터) 전달받아서 필드값을 변경하는 메소드</p>
<hr>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/256f70a0-e0e3-4052-8b79-152c3d7ed6a6/image.png" alt="">
getter 메소드
필드에 기록된 값을 읽어서 요청한 쪽으로 읽은 값을 넘기는 메소드
나를 호출한 쪽으로 값을 가지고 돌아가는</p>
<hr>
<h2 id="return">return</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/beb5bf4f-ab78-46a9-8f8f-ac7b82c62b2b/image.png" alt=""></p>
<hr>
<p>MVC Model Pattern
<img src="https://velog.velcdn.com/images/robyn1_/post/a764c1b8-cbc4-4374-8217-800ed7e8329b/image.png" alt=""></p>
<p>MVC Model Pattern
Model
View
Controller</p>
<ul>
<li><p>Run에서 View 실행
main() 메소드
실행만 하고 끝날 것</p>
</li>
<li><p>View에서 Controller로 연결
화면에 보이는 모든 것</p>
</li>
<li><p>Controller
뷰와 모델 연결
데이터 가공
F -&gt; 여자
M -&gt; 남자</p>
</li>
<li><p>Model - vo
추상화를 거친 클래스
데이터를 담아놓는 변수(임시 공간)</p>
</li>
<li><p>Model - dao
DB랑 왔다갔다하는 애들은 dao에 담는다.
File도 dao에 담는다.</p>
</li>
</ul>
<p>Model은 데이터와 관련이 있다. Model에는 vo, dao 말고도 Service, Exception, dto 등도 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[생성자 Constructor]]></title>
            <link>https://velog.io/@robyn1_/%EC%83%9D%EC%84%B1%EC%9E%90-Constructor</link>
            <guid>https://velog.io/@robyn1_/%EC%83%9D%EC%84%B1%EC%9E%90-Constructor</guid>
            <pubDate>Tue, 02 May 2023 01:31:12 GMT</pubDate>
            <description><![CDATA[<p>생성자(Constructor)
기본 생성자, 매개변수 있는 생성자
객체를 생성해주는 일을 한다.
소괄호가 붙은 건 모두 메소드이므로 생성자도 일종의 메소드이다.</p>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/9196b4d9-0f33-4735-9c94-efaa1f13d21d/image.png" alt=""></p>
<ul>
<li>생성자는 일종의 메소드로, 전달된 초기 값을 받아서 객체의 필드에 기록
&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp(매개변수 있는 생성자가 하는 일)</li>
</ul>
<p>★생성자 규칙★
생성자의 선언은 메소드 선언과 유사하나 ★반환 값이 없으며(void같은 걸 적지 않는다)★
★생성자명을 클래스명과 똑같이★ 지정해주어야 함</p>
<ul>
<li><p>생성자는 객체 생성이 주 목적(+ 필드 초기화)이고 메소드는 기능 실행이 주 목적
<img src="https://velog.velcdn.com/images/robyn1_/post/bb9a2f80-bf9e-4069-bb4e-1e856bf28137/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/c25741ef-e79b-4780-a0d2-6bf7b1f17f7a/image.png" alt=""></p>
</li>
<li><p>기본 생성자
작성하지 않은 경우, 클래스 사용 시 JVM이 자동으로 기본 생성자 생성
(기본 생성자를 만들지 않았음에도 불구하고 Product p = new Product(); 이런 게 가능했던 이유)</p>
<h2 id="오버로딩">오버로딩</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/15a943dd-9f49-4c8d-b36d-b371c164499b/image.png" alt=""></p>
</li>
<li><p>오버로딩 조건
같은 클래스 내에 있어야 한다
같은 메소드 이름
매개변수의 개수, 매개변수 타입, 매개변수의 순서 이 셋 중 하나가 달라야한다.
<img src="https://velog.velcdn.com/images/robyn1_/post/f6142846-8c23-4096-8591-a2c887f83a0b/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/00f25d4e-a96c-4934-a768-d2c3dd9070bb/image.png" alt="">
u1.inform();는 null, null, null, null이라고 콘솔에 찍힌다.
u2.inform();는 user01, pass01, ~, ~라고 콘솔에 찍힌다.</p>
</li>
</ul>
<hr>
<pre><code>public User(String userId, String pwd, String name, Date date) {
    userId = userId;    // The assignment to variable userId has no effect</code></pre><p>파란색은 전역변수, 연한 갈색은 지역변수인데 두 개의 이름이 같을 때 지역변수에 우선권을 주기 때문에 전부 연한 갈색이 된다.</p>
<pre><code>이름을 같게 해도 되는 경우는 없을까? ==&gt; this라는 레퍼런스 변수(참조 변수)</code></pre><p><img src="https://velog.velcdn.com/images/robyn1_/post/347171b7-de45-4f0f-b508-549512f8ac71/image.png" alt=""></p>
<pre><code>public class Academy {
    private String name;    // 필드
    public Academy() {}        // 기본 생성자
    public Academy(String name) {    // 매개변수 있는 생성자
        this.name = name;
    //필드의 name
    }
}</code></pre><p>this는 나 자신에 대한 주소값을 가지고 있다
this.userId라고 하면 지역변수가 아니라 내 필드에 있는 userId에 접근이 된다.</p>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/2d399f35-01f8-4b90-a637-34b81fb12e50/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/c7ab2bca-b67f-46ac-8814-56b593e1908e/image.png" alt=""></p>
<pre><code>public User(){
    System.out.println(&quot;User: &quot; + this);
}</code></pre><p>의 결과도 같다.</p>
<hr>
<h2 id="this">this()</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/d3e48e5f-1cec-454e-b7ce-c85cc31fb3c8/image.png" alt="">
this() &lt;== 생성자, 변수와 다르게 소괄호가 붙어있다.
같은 클래스의 다른 생성자를 호출할 때 사용하며 반드시 첫 줄에 선언</p>
<p>this() 사용 예시</p>
<pre><code>public class Academy {
    private int age;
    private String name;
    public Academy() {
        this(20, &quot;김철수&quot;);    // 원래 같으면 0이랑 null이 들어갈텐데
    }
    public Academy(int age, String name) {
        this.age = age;
        this.name = name;
    }
}</code></pre><p>this는 나, super는 내 부모
<img src="https://velog.velcdn.com/images/robyn1_/post/16c1c0c3-a5ec-4c1a-aeae-e5b756bc1a41/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/27e0de39-c771-4b87-836b-88e96e7b86eb/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[필드 Field]]></title>
            <link>https://velog.io/@robyn1_/%ED%95%84%EB%93%9C-Field</link>
            <guid>https://velog.io/@robyn1_/%ED%95%84%EB%93%9C-Field</guid>
            <pubDate>Mon, 01 May 2023 10:08:43 GMT</pubDate>
            <description><![CDATA[<p>필드(Field), 멤버 변수, 멤버 필드, 전역 변수</p>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/e0aa6cb4-4045-4f94-bd9d-71930de37a75/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/d61b31be-8719-4d1b-976a-eed000ccd9a9/image.png" alt="">
public 모든 범위, 외부에서도 접근 가능
private 나만, 해당 클래스 내부에서만 접근 가능
(default) 같은 패키지 내
protected 후손 클래스 내    상속이 전제되어 있을 때</p>
<p>기본적으로 필드의 접근제한자는 private으로 해야 한다.            </p>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/9e774318-bd14-4996-a4fb-c978623b6c24/image.png" alt=""></p>
<p>필드 예약어 - static
예약어에 static을 쓰면 그것들이 모두 static 영역으로 올라간다고 보면 된다.
static이라고 하면 바로 떠올려야 하는 단어는 &#39;공유&#39;이다.
다른 곳에서 객체를 만들지 않아도 변수명, 메소드명을 통해 바로바로 접근이 가능한(공유되게하는)
같은 타입의 여러 객체가 공유할 목적의 필드에 사용하며,
프로그램 start시에 정적 메모리 영역에 자동 할당되는 멤버에 적용. 프로그램이 끝날 때 종료된다.</p>
<p>예약어 static은 대부분 private으로 접근제한자를 둔다.</p>
<pre><code>        static이 붙지 않은 인스턴스변수는 객체를 만들어서 객체 안에서 접근해야 한다.
        static이 붙은 클래스변수는 클래스명.변수이름 이렇게 접근한다.

        처음에 프로그램이 시작하자마자 Static이 붙는 애들은 정적 메모리 영역에 올린다. 
        그래서 main 메소드, staticNum이라는 변수가 올라가는데, 
        staticNum은 어디 있는 변수인지 알 수 있게 하기 위해 클래스명인 A_KindsOfVariable이 앞에 붙는다.

        Heap영역에는 instanceNum이 들어가고 주소값이 생기고 Stackd의 akv가 주소값을 통해 참조하게 된다.

        staticNum은 akv를 통해 들어가지 않고 클래스명으로 들어가면 된다.</code></pre><p><img src="https://velog.velcdn.com/images/robyn1_/post/49bab9df-1be8-44ae-b044-07ab87f58b51/image.png" alt=""></p>
<pre><code>public class Academy {
    private final int TEMP1 = 100;    // 하나의 값만 저장해야 하므로 처음부터 초기화
    private int temp4;
}</code></pre><pre><code>     변수 - 위치
             메소드 안 ==&gt; 지역변수
             메소드 밖 ==&gt; 전역변수
         - 예약어
             static O ==&gt; 클래스변수
             static X ==&gt; 인스턴스변수</code></pre><p><img src="https://velog.velcdn.com/images/robyn1_/post/949012b1-31d1-4b70-adeb-c64520227477/image.png" alt=""></p>
<p>초기화 블럭
인스턴스 블럭 {} -&gt; static이 붙지 않은
인스턴스 변수를 초기화시키는 블럭으로 객체 생성할 때마다 초기화</p>
<p>static(클래스) 블럭 static{}
static 필드를 초기화시키는 블럭으로 프로그램 시작 시 한 번만 초기화</p>
<hr>
<p>초기화 순서
<img src="https://velog.velcdn.com/images/robyn1_/post/8a42f466-6ebb-4218-8628-1364ce591a5c/image.png" alt=""></p>
<p>JVM 기본값 ==&gt; null, false, 0 등
명시적 초기값 ==&gt; String str = &quot;robyn&quot;;</p>
<p>객체를 만들기 위해서는 new + 생성자가 필요하다. 
사실 A_If ai = new A_IF();에서 A_IF()가 생성자이다. 
생성자는 메소드의 일종이다. 
생성자가 있어야지만 객체가 만들어진다. 
알맹이 만들 때 소괄호 안 붙인 적 없을 것이다. 
생성자는 객체를 생성해주는 아이다. 
소괄호 뒤에 중괄호가 들어가있으면 코드 구현, 
중괄호 없이 그냥 ;만 붙는다면 메소드 호출이다.</p>
<p>private int age;
private String name;
JVM 기본값으로 age에는 0이, name에는 null이 들어가있다.</p>
<p>private int age = 10;
private String name = &quot;robyn&quot;;
명시적 초기값</p>
<p>{
age = 20;
name = &quot;robyn&quot;;
}
인스턴스 초기화 블록 초기값</p>
<p>public Test(){
age = 30;
name=&quot;robin&quot;;
}
생성자를 통한 초기값</p>
<hr>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/0a2e391e-814e-48d6-bf17-88547ded3ccf/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/3d74f43a-6834-4269-b233-b0f288b0c8a5/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/bf1d1e2d-7234-4d95-8300-7261b9185fdc/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[클래스 Class]]></title>
            <link>https://velog.io/@robyn1_/%ED%81%B4%EB%9E%98%EC%8A%A4-Class</link>
            <guid>https://velog.io/@robyn1_/%ED%81%B4%EB%9E%98%EC%8A%A4-Class</guid>
            <pubDate>Mon, 01 May 2023 08:05:37 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/robyn1_/post/56f9ffad-d88d-49f8-a5e4-c412d2173a64/image.png" alt=""></p>
<pre><code>[접근제한자][예약어] class 클래스명{

    [접근제한자][예약어] 자료형 변수명;        속성값 설정
    [접근제한자][예약어] 자료형 변수명;        필드

    [접근제한자] 생성자명() {}                생성자

    [접근제한자] 반환형 메소드명(매개변수){    기능정의 설정
        // 기능 정의                        메소드
    }
}</code></pre><p><img src="https://velog.velcdn.com/images/robyn1_/post/2ccadd98-c948-4086-b33c-c2f7e2e9fca5/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/2426d7e0-6dcf-48e7-897c-973c646d73f1/image.png" alt=""></p>
<pre><code>class 클래스명 {            생략됐다는 건 (default)를 의미
    // ............
}</code></pre><ul>
<li>모든 코드는 클래스 안에 들어가야한다.</li>
<li>원래 접근제한자의 종류는 4개지만 클래스에 붙을 수 있는 접근제한자는 public, (default)로 두 개뿐이다.        </li>
<li>public은 모든 곳에서 접근이 가능하다.</li>
<li>(default)은 같은 패키지(같은 폴더) 내에서만 접근이 가능하고 다른 곳에서는 접근이 불가능하다.</li>
<li>기본적으로 class의 접근제한자는 public이다. 엄청난 설계 의도가 있지 않는 한 public.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[객체]]></title>
            <link>https://velog.io/@robyn1_/%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@robyn1_/%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Mon, 01 May 2023 07:55:36 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/robyn1_/post/01ab7d97-036f-46bf-9fd7-022f627aa98e/image.png" alt=""></p>
<h2 id="객체지향언어">객체지향언어</h2>
<p>자바는 객체지향언어이다.</p>
<p>자바에서의 객체(Object)
★★★클래스에 정의된 내용대로 new 연산자를 통해 메모리 영역(Heap 영역)에 생성된 것★★★
<img src="https://velog.velcdn.com/images/robyn1_/post/f4cf200a-d026-4ff0-8875-6ef61d545751/image.png" alt=""></p>
<h2 id="객체-지향-언어---클래스">객체 지향 언어 - 클래스</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/f9fb92d5-4187-4d49-b1f2-fdf9179f69cf/image.png" alt="">
구조체 - 여러 개의 자료형, 여러 개의 데이터 (ex. 키, 몸무게같은 double값, 발 사이즈 int값, 이름 String값) (구조체의 특징)
<img src="https://velog.velcdn.com/images/robyn1_/post/5dfae808-9f67-44d9-9f4b-2e62d19892ac/image.png" alt="">
클래스가 만들어지는 기반은 구조체부터 시작한다.
구조체 자체가 클래스는 아니다.
구조체 내의 데이터는 외부에서 볼 수 있고 수정, 삭제가 가능했다. (기능이 가능했다)
그래서 막, 캡슐 같은 걸 씌운다. 데이터 접근 제한을 둔다.
데이터를 가공하는 것은 기능.
캡슐 안에 데이터뿐만 아니라 기능까지 넣어서 데이터를 가공할 수 있게끔 한 것이 클래스이다.
클래스 = 구조체 + 기능
<img src="https://velog.velcdn.com/images/robyn1_/post/08ca32ae-ecfc-4010-ab57-0e230929d03d/image.png" alt=""></p>
<ul>
<li><p>클래스의 등장 배경
캡슐화(외부에서 볼 수, 수정할 수, 삭제할 수 없도록 하는 것)를 통해 기능을 포함한 개념
사물이나 개념의 공통 요소를 추상화(abstraction)하여 정의
피카소, 눈, 코, 입, 대충 그린 것만 봐도 얼굴이라는 것을 알아차릴 수 있다.</p>
</li>
<li><p>추상화(abstraction)
&#39;유연성을 확보&#39;하기 위해 &#39;구체적인 것은 제거&#39;한다는 의미
프로그램에서 필요한 &#39;공통점을 추출&#39;하고, &#39;불필요한 공통점을 제거&#39;하는 과정</p>
</li>
</ul>
<h2 id="객체-지향-언어---추상화">객체 지향 언어 - 추상화</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/b9439b51-7513-45d4-abb4-f89e00364cd5/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/f6e5de4c-d28a-48cf-910b-1bae2ca54525/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/175d670f-94e9-4114-b376-e1a0babc9e9e/image.png" alt="">
제일 위 Person은 클래스 이름이다.
데이터 접근제한자, -, private
-name : String
기능까지 더해지면 클래스가 된다.</p>
<p>클래스는 객체를 만들기 위한 도면이다.</p>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/19a80eaa-f73e-40c1-97ef-71b220ddf423/image.png" alt="">
클래스로 정의되어있는 것들은 모두 참조형 자료형
DimensionalArray da = new DimensionalArray();
Scanner sc = new Scanner(System.in);</p>
<h2 id="객체-지향-3대-특징">객체 지향 3대 특징</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/69f4f493-8525-4b26-b0e1-a5e29cabccdd/image.png" alt="">
객체 지향 3대 특징 (4대 특징엔 추상화도 들어간다)</p>
<ul>
<li>캡슐화 Encapsulation
외부에서 데이터를 어떻게 할 수 없도록 구조체를 막아놓은 것</li>
<li>상속 Inheritance
클래스와 클래스 사이에 관계를 지어주는 것. A클래스를 부모 클래스로, B클래스를 자식 클래스로 만들어서 부모 클래스의 데이터, 기능을 자식 클래스에 그대로 물려주는 것. 자식 클래스는 상속받은 걸 갖다 쓸 수 있다.</li>
<li>다형성 Polymorphism
다양한 형태를 지니고 있다.
하나의 객체가 여러 자료형에 담길 수 있다.<h2 id="객체-지향-언어---캡슐화">객체 지향 언어 - 캡슐화</h2>
<img src="https://velog.velcdn.com/images/robyn1_/post/ca686a7e-c6c1-4e57-a4a0-86a1db30811a/image.png" alt=""></li>
<li>클래스의 ★멤버 변수(클래스 안에 있으면서 메소드 밖에 있는 변수)에 대한 접근 권한은 private을 원칙★으로 한다. 
private --&gt; 나 자신만, 나만 접근할 수 있도록 만들겠다.</li>
<li>클래스의 멤버 변수에 대한 연산처리를 목적으로 하는 함수들은/메소드들은 클래스 내부에 작성한다.                        </li>
<li>★멤버 함수(메소드 안에 있는 변수)는 클래스 밖에서 접근할 수 있도로 public으로 설정★한다.
데이터를 연산할 수 있는 기능(함수, 메소드)를 public으로 설정
public --&gt; 누구나 다 쓸 수 있다, 공용이다.</li>
</ul>
<hr>
<p>변수</p>
<ul>
<li>전역변수, 필드, 멤버필드, 멤버변수
메소드 밖, 클래스 안</li>
<li>지역변수
메소드 안</li>
</ul>
<p>사실 클래스와 객체의 구분을 그렇게 엄격하게 하지 않는다.</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[배열]]></title>
            <link>https://velog.io/@robyn1_/%EB%B0%B0%EC%97%B4</link>
            <guid>https://velog.io/@robyn1_/%EB%B0%B0%EC%97%B4</guid>
            <pubDate>Mon, 01 May 2023 05:53:31 GMT</pubDate>
            <description><![CDATA[<p>배열 (Array)
하나의 값을 저장할 수 있는 공간은 변수다.
★같은 자료형★의 변수를 하나의 묶음으로 다루는 것이 배열이다.
<img src="https://velog.velcdn.com/images/robyn1_/post/7a524717-8a5e-43a4-9b35-b5465334bb8d/image.png" alt=""></p>
<h2 id="배열-선언과-할당">배열 선언과 할당</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/60f0146d-5ab2-446b-b205-ec2ad672ffa6/image.png" alt=""></p>
<p>선언한다 -&gt; stack 영역에 공간이 만들어지는 것
만들어진 공간에 대한 주소값이 arr에 들어간다.
new 연산자가 들어가는 순간 Heap 영역에 만들어진다. 
~한 자료형의 ~한 크기를 가진. 
공간의 주소값도 생성됨. 
자바에서 객체의 주소값을 실제로 알 순 없다. 
자바에서는 건드릴 수 없게 돼있다.
배열도 결국 참조형 자료형 중 하나다.
<img src="https://velog.velcdn.com/images/robyn1_/post/3aabd526-e0e5-4597-a58b-8587ecf3e9a1/image.png" alt=""></p>
<h2 id="배열-저장-구조">배열 저장 구조</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/b03d42ae-fb07-46cd-82fa-e27a08caeb97/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/f332cbcd-6fda-404a-a947-578fee1c2740/image.png" alt=""></p>
<h2 id="배열-초기화">배열 초기화</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/2ef035ed-8bd9-45ac-b390-95ed3cda23de/image.png" alt=""></p>
<hr>
<pre><code>        Scanner sc = new Scanner(System.in);
        System.out.print(&quot;배열의 크기 : &quot;);
        int size = sc.nextInt();

        double[] dArr = new double[size];
        System.out.println(dArr);            // [D@1b6d3586
        System.out.println(&quot;dArr.length : &quot; + dArr.length);
        /*
        for(int i = 0; i &lt;= dArr.length-1; i++) {
            System.out.println(&quot;dArr[&quot; + i + &quot;] : &quot; + dArr[i]);    // 0.0
        }
         */

        System.out.println(&quot;dArr의 크기를 30으로 변경&quot;);
        dArr = new double[30];
        System.out.println(&quot;dArr.length : &quot; + dArr.length);
        System.out.println(dArr);            // [D@4554617c    새로 공간이 할당됐다.
        // 배열은 한 번 만들면 크기를 변경할 수 없다. 우리 눈에는 크기가 변경된 것처럼 보이지만, 사실 크기가 변경된 게 아니라 새로운 공간을 만들어서 치환하고 있을 뿐이다. 원래 만든 것의 크기를 늘리거나 줄일 수 없다.
        // 원래 만들었던 것과의 연결은 끊기고, 원래 만들었던 배열은 garbage collector가 정리하고... old 영역에서도... 나중에 소멸된다. 한 번 연결이 끝나면 되돌아 갈 수가 없다.

        dArr = null;
        System.out.println(dArr);
        // null을 넣어주면 연결을 끊을 수 있다.</code></pre><p><img src="https://velog.velcdn.com/images/robyn1_/post/5714bcb0-5bd4-4ddd-a895-98f7956cd0cf/image.png" alt=""></p>
<hr>
<h2 id="배열-복사">배열 복사</h2>
<h3 id="얕은-복사">얕은 복사</h3>
<p>얕은 배열 복사
하나의 종이로 돌려보기 때문에 원본이 훼손되면 같이 훼손된다. 까맣게 칠해서 안 보이게 하면 다른 사람들도 볼 수 없는 것.
<img src="https://velog.velcdn.com/images/robyn1_/post/16dd282f-8c5a-464d-b289-e3cab4d0de76/image.png" alt=""></p>
<pre><code>    public void method1() {
        int[] originArr = {1, 2, 3, 4, 5};
        int[] copyArr = originArr;    // 얕은 복사

        System.out.println(originArr);    // [I@15db9742
        System.out.println(copyArr);    // [I@15db9742

        System.out.print(&quot;originArr : &quot;);
        for(int i = 0; i &lt;= originArr.length-1; i++) {
            System.out.print(originArr[i] + &quot; &quot;);
        }

        System.out.println();

        System.out.print(&quot;copyArr : &quot;);
        for(int i = 0; i &lt;= copyArr.length-1; i++) {
            System.out.print(copyArr[i] + &quot; &quot;);
        }

        System.out.println();

        // originArr[0]의 값을 99로 변경
        originArr[0] = 99;    

        System.out.println(originArr[0]);    // 99
        System.out.println(copyArr[0]);        // 99
        // 같은 주소를 참조하고 있기 때문에 copyArr의 데이터도 바뀐다.
    }</code></pre><p><img src="https://velog.velcdn.com/images/robyn1_/post/a06ef0e2-11b4-49c8-ab21-236b5a87f288/image.png" alt=""></p>
<h3 id="깊은-복사">깊은 복사</h3>
<p>주소값을 복사하는 게 아니라 그 안에 있는 데이터를 그대로 복사해서 내가 갖고 있는 것
<img src="https://velog.velcdn.com/images/robyn1_/post/5b9c8597-4899-4d76-9b53-2de1f7a82dab/image.png" alt=""></p>
<hr>
<pre><code>        /*
             public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);
             native가 적혀 있으면 까 볼 수 없다.
         */</code></pre><p>attach sources...에 src.zip을 첨부</p>
<pre><code>     * @param      src      the source array.
     * @param      srcPos   starting position in the source array.
     * @param      dest     the destination array.
     * @param      destPos  starting position in the destination data.
     * @param      length   the number of array elements to be copied.
     * @exception  IndexOutOfBoundsException  if copying would cause
     *               access of data outside array bounds.
     * @exception  ArrayStoreException  if an element in the &lt;code&gt;src&lt;/code&gt;
     *               array could not be stored into the &lt;code&gt;dest&lt;/code&gt; array
     *               because of a type mismatch.
     * @exception  NullPointerException if either &lt;code&gt;src&lt;/code&gt; or
     *               &lt;code&gt;dest&lt;/code&gt; is &lt;code&gt;null&lt;/code&gt;.
     */
    public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);</code></pre><hr>
<pre><code>    public void method4() {
        // 깊은 복사
        // 3. Arrays클래스에 있는 copyOf()메소드를 이용한 복사
        // 배열을 이용할 때 유용한 메소드들을 모아놓은 클래스가 Arrays클래스이다.
        // ※ Collections : 컬렉션을 이용할 때 유용한 메소드들을 모아놓은 클래스

        int[] originArr = {1, 2, 3, 4, 5};
        int[] copyArr = new int[10];

//        Arrays.copyOf(original, newLength)

                //        밑줄 전체가 copy가 된다.
        copyArr = Arrays.copyOf(originArr, originArr.length);
    //        Arrays라는 클래스의 copyOf라는 메소드

        /*                ★여기★
         public static int[] copyOf(int[] original, int newLength) {
        int[] copy = new int[newLength];                                // Heap영역에 새롭게 공간을 만들었다. 
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));            // original.length와 newLength 둘 중 더 작은 것을 고르는 Math 클래스의 min 메소드. 둘 다 5이기 때문에 어느 것이어도 상관없게 됨.                         
                ★여기★ ==&gt; 같은 자료형이어야 한다
        return copy;                                                    // return, 나를 불러준 메소드로 돌아간다. 값이 있는 상태에서 돌아간다. Arrays.copyOf로.        
    }
         */

        // originArr 출력
        for(int i = 0; i &lt;= originArr.length-1; i++) {
            System.out.print(originArr[i] + &quot; &quot;);    // 1 2 3 4 5 
        }

        System.out.println();

        // copyArr 출력
        for(int i = 0; i &lt;= copyArr.length-1; i++) {
            System.out.print(copyArr[i] + &quot; &quot;);        // 1 2 3 4 5 
        }

        System.out.println();
    }</code></pre><p><img src="https://velog.velcdn.com/images/robyn1_/post/61b31432-603e-4f2b-b3f6-397af6893588/image.png" alt="">
★Arrays 클래스의 copyOf 메소드 흐름이 중요★</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[zero-index]]></title>
            <link>https://velog.io/@robyn1_/zero-index</link>
            <guid>https://velog.io/@robyn1_/zero-index</guid>
            <pubDate>Sat, 29 Apr 2023 08:42:16 GMT</pubDate>
            <description><![CDATA[<p>APPLE
01234
ZERO-INDEX
LENGTH: 5
String str = &quot;APPLE&quot;;
charAt(n) method
number(zero-index)</p>
<p>char ch0 = str.charAt(0); ==&gt; &#39;A&#39;
char ch1 = str.charAt(1); ==&gt; &#39;P&#39;
char ch2 = str.charAt(4); ==&gt; &#39;E&#39;
char ch3 = str.charAt(5); ==&gt; StringIndexOutOfException</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[분기문]]></title>
            <link>https://velog.io/@robyn1_/%EB%B6%84%EA%B8%B0%EB%AC%B8</link>
            <guid>https://velog.io/@robyn1_/%EB%B6%84%EA%B8%B0%EB%AC%B8</guid>
            <pubDate>Fri, 28 Apr 2023 08:49:57 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/robyn1_/post/33bff540-44db-4df9-a6f9-180774616c83/image.png" alt="">
<strong>가장 가까운</strong> 반복문을 빠져나가는.
for문을 빠져나가는.</p>
<hr>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/350f3dcf-4d2b-4bb5-a221-47181ef3418a/image.png" alt="">
마치 아래에 있는 것을 다 실행하고 올라가는 것처럼 수행됨.</p>
<pre><code>        for(int i = 1; i &lt;= 10; i++) {
            if(i % 2 == 0) {            // 짝수인 경우 제외
                continue;            // 증감식으로 이동
            }
            System.out.println(i + &quot; 출력&quot;);
        }</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[stacktest]]></title>
            <link>https://velog.io/@robyn1_/stacktest</link>
            <guid>https://velog.io/@robyn1_/stacktest</guid>
            <pubDate>Fri, 28 Apr 2023 08:24:05 GMT</pubDate>
            <description><![CDATA[<p> Stack 구조 (stack : 쌓다)</p>
<hr>
<p> StackTest.java</p>
<pre><code>public class StackTest {
    public void methodA() {
        System.out.println(&quot;A메소드에 들어옴...&quot;);
        methodB();
        System.out.println(&quot;A메소드를 나감...&quot;);
        return;
    }
    public void methodB() {
        System.out.println(&quot;B메소드에 들어옴...&quot;);
        methodC();
        System.out.println(&quot;B메소드를 나감...&quot;);
        return;
    }
    public void methodC() {
        System.out.println(&quot;C메소드에 들어옴...&quot;);
        System.out.println(&quot;C메소드를 나감...&quot;);
        return;
    }
}</code></pre><hr>
<p>Run.java</p>
<pre><code>public class Run {
    public static void main(String[] args) {
        System.out.println(&quot;main메소드에 들어옴...&quot;);
        StackTest st = new StackTest();
        st.methodA();
        System.out.println(&quot;main메소드를 나감...&quot;);
    }
}</code></pre><p> 들어온 순서 : main -&gt; A -&gt; B -&gt; C
 나가는 순서 : main &lt;- A &lt;- B &lt;- C</p>
<p> 돌아가가겠다고 하지 않았음에도 돌아가는 이유는 return;이 생략되어있기 때문이다.
 나를 호출해줬던 메소드로 돌아가는 게 return의 기능이다. 단순히 종료의 의미를 갖는 게 아니다.
 void이므로 값을 가지고 돌아가지 않는다. 반환값이 없다.
 return에는 두 가지 종류가 있다. 아무 값도 없는 것과 값이 있는 것이다.
 만약 void가 아니라 int가 들어간다면 return에 int값이 들어가야한다. return 다음 int값 아무것이나 반환해야한다.
 ★★★나를 불러줬던, 호출했던 메소드로 돌아가게 하는 것이 return이다★★★</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[반복문]]></title>
            <link>https://velog.io/@robyn1_/%EB%B0%98%EB%B3%B5%EB%AC%B8</link>
            <guid>https://velog.io/@robyn1_/%EB%B0%98%EB%B3%B5%EB%AC%B8</guid>
            <pubDate>Fri, 28 Apr 2023 02:35:13 GMT</pubDate>
            <description><![CDATA[<h2 id="for문">for문</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/22f54393-0e65-4418-a8b9-af19d356e99e/image.png" alt=""></p>
<h3 id="중첩-반복문">중첩 반복문</h3>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/7928eb10-4b19-4d0e-9e0f-eb02764d559f/image.png" alt=""></p>
<h2 id="while문">while문</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/7bb47b07-286a-4f5a-95cf-3d7c0f627a64/image.png" alt=""></p>
<h3 id="dowhile문">do~while문</h3>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/ffbbaf91-5ba7-43db-9ad7-88c861e802ab/image.png" alt=""></p>
<p>참조형 자료형(기본 자료형 8가지를 제외한 모든 자료형. 예를 들어 String이 있음)은 객체의 주소값을 갖고 있다. 객체는 알맹이이고, 사실 bw.method10(); 이런 것들이다. 클래스가 있어야 객체를 만들 수 있다. 직접 만든 것은 객체이고 객체를 만들기 위한 도면을 클래스라고 한다. 각각의 기능들은 메소드가 된다. 객체가 할 수 있는 기능을 메소드라고 봐도 된다.</p>
<p>모든 참조형 자료형은 기본값으로 null을 갖고 있다. 
String str = &quot;&quot;;                공간 하나 만들어서 그것에 대한 주소값을 갖고 있다.
String str = null;                아무것도 참조하고 있지 않다. 가리키고 있는 게 없다.</p>
<p>null 때문에 가장 많이 나는 에러 -&gt; NullPointerException -&gt; 
String str = null;
while(!str.equals(&quot;exit&quot;)) {            아무 곳도 가리키지 않는데 메소드를 갖고 오라고 해서                     갖고 올 수가 없어서 에러가 난다.</p>
<pre><code>        // while
        /*
        String str = &quot;&quot;;
        while(!str.equals(&quot;exit&quot;)) {
            System.out.print(&quot;문자열 입력 : &quot;);
            str = sc.nextLine();
            System.out.println(&quot;str : &quot; + str);
        }
        */

        // do~while
        String str = null;
        do {
            System.out.print(&quot;문자열 입력 : &quot;);
            str = sc.nextLine();                // str은 더 이상 null이 아니다. 내가 입력한 값이 있는 것이다.
            System.out.println(&quot;str : &quot; + str);
        } while(!str.equals(&quot;exit&quot;));</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[연산자 Operator]]></title>
            <link>https://velog.io/@robyn1_/%EC%97%B0%EC%82%B0%EC%9E%90-Operator</link>
            <guid>https://velog.io/@robyn1_/%EC%97%B0%EC%82%B0%EC%9E%90-Operator</guid>
            <pubDate>Thu, 27 Apr 2023 13:40:13 GMT</pubDate>
            <description><![CDATA[<h1 id="연산자-종류와-우선-순위">연산자 종류와 우선 순위</h1>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/d23f14a8-26c1-42ea-b1ec-f39dd87837b7/image.png" alt=""></p>
<h2 id="단항-연산자-">단항 연산자 !</h2>
<p>논리 값을 부정하여 반대 값으로 변경
제어문을 활용할 때 많이 쓰임</p>
<h2 id="논리-부정-연산자-예시">논리 부정 연산자 예시</h2>
<pre><code>        boolean bool1 = true;
        boolean bool2 = !bool1;
        System.out.println(bool2);</code></pre><p>결과값 false</p>
<h2 id="증감-연산자----">증감 연산자 ++ --</h2>
<p>피연산자의 값에 1을 더하거나 빼는 연산자
위치에 따라 출력 값이 다르게 나타남</p>
<h3 id="전위-연산-먼저-연산-후-다른-연산-실행">전위 연산: 먼저 연산 후 다른 연산 실행</h3>
<h4 id="전위-연산자-예시">전위 연산자 예시</h4>
<pre><code>        int a = 10;
        int b = ++a;
        System.out.println(a + &quot;, &quot; + b);

//        11, 11</code></pre><h3 id="후위-연산-다른-연산-우선-실행-후-연산">후위 연산: 다른 연산 우선 실행 후 연산</h3>
<h4 id="후위-연산자-예시">후위 연산자 예시</h4>
<pre><code>        int a = 10;
        int b = a++;
        System.out.println(a + &quot;, &quot; + b);

//        11, 10</code></pre><h2 id="산술-연산자">산술 연산자</h2>
<p>연산 방법과 우선 순위가 일반 수학과 동일하다.</p>
<h2 id="논리-연산자">논리 연산자</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/5174a6d4-f5b1-4bbc-928b-4f77f571b43a/image.png" alt="">
마지막
가능(하나만 true여도 true 반환하는데 false므로 둘 다 false였어야하므로 false라고 추정 가능)</p>
<hr>
<pre><code>    public void method2() {
        // 입력한 문자 값이 대문자인지 확인
        Scanner sc = new Scanner(System.in);

        System.out.print(&quot;문자 하나 입력 : &quot;);
//        char ch = sc.nextLine().charAt(0);
        String str = sc.nextLine();
        char ch = str.charAt(0);

        // 입력한 문자 값이 대문자다
        // ch가 A부터 Z 사이에 있다
        // ch가 A보다 크거나 같고 ch가 Z보다 작거나 같다
        boolean result = ch &gt;= &#39;A&#39; &amp;&amp; ch &lt;= &#39;Z&#39;;
        System.out.println(&quot;영어 대문자가 맞습니까? &quot; + result);
    }</code></pre><h2 id="복합-대입-연산자">복합 대입 연산자</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/512442b9-1180-456a-8295-ef41885d8325/image.png" alt=""></p>
<h2 id="삼항-연산자">삼항 연산자</h2>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/f03bc1a9-ddea-42d9-bf78-a8463df402d3/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[변수 Variable]]></title>
            <link>https://velog.io/@robyn1_/%EB%B3%80%EC%88%98-Variable</link>
            <guid>https://velog.io/@robyn1_/%EB%B3%80%EC%88%98-Variable</guid>
            <pubDate>Sat, 22 Apr 2023 06:35:40 GMT</pubDate>
            <description><![CDATA[<h3 id="변수variable">변수(Variable)</h3>
<p>메모리(RAM)에 값을 기록하기 위한 공간
데이터를 담을 수 있는 <strong>하나의</strong> 공간</p>
<h3 id="변수를-사용하면">변수를 사용하면</h3>
<p><strong>가독성</strong>이 좋아진다.
<strong>재사용성</strong>이 증가한다.
그로 인해 <strong>코드량이 감소</strong>하고 <strong>유지보수가 용이</strong>해진다.</p>
<h3 id="변수에-값을-기록하는-이유">변수에 값을 기록하는 이유</h3>
<p>프로그램 실행 시 사용할 값(Data)이 있다면 그 값은 먼저 메모리에 기록되어야 한다.
<img src="https://velog.velcdn.com/images/robyn1_/post/d6a3ea8b-8b39-4a8b-8289-0e66aaa909e1/image.png" alt=""></p>
<h3 id="변수의-선언">변수의 선언</h3>
<p>메모리 공간에 데이터를 저장할 수 있는 공간을 할당하는 것</p>
<p><strong>자료형</strong>&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp<strong>변수명</strong>;
변수 타입 지정&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp변수명 지정</p>
<ul>
<li>선언 예시<pre><code>//        논리형 변수 선언
      boolean isTrue;
</code></pre></li>
</ul>
<p>//        문자형 변수 선언
        char ch;</p>
<p>//        문자열 변수 선언
        String str;</p>
<p>//        정수형 변수 선언
        byte bnum;
        short snum;
        int inum;
        long lnum;</p>
<p>//        실수형 변수 선언
        float fnum;
        double dnum;</p>
<pre><code>![](https://velog.velcdn.com/images/robyn1_/post/c31687b2-0ad8-419a-b66e-8e8210cca308/image.png)

### 변수 명명 규칙
1. 대소문자가 구분되며 길이 제한이 없다.
2. 예약어를 사용하면 안 된다.
ex) true, final, String 등
3. 숫자로 시작하면 안 된다.
ex) age1은 가능하지만 1age는 불가능
4. 특수문자는 &#39;_&#39;와 &#39;$&#39;만을 허용한다.
- &#39;$&#39;는 내부 클래스에서 사용
- &#39;_&#39; 사용 시 컴파일 에러는 없지만 관례상 사용하지 않는 것이 좋음
ex) sh@rp는 불가능하지만 $harp는 가능
5. 여러 단어의 이름은 단어의 첫 글자를 대문자로 한다.
단, 첫 시작 글자는 소문자로 하는 것이 관례이다.
ex) ageOfVampire, userName

### 자료형(Type)
![](https://velog.velcdn.com/images/robyn1_/post/69783a95-3665-4fd1-b822-356bfe4431a2/image.png)
String은 참조형 자료형이고 String 빼고는 다 기본자료형이다.
기본자료형 8개 빼고는 전부 다 참조형 자료형이다.

### 데이터 저장 단위
저장 공간이 제한적이기 때문에 저장 크기에 대한 기준과 CPU가 데이터를 처리할 때 일정한 기준이 필요하다.
#### 비트 bit
컴퓨터나 나타내는 **데이터의 저장 최소 단위**로서 **2진수 값 하나**를 저장할 수 있는 메모리 공간을 의미한다.
#### 바이트 byte
**데이터 처리** 또는 **문자의 최소 단위**로서 8개의 비트가 모여 하나의 바이트가 구성된다.
![](https://velog.velcdn.com/images/robyn1_/post/3e35d9f1-18e5-4694-bad7-926387744992/image.png)

### 변수 저장 가능 범위
![](https://velog.velcdn.com/images/robyn1_/post/1eab8eb2-5da8-46b9-a8c6-d0f02033f467/image.png)

### 주요 예약어
![](https://velog.velcdn.com/images/robyn1_/post/bcb510ae-9122-44c2-a2a3-e229792087b8/image.png)

### 값 대입과 리터럴
#### 값 대입
생성한 변수(저장 공간)에 값을 대입하는 것</code></pre><pre><code>    int age;
    age = 10;    // 변수는 한 개의 데이터만 보관한다. 마지막에 대입한 값만 보관한다.
    age = 20;</code></pre><pre><code>#### 리터럴
변수에 대입되는 값 자체</code></pre><pre><code>    short s = 32767;
    int i = 100;
    long l = 10000L;
    float f = 0.123f;
    double d = 3.14;

    char c = &#39;A&#39;;
    String str = &quot;ABC&quot;;</code></pre><pre><code>오른쪽이 리터럴이다.
**오른쪽의 값이 왼쪽에 있는 공간에 들어간다.**

#### 메모리 영역
Stack
컴퓨터가 알아서 쓰는 영역

Heap
개발자가 &#39;아 이런 것 좀 메모리에 올리고 싶은데&#39;

Static
처음에 프로그램 시작할 때 공통적으로 써야하는 부분들을 미리 올려놓는 공간

int a;라고 선언하는 순간 Stack에 a라는 이르믕로 공간이 생긴다.
a = 10;은 초기화/값 대입이다.

Heap 영역에 만들고싶으면 new라는 연산자를 사용해야한다.

***
01_variable이라는 새로운 java project를 만든다.

src 안에 새로운 클래스를 만든다.
![](https://velog.velcdn.com/images/robyn1_/post/bfaf6288-2654-4402-bf41-af90f9444362/image.png)
</code></pre><p>package com.kh.variable;</p>
<p>public class A_Variable {    // 기능부 구현, 실행부 분리</p>
<pre><code>public static void main(String[] args) {    
    test();
}

public static void test() {
    System.out.println(&quot;robyn의 복습&quot;);
}</code></pre><p>}</p>
<pre><code>***
### 변수의 초기화
변수를 사용하기 전에 처음으로 값을 저장하는 것
-&gt; 지역변수(메소드 안 변수)는 반드시 초기화해야함

#### 선언 후 초기화</code></pre><p>//        A. 변수 선언</p>
<p>//        1. 논리형
        boolean isTrue;</p>
<p>//        2. 문자형
//        2-1. 문자
        char ch;
//        char은 무조건 한 글자, 싱글 쿼테이션으로 감싸야</p>
<p>//        2-2. 문자열
        String str;
//        String은 0글자 이상, 더블 쿼테이션으로 감싸야</p>
<p>//        3. 숫자형
//        3-1. 정수형
        byte bNum;
        short sNum;
        int iNum;
        long lNum;</p>
<p>//        3-2. 실수형
        float fNum;
        double dNum;</p>
<p>//        B. 초기화
        isTrue = true;</p>
<pre><code>    ch = &#39;A&#39;;
    str = &quot;ABC&quot;;

    bNum = 1;
    sNum = 2;
    iNum = 4;
    lNum = 8L;

    fNum = 4.0f;
    dNum = 8.0;</code></pre><pre><code>
#### 선언과 동시에 초기화</code></pre><p>int age = 100;</p>
<pre><code>
### 상수 Constant
수학에서는 변하지 않는 값 의미
컴퓨터(Java)에서는 한 번만 저장(기록)할 수 있는 메모리 의미
변수에 딱 한 번만 기록이 가능하며 그 후에는 수정이 안 되는 것
앞에다가 final이라는 예약어를 붙여준다.

![](https://velog.velcdn.com/images/robyn1_/post/00df32ee-448f-4702-8a3e-132628b8fb0b/image.png)
![](https://velog.velcdn.com/images/robyn1_/post/00db31d4-3806-4a9e-8edf-557a3563748e/image.png)

변경하려니까 빨간 줄이 뜬다. 안된다고 한다.</code></pre><pre><code>    age = 30;
    AGE = 30;</code></pre><p>//        The final local variable AGE may already have been assigned</p>
<pre><code>
#### 상수 선언</code></pre><p>final int AGE;</p>
<pre><code>
#### 상수 초기화
1) 선언과 동시에 초기화</code></pre><p>final int NUM = 100;</p>
<pre><code>2) 선언 후 초기화</code></pre><p>final int NUM;        // 상수는 대문자로 표기해주자 라는 약속
NUM = 100;</p>
<pre><code>
초기화 이후 다른 데이터(값)를 대입할 수 없다.

### 문자열
컴퓨터에서 &quot;기차&quot;, &quot;출력하세요&quot; 등과 같이 단어나 문장을 문자열이라고 표현
&quot;&quot;로 묶여 있으면 문자열로 인식하며 Java에서는 String 객체를 이용하여 저장한다.

다른 자료형 + &quot;문자열&quot; -&gt; 문자열
&quot;문자열&quot; + 다른 자료형 -&gt; 문자열
</code></pre><pre><code>    String str1 = &quot;기차&quot;;
    String str2 = new String(&quot;기차&quot;);
    String str3 = &quot;기차&quot; + &quot; 칙칙폭폭&quot;;
    String str4 = new String(&quot;기차&quot; + &quot;칙칙폭폭&quot;);
    String str5 = &quot;기차&quot; + 123 + 45 + &quot;출발&quot;;    // 기차12345출발
    String str6 = 123 + 45 + &quot;기차&quot; + &quot;출발&quot;;    // 168기차출발
       String str7 = &quot;기차&quot; + (123 + 45) + &quot;출발&quot;;    // 기차168출발</code></pre><pre><code>
### 오버플로우
![](https://velog.velcdn.com/images/robyn1_/post/63dd5ef1-38d6-44fd-9b72-f3840c5df6f3/image.png)
오버플로우
127 + 1 -&gt; 128 -&gt; -128

import 단축키
Ctrl + Shift + o
![](https://velog.velcdn.com/images/robyn1_/post/9af084ba-f5f4-4d27-8901-0d8edc25718a/image.png)
![](https://velog.velcdn.com/images/robyn1_/post/2b9c1173-b451-4c7c-a06b-95b61f7c21d7/image.png)
![](https://velog.velcdn.com/images/robyn1_/post/f2681629-ca1a-42ac-a139-4eb11e30a043/image.png)

C_Overflow.java</code></pre><p>package com.kh.variable;</p>
<p>public class C_Overflow {
    public void overflow() {<br>        byte bNum2 = -128;
        bNum2 = (byte) (bNum2 - 1);
        System.out.println(&quot;bNum2: &quot; + bNum2);
    }
}</p>
<pre><code>
Run.java</code></pre><p>package com.kh.run;</p>
<p>import com.kh.variable.C_Overflow;</p>
<p>public class Run {</p>
<pre><code>public static void main(String[] args) {        
    C_Overflow co = new C_Overflow();
    co.overflow();
}</code></pre><p>}</p>
<pre><code>
콘솔</code></pre><p>bNum2: 127</p>
<pre><code>
위의 건 오버플로우, 밑의 건 언더플로우.

### 형변환 Casting
값 Data의 자료형을 바꾸는 것 (boolean 제외)

#### 컴퓨터의 값 처리 원칙
같은 종류 자료형만 대입 가능
같은 종류 자료형만 계산 가능
계산의 결과도 같은 종류의 값이 나와야 함
-&gt; 이러한 원칙이 지켜지지 않은 경우에 형 변환이 필요하다.
![](https://velog.velcdn.com/images/robyn1_/post/d3c9f03f-cb7f-4663-9dbe-77c7928ffef5/image.png)
![](https://velog.velcdn.com/images/robyn1_/post/98251e5e-3396-4012-a395-417cac320ccb/image.png)
![](https://velog.velcdn.com/images/robyn1_/post/4e4f19be-638f-450b-9cd4-823935030fd0/image.png)
***
D_Cast.java</code></pre><p>package com.kh.variable;</p>
<p>public class D_Cast {
    public void rule1() {
        int num = &#39;A&#39;;    // 자동 형변환
//        char는 유니코드로 저장 (정수 값 저장)
        System.out.println(&quot;num: &quot; + num);</p>
<pre><code>    char ch = 97;
    System.out.println(&quot;ch: &quot; + ch);

    char ch2 = (char) num;
    System.out.println(&quot;ch2: &quot; + ch2);

    int num2 = -97;
    char ch3 = (char) num2;
    System.out.println(&quot;ch3: &quot; + ch3);
}</code></pre><p>}</p>
<pre><code>
Run.java</code></pre><p>package com.kh.run;</p>
<p>import com.kh.variable.D_Cast;</p>
<p>public class Run {</p>
<pre><code>public static void main(String[] args) {        
    D_Cast dc = new D_Cast();
    dc.rule1();
}</code></pre><p>}</p>
<pre><code>
콘솔</code></pre><p>num: 65
ch: a
ch2: A
ch3: ﾟ</p>
<pre><code>***
D_Cast.java</code></pre><pre><code>public void rule2() {
    int iNum = 10;
    long lNum = 100;</code></pre><p>//        int sum = iNum + lNum;</p>
<p>//        int sum = iNum + lNum;
//        연산은 큰 자료형으로 자동 형변환 후 연산 처리가 되기 때문에 iNum이 long형으로 바뀌고
//        long형 + long형으로 결과까지 long형이 되었다.
//        long형 + long형으로 결과까지 long형이 되었음
//        long형의 결과 값은 int형에 담길 수 없으므로 컴파일 에러</p>
<p>//        해결 1. 수행 결과를 int로 강제 형변환
        int sum1 = (int) (iNum + lNum);
        System.out.println(&quot;sum1: &quot; + sum1);</p>
<p>//        해결 2. long형을 int로 강제 형변환
        int sum2 = iNum + (int)lNum;
        System.out.println(&quot;sum2: &quot; + sum2);</p>
<p>//        해결 3. long형으로 결과값을 받음
        long sum3 = iNum + lNum;
        System.out.println(&quot;sum3: &quot; + sum3);
    }</p>
<pre><code>
Run.java</code></pre><p>package com.kh.run;</p>
<p>import com.kh.variable.D_Cast;</p>
<p>public class Run {</p>
<pre><code>public static void main(String[] args) {        
    D_Cast dc = new D_Cast();
    dc.rule2();
}</code></pre><p>}</p>
<pre><code>
콘솔</code></pre><p>sum1: 110
sum2: 110
sum3: 110</p>
<pre><code>***
### 변수와 메모리 구조
![](https://velog.velcdn.com/images/robyn1_/post/b1d6ecb7-6d28-44bd-be5d-681fd4829ec4/image.png)

### 출력 메소드
![](https://velog.velcdn.com/images/robyn1_/post/d4f13700-9a96-4382-8ad7-cabea9d7121c/image.png)
format의 f
***
E_PrintMethod.java</code></pre><p>package com.kh.variable;</p>
<p>public class E_PrintMethod {
    public void printfMethod() {
        String str1 = &quot;안녕하세요&quot;;
        String str2 = &quot;반갑습니다&quot;;</p>
<pre><code>    System.out.printf(&quot;%s, robyn입니다. %s.&quot;, str1, str2);
}</code></pre><p>}</p>
<pre><code>
Run.java</code></pre><p>package com.kh.run;</p>
<p>import com.kh.variable.E_PrintMethod;</p>
<p>public class Run {</p>
<pre><code>public static void main(String[] args) {        
    E_PrintMethod ep = new E_PrintMethod();
    ep.printfMethod();
}</code></pre><p>}</p>
<pre><code>
콘솔 결과</code></pre><p>안녕하세요, robyn입니다. 반갑습니다.</p>
<pre><code>***
# Scanner
![](https://velog.velcdn.com/images/robyn1_/post/819728c1-2d9a-4d7b-ac66-d2434567853c/image.png)
System.in은 표준 입출력 부분을 뜻한다.
IO쯤 가면 파일, 객체 등의 방법으로 입출력하는 것을 배운다.
콘솔에 값을 입력해서 받아온다. in.
System.out은 출력하겠다는 뜻.
sc안에 담은 것. 메소드를 불러와야 함.

next라는 애가 데이터를 받아오는데, 그리고나선 변수에 담아야한다.</code></pre><p>String user = sc.next();</p>
<pre><code>next(), nextInt(), nextFloat(), nextDouble()은 enter값을 읽어오지 않는다.
\n(enter) X

nextLine()은 enter값을 읽어온다.
\n(enter) O

enter는 쏙 빼고 가져감. \n이 남아있다.
nextLine()은 \n을 받아온다. \n가 있네? 가져간다. 끝. 종결.
next()같이 버퍼를 남겨두는 것 밑에 nextLine()을 쓸 수 없겠다.
사용할 수 있는 방법은?
</code></pre><p>package com.kh.variable;</p>
<p>import java.util.Scanner;</p>
<p>public class F_KeyboardInput {</p>
<pre><code>public void inputScanner1() {</code></pre><p>//        이름, 나이, 키(소수점)를 받아와 출력함
//        사용자에게 값을 입력받기 위해 Scanner 사용
        Scanner sc = new Scanner(System.in);</p>
<pre><code>    System.out.print(&quot;이름을 입력하세요: &quot;);
    String name = sc.nextLine();

    System.out.print(&quot;나이를 입력하세요: &quot;);
    String stringAge = sc.nextLine();
    int age = Integer.parseInt(stringAge);

    System.out.print(&quot;주소를 입력하세요: &quot;);</code></pre><p>//        String address = sc.next();     // 캘리포니아 산타모니카라고 하면 캘리포니아만 나옴(띄어쓰기로 구분짓기 때문에)
//        String address = sc.nextLine();    // nextLine()은 엔터를 받아오기 때문에 nextIne()가 남겨놓은 엔터를 받아오면서 종결로 인지하기 때문에 사용자가 주소를 입력할 수 없음
        String address = sc.nextLine();</p>
<p>//        앞에 netLine()을 추가하거나 (age를 받을 때 엔터가 남지 않도록) 나이를 nextLine()로 받고 parseInt(파싱)를 해준다.
//        파싱 parsing이란? 문자열(String)로 받아온 것을 다른 형을 바꾸는 것.</p>
<pre><code>    /*
     * next()
     *         띄어쓰기 불가(띄어쓰기를 구분자로 받음)
     * nextLine()
     *         띄어쓰기 가능(띄어쓰기까지 모두 문자열로 받아서 가지고 옴)
     * */

    System.out.print(&quot;성별을 입력하세요: &quot;);
    String stringGender = sc.nextLine();
    char gender = stringGender.charAt(0);

    /*
    APPLE
    01234
    ZERO-INDEX
    LENGTH: 5
    String str = &quot;APPLE&quot;;
    charAt(n) method
    number(zero-index)

    char ch0 = str.charAt(0); ==&gt; &#39;A&#39;
    char ch1 = str.charAt(1); ==&gt; &#39;P&#39;
    char ch2 = str.charAt(4); ==&gt; &#39;E&#39;
    char ch3 = str.charAt(5); ==&gt; StringIndexOutOfException
    */

    System.out.println(name + &quot;(&quot; + age + &quot;, &quot; + gender + &quot;)님이 거주하는 곳은 &quot; + address + &quot;입니다.&quot;);
}</code></pre><p>}</p>
<p>```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[들어가며]]></title>
            <link>https://velog.io/@robyn1_/%EC%9E%90%EB%B0%94%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</link>
            <guid>https://velog.io/@robyn1_/%EC%9E%90%EB%B0%94%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</guid>
            <pubDate>Thu, 20 Apr 2023 05:45:00 GMT</pubDate>
            <description><![CDATA[<h1 id="프로그래밍이란">프로그래밍이란?</h1>
<ul>
<li><p>program 프로그램이란?
컴퓨터가 인식할 수 있는 명령어의 나열(집합)</p>
</li>
<li><p>programming 프로그래밍
프로그램을 작성하는 과정 = 코딩</p>
</li>
<li><p>programmer 프로그래머
프로그램을 작성하는 사람</p>
</li>
<li><p>programming language 프로그래밍 언어
프로그램을 작성하기 위한 언어 체계, 사람이 컴퓨터와 소통하게 하는 요소</p>
</li>
</ul>
<hr>
<h1 id="java란">Java란?</h1>
<ul>
<li>자바 언어 특정</li>
</ul>
<ol>
<li>운영체제에 독립적</li>
<li>사용하기 쉬운 언어<ul>
<li>다른 언어의 단점 보완 (포인터, 메모리 관리)</li>
<li><em><strong>객체 지향 언어</strong></em></li>
<li>능률적이고 명확한 코드 작성 가능</li>
</ul>
</li>
<li>자동 메모리 관리 Garbage Collection</li>
<li>네트워크와 분산환경 지원</li>
<li>멀티쓰레드 지원</li>
</ol>
<hr>
<ul>
<li>자바가 운영 체제에 독립적일 수 있는 이유
=&gt; JVM Java Virtual Machine
자바를 실행하기 위한 가상 기계로 플랫폼에 의존적
byte code(class파일)를 해석하고 실행하는 interpreter</li>
</ul>
<p>컴퓨터가 읽기 좋도록 Compiler가 Java code를 Java Byte Code로 바꿔준다.</p>
<p>다른 언어는 어떠한 운영체제를 쓰는 지에 영향을 많이 받지만 자바는 그렇지 않다.</p>
<p>자바 개발 환경에는 JVM, JRE, JDK Java Development Kit 등이 있다.
사용자/개발자 입장에 따라 설치하는 범위가 달라진다.</p>
<hr>
<h1 id="oracle닷컴에-들어가서-jdk를-설치하기">Oracle닷컴에 들어가서 jdk를 설치하기</h1>
<p><a href="https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html">https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html</a>
에 들어가서
Java SE Development Kit 8u202의
Windows x64를
다운로드한다.
로그인을 하면 다운로드가 된다.</p>
<p>jdk-8u202-windows-x64.exe 파일을 D 드라이브의 dev 폴더에 담았다.
설치를 하는 도중에 이런 창이 뜬다.
<img src="https://velog.velcdn.com/images/robyn1_/post/0059c822-6737-4eca-b52c-39927b098518/image.png" alt=""></p>
<p>C:\Program Files\Java 여기에 jdk와 jre가 생긴다.</p>
<hr>
<h1 id="환경변수-추가">환경변수 추가</h1>
<p>설치가 완료되면 내 PC -&gt; 마우스 오른쪽 클릭 -&gt; 속성 -&gt; 고급 시스템 설정 -&gt; 환경 변수 클릭 -&gt; 시스템 변수 PATH 편집 -&gt; 맨 밑에 <strong>C:\Program Files\Java\jdk1.8.0_202\bin</strong> 추가 -&gt; 확인, 확인, 확인</p>
<hr>
<h1 id="설치된-java의-version-확인하기">설치된 Java의 version 확인하기</h1>
<p>명령 프롬포트(실행 cmd)
<strong>java -version</strong>이라고 치면 다음과 같이 나온다.
<img src="https://velog.velcdn.com/images/robyn1_/post/aa8f52c4-dc47-4e36-9001-9e9faf9ecba0/image.png" alt="">
<strong>javac -version</strong>이라고 치면 다음과 같이 나온다.
<img src="https://velog.velcdn.com/images/robyn1_/post/5143dc72-a13f-4b0d-bab0-87c53fee4d6e/image.png" alt=""></p>
<hr>
<pre><code>public class HelloWorld{
    public static void main(String[] args){
        System.out.println(&quot;안녕&quot;);
    }
}</code></pre><p>위와 같이 작성한 메모장을 HelloWorld.java라는 이름으로 바탕화면에 저장한다.</p>
<p>명령 프롬포트에서 <strong>cd Desktop</strong>이라고 쳐서 바탕화면으로 이동한다.
<strong>javac HelloWorld.java</strong>라고 치면 다음과 같이 나온다.
<img src="https://velog.velcdn.com/images/robyn1_/post/aa9173b7-69c0-4d1f-862d-000878b066e4/image.png" alt=""></p>
<p>메모장의 내용을 다음과 같이 변경한 다음 다시 쳐본다.</p>
<pre><code>public class HelloWorld{
    public static void main(String[] args){
        System.out.println(&quot;robyn&quot;);
    }
}</code></pre><p><img src="https://velog.velcdn.com/images/robyn1_/post/3b845054-46e1-4f91-baa0-1ec0a6b2f042/image.png" alt="">
<strong>java HelloWorld</strong>라고 쳐본다.
<img src="https://velog.velcdn.com/images/robyn1_/post/c3aa341d-1cc2-412d-bc6b-c263c2ed2fc2/image.png" alt=""></p>
<hr>
<h1 id="eclipse-설치와-실행">Eclipse 설치와 실행</h1>
<p><a href="https://www.eclipse.org/downloads/">https://www.eclipse.org/downloads/</a>
sha-512 옆의 링크를 클릭해서 다운로드한다.</p>
<p>eclipse-inst-jre-win64를 D드라이브의 dev 폴더에 옮긴다.</p>
<p><img src="https://velog.velcdn.com/images/robyn1_/post/03fb09df-7466-4f7d-afd8-f52b0e1c2a43/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/19e31f93-9e3c-4018-9e18-dc8f78e9cbfa/image.png" alt="">
<img src="https://velog.velcdn.com/images/robyn1_/post/a454cbec-7cad-4da5-9669-c84d52e487bf/image.png" alt=""></p>
<p>select a directory as workspace에서 workspace를 다음과 같이 변경한다.
<img src="https://velog.velcdn.com/images/robyn1_/post/307d0815-ba04-4a5f-8136-6a3921428e3c/image.png" alt=""></p>
<p>create a project 클릭
Java Project 선택
Next &gt;
<img src="https://velog.velcdn.com/images/robyn1_/post/a28ccbff-c4e8-49c8-80ae-fa3f5fc77231/image.png" alt="">
Finish
Open Perspective</p>
<hr>
<h1 id="eclipse-환경에서의-자바-프로그래밍">Eclipse 환경에서의 자바 프로그래밍</h1>
<h3 id="클래스-생성">클래스 생성</h3>
<ul>
<li>src는 소스 코드들을 담는 곳이다.</li>
</ul>
<p>src 선택 후 마우스 오른쪽 클릭 -&gt; new -&gt; class</p>
<ul>
<li><p>패키지는 폴더명같은 것이다.
.이라는 것은 어디 안에 들어간다는 뜻이다.
com 안 project 안 first에 넣으려면 com.project.first라고 적어야한다.</p>
</li>
<li><p>패키지를 적어줘야하는 이유
<a href="https://docs.oracle.com/javase/8/docs/api/">Java™ Platform, Standard Edition 8
API Specification</a>
자바 자체에서도 클래스는 패키지 안에 들어있기 때문이다.</p>
</li>
</ul>
<p>Package와 Name을 적어주고 public static void main(String[] args)를 선택한 후 Finish
<img src="https://velog.velcdn.com/images/robyn1_/post/45738ed5-bc87-4efb-ae39-498aab829bd3/image.png" alt=""></p>
<p>다음과 같이 생성된다.
<img src="blob:https://velog.io/4d4f7703-7738-4f89-8c32-c47bc1fd31c3" alt="업로드중.."></p>
<p>console이 안 보이면 window -&gt; show view에서 console을 선택하면 된다.</p>
<p>다음을 run as -&gt; java application하면 콘솔창에 robyn이라고 뜬다.</p>
<pre><code>package com.kh.first;

public class HelloWorld {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(&quot;robyn&quot;);
    }

}
</code></pre><p>패키지, 클래스, 메소드, 주석</p>
<pre><code>package com.kh.first;    // 패키지

public class HelloWorld {    // 클래스

    public static void main(String[] args) {    // 메소드
        // TODO Auto-generated method stub
        System.out.println(&quot;robyn&quot;);

        // 한 줄 주석: 딱 한 줄만 주석 처리
        /*
         * 여러 줄 주석: 여러 줄 주석 처리
         * 계속
         * 주석이
         * 처리 됨
         * */
    }

}
</code></pre><hr>
<h3 id="클래스-작성-순서">클래스 작성 순서</h3>
<ol>
<li>package 선언</li>
<li>import 선언</li>
<li>class 작성부<pre><code>package member.model.vo;
</code></pre></li>
</ol>
<p>import java.util.Date;</p>
<p>public class Member{
//    멤버 변수
    private String name;
    private int age;
    private Date enrollDate;</p>
<pre><code>public Member() {}</code></pre><p>//    생성자 함수
    public Member(String name, int age, Date enrollDate) {
        super();
        this.name = name;
        this.age = age;
        this.enrollDate = enrollDate;
    }</p>
<p>//    멤버 함수
    public String getName() {
        return name;
    }</p>
<p>//    멤버 함수
    public void setName(String name) {
        this.name = name;
    }
}</p>
<pre><code>
[https://docs.oracle.com/javase/8/docs/api/](https://docs.oracle.com/javase/8/docs/api/)
***
# 자바 프로그래밍 기본
### class
자바에서 모든 코드는 반드시 클래스 안에 존재해야 하며 서로 관련된 코드들을 그룹으로 나누어 별도의 클래스를 구성한다. 클래스들이 모여 하나의 Java 애플리케이션을 구성한다.
</code></pre><p>public class 클래스 이름 {
    /*
    * 주석을 제외한 모든 코드는 블록 {} 내에 작성
    */
}</p>
<pre><code>### main
메소드의 종류이다.
main 메소드를 쓸 땐 무조건 다음과 같이 써야한다.
public static void main(String[] args)는 main 메서드 고정 선언부이다.
프로그램 실행 시 java.exe에 의해 호출된다.
모든 클래스가 main메서드를 가지고 있어야하는 것은 아니지만 하나의 java 애플리케이션에는 main 메서드를 포함한 클래스가 반드시 하나는 있어야 한다.</code></pre><pre><code>public static void main(String[] args) {    // 메소드</code></pre><p>//        메인 메서드의 선언부
//        실행될 문장들을 적는다.
    }
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[속성 - height]]></title>
            <link>https://velog.io/@robyn1_/%EC%86%8D%EC%84%B1-height</link>
            <guid>https://velog.io/@robyn1_/%EC%86%8D%EC%84%B1-height</guid>
            <pubDate>Sun, 09 Apr 2023 10:30:46 GMT</pubDate>
            <description><![CDATA[<p>height
요소의 높이 값을 결정</p>
<p>width와 마찬가지로 기본값이 auto이다.</p>
<p>height: auto|length|initial|inherit;</p>
<p>height: 100px;은 contents에 적용되는 것</p>
<p>%
defines the hieght in percent of the containing block</p>
<p>ex)
parent의 height가 200px이라면
child의 height가 50%일 때 100px로 적용된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[속성 - width]]></title>
            <link>https://velog.io/@robyn1_/%EC%86%8D%EC%84%B1-width</link>
            <guid>https://velog.io/@robyn1_/%EC%86%8D%EC%84%B1-width</guid>
            <pubDate>Sun, 09 Apr 2023 03:03:45 GMT</pubDate>
            <description><![CDATA[<p>width: auto|value|initial|inherit;</p>
<pre><code>            width: auto;    /* 기본값 */
            width: 100px;
            width: 100%;</code></pre><pre><code>&lt;!doctype html&gt;
&lt;html lang=&quot;ko&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;&gt;
    &lt;title&gt;form&lt;/title&gt;
    &lt;style&gt;
        .parent {
            border: 10px solid lightblue;
        }

        .child {
            width: 300px;
            border: 10px solid lightgray;
        }
    &lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div class=&quot;parent&quot;&gt;
        &lt;div class=&quot;child&quot;&gt;
            Box Model을 알아볼까요?
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/robyn1_/post/9bd42049-5453-4891-acd3-df3160ab6ac0/image.png" alt="">
contents에 width: 300px이 적용됨
<img src="https://velog.velcdn.com/images/robyn1_/post/92861b8f-c3a3-4294-926f-0d958afe076c/image.png" alt=""></p>
<p>자식 요소의 퍼센트 값은 부모 요소의 contents 영역에 영향을 받는다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[속성 - margin & padding]]></title>
            <link>https://velog.io/@robyn1_/%EC%86%8D%EC%84%B1-margin-padding</link>
            <guid>https://velog.io/@robyn1_/%EC%86%8D%EC%84%B1-margin-padding</guid>
            <pubDate>Sun, 09 Apr 2023 02:16:04 GMT</pubDate>
            <description><![CDATA[<p>%를 단위로 쓸 때 가로축을 기준으로 한다.
그래서 top과 bottom에 %를 넣었을 때도 가로축을 기준으로 적용이 된다.
<img src="https://velog.velcdn.com/images/robyn1_/post/9f745aa1-d44e-44e3-b205-2e17a43610fc/image.png" alt=""></p>
<pre><code>&lt;!doctype html&gt;
&lt;html lang=&quot;ko&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;&gt;
    &lt;title&gt;form&lt;/title&gt;
    &lt;style&gt;
        div {
            margin-left: -50px;

            border: 1px solid #000;
        }
    &lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div&gt;Box Model을 알아볼까요?&lt;/div&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/robyn1_/post/23d21087-d01c-4b1f-ad0a-d13963923814/image.png" alt="">
margin은 요소 간 여백을 설정할 때 쓰인다.
따라서 음수로 선언할 수도 있다.
음수 값이면 당겨짐.</p>
<p>padding은 음수값을 쓸 수 없기 때문에 음수값을 적어도 취소선이 그어지고 invalid property value라고 나옴. auto라고 입력했을 때도 마찬가지.</p>
<p>padding-left: 50%;로 선언했을 때
div의 부모가 body이기 때문에.</p>
<p>padding-top: 20%;로 줬을 때
양옆 창의 크기를 늘리면 가로축 값을 기준으로 하고 있기 때문에 같이 늘어난다.
margin-top도 마찬가지.
containing element의 width를 기준으로 한다. (여기선 div의 부모인 body)</p>
<p>inherited가 no라서 상속되지 않는다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[속성 - margin]]></title>
            <link>https://velog.io/@robyn1_/%EC%86%8D%EC%84%B1-margin</link>
            <guid>https://velog.io/@robyn1_/%EC%86%8D%EC%84%B1-margin</guid>
            <pubDate>Sun, 09 Apr 2023 02:01:39 GMT</pubDate>
            <description><![CDATA[<p>margin
요소의 바깥 여백</p>
<p>margin: length|auto|initial|inherit;</p>
<pre><code>            margin-top: 0;
            margin-right: 10px;
            margin-bottom: 20px;
            margin-left: 30px;

            margin: 0 10px 20px 30px;   /* 상, 우, 하, 좌 다름 */
            margin: 0 10px 20px;    /* 좌, 우 같음 */
            margin: 0 10px; /* 상, 하 같고 좌, 우 같음 */
            margin: 0;  /* 상, 우, 하, 좌 같음 */

            margin-left: auto;  /* 브라우저 계산 */
            /* ... */
            margin: auto;   /* 가로축 중앙 정렬(요소에 width값 필요) */</code></pre><p>margin: auto;를 써서 가로축 정렬을 할 때는 width를 필요로한다.</p>
<p>두 div에 대해 margin: 50px auto;를 했을 때 margin collapse가 발생한다.
top과 bottom 값이 겹치게 되면 조금 더 큰 값이 상위를 차지하게 되어서 큰 값으로 적용이 된다.
첫번째 div를 margin-bottom: 100px;로 변경한다면 두번째 div의 margin-top: 50px은 무시된다.</p>
]]></description>
        </item>
    </channel>
</rss>