<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>우당탕</title>
        <link>https://velog.io/</link>
        <description>종종 생각나는 거 적는 우당탕 개발일지...</description>
        <lastBuildDate>Tue, 30 Jul 2024 15:54:46 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. 우당탕. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bean0_0" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Java 1.8] Java의 Modifier]]></title>
            <link>https://velog.io/@bean0_0/Java-1.8-Java%EC%9D%98-Modifier%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%BA%A1%EC%8A%90%ED%99%94</link>
            <guid>https://velog.io/@bean0_0/Java-1.8-Java%EC%9D%98-Modifier%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%BA%A1%EC%8A%90%ED%99%94</guid>
            <pubDate>Tue, 30 Jul 2024 15:54:46 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>객체 지향 프로그래밍에서 캡슐화란 객체의 데이터(속성)와 이를 처리하는 메서드를 하나의 단위로 묶어 외부로부터 보호하는 것을 의미한다.</p>
</blockquote>
<p>자바는 대표적인 객체 지향 언어 중 하나이다. 객체 지향 언어의 특징 중 하나는 <code>캡슐화</code> 가 있다. 먼저 캡슐화에 대해 알아보겠다.</p>
<h3 id="1-캡슐화란">1. 캡슐화란</h3>
<blockquote>
<p>캡슐화의 정의는 말머리에 작성한 것처럼 객체의 속성과 이를 처리하는 메서드를 하나의 단위로 묶어 외부로부터 보호하는 것을 의미한다.
이 특성으로부터 우리는 다음과 같은 두 가지를 유추해볼 수 있다.</p>
</blockquote>
<ol>
<li>정보 은닉: 객체의 내부 구현과 구현 세부 사항을 외부로부터 은닉</li>
<li>절차 은닉: 객체 내부에서 특정 작업을 수행하는 방법을 외부로부터 은닉</li>
</ol>
<p>그 중 오늘은 Modifier를 통한 간단한 예제를 통해 캡슐화의 <code>정보 은닉</code>에 대해 알아보고자 한다.</p>
<p>그 전 자바의 Modifier에 대해 간단히 살펴보고 넘어가보자.</p>
<h3 id="2-자바의-modifier">2. 자바의 Modifier</h3>
<h4 id="21-static">2.1 Static</h4>
<p><img src="https://velog.velcdn.com/images/bean0_0/post/afeae8c2-1247-4132-9e50-40405b000eda/image.png" alt=""></p>
<p>Static은 Field, Method와 함께 사용된다.
같이 사용되어지는 경우는 다음과 같다.</p>
<ul>
<li>Field: 클래스로 생성된 인스턴스의 상태값을 하나로 공유할 때</li>
<li>Method: 객체의 상태값을 변화하지 않고 기능을 수행할 때</li>
</ul>
<h4 id="22-final">2.2 Final</h4>
<p><img src="https://velog.velcdn.com/images/bean0_0/post/61934d6d-e054-49f0-a3c3-a290fede8802/image.png" alt=""></p>
<p>Final은 Class, Field, Method와 함께 사용된다. Final이라는 단어를 생각해보면 &quot;최종&quot;이라는 느낌이 들지 않는가? 우리는 &quot;최종&quot;이라고 된 것들을 수정하지 않는다. Java 관점에서 보자면, 재정의하지 않는다고 생각하면 된다.</p>
<ul>
<li>Class: 클래스를 재정의하지 않는다. 즉, 하위 클래스를 생성하지 않는다.</li>
<li>Field: 할당된 변수 값을 재정의하지 않는다. 하나의 값을 여러군데서 사용하면 편할 것이다. 그래서 static과 함께 상수를 표현할 때 사용된다.</li>
<li>Method: 인스턴스 메서드를 재정의 하지 않는다. 즉, 하위 클래스에서 오버라이딩하지 않는다.</li>
</ul>
<h4 id="23-abstract">2.3 Abstract</h4>
<p><img src="https://velog.velcdn.com/images/bean0_0/post/35627776-0987-4e66-8d97-cd9666532b44/image.png" alt=""></p>
<p>Abstract는 &quot;추상&quot;이라는 뜻으로 실체 간의 공통되는 특성을 추출한 것을 말한다. 우리는 공통적인 특성을 추상 클래스에 선언하고 각각의 다른 점들만 구현체(Abstract 클래스를 상속 받는 클래스를 뜻한다.)에 작성한다면 하나의 객체나 메서드가 다양한 상태와 행위를 가질 수 있는 <code>다형성</code>을 구현해볼 수 있다.</p>
<ul>
<li>Class: 공통적인 속성과 행위를 작성한 클래스.</li>
<li>Method: 같은 이름의 다양한 행위가 가능한 메소드. 즉, 반드시 자식 클래스에서 오버라이딩될 메소드(바디{}가 있다면 컴파일 에러난다).</li>
</ul>
<hr>
<p>이를 토대로 간단한 관리자 계정의 비밀번호를 취득하는 예제를 변화하며 개념을 살펴나가보자.</p>
<h4 id="default-class로-비밀번호-관리">Default Class로 비밀번호 관리</h4>
<pre><code class="language-java">class Password {
    int AdminPW = 12345;

    public Password() {
    } // Password 클래스의 기본 생성자

    public int getAdminPW() {
        return AdminPW; // AdminPW의 값 반환
    }
}

public class AdminstratorPassword {
    public static void main(String[] args) {
        Password pwd = new Password();
        System.out.println(pwd.AdminPW); // not good
        pwd.AdminPW = 00000; // not good
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/bean0_0/post/2671dd9f-cad9-4cdd-a527-029e06d7e3db/image.png" alt=""></p>
<p>다음 예제를 간단히 살펴보면 Password라는 클래스를 통해 비밀번호를 관리하고 AdminstratorPassword 클래스 안에서 pwd 변수를 선언하여  Password 인스턴스의 참조 값을 할당하고 있는 모습을 볼 수 있다.</p>
<p>이때 pwd.AdminPW로 누구든 인스턴스를 생성만 한다면 그 안의 비밀번호를 누구나 볼 수 있는 형태이고, 심지어 누구든 비밀번호를 바꿀 수 있어 좋지 못하다.</p>
<p>먼저 아무나 비밀번호를 볼 수 없게 인스턴스 변수를 private으로 지정하고 특정 1차 암호를 입력해야만 암호를 return할 수 있도록 코드를 개선해보겠다.</p>
<h4 id="default-class와-private-인스턴스-변수를-통해-비밀번호-관리">Default Class와 private 인스턴스 변수를 통해 비밀번호 관리</h4>
<pre><code class="language-java">class Password {
    private int AdminPW = 12345;

    public Password() {
    } // Password 클래스의 기본 생성자

    public int getAdminPW(int pwd) {
        if (pwd == 98765)
            return AdminPW; // 1차 암호 98765입력 시 AdminPW의 값 반환
        else
            return 0;
    }
}

public class AdminstratorPassword {
    public static void main(String[] args) {
        Password pwd = new Password();
        System.out.println(pwd.AdminPW); // error
        System.out.println(pwd.getAdminPW(777)); //결과: 0
        System.out.println(pwd.getAdminPW(98765)); //결과: 12345 

    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/bean0_0/post/a1db0111-ab8d-4cab-ba48-01f9d73da68c/image.png" alt=""></p>
<p>다음의 예제는 앞선 예제에서 Password의 인스턴스 변수를 private로 정의하고 1차 비밀번호를 입력해야지만 관리자 암호를 return할 수 있도록 개선한 코드이다. </p>
<p><code>private</code>로 접근지정자를 설정했기 때문에 이제 Password 클래스로 pwd 인스턴스를 생성해도 직접 인스턴스 변수에 접근할 수 없다.</p>
<p>또한 1차 비밀번호 98765를 입력한 경우에만 관리자 암호를 return 받을 수 있고, 1차 비밀번호가 아닌 다른 비밀번호를 입력한 경우 관리자 암호를 return 받을 수가 없다.</p>
<p>하지만, 아직 누구든 Password 클래스를 통해 인스턴스를 생성하여 관리자 암호를 return 받을 수 있는 getAdminPW 메서드에 접근할 수 있다.</p>
<p>관리자 암호가 수정이 확실하게 불가하다는 가독성을 높이고, 아무나 함부로 Password 클래스로 인스턴스를 생성하지 못하도록 개선해보자.</p>
<h4 id="final-class와-private-생성자-private-final-인스턴스-변수를-통해-비밀번호-관리">final Class와 private 생성자, private final 인스턴스 변수를 통해 비밀번호 관리</h4>
<pre><code class="language-java">class Password {
    private final int AdminPW = 12345;

    private Password() {
    } //나만 접근이 가능한 private 생성자


    public int getAdminPW(int secondPW) {
        if (secondPW == 98765)
            return AdminPW; // 1차 암호 98765입력 시 AdminPW의 값 반환
        else
            return 0;
    }

    public static Password getInstance (int firstPW) {
        if (firstPW == 78901)
            return new Password();
        else
            return null;
    }
}

public class AdminstratorPassword {
    public static void main(String[] args) {
        Password pwd = new Password(); //error
        Password pwd = Password.getInstance(78901); //인스턴스 생성
        System.out.println(pwd.getAdminPW(777)); //결과: 0
        System.out.println(pwd.getAdminPW(98765)); //결과: 12345 

    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/bean0_0/post/c17a6441-932f-42d9-8015-9a2d01e77094/image.png" alt=""></p>
<p>자식 클래스에서 <code>super</code> 키워드를 사용하면 부모의 인스턴스 변수에 접근할 수 있다. 상속을 불가하게 하려면 위에서 본 <code>final</code> 키워드를 사용할 수 있다.</p>
<p>또, 생성자는 new 연산자와 같이 사용되어 클래스로부터 인스턴스를 생성할 떄 호출되어 초기화를 진행한다. 생성자가 성공적으로 실행되지 않으면 인스턴스는 생성되지 않는다. <code>private</code>이 된다면 나만 인스턴스를 생성할 수 있기에 &#39;아무나&#39; 인스턴스를 생성할 수 없다.</p>
<p>이를 firstPW를 통해 1차 비밀번호를 아는 사람만이 인스턴스를 생성하여 2차 비밀번호까지 일치한 경우에만 관리자 비밀번호를 return 받을 수 있도록 개선해보았다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java 1.8] Data Type의 분류와 메모리 사용 영역]]></title>
            <link>https://velog.io/@bean0_0/Data-Type%EC%9D%98-%EB%B6%84%EB%A5%98%EC%99%80-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%82%AC%EC%9A%A9-%EC%98%81%EC%97%AD</link>
            <guid>https://velog.io/@bean0_0/Data-Type%EC%9D%98-%EB%B6%84%EB%A5%98%EC%99%80-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%82%AC%EC%9A%A9-%EC%98%81%EC%97%AD</guid>
            <pubDate>Sun, 28 Jul 2024 14:20:07 GMT</pubDate>
            <description><![CDATA[<h2 id="1-data-type의-분류">1. Data Type의 분류</h2>
<p>데이터 타입은 크게 Primitive type(기본(원시) 타입)과 Reference type(참조 타입)으로 분류된다. 이를 그림으로 나타내면 다음과 같이 나눠진다.
<img src="https://velog.velcdn.com/images/bean0_0/post/16b17103-e2a0-46fa-92af-1592725c08f7/image.png" alt=""></p>
<blockquote>
<p>Primitive type으로 선언된 변수와 Reference type으로 선언된 변수의 가장 큰 차이점 !!</p>
</blockquote>
<ul>
<li>Primitive type: 실수, 정수 등 한 가지의 <strong>저장되는 실제 값</strong></li>
<li>Reference type: 객체를 가리키는 <strong>참조 값</strong> (이 참조 값은 JVM에 실제 저장된 메모리 주소와 1대1 매핑 되어있음)</li>
</ul>
<h2 id="2-메모리-사용-영역">2. 메모리 사용 영역</h2>
<blockquote>
<p>JVM은 운영체제로부터 Runtime Data Area를 다음과 같이 세분화하여 사용한다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bean0_0/post/000db168-ed0b-4c3a-a297-af5378b5cd50/image.png" alt="">
지금부터 각각의 데이터 영역을 세분화해서 살펴보자</p>
<h3 id="메소드method-영역">메소드(Method) 영역</h3>
<p>메소드 영역에서는 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스별로 런타임 상수풀(Runtime constant pool), 클래스에 대한 정보(Field, Method 데이터), 메소드 코드, 생성자 코드 등을 분류하여 저장한다. 상수풀은 클래스 파일 포맷에서 constant_pool 테이블에 해당하는 영역으로 상수 뿐만 아니라 메서드와 필드에 대한 모든 레퍼런스(물리적인 메모리 주소)를 저장하고 있으며, 런타임 시 JVM은 상수 풀에 저장된 실제 메모리 주소를 찾아 참조합니다. 이때 클래스에 대한 정보인 필드 데이터와 메서드 데이터의 경우 해당 하는 <code>값</code>이 아니라 <code>코드 자체(정의부)</code> 가 저장되는 영역이다. 메소드 영역은 JVM이 시작될 때 생성되고 모든 쓰레드가 이를 공유하게 된다.</p>
<h3 id="힙heap-영역">힙(Heap) 영역</h3>
<p>힙 영역은 모든 인스턴스(객체, 배열 ...)이 생성되는 공간이며 메소드 영역과 같이 모든 쓰레드가 이를 공유하게 된다. 힙 영역에 생성된 인스턴스 들은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다. 참조하는 변수나 필드가 없어지게 되면 자바의 Garbage Collector가 힙 영역에서 자동으로 제거해준다.</p>
<h3 id="jvm-스택stack-영역">JVM 스택(Stack) 영역</h3>
<p>JVM 스택은 메소드의 지역변수, 매개변수, 임시변수 등이 저장되며 각 쓰레드 별로 하나씩 생성되며 쓰레드가 시작될 때 할당된다. 프로그램 실행 시 메소드가 호출되면 스택에 push되게 되며, 메소드가 종료되면 차례대로 스택에서 pop된다.
이때 프레임 내부에는 로컬 변수 스택이 있는데, 기본 타입 변수와 참조 타입 변수가 선언될 때 push되고, 사용이 종료될 시점(선언된 블록을 벗어날 때)에 pop되게 된다.</p>
<h2 id="3-유의사항">3. 유의사항</h2>
<h3 id="31-string-type">3.1 String type</h3>
<p>String 타입은 대표적인 Reference type 중 하나이다.</p>
<ol>
<li>문자 리터럴의 경우 다음과 같은 성질을 가지게 된다.<pre><code class="language-java">String fruit = &quot;Apple&quot;;
String fruit2 = &quot;Apple&quot;; 
fruit == fruit2; // true</code></pre>
</li>
</ol>
<ul>
<li>String타입의 fruit 변수를 선언하면 Stack에 생성되고 문자 리터럴 &quot;Apple&quot;은 메소드 영역에 생성되어 fruit는 Apple의 참조 값을 가지게 된다.</li>
<li>이때 fruit2는 위에서 메소드 영역(상수풀)에 생성된 문자 리터럴 &quot;Apple&quot;의 참조 값을 그대로 가지게 된다.</li>
<li>그래서 fruit와 fruit2의 논리 비교 연산 결과는 true다.</li>
</ul>
<br />


<ol start="2">
<li>인스턴스를 생성하여 사용할 경우 다음과 같은 성질을 가지게 된다.</li>
</ol>
<pre><code class="language-java">String fruit = new String(&quot;Apple&quot;); 
String fruit2 = new String(&quot;Apple&quot;);
fruit == fruit2; // false</code></pre>
<ul>
<li>String 타입의 fruit 변수를 선언하면, Stack에 생성되고 new 연산을 하는 경우 String 인스턴스가 힙에 생성되게 된다. 그리고 fruit는 해당 인스턴스의 참조 값을 가지게 된다.</li>
<li>이 역시, fruit2는 새롭게 생성된 두번째 인스턴스의 참조 값을 가지게 된다.</li>
<li>그래서 fruit와 fruit2의 논리 비교 연산 결과는 false다.</li>
</ul>
<br />

<ol start="3">
<li>그래서 fruit과 fruit2의 문자열을 비교하기 위해서는 논리 비교 연산자를 사용하면 <strong>안된다</strong>.
왜냐하면 둘 다 문자 리터럴 값을 그대로 가지고 있는 게 아니라 참조 값을 가지고 있는 것이기 때문이다. 문자열을 비교하기 위해서는 다음과 같이 equals 메서드를 사용한다. <code>원본 문자열</code>.equals(<code>비교 문자열</code> )로 사용하면 된다.
<img src="https://velog.velcdn.com/images/bean0_0/post/38cf63b7-92fa-40e8-a754-03d8947bdb04/image.png" alt=""></li>
</ol>
<p>equals는 String에 있는 인스턴스 메서드이다. 안에 담겨있는 문자열 비교 시 사용한다.</p>
<pre><code class="language-java">fruit.equals(fruit2); //true</code></pre>
<h3 id="32-array-type">3.2 array type</h3>
<ol>
<li>배열의 경우 다음과 같은 성질을 가지게 된다.<pre><code>int[] scores = new int[] {10, 20, 30};
int[] scores2 = {10, 20, 30};
int[] scores3 = {10, 20, 30};
</code></pre></li>
</ol>
<p>scores == scores2; //false
scores2 == scores3; //false</p>
<p>```</p>
<ul>
<li>int array 타입의 scores 변수를 선언하면, Stack에 생성되고 {}는 주어진 값들을 항목으로 가지는 배열 인스턴스를 힙에 생성하고 참조 값을 생성한다. 그래서 scores는 배열 인스턴스의 참조 값을 가지게 된다. scores2와 scores3의 경우도 이와 동일하게 각각의 배열 인스턴스의 참조 값을 가지고 있다. 배열을 생성할 때 new 연산자를 사용하는 이유는 배열의 크기만 알고 지정할 때 먼저 배열의 크기를 지정해주기 위해서 사용한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java Casting 시 유의점]]></title>
            <link>https://velog.io/@bean0_0/Java-Casting-%EC%8B%9C-%EC%9C%A0%EC%9D%98%EC%A0%90</link>
            <guid>https://velog.io/@bean0_0/Java-Casting-%EC%8B%9C-%EC%9C%A0%EC%9D%98%EC%A0%90</guid>
            <pubDate>Sun, 28 Jul 2024 07:46:37 GMT</pubDate>
            <description><![CDATA[<h2 id="char-자료형-묵시적-형변환-시-유의점">char 자료형 묵시적 형변환 시 유의점</h2>
<pre><code>char B = &#39;A&#39; + 1; //ok

char a = &#39;a&#39;;
char b = a + 1; //compile error
char b = (char)(a + 1) //ok</code></pre><p>위의 <code>B</code> 경우에는 리터럴 간의 연산은 타입 변환 없이 해당 타입으로 계산하지만, <code>b</code> 경우에는 <code>a</code> 가 먼저 int타입으로 형변환이 되기 때문에 강제 형변환이 필요하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[24년도 제 3회 정보처리기사 필기 합격 후기]]></title>
            <link>https://velog.io/@bean0_0/24%EB%85%84-%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%A0%9C3%ED%9A%8C-%ED%95%84%EA%B8%B0-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@bean0_0/24%EB%85%84-%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%A0%9C3%ED%9A%8C-%ED%95%84%EA%B8%B0-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Sun, 28 Jul 2024 06:58:05 GMT</pubDate>
            <description><![CDATA[<p>먼저, 정말 진심 모드로 공부한 시간은 4일 정도 들인 것에 비해 꽤 나쁘지 않은 성적인 85점을 맞았다는 것을 시작으로 내 경험을 공유해보고자 한다.</p>
<p>내가 보려고 했던 시험 일정은 다음과 같았다.</p>
<h2 id="시험-일정">시험 일정</h2>
<p><img src="https://velog.velcdn.com/images/bean0_0/post/c4e7f96b-7087-451a-87c3-b504ec85831f/image.png" alt=""></p>
<p>전체 과목을 보니 <code>소프트웨어 설계</code>  <code>소프트웨어 개발</code> <code>데이터베이스 구축</code> <code>프로그래밍 언어 활용</code> <code>정보시스템 구축 관리</code>로 총 5과목으로 이루어져 있었다.</p>
<h2 id="공부-방법">공부 방법</h2>
<h3 id="공부-순서">공부 순서</h3>
<p>교재 =&gt; CBT(전체 회차 풀어보기) =&gt; 시나공 홈페이지에서 핵심 요약서 전체적으로 훑고 부족 부분 암기 =&gt; 시나공 CBT 풀어보기 =&gt; CBT 인공지능 모의고사 훑어보기</p>
<p>공부 기간: 슬렁슬렁모드 7일 + 진심모드 4일</p>
<h3 id="교재">교재</h3>
<p>먼저 교재는 수제비 필기 기출을 사서 한 번 전체적으로 훑어보고 개념을 살짝 다시 리마인드 하는데에 사용했다. 개념서와 같은 경우, 유사 전공을 졸업했기에 굳이 개념서까지 필요하진 않을 것이라고 판단했다. 전체적으로 훑어보니 전반적으로 내가 어떤 개념에 대해 부족한지, 그 부분이 어떤 부분인지 알기에 용이했다.</p>
<h3 id="모의고사-cbt-시나공-모의고사-활용">모의고사 [CBT, 시나공 모의고사 활용]</h3>
<p>그 뒤 제일 유명한 <a href="https://www.comcbt.com/%EC%97%90%EC%84%9C">https://www.comcbt.com/에서</a> 시험모드로 20년 6월부터 22년 4월까지 모든 문제를 풀었다. 처음 풀었던 2회 정도를 오답노트를 수기로 쓰며 진행하니 어느 정도 구멍이 있던 개념들이 잘 정리가 되었었다.
<img src="https://velog.velcdn.com/images/bean0_0/post/3ead1cb9-98c0-4d85-bc5a-22ced6614fea/image.png" alt="">
블로그 후기들을 찾아보니 처음 풀 때에는 연습모드로 푸는 것이 도움이 되었다는 글을 많이 보았었는데 오히려 나는 선택년도로 시험모드로 푸는 것이 큰 도움이 되었다. 정보처리기사는 기존 출제되었던 문제들이 문제 은행 방식으로 나왔기에 틀린 문제를 활용하여 모의고사를 또 구성해서 볼 수 있었기에 큰 도움이 되었다. (무엇보다 기존 출제되었던 문제들이 매우 많이 나왔었다.)</p>
<h3 id="시나공-핵심-요약본-활용">시나공 핵심 요약본 활용</h3>
<p><img src="https://velog.velcdn.com/images/bean0_0/post/c9767121-ad83-4e2c-b925-96026267a9df/image.png" alt="">
<a href="https://www.sinagong.co.kr/pds/001001001/summaries">https://www.sinagong.co.kr/pds/001001001/summaries</a>
그 후 시나공 사이트에서 회원가입만 하면 주는 핵심요약집을 읽어보았다. 이미 CBT로 전체 회차를 풀었기에 내가 어떤 부분이 부족한지, 문제는 어떤 식으로 출제되는지 아는 상태가 되기 때문에 핵심 요약본을 먼저 보는 것보다 전체 회차를 먼저 풀어본 후 이를 보는 것을 추천한다.</p>
<h3 id="시나공-cbt-모의고사-활용">시나공 CBT 모의고사 활용</h3>
<p><img src="https://velog.velcdn.com/images/bean0_0/post/e31b7c16-8171-4b9b-a3b7-18a6ecfae3f4/image.png" alt="">
그 다음으로는 시나공 홈페이지에서 제공하는 CBT를 사용해서 문제를 풀었다. 실제 시험은 시나공에서 제공하는 툴과 훨씬 유사했다. 또한 시나공에서는 틀린 문제에 대해 무료 강의 또한 지원하기 때문에 문제 풀이 방식을 몰랐던 문제들을 풀 수 있게 되었다.
(단, 답이 틀린 문제가 몇 문제 있으니 그 부분은 주의가 필요하다)</p>
<h3 id="cbt-틀린문제-인공지능-모의고사-활용">CBT 틀린문제 인공지능 모의고사 활용</h3>
<p> 시험 전날에는 다시 <a href="https://www.comcbt.com/">https://www.comcbt.com/</a> 에서 틀린 문제 인공지능 모의고사를 보았다. 내가 풀었던 문제들 중 틀린 문제 위주로 모의고사를 구성해준다. (이때 보았던 문제들도 시험 칠 때 많이 나와서 유용했다)</p>
<p> 이 글이 추후 정보처리기사 필기를 준비하는 분들께 도움이 되길 바라며 합격하시길 기원합니다--!</p>
]]></description>
        </item>
    </channel>
</rss>