<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>gayeong.log</title>
        <link>https://velog.io/</link>
        <description>gy’s portfolio</description>
        <lastBuildDate>Sun, 27 Oct 2024 18:30:44 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>gayeong.log</title>
            <url>https://velog.velcdn.com/images/swk_x/profile/97ecf2f9-2e5f-461a-a9ee-2ca269d54355/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. gayeong.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/swk_x" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[한국어 깨짐 ]]></title>
            <link>https://velog.io/@swk_x/%EC%9A%B0%ED%85%8C%EC%BD%942%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@swk_x/%EC%9A%B0%ED%85%8C%EC%BD%942%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Sun, 27 Oct 2024 18:30:44 GMT</pubDate>
            <description><![CDATA[<p>인텔리제이에서 입력을 한국어로 작성하면 글자가 깨져서 영어로 작성함. -&gt; 낼 때 영어로 작성해서 냄</p>
<p>우테코 프리코스 진짜 답(한국어로). </p>
<pre><code class="language-java">package racingcar;

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

public class Application {
    public static void main(String[] args) {
        //Todo 프로그램 구현
        Scanner scanner = new Scanner(System.in);

        try {
            System.out.println(&quot;경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)&quot;);
            String inputNames = scanner.nextLine();
            List&lt;String&gt; carNames = validateCarNames(inputNames);

            System.out.println(&quot;시도할 횟수는 몇 회인가요?&quot;);
            int moves = Integer.parseInt(scanner.nextLine());

            Racing racing = new Racing(carNames);
            racing.startRace(moves);
            List&lt;String&gt; winners = racing.getWinners();
            System.out.println(&quot;최종 우승자 : &quot; + String.join(&quot;, &quot;, winners));

        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
        }
    }

    private static List&lt;String&gt; validateCarNames(String inputNames) {
        List&lt;String&gt; carNames = Arrays.stream(inputNames.split(&quot;,&quot;))
                .map(String::trim)
                .collect(Collectors.toList());

        if (carNames.isEmpty() || carNames.stream().anyMatch(name -&gt; name.length() &gt; 5)) {
            throw new IllegalArgumentException(&quot;자동차 이름은 5자 이하로 입력해야 합니다.&quot;);
        }

        return carNames;
    }
}
</code></pre>
<hr>
<pre><code class="language-java">package racingcar;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

public class Racing {
    private final List&lt;Car&gt; cars;
    private static final int FORWARD_THRESHOLD = 4;
    private final Random random;
    private boolean isFirstRound = true; // 첫 번째 라운드인지 확인하는 변수

    public Racing(List&lt;String&gt; carNames) {
        this.cars = carNames.stream()
                .map(Car::new)
                .collect(Collectors.toList());
        this.random = new Random();
    }

    public void startRace(int moves) {
        for (int i = 0; i &lt; moves; i++) {
            for (Car car : cars) {
                if (random.nextInt(10) &gt;= FORWARD_THRESHOLD) {
                    car.move();
                }
            }
            displayRaceStatus();
        }
    }

    private void displayRaceStatus() {
        if (isFirstRound) {
            System.out.println(&quot;실행 결과&quot;);
            isFirstRound = false;
        }

        for (Car car : cars) {
            System.out.println(car.getName() + &quot; : &quot; + &quot;-&quot;.repeat(car.getPosition()));
        }
        System.out.println();
    }

    public List&lt;String&gt; getWinners() {
        int maxPosition = cars.stream()
                .mapToInt(Car::getPosition)
                .max()
                .orElse(0);

        return cars.stream()
                .filter(car -&gt; car.getPosition() == maxPosition)
                .map(Car::getName)
                .collect(Collectors.toList());
    }

    private static class Car {
        private final String name;
        private int position;

        public Car(String name) {
            this.name = name;
            this.position = 0;
        }

        public String getName() {
            return name;
        }

        public int getPosition() {
            return position;
        }

        public void move() {
            position++;
        }
    }
}
</code></pre>
<h2 id="pwd">pwd</h2>
<p>src/main/java/racingcar/Application.java
src/main/java/racingcar/Racing.java</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Error] 윈도우11 WSL 에러]]></title>
            <link>https://velog.io/@swk_x/Error-%EC%9C%88%EB%8F%84%EC%9A%B011-WSL-%EC%97%90%EB%9F%AC</link>
            <guid>https://velog.io/@swk_x/Error-%EC%9C%88%EB%8F%84%EC%9A%B011-WSL-%EC%97%90%EB%9F%AC</guid>
            <pubDate>Thu, 17 Oct 2024 09:14:56 GMT</pubDate>
            <description><![CDATA[<p>PowerShell에서 wsl 관련 명령어를 치면 이런 에러가 발생했습니다.
<img src="https://velog.velcdn.com/images/swk_x/post/889ac817-41ee-4c71-91cb-c0c4ec56ffb2/image.jpg" alt=""></p>
<p>해결하기 위해 윈도우에서 WSL 관련된 것들을 모두 삭제하였습니다.</p>
<h3 id="wsl-완전히-삭제">WSL 완전히 삭제</h3>
<h4 id="1-리눅스-배포판-제거">1. 리눅스 배포판 제거</h4>
<p>&#39;설정-&gt;앱-&gt;앱 및 기능&#39;을 간다
설치되어 있는 배포판 제거
<img src="https://velog.velcdn.com/images/swk_x/post/e2a1c3c5-fb53-410a-8e98-4399c9573a50/image.jpg" alt=""></p>
<h4 id="2-wsl-제거">2. wsl 제거</h4>
<p>Windows Subsystem for Linux Update와 같이 관련 항목들을 제거한다.
<img src="https://velog.velcdn.com/images/swk_x/post/5cb7b974-1792-442d-ac87-f7b02640dfb4/image.jpg" alt=""></p>
<h4 id="3-window11에서-wsl-제거">3. window11에서 wsl 제거</h4>
<p>&#39;제어판-프로그램 및 기능 - windows 기능 켜기/끄기&#39;로 간다
&#39;Linux용 Windows 하위 시스템&#39;을 선택 해제 후 확인을 누른다.
<img src="blob:https://velog.io/2683658d-2737-43de-95e8-fef2a7c2cd88" alt="업로드중..">
그리고 컴퓨터를 재부팅 하면 wsl이 완전히 삭제되어 있다. </p>
<hr>
<h3 id="wsl-비활성화">WSL 비활성화</h3>
<h4 id="1-powershell관리자-권한에서-wsl-기능을-완전히-비활성화">1. PowerShell(관리자 권한)에서 WSL 기능을 완전히 비활성화</h4>
<pre><code>.\dism.exe /online /disable-feature /featurename:Microsoft-Windows-Subsystem-Linux /norestart</code></pre><h4 id="2-가상-머신-플랫폼-비활성화-wsl-2-사용-시">2. 가상 머신 플랫폼 비활성화 (WSL 2 사용 시)</h4>
<pre><code>.\dism.exe /online /disable-feature /featurename:VirtualMachinePlatform /norestart</code></pre><h4 id="3-컴퓨터-재부팅">3. 컴퓨터 재부팅</h4>
<h4 id="4-wsl-상태-확인">4. WSL 상태 확인</h4>
<pre><code>wsl --status</code></pre><p>만약 WSL 기능이 여전히 활성화되어 있다면, WSL 관련 구성 요소가 완전히 제거되지 않은 것이므로, 제어판의 &quot;프로그램 및 기능&quot; &gt; &quot;Windows 기능 켜기/끄기&quot; 메뉴로 이동하여 <strong>&quot;Windows Subsystem for Linux&quot;</strong>가 체크 해제되었는지 확인하세요</p>
<p>wsl --status 명령어를 실행했을 때 아무 출력도 없는 경우, WSL이 제대로 제거되었을 가능성이 높습니다</p>
<hr>
<blockquote>
<h3 id="그래도-안-된다면-wsl-명령어-앞에-를-넣어보세요"><strong>그래도 안 된다면 wsl 명령어 앞에 .\를 넣어보세요!</strong></h3>
</blockquote>
<hr>
<h3 id="wsl-설치">WSL 설치</h3>
<pre><code>wsl --install</code></pre><hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[객체 지향 설계의 5가지 원칙]]></title>
            <link>https://velog.io/@swk_x/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EC%84%A4%EA%B3%84%EC%9D%98-5%EA%B0%80%EC%A7%80-%EC%9B%90%EC%B9%99</link>
            <guid>https://velog.io/@swk_x/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EC%84%A4%EA%B3%84%EC%9D%98-5%EA%B0%80%EC%A7%80-%EC%9B%90%EC%B9%99</guid>
            <pubDate>Sun, 29 Sep 2024 16:14:33 GMT</pubDate>
            <description><![CDATA[<h3 id="1-srp--단일-책임-원칙-single-responsibility-principle">1. SRP : 단일 책임 원칙 (single responsibility principle)</h3>
<ul>
<li>한 클래스는 하나의 책임만 가져야 한다.</li>
<li>하나의 책임이라는 것은 모호하다.</li>
<li><blockquote>
<p>클 수 있고, 작을 수 있다.</p>
</blockquote>
</li>
<li><blockquote>
<p>문맥과 상황에 따라 다르다.</p>
</blockquote>
</li>
<li><strong>중요한 기준은 변경</strong>이다. 변경이 있을 떄 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것이다.</li>
<li>예) UI 변경, 객체의 생성과 사용을 분리</li>
</ul>
<hr>
<h3 id="2-ocp--개방-폐쇄-원칙-openclosed-principle">2. OCP : 개방-폐쇄 원칙 (Open/Closed principle)</h3>
<ul>
<li>소프트웨어 요소는 <strong>확장에는 열려</strong> 있으나 <strong>변경에는 닫혀</strong> 있어야 한다. </li>
<li>이런 거짓말 같은 말이? 확장을 하려면, 당연히 기존 코드를 변경?</li>
<li><strong>다형성</strong>을 활용</li>
<li>인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현</li>
<li>역할과 구현의 분리를 생각</li>
</ul>
<blockquote>
<h3 id="문제점">문제점</h3>
<p>MemberService 클라이언트가 구현 클래스를 직접 선택</p>
<pre><code class="language-java">MemberRepository m = new MemoryMemberRepository(); //기존코드
MemberRepository m = new JdbcMemberRepository();  //변경코드</code></pre>
</blockquote>
<pre><code>**구현 객체를 변경하려면 클라이언트 코드를 변경해야 한다.**
**분명 다형성을 사용했지만 OCP 원칙을 지킬 수 없다.**
해결 : 객체를 생성하고, 연관관계를 맺어주는 별도의 조립, 설정자가 필요

-------

### 3. LSP : 리스코프 치환 원칙 (Liskov substitution principle)
- 프로그램 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 
- 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 한다는 것, 다형성을 지원하기 위한 원칙, 인터페이스를 구현한 구현체는 믿고 사용하려면, 이 원칙이 필요
- 단순히 컴파일에 성공하는 것을 넘어선다.
- 예) 자동차 인터페이스의 엑셀을 앞으로 가라는 기능, 뒤로 가게 구현하aus LSP 위반, 느리더라도 앞으로 가야함

-----


### 4. ISP : 인터페이스 분리 원칙 (Interface segregation principle)
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- 자동차 인터페이스 -&gt; 운전 인터페이스, 정비 인터페이스로 분리
- 사용자 클라이언트 -&gt; 운전자 클라이언트, 정비사 클라이언트로 분리
- 분리하면 정비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않음
- 인터페이스가 명확해지고, 대체 가능성이 높아진다.

-----

### 5. DIP : 의존관계 역전 원칙 (Dependency inversion principle)
- 프로그래머는 &quot;추상화에 의존해야지, 구체화에 의존하면 안된다.&quot; 의존성 주입은 이 원칙을 따르는 방법 중 하나다.
- 쉽게 얘기해서 구현 클래스에 의존하지 말고, 인터페이스에 의존해라
- **역할(Role)에 의존해야 한다는 것과 같다.** 객체 세상도 클라이언트가 인터페이스에 의존해야 유연하게 구현체를 변경할 수 있다. 구현체에 의존하게 되면 변경이 아주 어려워진다. 
- 그런데 OCP에서 설명한 MemberService는 인터페이스에 의존하지만, 구현 클래스도 동시에 의존한다. 
- MemberService 클라이언트가 구현 클래스를 직접 선택

```java
MemberRepository m = new MemoryMemberRepository(); //DIP가 구체화에 의존
// MemberRepository라는 추상화 인터페이스에 의존하고있다.
// 하지만 MemoryMemberRepository라는 구체화에도 의존하고 있어서 DIP위반이다. </code></pre><ul>
<li><strong>DIP 위반</strong> (=추상화에 의존, 구체화 의존X)</li>
</ul>
<hr>
<h3 id="정리">정리</h3>
<ul>
<li>객체 지향의 핵심은 다형성</li>
<li>다형성 만으로는 쉽게 부품을 갈아 끼우듯이 개발할 수 없다.</li>
<li>다형성 만으로는 구현 객체를 변경할 때 클라이언트 코드도 함께 변경된다.</li>
<li><strong>다형성 만으로는 OCP, DIP를 지킬 수 없다.</strong></li>
<li>더 필요</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 클래스]]></title>
            <link>https://velog.io/@swk_x/JAVA-%ED%81%B4%EB%9E%98%EC%8A%A4</link>
            <guid>https://velog.io/@swk_x/JAVA-%ED%81%B4%EB%9E%98%EC%8A%A4</guid>
            <pubDate>Fri, 05 Jan 2024 04:24:07 GMT</pubDate>
            <description><![CDATA[<h2 id="클래스">클래스</h2>
<blockquote>
<h3 id="객체">객체</h3>
</blockquote>
<ul>
<li><p>우리가 생각할 수 있는 어떤 사물이나 동물 
ex) 컴퓨터, 모닡, 키보드, 마우스, 책, 선풍기, 가방... 등</p>
</li>
<li><p>클래스로부터 만들어지는 것</p>
<blockquote>
<blockquote>
<h4 id="객체지향-프로그래밍">객체지향 프로그래밍</h4>
<p>객체들끼리 서로 어우러진 형태로 프로그램을 구성</p>
</blockquote>
</blockquote>
</li>
<li><p>Java는 객체지향 프로그래밍 언어이고 이런 객체지향 프로그래밍 언어는 특징이 작성한 코드에 변경이 필요할 때 굉장히 편리하다. + 유지보수 용이, 높은 재사용성 </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/95861fce-23ee-44a0-834d-ddcf9d911c76/image.png" alt=""> </p>
<h3 id="black-box-class">Black Box Class</h3>
<p>만든 이유 : 4개의 서로 다른 데이터를 한꺼번에 관리하고자 만듦</p>
<pre><code class="language-java">String modelName2 = &quot;하양이&quot;;
String resolution2 = &quot;UHD&quot;;
int price2 = 300000;
String color2 = &quot;화이트&quot;;</code></pre>
<ul>
<li>블랙박스라는 클래스로부터 bbox라는 객체를 만드는 과정<pre><code class="language-java">BlackBox bbox = new BlackBox();</code></pre>
</li>
</ul>
<blockquote>
<h3 id="클래스-1">클래스</h3>
</blockquote>
<ul>
<li>예를 들어 설명서나 설계도 같은 거</li>
<li>설계도를 클래스로 보면 되고 객체는 그 설계도로부터 만들어진 어떤 결과물이라 생각</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/4ec448b7-12ca-4c83-a927-465dfae8d0e7/image.png" alt=""></p>
<hr>
<h2 id="인스턴스-변수">인스턴스 변수</h2>
<p>블랙박스라는 클래스는 이렇게 정의하는 것을 인스턴스 변수라고 한다. </p>
<pre><code class="language-java">public class BlackBox{
    String modelName;
    String resolution;
    int price;
    String color;
}</code></pre>
<p>-&gt; 4개의 인스턴스 변수를 가지게 되는 것이다. </p>
<p>밑에서 블랙박스 객체를 만듦
<img src="https://velog.velcdn.com/images/swk_x/post/83d56787-c957-486e-a518-9db049ceef67/image.png" alt=""></p>
<ul>
<li>블랙박스 클래스로부터 b1이라는 객체가 만들어졌는데 이 객체가 가지고 있는 4가지 인스턴스 변수에 대해 각각 접근을 해서 값을 설정할 수 있다.<pre><code class="language-java">b1.modelName = &quot;까망이&quot;;
...</code></pre>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/8deb8cec-ee99-4596-aeb5-7d16135a7cfe/image.png" alt=""></p>
<hr>
<h2 id="클래스-변수">클래스 변수</h2>
<ul>
<li>블랙박스가 기능이 굉장히 좋아 어떤 충돌이 있었을 때 그 충돌이 어떤 정해진 범위를 초과한다고 하면, 충돌이 컸다고 하면은 자동으로 경찰서에 신고를 해주는 기능을 추가</li>
<li><blockquote>
<p>직전 30초 정도의 영상하고 지금 차량이 위치하고 있는 GPS 정보를 함께 전송해 주는 것이다.</p>
</blockquote>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/d35dc937-d72a-46e9-b960-b7b2856a8d5c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/90588871-ef0e-4098-830a-9d36f7ed20b9/image.png" alt=""></p>
<hr>
<h2 id="메소드">메소드</h2>
<p><img src="https://velog.velcdn.com/images/swk_x/post/bad486f0-b8b3-4740-9684-d358d4bee71b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/32ba0875-5b99-4983-98ec-00d9fbca2695/image.png" alt=""></p>
<hr>
<h2 id="메소드-오버로딩">메소드 오버로딩</h2>
<ul>
<li>같은 클래스 내에서 똑같은 이름을 가진 메소드를 파라미터의 개수나 파라미터의 타입을 다르게 함으로써 여러 개를 정의할 수 있다.</li>
<li>녹화를 하는 메소드</li>
<li><blockquote>
<p>블랙박스를 보면 녹화를 할 때 어떤 정보들이 함께 표시가 되고 있다. 왼쪽 위에는 녹화를 하는 시간 정보, 왼쪽 아래는 그때 당시 속도를 표현하기도 한다. 오른쪽에는 현재 위치가 어딘지 gps 정보도 함께 표시를 하는 그런 장치들도 있다. </p>
</blockquote>
</li>
<li>레코드라는 메소드를 만들어 처리</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/f5507cd3-1dc7-4c38-b289-35970b03caf9/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/d738ecaf-adec-42cd-94f1-257e73365f68/image.png" alt=""></p>
<blockquote>
<p><strong>매개변수, 파라미터의 타입이 다르거나 또는 개수가 다르면 method of loading이 가능하다.</strong></p>
</blockquote>
<ul>
<li>비슷한 동작을 서로 다른 코드로 별도로 작성을 하게 되면 여기에서 만약에 어떤 수정이 발생한다 그러면 또 찾아 가지고 바꿔야 하는 불편함이 있다.</li>
<li><blockquote>
<p>밑에 있는 4줄을 다 지우고
<img src="https://velog.velcdn.com/images/swk_x/post/c340305c-c046-48bb-b9fd-6acbb0703891/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<p>-&gt; 레코드 위에 있는 메소드를 호출해주면 된다.
(레코드라는 메소드를 호출하는데 거기에다가 기본 값으로 true, showDateTime/showSpeed은 true, minute 정보는 5라고 넣어주면 이 레코드라는 메소드가 호출될 때 여기 내에서는 또 
<img src="https://velog.velcdn.com/images/swk_x/post/c7f42976-cbfc-45a1-b4a2-57fc49d4039d/image.png" alt="">
위에 있는 record라는 메소드를 다시 새롭게 호출하면서 여기의 동작을 가지고 위에서 적었는 print문 4줄에 해당하는 것을 똑같이 해줄 수 있다.</p>
<blockquote>
<p><strong>-&gt; 레코드라는 메소드를 똑같은 동작을 2번 정의하지 않고 새롭게 메소드를 호출하는데 그때 값만 기본적으로 정의된 값을 던져주는 거고 그러면 이 객체를 통해서 메소드를 호출할 때는 아무 값을 몰라도 그냥 비워둔 채로 호출하게 되면 기본적인 값을 통해서 동작을 하게 된다.</strong></p>
</blockquote>
<hr>
<h2 id="클래스-메소드">클래스 메소드</h2>
<ul>
<li>블랙박스를 사용하다 만약에 어떤 문제가 생겼다. 그러면 블랙박스를 통해서  바로 고객센터에 전화를 할 수 있다. 원격으로 붙어서 조치를 해주던지 아니면 고객에게 직접 어떻게 하라고 안내를 해줄 수 있다. </li>
<li><blockquote>
<p>고객센터에 전화하는 기능을 메소드로 만듦(모든 객체에 공통으로 사용)</p>
</blockquote>
</li>
</ul>
<blockquote>
<p>*<em>클래스 메소드를 사용할 때는 메소드 내에서 인스턴스 변수의 사용이 필요없는 경우에 공통적으로 적용되는 기능을 클래스 메소드를 사용해 볼 수 있을 것이다. *</em> </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/swk_x/post/5001f0d0-b4a4-4160-9318-84bae82ec142/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/010e94e6-9ce0-49c8-9f3b-5d32187e347d/image.png" alt=""></p>
<blockquote>
<pre><code class="language-java">String s = String.valueOf(3);</code></pre>
</blockquote>
<pre><code>ctrl 누르고 valueOf누르면 알려줌
![](https://velog.velcdn.com/images/swk_x/post/89c4da31-4408-4e5d-ab9b-f36fab109a11/image.png)
String 앞에 static이 있다. -&gt; 클래스 메소드로 정의됨.
valueOf라는 메소드는 결국 그냥 전달값으로 받은 이 i값만 가지고 어떤 처리를 하고 나서 반환을 해주는 것이다.
**-&gt; 그러니까 string클래스 내에서 어떤 정의되어 있는 인스턴스 변수는 상관없이 전달받은 값 하나만 가지고 처리를 하고 결과를 내뱉어 준다.**
이런 경우에 인스턴스 메소드 대신에 클래스 메소드의 사용을 고려해 볼 수 있다.
- 일반적으로 만드는 메소드가 인스턴스 메소드이고 각 개체마다 서로 다른 동작을 하게 되고, static 키워드가 붙은 것은 클래스 메소드이다.
- 개체가 만들어지지 않고도 클래스 이름 점 그리고 이 메소드 이름으로 바로 접근해 볼 수 있다. 

![](https://velog.velcdn.com/images/swk_x/post/5f5eaad9-6276-47f5-9bc9-2bd963a339ae/image.png)
-&gt; 이 둘의 차이를 알아야 한다

------------
## This
- 블랙박스 모델명이 까망이, 이런식으로 정의됨. 이렇게만 하니까 물건이 잘 안 팔림. 까망이 뒤에 (최신형) 이렇게 적으면 사람들이 주목해서 볼 수 있음. 
-&gt; 모델명을 업데이트 하자
- 모델명 뒤에다가 바로 넣어줘도 되긴 하는데 그냥 블랙박스 하나의 클래스에 이걸 추가해주는 메소드를 정의 

![](https://velog.velcdn.com/images/swk_x/post/2d636a12-31ab-4e4a-9a43-792d560c261b/image.png)
-&gt; 위 코드는 모델명을 추가하는 메소드다. 여기로 전달되는 model name을 원래 가지고 있는 modelName에 추가하면 알아보기가 더 편하다.



&gt;### 메소드 보기
![](https://velog.velcdn.com/images/swk_x/post/ca7cf839-7647-4f1e-b742-0c48a1b6cb5d/image.png)
appendModelName 부분에 컨트롤 클릭하면 메소드로 바로 이동할 수 있고 아니면 이걸 클릭하고 ctrl+shift+i 누르면 이 메소드가 어떻게 생겼는지 볼 수 있다.
&gt;&gt; ```java
modelName += modelName;</code></pre><ul>
<li>앞에 있는 것은 클래스 인스턴스 변수로 만들어진 모델네임이고 뒤에 있는 모델네임은 전달값으로 전달받은 모델네임을 뜻한다. </li>
<li><blockquote>
<p>이렇게만 두면 지금 메소드 내에서는 모델네임(앞)에다가 모델네임(뒤)을 다시 한번 더하는 즉, 최신형+최신형은 이라고 하고 끝나게 된다. 그러니까 인스턴스 변수 모델네임이 아니고 그냥 전달받은 파라미터 값을 한 번 더 업데이트를 하고 끝나게 된다. </p>
</blockquote>
</li>
<li>모델네임(앞)을 파라미터가 아니고 이름이 똑같은 경우에는 클래스가 가지고 있는 인스턴스 변수의 모델네임을 명시하고 싶으면 앞에다가 this. 을 붙여주면 된다. </li>
<li><blockquote>
<p>this. 을 붙여주면 클래스의 인스턴스 변수에 직접 바로 접근할 수 있게된다.</p>
</blockquote>
</li>
<li><blockquote>
<p><strong>this.modelName(앞) : 클래스 인스턴스 변수
  modelName(뒤) : 파라미터로 전달받은 모델네임</strong></p>
</blockquote>
</li>
</ul>
<p><strong>※인스턴스 변수하고 전달받은 파라미터의 변수이름이 똑같다면 앞에 this. 을 꼭 붙여줘야 한다!!!</strong></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/af90a495-5a8c-4e6a-8121-59f9884c5650/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/8e2d2093-d825-4083-90c6-9d975a631fa8/image.png" alt=""></p>
<hr>
<h2 id="생성자">생성자</h2>
<p>생성자 : 객체가 만들어질 떄 자동으로 호출되는 메소드</p>
<blockquote>
<h4 id="생성자를-만드는-방법">생성자를 만드는 방법</h4>
<p>클래스명과 똑같이 적어주면 된다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/swk_x/post/dd00e742-032d-4502-9d8f-4361bad27efd/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/4b81e3e7-e8a0-4eb0-b862-c6afd8a515d6/image.png" alt=""></p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/swk_x/post/ea37bd6a-0552-409b-a239-c709a7a11863/image.png" alt="">
생성자를 따로 정의를 해 가지고 한 번에 값을 바로 전달 받고, 그 값들을 인스턴스 변수에다가 직접 넣거나 또 다른 초기 작업을 생성자 내에서 할 수 있다. 그러면 객체를 만들 때마다 매번 인스턴스 변수에다가 값을 넣어주는 작업을 밑에서는 그냥 한 줄로 내 처리를 할 수 있다. </p>
</blockquote>
<pre><code class="language-java"> BlackBox b2 = new BlackBox(&quot;하양이&quot;, &quot;UHD&quot;, 300000, &quot;화이트&quot;);</code></pre>
<ul>
<li>블랙박스에 시리얼 넘버라는 것을 넣기로 했다고 가정
(똑같은 제품이라 하더라도 각각 고유한 번호가 있다.)<blockquote>
<h4 id="기본-생성자">기본 생성자</h4>
<p><img src="https://velog.velcdn.com/images/swk_x/post/431e576b-a2c4-4689-bc63-014f42f80c7b/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<p>-&gt; 처음으로 객체가 만들어질 때는 카운터 값이 0이었을 거니까 0에다가 ++해줘서 1이 들어간다. 그 다음에 새로운 객체가 만들어질 때는 카운터 값은 인스턴스 변수가 아니가 때문에 지금 1로 업데이터 되어 있는 상태인 거고 이거는 모든 객체에서 다 똑같이 공통적으로 사용되는 값이다. 그래서 1이었던 값이 2로 될 거고 또 새로운 기체를 만들면 3이 될 거고 그렇게 업데이트가 된다. </p>
<ul>
<li>기본 생성자가 호출이 될 때는 시리얼 넘버를 자동으로 발급을 받게 된다. 그러면 생성자2를 호출하는 B2 객체인 경우에는 시리얼 넘버를 발급 못 받게 된다. <blockquote>
<h4 id="생성자2">생성자2</h4>
<p><img src="https://velog.velcdn.com/images/swk_x/post/81b1c079-c857-4f3e-a516-4a522b96c5a6/image.png" alt=""></p>
</blockquote>
</li>
<li>생성자2를 호출할 때도 기본 생성자에서 하는 동작을 먼저 하고 나서 여기 생성자2의 동작을 하도록 처리해 줄 수 있다.</li>
<li>생성자2, 사용자 정의 생성자의 맨 첫 위치에 this()를 쓰면 된다.<blockquote>
<h3 id="this">this()</h3>
<p>기본 생성자를 바로 접근. 기본 생성자의 동작을 그대로 수행하고 나서 아래쪽에 있는 생성자2의 동작을 하게 된다. </p>
</blockquote>
</li>
</ul>
<blockquote>
<h3 id="요약">요약</h3>
<p>생성자는 개체가 만들어질 때 자동으로 호출이 되는 부분.
기본적인 동작이 되는 부분이 있다고 하면 생성자에 명시를 해주면 되고 또는 개체가 생성됨과 동시에 우리가 전달하는 값으로 초기화를 하고자 할 때에도 생성자를 활용할 수가 있다. 그리고 생성자 간에도 서로를 호출하기 위해서는 this()를 활용할 수 있다. </p>
</blockquote>
<hr>
<h2 id="getter--setter">Getter &amp; Setter</h2>
<p>Getter : 값을 가지고 오는 메소드
Setter : 값을 설정하는 메소드</p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/182503a3-82bd-4bee-9e2f-51ee39e4a35f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/a3edf706-bd0d-4d34-bac9-7788e709e77e/image.png" alt=""></p>
<blockquote>
<p>만약 모델네임을 가져오는 메소드라면(Getter), 
<img src="https://velog.velcdn.com/images/swk_x/post/48cb6ad3-81ca-4cbf-839c-0521faec0d4a/image.png" alt="">
(Setter)
<img src="https://velog.velcdn.com/images/swk_x/post/fedf266c-4a99-414e-9b98-fffc67b739d0/image.png" alt=""></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/swk_x/post/fd424097-5aa5-433c-b67a-563fccfb4f55/image.png" alt=""></p>
<ul>
<li>isEmpty가 빈 문자일 때는 True가 된다. 
그래서 값이 아예 없거나 아니면 값이 비어 있거나 이 둘 중에 하나라고 하면 리턴 해서 해결 가능</li>
<li>그러면 이 제품이 가지고 있는 객체 통해서 인스턴스 변수를 받아 왔을 때는 값을 알 수 없으니까 &quot;판매자에게 문의하세요&quot;라고 하면 일하는 직원을 통해 물어볼 수 있다. </li>
</ul>
<blockquote>
<h3 id="요약-1">요약</h3>
<p>getter와 setter를 이용하게 되면 어떤 이상한 값이 들어간다던지 값 설정하다가 발생할 수 있는 오류를 줄일 수 있고 또 값을 가져오는 과정에서도 그 값이 없다거나 이상하다거나 할 때 대안으로 줄 수 있는 값을 설정할 수가 있다.</p>
</blockquote>
<hr>
<h2 id="blackboxjava-code">BlackBox.java code</h2>
<p><img src="https://velog.velcdn.com/images/swk_x/post/6c3256f3-7c80-44c9-982d-73491d1e7cd2/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/be02e527-ab3d-417f-bc17-c5ec0900f7b3/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/a84c6f51-743e-4f88-aaa1-f7071b9e14cb/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/7c8cfb74-399d-4b02-90dc-03a28847a84c/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/4b007f79-eabe-4e68-b061-40279157a4d2/image.png" alt=""></p>
<hr>
<h2 id="접근-제어자">접근 제어자</h2>
<blockquote>
<h4 id="접근-제어자-1">접근 제어자</h4>
<p>private : 해당 클래스 내에서만 접근 가능<br>public : 모든 클래스에서 접근 가능
default : (아무것도 적지 않았을 때) 같은 패키지 내에서만 접근 가능
protected : 같은 패키지 내에서, 다른 패키지인 경우 자식 클래스에서 접근 가능</p>
</blockquote>
<ul>
<li>블랙박스 판매를 할 때 너무 할인을 크게 하기에는 아까워서 리퍼 제품에 대해서만 할인을 적용한다고 가정</li>
<li><blockquote>
<p>BlackBoxRefurbish.java 파일</p>
</blockquote>
</li>
</ul>
<blockquote>
<h3 id="blackbox를-ctrl-c--ctrl-r">BlackBox를 Ctrl C + Ctrl R</h3>
<p>위쪽에 뭐가 뜨는데 첫번째 부분에 붙여넣기를 하면 BlackBox라는 문구를 찾는다. 두번째 부분에 BlackBoxRefurbish를 치면, 위에 있는 소스코드에서 위에 있는 문구를 모두 찾아가지고 아래 문구로 한번에 바꿔달라는 의미가 된다. esc 누르면 창 닫힘
BlackBox -&gt; BlackBoxRefurbish로 바꿈</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/swk_x/post/a71aa0d6-c8fc-4324-9cd9-8983122167e4/image.png" alt=""></p>
<ul>
<li>가격을 -5000으로 설정하는 것을 못하게 하기 위해서는 프라이스 변수 앞에다가 접근 제어자 중에서 private을 붙여주면 된다. </li>
<li><blockquote>
<p>Get Price와 Set Price만을 통해서 접근할 수 있다.</p>
</blockquote>
</li>
<li>price라는 변수는 해당 클래스 내에서만 즉, BlackBoxRefurbish라는 클래스 내에서만 접근이 가능하다. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/e70fce68-fc2e-4211-a029-ac859ac0b3a1/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/4898b50e-0a37-4c26-9f99-797f07d09d07/image.png" alt=""></p>
<blockquote>
<h4 id="-public은-어디서든지-접근-가능하다">※ public은 어디서든지 접근 가능하다.</h4>
<p>※ Default는 같은 패키지 내에서만 접근이 가능하다. </p>
</blockquote>
<ul>
<li>클래스에도 public을 붙이던지 또는 아무것도 붙이지 않은 디폴트 클래스일지를 통해 가지고 다른 패키지에서 접근 가능할 지 여부를 설정할 수 있다. </li>
<li>참고로 java 파일 내에서는 클래스를 여러 개 정의할 수 있다. </li>
<li><blockquote>
<p>하지만 퍼블릭 클래스로 정의를 하게 되는 경우에는 반드시 java 파일명하고 똑같아야 된다. </p>
</blockquote>
</li>
</ul>
<blockquote>
<h3 id="캡슐화encapsulation">캡슐화(Encapsulation)</h3>
</blockquote>
<ul>
<li>서로 관련 있는 데이터 즉 변수 그리고 서로 관련 있는 기능들, 메소드를 블랙박스와 관련된 만큼만의 하나의 클래스로 정의하는 것</li>
</ul>
<blockquote>
<h3 id="정보은닉information-hiding">정보은닉(Information hiding)</h3>
</blockquote>
<ul>
<li>정보를 숨기는 것</li>
<li>객체 내에 있는 어떤 변수나 메소드의 직접적인 접근을 막고 객체에서 허용해주는 형태로만 허용하는 메소드를 통해서만 접근이 가능하게 하는 것</li>
</ul>
<p>-&gt; 캡슐화, 정보은닉을 할 수 있게 해주는 게 접근 제어자, 주로 private을 통해 가지고 외부에서 접근을 못하도록 하는 거고 Getter와 Setter를 통해 가지고 어느 정도까지만 허용해가지고 사람들이 그걸 사용할 수 있도록 해주는 것이다. </p>
<hr>
<h2 id="blackboxrefurbishjava-code">BlackBoxRefurbish.java Code</h2>
<p><img src="https://velog.velcdn.com/images/swk_x/post/140483bd-d7c8-42b8-946e-b5c95fad556f/image.png" alt=""></p>
<hr>
<h2 id="패키지">패키지</h2>
<ul>
<li>어떤 폴더 구조</li>
<li>Java 클래스들을 비슷한 것들끼리 정리해주는 하나의 폴더</li>
<li>서로 연관된 클래스끼리 묶어두는 역할</li>
</ul>
<pre><code class="language-java">import chap_07.BlackBoxRefurbish</code></pre>
<p>-&gt; chapter_07에 있는(다른 패키지에 있는) BlackBoxRefurbish이라는 클래스를 사용하겠다는 의미
※위 코드가 없으면 바로 에러 발생</p>
<pre><code class="language-java">import chap_07.*;</code></pre>
<p>-&gt; 챕터 07에 있는 모든 클래스를 갖다 쓰겠다는 의미</p>
<blockquote>
<h3 id="random-class">Random Class</h3>
</blockquote>
<ul>
<li>랜덤 클래스를 이용하면 어떤 값을 랜덤으로 뽑을 수 있게 된다. </li>
<li>랜덤 클래스를 쓰기 위해서는 대문자 R로 시작하는 랜덤 객체를 만들면 된다. </li>
<li>패키지 아래에 이 코드를 써줘야 Random 클래스를 쓸 수 있다.</li>
<li>쓰는 방법은 객체 이름을 랜덤으로 적어준다. <pre><code class="language-java">Random random = new Random();</code></pre>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/edf8344a-b7ca-4258-9a26-9ff72034e525/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/405e45d7-27f2-4d2b-9eba-1a691daea209/image.png" alt=""></p>
<hr>
<h2 id="상속">상속</h2>
<ul>
<li>부모 클래스에서 제공되는 모든 것들을 자식 클래스에서 갖다 쓴다. </li>
</ul>
<blockquote>
<h3 id="camera-code">Camera code</h3>
</blockquote>
<ul>
<li>기본적으로 사진을 촬영할 수 있고 또 동영상을 녹화할 수 있는 기본적인 동작을 수행
<img src="https://velog.velcdn.com/images/swk_x/post/e0ad9581-854c-4d0b-90a7-748790a48ad1/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="speedcam-code_과속-단속-카메라">SpeedCam code_과속 단속 카메라</h3>
</blockquote>
<ul>
<li>속도를 체크해서 만약 이 차가 과속이다라고 하면은 차량의 번호를 인식해 가지고 과태료를 부과하는 작업 추가
<img src="https://velog.velcdn.com/images/swk_x/post/82237f36-bd89-49cc-b7bd-28f143a0b14d/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="factorycam-code_공장-카메라">FactoryCam code_공장 카메라</h3>
</blockquote>
<ul>
<li>화재 감지 기능 추가</li>
<li>화재 감지를 해 자동으로 119에 신고
<img src="https://velog.velcdn.com/images/swk_x/post/a30883a7-f7ff-4561-9184-54bdf49d9f8b/image.png" alt=""></li>
</ul>
<p>-&gt; 위 3개의 객체 생성
<img src="https://velog.velcdn.com/images/swk_x/post/8d93540b-52ad-4d1d-8187-1a0e0a92d1bf/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/c3480521-0ce3-46cb-b99b-586ea771943b/image.png" alt=""></p>
<blockquote>
<h3 id="상속-쓰는-이유">상속 쓰는 이유</h3>
</blockquote>
<ul>
<li>기본적인 카메라 모듈에서 제공해주는 Take Picture, Record Video 라는 메소드는 카메라의 것을 그대로 갖다 쓴다.</li>
<li>공장 카메라에서 두 메소드는 카메라에 있는 것을 그대로 갖다 쓰고 추가적으로 화재 감지하는 기능만 따로 정의를 할 수 있다. </li>
<li>과속 단속 카메라 같은 경우에도 그대로 쓰고 속도 체크하는 부분과 번호 인식하는 기능만 추가해가지고 카메라를 만들면 더 편할 것이다. </li>
<li><blockquote>
<p>그러면 문제가 생겼을 때 또는 수정이 필요할 때도 카메라 내에서 한쪽만 수정을 하게 되면 factoryCam과 SpeedCam도 여기 있는 기능을 그대로 쓰기 때문에 함께 수정사항이 적용되는 효과를 볼 수 있다. </p>
</blockquote>
</li>
<li><em>이럴 때 사용하는 것이 바로 상속이다.*</em></li>
</ul>
<blockquote>
<h3 id="상속-하기-위해서는">상속 하기 위해서는??</h3>
</blockquote>
<ul>
<li>상속 관계에서 기능을 물려주는 입장이 되는 클래스가 부모 클래스이다. 그리고 이 기능들을 물려받는 클래스가 자식 클래스이다. </li>
<li>카메라 : 부모 클래스</li>
<li>팩토리 캠과 스피드 캠은 이 카메라의 기능을 그대로 이어받아서 쓰게 되는 자식 클래스가 된다. </li>
<li>팩토리 캠과 스피드 캠에서 카메라를 상속하기 위해서는 클래스 명 팩토리 캠 뒤에다가 한 칸 띄우고 extends하고 나서 부모 클래스를 적어주면 된다. </li>
<li>부모 클래스 이름인 카메라를 적게 되면 이 카메라로부터 상속을 하게 된 것이다. </li>
</ul>
<p><strong>※참고로 상속은 한 부모로부터만, 하나의 부모 클래스로부터만 가능하다</strong></p>
<hr>
<h2 id="메소드-오버라이딩">메소드 오버라이딩</h2>
<ul>
<li>자식 클래스에서 부모 클래스의 메소드를 덮어쓰는 동작을 하게 된다.</li>
<li><blockquote>
<p>부모 클래스에 정의되어 있는 어떤 메소드를 자식 클래스에서 재정의함으로써 자식 클래스의 메소드가 호출되도록 동작하는 것이다. </p>
</blockquote>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/1bef740d-3935-4556-958e-f368dc2979c1/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/547bd52d-901b-4334-8324-700b24c7f548/image.png" alt=""></p>
<blockquote>
<h3 id="speedcam-code">SpeedCam code</h3>
</blockquote>
<pre><code class="language-java">@Override // annotation</code></pre>
<ul>
<li>부모 클래스에 이런 메소드가 없다면 오버라이딩 대상이 되는 메소드가 없으면 에러를 내뱉어 주는 것이다.</li>
</ul>
<hr>
<h2 id="다형성">다형성</h2>
<ul>
<li>factoryCam, speedCam으로 관리할 필요 없이 Camera라는 이름의 부모 클래스로 서로 다른 형태의 객체를 만들 수 있다. -&gt; <strong>다형성</strong></li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/a3202f8e-4ae0-42f4-8e20-cd34e0c09c9f/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/3814d668-595a-49e0-9ad4-84fb4f0e9708/image.png" alt=""></p>
<blockquote>
<pre><code class="language-java">Camera[] cameras = new Camera[3];
        cameras[0] = new Camera();
        cameras[1] = new FactoryCam();
        cameras[2] = new SpeedCam();
for(Camera cam : cameras){
    cam.showMainFeature();
}</code></pre>
</blockquote>
<pre><code>-&gt; 카메라라는 이름으로 배열을 만들었고 서로 다른 형태의 개체를 집어넣음으로써 반복문을 통해서 우리는 그냥 ShowMainFeature 메소드를 한번 호출함으로써 위에서 했던 동작을 똑같이 할 수 있게된다. 

※ SpeedCam speedCam = new SpeedCam();과 같이 생성된 객체도 cameras 배열로 관리는 할 수 있다. 

-&gt;&gt; 즉, 부모 클래스를 먼저 앞에 적어 줌으로써 부모 클래스 개체 이름은 New 부모 클래스 또는 자식 클래스 이렇게 개체를 만들 수 있다. 

&gt; ```java
((FactoryCam) factoryCam).detectFire();</code></pre><p>-&gt; FactoryCam(뒤) 객체는 FactoryCam(앞)이라는 클래스로 형변환이 된 것이다. 
※ 공장 카메라에서 제공해주는 클래스를 ㅡㅆ기 위해서는 이런 식으로 형변환을 해야 한다. </p>
<blockquote>
<blockquote>
<p>위처럼 해주면 형변환된 상태에서 각각의 객체가 가지는 주요 기능들을 써볼 수 있다. </p>
</blockquote>
</blockquote>
<p><strong>instanceof</strong>를 통해서 객체가 이 클래스의 인스턴스 인지 여부를 확인하고 그렇다고 할 때는 형 변환을 통해 가지고 클래스의 메소드에 접근할 수 있다. </p>
<hr>
<h2 id="super">Super</h2>
<blockquote>
<h3 id="앞에서-상속을-한-이유">앞에서 상속을 한 이유</h3>
<p>부모 클래스에 있는 변수나 모든 메소드 동작을 자식 클래스에서 그대로 사용하기 위해서 또 공통적인 부분을 사용을 하고 추가적인 부분만 자식 클래스에서 만들어 쓰기 위해서 상속을 했었는데 지금은 부모 클래스에 있는 recordVideo 또 takePicture를 다시 만들게 된 것이다. 
-&gt; 상속을 하는 의미가 사라질 수도 있다. 
왜냐하면 부모 클래스에서 takePicture의 동작을 바꾼다던지 추가를 하게 되면 speedCam이나 factoryCam의 자식 클래스에서도 똑같이 바꿔줘야 되는 일이 생기기 때문
*<em>-&gt;이럴때 사용하는 것이 Super이다. *</em></p>
</blockquote>
<blockquote>
<pre><code class="language-java">super.recordVideo //부모 클래스에 있음</code></pre>
</blockquote>
<pre><code>메소드를 호출 해주면 끝!!
factoryCam의 recordVideo라는 메소드가 호출되고 나면 먼저 super.recordVideo라는 동작을 수행하고 나서 추가로 자식 클래스에서 제공하는 화재 감지 기능을 함께 수행하게 되는 것이다. 
자식 클래스에서 오버라이딩을 하긴 했지만 그렇다고 해서 부모 클래스에 정의되어 있는 메소드를 완전히 뒤바꾸는 것이 아니다. 부모 클래스에 있는 내용을 그대로 쓰면서 거기 뒤에서 추가적인 기능을 사용하겠다고 명시를 해주는 것이다. 
-&gt; 부모 클래스에서 recordVideo라는 메소드의 동작을 바꾼다고 해도 자식 클래스에서는 따로 해줄 거 없이 바로 부모 클래스의 이 메소드만 호출해주면 변경된 내용이 바로 적용된다. 

![](https://velog.velcdn.com/images/swk_x/post/0668c611-c724-4619-96fa-ae2a705ffbd4/image.png)

![](https://velog.velcdn.com/images/swk_x/post/3b0e9ff8-90b0-481a-9fc4-0277274781f6/image.png)

-------------
## 참조

#### 기본 자료형
-&gt; 따로 값을 지정하지 않아도 0이나 0.0과 같은 기본값을 항상 가지게 된다. 메소드가 없다. 모두 소문자로 시작
#### 참조 자료형
-&gt; 값을 따로 지정하지 않으면 모두 NULL로 들어간다. 메소드를 가질 수 있다. 모두 대문자로 시작

![](https://velog.velcdn.com/images/swk_x/post/41da16bc-7c3e-4197-af94-00a4ccd4a043/image.png)

![](https://velog.velcdn.com/images/swk_x/post/82f86232-4934-41fb-9955-ad6558a3940c/image.png)

**※ 중요하니까 꼭 이해하기!!**

---------
## Final

- 어떤 변수를 파이널로 선언하게 되면 선언과 동시에 추계를 하고 그 이후에는 값을 사용할 수는 있지만 값을 변경하는 것은 불가능하다. 

![](https://velog.velcdn.com/images/swk_x/post/5e2af203-5ec5-436b-8db2-bed01cb236e3/image.png) ![](https://velog.velcdn.com/images/swk_x/post/af448e09-8e79-458b-b6db-b7daf0455be2/image.png) ![](https://velog.velcdn.com/images/swk_x/post/5345d4ce-6c39-4d4c-9fc0-f2c499947c2c/image.png)

-&gt; 어떤 클래스의 변수를 한 번 더 정해진 값으로 고정하고 싶을 때는 파이널 키워드를 이용할 수 있다. 

![](https://velog.velcdn.com/images/swk_x/post/ebe8921c-9892-4e98-9e97-00f864093ec3/image.png)
-&gt; 메소드 오버라이딩을 통해 가지고 멋진 슬로우모드 비디오를 만듦 

&gt;```java
public final void makeVideo</code></pre><p>makeVideo라는 메소드는 자식 클래스에서는 오버라이딩을 할 수가 없게 된다.</p>
<blockquote>
<blockquote>
<ul>
<li>메소드는 절대 변경하지 말고 무조건 이걸 써야 하는 경우에는 final 키워드를 넣어 줄 수 있다.</li>
</ul>
</blockquote>
</blockquote>
<ul>
<li>앞에 public final class를 넣으면 이제 이 클래스를 아예 상속할 수 없게 된다. </li>
</ul>
<hr>
<h2 id="열거형">열거형</h2>
<blockquote>
<h3 id="정의하는-방법">정의하는 방법</h3>
</blockquote>
<pre><code class="language-java">enum 열거형 이름</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/d40c404d-a750-4c02-8efd-6bd79394bf9f/image.png" alt=""> <img src="https://velog.velcdn.com/images/swk_x/post/676a695e-6404-42c6-9eac-ebd1afc71a6b/image.png" alt=""> <img src="https://velog.velcdn.com/images/swk_x/post/cac4e0d8-cc06-403d-a5f0-75a2e8f3acae/image.png" alt=""></p>
<h4 id="getwith">getwith</h4>
<ul>
<li>지금 상수값이 가지는 진짜 값을 얻을 수가 있다.</li>
</ul>
<hr>
<h2 id="quiz">Quiz</h2>
<p>Q. 클래스를 이용하여 햄버거를 자동으로 만드는 프로그램을 작성</p>
<p>조건</p>
<ul>
<li>햄버거의 종류는 햄버거, 치즈버거, 새우버거 3가지</li>
<li>각 버거는 각각의 클래스로 생성</li>
<li>버거 이름을 담기 위한 name 변수 정의</li>
<li>재료 정보를 표시하는 cook() 메소드 정의</li>
<li>공통 부분은 상속 및 메소드 오버라이딩으로 처리</li>
<li>모든 클래스는 하나의 파일에 정의</li>
<li>각 버거의 재료 정보
<img src="https://velog.velcdn.com/images/swk_x/post/c95813f5-3ab4-48a3-bded-65ef5ba4b194/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/efaa8f6b-3a80-42d3-aa98-be87f2902f02/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/7fc1a54d-864d-473c-8b49-901daba55575/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/0d85c3a6-70bb-44d4-95d6-3e479c52aae3/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 메소드]]></title>
            <link>https://velog.io/@swk_x/JAVA-%EB%A9%94%EC%86%8C%EB%93%9C</link>
            <guid>https://velog.io/@swk_x/JAVA-%EB%A9%94%EC%86%8C%EB%93%9C</guid>
            <pubDate>Wed, 27 Dec 2023 13:45:30 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/swk_x/post/b1e74ebf-160c-4408-bb96-e3fd6ec22e02/image.png" alt=""></p>
<h2 id="메소드">메소드</h2>
<ul>
<li>어떤 기능을 하는 코드들의 묶음 (=함수와 유사)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/e0c62734-4c2d-4298-996b-0f50587fc474/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/964f8c87-6969-4626-97de-d406c9b33823/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/1327b5c0-5805-4d23-8c8f-d80d57581899/image.png" alt=""></p>
<hr>
<h2 id="전달값">전달값</h2>
<ul>
<li>거듭제곱을 계산해주는 메소드</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/de8842a2-575b-4f60-b460-9d0481d9e4da/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/fe75f4c1-42da-47b3-b26d-ad5a19b6aef1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/06be4ab3-4457-4352-a55d-55fb3edf5711/image.jpg" alt=""></p>
<hr>
<h2 id="반환값">반환값</h2>
<ul>
<li><p>메소드를 수행했을 때 메소드 내에서 동작들을 수행하고 끝내는 게 아니고, 어떤 값을 반환해주고 메소드를 호출한 곳에서 반환된 값을 받아서 뭔가를 처리함</p>
</li>
<li><p>특정 호텔 정보를 관리하는 프로그램</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/2351f36d-0611-4b3b-82f2-34688dbb3d05/image.png" alt=""></p>
<p>메소드 동작을 수행하고 나서 반환해 줄 자료형 또는 그 형태를 적어주면 된다.
-&gt; void라고 적는 이유는 반환값이 없는 메소드라는 의미
void : 아무런 값을 반환하지 않는 메소드</p>
<p>호텔 전화번호라는 문자열 형태의 값을 반환하기 위해서는 void 대신에 string을 적어줘야 함
<img src="https://velog.velcdn.com/images/swk_x/post/a5b9379a-7ee5-4284-9ef8-742011341e0e/image.png" alt=""></p>
<hr>
<h2 id="전달값과-반환값">전달값과 반환값</h2>
<p><img src="https://velog.velcdn.com/images/swk_x/post/1ef09b73-de69-4811-ad29-1b1abdd549d3/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/2a605324-e88e-4350-9efa-172b5107ffbf/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/a56edb2f-24b4-4d51-9dc4-78b5931cb305/image.jpg" alt=""></p>
<hr>
<h2 id="메소드-오버로딩">메소드 오버로딩</h2>
<ul>
<li>이름이 같은 메소드를 여러 개 만드는 것</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/bad488ff-81c8-4c6d-95ac-2f1d790423f2/image.png" alt=""></p>
<blockquote>
<h4 id="getpowerstring-strnumber">getPower(String strNumber)</h4>
<p>문자열을 정수로 바꿔주는 작업을 함</p>
</blockquote>
<blockquote>
<h4 id="integerparseintstrnumber">Integer.parseInt(strNumber);</h4>
</blockquote>
<ul>
<li>숫자형의 문자열을 인자값으로 받으면 해당 값을 10진수의 Integer 형으로 반환</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/7a396f0f-1908-4c10-9154-dd20ba9356ad/image.png" alt=""></p>
<p>-&gt; 메소드 오버로딩은 전달값의 타입이 다르거나 전달값의 자료형이 다르거나 또는 전달값의 개수가 다르면 똑같은 이름의 메소드를 얼마든지 중복해서 선언할 수가 있다. </p>
<p>-&gt; 반환형이 다른 형태로는 메소드를 중복정의 할 수 없다.</p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/31b58e04-2db9-481e-97b4-ab0f32892b05/image.jpg" alt=""></p>
<hr>
<h2 id="메소드가-필요한-이유">메소드가 필요한 이유</h2>
<ul>
<li>비슷한 동작을 하는 것 또는 같은 동작을 하는데 값만 조금 바뀐다고 하면 이런 부분을 메소드로 만들어 가지고 코드를 간소하게 하면 또 다른 데서도 이 메소드가 필요하다고 할 때 그 메소드만 호출하면 된다. 또 수정이 필요하다고 하면 그 메소드 내에 있는 코드 딱 한 번만 수정하면 되기 때문에 코드 유지 보수를 할 때 굉장히 용이하다. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/b9c9cc9b-5838-4f5a-9ae6-c105e24c4c7b/image.png" alt=""></p>
<ul>
<li>메소드 내에서도 또 다른 메소드를 호출할 수 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/6ac287f0-774c-4334-a14a-cfcd39226918/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/1f28bab4-aaaa-4549-913c-c28c5dab3418/image.jpg" alt=""></p>
<hr>
<h2 id="변수의-범위-scope">변수의 범위 (Scope)</h2>
<ul>
<li><p>지역 변수는 이 변수가 선언된 그 영역 내에서만 사용할 수 있는 변수이다. 그래서 여기에서는 지금 method b 내에서 중괄호 열고 닫고 안에서 이게 선언이 되었다. 그러면 이 중괄호 속에서만 쓸 수 있게 되는 것이다. 여기를 벗어나게 되면 다른 곳에서는 쓸 수가 없다. </p>
</li>
<li><blockquote>
<p>number, result는 지역변수</p>
</blockquote>
</li>
<li><p>넘버도 중간으로 열고 닫고 여기에서만 쓸 수 있다. </p>
</li>
</ul>
<blockquote>
<p>-&gt; <strong>만약에 여기에서 만든 변수를 다른 곳에서 쓰고 싶다고 하면은 전달값을 이용해 인트, 넘버 이런 식으로 전달값을 정의를 해주고 매소드를 호출할 때 그 값을 전달하는 식으로 사용할 수 있다.</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/swk_x/post/7a6d4aaa-352d-44e9-a81d-64db53231e3e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/7c754ee9-c799-49fb-9990-787c53c7d5dd/image.png" alt=""></p>
<hr>
<h2 id="main-메소드">Main 메소드</h2>
<p><img src="https://velog.velcdn.com/images/swk_x/post/a7b39db7-8519-40b0-8304-664ba1f7cf5a/image.png" alt=""></p>
<ul>
<li>우리가 지금까지 써왔던 메인 영역은 사실은 하나의 메소드인 거고 이 메소드는 문자열을 여러 개 가지고 있는 string 배열을 전달값으로 받는 메소드이다.  </li>
</ul>
<blockquote>
<h3 id="string-값을-전달-받는-방법">string 값을 전달 받는 방법?</h3>
<p>프로그램을 실행할 때 전달해주는 값이 될 수 있는데 이거를 한번 정의해 보자. </p>
<blockquote>
<p>Current 파일(오른쪽 위) -&gt; Edit Configurations -&gt; +클릭(왼쪽 위) -&gt; 어플리케이션 선택 -&gt; name에 test라고 적음 -&gt; 빨갛게 표시된 main class(우리가 지금 실행할 클래스를 정해 줌) 선택 -&gt; program argument(프로그램을 실행할 때 우리가 전달해주는 전달값이 된다.)클릭 -&gt; 테스트 전달값 입니다 작성 - 오른쪽 위가 원래는 current file이었는데 지금은 Test로 바뀜</p>
</blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/swk_x/post/876f6f0b-db6a-4033-9841-78d4fa98a9b3/image.png" alt=""></p>
<ol>
<li><p>edit configurations들어가서 &quot;테스트 전달값 입니다&quot;를 빼고 1을 입력한다.
<img src="https://velog.velcdn.com/images/swk_x/post/e33983e8-6826-47a7-baee-c1dcee41fd16/image.png" alt=""></p>
</li>
<li><p>edit configurations들어가서 &quot;1&quot;를 빼고 2을 입력한다.
<img src="https://velog.velcdn.com/images/swk_x/post/0fe9a2bb-abb2-468d-be1e-3107468792cd/image.png" alt=""></p>
</li>
<li><p>edit configurations들어가서 &quot;2&quot;를 빼고 3을 입력한다.
<img src="https://velog.velcdn.com/images/swk_x/post/2e7e9d47-2731-4c71-81fc-2b6f9a4fbf3c/image.png" alt=""></p>
</li>
<li><p>만약 4를 입력한다면...
<img src="https://velog.velcdn.com/images/swk_x/post/003f22c9-a4ec-4a24-aab8-022516b02725/image.png" alt=""></p>
</li>
<li><p>1, 3 둘 다 입력한다면...
<img src="https://velog.velcdn.com/images/swk_x/post/47a8678f-89c2-4ca2-b3a0-aa635a2ff512/image.png" alt=""></p>
</li>
</ol>
<ul>
<li>이런식으로 메인 메소드를 호출할 떄도 프로그램이 처음 실행될 때도 Edit 컴퓨레이션을 통해 어떤 값을 전달해서 똑같은 소스코드이지만 입력되는 값에 따라서 특정 기능을 서로 다르게 수행하도록 할 수 있다.</li>
</ul>
<hr>
<h2 id="quiz">Quiz</h2>
<p>Q. 개인 정보 중 일부를 비공개로 전환하는 프로그램을 작성</p>
<p>조건</p>
<ul>
<li>개인정보를 비공개로 전환하는 메소드 작성</li>
<li>하나의 메소드에서 모든 동작 처리</li>
<li>각 정보는 아래 위치부터 비공개 적용</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/01dab559-044e-4b30-836e-1f4b5f7a87c4/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/3219b922-f687-47e7-a6d0-903c3637839a/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 배열]]></title>
            <link>https://velog.io/@swk_x/JAVA-%EB%B0%B0%EC%97%B4</link>
            <guid>https://velog.io/@swk_x/JAVA-%EB%B0%B0%EC%97%B4</guid>
            <pubDate>Tue, 26 Dec 2023 10:29:47 GMT</pubDate>
            <description><![CDATA[<h2 id="배열">배열</h2>
<p>-&gt; 같은 자료형의 값 여러 개를 저장하는 연속된 공간</p>
<blockquote>
<h4 id="변수-vs-배열">변수 vs 배열</h4>
<p>변수 : 하나의 자료
배열 : 여러 개의 자료</p>
</blockquote>
<p> <img src="https://velog.velcdn.com/images/swk_x/post/501b2521-dfb9-4021-8515-500d481d4167/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/b7d44550-7cd1-4433-a556-e5ff7eb0bbf5/image.png" alt=""></p>
<hr>
<h2 id="배열-순회">배열 순회</h2>
<p><img src="https://velog.velcdn.com/images/swk_x/post/adb2f599-76bf-4b8f-8e3a-4ac00863c028/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/de788b1a-2810-41ef-a3c2-f97c0473ce46/image.png" alt=""></p>
<blockquote>
<h3 id="for-i-와-for-each는-어떻게-서로-다르게-쓸-수-있을까">for i 와 for-each는 어떻게 서로 다르게 쓸 수 있을까?</h3>
<p><strong>for-each *<em>: 배열의 요소를 처음부터 끝까지 다 순회
*</em>for i *<em>: 인덱스 값을 우리가 알 수 있다. 만약 커피 주문 10명치를 받았다고 하자. 선착순 3명까지 커피 사줄게. 인덱스 값을 이용해서 i가 3이면 그 부분은 커피를 사주지 않고 바로 반복문을 탈출한다. i기준으로 0, 1, 2까지만 커피를 사주게 된다. *</em>인덱스의 값을 이용해서 처리할 때 사용</strong></p>
</blockquote>
<hr>
<h2 id="다차원-배열">다차원 배열</h2>
<p>-&gt; 주로 2차원 배열</p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/18b3d8e6-4f89-47bd-9978-2fea46e4f3f9/image.png" alt=""></p>
<p>-&gt; 배열은 0부터 시작
[][] : <strong>[세로][가로]</strong></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/47f7dd40-8e85-4794-b7ed-a79294410e25/image.png" alt=""></p>
<blockquote>
<h3 id="에러">에러</h3>
<p><img src="https://velog.velcdn.com/images/swk_x/post/958512b4-735e-4230-91d7-6ded928d42e9/image.png" alt="">
-&gt; 배열의 인덱스가 배열의 범위를 벗어나서 생긴 오류</p>
</blockquote>
<hr>
<h2 id="다차원-배열-순회">다차원 배열 순회</h2>
<p><img src="https://velog.velcdn.com/images/swk_x/post/dcde2810-4bff-4dff-98c8-00529dea87cd/image.png" alt=""></p>
<p><strong>eng[i] : A, B, C...  -&gt; 세로
(j + 1) : 숫자 1, 2, 3...15  -&gt; 가로</strong></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/ca057f9c-ffe9-4754-bc59-944a27d86f9e/image.png" alt=""></p>
<hr>
<h2 id="아스키-코드">아스키 코드</h2>
<p><img src="https://velog.velcdn.com/images/swk_x/post/0931e36c-b781-43c1-9489-fe251cdc525a/image.png" alt=""></p>
<p>String.valueOf(ch) : ch를 문자열로 변환할 때 사용
ch++ : A, B, C... 이렇게 더해줌</p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/79919215-6da0-403f-b594-da8c1334a72a/image.png" alt=""></p>
<hr>
<h2 id="quiz">Quiz</h2>
<p>Q. 배열을 활용하여 쇼핑몰에서 구매 가능한 신발 사이즈 옵션을 출력하는 프로그램을 작성</p>
<p>조건</p>
<ul>
<li>신발 사이즈는 250부터 295까지 5 단위로 증가</li>
<li>신발 사이즈 수는 총 10가지</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/7d9f8d7a-c174-4d58-b54d-de383970392d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/b036510c-6557-49e4-9d6d-c98a884d78a5/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 제어문]]></title>
            <link>https://velog.io/@swk_x/JAVA-%EC%A0%9C%EC%96%B4%EB%AC%B8</link>
            <guid>https://velog.io/@swk_x/JAVA-%EC%A0%9C%EC%96%B4%EB%AC%B8</guid>
            <pubDate>Wed, 29 Nov 2023 12:23:40 GMT</pubDate>
            <description><![CDATA[<h2 id="조건문-if">조건문 If</h2>
<pre><code class="language-java">if(조건) { //조건식이 true일 때 아래 실행문 동작, false면 미실행
    실행문;
    실행문;
    ...
}</code></pre>
<pre><code class="language-java">package chap_04;

public class _01_If {
    public static void main(String[] args) {
        // 조건문 If
        int hour = 15; // 오후 3시

        // if 문 내에서 하나의 문장을 실행할 때는 { } 생략 가능
        if (hour &lt; 14)
            System.out.println(&quot;아이스 아메리카노 +1&quot;);

        // if 문 내에서 2개 이상의 문장을 실행할 때는 { } 생략 불가
        if (hour &lt; 14) {
            System.out.println(&quot;아이스 아메리카노 +1&quot;);
            System.out.println(&quot;샷추가&quot;);
        }
        System.out.println(&quot;커피 주문 완료 #1&quot;);

        // 오후 2시 이전, 모닝 커피를 마시지 않은 경우?
        hour = 10;
        boolean morningCoffee = false; // 모닝 커피
        // if (hour &lt; 14 &amp;&amp; morningCoffee == false) {
        if (hour &lt; 14 &amp;&amp; !morningCoffee) {
            System.out.println(&quot;아이스 아메리카노 +1&quot;);
        }
        System.out.println(&quot;커피 주문 완료 #2&quot;);

        // 오후 2시 이후이거나 모닝 커피를 마신 경우?
        hour = 15;
        morningCoffee = true;
        // if (hour &gt;= 14 || morningCoffee == true) {
        if (hour &gt;= 14 || morningCoffee) {
            System.out.println(&quot;아이스 아메리카노 (디카페인) +1&quot;);
        }
        System.out.println(&quot;커피 주문 완료 #3&quot;);
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/7d768e93-6871-4b08-84aa-dcf1e6353219/image.png" alt=""></p>
<hr>
<h2 id="if-else">If Else</h2>
<pre><code class="language-java">if(조건) { 
    실행문; //조건식이 true일 경우 실행
}
else {
    실행문; //조건식이 false일 경우 실행
}</code></pre>
<pre><code class="language-java">package chap_04;

public class _02_Else {
    public static void main(String[] args) {
        // 조건문 If Else
        int hour = 10;
        if (hour &lt; 14) { // 오후 2시 이전이면
            System.out.println(&quot;아이스 아메리카노 +1&quot;);
        } else { // 그 외의 경우이면
            System.out.println(&quot;아이스 아메리카노 (디카페인) +1&quot;);
        }
        System.out.println(&quot;커피 주문 완료 #1&quot;);

        // 오후 2시 이후이거나 모닝 커피를 마신 경우?
        hour = 10;
        boolean morningCoffee = false;
        if (hour &gt;= 14 || morningCoffee == true) { // 오후 2시 이후이거나 모닝 커피를 마신 경우?
            System.out.println(&quot;아이스 아메리카노 (디카페인) +1&quot;);
        } else { // 그 외의 경우이면
            System.out.println(&quot;아이스 아메리카노 +1&quot;);
        }
        System.out.println(&quot;커피 주문 완료 #2&quot;);
    }
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/6bdadb72-c41c-4b66-b0f8-8fb5399d13b8/image.png" alt=""></p>
<hr>
<h2 id="elseif">ElseIf</h2>
<pre><code class="language-java">if(조건식 1) { 
    실행문; //조건식 1이 true일 때 실행
}
else if(조건식2) {
    실행문2; //조건식 1이 false이고 조건식 2가 true일 때 실행
}
else {
    실행문; //조건식 1과 2가 false일 때 실행
}</code></pre>
<p>※else if절은 여러 번 정의할 수 있고, else절은 생략이 가능
<strong>단, if문이 처음에 나오고 그 다음에 else if문, 제일 마지막에 else문이 나와야 한다.</strong></p>
<pre><code class="language-java">package chap_04;

public class _03_ElseIf {
    public static void main(String[] args) {
        // 조건문 ElseIf

        // 한라봉 에이드가 있으면 +1
        // 또는 망고 주스가 있으면 +1
        // 또는 아이스 아메리카노 +1

        boolean hallabongAde = true; // 한라봉 에이드
        boolean mangoJuice = true; // 망고 주스

        if (hallabongAde) {
            System.out.println(&quot;한라봉 에이드 +1&quot;);
        } else if (mangoJuice) {
            System.out.println(&quot;망고 주스 +1&quot;);
        } else {
            System.out.println(&quot;아이스 아메리카노 +1&quot;);
        }
        System.out.println(&quot;커피 주문 완료 #1&quot;);

        // else if 는 여러번 사용 가능
        hallabongAde = false;
        mangoJuice = false;
        boolean orangeJuice = true;

        if (hallabongAde) {
            System.out.println(&quot;한라봉 에이드 +1&quot;);
        } else if (mangoJuice) {
            System.out.println(&quot;망고 주스 +1&quot;);
        } else if (orangeJuice) {
            System.out.println(&quot;오렌지 주스 +1&quot;);
        } else {
            System.out.println(&quot;아이스 아메리카노 +1&quot;);
        }
        System.out.println(&quot;커피 주문 완료 #2&quot;);

        // else 는 없어도 가능
        hallabongAde = false;
        mangoJuice = false;
        orangeJuice = false;

        if (hallabongAde) {
            System.out.println(&quot;한라봉 에이드 +1&quot;);
        } else if (mangoJuice) {
            System.out.println(&quot;망고 주스 +1&quot;);
        } else if (orangeJuice) {
            System.out.println(&quot;오렌지 주스 +1&quot;);
        }
        System.out.println(&quot;커피 주문 완료 #3&quot;);
    }
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/40c3a2d1-9625-4213-bf6f-69160cde5971/image.png" alt=""></p>
<hr>
<h2 id="switch-case문">Switch Case문</h2>
<pre><code class="language-java">switch(입력변수) {
    case 입력값1: ...
         break;
    case 입력값2: ...
         break;
    ...
    default: ...
         break;
}
</code></pre>
<pre><code class="language-java">package chap_04;

public class _04_SwitchCase {
    public static void main(String[] args) {
        // Switch Case

        // 석차에 따른 장학금 지급
        // 1등 : 전액 장학금
        // 2등 : 반액 장학금
        // 3등 : 반액 장학금
        // 그 외 : 장학금 대상 아님

        // If Else 문을 이용 (여러 조건 또는 범위에 해당하는 조건)
        int ranking = 4; // 등수
        if (ranking == 1) {
            System.out.println(&quot;전액 장학금&quot;);
        } else if (ranking == 2 || ranking == 3) {
            System.out.println(&quot;반액 장학금&quot;);
        } else {
            System.out.println(&quot;장학금 대상 아님&quot;);
        }
        System.out.println(&quot;조회 완료 #1&quot;);

        // Switch Case 문을 이용 (명확한 케이스가 있는 경우)
        ranking = 2;
        switch (ranking) {
            case 1:
                System.out.println(&quot;전액 장학금&quot;);
                break;
            case 2:
                System.out.println(&quot;반액 장학금&quot;);
                break;
            case 3:
                System.out.println(&quot;반액 장학금&quot;);
                break;
            default:
                System.out.println(&quot;장학금 대상 아님&quot;);
        }
        System.out.println(&quot;조회 완료 #2&quot;);

        // case 2 와 3 을 통합
        ranking = 3;
        switch (ranking) {
            case 1:
                System.out.println(&quot;전액 장학금&quot;);
                break;
            case 2:
            case 3:
                System.out.println(&quot;반액 장학금&quot;);
                break;
            default:
                System.out.println(&quot;장학금 대상 아님&quot;);
        }
        System.out.println(&quot;조회 완료 #3&quot;);

        // 중고상품의 등급에 따른 가격을 책정 (1급 : 최상, 4급 : 최하)
        int grade = 1; // 등급
        int price = 7000; // 기본 가격
        switch (grade) {
            case 1:
                price += 1000; // price = price + 1000;
                //break;없음
            case 2:
                price += 1000;
                //break;없음
            case 3:
                price += 1000;
                break;
        }
        System.out.println(grade + &quot;등급 제품의 가격 : &quot; + price + &quot;원&quot;);
        // 1등급 제품의 가격 : 10000원
        // 2등급 제품의 가격 : 9000원
    }
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/4358bfc2-1975-42b9-8afe-092137074182/image.png" alt=""></p>
<hr>
<h2 id="for문">For문</h2>
<pre><code class="language-java">for (초기식; 조건문; 증감식) {
    ... //조건식이 참일 동안만 반복
}</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/4113c6b4-965a-43f7-aa28-0d379531b42f/image.png" alt=""></p>
<blockquote>
<h3 id="반복순서-구조화">반복순서 구조화</h3>
<p>초기식 -&gt; 반복조건 -&gt; 참인경우 for문 안으로(거짓인 경우 for문을 빠져 나감) -&gt; 증감식 -&gt; 반복조건 -&gt; 참인경우 for문 안으로 -&gt; 증감식 -&gt; 반복조건 -&gt; ...</p>
</blockquote>
<blockquote>
<h3 id="무한루프">무한루프</h3>
<p>-&gt; 반복조건에 세미콜론 두개나 true를 직접 넣게되면 무한루프가 실행</p>
</blockquote>
<pre><code class="language-java">for(;;){
    ...
}</code></pre>
<pre><code class="language-java">for(true){
    ...
}</code></pre>
<pre><code class="language-java">package chap_04;

public class _05_For {
    public static void main(String[] args) {
        // 반복문 For
        // 나코 매장
        System.out.println(&quot;어서오세요. code._caine입니다.&quot;);
        // 또다른 손님이 들어오면?
        System.out.println(&quot;어서오세요. code._caine입니다.&quot;);
        System.out.println(&quot;어서오세요. code._caine입니다.&quot;);
        System.out.println(&quot;어서오세요. code._caine입니다.&quot;);
        System.out.println(&quot;어서오세요. code._caine입니다.&quot;);
        System.out.println(&quot;어서오세요. code._caine입니다.&quot;);
        System.out.println(&quot;어서오세요. code._caine입니다.&quot;);
        // 만약에 인사 법이 바뀌면?
        System.out.println(&quot;환영합니다. code._caine입니다.&quot;);
        System.out.println(&quot;환영합니다. code._caine입니다.&quot;);
        System.out.println(&quot;환영합니다. code._caine입니다.&quot;);
        // 매장 이름이 바뀌면?
        // 나코 -&gt; 코나
        System.out.println(&quot;환영합니다. code._caine입니다.&quot;);
        System.out.println(&quot;환영합니다. code._caine입니다.&quot;);
        System.out.println(&quot;환영합니다. code._caine입니다.&quot;);

        System.out.println(&quot; ---- 반복문 사용 ---- &quot;);

        // 반복문 사용 For
        for (int i = 0; i &lt; 10; i++) {
            // System.out.println(&quot;어서오세요. code._caine입니다. &quot; + i);
            // System.out.println(&quot;환영합니다. code._caine입니다. &quot; + i);
            System.out.println(&quot;환영합니다. code._caine입니다. &quot; + i);
        }

        // 짝수만 출력 (fori 만 적고 엔터)
        // 0, 2, 4, 6, 8
        for (int i = 0; i &lt; 10; i += 2) {
            System.out.print(i);
        }

        System.out.println();

        // 홀수만 출력
        // 1, 3, 5, 7, 9
        for (int i = 1; i &lt; 10; i += 2) {
            System.out.print(i);
        }

        System.out.println();

        // 거꾸로 숫자
        // 5, 4, 3, 2, 1
        for (int i = 5; i &gt; 0; i--) {
            System.out.print(i);
        }

        System.out.println();

        // 1부터 10까지의 수들의 합
        // 1 + 2 + ... + 10 = 55
        int sum = 0;
        for (int i = 1; i &lt;= 10; i++) {
            sum += i;
            System.out.println(&quot;현재까지 총합은 &quot; + sum + &quot;입니다.&quot;);
        }
        System.out.println(&quot;1부터 10까지의 모든 수의 총합은 &quot; + sum + &quot;입니다.&quot;);
    }
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/67fc23d7-528b-4431-b78f-44827fa39179/image.png" alt=""></p>
<hr>
<h2 id="while">while</h2>
<ul>
<li>while 조건이 true(참)이면 반복문이 계속 실행</li>
<li>while 조건이 false(거짓)이면 반복문은 종료<pre><code class="language-java">while (조건문) {
  &lt;수행할 문장1&gt;;
  &lt;수행할 문장2&gt;;
  &lt;수행할 문장3&gt;;
  ...
}
</code></pre>
</li>
</ul>
<pre><code>
```java
package chap_04;

public class _06_While {
    public static void main(String[] args) {
        // 반복문 While
        // 수영장에서 수영을 하는 모습
        int distance = 25; // 전체 거리 25m
        int move = 0; // 현재 이동 거리 0m
        while (move &lt; distance) { // 현재 이동 거리가 전체 거리보다 작다는 조건이 참인 동안 반복 수행
            System.out.println(&quot;발차기를 계속 합니다.&quot;);
            System.out.println(&quot;현재 이동 거리 : &quot; + move);
            move += 3; // 3미터 이동
        }
        System.out.println(&quot;도착하였습니다.&quot;);

        // 무한 루프
        move = 0;
        while (move &lt; distance) { // 현재 이동 거리가 전체 거리보다 작다는 조건이 참인 동안 반복 수행
            System.out.println(&quot;발차기를 계속 합니다.&quot;);
            System.out.println(&quot;현재 이동 거리 : &quot; + move);
        }
        System.out.println(&quot;도착하였습니다.&quot;);
    }
}
</code></pre><p><img src="https://velog.velcdn.com/images/swk_x/post/291d3929-22bf-4258-bcc4-3e2ae0d6749a/image.png" alt="">
// 무한루프</p>
<hr>
<h2 id="do-while">Do While</h2>
<pre><code class="language-java">do {
    반복 실행할 문장;
} while(조건식) //조건식이 true일 경우 실행, false일 경우 종료(미실행)</code></pre>
<ul>
<li>조건식이 true이든 false이든 상관없이 중괄호({}) 안의 문장을 무조건 한번 실행시킨 후 조건을 검사하여 반복을 결정한다.</li>
</ul>
<blockquote>
<h3 id="예제">예제</h3>
</blockquote>
<pre><code class="language-java">public class DoWhileEx01 {
    public static void main(String[] args) {
        int i = 1; // 초기값 설정
        do {
            System.out.println(i + &quot;. joker&quot;); // 실행문
            i++; // 증감식
        } while (i &lt;= 10); // 조건식
    }
}</code></pre>
<p>-&gt; 결과는 실행할 문장이 10번동안 반복되어 출력된다.</p>
<pre><code class="language-java">package chap_04;

public class _07_DoWhile {
    public static void main(String[] args) {
        // 반복문 DoWhile
        int distance = 25; // 전체 거리 25m
        int move = 0; // 현재 이동 거리 0m
        int height = 2; // 키 2m
        while (move + height &lt; distance) {
            System.out.println(&quot;발차기를 계속 합니다.&quot;);
            System.out.println(&quot;현재 이동 거리 : &quot; + move);
            move += 3; // 3m 이동
        }
        System.out.println(&quot;도착했습니다.&quot;);

        System.out.println(&quot; --- 반복문 #1 ---&quot;);

        // 키가 엄청나게 큰 사람?
        move = 0;
        height = 25; // 키가 25m
        while (move + height &lt; distance) {
            System.out.println(&quot;발차기를 계속 합니다.&quot;);
            System.out.println(&quot;현재 이동 거리 : &quot; + move);
            move += 3; // 3m 이동
        }
        System.out.println(&quot;도착했습니다.&quot;);

        System.out.println(&quot; --- 반복문 #2 ---&quot;);

        // Do While 반복문
        do {
            System.out.println(&quot;발차기를 계속 합니다.&quot;);
            System.out.println(&quot;현재 이동 거리 : &quot; + move);
            move += 3;
        } while (move + height &lt; distance);
        System.out.println(&quot;도착했습니다.&quot;);
    }
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/f954f41f-3798-40fe-b6b7-b2644c12ab27/image.png" alt=""></p>
<hr>
<h2 id="이중-반복문">이중 반복문</h2>
<pre><code class="language-java">package chap_04;

public class _08_NestedLoop {
    public static void main(String[] args) {
        // 이중 반복문

        // 별 (*) 사각형 만들기
        /*

        *****
        *****
        *****
        *****
        *****

         */
        for (int i = 0; i &lt; 5; i++) {
            for (int j = 0; j &lt; 5; j++) {
                System.out.print(&quot;*&quot;);
            }
            System.out.println();
        }

        System.out.println(&quot;-----------------&quot;);

        // 별 (*) 왼쪽 삼각형 만들기
        /*

        *
        **
        ***
        ****
        *****

         */
        for (int i = 0; i &lt; 5; i++) {
            // for (int j = 0; j &lt; i + 1; j++) {
            for (int j = 0; j &lt;= i; j++) {
                System.out.print(&quot;*&quot;);
            }
            System.out.println();
        }

        System.out.println(&quot;-----------------&quot;);

        // 별 (*) 오른쪽 삼각형 만들기
        /*

             *
            **
           ***
          ****
         *****

         SSSS*
         SSS**
         SS***
         S****
         *****

         */
        for (int i = 0; i &lt; 5; i++) {
            for (int j = 0; j &lt; 4 - i; j++) {
                System.out.print(&quot; &quot;);
            }
            for (int k = 0; k &lt;= i ; k++) {
                System.out.print(&quot;*&quot;);
            }
            System.out.println();
        }
    }
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/a0dda278-1d55-414b-9455-73b115fb3b54/image.png" alt=""></p>
<p><strong>※무조건 이해하는 게 중요!!</strong></p>
<hr>
<h2 id="구구단-출력">구구단 출력</h2>
<pre><code class="language-java">package chap_04;

public class _09_MultipleTable {
    public static void main(String[] args) {
        // 구구단
        // 2 * 1 = 2
        // 2 * 2 = 4

        for (int i = 2; i &lt; 10; i++) {
            for (int j = 1; j &lt; 10; j++) {
                System.out.println(i + &quot; x &quot; + j + &quot; = &quot; + (i * j));
            }
            System.out.println();
        }
    }
}
</code></pre>
<pre><code class="language-java">2 X 1 = 2
2 X 2 = 4
2 X 3 = 6
2 X 4 = 8
2 X 5 = 10
2 X 6 = 12
2 X 7 = 14
2 X 8 = 16
2 X 9 = 18

3 X 1 = 3
3 X 2 = 6
3 X 3 = 9
3 X 4 = 12
3 X 5 = 15
3 X 6 = 18
3 X 7 = 21
3 X 8 = 24
3 X 9 = 27

4 X 1 = 4
4 X 2 = 8
4 X 3 = 12
4 X 4 = 16
4 X 5 = 20
4 X 6 = 24
4 X 7 = 28
4 X 8 = 32
4 X 9 = 36

5 X 1 = 5
5 X 2 = 10
5 X 3 = 15
5 X 4 = 20
5 X 5 = 25
5 X 6 = 30
5 X 7 = 35
5 X 8 = 40
5 X 9 = 45

6 X 1 = 6
6 X 2 = 12
6 X 3 = 18
6 X 4 = 24
6 X 5 = 30
6 X 6 = 36
6 X 7 = 42
6 X 8 = 48
6 X 9 = 54

7 X 1 = 7
7 X 2 = 14
7 X 3 = 21
7 X 4 = 28
7 X 5 = 35
7 X 6 = 42
7 X 7 = 49
7 X 8 = 56
7 X 9 = 63

8 X 1 = 8
8 X 2 = 16
8 X 3 = 24
8 X 4 = 32
8 X 5 = 40
8 X 6 = 48
8 X 7 = 56
8 X 8 = 64
8 X 9 = 72

9 X 1 = 9
9 X 2 = 18
9 X 3 = 27
9 X 4 = 36
9 X 5 = 45
9 X 6 = 54
9 X 7 = 63
9 X 8 = 72
9 X 9 = 81


Process finished with exit code 0
</code></pre>
<hr>
<h2 id="break">Break</h2>
<ul>
<li>switch문에서 break문은 현재 위치에서 가장 가까운 switch문 또는 반복문을 벗어나는데 사용된다. 주로 if문과 함께 사용되어 if문의 조건식에 따라 for문과 while문을 종료할 떄 사용</li>
<li><strong>반복문 전체 중단</strong></li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/9b7b8a9f-5bb7-4932-9784-2cbbbcaf4d53/image.png" alt=""></p>
<pre><code class="language-java">package chap_04;

public class _10_Break {
    public static void main(String[] args) {
        // Break
        // 치킨 집에서 매일 20마리만 판매 (1인당 1마리만 구매 가능)
        // 손님이 50명 대기

        // For 문
        int max = 20;
        for (int i = 1; i &lt;= 50; i++) {
            System.out.println(i + &quot;번 손님, 주문하신 치킨 나왔습니다.&quot;);
            if (i == max) {
                System.out.println(&quot;금일 재료가 모두 소진되었습니다.&quot;);
                break; // 반복문을 탈출
            }
        }
        System.out.println(&quot;영업을 종료합니다.&quot;);

        System.out.println(&quot;---------------------&quot;);

        // While 문
        int index = 1; // 손님 대기 번호
        while (index &lt;= 50) {
            System.out.println(index + &quot;번 손님, 주문하신 치킨 나왔습니다.&quot;);
            if (index == max) {
                System.out.println(&quot;금일 재료가 모두 소진되었습니다.&quot;);
                break;
            }
            index++;
        }
        System.out.println(&quot;영업을 종료합니다.&quot;);
    }
}
</code></pre>
<pre><code class="language-java">1번 손님, 주문하신 치킨 나왔습니다.
2번 손님, 주문하신 치킨 나왔습니다.
3번 손님, 주문하신 치킨 나왔습니다.
4번 손님, 주문하신 치킨 나왔습니다.
5번 손님, 주문하신 치킨 나왔습니다.
6번 손님, 주문하신 치킨 나왔습니다.
7번 손님, 주문하신 치킨 나왔습니다.
8번 손님, 주문하신 치킨 나왔습니다.
9번 손님, 주문하신 치킨 나왔습니다.
10번 손님, 주문하신 치킨 나왔습니다.
11번 손님, 주문하신 치킨 나왔습니다.
12번 손님, 주문하신 치킨 나왔습니다.
13번 손님, 주문하신 치킨 나왔습니다.
14번 손님, 주문하신 치킨 나왔습니다.
15번 손님, 주문하신 치킨 나왔습니다.
16번 손님, 주문하신 치킨 나왔습니다.
17번 손님, 주문하신 치킨 나왔습니다.
18번 손님, 주문하신 치킨 나왔습니다.
19번 손님, 주문하신 치킨 나왔습니다.
20번 손님, 주문하신 치킨 나왔습니다.
금일 재료가 모두 소진되었습니다.
영업을 종료합니다.
---------------------
1번 손님, 주문하신 치킨 나왔습니다.
2번 손님, 주문하신 치킨 나왔습니다.
3번 손님, 주문하신 치킨 나왔습니다.
4번 손님, 주문하신 치킨 나왔습니다.
5번 손님, 주문하신 치킨 나왔습니다.
6번 손님, 주문하신 치킨 나왔습니다.
7번 손님, 주문하신 치킨 나왔습니다.
8번 손님, 주문하신 치킨 나왔습니다.
9번 손님, 주문하신 치킨 나왔습니다.
10번 손님, 주문하신 치킨 나왔습니다.
11번 손님, 주문하신 치킨 나왔습니다.
12번 손님, 주문하신 치킨 나왔습니다.
13번 손님, 주문하신 치킨 나왔습니다.
14번 손님, 주문하신 치킨 나왔습니다.
15번 손님, 주문하신 치킨 나왔습니다.
16번 손님, 주문하신 치킨 나왔습니다.
17번 손님, 주문하신 치킨 나왔습니다.
18번 손님, 주문하신 치킨 나왔습니다.
19번 손님, 주문하신 치킨 나왔습니다.
20번 손님, 주문하신 치킨 나왔습니다.
금일 재료가 모두 소진되었습니다.
영업을 종료합니다.

Process finished with exit code 0
</code></pre>
<hr>
<h2 id="continue">Continue</h2>
<ul>
<li><strong>반복문의 현재 단계를 중단</strong></li>
<li>반복문 안에서 어떤 조건을 충족하였을 때 수행문을 수행하지 않고 다시 조건을 검토하는 기능을 한다. </li>
<li>continue문은 반복문 내에서만 사용될 수 있으며, 반복이 진행되는 도중에 continue문을 만나면 아래 문장은 실행하지 않고 반복문의 끝으로 이동하여 다음 반복으로 넘어간다. </li>
</ul>
<pre><code class="language-java">package chap_04;

public class _11_Continue {
    public static void main(String[] args) {
        // Continue

        // 치킨 주문 손님중에 노쇼 손님이 있다고 가정
        // For
        int max = 20; // 최대 치킨 판매 수량
        int sold = 0; // 현재 치킨 판매 수량
        int noShow = 17; // 대기번호 17번 손님이 노쇼
        for (int i = 1; i &lt;= 50; i++) {
            System.out.println(i + &quot;번 손님, 주문하신 치킨 나왔습니다.&quot;);

            // 손님이 없다면? (noShow)
            if (i == noShow) {
                System.out.println(i + &quot;번 손님, 노쇼로 인해 다음 손님에게 기회가 넘어갑니다.&quot;);
                continue;
            }

            sold++; // 판매 처리
            if (sold == max) {
                System.out.println(&quot;금일 재료가 모두 소진되었습니다.&quot;);
                break;
            }
        }
        System.out.println(&quot;영업을 종료합니다.&quot;);

        System.out.println(&quot;------------------&quot;);
        // While 문
        sold = 0;
        int index = 0; // 손님 번호
        // while (index &lt;= 50) {
        while (true) {
            index++;
            System.out.println(index + &quot;번 손님, 주문하신 치킨 나왔습니다.&quot;);

            // 손님이 없다면 (noShow)
            if (index == noShow) {
                System.out.println(index + &quot;번 손님, 노쇼로 인해 다음 손님에게 기회가 넘어갑니다.&quot;);
                continue;
            }

            sold++; // 판매 처리
            if (sold == max) {
                System.out.println(&quot;금일 재료가 모두 소진되었습니다.&quot;);
                break;
            }
        }
        System.out.println(&quot;영업을 종료합니다.&quot;);
    }
}
</code></pre>
<pre><code class="language-java">1번 손님, 주문하신 치킨 나왔습니다.
2번 손님, 주문하신 치킨 나왔습니다.
3번 손님, 주문하신 치킨 나왔습니다.
4번 손님, 주문하신 치킨 나왔습니다.
5번 손님, 주문하신 치킨 나왔습니다.
6번 손님, 주문하신 치킨 나왔습니다.
7번 손님, 주문하신 치킨 나왔습니다.
8번 손님, 주문하신 치킨 나왔습니다.
9번 손님, 주문하신 치킨 나왔습니다.
10번 손님, 주문하신 치킨 나왔습니다.
11번 손님, 주문하신 치킨 나왔습니다.
12번 손님, 주문하신 치킨 나왔습니다.
13번 손님, 주문하신 치킨 나왔습니다.
14번 손님, 주문하신 치킨 나왔습니다.
15번 손님, 주문하신 치킨 나왔습니다.
16번 손님, 주문하신 치킨 나왔습니다.
17번 손님, 주문하신 치킨 나왔습니다.
17번 손님, 노쇼로 인해 다음 손님에게 기회가 넘어갑니다.
18번 손님, 주문하신 치킨 나왔습니다.
19번 손님, 주문하신 치킨 나왔습니다.
20번 손님, 주문하신 치킨 나왔습니다.
21번 손님, 주문하신 치킨 나왔습니다.
금일 재료가 모두 소진되었습니다.
영업을 종료합니다.
------------------
1번 손님, 주문하신 치킨 나왔습니다.
2번 손님, 주문하신 치킨 나왔습니다.
3번 손님, 주문하신 치킨 나왔습니다.
4번 손님, 주문하신 치킨 나왔습니다.
5번 손님, 주문하신 치킨 나왔습니다.
6번 손님, 주문하신 치킨 나왔습니다.
7번 손님, 주문하신 치킨 나왔습니다.
8번 손님, 주문하신 치킨 나왔습니다.
9번 손님, 주문하신 치킨 나왔습니다.
10번 손님, 주문하신 치킨 나왔습니다.
11번 손님, 주문하신 치킨 나왔습니다.
12번 손님, 주문하신 치킨 나왔습니다.
13번 손님, 주문하신 치킨 나왔습니다.
14번 손님, 주문하신 치킨 나왔습니다.
15번 손님, 주문하신 치킨 나왔습니다.
16번 손님, 주문하신 치킨 나왔습니다.
17번 손님, 주문하신 치킨 나왔습니다.
17번 손님, 노쇼로 인해 다음 손님에게 기회가 넘어갑니다.
18번 손님, 주문하신 치킨 나왔습니다.
19번 손님, 주문하신 치킨 나왔습니다.
20번 손님, 주문하신 치킨 나왔습니다.
21번 손님, 주문하신 치킨 나왔습니다.
금일 재료가 모두 소진되었습니다.
영업을 종료합니다.

Process finished with exit code 0</code></pre>
<hr>
<h2 id="quiz">Quiz</h2>
<p>Q. 조건문을 활용하여 주차 요금 정산 프로그램을 작성</p>
<p>조건</p>
<ul>
<li>주차요금은 시간당 4000 원 (일일 최대 요금은 30000 원)</li>
<li>경차 또는 장애인 차량은 최종 요금에서 50% 할인</li>
</ul>
<pre><code class="language-java">package chap_04;

// 주차요금은 시간당 4000 원 (일일 최대 요금은 30000 원)
// 경차 또는 장애인 차량은 최종 요금에서 50% 할인

//예시
// 일반 차량 5시간 주차 시 20000 원
// 경차 5시간 주차 시 10000 원
// 장애인 차량 10시간 주차 시 15000 원

// 실행결과 : 주차 요금은 xx 원입니다.

public class _Quiz_04 {
    public static void main(String[] args) {
        int hour = 10; // 주차 시간
        boolean isSmallCar = false; // 경차 여부
        boolean withDisabledPerson = true; // 장애인 차량 여부

        int fee = hour * 4000; // 주차 정산 요금 (시간당 4000 원 곱하기)

        // 30000 원 초과 시 일일 최대 요금으로 수정
        if (fee &gt; 30000) {
            fee = 30000; // 일일 최대 요금 적용
        }

        // 경차 또는 장애인 차량인 경우 50% 할인
        if (isSmallCar || withDisabledPerson) {
            fee /= 2; // 50% 할인 적용
        }

        // 실행 결과 출력
        System.out.println(&quot;주차 요금은 &quot; + fee + &quot; 원입니다.&quot;);
    }
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/4c57c32a-876e-4f98-b744-d240476ca5b2/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 문자열]]></title>
            <link>https://velog.io/@swk_x/JAVA-%EB%AC%B8%EC%9E%90%EC%97%B4</link>
            <guid>https://velog.io/@swk_x/JAVA-%EB%AC%B8%EC%9E%90%EC%97%B4</guid>
            <pubDate>Thu, 23 Nov 2023 12:43:32 GMT</pubDate>
            <description><![CDATA[<h2 id="string클래스의-메소드로-문자열-다루기">String클래스의 메소드로 문자열 다루기</h2>
<blockquote>
<h3 id="int-length">int length()</h3>
<p>-&gt; 현재 문자열의 길이 값을 반환</p>
</blockquote>
<pre><code class="language-java">String a1 = &quot;ABC&quot;;
System.out.println(a1, length());</code></pre>
<pre><code class="language-java">[실행결과]
3</code></pre>
<blockquote>
<h3 id="string-touppercase-string-tolowercase">String toUpperCase(), String toLowerCase()</h3>
<p>-&gt; 현재 문자열을 전부 대문자, 소문자로 반환</p>
</blockquote>
<pre><code class="language-java">String a1 = &quot;abcABC&quot;;
System.out.println(a1.toUpperCase());
System.out.println(a1.toLowerCase());</code></pre>
<pre><code class="language-java">[실행결과]
ABCABC
abcabc</code></pre>
<blockquote>
<h3 id="boolean-contains">Boolean contains</h3>
<p>-&gt; 현재 문자열에 매개변수 s의 문자열이 포함되어 있는지 여부를 검사 후 결과를 반환</p>
</blockquote>
<ul>
<li>포함되어 있으면 true</li>
<li>포함되어 있지 않으면 false<pre><code class="language-java">String a1 = &quot;APPLE&quot;;
System.out.println(a1.contains(&quot;A&quot;));
System.out.println(a1.contains(&quot;a&quot;));
System.out.println(a1.contains(&quot;Z&quot;));</code></pre>
<pre><code class="language-java">[실행결과]
true
false
false</code></pre>
</li>
</ul>
<blockquote>
<h3 id="int-indexofstring-str">int indexOf(String str)</h3>
<p>-&gt; 현재 문자열내에 있는 첫번째 str 문자열의 시작위치를 찾아서 그 결과값을 반환합니다. fromIndex를 사용하면 해당 인덱스의 위치에서부터 검색을 시작</p>
</blockquote>
<ul>
<li>포함되어 있으면 : 해당위치의 index값 </li>
<li>포함되어 있지 않으면 : -1<pre><code class="language-java">String s1 = &quot;ABCDE-ABCDE&quot;;
System.out.print(s1.indexOf(&quot;D&quot;) + &quot;, &quot;);
System.out.print(s1.indexOf(&quot;d&quot;) + &quot;, &quot;);
System.out.print(s1.indexOf(&quot;Z&quot;) + &quot;, &quot;);
System.out.print(s1.indexOf(&quot;DE&quot;));
System.out.printf(&quot;%n--------------%n&quot;);
System.out.print(s1.indexOf(&quot;D&quot;,2) + &quot;, &quot;);
System.out.print(s1.indexOf(&quot;D&quot;,3) + &quot;, &quot;);
System.out.print(s1.indexOf(&quot;D&quot;,4) + &quot;, &quot;);
System.out.print(s1.indexOf(&quot;D&quot;,5) + &quot;, &quot;);
System.out.print(s1.indexOf(&quot;D&quot;,10));</code></pre>
<pre><code class="language-java">[실행결과]
3, -1, -1, 3</code></pre>
</li>
</ul>
<hr>
<p>3, 3, 9, 9, -1</p>
<pre><code>
&gt;###  int lastIndexOf(String str)
-&gt; 현재 문자열내에 있는 마지막 str 문자열의 시작위치를 찾아서 그 결과값을 반환합니다. fromIndex를 사용하면 해당 인덱스의 위치에서부터 거꾸로 검색을 시작
- 포함되어 있으면 : 해당위치의 index값 
- 포함되어 있지 않으면 : -1
```java
String s1 = &quot;ABCDE-ABCDE&quot;;
System.out.print(s1.lastIndexOf(&quot;D&quot;) + &quot;, &quot;);
System.out.print(s1.lastIndexOf(&quot;d&quot;) + &quot;, &quot;);
System.out.print(s1.lastIndexOf(&quot;Z&quot;) + &quot;, &quot;);
System.out.print(s1.lastIndexOf(&quot;DE&quot;));
System.out.printf(&quot;%n--------------%n&quot;);
System.out.print(s1.lastIndexOf(&quot;D&quot;,2) + &quot;, &quot;);
System.out.print(s1.lastIndexOf(&quot;D&quot;,3) + &quot;, &quot;);
System.out.print(s1.lastIndexOf(&quot;D&quot;,4) + &quot;, &quot;);
System.out.print(s1.lastIndexOf(&quot;D&quot;,5) + &quot;, &quot;);
System.out.print(s1.lastIndexOf(&quot;D&quot;,10));</code></pre><pre><code class="language-java">[실행결과]
9, -1, -1, 9
--------------
-1, 3, 3, 3, 9</code></pre>
<blockquote>
<h3 id="boolean-startswithstring-prefix">boolean startsWith(String prefix)</h3>
<p>-&gt; 현재 문자열이 prefix 문자열로 시작하는지 검사 후 결과를 반환합니다. toffset을 사용할 경우 해당 숫자 만큼 건너뛴후 검사를 진행</p>
</blockquote>
<ul>
<li>포함되어 있으면 : true</li>
<li>포함되어 있지 않으면 : false<pre><code class="language-java">String s1 = &quot;HelloJavaWorld&quot;;
System.out.println(s1.startsWith(&quot;Hello&quot;));
System.out.println(s1.startsWith(&quot;hello&quot;));
System.out.println(s1.startsWith(&quot;Java&quot;));
System.out.println(s1.startsWith(&quot;Java&quot;, 5));</code></pre>
<pre><code class="language-java">[실행결과]
true
false
false
true</code></pre>
</li>
</ul>
<blockquote>
<h3 id="boolean-endswithstring-suffix"> boolean endsWith(String suffix)</h3>
<p>-&gt; 현재 문자열이 suffix 문자열로 끝나는 검사후 결과를 반환</p>
</blockquote>
<ul>
<li>포함되어 있으면 : true</li>
<li>포함되어 있지 않으면 : false<pre><code class="language-java">String s1 = &quot;HelloJavaWorld&quot;;
System.out.println(s1.endsWith(&quot;World&quot;));
System.out.println(s1.endsWith(&quot;world&quot;));
System.out.println(s1.endsWith(&quot;Java&quot;));</code></pre>
<pre><code class="language-java">[실행결과]
true
false
false</code></pre>
</li>
</ul>
<hr>
<h2 id="연습문제">연습문제</h2>
<pre><code class="language-java">package chap_03;

public class _01_String1 {
    public static void main(String[] args) {
        String s = &quot;I like Java and Python and C.&quot;;
        System.out.println(s);

        // 문자열의 길이
        System.out.println(s.length()); // 29

        // 대소문자 변환
        System.out.println(s.toUpperCase()); // 대문자로
        System.out.println(s.toLowerCase()); // 소문자로

        // 포함 관계
        System.out.println(s.contains(&quot;Java&quot;)); // 포함된다면 true
        System.out.println(s.contains(&quot;C#&quot;)); // 포함되지 않는다면 false
        System.out.println(s.indexOf(&quot;Java&quot;)); // 위치 정보 7
        System.out.println(s.indexOf(&quot;C#&quot;)); // 포함되지 않는다면 -1
        System.out.println(s.indexOf(&quot;and&quot;)); // 처음 일치하는 위치 정보 (12)
        System.out.println(s.lastIndexOf(&quot;and&quot;)); // 마지막 일치하는 위치 정보 (23)
        System.out.println(s.startsWith(&quot;I like&quot;)); // 이 문자열로 시작하면 true (아니면 false)
        System.out.println(s.endsWith(&quot;.&quot;)); // 이 문자열로 끝나면 true (아니면 false)
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/86600ae0-1ca7-4fd6-850b-bdb27168a0f5/image.png" alt=""></p>
<hr>
<blockquote>
<h3 id="string-replacecharsequence-target-charsequence-replacement">String replace(CharSequence target, CharSequence replacement)</h3>
<p>-&gt; 현재 문자열에 있는 target문자열을 replacement 문자열로 변경하여 반환</p>
</blockquote>
<pre><code class="language-java">String s1 = &quot;A+B+C+D+E&quot;;
System.out.println(s1.replace(&quot;+&quot;, &quot;-&quot;));</code></pre>
<pre><code class="language-java">[실행결과]
A-B-C-D-E</code></pre>
<blockquote>
<h3 id="string-substringint-beginindex">String substring(int beginIndex)</h3>
<p>-&gt; 현재 문자열의 beginIndex 위치부터 마지막까지 문자열을 반환합니다. endIndex를 사용하면 beginIndex부터 endIndex - 1 까지의 문자열을 반환</p>
</blockquote>
<pre><code class="language-java">String s1 = &quot;ABCDEFG&quot;;
System.out.println(s1.substring(2));
System.out.println(s1.substring(2,4));</code></pre>
<pre><code class="language-java">[실행결과]
CDEFG
CD</code></pre>
<p><strong>※주의</strong> 
-&gt; s 변수에 변환 결과가 반영되는 것은 아니다.
s = s.substring(7);
ㄴ이렇게 해야 변환 결과가 s변수에 반영된다.</p>
<hr>
<h2 id="연습문제-1">연습문제</h2>
<pre><code class="language-java">package chap_03;

public class _02_String2 {
    public static void main(String[] args) {
        String s = &quot;I like Java and Python and C.&quot;;

        // 문자열 변환
        System.out.println(s.replace(&quot; and&quot;, &quot;,&quot;)); // &quot; and&quot; 를 &quot;,&quot; 로 변환
        System.out.println(s.substring(7)); // 인덱스 기준 7 부터 시작 (이전 내용은 삭제)
        System.out.println(s.substring(s.indexOf(&quot;Java&quot;)));
        // &quot;Java&quot; 가 시작하는 위치부터, &quot;.&quot; 이 시작하는 위치 바로 앞까지
        System.out.println(s.substring(s.indexOf(&quot;Java&quot;), s.indexOf(&quot;.&quot;))); // 시작 위치부터 끝 위치 &quot;직전&quot; 까지

        // 공백 제거
        s = &quot;        I love Java.      &quot;;
        System.out.println(s);
        System.out.println(s.trim()); // 앞뒤 공백 제거

        // 문자열 결합
        String s1 = &quot;Java&quot;;
        String s2 = &quot;Python&quot;;
        System.out.println(s1 + s2); // JavaPython
        System.out.println(s1 + &quot;,&quot; + s2); // Java,Python
        System.out.println(s1.concat(&quot;,&quot;).concat(s2)); // Java,Python
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/3e3a400c-dab2-4b84-a6e2-83f8866072be/image.png" alt=""></p>
<hr>
<h2 id="문자열-비교">문자열 비교</h2>
<blockquote>
<h3 id="boolean-equalsobject-anobject">boolean equals(Object anObject)</h3>
<p>-&gt; 두 문자열이 같은지 여부를 비교한 후 그 결과를 반환</p>
</blockquote>
<ul>
<li>포함되어 있으면 : true</li>
<li>포함되어 있지 않으면 : false<pre><code class="language-java">String s1 = &quot;ABC&quot;;
System.out.println(s1.equals(&quot;ABC&quot;));
System.out.println(s1.equals(&quot;abc&quot;));
System.out.println(s1.equals(&quot;XYZ&quot;));</code></pre>
<pre><code class="language-java">[실행결과]
true
false
false</code></pre>
</li>
</ul>
<blockquote>
<h3 id="boolean-equalsignorecasestring-anotherstring">boolean equalsIgnoreCase(String anotherString)</h3>
<p>-&gt; 대소문자의 구분없이 두 문자열이 같은지 여부를 비교한 후 그 결과를 반환</p>
</blockquote>
<ul>
<li>포함되어 있으면 : true</li>
<li>포함되어 있지 않으면 : false<pre><code class="language-java">String s1 = &quot;ABC&quot;;
System.out.println(s1.equalsIgnoreCase(&quot;ABC&quot;));
System.out.println(s1.equalsIgnoreCase(&quot;abc&quot;));
System.out.println(s1.equalsIgnoreCase(&quot;XYZ&quot;));</code></pre>
<pre><code class="language-java">[실행결과]
true
true
false</code></pre>
</li>
</ul>
<blockquote>
<h3 id="int-comparetostring-anotherstring">int compareTo(String anotherString)</h3>
<p>-&gt; 두 문자열을 사전 순으로 비교한 결과를 반환</p>
</blockquote>
<ul>
<li>두 문자열이 같을 경우 : 0</li>
<li>현재 문자열이 anotherString 문자열보다 먼저인 경우 : 음수(-)</li>
<li>현재 문자열이 anotherString 문자열보다 나중인 경우 : 양수(+)<pre><code class="language-java">String s1 = &quot;E&quot;;
System.out.println(s1.compareTo(&quot;A&quot;));
System.out.println(s1.compareTo(&quot;a&quot;));
System.out.println(s1.compareTo(&quot;E&quot;));
System.out.println(s1.compareTo(&quot;e&quot;));
System.out.println(s1.compareTo(&quot;Z&quot;));
System.out.println(s1.compareTo(&quot;z&quot;));</code></pre>
```java
[실행결과]
4</li>
<li>28
0</li>
<li>32</li>
<li>21</li>
<li>53<pre><code></code></pre></li>
</ul>
<hr>
<h2 id="연습문제-2">연습문제</h2>
<pre><code class="language-java">package chap_03;

public class _03_StringCompare {
    public static void main(String[] args) {
        // 문자열 비교
        String s1 = &quot;Java&quot;;
        String s2 = &quot;Python&quot;;

        System.out.println(s1.equals(&quot;Java&quot;)); // 문자열 내용이 같으면 true, 다르면 false

        // 대소문자 구분 없이 문자열 내용이 같은지 여부 체크
        System.out.println(s2.equalsIgnoreCase(&quot;python&quot;));

        // 문자열 비교 심화
        s1 = &quot;1234&quot;; // 벽에 붙은 메모지의 비밀번호 정보 (참조)
        s2 = &quot;1234&quot;;
        // s1과 s2는 같은 곳을 참조한다.
        System.out.println(s1.equals(s2)); // true (내용 비교)
        System.out.println(s1 == s2); // true (참조하는 곳 비교)

        s1 = new String(&quot;1234&quot;); //메모지에 저장
        s2 = new String(&quot;1234&quot;); //또 다른 메모지에 저장
        //이 두 메모지는 서로 다른 것이다.(서로 다른 곳에 데이터 저장)
        // 1234라는 메모지는 하나만 있고 메모지의 값을 s1과 s2라는 string 변수(문자열 변수)가 참조하는 것이다.
        System.out.println(s1.equals(s2)); // true -&gt; 내용이 같으니까
        System.out.println(s1 == s2); // false -&gt; 등호를 이용할 때는 서로 다른 메모리 공간에 각각 존재하는 데이터니까

    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/181e0433-1bc7-40be-bda0-fb7ea97303b9/image.png" alt=""></p>
<hr>
<h2 id="특수-문자escape-sequence">특수 문자(Escape Sequence)</h2>
<p>-&gt; 문자열을 사용할 때 어떤 약속이 되어 있는 특별한 기능을 하는 문자</p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/1e0abf7a-ff66-4a40-8097-62c0bd517843/image.png" alt=""></p>
<hr>
<h2 id="연습문제-3">연습문제</h2>
<pre><code class="language-java">package chap_03;

public class _04_EscapeSequence {
    public static void main(String[] args) {
        // 특수문자, 이스케이프 문자 (Escape Sequence, Escape Character, Special Character)
        // \n \t \\ \&quot; \&#39;
        System.out.println(&quot;자바가&quot;);
        System.out.println(&quot;너무&quot;);
        System.out.println(&quot;재밌어요&quot;);

        // \n : 줄바꿈
        System.out.println(&quot;자바가\n너무\n재밌어요&quot;);

        // \t : 탭
        // 해물파전     9000원
        // 김치전      8000원
        // 부추전      8000원
        System.out.println(&quot;해물파전\t\t9000원&quot;);
        System.out.println(&quot;김치전\t\t8000원&quot;);
        System.out.println(&quot;부추전\t\t8000원&quot;);

        // \\ : 역슬래시
        System.out.println(&quot;C:\\Program Files\\Java&quot;);

        // \&quot; : 큰따옴표
        // 단비가 &quot;냐옹&quot; 이라고 했어요
        System.out.println(&quot;단비가 \&quot;냐옹\&quot; 이라고 했어요&quot;);

        // \&#39; : 작은따옴표
        // 단비가 &#39;뭘 봐?&#39; 라는 표정을 지었어요
        System.out.println(&quot;단비가 \&#39;뭘 봐?\&#39; 라는 표정을 지었어요&quot;);
        System.out.println(&quot;단비가 &#39;뭘 봐?&#39; 라는 표정을 지었어요&quot;);

        char c = &#39;A&#39;;
        c = &#39;\&#39;&#39;;
        System.out.println(c);
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/096ac27c-8327-4f85-b56b-56e2af8d4132/image.png" alt=""></p>
<hr>
<h2 id="quiz">Quiz</h2>
<p>Q. 주민등록번호에서 생년월일 및 성별까지만 출력하는 프로그램을 작성</p>
<p>참고</p>
<ul>
<li>주민등록변호는 13자리의 숫자로 구성</li>
<li>앞 6자리는 생년월일 정보, 뒷 7자리 중 첫 번째 숫자는 성별 정보</li>
<li>입력 데이터는 -을 포함한 14자리의 문자열 형태</li>
</ul>
<p>예시</p>
<ul>
<li>&quot;901231-1234567&quot;인 경우 901231-1까지 출력</li>
<li>&quot;030708-4567890&quot;인 경우 030708-4까지 출력</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/3c8d7423-0570-41cd-af33-056199277f61/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/bcb79cff-14d7-4f27-b1a8-a8513572f89b/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 연산자]]></title>
            <link>https://velog.io/@swk_x/JAVA-%EC%97%B0%EC%82%B0%EC%9E%90</link>
            <guid>https://velog.io/@swk_x/JAVA-%EC%97%B0%EC%82%B0%EC%9E%90</guid>
            <pubDate>Thu, 23 Nov 2023 10:22:06 GMT</pubDate>
            <description><![CDATA[<h2 id="산술-연산자">산술 연산자</h2>
<ul>
<li>&quot;+&quot; : 더하기</li>
<li>&quot;-&quot; :  빼기</li>
<li>&quot;*&quot; : 곱하기</li>
<li>&quot;/&quot; : 나누었을 때의 몫 출력</li>
<li>&quot;%&quot; : 나누었을 때의 나머지 출력</li>
</ul>
<h2 id="증감-연산자">증감 연산자</h2>
<ul>
<li><p>val++ </p>
</li>
<li><blockquote>
<p>이 문장의 연산을 먼저 수행하고 나서 value에다가 1이 더해짐</p>
</blockquote>
</li>
<li><p>++val</p>
</li>
<li><blockquote>
<p>value에다가 1을 더하는 연산을 먼저 하고 나서 다른 문장이 수행</p>
</blockquote>
</li>
</ul>
<h2 id="연습문제">연습문제</h2>
<pre><code class="language-java">package chap_02;

public class _01_Operator1 {
    public static void main(String[] args) {
        // 산술 연산자

        // 일반 연산
        System.out.println(4 + 2); // 6
        System.out.println(4 - 2); // 2
        System.out.println(4 * 2); // 8
        System.out.println(4 / 2); // 2
        System.out.println(5 / 2); // 2
        System.out.println(2 / 4); // 0
        System.out.println(4 % 2); // 0
        System.out.println(5 % 2); // 1

        // 우선 순위 연산
        System.out.println(2 + 2 * 2); // 6
        System.out.println((2 + 2) * 2); // 8
        System.out.println(2 + (2 * 2)); // 6

        // 변수를 이용한 연산
        int a = 20;
        int b = 10;
        int c;

        c = a + b;
        System.out.println(c); // 30

        c = a - b;
        System.out.println(c); // 10

        c = a * b;
        System.out.println(c); // 200

        c = a / b; //나누었을 때의 몫 출력
        System.out.println(c); // 2

        c = a % b; //나누었을 때의 나머지 출력
        System.out.println(c); // 0

        // 증감 연산 ++, --
        int val;
        val = 10;
        System.out.println(val); // 10
        System.out.println(++val); // 11
        System.out.println(val); // 11

        val = 10;
        System.out.println(val); // 10
        System.out.println(val++); // 10 -&gt; 출력한다음 더해줌
        System.out.println(val); // 11

        val = 10;
        System.out.println(val); // 10
        System.out.println(--val); // 9
        System.out.println(val); // 9

        val = 10;
        System.out.println(val); // 10
        System.out.println(val--); // 10
        System.out.println(val); // 9

        // 은행 대기번호 표
        int waiting = 0;
        System.out.println(&quot;대기 인원 : &quot; + waiting++); // 대기 인원 : 0
        System.out.println(&quot;대기 인원 : &quot; + waiting++); // 대기 인원 : 1
        System.out.println(&quot;대기 인원 : &quot; + waiting++); // 대기 인원 : 2
        System.out.println(&quot;총 대기 인원 : &quot; + waiting); // 총 대기 인원 : 3
    }
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/32cb371c-40e9-420f-8b56-ee327f61ecbf/image.png" alt=""></p>
<hr>
<h2 id="대입-연산자">대입 연산자</h2>
<ul>
<li>num = num + 1;</li>
<li>num = num - 1;</li>
<li>num = num * 1;</li>
<li>num = num / 1;</li>
<li>num = num % 1;</li>
</ul>
<h2 id="복합-대입-연산자">복합 대입 연산자</h2>
<ul>
<li>num += 1;</li>
<li>num -= 1;</li>
<li>num *= 1;</li>
<li>num /= 1;</li>
<li>num %= 1;</li>
</ul>
<h2 id="연습문제-1">연습문제</h2>
<pre><code class="language-java">package chap_02;

public class _02_Operator2 {
    public static void main(String[] args) {
        // 대입 연산자
        int num = 10;
        num = num + 2;
        System.out.println(num); // 12

        num = num - 2;
        System.out.println(num); // 10

        num = num * 2;
        System.out.println(num); // 20

        num = num / 2;
        System.out.println(num); // 10

        num = num % 2;
        System.out.println(num); // 0

        // 복합 대입 연산자
        num = 10;
        // num = num + 2;
        num += 2;
        System.out.println(num); // 12

        // num = num - 2;
        num -= 2;
        System.out.println(num); // 10

        // num = num * 2;
        num *= 2;
        System.out.println(num); // 20

        // num = num / 2;
        num /= 2;
        System.out.println(num); // 10

        // num = num % 2;
        num %= 2;
        System.out.println(num); // 0
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/f96cc0d9-b971-4e43-95a9-c6ff3ab2098f/image.png" alt=""></p>
<hr>
<h2 id="비교-연산자">비교 연산자</h2>
<p><img src="https://velog.velcdn.com/images/swk_x/post/eb080931-87c6-4cba-a5c2-172de8c0f4f5/image.png" alt=""></p>
<h2 id="연습문제-2">연습문제</h2>
<pre><code class="language-java">package chap_02;

public class _03_Operator3 {
    public static void main(String[] args) {
        // 비교 연산자
        System.out.println(5 &gt; 3); // 5 는 3 보다 크다 (참이면 true, 거짓이면 false)
        System.out.println(5 &gt;= 3); // 5 는 3 보다 크거나 같다 (true)
        System.out.println(5 &gt;= 5); // 5 는 5 보다 크거나 같다 (true)
        System.out.println(5 &gt;= 7); // 5 는 7 보다 크거나 같다 (false)

        System.out.println(5 &lt; 3); // 5 는 3 보다 작다 (false)
        System.out.println(5 &lt;= 3); // 5 는 3 보다 작거나 같다 (false)

        System.out.println(5 == 5); // 5 는 5 와 같다 (true)
        System.out.println(5 == 3); // 5 는 3 과 같다 (false)
        System.out.println(5 != 5); // 5 는 5 와 같지 않다 (false)
        System.out.println(5 != 3); // 5 는 3 과 같지 않다 (true)
    }
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/64bc3d99-66e3-491b-aca2-cbb3e49a4bee/image.png" alt=""></p>
<hr>
<h2 id="논리-연산자">논리 연산자</h2>
<p><img src="https://velog.velcdn.com/images/swk_x/post/5f1db0a6-9938-43ef-a6a6-0053057a70f5/image.png" alt=""></p>
<h2 id="연습문제-3">연습문제</h2>
<pre><code class="language-java">package chap_02;

public class _04_Operator4 {
    public static void main(String[] args) {
        // 논리 연산자
        boolean 김치찌개 = true;
        boolean 계란말이 = true;
        boolean 제육볶음 = true;

        System.out.println(김치찌개 || 계란말이 || 제육볶음); // 하나라도 true 이면 true (괜찮은 식당)
        System.out.println(김치찌개 &amp;&amp; 계란말이 &amp;&amp; 제육볶음); // 모두 true 이면 true (최고의 식당)

        // And 연산
        System.out.println((5 &gt; 3) &amp;&amp; (3 &gt; 1)); // 5 는 3 보다 크고, 3 은 1 보다 크다 (true)
        System.out.println((5 &gt; 3) &amp;&amp; (3 &lt; 1)); // 5 는 3 보다 크고, 3 은 1 보다 작다 (false)

        // Or 연산
        System.out.println((5 &gt; 3) || (3 &gt; 1)); // 5 는 3 보다 크거나, 3 은 1 보다 크다 (true)
        System.out.println((5 &gt; 3) || (3 &lt; 1)); // 5 는 3 보다 크거나, 3 은 1 보다 작다 (true)
        System.out.println((5 &lt; 3) || (3 &lt; 1)); // 5 는 3 보다 작거나, 3 은 1 보다 작다 (false)

        // System.out.println(1 &lt; 3 &lt; 5); // 불가능한 코드

        // 논리 부정 연산자
        System.out.println(!true); // false
        System.out.println(!false); // true
        System.out.println(!(5 == 5)); // false
        System.out.println(!(5 == 3)); // true
    }
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/36ff8e5f-5ee2-497d-8eea-a0a4c0870a2a/image.png" alt=""></p>
<hr>
<h2 id="삼항-연산자">삼항 연산자</h2>
<p>-&gt; 조건 연산자라고도 볼 수 있다. 어떤 조건을 만족하면 이 값을 
넣고 그 조건을 만족하지 않으면 저 값을 넣는 식으로 처리된다. 
<img src="https://velog.velcdn.com/images/swk_x/post/0ba6ca23-67fe-4d8c-9c48-56ce3956d19a/image.png" alt=""></p>
<h2 id="연습문제-4">연습문제</h2>
<pre><code class="language-java">package chap_02;

public class _05_Operator5 {
    public static void main(String[] args) {
        // 삼항 연산자
        // 결과 = (조건) ? (참의 경우 결과값) : (거짓의 경우 결과값)
        int x = 3;
        int y = 5;
        int max = (x &gt; y) ? x : y;
        System.out.println(max); // 5

        int min = (x &lt; y) ? x : y;
        System.out.println(min); // 3

        boolean b = (x == y) ? true : false;
        System.out.println(b); // false

        String s = (x != y) ? &quot;달라요&quot; : &quot;같아요&quot;;
        System.out.println(s); // 달라요
    }
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/4e5c6511-d553-4c09-9e8d-78d6b0583c54/image.png" alt=""></p>
<hr>
<h2 id="quiz">Quiz</h2>
<p>Q. 어린이 키에 따른 놀이 기구 탑승 가능 여부를 확인하는 프로그램을 작성하시요</p>
<p>조건</p>
<ul>
<li>키가 120cm 이상인 경우에만 탑승 가능</li>
<li>삼항 연산자 이용</li>
</ul>
<p>실행결과
<img src="https://velog.velcdn.com/images/swk_x/post/a478aa29-1e37-4b74-aced-13f7b8079c7d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/857c4022-a8c0-468a-80e9-919969f160d3/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/18e01b2a-6a86-46ec-8d3e-8151df8079be/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 형 변환]]></title>
            <link>https://velog.io/@swk_x/JAVA-%ED%98%95-%EB%B3%80%ED%99%98</link>
            <guid>https://velog.io/@swk_x/JAVA-%ED%98%95-%EB%B3%80%ED%99%98</guid>
            <pubDate>Thu, 23 Nov 2023 09:16:35 GMT</pubDate>
            <description><![CDATA[<h2 id="형-변환">형 변환</h2>
<pre><code class="language-java">package chap_01;

public class _07_TypeCasting {
    public static void main(String[] args) {
        // 형변환 TypeCasting
        // 정수형에서 실수형으로
        // 실수형에서 정수형으로

        // int to float, double
        int score = 93;
        System.out.println(score); // 93
        System.out.println((float) score); // 93.0
        System.out.println((double) score); // 93.0

        // float, double to int
        float score_f = 93.3F;
        double score_d = 98.8;
        System.out.println((int) score_f); // 93
        System.out.println((int) score_d); // 98

        // 정수 + 실수 연산
        score = 93 + (int) 98.8; // 93 + 98
        System.out.println(score); // 191

        score_d = (double) 93 + 98.8; // 93.0 + 98.8
        System.out.println(score_d); // 191.8

        // 변수에 형변환된 데이터 집어넣기
        double convertedScoreDouble = score; // 191 -&gt; 191.0
        // int -&gt; long -&gt; float -&gt; double (자동 형변환)

        int convertedScoreInt = (int) score_d; // 191.8 -&gt; 191
        // double -&gt; float -&gt; long -&gt; int (수동 형변환)

        // 숫자를 문자열로
        String s1 = String.valueOf(93);
        s1 = Integer.toString(93);
        System.out.println(s1); // 93

        String s2 = String.valueOf(98.8);
        s2 = Double.toString(98.8);
        System.out.println(s2); // 98.8

        // 문자열을 숫자로
        int i = Integer.parseInt(&quot;93&quot;);
        System.out.println(i); // 93
        double d = Double.parseDouble(&quot;98.8&quot;);
        System.out.println(d); // 98.8

        int error = Integer.parseInt(&quot;자바&quot;);
    }
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/54078198-1660-4a0f-8c52-e7b6fed6cfab/image.png" alt=""></p>
<hr>
<h2 id="quiz">Quiz</h2>
<p>Q. 버스 도착 정보를 출력하는 프로그램 작성
각 정보는 적절한 자료형의 변수에 정의</p>
<p>정보</p>
<ul>
<li>버스 번호는 &quot;1234&quot;, &quot;상암08&quot;과 같은 형태</li>
<li>남은 시간은 분 단위(예: 3분, 5분)</li>
<li>남은 거리는 km 단위(예: 1.5km, 0.8km)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/b446a123-8fd7-4e5c-992d-b08033316bdd/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/swk_x/post/677a6e2c-ab9d-4a39-b916-c9d820eba127/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 변수]]></title>
            <link>https://velog.io/@swk_x/JAVA-%EB%B3%80%EC%88%98</link>
            <guid>https://velog.io/@swk_x/JAVA-%EB%B3%80%EC%88%98</guid>
            <pubDate>Thu, 23 Nov 2023 08:32:27 GMT</pubDate>
            <description><![CDATA[<h2 id="자료형">자료형</h2>
<blockquote>
<h3 id="int-자료형">int 자료형</h3>
<p>-&gt; -21억 ~ 21억 사이의 값일 때 사용</p>
</blockquote>
<blockquote>
<h3 id="long-자료형">long 자료형</h3>
<p>-&gt; -21억 ~ 21억보다 큰 범위의 값일 때 사용</p>
</blockquote>
<h2 id="실수형">실수형</h2>
<blockquote>
<h3 id="float">float</h3>
<p>-&gt; 상대적으로 그렇게까지 깊은 소수점이 필요 없을 때 사용</p>
</blockquote>
<blockquote>
<h3 id="double">double</h3>
<p>-&gt; 소수점 아주 많은 자릿수까지 정밀한 데이터를 요구할 때 사용</p>
</blockquote>
<h2 id="문자형">문자형</h2>
<blockquote>
<h3 id="character">character</h3>
<p>-&gt; 하나의 문자 표현</p>
</blockquote>
<blockquote>
<h3 id="string">string</h3>
<p>-&gt; 여러 문자 표현</p>
</blockquote>
<h2 id="boolean">Boolean</h2>
<blockquote>
<h3 id="true">True</h3>
<p>-&gt; 참</p>
</blockquote>
<blockquote>
<h3 id="false">False</h3>
<p>-&gt; 거짓</p>
</blockquote>
<h2 id="연습문제">연습문제</h2>
<pre><code class="language-java">package chap_01;

public class _03_Variables {
    public static void main(String[] args) {
        String name = &quot;이가영&quot;;
        int hour = 15;

        System.out.println(name + &quot;님, 배송이 시작됩니다. &quot; + hour + &quot;시에 방문 예정입니다.&quot;);
        System.out.println(name + &quot;님, 배송이 완료되었습니다.&quot;);

        double score = 90.5;
        char grade = &#39;A&#39;;
        name = &quot;강백호&quot;; //name은 변수니까 바꿀 수 있다.
        System.out.println(name + &quot;님의 평균 점수는 &quot; + score + &quot;점입니다.&quot;);
        System.out.println(&quot;학점은 &quot; + grade + &quot;입니다.&quot;);

        boolean pass = true;
        System.out.println(&quot;이번 시험에 합격했을까요? &quot; + pass);

        double d = 3.14123456789;
        float f = 3.14123456789F;
        System.out.println(d);
        System.out.println(f);

        long l = 1000000000000L; //long = int보다 더 큰 범위의 자료형을 가질 수 있다.
        l = 1_000_000_000_000L;
        System.out.println(l);
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/e63bf310-0f88-4bc4-b778-361676530296/image.png" alt=""></p>
<h2 id="변수">변수</h2>
<p>-&gt; 변하는 수. 데이터를 한번 집어넣었다가 또 필요하면 업데이트를 하고 얼마든지 바꿀 수 있다.</p>
<h2 id="변수-이름-짓는-법">변수 이름 짓는 법</h2>
<ol>
<li>저장할 값에 어울리는 이름</li>
<li>밑줄(_), 문자(abc), 숫자(123) 사용 가능 (공백 사용 불가)</li>
<li>밑줄 또는 문자로 시작 가능</li>
<li>한 단어 또는 2개 이상 단어의 연속</li>
<li>소문자로 시작, 각 단어의 시작 글자는 대문자 (첫 단어는 제외)</li>
<li>예약어 사용 불가 (public, static, void, int, double, float, ...)</li>
</ol>
<pre><code class="language-java">package chap_01;

public class _05_VariableNaming {
    public static void main(String[] args) {

        // 입국 신고서 (여행)
        String nationality = &quot;대한민국&quot;; // 국적
        String firstName = &quot;현성&quot;; // 이름
        String lastName = &quot;김&quot;; // 성
        String dateOfBirth = &quot;2001-12-31&quot;; // 생년월일
        String residentialAddress = &quot;무슨 호텔&quot;; // 체류지
        String purposeOfVisit = &quot;관광&quot;; // 입국목적
        String flightNo = &quot;KE657&quot;; // 항공 편명
        String _flightNo = &quot;KE657&quot;; // 밑줄 시작
        String flight_no_2 = &quot;KE657&quot;; // 밑줄과 숫자 포함
        // String -flightNo = &quot;KE657&quot;;

        int accompany = 2; // 동반 가족 수
        int lengthOfStay = 5; // 체류 기간

        String item1 = &quot;시계&quot;;
        String item2 = &quot;가방&quot;;
        // String 3item = &quot;전자제품&quot;;

        // 프로그램의 흐름을 위해 사용되는 경우 등 (크게 이름이 중요하지 않을 때)
        int i = 0;
        String s = &quot;&quot;;
        String str = &quot;&quot;;

        // 절대 변하지 않는 상수는 대문자로
        final String CODE = &quot;KR&quot;;
    }
}</code></pre>
<h2 id="상수">상수</h2>
<ul>
<li>한번 딱 정의하고 나면 절대 수정을 못 함</li>
<li>상수를 만들 때는 모두 대문자로 적어야 함 (두 개 이상의 단어가 포함된다면 밑줄로 구분을 한다.)</li>
</ul>
<pre><code class="language-java">package chap_01;

public class _06_Constants {
    public static void main(String[] args) {
        final String KR_COUNTRY_CODE = &quot;+82&quot;; // 국가 번호 (빨리)
        // final = 상수로 변화시킴
        // KR_COUNTRY_CODE = &quot;+8282&quot;; -&gt; 상수니까 문장 변경 못 함
        System.out.println(KR_COUNTRY_CODE);

        final double PI = 3.141592; // 원주율
        final String DATE_OF_BIRTH = &quot;2001-12-31&quot;; // 생년 월일
    }
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/cd209d23-935a-4d87-a01a-6272648a0ce4/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] Intellij 단축키]]></title>
            <link>https://velog.io/@swk_x/JAVA-Intellij-%EB%8B%A8%EC%B6%95%ED%82%A4</link>
            <guid>https://velog.io/@swk_x/JAVA-Intellij-%EB%8B%A8%EC%B6%95%ED%82%A4</guid>
            <pubDate>Thu, 23 Nov 2023 08:16:13 GMT</pubDate>
            <description><![CDATA[<h2 id="ctrl--d">Ctrl + D</h2>
<p>복사하고자 하는 문장을 클릭한 후 ctrl + D를 누르면 다음줄에 똑같은 문장이 복사가 된다.</p>
<h2 id="sout">sout</h2>
<p>sout을 치고 엔터키를 누르면 이 문장이 자동생성된다.</p>
<pre><code class="language-java">System.out.println();</code></pre>
<h2 id="psvm">psvm</h2>
<p>psvm을 치고 엔터키를 누르면 이 문장이 자동생성된다.</p>
<pre><code class="language-java">public static void main(String[] args) {

    }</code></pre>
<h2 id="ctrl--">Ctrl + /</h2>
<p>-&gt; 한 줄 주석 단축키 </p>
<h2 id="ctrl--shift--">Ctrl + Shift + /</h2>
<p>-&gt; 여러 줄 주석 단축키 </p>
<h2 id="연습문제">연습문제</h2>
<pre><code class="language-java">package chap_01;

public class _04_Comment {
    public static void main(String[] args) {
        System.out.println(&quot;(10분 전) 잠시 후 결혼식 시작 예정이오니 착석 부탁드립니다.&quot;);
        //System.out.println(&quot;(5분 전) 잠시 후 결혼식 시작 예정이오니 착석 부탁드립니다.&quot;);
        System.out.println(&quot;지금부터 결혼식을 시작하겠습니다.&quot;);

        int size = 120;
        size = size + 10; // 어린이는 발이 빨리 자라기 때문에 사이즈 10만큼 더 큰 신발을 구매
        System.out.println(&quot;신발 사이즈 &quot; + size + &quot;으로 보여주세요&quot;);

        // 한 줄 주석 단축키 : Ctrl + /
        // 여러 줄 주석 단축키 : Ctrl + Shift + /
        int a = 10;
        int b = 20;
        System.out.println(a + b);
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/swk_x/post/8df804a8-ff4f-470d-b98c-b714c08f972e/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C언어] 응용포인터]]></title>
            <link>https://velog.io/@swk_x/C%EC%96%B8%EC%96%B4-%EC%9D%91%EC%9A%A9%ED%8F%AC%EC%9D%B8%ED%84%B0</link>
            <guid>https://velog.io/@swk_x/C%EC%96%B8%EC%96%B4-%EC%9D%91%EC%9A%A9%ED%8F%AC%EC%9D%B8%ED%84%B0</guid>
            <pubDate>Sun, 22 Oct 2023 15:53:28 GMT</pubDate>
            <description><![CDATA[<h2 id="포인터의-핵심-정리">포인터의 핵심 정리</h2>
<ul>
<li>포인터는 다음의 두 가지만 이해하면 응용이 가능하다</li>
</ul>
<ol>
<li>포인터가 가리키는 자료형은 무엇인가? -&gt; &quot;실체가 무엇인가?&quot;<pre><code class="language-c">int val;
&amp;val -&gt; int형 변수
포인터의 &amp;val은 int형을 가리킨다.</code></pre>
<pre><code class="language-c">double val
&amp;val -&gt; double형 변수
포인터 &amp;val은 double형을 기리킨다.</code></pre>
</li>
<li>포인터는 같은 자료형을 가리키는 포인터변수에 저장해야 한다.<pre><code class="language-c">int * ip;
가리키는 자료형  ip=포인터 변수
</code></pre>
</li>
</ol>
<p>ip=&val; //포인터를 포인터변수에 대입
-&gt; 가리키는 자료형은 모두 int형으로 같다.</p>
<pre><code>
## 다중 포인터
- 포인터변수도 하나의 기억공간이므로 포인터(물리적 주소)를 구할 수 있다.
포인터변수의 포인터 -&gt; **이중포인터**
```c
int *ip;
&amp;ip       -&gt;  (int *)형 변수  //포인터 &amp;ip는 (int*)형을 가리킨다
이중포인터        포인터변수</code></pre><ul>
<li>이중포인터로 변수를 참조할 때는 참조연산자를 두 변 사용해야 한다. 
<img src="https://velog.velcdn.com/images/swk_x/post/aa1a89d7-3792-4d0f-bfe6-20f790f9e55f/image.png" alt=""></li>
</ul>
<h2 id="이중포인터변수">이중포인터변수</h2>
<ul>
<li>이중포인터 또한 하나의 포인터이므로 포인터변수에 저장하여 사용한다.<pre><code class="language-c">int *ip;
int **ipp; //integer포인터에 주소값을 저장시킬 애가 ipp이다.
가리키는 자료형 / ipp는 포인터변수다. / 변수의 이름
</code></pre>
</li>
</ul>
<p>ipp = &ip; //이중포인터를 이중표인터변수에 대입
-&gt; 가리키는 자료형은 모두 (int *)형으로 같다</p>
<pre><code>- 이중포인터변수도 참조연산자를 두 번 사용하여 변수를 참조한다.
```c
int val = 10;
int *ip;  //포인터변수
int **ipp;  //이중포인터변수
int = &amp;val;  //주소값 저장
ipp = &amp;ip;
printf(&quot;%d\n&quot;, **ipp);</code></pre><p><img src="https://velog.velcdn.com/images/swk_x/post/9d4133c8-f5a3-4a76-b393-a6473be92c7e/image.png" alt=""></p>
<pre><code class="language-c">*(*ipp) =&gt; *(100) =&gt; 10</code></pre>
<blockquote>
<h3 id="이중포인터변수의-사용-예">이중포인터변수의 사용 예</h3>
</blockquote>
<ul>
<li>두 포인터변수의 값을 바꾸는 함수를 만들어보자
```c
char *ap = &quot;success&quot;;
char *bp = &quot;failure&quot;;</li>
<li><blockquote>
<p>변경하지 못하는 임시데이터메모리에 success, failure 생기고, 여기에 있는 주소값이 success에 치환돼서 컴파일된다.</p>
</blockquote>
<pre><code>![](https://velog.velcdn.com/images/swk_x/post/7945b00c-389f-4db5-b4be-2e83af7706d6/image.png)
```c
함수의 호출 -&gt; exchange ptr(&amp;ap, &amp;bp); //이중포인터를 전달인자로 준다
//exchange함수에 ap와 bp의 주소값을 줌 -&gt; 이 값을 exchange_ptr이라는 애가 값을 바꾸므로
함수의 선언 -&gt; void exchange_ptr(char **app, char **bpp);
//이중포인터가 전달인자로 넘어오므로 매개변수로 이중포인터 변수를 선언
함수가 호출된 후 -&gt; </code></pre><img src="https://velog.velcdn.com/images/swk_x/post/e2535c4e-deb2-45f4-b026-87037db24441/image.png" alt=""></li>
<li>함수 안에서는 임시 포인터변수를 선언하여 ap, bp의 값을 바꾼다.<pre><code>char *tp;  //임시 포인터변수의 선언</code></pre><img src="https://velog.velcdn.com/images/swk_x/post/e42aec00-4947-45b2-a367-b27b2fbe8466/image.png" alt=""></li>
</ul>
<h2 id="함수를-사용하여-포인터변수의-값을-바꾸는-프로그램">함수를 사용하여 포인터변수의 값을 바꾸는 프로그램</h2>
<pre><code class="language-c">#include &lt;stdio.h&gt;

void exchange_ptr(char **, char **);  //함수의 선언
int main()
{
    char *ap = &quot;success&quot;;
    char *bp = &quot;failure&quot;;
    printf(&quot;*ap -&gt; %s, bp -&gt; %s\n&quot;, ap, bp);  //바꾸기 전의 문자열 출력
    exchange_ptr(&amp;ap, &amp;bp);  //함수의 호출
    printf(&quot;ap -&gt; %s, bp -&gt; %s\n&quot;, ap, bp);  //바꾼 후에 문자열 출력
    return 0;
}

void exchange_ptr(char **app, char **bpp) //함수의 정의
{
    char *tp;  //임시 포인터변수
    tp=*app;
    *app=*bpp;  //메인함수에 있는
    *bpp=*tp;   //ap, bp의 값을 바꾼다.
}</code></pre>
<pre><code class="language-c">출력결과
ap -&gt; success, bp -&gt; failure
ap -&gt; failure, bp -&gt; success</code></pre>
<blockquote>
<h3 id="연습문제">연습문제</h3>
</blockquote>
<ul>
<li>포인터 배열에 저장된 문자열을 출력하는 프로그램
<img src="https://velog.velcdn.com/images/swk_x/post/f99fdf54-4548-45e1-a76d-095af3b59010/image.png" alt=""></li>
<li><em>char *</em>spp** -&gt; 이 매개변수를 어떻게 만들지를 이해해야 함!!
<img src="https://velog.velcdn.com/images/swk_x/post/bd475ed6-6c10-44c3-99cf-e1194d684817/image.png" alt=""></li>
</ul>
<h1 id="배열-포인터">배열 포인터</h1>
<h2 id="배열명의-정체">배열명의 정체</h2>
<ul>
<li>배열명은 첫 번째 배열요소를 가리키는 포인터의 기능을 한다.<pre><code class="language-c">int nums[5] = {10, 20, 30, 40, 50};
int *ip=nums;  //배열명은 포인터이므로 포인터변수에 저장
printf(&quot;%d\n&quot;, *nums);  //첫 번째 기억공간을 참조하여 10이 출력
printf(&quot;%d\n&quot;, *(nums+4));  //nums의 값이 100이면 116번지를 참조</code></pre>
<pre><code class="language-c">nums      10  20  30  40  50
 ㄴ------| 배열명은 첫번째 배열요수를 가리키는 포인터</code></pre>
</li>
<li>배열의 기억공간 전체를 나타내는 논리적 변수의 기능을 한다.</li>
<li><blockquote>
<p>논리적 변수(상수)이므로 -&gt; 직접 데이터를 저장할 수는 없으나
  응용 자료형으로서 -&gt; 변수가 가지는 형태와 그기에 대한 정보를 가진다.
  <img src="https://velog.velcdn.com/images/swk_x/post/2aade979-1c8f-4b74-8e14-097d73addb17/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<h2 id="배열포인터가-가리키는-것은">배열포인터가 가리키는 것은?</h2>
<ul>
<li>배열포인터는 배열명에 주소연산을 수행하면 구해진다.</li>
<li><blockquote>
<p>이 때 배열명은 논리적변수의 기능이며 그 배열 전체를 가리키는 포인터가 구해진다.</p>
</blockquote>
<pre><code class="language-c">int ary[5];
&amp;ary    --&gt;    int  int  int  int  int
배열포인터        배열의 전체를 가리킨다</code></pre>
</li>
<li><blockquote>
<p>배열포인터에 정수값을 더하면 배열 전체의 크기를 곱해서 더해주게 된다.
<img src="https://velog.velcdn.com/images/swk_x/post/22adf047-0651-4b14-ba00-71011c61bc5b/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<h2 id="2차원-배열의-배열명은-배열포인터이다">2차원 배열의 배열명은 배열포인터이다</h2>
<p><img src="https://velog.velcdn.com/images/swk_x/post/ab949911-e877-4876-b462-fd1cae2a41a4/image.png" alt=""></p>
<h2 id="2차원-배열에서-배열명으로-기억을-참조하는-공간">2차원 배열에서 배열명으로 기억을 참조하는 공간</h2>
<ul>
<li>1차원의 물리적 기억공간을 행렬의 2차원 구조로 참조할 수 있는 것은 2차원 배열의 배열명과 부분배열명이 각각 배열포인터와 포인터로서 적절한 기능을 수행하기 때문이다.
<img src="https://velog.velcdn.com/images/swk_x/post/ed7e7085-a105-4c6d-833d-255bb8e40932/image.png" alt=""></li>
</ul>
<h2 id="2차-배열포인터변수">2차 배열포인터변수</h2>
<ul>
<li>2차 배열포인터를 저장 -&gt; 배열포인터변수
<img src="https://velog.velcdn.com/images/swk_x/post/1332152c-e0cc-400c-b206-83df3d459ddc/image.png" alt=""><pre><code class="language-c">ap에는 int[4] type의 배열 포인터가 저장된다.</code></pre>
</li>
<li><blockquote>
<p>배열포인터변수가 2차원 배열의 배열명을 저장하면 2차원 배열처럼 사용된다.</p>
</blockquote>
<pre><code class="language-c">int any[3][4]={{1,2,3,4}, {5,6,7,8},{9,10,11,12}};
int (*ap)[4]; ★ 
int i, j;
ap=ary;  //배열명을 배열포인터변수에 저장
for(i=0; i&lt;3; i++)
{
   for(j=0; j&lt;4; j++)
   {
       printf(&quot;%5d&quot;, ap[i][j]); //ap를 배열명처럼 사용
   }
   printf(&quot;\n&quot;);
}</code></pre>
<pre><code>출력결과
1   2   3   4  
5   6   7   8
9   10  11  12</code></pre></li>
</ul>
<h2 id="배열-포인터-1">배열 포인터</h2>
<ul>
<li>해석 방법 : 단항 -&gt; 후치 -&gt; 근치
<img src="https://velog.velcdn.com/images/swk_x/post/d32fcee6-fef2-4466-8ffc-c74d913ce294/image.png" alt=""><pre><code class="language-c">int ap[][4]
4   1 2  3</code></pre>
<img src="https://velog.velcdn.com/images/swk_x/post/fcb2f817-3a00-4f53-89db-d106e0bdd191/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="연습문제-1">연습문제</h3>
</blockquote>
<ul>
<li>5개의 문자열을 2차원 배열에 입력 받아 출력하는 프로그램
단, </li>
</ul>
<ol>
<li>2차원 문자배열은 메인함수에서 선언</li>
<li>입출력 작업은 각각 함수를 호출해서 수행</li>
<li>문자열의 길이는 최대 80자로 제한
<img src="https://velog.velcdn.com/images/swk_x/post/8e21c468-8970-44c2-b8c8-c543a6852dc4/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/5bb3baca-eceb-4f6f-b553-9c08fd9822cd/image.png" alt=""></li>
</ol>
<h1 id="함수-포인터">함수 포인터</h1>
<ul>
<li>함수포인터는 함수의 이름이다.</li>
<li><blockquote>
<p>함수명은 함수의 정의가 있는 메모리의 위치값이며 함수를 가리킨다.
<img src="https://velog.velcdn.com/images/swk_x/post/84ab75d0-83ef-42d5-b435-e3ad2cb806d0/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<p>-&gt; 함수명이 포인터라는 증거는 참조연산자를 사용하면 알 수 있다.</p>
<pre><code class="language-c">(*sum)(10, 20); //10과 20을 전달인자로 주고 sum함수를 호출한다.
(함수를 참조한 후에 호출해야 하므로 참조연산에 괄호를 사용한다.)</code></pre>
<h2 id="함수포인터변수">함수포인터변수</h2>
<ul>
<li>함수 포인터가 가리키는 자료형은 함수의 형태이다.</li>
<li><blockquote>
<p>함수의 형태를 매개변수의 개수와 형태, 리턴값의 형태이다.
<img src="https://velog.velcdn.com/images/swk_x/post/3141a8f0-33ac-43b2-9dae-8865e08d7321/image.png" alt=""></p>
</blockquote>
</li>
<li>함수포인터를 함수포인터변수에 저장하여 호출할 수 있다.
<img src="https://velog.velcdn.com/images/swk_x/post/a546a9b8-e2e7-4e60-bd52-207aa8f4dc98/image.png" alt=""><pre><code class="language-c">fp(10, 20); //= sum(10, 20);</code></pre>
</li>
</ul>
<blockquote>
<h3 id="함수포인터변수로-sum함수를-호출하는-프로그램">함수포인터변수로 sum함수를 호출하는 프로그램</h3>
<p><img src="https://velog.velcdn.com/images/swk_x/post/b465b648-56b1-4308-a848-e5f6b70f2b0f/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/bf71ef0e-0549-4426-8b3b-54a30b0e9f13/image.png" alt=""></p>
</blockquote>
<h2 id="함수포인터는-어디에-사용">함수포인터는 어디에 사용?</h2>
<ul>
<li><p>함수포인터변수는 함수의 형태만 같으면 기능과 상관없이 모든 함수포인터를 저장할 수 있다.
```c
int sum(int, int); //두 정수값을 더해서 리턴하는 함수
int mul(int, int); //두 정수값을 곱해서 리턴하는 함수
int max(int, int); //두 정수값 중에서 큰 값을 리턴하는 함수</p>
</li>
<li><blockquote>
<p>세 개 모두 형태가 같다</p>
</blockquote>
<pre><code>```c
int (*fp)(int, int); -&gt; fp = sum; 
                       fp = mul;  // 모두 사용 가능
                       fp = max;  </code></pre></li>
<li><p>형태가 같은 다양한 기능의 함수를 선택적으로 호출하는데 사용할 수 있다.</p>
</li>
<li><p>다음과 같은 기능을 수행하는 함수를 만들자
<img src="https://velog.velcdn.com/images/swk_x/post/aabe3da0-6d8a-420a-9c49-b4e6e69eadf9/image.png" alt=""></p>
</li>
<li><blockquote>
<p>func함수에서 2번 연산과정은 함수를 호출할 때 필요한 연산이 수행되도록 만들자
<img src="https://velog.velcdn.com/images/swk_x/post/30c2d5a1-f551-45c0-a8bb-100ad08b4257/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<h2 id="func함수를-사용한-프로그램">func함수를 사용한 프로그램</h2>
<p><img src="https://velog.velcdn.com/images/swk_x/post/e1010700-0326-4a06-a63b-8b57eb7749ac/image.png" alt=""></p>
<blockquote>
<h3 id="연습문제-2">연습문제</h3>
</blockquote>
<ul>
<li>exchange함수와 func함수를 만들어 프로그램을 완성</li>
<li><blockquote>
<p>func함수는 전달인자로 받은 두 값을 출력한 후에 exchange함수를 사용하여 두 값을 바꾸고 다시 출력</p>
</blockquote>
</li>
<li><blockquote>
<p>exchange함수는 포인터를 전달인자로 받아서 그들이 가리키는 두 값을 바꾼다.
<img src="https://velog.velcdn.com/images/swk_x/post/dc31fce0-1e96-4227-8fcf-e9d6496dd9ff/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/f6daa4db-4059-4a2e-9cdf-7e35a9f48bd9/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<h1 id="void-포인터">void 포인터</h1>
<ul>
<li>가리키는 자료형에 대한 정보가 없는 포인터이다.<pre><code class="language-c">int a; //int형 변수 선언
(void*) &amp;a; //int형 변수의 포인터를 void 포인터로 강제 형변환</code></pre>
</li>
<li>void포인터변수는 가리키는 자료형이 정해져 있지 않으므로 모든 포인터를 저장할 수 있다.<pre><code class="language-c">void * vp;
가리키는 자료형이 정해져 있지 않다/vp=포인터변수/변수의 이름</code></pre>
<pre><code class="language-c">int in;  //int형 변수
double db; //double형 변수
void *vp; //void포인터 변수
vp=&amp;in; //int형 변수의 포인터를 저장할 수 있고
vp=&amp;db; //double형 변수의 포인터도 저장할 수 있다.</code></pre>
<img src="https://velog.velcdn.com/images/swk_x/post/0bc195e0-3b9e-4697-bf6b-e4b8e0cf4efd/image.png" alt="">
#include &lt;string.h&gt;도 있어야 함
type은 자료형 구분을 위한 매개변수
<img src="https://velog.velcdn.com/images/swk_x/post/cdd5b4b9-28bf-42b6-bab2-6c636a706b4e/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C언어] 2차원 배열과 배열포인터]]></title>
            <link>https://velog.io/@swk_x/C%EC%96%B8%EC%96%B4-2%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4%EA%B3%BC-%EB%B0%B0%EC%97%B4%ED%8F%AC%EC%9D%B8%ED%84%B0</link>
            <guid>https://velog.io/@swk_x/C%EC%96%B8%EC%96%B4-2%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4%EA%B3%BC-%EB%B0%B0%EC%97%B4%ED%8F%AC%EC%9D%B8%ED%84%B0</guid>
            <pubDate>Fri, 22 Sep 2023 16:16:07 GMT</pubDate>
            <description><![CDATA[<h2 id="2차원-배열의-선언과-초기화">2차원 배열의 선언과 초기화</h2>
<ul>
<li>2차원 배열은 1차원 배열을 배열요소로 갖는 새로운 배열이다.</li>
<li><blockquote>
<p>3명의 학생에 대한 4과목의 학생 점수를 처리하는 예
<img src="https://velog.velcdn.com/images/swk_x/post/5abfa1c3-823b-4f5b-b5ca-c26f401cd0c9/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<blockquote>
<h3 id="2차원-배열의-선언과-구조">2차원 배열의 선언과 구조</h3>
</blockquote>
<ul>
<li>2차원 배열은 1차원 배열처럼 배열명과 첨자를 사용하여 선언</li>
<li><blockquote>
<p>각 배열요소의 형태는 int형 변수 4개짜리 1차원 배열이다.</p>
</blockquote>
</li>
<li><blockquote>
<p>전체 배열은 12개의 int형 기억공간이 1차원 배열의 형태로 할당된다.</p>
</blockquote>
</li>
<li>2차원 배열은 논리적으로 행렬로 표현된다.</li>
<li><blockquote>
<p>배열요소는 1차원 배열이므로 부분배열이라고 한다.</p>
</blockquote>
<pre><code class="language-c">int score1[4];
int score2[4];  =&gt; int score[3][4];
int score3[4];         배열명 배열요소의 개수
// int [4] -&gt; 배열요소의 형태
// int형 변수 4개짜리 1차원 배열이 2차원 배열의 배열요소가 된다.</code></pre>
<img src="https://velog.velcdn.com/images/swk_x/post/1ce5e4bc-8679-483e-94ae-a130b64dac11/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="배열요소의-참조">배열요소의 참조</h3>
</blockquote>
<ul>
<li>2차원 배열은 부분배열의 배열요소를 다시 참조해야 한다.
<img src="https://velog.velcdn.com/images/swk_x/post/5d357ec7-909a-4875-8190-76634445a878/image.png" alt=""></li>
<li><blockquote>
<p>첫 번째 부분배열에 4과목의 점수를 입력하는 예</p>
</blockquote>
<pre><code class="language-c">int score[3][4];   //2차원 배열 선언
int j;             //반복 제어변수
printf(&quot;네 과목의 점수를 입력 : &quot;);
for(j=0; j&lt;4; j++)  //i는 0부터 3까지 4번 반복
{
   scanf(&quot;%d&quot;, &amp;score[0][j]);
}  //첫 번째 부분배열의 배열요소에 각각 점수 입력
  //결국 한 학생의 모든 점수를 입력 받는다.</code></pre>
</li>
</ul>
<blockquote>
<h3 id="2중-for문으로-모든-배열요소를-처리한다">2중 for문으로 모든 배열요소를 처리한다.</h3>
</blockquote>
<ul>
<li>나머지 두 명의 점수를 입력 받기 위해 점수를 입력 받는 과정을 반복
<img src="https://velog.velcdn.com/images/swk_x/post/ee2af2a7-6547-4732-808a-323a5aa66c54/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="2차원-배열을-사용하여-학생들의-점수를-처리하는-프로그램">2차원 배열을 사용하여 학생들의 점수를 처리하는 프로그램</h3>
<p><img src="https://velog.velcdn.com/images/swk_x/post/18a10865-dd45-4afb-9efb-719e839de494/image.png" alt=""></p>
</blockquote>
<blockquote>
<h3 id="2차원-배열의-sizeof">2차원 배열의 sizeof</h3>
</blockquote>
<pre><code class="language-c">#include &lt;stdio.h&gt;
int main()
{
    int score[3][6];
    printf(&quot;%d\n&quot;, sizeof(score));  //72=3*6*4(int) 배열 전체의 크기
    //배열요소 3개, 각각의 배열요소는 6개의 배열로 이루어진 부분배열, 부분배열의 각각의 요소는 int
    printf(&quot;%d\n&quot;, sizeof(score[0])); //24=6*4
    // 부분배열이니까 int 6개
    printf(&quot;%d\n&quot;, sizeof(score[0][0])); //4 부분배열요소
    return 0;
|</code></pre>
<blockquote>
<h3 id="2차원-배열의-초기화">2차원 배열의 초기화</h3>
</blockquote>
<ul>
<li>기본적으로 1차원 배열을 초기화하는 방식과 같다.</li>
<li><blockquote>
<p>초기화 값은 행 단위로 차례로 저장된다.</p>
</blockquote>
```c
int nums[3][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};<pre><code>          nums[0]    |  nums[1]   |     nums[2]</code></pre></li>
<li><blockquote>
</blockquote>
1  2  3  4 
5  6  7  8  =&gt; 첫번째 행이 먼저 초기화된 후에 두 번째, 세 번째 행이 차례로 초기화됨
9 10 11 12
```</li>
<li>기억공간의 수보다 초기화 값이 적으면 남는 기억공간은 0으로 초기화
```c
int nums[3][4]={1, 2, 3, 4, 5, 6};
만약 전체를 0으로 초기화 하고 싶다면 ={0}; 하면 된다.</li>
<li><blockquote>
</blockquote>
1  2  3  4
5  6  0  0
0  0  0  0
```</li>
<li>초기화 값을 논리적 구조에 맞게 행으로 구분하고자 하면 중괄호를 한번 더 사용<pre><code class="language-c">int nums[3][4]={{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
              // 첫번째행      두번째 행        세번쨰 행</code></pre>
</li>
<li>행 초기화 괄호를 사용하면 행 단위로 초기값을 생략할 수 있다. -&gt; 부족분은 0으로 초기화
```c
int nums[3][4]={{1}, {5, 6}, {9, 10, 11}};</li>
<li><blockquote>
</blockquote>
1  0  0  0
5  6  0  0
9 10 11  0
```</li>
<li>1차원 배열과 마찬가지로 배열의 첨자를 생략할 수 있다.<blockquote>
<blockquote>
<p>행 초기화 괄호를 사용한 경우
```c
int nums[][4]={{1}, {2, 3}, {4, 5, 6}}; //행의 수 3개</p>
<pre><code>  행 열(열 첨자는 생략 불가능)</code></pre></blockquote>
</blockquote>
</li>
<li><blockquote>
</blockquote>
1  0  0  0 
2  3  0  0   //3행 4열의 기억공간 할당
4  5  6  0<blockquote>
<blockquote>
<p><code>행 초기화 괄호를 사용하지 않은 경우</code>c
int nums[][4] = {1, 2, 3, 4, 5, 6};</p>
<pre><code>     //첫번째 행 초기값 / 두 번째 초기값</code></pre></blockquote>
</blockquote>
</li>
<li><blockquote>
</blockquote>
1  2  3  4<br>5  6  0  0  //2행 4열의 기억공간 할당<pre><code></code></pre></li>
</ul>
<hr>
<h2 id="2차원-문자배열">2차원 문자배열</h2>
<ul>
<li>여러 개의 문자열을 저장하기 위해서는 2차원 문자배열이 필요</li>
<li><blockquote>
<p>5개의 문자열을 저장할 2차원 문자배열</p>
</blockquote>
<pre><code class="language-c">char animals[5][20];</code></pre>
</li>
<li><blockquote>
<p>마지막 부분배열에 문자열을 입력할 때(부분배열명을 전달인자로 준다)</p>
</blockquote>
<pre><code class="language-c">scanf(&quot;%s&quot;, animal[4]); //gets함수를 사용하면 gets(animal[4])
          // 전체가 배열명임
 ★부분배열명 = 포인터★</code></pre>
</li>
<li><blockquote>
<p>반복문을 사용하여 모든 부분배열에 문자열을 입력</p>
</blockquote>
<pre><code class="language-c">for(i=0; i&lt;5; i++)
{
   printf(&quot;문자열을 입력 : &quot;);
   scanf(&quot;%s&quot;, animal[i]); //i의 값이 변하면서 각 부분배열명이 된다.
}</code></pre>
</li>
</ul>
<blockquote>
<h3 id="2차원-문자배열의-초기화">2차원 문자배열의 초기화</h3>
</blockquote>
<ul>
<li>기본적으로 각 기억공간들을 문자상수로 초기화할 수 있다.<pre><code class="language-c">char animal[5][10]={{&#39;c&#39;, &#39;a&#39;, &#39;t&#39;, &#39;\0&#39;}, {&#39;t&#39;, &#39;i&#39;, &#39;g&#39;, &#39;e&#39;, &#39;r&#39;, &#39;\0&#39;}};</code></pre>
</li>
<li>각 행은 문자열상수로 직접 초기화할 수 있다.
```c
char str[10]=&quot;cat&quot;; //하나의 문자열 상수는 1차원 문자배열을 초기화할 수 있다.
char animal[5][10]={&quot;cat&quot;, &quot;tiger&quot;, &quot;dog&quot;, &quot;lion&quot;, &quot;turtle&quot;};<pre><code>      ㄴ5개의 문자열 상수는 5개의 부분배열을 초기화한다.</code></pre></li>
<li><blockquote>
</blockquote>
cat \0 \0 \0 \0 \0 \0 \0
tiger \0 \0 \0 \0 \0
dog \0 \0 \0 \0 \0 \0 \0 -&gt; 남은 기억공간들은 널문자로 채워진다.
lion \0 \0 \0 \0 \0 \0
turtle \0 \0 \0 \0<pre><code></code></pre></li>
</ul>
<blockquote>
<h3 id="2차원-문자배열을-초기화하고-출력하는-프로그램">2차원 문자배열을 초기화하고 출력하는 프로그램</h3>
<p><img src="https://velog.velcdn.com/images/swk_x/post/0cb61b52-18b5-4d2f-afc7-d1542d33e3a1/image.png" alt=""></p>
</blockquote>
<pre><code class="language-c">문자열 개수 계산 -&gt;sizeof(animal) / sizeof(animal[0]);
                전체 배열의 크기    부분배열 하나의 크기</code></pre>
<hr>
<h2 id="포인터-배열">포인터 배열</h2>
<ul>
<li>포인터배열 = 포인터변수들을 배열요소로 갖는 배열</li>
<li><blockquote>
<p>배열에 저장되는 데이터가 특정 타입의 포인터</p>
</blockquote>
<pre><code>특정 타입 : 배열은 동일 형태의 데이터를 저장하기 때문</code></pre>```c
char *ptr_ary[5];</li>
<li><blockquote>
</blockquote>
char *ptr : 배열요소의 자료형
ptr_ary : 배열명
[5] : 배열요소의 개수
```</li>
<li><blockquote>
<p>세 번째 배열요소에 문자열상수를 대입하고 출력할 때</p>
</blockquote>
<pre><code class="language-c">ptr_ary[2]=&quot;tiger&quot;;  //문자열상수는 포인터이므로 포인터만을 저장하는 것이다.
printf(&quot;%s&quot;, ptr_ary[2]);</code></pre>
</li>
</ul>
<blockquote>
<h3 id=""></h3>
</blockquote>
<pre><code class="language-c">#include &lt;stdio.h&gt;
int main()
{
    char *ptr_ary[5];
    int i;
    ptr_ary[0]=&quot;dog&quot;;
    ptr_ary[1]=&quot;elephant&quot;;
    ptr_ary[2]=&quot;horse&quot;;
    ptr_ary[3]=&quot;tiger&quot;;
    ptr_ary[4]=&quot;lion&quot;;
    for(i=0; i&lt;5; i++)
    {
        printf(&quot;%s\n&quot;, ptr_ary[i]);
        //배열요소를 하나씩 참조하여 모든 문자열을 출력
    }
    return 0;
}</code></pre>
<blockquote>
<h3 id="포인터배열의-초기화">포인터배열의 초기화</h3>
</blockquote>
<ul>
<li>문자열상수는 포인터이므로 포인터배열에 초기값으로 사용
```c
char *ptr_ary[5]={&quot;dog&quot;, &quot;elephant&quot;, &quot;horse&quot;, &quot;tiger&quot;, &quot;lion&quot;};</li>
<li><blockquote>
<p>&quot;dog&quot;은 임시영역에 저장</p>
</blockquote>
</li>
<li><blockquote>
<p>&quot;dog&quot;가 저장된 임시 영역의 주소값이 ptr_ary[0]에 저장
```</p>
</blockquote>
</li>
<li>문자배열 초기화와 포인터배열 초기화의 차이점
```c
char animal[5][10]={&quot;dog&quot;, &quot;elephant&quot;, &quot;horse&quot;, &quot;tiger&quot;, &quot;lion&quot;};
char *ptr_ary[5]={&quot;dog&quot;, &quot;elephant&quot;, &quot;horse&quot;, &quot;tiger&quot;, &quot;lion&quot;};</li>
<li><blockquote>
</blockquote>
char animal[5][10]
char *ptr_ary[5]  //배열의 형태에 따라 문자열을 복사하거나 포인터를 저장
```</li>
<li><blockquote>
<p>2차원 문자배열에 초기화하는 것은 <strong>모든 문자열이 배열에 복사되는 것</strong>이고</p>
</blockquote>
</li>
<li><blockquote>
<p>포인터배열에 초기화하는 것은 <strong>포인터만 초기화되는 것</strong>이다. 
★위 2개의 차이를 이해해야 함★</p>
</blockquote>
</li>
</ul>
<blockquote>
<h3 id="포인터배열은-2차원-배열처럼-활용된다">포인터배열은 2차원 배열처럼 활용된다</h3>
</blockquote>
<ul>
<li>1차원 배열의 배열명을 포인터배열에 저장하면 포인터배열을 2차원 배열처럼 사용할 수 있다.<pre><code class="language-c">int ary1[4]={1,2,3,4};
int ary2[4]={11,12,13,14};
int ary3[4]={21,22,23,24};
int *ptr_ary[3]={ary1, ary2, ary3};
//각 배열명을 포인터배열에 초기화한다.</code></pre>
</li>
<li><blockquote>
<p>ary3배열의 세 번째 배열요소(23값)을 참조하는 과정</p>
</blockquote>
</li>
</ul>
<ol>
<li>먼저 ptr_ary배열의 세 번째 배열요소를 참조 -&gt; ptr_ary[2] -&gt; 부분배열명</li>
<li>참조된 배열요소 ptr_ary[2]는 배열명 ary3를 저장한 포인터변수이므로 배열명처럼 사용하여 ary3의 세 번째 배열요소를 참조 -&gt; printf(&quot;%d&quot;, ptr_ary[2][2]);</li>
</ol>
<blockquote>
<h3 id="반복문으로-모든-배열요소의-값을-출력">반복문으로 모든 배열요소의 값을 출력</h3>
<p><img src="https://velog.velcdn.com/images/swk_x/post/dee7ced0-3d22-4a1b-b2f9-3fc26460fa53/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/057be0ed-f016-48bf-a258-1e5531e042e8/image.png" alt=""></p>
</blockquote>
<blockquote>
<h3 id="연습문제">연습문제</h3>
</blockquote>
<ul>
<li>4행 5열의 2차원 배열 두 개를 선언, 1부터 20까지 저장한 후 출력하는 프로그램
<img src="https://velog.velcdn.com/images/swk_x/post/78decb47-780f-426c-af33-1c751647f611/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/df1f6646-ae1e-4f2e-a032-9fb3a365f912/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="연습문제-1">연습문제</h3>
</blockquote>
<ul>
<li>2차원 배열의 초기화와 행/열의 합
<img src="https://velog.velcdn.com/images/swk_x/post/7bce123e-4c7a-4627-9dce-cf3281a6739c/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="연습문제-2">연습문제</h3>
</blockquote>
<ul>
<li>기억 공간의 몇 퍼센트를 차지하는지 계산하는 프로그램
<img src="https://velog.velcdn.com/images/swk_x/post/ad21d4de-c343-407f-a987-0fa01c642b66/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/099859e5-81b2-43a7-a6c6-6192daa301df/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="연습문제-3">연습문제</h3>
</blockquote>
<ul>
<li>2차원 문자배열과 포인터배열이 연결될 수 있도록 배열을 선언하고 초기화하는 프로그램
(1) 포인터배열을 이용하여 가장 길이가 긴 동물 이름 출력
(2) 포인터배열을 이용하여 문자열을 사전 순서에 따라 sorting한다.
<img src="https://velog.velcdn.com/images/swk_x/post/ae88ceea-b5fa-4efa-8644-a6035b16a72b/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/6cfa4f50-b0d5-44e0-83b5-f61ae3b49620/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C언어] 변수의 영역과 데이터 전달]]></title>
            <link>https://velog.io/@swk_x/C%EC%96%B8%EC%96%B4-%EB%B3%80%EC%88%98%EC%9D%98-%EC%98%81%EC%97%AD%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EB%8B%AC</link>
            <guid>https://velog.io/@swk_x/C%EC%96%B8%EC%96%B4-%EB%B3%80%EC%88%98%EC%9D%98-%EC%98%81%EC%97%AD%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EB%8B%AC</guid>
            <pubDate>Mon, 18 Sep 2023 07:14:50 GMT</pubDate>
            <description><![CDATA[<h2 id="자동변수">자동변수</h2>
<ul>
<li>지금까지 하나의 함수 안에서 선언한 변수는 자동변수이다.</li>
<li><blockquote>
<p>함수 input 값으로 선언된 변수</p>
</blockquote>
</li>
<li><blockquote>
<p>함수 내부에서 선언된 변수</p>
</blockquote>
</li>
<li>사용볌위는 하나의 함수 내부이다.</li>
<li><blockquote>
<p>중괄호 {} 내부</p>
</blockquote>
</li>
<li>생존기간은 함수가 호출되어 실행되는 동안이다.</li>
<li>메모리에서의 위치는 스택영역이다.</li>
<li><blockquote>
<p>LIFO (last-in-first-out)</p>
</blockquote>
</li>
<li>자동초기화 되지 않으므로 쓰레기값이 존재</li>
</ul>
<blockquote>
<h3 id="자동변수의-생존기간">자동변수의 생존기간</h3>
</blockquote>
<ul>
<li>자동변수는 함수가 호출되어 변수 선언문이 실행될 때 메모리에 기억공간이 할당된다.</li>
<li><blockquote>
<p>세 개의 자동변수를 사용하는 함수의 예(매개변수==자동변수)</p>
</blockquote>
<pre><code class="language-c">int sum(int a, int b)
{
   int res; //메모리가 stack에서 생성
   res=a+b;
   return res;
}</code></pre>
</li>
<li>자동변수는 함수가 리턴되고 나면 더 이상 사용되지 않는 기억공간이므로 리턴될 때 메모리에서 사라진다.</li>
</ul>
<blockquote>
<h3 id="기억공간의-할당과-회수">기억공간의 할당과 회수</h3>
</blockquote>
<ul>
<li>자동변수의 할당과 회수는 하나의 함수 내에서도 발생</li>
<li><blockquote>
<p>함수 내에서 새로운 블록을 열고 변수를 선언하면 그 블록이 끝날 때 변수는 사라진다. 결국 변수의 사용범위는 블록 내부이다.</p>
</blockquote>
<pre><code class="language-c">#include &lt;stdio.h&gt;
int main()
{
   int a=10, b=20;  //메인함수 블록에 선언된 변수
   printf(&quot;바꾸기 전 a : %d, b : %d\n&quot;, a, b);
   {                 //새로운 블록의 시작
       int temp;     //안쪽 블록에 선언된 변수
       temp = a;   //temp는 이 블록에서만 사용가능, 나가면 사용 불가능
       a=b;
       b=temp;
   }               //블록이 끝나면서 temp변수는 사라진다.
   printf(&quot;바꾼 후 a : %d, b : %d\n&quot;, a, b); 
   return 0;
}</code></pre>
</li>
</ul>
<blockquote>
<h3 id="중첩된-블록에서-같은-이름의-변수를-사용할-경우">중첩된 블록에서 같은 이름의 변수를 사용할 경우</h3>
</blockquote>
<ul>
<li>중첩된 블록에서 같은 이름의 변수를 선언하면 가장 가까운 블록에 선언된 변수에 우선권이 있다. 
```c
#include &lt;stdio.h&gt;
int main()
{
  int val=10;  //1번            각 변수의 사용범위는 
  {                         //  변수가 선언된 블록의<pre><code>  int val=20;  //2번        끝까지이다.
  {
      val++;  //가장 가까이 선언된 2번 변수를 사용
  }
  printf(&quot;val : %d\n&quot;, val);</code></pre>  }
  printf(&quot;val : %d\n&quot;, val);
  return 0;
}</li>
<li><blockquote>
<p>출력결과
val : 21   //2번 출력
val : 10   //1번 출력</p>
</blockquote>
<pre><code></code></pre></li>
</ul>
<blockquote>
<h3 id="자동변수가-메모리에-할당되는-방법">자동변수가 메모리에 할당되는 방법</h3>
</blockquote>
<ul>
<li>자동변수는 함수의 호출 순서에 따라 할당되고 리턴될 때 회수된다.
따라서 가장 나중에 할당된 자동변수가 가장 먼저 사라진다.
-&gt; 메인함수 A, B로 구성된 함수들의 호출과 리턴 예
<img src="https://velog.velcdn.com/images/swk_x/post/71da7da9-83ba-4abe-a816-01bb7e6830ee/image.png" alt=""></li>
<li>자동변수는 함수의 호출과 리턴 규칙에 맞게 메모리의 스택 영역에 할당된다.
<img src="https://velog.velcdn.com/images/swk_x/post/971c7854-3e90-4c01-bc61-b2337b88c01c/image.png" alt=""></li>
</ul>
<hr>
<h2 id="함수들-간의-데이터-전달-방법">함수들 간의 데이터 전달 방법</h2>
<ul>
<li>자동변수는 사용범위가 하나의 함수로 제한되기 때문에 함수들 간의 데이터 공유 방법이 필요하다.</li>
<li><blockquote>
<p>값을 복사해서 넘겨주는 방법 : call by value</p>
</blockquote>
</li>
<li><blockquote>
<p>포인터를 사용하는 방법 : call by pointer</p>
</blockquote>
</li>
</ul>
<blockquote>
<h3 id="값을-복사해서-넘겨준다call-by-value">값을 복사해서 넘겨준다(call by value)</h3>
</blockquote>
<ul>
<li>일반적인 함수의 호출방법으로 호출함수의 전달인자가 피호출함수의 매개변수에 복사된다.</li>
<li>피호출함수는 리턴할 때 리턴값을 복사하여 호출함수로 전달한다. <pre><code class="language-c">#include &lt;stdio.h&gt;
int add_ten(int);
int main()
{
  int a=10;
  a=add_ten(a);
  printf(&quot;a : %d\n&quot;, a);
  return 0;
}
int add_ten(int b)
{
  b=b+10;
  return b;
}</code></pre>
<img src="https://velog.velcdn.com/images/swk_x/post/77dfded1-f350-4a34-8b78-8aabf79d548d/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="포인터를-사용한다call-by-pointer">포인터를 사용한다(call by pointer)</h3>
</blockquote>
<ul>
<li>호출함수에서 변수의 포인터를 전달인자로 주고</li>
<li>피호출함수에서는 이 포인터를 받아 호출함수의 변수를 참조하는 방식이다.<pre><code class="language-c">#include &lt;stdio.h&gt;
void add_ten(int *);
int main()
{
  int a=10;
  a=add_ten(&amp;a);
  printf(&quot;a : %d\n&quot;, a);
  return 0;
}
void add_ten(int *b)
{
  *b = *b+10;
}</code></pre>
<img src="https://velog.velcdn.com/images/swk_x/post/5fb33167-512b-4c71-a973-a1491f6d5ea5/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="연습문제">연습문제</h3>
</blockquote>
<ul>
<li>메인함수에서 숫자 두 개 입력받고 곱하여 출력하는 프로그램 
<img src="https://velog.velcdn.com/images/swk_x/post/17bbc694-5907-4434-b01a-f0a7c0aed586/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="포인터를-리턴하는-함수">포인터를 리턴하는 함수</h3>
</blockquote>
<ul>
<li>피호출함수에서 포인터를 리턴하여 호출함수가 피호출함수의 기억공간을 참조할 수 있도록 할 수 있다.
<img src="https://velog.velcdn.com/images/swk_x/post/1b636d91-3fad-40ca-aa23-0579775c9594/image.png" alt=""></li>
<li>포인터를 리턴하는 함수는 리턴값의 형태가 포인터형이 된다.</li>
<li><blockquote>
<p>int형 변수의 포인터를 리턴하는 경우</p>
</blockquote>
<pre><code class="language-c">int *add_ten(int);  //int형 기억공간의 포인터를 리턴</code></pre>
</li>
<li>자동변수의 포인터를 리턴하여 호출함수에서 다시 참조하는 것은 위첨하다</li>
<li><blockquote>
<p>변수 lifetime</p>
</blockquote>
```c
#include &lt;stdio.h&gt;
int *add_ten(int);
int main()
{
   int a=10;
   int *ap;
   ap=add_ten(a);
   printf(&quot;a : %d\n&quot;, *ap); //포인터 변수 ap로 add_ten함수의 변수를 참조
   return 0;
}
int *add_ten(int b)
{
   b+=10;
   return &b; //add_ten함수의 자동변수 b의 포인터를 리턴
}</li>
<li><blockquote>
<p>오류발생
```</p>
</blockquote>
</li>
<li>포인터를 리턴하는 경우는 함수가 리턴된 후에도 그 기억공간이 계속 유지되는 경우만 가능하다.</li>
<li><blockquote>
<p>호출함수로부터 포인터를 받아서 다시 리턴하는 경우(문자열 처리 함수들의 예)</p>
</blockquote>
<pre><code class="language-c">char *strcpy(char *A, char *B); //B의 문자열을 A에 복사하고 A를 리턴
char *strcat(char *A, char *B); //B의 문자열을 A에 붙인 후에 A를 리턴
char *gets(char *A); //A에 문자열을 입력하고 A를 리턴</code></pre>
</li>
<li>포인터를 리턴하면 좀더 다양한 방식으로 프로그램을 작성할 수 있다.</li>
<li><blockquote>
<p>두 문자열을 붙인 후에 그 결과를 바로 확인하는 예</p>
</blockquote>
<pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
int main()
{
   char src[80]=&quot;빈대&quot;;
   printf(&quot;결과 : %s\n&quot;, strcat(src, &quot;떡&quot;));
   return 0;
}</code></pre>
</li>
</ul>
<hr>
<h2 id="정적-변수static-variable">정적 변수(static variable)</h2>
<ul>
<li>정적변수는 함수가 리턴된 후에도 기억공간이 존재</li>
<li>정적변수는 자료형 앞에 static 예약어를 사용하여 선언<pre><code class="language-c">static int sum; -&gt; 정적 변수의 선언</code></pre>
</li>
<li>정적 변수는 기억공간의 할당과 초기화가 함수의 호출과 무관하다.
```c
#include &lt;stdio.h&gt;
void increase();
int main()
{
  int i;
  for(i=0; i&lt;5; i++)
  {<pre><code>  increase();</code></pre>  }
  return 0;
}
void increase()
{
  static int sum=0; //함수가 호출될 때 싱행하는 게 아니라 프로그램이 시작될 때 실행됨
  sum++;
  printf(&quot;sum : %d\n&quot;, sum);
}</li>
<li><blockquote>
<p>출력결과
sum : 1
sum : 2
sum : 3
sum : 4
sum : 5</p>
</blockquote>
<pre><code></code></pre></li>
</ul>
<blockquote>
<h3 id="정적변수는-포인터를-리턴할-수-있다">정적변수는 포인터를 리턴할 수 있다.</h3>
</blockquote>
<ul>
<li>정적변수는 함수가 리턴된 후에도 그 기억공간이 유지되기 때문에 그 포인터를 리턴하여 호출하는 함수에서 참조할 수 있다.
```c
#include &lt;stdio.h&gt;
int *increase();
int main()
{
  int i;
  int *sp;
  for(i=0; i&lt;5; i++)
  {<pre><code>  sp=increase();
  printf(&quot;sum : %d\n&quot;, *sp);</code></pre>  }
  return 0;
}
int *increase()
{
  static int sum=0; //함수가 호출될 때 싱행하는 게 아니라 프로그램이 시작될 때 실행됨
  sum++;
  return &sum;
}</li>
<li><blockquote>
<p>출력결과
sum : 1
sum : 2
sum : 3
sum : 4
sum : 5</p>
</blockquote>
<pre><code>★자동변수는 메모리에서 변수가 사라지기 때문에 더이상 포인터를 가지고 접근할 수 없었는데 정적변수는 리턴 후에도 변수가 유지되기 때문에 포인터를 사용해서 접근할 수 있다.★
</code></pre></li>
</ul>
<blockquote>
<h3 id="연습문제-1">연습문제</h3>
</blockquote>
<ul>
<li>함수가 호출될 때마다 배열요소의 값을 차례로 리턴하는 함수</li>
<li><blockquote>
<p>즉, 함수가 처음 호출되면 0.1을 리턴하고, 두번쨰 호출되면 0.3을 리턴한다.
<img src="https://velog.velcdn.com/images/swk_x/post/dc79db07-766b-4fd5-bc4d-497e33b3c047/image.png" alt="">
줄8 -&gt; 0.1이 시작주소값이 됨
줄20 -&gt; 순서를 기억하도록 사용됨
<img src="https://velog.velcdn.com/images/swk_x/post/464f09fa-9992-416d-b24f-86562e7cf697/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<hr>
<h2 id="외부변수">외부변수</h2>
<ul>
<li>외부변수도 기억공간의 생존기간이 함수의 호출여부와 무관하다.</li>
<li>외부변수는 변수를 함수 밖에 선언</li>
<li>외부변수는 하나의 함수에 속해 있지 않으므로 여러 함수에서 자유롭게 사용할 수 있다.</li>
<li>외부변수를 사용하여 두 변수의 값을 바꾸는 예<pre><code class="language-c">#include &lt;stdio.h&gt;
void exchange();
int a, b; //변수를 함수 밖에 선언
int main()
{
  printf(&quot;정수값 두 개를 입력 : &quot;);
  scanf(&quot;%d%d&quot;, &amp;a, &amp;b);
  exchange(); //전달인자 없이 호출된다.
  printf(&quot;a : %d, b: %d\n&quot;, a, b);
  return 0;
}
void exchange()
{
  int temp; 
  temp=a;  //외부변수 a, b를
  a=b;  //자신의 변수인 것처럼
  b=temp;  //사용한다.
}</code></pre>
</li>
</ul>
<blockquote>
<h3 id="외부변수를-사용할-때-주의할-점">외부변수를 사용할 때 주의할 점</h3>
</blockquote>
<ul>
<li>외부변수는 여러 함수가 공유하므로 데이터의 안전성을 보장 받을 수 없다. 따라서 외부변수의 값에 변화가 생긴다면 다른 함수에 미치는 영향도 살펴야 한다.</li>
<li>외부변수와 같은 이름의 변수를 함수 내에서 선언하는 경우는 함수내에서 선언된 변수를 우선적으로 참조한다.
<img src="https://velog.velcdn.com/images/swk_x/post/0c4c9bc6-0c18-458f-9503-2d2269435826/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="연습문제-2">연습문제</h3>
</blockquote>
<ul>
<li>값을 처리하는 함수<blockquote>
<blockquote>
<p>get_next함수
현재 배열요소의 값을 리턴하고 다음 배열 요소로 이동
get_before함수
현재 배열요소의 값을 리턴하고 이전 배열 요소로 이동
<img src="https://velog.velcdn.com/images/swk_x/post/151330a5-8499-41ba-a937-d1b90c3305ad/image.png" alt=""></p>
</blockquote>
</blockquote>
</li>
<li>.
<img src="https://velog.velcdn.com/images/swk_x/post/3191cf5f-147f-4213-82c6-09477d1f8a41/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/9b7eddb2-fb9e-47d8-9ce6-0fe8b492b499/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="extern-지정자">extern 지정자</h3>
</blockquote>
<ul>
<li>extern 지정자는 컴파일러에게 변수가 현재 범위가 아닌 다른 곳에서 선언되어 있음을 알리는 역할을 한다.</li>
<li><blockquote>
<p>지정된 변수는 반드시 다른 소스 파일에 정의되어 있어야 한다.</p>
</blockquote>
</li>
<li>주로 외부파일에서 정의된 전역 변수를 현재 파일에서 사용하려고 할 때 사용되는 경우가 많다.
<img src="https://velog.velcdn.com/images/swk_x/post/b7736397-a936-431b-9735-5d880e038532/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="register-지정자">register 지정자</h3>
</blockquote>
<ul>
<li>register 지정자는 변수를 레지스터 변수로 만든다.</li>
<li>레지스터 변수는 지역변수만 가능하다.</li>
<li>레지스터 변수는 메모리에 저장되는 것이 아니라 레지스터에 저장된다.</li>
<li>레지스터는 cpu내부에 위치하는 입출력 속도가 매우 빠른 임시 저장 장소라 할 수 있다.<pre><code class="language-c">//register1.c
#include &lt;stdio.h&gt;
int main()
{
  register int i;
  int j;
  for(i=0; i&lt;100; i++) j+=i;
  printf(&quot;%u %u\n&quot;, &amp;i, &amp;j);
  return 0;
}</code></pre>
</li>
</ul>
<blockquote>
<h3 id="변수의-유효-범위">변수의 유효 범위</h3>
<p><img src="https://velog.velcdn.com/images/swk_x/post/1c619e9a-9123-4966-85c0-1e159ccca633/image.png" alt=""></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C언어] 문자열의 처리]]></title>
            <link>https://velog.io/@swk_x/C%EC%96%B8%EC%96%B4-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%98-%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@swk_x/C%EC%96%B8%EC%96%B4-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%98-%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Sat, 16 Sep 2023 17:08:55 GMT</pubDate>
            <description><![CDATA[<h2 id="문자열의-연산">문자열의 연산</h2>
<ul>
<li>문자열은 배열의 형태로 구현된 응용자료형이므로 연산을 자유롭게 할 수 없다.</li>
<li>배열에 저장된 문자열의 길이를 계산하는 작업도 간단하지 않다.<pre><code class="language-c">char str[80]=&quot;dream&quot;;
int count=0;
int i=0;
while(str[i] != &#39;\0&#39;)
{
  count++;
  i++;
}
printf(&quot;배열에 저장된 문자열의 길이 : %d&quot;, count);</code></pre>
</li>
<li>문자열의 연산에는 문자열 복사, 길이 계산, 대소비교, 문자열 붙이기 등이 있다.</li>
<li>프로그램에서 사용된 모든 문자열은 메모리에 배열의 형태로 저장된다.</li>
<li>문자열이 컴파일되면 첫 번째 문자를 가리키는 포인터로 치환된다.</li>
<li><blockquote>
<p>결국 문자열상수는 char형을 가리키는 포인터이다.</p>
</blockquote>
<pre><code class="language-c">#include &lt;stdio.h&gt;
</code></pre>
</li>
</ul>
<p>int main()
{
    printf(&quot;주소값을 출력 : %u\n&quot;, &quot;dream&quot;);
    printf(&quot;첫번째 문자를 출력 : %c\n&quot;, *&quot;dream&quot;);
    printf(&quot;세번째 문자를 출력 : %c\n&quot;, &quot;dream&quot;[2]);
    return 0;
}</p>
<p>-&gt;
           68   69  70  71  72  73
&quot;dream&quot; == &#39;d&#39; &#39;r&#39; &#39;e&#39; &#39;a&#39; &#39;m&#39; &#39;\0&#39;
주소값을 출력 : 4350068
첫번째 문자를 출력 : d
세번째 문자를 출력 : c</p>
<pre><code>★문자열은 컴파일이 되면 문자열이 저장되어 있는 임시메모리(임시버퍼)의 시작주소값으로 치환이 된다.★


&gt; ### 포인터변수로 문자열 처리하기
- 문자열상수가 포인터이므로 포인터변수에 저장하여 사용할 수 있다.
```c
#컴파일 전
char *name;            //포인터변수 선언
name = &quot;Lee Gayeong&quot;;  //포인터변수에 포인터 저장
#컴파일 후
포인터변수 name   -&gt;  Lee Gayeong
포인터변수는 문자열의 첫 번째 문자를 가리킨다.</code></pre><pre><code class="language-c">printf(&quot;이름 : %s\n&quot;, name);
printf(&quot;여섯번째 문자 : %c\n&quot;, name[5]);</code></pre>
<ul>
<li>문자열 상수는 상수이므로 포인터변수로 그 값을 바꿀 수 없다.
```c
char * name = &quot;Lee Gayeong&quot;;
name[5] = &#39;K&#39;  //오류</li>
<li><blockquote>
<p>문자열이 상수이므로 &#39;G&#39;를 &#39;K&#39;로 바꿀 수 없다.
```</p>
</blockquote>
</li>
<li>그러나 포인터변수의 값을 바꿀 수 있으므로 포인터변수가 문자열상수의 중간을 가리키게끔 할 수 있다.</li>
<li>포인터변수는 여러 개의 문자열을 선택하여 처리할 수 있다.<pre><code class="language-c">#include &lt;stdio.h&gt;
int main()
{
  int age;
  char *greeting;  //포인터 변수 선언
  printf(&quot;나이를 입력 : &quot;);
  scanf(&quot;%d&quot;, &amp;age);
  if(age&gt;30) greeting=&quot;처음 뵙겠습니다.&quot;;
  else greeting=&quot;반가워요&quot;; //나이에 따라 서로 다른 문자열을 저장
  printf(&quot;인사말 ; %s\n&quot;, greeting);
  return 0;
}</code></pre>
</li>
</ul>
<blockquote>
<h3 id="연습문제">연습문제</h3>
</blockquote>
<ul>
<li>문자열에서 원하는 문자만 골라서 출력
<img src="https://velog.velcdn.com/images/swk_x/post/78f36ace-f318-4032-bb0a-4e5d01c1b465/image.png" alt="">
출력된 값 : wtreo</li>
</ul>
<blockquote>
<h3 id="문자열상수의-두-얼굴">문자열상수의 두 얼굴</h3>
</blockquote>
<ul>
<li>문자열상수를 포인터변수에 초기화하는 것과 배열에 초기화하는 것은 서로 다른 의미를 가짐<pre><code class="language-c">char *fruit = &quot;strawberry&quot;;    //포인터변수에 포인터를 초기화
char fruit[20] = &quot;strawberry&quot;; //배열에 문자열상수와 데이터를 복사</code></pre>
</li>
<li>배열에 문자열상수로 초기화하는 것은 특별한 경우로 선언과 동시에 초기화할 때만 가능하다.
```c
char fruit[20];
fruit = &quot;strawberry&quot;; (X)
배열명 주소상수  문자열 주소상수</li>
<li><blockquote>
<p>상수를 상수에 대입하는 것이므로 불가능하다!</p>
</blockquote>
<pre><code></code></pre></li>
</ul>
<blockquote>
<h3 id="문자배열에-문자열상수를-저장하려면">문자배열에 문자열상수를 저장하려면?</h3>
</blockquote>
<ul>
<li>문자열상수의 문자들을 직접 하니씩 배열해 복사해야 한다.</li>
<li>문자열을 복사하는 함수를 만들어보자<pre><code class="language-c">user_srtcpy(fruit, &quot;strawberry&quot;);  //함수 호출
         배열명    문자열상수
void user_strcpy(char *des, char *src);  //함수의 원형 선언
               복사될 배열   복사할 문자열</code></pre>
</li>
</ul>
<blockquote>
<h3 id="함수로-문자열을-복사하는-프로그램">함수로 문자열을 복사하는 프로그램</h3>
</blockquote>
<pre><code class="language-c">#include &lt;stdio.h&gt;
void user_strcpy(char *, char *);
int main()
{
    char fruit[20]; //fruit=&quot;strawberry&quot;;와 같이 사용할 수 없으므로
    user_strcpy(fruit, &quot;strawberry&quot;); //함수를 만들어 문자열을 일일이 배열에 복사한다.
    printf(&quot;배열에 저장된 문자열 : %s\n&quot;, fruit);
    return 0;
}
void user_strcpy(char *des, char *src)
{
    while(*src!=&#39;\0&#39;)
    {
        *des = *src;
        src++;
        des++;
    }
    *des = &#39;\0&#39;;
}</code></pre>
<hr>
<h2 id="중요한-문자열-처리-함수">중요한 문자열 처리 함수</h2>
<blockquote>
<h3 id="문자열-복사-함수strcpy">문자열 복사 함수(strcpy)</h3>
</blockquote>
<ul>
<li>문자열 상수나 배열에 저장된 문자열을 다른 배열에 복사
```c
char *strcpy(char *, char *); //문자열의 복사, string copy<pre><code>      배열주소  배열, string..등</code></pre></li>
<li>두 번째 전달인자로 주어지는 문자열을 첫번째 전달인자의 위치에 복사
```</li>
<li>두 배열에 저장된 문자열을 바꾸는 프로그램<pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
int main()
{
  char str1[20]=&quot;apple&quot;;
  char str2[20]=&quot;banana&quot;;
  char temp[20];
  strcpy(temp, str1);
  strcpy(str1, str2);
  strcpy(str2, temp);
  printf(&quot;str1 : %s\n&quot;, str1);
  printf(&quot;str2 : %s\n&quot;, str2);
  return 0;
}</code></pre>
</li>
</ul>
<blockquote>
<h3 id="연습문제-1">연습문제</h3>
</blockquote>
<ul>
<li>문자열 교환 프로그램
<img src="https://velog.velcdn.com/images/swk_x/post/f3b5f78b-47e2-42a1-b225-d330958ffdc3/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="문자열의-길이를-계산하는-함수strlen">문자열의 길이를 계산하는 함수(strlen)</h3>
</blockquote>
<ul>
<li>문자열상수나 배열에 저장된 문자열의 길이를 계산해준다.<pre><code class="language-c">unsigned int strlen(char *); //문자열의 길이 계산, string length</code></pre>
</li>
<li><blockquote>
<p>전달인자로 주어지는 문자열의 길이를 계산하여 리턴한다.(<strong>널문자 제외</strong>)</p>
</blockquote>
<pre><code class="language-c">char fruit[80]=&quot;apple&quot;;
int len;
len = strlen(fruit);
printf(&quot;문자열의 길이 : %d\n&quot;, len);  //문자열의 길이 : 5</code></pre>
</li>
<li>배열에 저장된 문자열의 길이만을 계산해 준다.<pre><code class="language-c">sizeof(fruit) -&gt; 80 //배열 전체의 크기
strlen(fruit) -&gt; 5  //배열에 저장된 문자열의 크기</code></pre>
</li>
<li>문자열 상수나 문자열을 가리키는 포인터 변수를 사용할 수도 있다.<pre><code class="language-c">char *strp = &quot;apple&quot;;
strlen(strp);
strlen(&quot;banana&quot;);</code></pre>
</li>
</ul>
<blockquote>
<h3 id="연습문제-2">연습문제</h3>
</blockquote>
<ul>
<li>strlen 함수 사용
<img src="https://velog.velcdn.com/images/swk_x/post/3377fa75-7236-4bee-80eb-577b53d074d6/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="연습문제-3">연습문제</h3>
</blockquote>
<ul>
<li>user_strlen 함수 사용
<img src="https://velog.velcdn.com/images/swk_x/post/a49bf6f9-dedc-4dce-bc70-e87eaf71fc66/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="문자열을-비교하는-함수strcmp">문자열을 비교하는 함수(strcmp)</h3>
</blockquote>
<ul>
<li>두 문자열의 사전적 순서를 따진다.<pre><code class="language-c">int strcmp(char *str1, char *str2); //문자열의 비교, string compare</code></pre>
</li>
<li><blockquote>
<p>두 문자열을 비교하여 리턴하는 값(사전의 뒤에 나오는 것이 큰 문자열임)</p>
</blockquote>
<pre><code>크기 비교    str1 &gt; str2     str1 &lt; str2      str1 == str2
리턴값           1               -1                0</code></pre></li>
<li>사전적 순서</li>
<li><blockquote>
<p>프로그램에서는 알파벳 순서가 빠르면 아스키코드 값이 작으므로 사전에 먼저 나오는 문자열이 작은 문자열로 처리된다.</p>
</blockquote>
</li>
<li>두 문자열의 순서를 따져서 사전순서로 바꾸는 예<pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
int main()
{
  char str1[20]=&quot;banana&quot;;
  char str2[20]=&quot;apple&quot;;
  char temp[20];
  int res;
  res = strcmp(str1, str2);
  if(res&gt;0)   //str1이 더 크면 문자열을 바꾼다
  {
      strcpy(temp, str1);
      strcpy(str1, str2);
      strcpy(str2, temp);
  }
  printf(&quot;str1 : %s\n&quot;, str1);
  printf(&quot;str2 : %s\n&quot;, str2);
  return 0;
}</code></pre>
</li>
</ul>
<blockquote>
<h3 id="연습문제-4">연습문제</h3>
</blockquote>
<ul>
<li>strcmp 함수 사용
<img src="https://velog.velcdn.com/images/swk_x/post/21dd5584-b5e4-4c4f-8218-90bdc12be924/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="두-개의-문자열을-붙이는-함수strcat">두 개의 문자열을 붙이는 함수(strcat)</h3>
</blockquote>
<ul>
<li>두 문자열을 붙여서 하나의 문자열을 만든다.<pre><code class="language-c">char *strcat(char *str1, char *str2); //string concatenation</code></pre>
</li>
<li><blockquote>
<p>str2의 문자열을 str1의 문자열 뒤에 붙인다.</p>
</blockquote>
<pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
int main()
{
   char fruit[80]=&quot;straw&quot;;
   strcat(fruit, &quot;berry&quot;);
   printf(&quot;연결된 문자열 : %s\n&quot;, fruit);
   return 0;
}</code></pre>
</li>
</ul>
<blockquote>
<h3 id="연습문제-5">연습문제</h3>
</blockquote>
<ul>
<li>strcat 함수 사용
<img src="https://velog.velcdn.com/images/swk_x/post/745a019b-2a91-4797-9765-ecc3e657e272/image.png" alt=""></li>
</ul>
<hr>
<h2 id="문자열의-입출력">문자열의 입출력</h2>
<ul>
<li>scanf함수는 빈칸이 포함된 문자열은 입력할 수 없다.
```c
char str[80];
printf(&quot;문자열을 입력하세요 : &quot;);
scanf(&quot;%s&quot;, str);
printf(&quot;입력된 문자열 : %s\n&quot;, str);</li>
<li><blockquote>
</blockquote>
문자열을 입력하세요 : 백번 보는 것보다 한번 짜보는 것이 낫다.
입력된 문자열 : 백번 //첫번째 빈칸 이후의 문자열은 입력되지 않았다.
```</li>
<li>문자열의 입출력은 전용함수를 사용한다.</li>
<li><blockquote>
<p>한 줄을 모두 입력하는 함수(gets)</p>
</blockquote>
</li>
<li><blockquote>
<p>문자열을 출력하는 함수(puts)</p>
</blockquote>
</li>
</ul>
<blockquote>
<h3 id="한-줄을-모두-입력하는-함수gets">한 줄을 모두 입력하는 함수(gets)</h3>
</blockquote>
<ul>
<li>gets함수는 빈칸을 포함하여 한 줄을 입력할 수 있다. -&gt; &quot;Enter&quot;<pre><code class="language-c">char *gets(char *); //문자열의 입력. get string</code></pre>
</li>
<li><blockquote>
<p>전달인자는 입력 받을 배열의 주소이다.</p>
</blockquote>
</li>
<li><blockquote>
<p>입력된 문자열이 충분히 저장될 수 있도록 배열을 선언해야 한다.</p>
</blockquote>
</li>
<li><blockquote>
<p>데이터를 입력한 후에 마지막에 널문자를 붙여서 문자열을 완성한다.</p>
</blockquote>
```c
char str[80];
printf(&quot;문자열을 입력 : &quot;);
gets(str);
printf(&quot;입력된 문자열 : %s\n&quot;, str);</li>
<li><blockquote>
</blockquote>
문자열을 입력하세요 : 백번 보는 것보다 한번 짜보는 것이 낫다.
입력된 문자열 : 백번 보는 것보다 한번 짜보는 것이 낫다.<pre><code></code></pre></li>
</ul>
<blockquote>
<h3 id="문자열을-출력하는-함수puts">문자열을 출력하는 함수(puts)</h3>
</blockquote>
<ul>
<li>puts함수는 문자열만을 출력하는 전용 함수이다.<pre><code class="language-c">int puts(char *); //문자열의 출력, put string</code></pre>
</li>
<li><blockquote>
<p>문자열만을 출력하므로 printf함수보다 훨씬 작고 간편하다.</p>
</blockquote>
</li>
<li><blockquote>
<p>출력할 문자열이 저장된 배열명을 전달인자로 준다.</p>
</blockquote>
</li>
<li><blockquote>
<p>문자열을 출력한 후에는 자동으로 줄이 바뀐다.</p>
</blockquote>
```c
char str[80];
printf(&quot;문자열을 입력하세요 : &quot;);
gets(str);
printf(&quot;입력된 문자열 ; &quot;);
puts(str);  //printf(&quot;%s\n&quot;, str);</li>
<li><blockquote>
</blockquote>
문자열을 입력하세요 : 백번 보는 것보다 한번 짜보는 것이 낫다.
입력된 문자열 : 백번 보는 것보다 한번 짜보는 것이 낫다.
_       //커서의 위치<pre><code></code></pre></li>
</ul>
<blockquote>
<h3 id="연습문제-6">연습문제</h3>
</blockquote>
<ul>
<li>소설 이어쓰기 프로그램
<img src="https://velog.velcdn.com/images/swk_x/post/2ba10fd4-7783-422f-8cd9-72123cef346e/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/d6a3a165-5a60-49a9-830f-8866ebd0a2da/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="연습문제-7">연습문제</h3>
</blockquote>
<ul>
<li>소설 이어쓰기 프로그램
<img src="https://velog.velcdn.com/images/swk_x/post/536b2458-1a19-40bb-a473-23380570280d/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/94322e19-e8d5-42fd-9154-3e2d3833b278/image.png" alt=""></li>
</ul>
<hr>
<h2 id="문자-입출력-함수">문자 입출력 함수</h2>
<ul>
<li>하나의 문자만을 전용으로 입출력하는 함수들이 있다.</li>
</ul>
<blockquote>
<h3 id="하나의-문자를-입출력">하나의 문자를 입출력</h3>
</blockquote>
<ul>
<li>하나의 문자를 입출력할 때는 문자 전용 입출력함수를 사용하는 것이 효율적이다.<pre><code class="language-c">int getchar();  //하나의 문자를 입력, get character
int putchar(int);  //하나의 문자를 출력, put character</code></pre>
</li>
<li><blockquote>
<p>getchar함수는 키보드로부터 문자를 입력 받아서 리턴한다.</p>
</blockquote>
</li>
<li><blockquote>
<p>putchar함수는 전달인자로 주어지는 문자를 화면에 출력한다.</p>
</blockquote>
</li>
<li><blockquote>
<p>두 함수 모두 stdio.h 헤더파일을 include하면 사용할 수 있다.</p>
</blockquote>
<pre><code class="language-c">#include&lt;stdio.h&gt;
int main()
{
   int ch;
   printf(&quot;문자 하나를 입력하세요 : &quot;);
   ch=getchar();
   printf(&quot;입력된 문자 : &quot;);
   putchar(ch);
   return 0;
}</code></pre>
</li>
</ul>
<blockquote>
<h3 id="문자열을-입출력">문자열을 입출력</h3>
</blockquote>
<ul>
<li>하나의 문자를 반복적으로 입출력하려면 문자열의 입출력이 된다.</li>
<li><blockquote>
<p>문자열을 입력할 때는 마지막에 반드시 널문자를 채워준다.</p>
</blockquote>
</li>
<li><blockquote>
<p>배열에 &quot;love&quot;문자열을 입력하는 예</p>
</blockquote>
<pre><code class="language-c">#include&lt;stdio.h&gt;
int main()
{
   char str[80];  //문자열을 저장할 배열
   int ch;    //getchar함수의 리턴값을 지정할 변수
   int i;  //반복 제어변수
   printf(&quot;문자열을 입력하세요 : &quot;);
   for(i=0; i&lt;4; i++)  //i는 0부터 3까지 변하려면 4번 반복
   {  
       ch=getchar();   //키보드로부터 문자를 입력 받아 리턴
       str[i]=ch;    //리턴된 문자를 배열에 차례로 저장
   }
   str[i]=&#39;\0&#39;;    //마지막에 널문자를 저장하여 문자열을 완성
   printf(&quot;입력된 문자열 : &quot;);
   i=0;           //제어변수를 다시 0으로 초기화
   while(str[i]=&#39;\0&#39;)  //배열요소가 널문자가 아닌 동안 반복
   { 
       putchar(str[i]);  //화면에 문자 출력
       i++;     //다음 문자로 이동
   }
   return 0;
}</code></pre>
</li>
</ul>
<blockquote>
<h3 id="데이터의-입력은-버퍼를-사용">데이터의 입력은 버퍼를 사용</h3>
</blockquote>
<ul>
<li>키보드에서 입력되는 데이터는 일단 버퍼에 저장되고 getchar함수는 버퍼로부터 데이터를 가져오므로 문자열은 한번에 입력한다.<pre><code class="language-c">문자열을 입력하세요 : love
입력된 문자열 : love</code></pre>
</li>
<li>문자를 하나씩 입력하면 새줄문자로 입력되므로 문제가 발생한다.<pre><code class="language-c">문자열을 입력하세요 : l
0       //두 번째 문자를 입력할 때 입력이 끝난다
입력된 문자열 : l
0</code></pre>
</li>
</ul>
<blockquote>
<h3 id="한-줄을-입력">한 줄을 입력</h3>
</blockquote>
<ul>
<li>getchar함수가 새줄문자(\n)도 하나의 문자로 입력하므로 이 문자를 이용하여 한 줄을 입력 받을 수 있다.<pre><code class="language-c">printf(&quot;문자열을 입력하세요 : &quot;);
while(1)  //무한 반복
{
  ch = getchar();   //버퍼로부터 문자 하나를 입력
  if(ch==&#39;\n&#39;) break; //그 문자가 새줄문자이면 입력 종료
  str[i]=ch;  //배열요소에 입력한 문자 저장
  i++;   //다음 배열요소를 이동
}
str[i]=&#39;\0&#39;;  //마지막에 널문자를 넣어 문자열을 완성한다</code></pre>
</li>
</ul>
<blockquote>
<h3 id="여러-줄을-입력">여러 줄을 입력</h3>
</blockquote>
<ul>
<li>새줄문자도 하나의 문자로 입력하면 여러 주릉ㄹ 하나의 문자열로 입력할 수 있다.
단, 입력의 종료는 ctrl+z키를 누른다.</li>
<li><blockquote>
<p>getchar함수는 키보드에서 ctrl+Z키가 눌려지면 &#39;-1&#39;을 리턴하므로 이 값을 비교하여 입력을 종료할 수 있다.</p>
</blockquote>
```
printf(&quot;문자열을 입력하세요 : &quot;);
while(1)
{
   ch=getchar();
   if(ch==-1) break;  //getchar함수가 -1을 리턴하면 입력을 종료
   str[i]=ch;
   9++;
}
str[i]=&#39;\0&#39;;
printf(&quot;입력된 문자열 : &quot;);
puts(str);</li>
<li><blockquote>
</blockquote>
문자열을 입력하세요 : 지금 열심히 살면
나의 미래가 바뀐다.
^Z
입력된 문자열 : 지금 열심히 살면
나의 미래가 바뀐다.<pre><code></code></pre></li>
</ul>
<blockquote>
<h3 id="연습문제-8">연습문제</h3>
</blockquote>
<ul>
<li>소설 이어쓰기 프로그램
<img src="https://velog.velcdn.com/images/swk_x/post/be4a24b5-38c2-48cf-a522-8a24ca6d1ad0/image.png" alt="">
<img src="https://velog.velcdn.com/images/swk_x/post/eb049e67-afd3-4ee6-b765-1887782c6fb6/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C언어] 퍼즐 게임 만들기 실습]]></title>
            <link>https://velog.io/@swk_x/C%EC%96%B8%EC%96%B4-%ED%8D%BC%EC%A6%90-%EA%B2%8C%EC%9E%84-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@swk_x/C%EC%96%B8%EC%96%B4-%ED%8D%BC%EC%A6%90-%EA%B2%8C%EC%9E%84-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Sun, 10 Sep 2023 15:56:40 GMT</pubDate>
            <description><![CDATA[<h2 id="소스-파일들">소스 파일들</h2>
<h3 id="puzzle1차원-배열">puzzle(1차원 배열)</h3>
<p><img src="https://velog.velcdn.com/images/swk_x/post/8e331d47-f396-4fba-ac43-692704a4e267/image.png" alt=""></p>
<ul>
<li>int getKey()</li>
<li>void init(int *puzzle)</li>
<li>int check(int *puzzle)</li>
<li>void display(int *puzzle)</li>
<li>void getIndex(int key, int currentIndex, int *changeIndex)</li>
<li>void change(int *puzzle, int currentIndex, int changeIndex)</li>
</ul>
<hr>
<h3 id="change">change</h3>
<p><img src="https://velog.velcdn.com/images/swk_x/post/7f748b79-7082-4402-80c0-467bdedb7824/image.png" alt=""></p>
<ul>
<li>puzzle배열에서 puzzle[currentIndex]와 puzzle[changeIndex]값을 상호교환한다. </li>
</ul>
<hr>
<h3 id="getindex">getIndex</h3>
<p><img src="https://velog.velcdn.com/images/swk_x/post/27d4ea99-e302-48aa-a7f6-148af8646a26/image.png" alt=""></p>
<ul>
<li>key와 currentIndex(0의 위치)를 입력받음</li>
<li>0의 위치를 key값에 따라 새로 계산하여 그 결과를 changeIndex가 가르키는 주소에 저장</li>
<li>index가 수정되었으면 1을 리턴하고 수정되지 않았으면 0을 리턴</li>
</ul>
<blockquote>
<h3 id="up">[up]</h3>
</blockquote>
<ul>
<li>changeIndex &lt;- currentIndex-3</li>
<li>단, currentIndex &gt; 2 이면 변경하지 않는다.</li>
</ul>
<blockquote>
<h3 id="down">[down]</h3>
</blockquote>
<ul>
<li>changeIndex &lt;- currentIndex+3</li>
<li>단, currentIndex &gt; 5 이면 변경하지 않는다.</li>
</ul>
<blockquote>
<h3 id="right">[right]</h3>
</blockquote>
<ul>
<li>changeIndex &lt;- currentIndex+1</li>
<li>단, currentIndex == 2,5,8 이면 변경하지 않는다.
currentIndex%3==2</li>
</ul>
<blockquote>
<h3 id="left">[left]</h3>
</blockquote>
<ul>
<li>changeIndex &lt;- currentIndex-1</li>
<li>단, currentIndex == 0,3,6 이면 변경하지 않는다.
currentIndex%3==0</li>
</ul>
<hr>
<h3 id="display">display</h3>
<p><img src="https://velog.velcdn.com/images/swk_x/post/16d5e01e-13c5-41c5-aa16-bf1c59d8d6d9/image.png" alt=""></p>
<ul>
<li>system(&quot;cls&quot;)함수를 호출하여 콘솔 화면을 지운 후, puzzle 배열의 값을 콘솔 창에 출력함.</li>
</ul>
<hr>
<h3 id="check">check</h3>
<p><img src="https://velog.velcdn.com/images/swk_x/post/0bb42a8e-458b-4f17-a256-0fa6e8a585e8/image.png" alt=""></p>
<ul>
<li>puzzle 배열에 저장된 값이 {1,2,3,4,5,6,7,8,0}인지 확인</li>
<li>순서가 맞으면 1을 리턴하고, 맞지 않으면 0을 리턴한다. </li>
</ul>
<hr>
<h3 id="init">init</h3>
<p><img src="https://velog.velcdn.com/images/swk_x/post/cdab8caa-cdb7-4b9a-aed2-ce72c976776e/image.png" alt=""></p>
<ul>
<li>0~8사이의 서로 다른 난수 9개를 생성</li>
<li>생성한 난수를 puzzle배열에 저장</li>
</ul>
<hr>
<h3 id="getkey">getKey</h3>
<p><img src="https://velog.velcdn.com/images/swk_x/post/15513a25-b46d-4c53-b57c-2f01df55f47d/image.png" alt=""></p>
<ul>
<li>상/하/좌/우 키를 입력 받아 그 키 값을 리턴한다. </li>
</ul>
<blockquote>
<h3 id="getch">getch()</h3>
</blockquote>
<ul>
<li>콘솔에서 단일 문자를 읽는다. 이 중 어느것도, CTRL+C를 읽을 수 없다.</li>
<li>화살표 키 또는 기능 키를 읽을 때, 각 함수는 두 번 호출되어야 한다. </li>
</ul>
<blockquote>
<h3 id="kbhit">kbhit()</h3>
</blockquote>
<ul>
<li>콘솔에서 최근 키 입력을 확인한다. 이 함수가 0이 아닌 값을 반환하면 키 입력이 버퍼에서 대기 중인 것이다. </li>
</ul>
<hr>
<h2 id="게임-실행">게임 실행</h2>
<ul>
<li>이동키를 사용하여 별을 움직여 숫자들을 순서대로 이동시킨다.
<img src="https://velog.velcdn.com/images/swk_x/post/30cdfac1-9548-4b35-a50d-f5ea79e5a19a/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/swk_x/post/e35fe478-5ffd-4e03-a9ce-1b623e3cbc65/image.png" alt=""></p>
<hr>
<ul>
<li>비슷한 게임으로는 숫자 퍼즐게임이 있다.
<img src="https://velog.velcdn.com/images/swk_x/post/12a0c65e-c534-4633-bfed-fb4f9fd97192/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C언어] 배열과 포인터]]></title>
            <link>https://velog.io/@swk_x/C%EC%96%B8%EC%96%B4-%EB%B0%B0%EC%97%B4%EA%B3%BC-%ED%8F%AC%EC%9D%B8%ED%84%B0</link>
            <guid>https://velog.io/@swk_x/C%EC%96%B8%EC%96%B4-%EB%B0%B0%EC%97%B4%EA%B3%BC-%ED%8F%AC%EC%9D%B8%ED%84%B0</guid>
            <pubDate>Sun, 10 Sep 2023 10:32:03 GMT</pubDate>
            <description><![CDATA[<h2 id="포인터로-배열-다루기">포인터로 배열 다루기</h2>
<ul>
<li>배열의 모든 값을 출력하는 함수를 만들 때 -&gt; 배열요소의 값을 일일이 전달인자로 주는 것은 한계가 있다. <pre><code class="language-c">배열의 선언 int ary[5] = {10, 20, 30, 40, 50}
함수의 호출 ary_prn(ary[0], ary[1], ary[2], ary[3], ary[4]);
     -&gt; 모든 배열요소를 일일이 전달인자로 줘야 한다.
</code></pre>
</li>
</ul>
<p>함수의 정의 void ary_prn(int a, int b, int c, int d, int e)
          {
              printf(&quot;%d, %d, %d, %d, %d\n&quot;, a, b, c, d, e);
          }</p>
<pre><code>- 포인터를 사용하면 배열요소의 값을 간단히 처리할 수 있다.

&gt; ### 포인터로 배열요소를 참조하자
- 배열은 연속된 기억공간이 할당된다.
- 배열은 첫번째 배열요소의 포인터만 알면 -&gt; 나머지 배열요소의 포인터도 쉽게 알 수 있다.
```c
                x     x+4   x+8    x+12   x+16
int ary[5];    int    int   int    int    int
               [0]    [1]   [2]    [3]    [4] </code></pre><ul>
<li>포인터 연산 : 포인터에 정수값을 더할 때는 포인터가 가리키는 크기를 곱해서 더해준다.</li>
<li><blockquote>
<p>예를 들어 4를 더하면 마지막 배열요소의 포인터가 구해진다.</p>
</blockquote>
<pre><code class="language-c">포인터 + (정수값 * 포인터가 가리키는 자료형의 크기)
&amp;ary[0] + 4 = &amp;ary[0] + (4*sizeof(int)) = 36 + 16 = 52번지
★포인터 연산의 결과는 &quot;저장위치&quot;</code></pre>
</li>
<li>모든 배열요소의 포인터는 첫번째 배열요소의 포인터에 정수값을 차례로 더하면 구해진다. <pre><code class="language-c">int ary[5] = {10, 20, 30, 40, 50};</code></pre>
<pre><code class="language-c">&amp;ary[0] + 0 = 36 ----&gt; 10  ary[0]
&amp;ary[0] + 1 = 40 ----&gt; 20  ary[1]
&amp;ary[0] + 2 = 44 ----&gt; 30  ary[2]
&amp;ary[0] + 3 = 48 ----&gt; 40  ary[3]
&amp;ary[0] + 4 = 52 ----&gt; 50  ary[4]</code></pre>
</li>
<li>각 배열요소의 포인터에 참조연산자를 사용하면 모든 값을 참조할 수 있다.
```c</li>
<li>(&amp;ary[0] + i) //i는 반복 제어변수
ㄴ-포인터가 가리키는 기억공간 참조
( ~ ) -&gt; 각 배열 요소를 가리키는 포인터를 차례로 계산</li>
<li><blockquote>
</blockquote>
for(i=0; i&lt;5; i++){
   printf(&quot;%d\n&quot;, *(&amp;ary[0]+i));
}
```</li>
<li>배열명을 포인터 변수에 저장하면 포인터 변수도 배열명처럼 사용.</li>
<li><blockquote>
<p>이 때 포인터 변수는 첫번째 배열요소를 가리킨다.</p>
</blockquote>
<pre><code class="language-c">int *ap = ary; //배열명을 포인터변수에 저장</code></pre>
</li>
</ul>
<blockquote>
<h3 id="배열명--포인터">배열명 = 포인터</h3>
</blockquote>
<ul>
<li>배열명은 첫 번째 배열요소를 가리키는 포인터를 기호화한 것이다. <pre><code class="language-c">★ ary == &amp;ary[0] ★
★ ary + i == &amp;ary[0] + i ★</code></pre>
</li>
<li>따라서 배열명으로 주소값을 계산하여 모든 배열요소를 참조할 수 있으며 의미상 이해하기 쉽게 배열표현을 주로 사용하는 것이다. 
```c
for(i=0; i&lt;5; i++){
  printf(&quot;%d\n&quot;, *(ary+i));
}</li>
<li><blockquote>
</blockquote>
배열표현     포인터표현
ary[0]  ==  *(ary+0)
ary[1]  ==  *(ary+1)
ary[2]  ==  *(ary+2)<pre><code></code></pre></li>
</ul>
<blockquote>
<h3 id="연습문제">연습문제</h3>
</blockquote>
<ul>
<li>배열의 평균값 구하기<img src="https://velog.velcdn.com/images/swk_x/post/d1b56a18-4410-459e-95bf-aa992138d305/image.png" width="80%" height="30"></li>
<li><blockquote>
<p>평균값 : 8.76</p>
</blockquote>
</li>
</ul>
<blockquote>
<h3 id="포인터를-사용한-배열요소의-참조-정리">포인터를 사용한 배열요소의 참조 정리</h3>
</blockquote>
<ul>
<li>포인터(변수)로 배열요소를 참조하는 방법</li>
</ul>
<ol>
<li>배열명(ary)을 사용한 배열표현</li>
<li>배열명(ary)을 사용한 포인터표현</li>
<li>배열명을 저장한 포인터변수(ap)를 사용한 포인터표현</li>
<li>배열명을 저장한 포인터변수(ap)를 사용한 배열표현<pre><code class="language-c">int ary[5] = {10, 20, 30, 40 50};
int *ap = ary;</code></pre>
<img src="https://velog.velcdn.com/images/swk_x/post/64b6a763-344c-4431-bc26-e7d27ab4a9fb/image.png" alt=""></li>
</ol>
<blockquote>
<h3 id="배열명--포인터변수">배열명 != 포인터변수</h3>
</blockquote>
<ul>
<li>배열명은 포인터 상수이므로 자신의 값을 바꿀 수 없다.<pre><code class="language-c">ary += 2;
ary++;     //배열명은 변수가 아니므로 자신의 값을 바꾸는 거 불가능</code></pre>
</li>
<li>포인터변수는 기억공간이므로 자신의 값을 바꿀 수 있다.<pre><code class="language-c">int ary[5]={10, 20, 30, 40, 50};
int *ap=ary;
int i;
for(i=0; i&lt;5; i++)
{
  printf(&quot;%5d&quot;, *ap);
  ap++;
}</code></pre>
</li>
</ul>
<blockquote>
<h3 id="연습문제-1">연습문제</h3>
</blockquote>
<ul>
<li>배열값 거꾸로 출력
<img src="https://velog.velcdn.com/images/swk_x/post/cc7321eb-c282-4db0-8da5-79ac82e072a5/image.png" alt="">
```c</li>
<li>ap = ary + 4  //ap선언, ary+4해서 초기화 시킴. 3.5를 가리키는 주소값이 ap에 들어감.
ap-- //ap=ap-1;과 같은 의미. 아까 +4씩해서 주소를 연산했는데 지금은 -4씩 해서 주소를 연산할 것이다. 그 전에 저장되어 있는 위치. 그럼 3.5 전에 있는 위치인 2.3을 출력...이렇게 계속 하면 1.5까지 출력됨<pre><code></code></pre></li>
</ul>
<hr>
<h2 id="배열의-값을-출력하는-함수">배열의 값을 출력하는 함수</h2>
<ul>
<li>배열명을 전달인자로 받으므로 매개변수는 포인터변수를 선언<pre><code class="language-c">#include &lt;stdio.h&gt;
void ary_prn(int *);  //함수 선언
</code></pre>
</li>
</ul>
<p>int main()
{
    int ary[5]={10, 20, 30, 40, 50}; //배열의 선언과 초기화
    ary_prn(ary); //배열명을 전달인자로 주고 호출함 ★
    return 0;
}</p>
<p>void ary_prn(int *ap) //배열명을 저장할 포인터변수 선언, ap에 ary들어감★
{
    int i;
    for(i=0; i&lt;5; i++)
    {
        printf(&quot;%5d&quot;, ap[i]); //포인터변수를 마치 배열명처럼 사용
        //ap[i] = *(ap+i)
    }
}</p>
<pre><code>
- 포인터변수는 배열명이 아니므로 sizeof연산시 포인터변수의 크기만 계산된다. 
따라서 포인터변수로 배열요소의 개수를 구할 수 없다. 
**※ 포인터 변수는 무조건 4바이트!!! ※**
```c
sizeof(ap)는 포인터변수의 크기만 계산
//sizeof(ary)/sizeof(ap[0])</code></pre><ul>
<li>배열의 크기가 바뀌어도 출력할 수 있는 함수를 만들 때는 배열요소의 개수를 전달인자로 받아야 한다. <pre><code class="language-c">호출할 때 -&gt; ary_prn(ary, sizeof(ary)/sizeof(ary[0]));
                배열명,    배열요소의 개수</code></pre>
<pre><code class="language-c">void ary_prn(int *ap, int an) //배열요소의 개수를 받을 매개변수를 추가한다.
{
  int i;
  for(i=0; i&lt;an; i++)    //배열요소의 개수만큼 반복
  {
      printf(&quot;%5d&quot;, ap[i]);
  }
}</code></pre>
</li>
</ul>
<hr>
<h2 id="배열에-값을-입력하는-함수">배열에 값을 입력하는 함수</h2>
<ul>
<li>배열에 값을 입력할 때는 scanf함수에 각 배열요소의 포인터만을 전달인자로 준다. 
(즉, 주소연산자 (&amp;)를 사용하지 않는다.)<pre><code class="language-c">void ary_input(int *ap) //배열명을 지정할 포인터변수 선언. ap &lt;- ary, ap에 36번지들어감
{
  int i;
  for(i=0; i&lt;5; i++) //배열요소의 개수만큼 반복
  {
      scanf(&quot;%d&quot;, ap+i); //각 배열요소의 포인터를 구해서 전달인자로 줌
      //i가 0이면 36번지, i가 1(x4)이면 40번지...etc. 주소값이므로 &amp;연산자 안 붙는다.
  }
}</code></pre>
</li>
</ul>
<blockquote>
<h3 id="연습문제-2">연습문제</h3>
</blockquote>
<ul>
<li>배열의 평균값 구하기
<img src="https://velog.velcdn.com/images/swk_x/post/b8811929-4f71-49f5-a42c-434cf18de961/image.png" alt="">
배열의 평균 : 86.60</li>
</ul>
<hr>
<blockquote>
<h3 id="연습문제-3">연습문제</h3>
</blockquote>
<ul>
<li>배열의 최소값 구하기
<img src="https://velog.velcdn.com/images/swk_x/post/ce5af0ab-d1e9-4b59-9891-7a2a23022d82/image.png" alt="">
배열의 최소값 : 1.5</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 주석문&변수]]></title>
            <link>https://velog.io/@swk_x/JAVA-%EC%A3%BC%EC%84%9D%EB%AC%B8</link>
            <guid>https://velog.io/@swk_x/JAVA-%EC%A3%BC%EC%84%9D%EB%AC%B8</guid>
            <pubDate>Wed, 30 Aug 2023 15:51:55 GMT</pubDate>
            <description><![CDATA[<h2 id="주석문">주석문</h2>
<ul>
<li>프로그램의 코드와 실행에는 영향을 주지 않는 문장</li>
</ul>
<blockquote>
<h3 id="주석의-종류">주석의 종류</h3>
</blockquote>
<ul>
<li>구현 주석
-행단위 주석(//를 해주면 ,해당 행이 주석 처리됨)
-블럭단위 주석(주석으로 사용할 내용 -&gt; /**/)</li>
<li>문서화 주석(/****/)</li>
<li>문서에 포함할 내용을 작성함</li>
<li>문서화 주석을 클래스, 인터페이스 그리고 멤버 당 하나씩 가질 수 있고, 선언 바로 전에 작성<img src="https://velog.velcdn.com/images/swk_x/post/dc082467-29f2-461c-9b2a-9f4bb6d76c99/image.png" width="80%" height="30">

</li>
</ul>
<pre><code class="language-java">public class AddNum{
    /**
    * Hello
    * World
    */
}</code></pre>
<hr>
<h2 id="실습_주석문">실습_주석문</h2>
<pre><code class="language-java">public class HelloWorld {
    public static void main(String[] args) {
        /*
        *System.out.println(&quot;HelloWorld&quot;);
        */
    }
}</code></pre>
<hr>
<h2 id="변수">변수</h2>
<ul>
<li>값을 저장할 수 있는 메모리의 공간을 의미</li>
</ul>
<blockquote>
<h3 id="변수의-선언">변수의 선언</h3>
</blockquote>
<ul>
<li>타입 변수이름;
-int cnt;  //정수 값을 담을 수 있는 cnt라는 이름의 변수를 선언
-double avg;  //실수 값을 담을 수 있는 avg라는 변수를 선언 </li>
<li>명명규칙</li>
<li>변수의 이름을 정할 때 자바 언어에서 정해놓은 규칙</li>
<li>식별자는 클래스, 매소드, 변수 등 다양한 대상에 대해 이름이 붙여지는 경우</li>
</ul>
<blockquote>
<h3 id="java-식별자-명명-규칙">java 식별자 명명 규칙</h3>
</blockquote>
<ul>
<li>하나 이상의 글자로 이루어져야 함</li>
<li>첫 번째 글자는 문자 이거나 &#39;$&#39;, &#39;_&#39;이어야 함</li>
<li>두번째 이후의 글자는 숫자, 문자, &#39;$&#39;, &#39;_&#39;이어야 함</li>
<li>&#39;$&#39;, &#39;_&#39; 이외의 특수문자 사용 불가능</li>
<li>길이 제한이 없음</li>
<li>키워드는 식별자로 사용할 수 없음</li>
<li>상수 값을 표현하는 단어 true, false, null은 식별자로 사용 불가능</li>
</ul>
<blockquote>
<h3 id="변수-명명-관례">변수 명명 관례</h3>
</blockquote>
<ul>
<li>첫 번째 문자가 소문자인 명사로 정함</li>
<li>여러 단어로 구성된 이름의 경우 두 번째 단어부터 첫글자를 대문자로 함</li>
<li>&#39;_&#39;을 쓰지 않음</li>
<li>규칙은 반드시 지켜야 한다. 지키지 않으면 컴파일시 에러가 발생</li>
<li>관례는 지키지 않아도 컴파일에러가 발생하지는 않지만, 약속이기 때문에 지켜주는 것이 좋음</li>
</ul>
<blockquote>
<h3 id="변수의-사용">변수의 사용</h3>
</blockquote>
<ul>
<li>변수명 = 값;<pre><code class="language-java">cnt = 10;  //cnt라는 int형 변수에 정수값 10을 담음
cnt = 20;  //cnt라는 int형 변수에 정수값 20을 담음, 원래 있던 10은 사라짐
avg = 11.1  //avg라는 double형 변수에 실수값 11.1을 담음</code></pre>
</li>
</ul>
<hr>
<h2 id="실습_변수">실습_변수</h2>
<pre><code class="language-java">public class VariableExam {
    public static void main(String[] args) {
        // 정수형 변수, number를 선언하고 3을 저장해보세요.
        int number = 3;

        System.out.println(number);
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 자바 개발순서]]></title>
            <link>https://velog.io/@swk_x/JAVA-%EC%9E%90%EB%B0%94-%EA%B0%9C%EB%B0%9C%EC%88%9C%EC%84%9C</link>
            <guid>https://velog.io/@swk_x/JAVA-%EC%9E%90%EB%B0%94-%EA%B0%9C%EB%B0%9C%EC%88%9C%EC%84%9C</guid>
            <pubDate>Wed, 30 Aug 2023 08:36:51 GMT</pubDate>
            <description><![CDATA[<h2 id="자바-개발순서">자바 개발순서</h2>
<ol>
<li>소스 작성</li>
<li>작성한 소스 컴파일</li>
<li>컴파일한 소스를 JVM을 이용하여 실행</li>
</ol>
<ul>
<li>소스 작성</li>
</ul>
<pre><code class="language-java">public class HelloWorld{
    public static void main(String args[]){
        System.out.println(&quot;Hello World&quot;);
    }
}</code></pre>
<blockquote>
<h3 id="컴파일">컴파일</h3>
</blockquote>
<ul>
<li>윈도우 버튼 -&gt; 실행 -&gt; cmd를 입력한 후 엔터 입력</li>
<li>cd c:\tmp로 이동</li>
<li>javac HelloWorld.java로 컴파일</li>
</ul>
<blockquote>
<h3 id="실행">실행</h3>
</blockquote>
<ul>
<li>HelloWorld.java 우클릭 -&gt; run as -&gt; 1 java application 클릭</li>
<li>java HelloWorld로 실행</li>
</ul>
<hr>
<h2 id="이클립스를-이용하여-똑같이-실행해-보기">이클립스를 이용하여 똑같이 실행해 보기</h2>
<ul>
<li><p>eclipse.exe를 실행</p>
</li>
<li><p>사용자 홈디렉토리 아래에 workspace 폴더를 지정
(이클립스를 처음 실행하면 워크스페이스 경로를 물어봅니다. 워크스페이스란 이클립스로 작성한 프로젝트가 저장되는 경로입니다. )</p>
</li>
<li><p>first 프로젝트 생성</p>
</li>
</ul>
<blockquote>
<h3 id="소스-작성">소스 작성</h3>
</blockquote>
<ul>
<li>src폴더에서 HelloWorld.java파일 생성</li>
<li>앞에서 만들었던 파일과 똑같은 파일을 HelloWorld.java파일로 작성</li>
<li>워크스페이스 경로를 파일탐색기로 열어보면 src폴더에 HelloWorld.java파일 확인 가능</li>
</ul>
<blockquote>
<h3 id="컴파일-1">컴파일</h3>
</blockquote>
<ul>
<li>bin폴더를 열어보면 HelloWorld.class파일 생성되어있음 (이클립스는 소스파일에 문제가 없다면 자동으로 컴파일하여 bin폴더에 클래스를 만들게 됩니다.)</li>
</ul>
<blockquote>
<h3 id="실행-1">실행</h3>
</blockquote>
<ul>
<li>클래스를 선택한 후 우측버튼을 클릭하고 자바 어플리케이션을 실행하는 메뉴를 선택</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>