<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>muggung_0222.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 13 Apr 2023 14:36:21 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>muggung_0222.log</title>
            <url>https://velog.velcdn.com/images/muggung_0222/profile/7d824ef4-0caa-4b40-a5c2-1f113ed03877/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. muggung_0222.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/muggung_0222" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[JDBC]]></title>
            <link>https://velog.io/@muggung_0222/JDBC</link>
            <guid>https://velog.io/@muggung_0222/JDBC</guid>
            <pubDate>Thu, 13 Apr 2023 14:36:21 GMT</pubDate>
            <description><![CDATA[<h1 id="jdbc란">JDBC란?</h1>
<p>JAVA에서 <strong>DB에 접근</strong>할 수 있게 해주는 API로
JDBC API를 사용해 자바 언어로 DB에 접근하고 읽고 쓸 수 있다.</p>
<h1 id="driver">DRIVER</h1>
<p>JDBC API로 DB에 접근할 때 DRIVER를 통해 DBMS에 접근한다. </p>
<blockquote>
<p>DRIVER는 각 DBMS 회사에서 제공한다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/muggung_0222/post/50f634d9-0c41-4207-a346-34e72771ca79/image.jpg" alt=""></p>
<p>😎 DRIVER를 찾는 방법은 자신이 쓰는 DBMS의 &#39;회사명 JDBC&#39;처럼 검색해보자
예시) ORACLE JDBC, MySQL JDBC</p>
<h2 id="libraries-등록">Libraries 등록</h2>
<p>다운받은 DRIVER를 이클립스 Library에 등록해보자</p>
<h3 id="--project-생성할-때-등록">- Project 생성할 때 등록</h3>
<p><img src="https://velog.velcdn.com/images/muggung_0222/post/c460ebd2-99c0-4ec4-ab48-70acdee5995d/image.jpg" alt=""></p>
<ul>
<li><code>NEXT</code>로 다음 페이지로 넘어가기</li>
</ul>
<p><img src="https://velog.velcdn.com/images/muggung_0222/post/929e813b-74d0-4ad3-912c-094ce8a2b6dc/image.jpg" alt=""></p>
<ul>
<li>① Libraries 탭 선택</li>
<li>② 다운받은 DRIVER 경로에 가서 <code>.jar</code>파일 가져오기</li>
<li>③ Finish 선택하면 끝</li>
</ul>
<h3 id="--생성된-project에-등록">- 생성된 Project에 등록</h3>
<p><img src="https://velog.velcdn.com/images/muggung_0222/post/e99764e6-e493-4707-8870-2c8713b55f1c/image.jpg" alt=""></p>
<ul>
<li>생성된 Project 우클릭 -&gt; <code>Build Path</code> -&gt; <code>Configure Build Path</code> 선택</li>
</ul>
<p><img src="https://velog.velcdn.com/images/muggung_0222/post/5b670a8b-1fd2-4e60-8115-53b77f6ba162/image.jpg" alt=""></p>
<ul>
<li>① Libraries 탭 선택</li>
<li>② Classpath 선택 </li>
<li>③ 다운받은 DRIVER 경로에 가서 <code>.jar</code>파일 가져오기</li>
<li>④ Finish 선택하면 끝</li>
</ul>
<h1 id="character-set-설정">Character Set 설정</h1>
<p>DB와 문자 인코딩 방식이 다를 경우 문자가 제대로 출력되지 않는다.
이를 방지하기 위해 이클립스 문자셋을 UTF-8로 일치시켜줘야 한다.</p>
<p><img src="https://velog.velcdn.com/images/muggung_0222/post/ac931471-8504-4741-a6aa-a4bc0b39178d/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/muggung_0222/post/127f5fa3-52df-484f-a2d4-1ac35a6ea273/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/muggung_0222/post/1db80570-f194-4d83-a0ec-e2d18b7cf465/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/muggung_0222/post/db65a393-708a-4843-8f52-e4a7e65c29e0/image.jpg" alt=""></p>
<h1 id="끝">끝</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[ORACLE(DML)]]></title>
            <link>https://velog.io/@muggung_0222/ORACLEDML</link>
            <guid>https://velog.io/@muggung_0222/ORACLEDML</guid>
            <pubDate>Sun, 09 Apr 2023 13:55:07 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>DML(Data Manipulation Language)은 DB에 데이터를 
조회, 삽입, 수정, 삭제하는 작업을 수행하는 구문으로,
크게 <strong>SELECT</strong>, <strong>INSERT</strong>, <strong>UPDATE</strong>, <strong>DELETE</strong> 4가지로 나뉜다.
(TABLE을 조작하는 언어)</p>
</blockquote>
<h1 id="select">SELECT</h1>
<p>DB에 데이터를 조회하는데 사용되며 SELECT 구문은 다음과 같다.</p>
<pre><code class="language-sql">-- SELECT 구문
SELECT 컬럼명        -- FROM TABLE의 조회하고 싶은 컬럼명

FROM 테이블명         -- 데이터를 조회하고 싶은 TABLE명

WHERE 조건            -- 조회하고 싶은 데이터의 조건

GROUP BY 컬럼명        -- 특정 컬럼을 기준으로 데이터를 그룹화(주로 그룹함수와 사용)

HAVING 그룹함수        -- 그룹화된 데이터에 대한 조건

ORDER BY 컬럼명        -- 정렬하고 싶은 컬럼명</code></pre>
<p>🙄 <code>WHERE</code>이랑 <code>HAVING</code>의 차이점은 뭐야?
😎 <u>그룹화된 데이터</u>의 유무이며, 유사한 역할을 한다.
하지만 <code>WHERE</code>절은 그룹화 이전에 필터링을 수행하고, 
HAVING 절은 그룹화 이후에 조건을 적용한다.</p>
<blockquote>
<p>SELECT문 실행순서
FROM -&gt; WHERE -&gt; GROUP BY -&gt; HAVING -&gt; SELECT -&gt; ORDER BY</p>
</blockquote>
<h2 id="select-키워드">SELECT 키워드</h2>
<pre><code class="language-sql">-- EMPLOYEE 테이블 전체 조회
SELECT *
FROM EMPLOYEE;

-- 산술연산 가능
SELECT 10 + 10
FROM DUAL;

-- 별칭
SELECT EMP_NAME AS 사원이름, EMP_NO AS &quot;사원 번호&quot;
FROM EMPLOYEE;

-- 리터럴
SELECT SALARY AS 월급, &#39;원&#39; AS 단위
FROM EMPLOYEE;

-- DISTINCT
-- 중복값을 한번씩만 표시 (SELECT절에 1회만 가능)
SELECT DISTICT 컬럼명
FROM 테이블명;

SELECT DISTINCT EMP_NAME AS 사원이름
FROM EMPLOYEE;</code></pre>
<h2 id="where-키워드">WHERE 키워드</h2>
<pre><code class="language-sql">-- WHERE
SELECT 컬럼명
FROM 테이블명
WHERE 조회하고 싶은 데이터의 조건

-- 이름이 &#39;핑구&#39;인 직원 찾기
SELECT EMP_NAME AS 사원이름
FROM EMPLOYEE
WHERE EMP_NAME = &#39;핑구&#39;;

-- 이름이 &#39;핑구&#39;이며 월급이 3,000,000원 이상인 사원 찾기
-- AND | OR
SELECT *
FROM EMPLOYEE
WHERE EMP_NAME = &#39;핑구&#39; AND SALARY &gt;= 3000000;
-- 이름이 &#39;핑구&#39;이거나 &#39;펭구&#39;인 사원 찾기
WHERE EMP_NAME = &#39;핑구&#39; OR EMP_NAME = &#39;펭구&#39;;

-- LIKE &amp; NOT LIKE
SELECT 컬럼명
FROM 테이블명
WHERE 컬럼명 LIKE 리터럴;
-- % : 포함된 문자 조회
-- _ : _ 개수만큼 문자 조회
SELECT EMP_NAME AS 사원이름
FROM EMPLOYEE
WHERE EMP_NAME LIKE &#39;핑%&#39;;        -- 핑씨 사원
WHERE EMP_NAME LIKE &#39;%핑%&#39;;        -- 핑이 포함된 이름
WHERE EMP_NAME LIKE &#39;핑_&#39;;        -- 핑씨 외자
WHERE EMP_NAME LIKE &#39;_핑_&#39;;        -- 가운데 핑이들어간 3글자 이름

-- 🙄 %, _ 둘 다 사용할 때는??
-- 😎 ESCAPE문을 쓰면 된다.

-- ESCAPE
SELECT EMP_NAME
FROM EMPLOYEE
WHERE EMP_NAME LIKE &#39;__|_%&#39; ESCAPE &#39;|&#39;;

-- IS NULL &amp; IS NOT NULL
SELECT 컬럼명
FROM 테이블명
WHERE 컬럼명 IS NULL || IS NOT NULL

SELECT *
FROM EMPLOYEE
WHERE MANAGER_ID IS NULL;        -- 매니저가 없는 직원 조회

-- IN
-- OR 연산자를 많이 쓸 때
SELECT 컬럼명
FROM 테이블명
WHERE 컬럼명 IN (리터럴, 리터럴 . . .);

SELECT *
FROM EMPLOYEE
WHERE DEPT_CODE IN (&#39;D6&#39;, &#39;D7&#39;);     -- 부서코드가 D6, D7인 직원

-- BETWEEN AND
SELECT 컬럼명
FROM 테이블명
WHERE 컬럼명 BETWEEN 최소범위 AND 최대범위;

SELECT *
FROM EMPLOYEE
-- 월급이 2,000,000원 ~ 4,000,000원인 사원
WHERE SALARY BETWEEN 2000000 AND 4000000;</code></pre>
<p><img src="https://velog.velcdn.com/images/muggung_0222/post/4c4f93c1-6564-46a9-ab2d-5305fae1ef2a/image.png" alt=""></p>
<hr>
<h1 id="insert">INSERT</h1>
<p>TABLE에 새로운 행을 삽입하는 명령어</p>
<pre><code class="language-sql">-- INSERT
INSERT INTO 테이블명 VALUES(컬럼대입 값, 컬럼대입 값...)

-- 테이블 생성
CREATE TABLE TEST(
    NAME VARCHAR2(15),
    AGE NUMBER
);

-- TEST 테이블에 행(ROW) 삽입
INSERT INTO TEST VALUES(&#39;핑구펭구&#39;, 5);

-- 특정컬럼에 값을 대입
INSERT INTO 테이블명(특정컬럼...) VALUES(컬럼대입 값, ...)

INSERT INTO TEST(NAME) VALUES(&#39;뽀로로&#39;);</code></pre>
<blockquote>
<p>이 때 <u>지정된 컬럼 수와 VALUES()의 컬럼 수, 데이터 타입이 같아야한다.</u>
지정되지 않은 컬럼의 값은 NULL이 대입</p>
</blockquote>
<h2 id="insertsubquery">INSERT(SUBQUERY)</h2>
<p>SUBQUERY를 통해 TABLE에 조건을 걸어 행을 삽입할 수 있다. </p>
<pre><code class="language-sql">-- SUBQUERY 사용
INSERT INTO 테이블명 (SUBQUERY)

-- 테이블 생성
CREATE TABLE TEST AS SELECT ANIMAL_NAME, ANIMAL_AGE, ZOOKEEPER_NAME
FROM ANIMAL JOIN ZOOKEEPER ON ANIMAL_CODE = ZOOKEEPER_ID 
WHERE 0 = 1;    -- FALSE를 통해 값을 가져오지 않는다.

-- SUBQUERY를 통해 행(ROW) 삽입
-- 나이가 10살 이상인 동물이름, 나이, 사육사이름 삽입
INSERT INTO TEST (
SELECT ANIMAL_NAME, ANIMAL_AGE, ZOOKEEPER_NAME
FROM ANIMAL 
    JOIN ZOOKEEPER ON ANIMAL_CODE = ZOOKEEPER_ID
WHERE ANIMAL_AGE &gt;= 10);</code></pre>
<blockquote>
<p>위와 똑같이 <u>지정된 컬럼 수와 SUBQUERY 컬럼 수와 타입이 같아야한다.</u></p>
</blockquote>
<h2 id="insert-all">INSERT ALL</h2>
<p>하나의 TABLE로 여러 TABLE의 값을 삽입할 수 있다.</p>
<pre><code class="language-sql">-- INSERT ALL
INSERT ALL 
    INTO 테이블명 VALUES(컬럼대입 값, 컬럼대입 값 . . .)
    INTO 테이블명 VALUES(컬럼대입 값, 컬럼대입 값 . . .)
SELECT 컬럼명, 컬럼명 . . .
FROM 테이블명;

-- 테이블 생성
CREATE TABLE ANIMAL_TYPE_TB
    AS SELECT ANIMAL_NAME, ANIMAL_AGE, ANIMAL_TYPE FROM ANIMAL
    WHERE 0 = 1;

CREATE TABLE ANIMAL_CODE_TB
    AS SELECT ANIMAL_NAME, ANIMAL_AGE, ANIMAL_CODE FROM ANIMAL
    WHERE 0 = 1;

-- ANIMAL_TYPE_TB랑 ANIMAL_CODE_TB에 데이터 한번에 삽입
INSERT ALL
    INTO ANIMAL_TYPE_TB VALUES(ANIMAL_NAME, ANIMAL_AGE, ANIMAL_TYPE)
    INTO ANIMAL_CODE_TB VALUES(ANIMAL_NAME, ANIMAL_AGE, ANIMAL_CODE)
SELECT ANIMAL_NAME, ANIMAL_AGE, ANIMAL_TYPE, ANIMAL_CODE
FROM ANIMAL;</code></pre>
<hr>
<h1 id="update">UPDATE</h1>
<p>TABLE에 있는 데이터를 수정하는 명령어
<code>WHERE</code>절을 이용해 특정 데이터를 수정할 수 있다.</p>
<pre><code class="language-sql">INSERT INTO TEST VALUES(&#39;핑구&#39;, 150);

-- UPDATE
UPDATE 테이블명
SET 열1 = 값1, 열2 = 값2, ...
WHERE 조건식;

UPDATE TEST 
SET AGE = 5
WHERE NAME = &#39;핑구&#39;</code></pre>
<blockquote>
<p>만약 <code>WHERE</code>을 사용하지 않으면 <u>전체 ROW를 수정한다.</u>
따라서 <code>WHERE</code>은 필수 👍</p>
</blockquote>
<hr>
<h1 id="delete">DELETE</h1>
<p>TABLE에 있는 행(ROW)을 삭제하는 명령어
<code>WHERE</code>절을 이용해 특정 ROW를 삭제할 수 있다.</p>
<pre><code class="language-sql">INSERT INTO TEST VALUES(&#39;펭구&#39;, 200);

-- DELETE
DELETE FROM 테이블명
WHERE 조건식;

DELETE FROM TEST
WHERE NAME = &#39;펭구&#39;;</code></pre>
<blockquote>
<p>만약 <code>WHERE</code>을 사용하지 않으면 <u>전체 ROW를 삭제한다.</u>
이 때, <code>ROLLBACK</code>을 통해 <code>COMMIT</code>하기전으로 되돌릴 수 있다.</p>
</blockquote>
<hr>
<h1 id="truncate">TRUNCATE</h1>
<p>TABLE의 전체 행(ROW)을 삭제할 때 사용하는 명령어
<code>DELETE</code>보다 수행 속도가 빠르지만 <code>ROLLBACK</code>을 통해 복구 불가능</p>
<pre><code class="language-sql">TRUNCATE TABLE 테이블명;</code></pre>
<h1 id="끝">끝</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL]]></title>
            <link>https://velog.io/@muggung_0222/SQL-a3rkwff7</link>
            <guid>https://velog.io/@muggung_0222/SQL-a3rkwff7</guid>
            <pubDate>Sun, 09 Apr 2023 12:14:54 GMT</pubDate>
            <description><![CDATA[<h1 id="sql이란">SQL이란?</h1>
<p>SQL(Structured Query Language)은 <strong>DB에서 데이터를 검색하고 
조작하기 위한 표준 검색 언어</strong>로,
DB에서 TABLE을 생성하고 수정, 삭제, 검색 등의 작업에 쓰인다.</p>
<p><img src="https://velog.velcdn.com/images/muggung_0222/post/943b098f-f2d7-4d84-952a-f06581695eaa/image.jpg" alt=""></p>
<blockquote>
<p>한마디로 DB에서 사용하는 명령어들을 SQL이라한다.</p>
</blockquote>
<h1 id="oracle">ORACLE</h1>
<p>오라클은 대규모 데이터베이스 처리를 위한 기능과 기술을 제공한다.</p>
<h2 id="dbadatabase-administrator">DBA(Database Administrator)</h2>
<p>DB에 대한 모든 권한을 가진 DB의 <u><strong>관리자</strong></u> 역할을 한다.</p>
<p>DBA가 계정을 생성하면서 저장 공간을 같이 생성해준다.
다른 응용 프로그램에서 사용하는 생성 방법은 사용할 공간을 만들고 해당 공간을 쓸 계정을 부여하는 방식이다. - (lee_bb님 벨로그 참고)</p>
<blockquote>
<p>계정을 생성할 때도 DBA를 통해 생성하고
생성한 계정으로 TABLE을 만들 때도 DBA의 권한을 받아야 사용가능</p>
</blockquote>
<h2 id="계정생성--권한부여">계정생성 &amp; 권한부여</h2>
<pre><code class="language-sql">-- 계정생성 명령어
CREATE USER 계정명 IDENTIFIED BY 비밀번호
DEFAULT TABLESPACE ON USERS;

-- 18C 버전부터 계정생성할 때 ##을 붙여줘야된다.
-- _oracle_script 설정을 true로 변경하면 ##을 안붙여도 된다.
-- 프로그램 종료하면 다시 SESSION에 접근해줘야 함
ALTER SESSION SET&quot;_ORACLE_SCRIPT&quot;=TRUE;

-- 계정권한 부여
-- CONNECT : 계정연결 권한
-- RESOURCE : 객체생성,수정,삭제 권한
GRANT CONNECT, RESOURCE 권한명 OR 롤(역할) TO 사용자 계정명;

-- DB 사용자 조회
SELECT * FROM DBA_USERS; </code></pre>
<h1 id="끝">끝</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[DATABASE]]></title>
            <link>https://velog.io/@muggung_0222/DATABASE</link>
            <guid>https://velog.io/@muggung_0222/DATABASE</guid>
            <pubDate>Sun, 09 Apr 2023 10:03:56 GMT</pubDate>
            <description><![CDATA[<h1 id="db란">DB란?</h1>
<p>DATABASE(DB)는 조직에 필요한 연관된 데이터를 모으고 중복되는 데이터를 최소화하여 구조적으로 통합/저장 해놓은 것이다.</p>
<p>예를 몇가지 들면</p>
<ul>
<li>쇼핑몰 : 상품정보, 구매자정보, 판매자정보</li>
<li>병원 : 환자정보, 진단정보</li>
<li>학교 : 학생정보, 수강정보</li>
</ul>
<blockquote>
<p>DB는 연관된 데이터를 묶어서 정리해놓은 데이터 &#39;창고&#39;</p>
</blockquote>
<h2 id="db-특징">DB 특징</h2>
<ol>
  <li>계속적인 변화</li>
  <li>실시간접근에 용이</li>
  <li>동시 공유</li>
  <li>내용에 따른 참조</li>
</ol>

<blockquote>
<p>DB는 데이터를 실시간으로 공유해서 사용할 수 있다는 특징이 있다.
또한 프로그램을 종료해도 다시 데이터를 불러올 수 있다.</p>
</blockquote>
<h1 id="dbms">DBMS</h1>
<p>DB의 단점을 보완하며 DB를 관리할 수 있게 여러 기능을 제공하는
<strong>데이터베이스 전용 프로그램</strong>(ORACLE, MYSQL, MONGODB...)</p>
<p>😕 그럼 DB랑 DBMS의 차이점이 뭐야??
😀 DBMS = DB를 관리하는 프로그램 | DB = DBMS에 의해 관리되는 데이터집합</p>
<blockquote>
<p>위에서 DB의 특징에 대해 적어놨는데 여기에는 단점이 있다.</p>
</blockquote>
<ol>
<li>동시성 : 같은 파일에 대한 수정, 삭제 (병목현상)</li>
<li>성능 : 여럿이서 쓰다보니 기다려야함</li>
<li>보안 : 네트워크 기반으로 접근하다보니 보안 능력 저하</li>
</ol>
<p>이를 해결하기 위해 DBMS를 사용한다.</p>
<h2 id="dbms의-특징">DBMS의 특징</h2>
<ol>
  <li>데이터 독립화로 동시성 해결</li>
  <li>데이터 중복 최소화, 무결성 보장</li>
  <li>데이터 보안 향상(권한부여)</li>
  <li>관리 편의성 향상</li>
</ol>

<p>바로 DB에 접근하는 것이 아닌, DBMS에 접근해서
관리자가 허락할 경우 DB에 접근하는 방식</p>
<p><img src="https://velog.velcdn.com/images/muggung_0222/post/1780c437-2b24-4222-806d-b011162eba5d/image.jpg" alt=""></p>
<blockquote>
<p>아래는 내가 이해하기 위해 예제를 만들었다.</p>
</blockquote>
<p>병원을 예로 들어</p>
<ul>
<li>환자정보</li>
<li>진료정보</li>
<li>처방정보</li>
</ul>
<p>한 환자가 병원에 찾아와 진료를 받고 처방을 받았다.</p>
<ul>
<li>환자정보 : 환자이름, 환자나이, 환자증상</li>
<li>진료정보 : 환자나이, 환자증상, 소견서</li>
<li>처방정보 : 환자이름, 소견서, 처방약</li>
</ul>
<p>위의 예시를 보면 같은 데이터가 각 정보에 중복되어 있는걸 볼 수 있는데
이를 해결할 수 있는게 DBMS다.</p>
<ul>
<li>환자정보 : 환자이름, 환자나이, 환자증상</li>
<li>진료정보 : 환자정보(나이, 증상), 소견서</li>
<li>처방정보 : 진료정보(환자정보, 소견서), 처방약</li>
</ul>
<blockquote>
<p>더 깔끔해져서 보기도 쉽다. ✌️
또한 JAVA처럼 접근권한이 필요해서 함부로 &#39;환자정보&#39;나 &#39;진료정보&#39;를 확인할 수 없게 할 수 있다.</p>
</blockquote>
<h1 id="끝">끝</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA Override]]></title>
            <link>https://velog.io/@muggung_0222/JAVA-Override</link>
            <guid>https://velog.io/@muggung_0222/JAVA-Override</guid>
            <pubDate>Sat, 25 Mar 2023 17:23:22 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>왜 equals(), toString(), hashCode()를 오버라이딩 하는 걸까??</p>
</blockquote>
<p>내가 생성한 클래스들은 Object를 최상위 클래스로 상속받고 있다.
그래서 내 클래스에서도 Object 클래스의 메서드를 사용할 수 있다.</p>
<p>Object 클래스 중 <code>equals()</code> <code>toString()</code> <code>hashCode()</code>을 왜 오버라이딩 해야하는지 궁금증이 생겨 정리해보았다.</p>
<h1 id="equals">.equals()</h1>
<p><code>equals()</code> 메서드는 <u>&#39;객체간의 동등성 비교를 <code>boolean</code> 타입으로 반환&#39;</u> 하는 기능을 한다.</p>
<p>즉, 객체간의 <strong>&#39;주소 값&#39;</strong>을 비교한다.</p>
<pre><code class="language-java">public class Food {
    public String food;
    public int spicy;

    public Food() {}

    public Food(String food, int spicy) {
        this.food = food;
        this.spicy = spicy;
    }
}</code></pre>
<pre><code class="language-java">public class Eat {
    public static void main(String[] arg) {
        Food food = new Food(&quot;떡볶이&quot;, 3);
        Food food2 = new Food(&quot;떡볶이&quot;, 5);
        Food food3 = new Food(&quot;떡볶이&quot;, 3);

        System.out.println(food == food2);
        System.out.println(food == food3);
        System.out.println(food2 == food3);

        System.out.println(food.equals(food2));
        System.out.println(food.equals(food3));
        System.out.println(food2.equals(food3));
        // 전부 false
    }
}</code></pre>
<p>위의 예제에 <code>food</code> 와 <code>food3</code>처럼 사람이 보기엔 같은 데 주소 값이 다르기에 <code>false</code>가 출력된다.</p>
<p>😵‍💫 <code>==</code>와 <code>.equals()</code>가 헷갈려...
😃 일단 <code>.equals()</code>가 두 종류 있다는 걸 알아야한다.</p>
<ul>
<li><code>String타입.equals()</code></li>
<li><code>Object타입.equals()</code></li>
</ul>
<p>먼저 <code>==</code> 연산자는 <strong>두 객체의 주소 값을 비교</strong>한다.
<code>String타입.equals()</code>는 <strong>실제 값을 비교</strong>한다.
<code>Object타입.equals()</code>는 <strong>두 객체의 주소 값을 비교</strong>한다.</p>
<p><code>String타입.equals()</code>는 <code>equals()</code>가 오버라이딩 되어있기 때문이다.</p>
<h2 id="equals-오버라이딩">.equals() 오버라이딩</h2>
<p>위의 예제처럼 <code>.equals()</code>를 통해 내용을 비교하고 싶다면 오버라이딩을 사용하면 해결된다. (음식 이름과 매운 정도가 같으면 같다고 정의한다.)</p>
<pre><code class="language-java">public class Food {
    public String food;
    public int spicy;

    public Food() {}

    public Food(String food, int spicy) {
        this.food = food;
        this.spicy = spicy;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Food) {
            Food fd = (Food) obj;
            if(this.food == fd.food &amp;&amp; this.spicy == fd.spicy) {
                return true;
            } else {
                return false;
            }
        }
        return false;
    }
}</code></pre>
<pre><code class="language-java">public class Eat {
    public static void main(String[] arg) {
        Food food = new Food(&quot;떡볶이&quot;, 3);
        Food food2 = new Food(&quot;떡볶이&quot;, 5);
        Food food3 = new Food(&quot;떡볶이&quot;, 3);

        System.out.println(food.equals(food2));        // false
        System.out.println(food.equals(food3));        // true
        System.out.println(food2.equals(food3));    // false
    }
}</code></pre>
<h1 id="tostring">.toString()</h1>
<p><code>toString()</code> 메서드는 <u>&#39;객체가 가지고 있는 값을 문자열로 반환&#39;</u> 하는 기능을 한다.</p>
<p>즉, 참조형 변수를 <code>toString</code> 하면 참조형 변수의 주소 값을 반환한다.
(정확히는 <code>클래스명@주소 값</code> 처럼 반환한다.)</p>
<pre><code class="language-java">public class Food {
    public String food;

    public Food() {}

    public Food(String food) {
        this.food = food;
    }
}</code></pre>
<pre><code class="language-java">public class Eat {
    public static void main(String[] arg) {

        Food favorite = new Food(&quot;떡볶이&quot;);

        System.out.println(favorite);                // Food@24d46ca6
        System.out.println(favorite.toString());    // Food@24d46ca6
    }
}</code></pre>
<p>😕 왜 <code>favorite</code>은 <code>favorite.toString()</code>과 같은 값을 출력한걸까??</p>
<p>😀 <code>System.out.print()</code>을 사용할 때 참조형 변수를 넣으면
자동으로 <code>toString()</code>메서드가 작동한다.</p>
<p>✌️ 참고로 <code>String</code>과 <code>File</code> 클래스는 이미 <strong>재정의 되어있다.</strong></p>
<ul>
<li><p>String : 값을 반환</p>
</li>
<li><p>File : 주소 값을 반환</p>
<pre><code class="language-java">public class Test {
  public static void main(String[] arg) {
      String food = &quot;매운 떡볶이&quot;;
      File foodFile = new File(&quot;C\\떡볶이 레시피.txt&quot;);

      System.out.println(food);        // 떡볶이
      System.out.println(foodFile);    // C\떡볶이레시피.txt
  }
}</code></pre>
</li>
</ul>
<h2 id="tostring-오버라이딩">.toString() 오버라이딩</h2>
<p>내가 만든 <code>Food</code> 클래스 또한 <code>Object</code> 클래스를 상속받고 있기에
오버라이딩을 사용해 <code>Food</code>만의 <code>toString</code>을 재정의 할 수 있다.</p>
<pre><code class="language-java">public class Food {
    public String food;

    public Food() {}

    public Food(String food) {
        this.food = food;
    }

    @Override
    public String toString() {
        return &quot;나는 &quot; + this.food + &quot;를(을) 정말 좋아한다.&quot;;
    }
}</code></pre>
<pre><code class="language-java">public class Eat {
    public static void main(String[] arg) {

        Food favorite = new Food(&quot;떡볶이&quot;);

        System.out.println(favorite);                // 나는 떡볶이를(을) 정말 좋아한다.
        System.out.println(favorite.toString());    // 나는 떡볶이를(을) 정말 좋아한다.
    }
}</code></pre>
<h1 id="hashcode">.hashCode()</h1>
<blockquote>
<p><code>hashCode()</code>가 제일 이해가 안갔다...</p>
</blockquote>
<p><code>hashCode()</code> 메서드는 <u>&#39;객체를 지칭하는 고유한 값을 정수 값으로 반환&#39;</u> 하는 기능을 한다.</p>
<p>즉, 객체의 주소 값이다.</p>
<p><code>hashCode()</code> 메서드를 이해하기 힘들었던 부분은 <code>equals()</code>를 오버라이딩하면 <code>hashCode()</code> 또한 재정의를 꼭 해야한다는 부분이 어려웠다.</p>
<p>예시를 봐보자</p>
<pre><code class="language-java">public class Food {
    public String food;
    public int spicy;

    public Food() {}

    public Food(String food, int spicy) {
        this.food = food;
        this.spicy = spicy;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Food) {
            Food fd = (Food) obj;
            if(this.food == fd.food &amp;&amp; this.spicy == fd.spicy) {
                return true;
            } else {
                return false;
            }
        }
        return false;
    }
}</code></pre>
<pre><code class="language-java">public class Eat {
    public static void main(String[] arg) {
        Food food = new Food(&quot;떡볶이&quot;, 3);
        Food food2 = new Food(&quot;떡볶이&quot;, 5);
        Food food3 = new Food(&quot;떡볶이&quot;, 3);

        System.out.println(food.equals(food2));        // false
        System.out.println(food.equals(food3));        // true
        System.out.println(food2.equals(food3));    // false

        System.out.println(food.hashCode());        // 6179012
        System.out.println(food2.hashCode());        // 1159190
        System.out.println(food3.hashCode());        // 9258584
    }
}</code></pre>
<p><code>food</code>와 <code>food3</code>를 비교하면 <code>true</code>가 나온다.
하지만 <code>.hashCode()</code>를 사용하면 서로 다른 정수 값을 가진다.</p>
<p>🙄 결국 <code>true</code>를 출력했으니 된게 아닐까?
🤐 아니었다.
<code>equals()</code>와 <code>hashCode()</code>를 같이 재정의 해야되는 이유는
자바의 라이브러리, 컬렉션 프레임워크가 <code>equals()</code>와 <code>hashCode()</code> 둘 다 사용하기 때문이다.</p>
<h2 id="hashcode-오버라이딩">.hashCode() 오버라이딩</h2>
<p>위와 같은 문제는 <code>.equals()</code>만 재정의할 경우다.</p>
<p>아래와 같이 <code>hashCode()</code> 또한 재정의해주면 해결된다.</p>
<pre><code class="language-java">public class Food {
    public String food;
    public int spicy;

    public Food() {}

    public Food(String food, int spicy, int num) {
        this.food = food;
        this.spicy = spicy;
    }

    @Override
    public int hashCode() {
        return Objects.hash(food, spicy);
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Food) {
            Food fd = (Food) obj;
            if(this.num == fd.num) {
                return true;
            } else {
                return false;
            }
        }
        return false;
    }
}</code></pre>
<pre><code class="language-java">public class Eat {
    public static void main(String[] arg) {
        Food food = new Food(&quot;떡볶이&quot;, 3, 1);
        Food food2 = new Food(&quot;떡볶이&quot;, 5, 2);
        Food food3 = new Food(&quot;떡볶이&quot;, 3, 1);

        System.out.println(food.equals(food2));        // false
        System.out.println(food.equals(food3));        // true
        System.out.println(food2.equals(food3));    // false

        System.out.println(food.hashCode());        // 1433263365
        System.out.println(food2.hashCode());        // 1433263367
        System.out.println(food3.hashCode());        // 1433263365
    }
}</code></pre>
<h2 id="끝">끝!</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA 복습]]></title>
            <link>https://velog.io/@muggung_0222/JAVA-%EB%B3%B5%EC%8A%B5</link>
            <guid>https://velog.io/@muggung_0222/JAVA-%EB%B3%B5%EC%8A%B5</guid>
            <pubDate>Sun, 19 Mar 2023 14:26:45 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>JAVA 객체에 대한 문제를 보면서 아직 내 것으로 만들지 못했다고 느꼈다...
똑같은 문제, 똑같은 로직인데도 코드를 짜다가 멈추고를 반복했다.</p>
</blockquote>
<p><strong>- 내가 어느 부분을 어려워 했는지</strong>
<strong>- 내가 어느 부분을 대충 넘어갔는지</strong>
위의 두 가지를 계속 생각하며 혼자 찾아보거나, 코드를 짜거나
강사님께 질문했다. 복습하면서 나중에 잊더라도 찾아보자</p>
<h1 id="overloading과-overriding">Overloading과 Overriding</h1>
<p>개념을 배울 때 이해가 안되는 건 아니였지만,
막상 코드를 짜다보니 두 개념이 헷갈렸다.</p>
<h2 id="overloading">Overloading</h2>
<p>한 클래스 내에 동일한 이름의 메소드를 여러 개 작성하는 것이다.
아래의 예시 코드를 보면 나는 <code>delete</code>의 이름을 가진 메소드를 
2개 생성했다.</p>
<pre><code class="language-java">    // 회원정보 하나 삭제
    public boolean delete(String id) {    
        for(int i=0; i&lt;m.length; i++) {
            if(m[i] != null &amp;&amp; m[i].getId().equals(id)) {
                m[i] = null;
                return true;
            }
        }
        return false;
    }

    // 전체회원정보 삭제
    public void delete() {
        for(int i=0; i&lt;m.length; i++) {
            m[i] = null;
        }
    }</code></pre>
<p>하지만 <u>매개변수의 개수와 타입이 다르다면 같은 이름의 메소드를
사용할 수 있다.</u>
<strong>(단, return 값만 다르다면 오버로드할 수 없다.)</strong></p>
<h2 id="overriding">Overriding</h2>
<p>상속관계인 클래스에서 부모클래스에 선언된 메소드를 자식클래스가 재정의하는 것 (부모클래스에 선언된걸 자식클래스에서 덮어쓰기)</p>
<pre><code class="language-java">// 부모 클래스
public class OverrideParent {
    public void print() {
        System.out.println(&quot;!이건 부모클래스 함수!&quot;);
    }
 }</code></pre>
<pre><code class="language-java">// 자식 클래스
public class OverrideChild extends OverrideParent {
    @Override
    public void print() {
        System.out.println(&quot;!이건 자식클래스 함수!&quot;);
    }
}
</code></pre>
<pre><code class="language-java">// 실행
OverrideParent op = new OverrideParent();
op.printMsg();            // !이건 부모클래스 함수!

OverrideChild oc = new OverrideChild();
oc.printMsg();            // !이건 자식클래스 함수!</code></pre>
<p><strong>(단, 메소드, 매개변수 개수, 매개변수 타입, 리턴 타입이 동일해야하고,
<code>private</code>와 <code>final</code> 메소드는 오버라이딩 불가능)</strong></p>
<h1 id="static">Static</h1>
<ul>
<li><code>static</code>을 이용하면 정적필드와 정적메소드를 만들 수 있다.</li>
</ul>
<ul>
<li><code>static</code>은 클래스로 인식하기에 클래스의 로딩이 끝나는 즉시 사용할 수 있다.
또 <code>static</code>은 힙 영역이 아닌 static 영역에 할당된다.</li>
</ul>
<ul>
<li><p>static 영역의 장점으로 여러 객체가 공유해서 접근할 수 있는 장점이 있지만
static 영역은 GC가 관여하지 못하기에 프로그램이 종료될 때까지 메모리가 할당된 채로 존재하기에 너무 <code>static</code>을 많이 쓰면 시스템에 악영향을 끼칠 수 있다.</p>
</li>
<li><p>static을 선언한 클래스 맴버는 new로 인해 인스턴스를 생성하지 않아도 접근할 수 있다.</p>
</li>
</ul>
<pre><code class="language-java">public class Test() {
    public void testPrint() {
        System.out.println(&quot;생성자를 만들어야함!&quot;);
    }

    public static void staticTestPrint() {
        System.out.println(&quot;생성자 안만들어도 돼!&quot;);
    }
}</code></pre>
<pre><code class="language-java">public class StaticTest {
    public static void main(String[] args) {
        // static을 선언안한 경우 생성해서 사용
        Test test = new Test();
        test.testPrint();

        // static을 선언한 경우
        Test.staticTestPrint();
    }
}</code></pre>
<h1 id="stackoverflow">StackOverflow</h1>
<p>스택 영역의 메모리 크기보다 더 많이 사용할 경우 발생하는 에러로,
보통 스택 영역은 원시 타입, 또는 객체의 주소 값을 저장하는 데
GC에 의해 관리된다.</p>
<p>학원과제를 풀던 중 아래와 같은 코드를 작성했을 때,
왜 이런 에러가 뜨는지 몰랐다.</p>
<pre><code class="language-java">// 학생 화면을 담당하는 클래스
public class MainView {
    Scanner sc = new Scanner(System.in);
    StudentController controller = new StudentController();
    ...
}

// 학생 관리 프로그램의 기능을 담당하는 클래스
public class StudentController {
    MainView mv = new MainView();
    ...
}</code></pre>
<p>위의 MainView와 StudentController를 보면,
new 생성자를 통해 서로를 계속 실행시켜 무한루프에 빠진다.
처음에 이해가 안가서 그림을 그리고 보니 이해가 갔다.
(아래 그림처럼 계속 서로를 new 생성자로 호출)
<img src="https://velog.velcdn.com/images/muggung_0222/post/3b85c5ef-e27e-4aeb-bc4b-70b1bfb07333/image.jpg" alt=""></p>
<h1 id="return">return</h1>
<p>return도 학원과제를 풀던 중 이해를 잘 하지못하고 사용하다 이해했다.</p>
<pre><code class="language-java">public void inputMenu() {
        while(true) {
        System.out.println(&quot;===== 도형 프로그램 =====&quot;);
        System.out.println(&quot;3. 삼각형&quot;);
        System.out.println(&quot;4. 사각형&quot;);
        System.out.println(&quot;9. 프로그램 종료&quot;);
        System.out.print(&quot;메뉴 번호 : &quot;);
        int choiceMenu = sc.nextInt();

        switch(choiceMenu) {
            case 3 : triangleMenu(); break;
            case 4 : squareMenu(); break;
            case 9 : System.out.println(&quot;프로그램 종료&quot;); return;
            default : System.out.println(&quot;잘못된 번호입니다. 다시 입력해주세요.&quot;); break;
            }
        }
    }

    public void triangleMenu() {
        while(true) {
        System.out.println(&quot;===== 삼각형 =====&quot;);
        System.out.println(&quot;1. 삼각형 면적&quot;);
        System.out.println(&quot;2. 삼각형 색칠&quot;);
        System.out.println(&quot;3. 삼각형 정보&quot;);
        System.out.println(&quot;9. 메인으로&quot;);
        System.out.print(&quot;메뉴 번호 : &quot;);
        int choiceMenu = sc.nextInt();

        switch(choiceMenu) {
            case 1 : inputSize(3, 1); break;
            case 2 : inputSize(3, 2); break;
            case 3 : printlnformation(3); break;
            // 여기가 문제!!
            case 9 : System.out.println(&quot;메인으로 돌아갑니다.&quot;); inputMenu(); return;
            default : System.out.println(&quot;잘못된 번호입니다. 다시 입력해주세요.&quot;);
            }
        }
    }</code></pre>
<p>위처럼 코드를 짜고 실행해보니 <code>9</code>번을 입력하면 <code>inputMenu()</code>로 돌아가길 바랬다.</p>
<p>하지만 계속 <code>inputMenu()</code>가 두 번 실행되어 종료를 두 번해야지
종료가 되었는데... 알고보니 위의 주석처리처럼 문제가 있었다.</p>
<p><strong>return을 사용하면 그 즉시 해당 메소드를 중지하고 호출한 메소드로 돌아가는 것</strong>, 이걸 나는 해당 메소드를 중지하는 것으로 끝인줄 알고 있었다... (그림참고)
<img src="https://velog.velcdn.com/images/muggung_0222/post/05e0863b-60b9-4922-8c96-51f26b371d0c/image.png" alt=""></p>
<p>덕분에 잘못된 개념도 고치고 배우게 된 점도 있었다.</p>
<h2 id="끝">끝!</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA 접근제한자]]></title>
            <link>https://velog.io/@muggung_0222/JAVA-%EC%A0%91%EA%B7%BC%EC%A0%9C%ED%95%9C%EC%9E%90</link>
            <guid>https://velog.io/@muggung_0222/JAVA-%EC%A0%91%EA%B7%BC%EC%A0%9C%ED%95%9C%EC%9E%90</guid>
            <pubDate>Mon, 13 Mar 2023 15:31:58 GMT</pubDate>
            <description><![CDATA[<h2 id="--접근제한자">- 접근제한자</h2>
<p>접근제한자는 이름 그대로 어디까지 접근을 허용하는지를 나타낸다.
(한 개의 프로젝트 내에서 패키지단위로 범위 표현)</p>
<h2 id="--클래스-접근제한자">- 클래스 접근제한자</h2>
<p><img src="https://velog.velcdn.com/images/muggung_0222/post/d0c19f94-b9db-4e98-af3c-801d01982b1c/image.jpg" alt=""></p>
<h2 id="--필드-접근제한자">- 필드 접근제한자</h2>
<p><img src="https://velog.velcdn.com/images/muggung_0222/post/5d176bd4-a0b1-4998-83f1-f5287202ee4f/image.jpg" alt=""></p>
<h2 id="--메소드-접근제한자">- 메소드 접근제한자</h2>
<p><img src="https://velog.velcdn.com/images/muggung_0222/post/cdee9378-7acb-4bde-a4b9-a39015914f16/image.jpg" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA 객체]]></title>
            <link>https://velog.io/@muggung_0222/JAVA-%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@muggung_0222/JAVA-%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Mon, 13 Mar 2023 15:24:11 GMT</pubDate>
            <description><![CDATA[<h2 id="--객체란">- 객체란?</h2>
<p>객체는 현실에 존재하는 사물이나 개념으로,
객체지향 언어에서의 객체는 <u>클래스에 정의된 내용대로 메모리에할당된
결과물이다.</u></p>
<p>얼굴을 예로 들면, &#39;얼굴&#39;에는 &#39;눈&#39;, &#39;코&#39;, &#39;입&#39;등 여러 기관들이 있다.
여기서 &#39;눈&#39;, &#39;코&#39;, &#39;입&#39;은 얼굴을 표현하기 위한 객체다.</p>
<p>프로그래밍에서 객체는 무언가를 코딩으로 표현하는 것</p>
<h2 id="--객체의-할당">- 객체의 할당</h2>
<p>객체는 할당할 때 <u>new 연산자와 생성자를 사용해 클래스 자료형을 갖는다.</u>
이 때, <u>new연산자를 사용하면 힙 영역에 새로운 저장공간을 생성하게 된다.</u>
<img src="https://velog.velcdn.com/images/muggung_0222/post/9eeca974-d3a5-4f6c-a8e7-c237cf8a6937/image.jpg" alt=""></p>
<h2 id="--클래스란">- 클래스란?</h2>
<p>클래스는 객체를 생성하기 위한 설계도라고 생각하면 된다.</p>
<p>예를 들어 의류 공장이 있고 의류 공장에서 &#39;패딩&#39;, &#39;상의&#39;, &#39;하의&#39; 등을
생산해낸다고 가정하자.
여기서 의류 공장은 <u>클래스</u>이고, 의류 공장에서 생성한 옷들은 <u>객체</u>다.
<img src="https://velog.velcdn.com/images/muggung_0222/post/c50d78d7-5e1d-47db-9d18-1c7a44aa0da5/image.jpg" alt=""></p>
<p>🙄 그럼 클래스를 왜 쓰는걸까?
😀 만약 학생 정보를 입력한다고 가정하자 그리고 학생 수가 1000명이라면
변수 하나 하나에 학생 정보를 입력해야된다.</p>
<p>배열을 사용할 수 있겠지만 기능까지 추가한다고 한다면 복잡해질거다.
하지만 학생 클래스를 만들고 학생 정보객체를 간단하게 뽑아낼 수 있다면
조금 덜 고생할 수 있을거다. 그래서 클래스를 사용한다.</p>
<pre><code class="language-java">// 학생 입력
String student1 = &quot;이름은 둘리, 나이는 100살, 성별 남&quot;;
String student2 = &quot;이름은 또치, 나이는 6살, 성별 여&quot;;
String student3 = &quot;이름은 도우너, 나이는 200살, 성별 남&quot;;
String student4 = &quot;이름은 마이콜, 나이는 20살, 성별 남&quot;;

System.out.print(student1);
System.out.print(student2);
System.out.print(student3);
System.out.print(student4);

// 학생 클래스
Student student = new Student();
student.print();</code></pre>
<br>
<br>

<p>✌️ 추상화 : 프로그램에서 필요한 정보만 찾아 공통점을 추출하는 것
<img src="https://velog.velcdn.com/images/muggung_0222/post/bf450376-4a52-48a9-b5b4-0dc54c9f6e55/image.jpg" alt="">
위의 그림처럼 추상화를 할 때 필요한 곳에 필요한 값만 받으면 된다.
이 때, 받아야할 값이 저장된 변수이름은 <strong>알아보기 쉽게 작성하는게 좋다.</strong></p>
<br>
클래스에서 객체를 만들 때 **인스턴스화(instantiation)**라고 부른다.

<h2 id="--클래스-선언">- 클래스 선언</h2>
<pre><code class="language-java">// 클래스 선언
[접근제한자][예약어] class 클래스명 { }
public class ClassName{
    // 속성값 설정(맴버변수 || 필드)
    // [접근제한자] [예약어] 자료형 변수명;
    private String userName;
    private int user_No;


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


    // 기능정의 설정(메소드)
    // [접근제한자] 반환형 메소드명(매개변수) { 기능 정의 }
    public void printName(String name) {
        System.out.print(name);
    }
}</code></pre>
<br>

]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA 배열]]></title>
            <link>https://velog.io/@muggung_0222/JAVA-%EB%B0%B0%EC%97%B4</link>
            <guid>https://velog.io/@muggung_0222/JAVA-%EB%B0%B0%EC%97%B4</guid>
            <pubDate>Sun, 12 Mar 2023 14:53:24 GMT</pubDate>
            <description><![CDATA[<h2 id="--배열이란">- 배열이란?</h2>
<p>배열은 같은 자료형을 묶어 저장하는 참조자료형이다.
배열은 생성할 때 주의할 점으로 두가지가 있다.
<strong>① 크기를 지정해야한다. ② 지정한 크기를 절대 변경할 수 없다는 특징을 가진다.</strong></p>
<h2 id="--배열-선언">- 배열 선언</h2>
<p>배열을 선언하는 방법은 2가지가 있다.
<code>int[] array;</code>처럼 자료형 뒤에 [ ]로 표시하거나
<code>char array[];</code>처럼 변수명 뒤에 [ ]로 표시할 수 있다.</p>
<p>😕 <code>array</code>자료형으로 만들면 편했을텐데 왜 안그럴까??
😀 배열은 <strong><u>동일한 자료형만 묶을 수 있는데,</u></strong>
<code>array</code>로 적어두면 어떤 자료형끼리 묶은건지 알 수 없다.</p>
<h2 id="--배열-길이-선언">- 배열 길이 선언</h2>
<p>배열에 값을 할당하는 방법은 변수랑 동일하다.
단, new 키워드를 함께 사용해야하며 배열의 길이를 지정하지 않으면 오류가 발생한다.</p>
<pre><code class="language-java">// 자료형 변수명[] = new 자료형[배열의 길이];
String studentArray[];
student = new String[3];

int array[] = new int[5];                // int형 배열로 길이는 5다.
char array2[] = new char[2];            // char형 배열로 길이는 2다.
String array3[] = new String[4];        // String 배열로 길이는 4다.

// 배열의 길이를 지정하지 않았을 경우
int numArr[] = new int[];            // 오류 발생</code></pre>
<h2 id="--배열-할당">- 배열 할당</h2>
<p>배열에 값을 할당하는 방법을 간단하게 알아보자</p>
<pre><code class="language-java">// 배열 객체를 생성하고 각 인덱스 위치마다 값 대입
int[] a = new int[3];
a[0] = 3;
a[1] = 5;
a[2] = 1;

// 배열 객체를 생성하고 함께 값 대입하기
int[] b = new int[] {1, 2, 3, 4};
int[] c = {1, 2, 3, 4, 5};

// 배열 객체를 생성하고 for문으로 인덱스 위치 접근해서 값 대입
int[] d = new int[5];
for(int i=0; i&lt;d.length; i++){
    d[i] = i++;
}</code></pre>
<h2 id="--배열-저장구조">- 배열 저장구조</h2>
<p>모든 참조 자료형의 실제 데이터(객체)는 Heap 영역에 저장된다. (new 키워드)
따라서 배열 자료형 변수의 저장공간에는 객체의 주소값을 가지고 객체는 실제 Heap영역에 저장된다. (배열 공간의 주소를 이용해 인덱스를 참조)
<img src="https://velog.velcdn.com/images/muggung_0222/post/4faa7c43-e7a0-4273-8bb0-bc62d6b7319b/image.jpg" alt="">
위의 그림에서 <code>array 변수</code>는 참조변수라고 불린다.
😵‍💫 변수에 빈 값을 할당하면 오류가 나는데, 배열은 왜 오류가 안날까?
😀 배열의 길이를 지정하고 값을 넣지않아도 오류가 나지않는다.
그 이유는 스택 영역은 값을 초기화하지 않으면 빈 공간으로 인식해 변수를 출력하면 오류가 발생한다.</p>
<p>하지만 <strong><u>힙 영역은 어떤 상황에서도 빈 공간이 존재하지 않는다.</u></strong>
그래서 값을 주지 않아도 컴파일러가 값을 강제로 초기화하기 때문이다.
(정수형 = 0, 실수형 = 0.0, 문자열 = null, 문자 = &#39; &#39;, 불값 = false)</p>
<h2 id="--배열-복사-얕은-복사">- 배열 복사 (얕은 복사)</h2>
<p>기본 자료형과 참조 자료형에서 복사할 때를 알아보자
기본 자료형은 &#39;=&#39;을 사용해 값을 복사할 때 변수에 포함된 스택 영역의 <u>실제 데이터 값을 복사한다.</u> 그래서 기본 자료형 변수를 복사하면 실제 데이터 값이 1개 더 복사되는 것이다.</p>
<pre><code class="language-java">int a = 3;
int b = a;            // a의 값은 3    b의 값은 3
b = 7;                // a의 값은 3    b의 값은 7</code></pre>
<p>반면 참조 자료형은 스택 영역에 실제 데이터 값이 아닌 힙 영역에 저장된
객체의 주소 값을 저장한다.
따라서 참조 자료형 변수를 복사하면 실제 데이터 값이 복사되는게 아닌 실제 데이터의 주소 값이 복사된다.
그래서 참조 자료형 변수 데이터를 수정하면 다른 참조 변수가 가르키는 데이터도 함께 변한다. (원본 값을 공유)</p>
<pre><code class="language-java">int[] a = {3, 4, 5};        // a 주소 값 : 0x111
int[] b = a;                // b 주소 값 : 0x111
b[0] = 7;                    // b 주소 값 : 0x111에 0번째 인덱스 값 변경

System.out.print(a[0]);        // 7 출력
System.out.print(b[0]);        // 7 출력</code></pre>
<p><img src="https://velog.velcdn.com/images/muggung_0222/post/486b3525-556a-46c3-b7b8-0245183fd224/image.jpg" alt=""></p>
<h2 id="--배열-복사-깊은-복사">- 배열 복사 (깊은 복사)</h2>
<p>위의 문제점을 해결하는 방법으로 새로운 배열을 생성해서 기존 데이터를 복사하면 된다.</p>
<p>새로운 배열에 기존 배열 값을 넣는 방법을 알아보자</p>
<pre><code class="language-java">// for문을 이용
int arr1[] = {100, 200, 300};
int arr2[] = new int [arr1.length];

for(int i = 0; i &lt; arr1.length; i++) {
    arr2[i] = arr1[i];
    System.out.print(arr1[i] + &quot; &quot;)        // 100 200 300
    System.out.print(arr2[i] + &quot; &quot;)        // 100 200 300
}



// Arrays.copyof 이용
// 자료형 변수명[] = Arrays.copyOf(복사할 참조변수, 복사할 길이)
String name1[] = {&quot;선인장&quot;, &quot;무궁화&quot;, &quot;제비꽃&quot;};

String name2[] = Arrays.copyOf(name1, name1.length);

for(int i = 0; i &lt; name1.length; i++) {
    System.out.print(name1[i] + &quot; &quot;)        // 선인장 무궁화 제비꽃
    System.out.print(name2[i] + &quot; &quot;)        // 선인장 무궁화 제비꽃
}
</code></pre>
<h2 id="-끝-">-끝-</h2>
]]></description>
        </item>
    </channel>
</rss>