<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>guryena.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Fri, 31 Mar 2023 01:12:45 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>guryena.log</title>
            <url>https://velog.velcdn.com/images/guryena_/profile/a3ce0588-bdf7-4f14-8662-850b3ba37e62/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. guryena.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/guryena_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[SW공부 55일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-55%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-55%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 31 Mar 2023 01:12:45 GMT</pubDate>
            <description><![CDATA[<h3 id="1-오라클-primary-key-와-foreign-key-차이는">1. 오라클 primary key 와 foreign key 차이는?</h3>
<ul>
<li><p>primary key
기본키(Primary Key; PK)는 주 키 또는 프라이머리 키라고 하며, 후보키 중에서 특별히 선정된 키로 중복된 값을 가질 수 없으며, 후보키의 성질을 갖는다. 즉, 유일성과 최소성을 가지며 튜플을 식별하기 위해 반드시 필요한 키이다. 영어 약자로 PK(피케이)라고 한다.
기본키는 Null 값을 가질 수 없기 때문에 튜플에서 기본 키로 설정된 속성에 Null 값이 있어서는 안 된다. 릴레이션 스키마를 표현할 때 기본키는 속성 아래 밑줄을 그어 표시한다.</p>
</li>
<li><p>foreign key
외래키(Foreign Key) 또는 포린키란 하나(또는 여러개)의 다른 릴레이션의 기본키(PK) 필드를 참조하는 데이터의 참조 무결성(Referential integrity)을 확인하기 위해 사용되는 키(Key)를 의미한다. 간략히 FK(에프케이)라고도 한다.
외래키(FK, Foreign key)는 한 릴레이션을 다른 릴레이션과 연결해주는 역할을 한다. 외래키가 설정된 릴레이션에 레코드를 입력하면, 기준이 되는 릴레이션의 내용을 참조해서 레코드가 입력된다. 즉, 외래키는 하나의 릴레이션을 다른 릴레이션에 의존하게 만든다.
외래키를 설정하는 방법은 2가지가 있는데 릴레이션을 생성할때 설정하는 방법과 이미 생성된 릴레이션에 ALTER 명령어를 이용하여 설정하는 방법이다. 외래키를 설정할 때, 참조되는(기본키가 있는 릴레이션) 릴레이션의 필드는 반드시 UNIQUE나 PRIMARY KEY 제약 조건이 설정되어 있어야 한다. 또한 외래키의 특징 중 &#39;참조되는 값이 변경되면 참조하는 값도 변경된다.&#39;가 있는데 이를 적용하기 위해선 특정 제약 조건들을 이용하여 설정이 필요하다.</p>
</li>
</ul>
<h3 id="2-오라클-sequence-란">2. 오라클 Sequence 란?</h3>
<h4 id="sequence">Sequence</h4>
<ul>
<li>유일(UNIQUE)한 값을 생성해주는 오라클 객체이다.</li>
<li>시퀀스를 생성하면 기본키와 같이 순차적으로 증가하는 컬럼을 자동적으로 생성 할 수 있다.</li>
<li>보통 PRIMARY KEY 값을 생성하기 위해 사용 한다.</li>
<li>메모리에 Cache되었을 때 시퀀스값의 액세스 효율이 증가 한다.</li>
<li>시퀀스는 테이블과는 독립적으로 저장되고 생성된다.</li>
</ul>
<pre><code>-- 시퀀스 생성 Syntax
CREATE SEQUENCE sequence_name
    [START WITH n]
    [INCREMENT BY n]
    [MAXVALUE n | NOMAXVALUE]
    [MINVALUE n | NOMINVALUE]
    [CYCLE | NOCYCLE]
    [CACHE | NOCACHE]</code></pre><blockquote>
</blockquote>
<ul>
<li>START WITH : 시퀀스의 시작 값을 지정한다. n을 1로 지정하면 1부터 순차적으로 시퀀스번호가 증가 한다.</li>
<li>INCREMENT BY : 시퀀스의 증가 값을 지정한다. n을 2로 하면 2씩 증가한다. START WITH를 1로, INCREMENT BY를 2로 설정하면 1, 3, 5, 7,.. 이렇게 시퀀스 번호가 증가한다.</li>
<li>MAXVALUE : 시퀀스 최대값</li>
<li>MINVALUE : 시퀀스 최소값</li>
<li>CYCLE|NOCYCLE : 최대값 도달시 순환 여부</li>
<li>CACHE | NOCACHE : CACHE 여부, 원하는 숫자만큼 미리 만들어 Shared Pool의 Library Cache에 상주시킨다.</li>
</ul>
<h3 id="3-cp--에-대하여-설명하시오">3. CP  에 대하여 설명하시오.</h3>
<h4 id="connection-pool-cp">Connection Pool (CP)</h4>
<p>연결 풀 또는 커넥션 풀(connection pool)은 소프트웨어 공학에서 데이터베이스로의 추가 요청이 필요할 때 연결을 재사용할 수 있도록 관리되는 데이터베이스 연결의 캐시이다.
연결 풀을 사용하면 데이터베이스의 명령 실행의 성능을 강화할 수 있다. 각 사용자마다 데이터베이스 연결을 열고 유지보수하는 것은 비용이 많이 들고 자원을 낭비한다. 연결 풀의 경우 연결이 수립된 이후에 풀에 위치해 있으므로 다시 사용하면 새로운 연결을 수립할 필요가 없어진다. 모든 연결이 사용 중이면 새로운 연결을 만들고 풀에 추가된다. 연결 풀은 사용자가 데이터베이스에 연결을 수립하는데까지 대기해야하는 시간을 줄이기도 한다.</p>
<p>연결 풀을 지원하는 데이터베이스로는 IBM DB2, 마이크로소프트 SQL 서버, 오라클, MySQL, PostgreSQL 등이 있다.</p>
<h3 id="4dept_daojsp-에-dept-테이블에-있는-모든-데이타를-뽑아-오시오단-connection-pool를-이용하시오">4.dept_dao.jsp 에 dept 테이블에 있는 모든 데이타를 뽑아 오시오.(단, connection pool를 이용하시오)</h3>
<pre><code>package edu.global.ex;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;


import edu.global.vo.DeptDTO;

public class DeptDAO {
//  connection pool 사용으로 인해 주석    
//    private String url = &quot;jdbc:oracle:thin:@localhost:1521/xe&quot;;
//    private String uid = &quot;scott&quot;;
//    private String upw = &quot;tiger&quot;;

    private DataSource dataSource; //Connection Pool Object

    public DeptDAO() {
//        try {
//            Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);
//        }
//        catch (Exception e) {
//            e.printStackTrace();
//        }
        try {
            Context context = new InitialContext();
            dataSource = (DataSource)context.lookup(&quot;java:comp/env/jdbc/oracle&quot;);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public List&lt;DeptDTO&gt; deptSelct(){
        List&lt;DeptDTO&gt; deptDTO = new ArrayList&lt;DeptDTO&gt;();

        Connection con = null;
        Statement st = null;

        ResultSet rs = null;

        try {
            String sql = &quot;SELECT * FROM DEPT&quot;;

//            con = DriverManager.getConnection(url, uid, upw);
            con = dataSource.getConnection();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            while(rs.next()){
                int deptno = rs.getInt(&quot;deptno&quot;);
                String dname = rs.getString(&quot;dname&quot;);
                String loc = rs.getString(&quot;loc&quot;);

                DeptDTO dto = new DeptDTO(deptno, dname, loc);
                deptDTO.add(dto);
            }


        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (st != null) {
                    st.close();
                }
                if (con != null) {
                    con.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return deptDTO;
    }

}
</code></pre><pre><code>package edu.global.vo;

//이름     널?       유형           
//------ -------- ------------ 
//DEPTNO NOT NULL NUMBER(2)    
//DNAME           VARCHAR2(14) 
//LOC             VARCHAR2(13) 
public class DeptDTO {
    public DeptDTO() {
    }

    private int deptno;
    private String dname;
    private String loc;

    public DeptDTO(int dept, String dname, String loc) {
        this.deptno = dept;
        this.dname = dname;
        this.loc = loc;

    }

    public int getDeptno() {
        return deptno;
    }

    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    public String getLoc() {
        return loc;
    }

    public void setLoc(String loc) {
        this.loc = loc;
    }

}
</code></pre><pre><code>&lt;%@page import=&quot;edu.global.vo.DeptDTO&quot;%&gt;
&lt;%@page import=&quot;java.util.List&quot;%&gt;
&lt;%@page import=&quot;edu.global.ex.DeptDAO&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;%
    DeptDAO dao = new DeptDAO();
    List&lt;DeptDTO&gt; dto = dao.deptSelct();

    for(DeptDTO deptDTO : dto){
        out.print(&quot;부서번호 : &quot; + deptDTO.getDeptno() + &quot;&lt;/br&gt;&quot; );
        out.print(&quot;장소 : &quot; + deptDTO.getLoc() + &quot;&lt;/br&gt;&quot; );
        out.print(&quot;부서이름 : &quot; + deptDTO.getDname() + &quot;&lt;/br&gt;&quot; );
        out.print(&quot;&lt;hr&gt;&quot;);
    }

%&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 54일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-54%EC%9D%BC%EC%B0%A8-u48jiey4</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-54%EC%9D%BC%EC%B0%A8-u48jiey4</guid>
            <pubDate>Wed, 29 Mar 2023 08:28:39 GMT</pubDate>
            <description><![CDATA[<h3 id="1-제약-조건에-대하여-설명하시오">1. 제약 조건에 대하여 설명하시오.</h3>
<p>제약조건(constraint)이란 데이터의 무결성을 지키기 위해, 데이터를 입력받을 때 실행되는 검사 규칙을 의미한다.
이러한 제약 조건은 CREATE 문으로 테이블을 생성할 때나 ALTER 문으로 컬럼을 추가할 때도 설정할 수 있다.</p>
<p>SQL의 제약조건은 다음과 같다.</p>
<ul>
<li><p>NOT NULL
NOT NULL 제약 조건을 설정하면, 해당 필드는 NULL 값을 저장할 수 없다.
즉, 이 제약 조건이 설정된 필드는 무조건 데이터를 가지고 있어야 한다.</p>
<pre><code>CREATE TABLE 테이블이름
(
    필드이름 필드타입 NOT NULL,
    ...
)</code></pre></li>
<li><p>UNIQUE
UNIQUE 제약 조건을 설정하면, 해당 필드는 서로 다른 값을 가져야 한다.
즉, 이 제약 조건이 설정된 필드는 중복된 값을 저장할 수 없다.
```</p>
</li>
</ul>
<ol>
<li><p>CREATE TABLE 테이블이름
(
    필드명 필드타입 UNIQUE,
    ...
)</p>
</li>
<li><p>CREATE TABLE 테이블이름
(
    필드이름 필드타입,
    ...,
    [CONSTRAINT 제약조건이름] UNIQUE (필드이름)
)</p>
<pre><code></code></pre></li>
</ol>
<ul>
<li>PRIMARY KEY
PRIMARY KEY 제약 조건을 설정하면, 해당 필드는 NOT NULL과 UNIQUE 제약 조건의 특징을 모두 가진다.
따라서 이 제약조건이 설정된 필드는 NULL 값을 가질 수 없으며, 또한 중복된 값을 가질 수 없다.
이러한 PRIMARY KEY 제약 조건을 기본 키라고 한다.
테이블의 데이터를 쉽고 빠르게 찾도록 도와주는 역할을 한다.
```</li>
</ul>
<ol>
<li><p>CREATE TABLE 테이블이름
(
    필드이름 필드타입 PRIMARY KEY,
    ...
)</p>
</li>
<li><p>CREATE TABLE 테이블이름
(
    필드이름 필드타입,
    ...,
    [CONSTRAINT 제약조건이름] PRIMARY KEY (필드이름)
)</p>
<pre><code></code></pre></li>
</ol>
<ul>
<li><p>FOREIGN KEY
FOREIGN KEY 제약 조건을 설정한 필드를 외래 키라고 부르며, 한 테이블을 다른 테이블과 연결해주는 역할을 한다.
외래 키가 설정된 테이블에 레코드를 입력하면, 기준이 되는 테이블의 내용을 참조해서 레코드가 입력된다.
즉, FOREIGN KEY 제약 조건은 하나의 테이블을 다른 테이블에 의존하게 만든다.
FOREIGN KEY를 설정할 때 참조되는 테이블의 필드는 반드시 UNIQUE나 PRIMARY KEY가 설정되어 있어야 한다.</p>
<pre><code>CREATE TABLE 테이블이름
(
    필드이름 필드타입,
    ...,
    [CONSTRAINT 제약조건이름]
    FOREIGN KEY (필드이름)
    REFERENCES 테이블이름 (필드이름)
)</code></pre></li>
<li><p>DEFAULT
DEFAULT 제약 조건은 해당 필드의 기본값을 설정할 수 있게 해준다.
만약 레코드를 입력할 때 해당 필드 값을 전달하지 않으면, 자동으로 설정된 기본 값을 저장한다.</p>
<pre><code>CREATE TABLE 테이블이름
(
    필드이름 필드타입 DEFAULT 기본값,
    ...
)</code></pre></li>
</ul>
<h3 id="2-primary-key-란">2. primary key 란?</h3>
<p>기본 키(primary key)는 주 키 또는 프라이머리 키라고 하며, 관계형 데이터베이스에서 조(레코드)의 식별자로 이용하기에 가장 적합한 것을 관계 (테이블)마다 단 한 설계자에 의해 선택, 정의된 후보 키를 말한다.
유일 키는 0~1개 이상의 속성의 집합으로 볼 수 있다. 즉, 관계에 저장된 레코드를 고유하게 식별하는 후보 키 (=속성 또는 속성의 집합) 가운데, 설계자가 일반적으로 이용되어야한다고 정해 놓은 것을 가리킨다.</p>
<p>관계형 데이터베이스 관리 시스템(RDBMS)과 미들웨어, 애플리케이션 등의 레코드 식별자가 필요한 경우 기본 키가 사용된다.
반드시 기본 키를 사용해야만 하는 경우가 아니면, 다른 후보 키로 대체되어도 기능 수행에는 문제가 없다.
따라서 기본 키의 이론적 의의는 크지 않지만 실무에서 널리 사용되고 있는 개념이다.
그러나 기본 키는 NULL의 존재가 허용되지 않지만, 후보 키에 허용이 되는 차이가 있다. (레코드 추가, 업데이트할 때 제약 조건으로 기본 키를 생각한다면, 고유 제약 조건에 NOT NULL 제약을 가한 것이 기본 키 제약 조건이라고 생각할 수 있다).
관계에 있는 후보 키가 하나인 때에는 그 후보 키가 당연히 기본 키가 된다.
또한 기본 키가 아닌 후보 키는 대리 키(alternate key)라고 한다.</p>
<h3 id="3-roll-back-과-commit-의-개념에-대하여-설명하시오">3. roll back 과 commit 의 개념에 대하여 설명하시오.</h3>
<ul>
<li><p>rollbakc
rollback은 데이터베이스에서 업데이트에 오류가 발생할 때, 이전 상태로 되돌리는 것을 말한다. 후진 복귀라고도 한다. 데이터베이스는 업데이트 이전 저널 파일을 사용하여 원래의 정상적인 상태로 되돌린다. 이것은 오류 동작 이후에도 깨끗한 사본으로 복원시킬 수 있기 때문에, 무결성을 위해 중요하다. 데이터베이스 서버의 충돌로부터 복원하는데도 중요하다. 충돌이 일어날 때, 특정 트랜잭션을 롤백시킴으로써 데이터베이스는 일관적인 상태로 되돌려진다.<br/>
롤백은 보통 트랜잭션 로그를 통해 수행되지만, 다중버전 동시성 제어를 통해 구현되기도 한다.</p>
</li>
<li><p>commit
COMMIT 문은 관계형 데이터베이스 관리 시스템(RDBMS)에서 트랜잭션을 종료하고 다른 사용자에게 변경된 모든 사항을 보이도록 만드는 문이다.
일반적으로 트랜잭션 종료시 해당 업데이트를 확정한다는 의미에서 &quot;커밋&quot;이라고 사용한다. 반대로 업데이트를 취소 처리를 롤백 (ROLLBACK)이라고 하며, 이러한 제어를 약속 제어라고 부른다. SQL에서는 ROLLBACK 문이 그 처리를 한다.<br/>
SQL에서 COMMIT은 RDBMS 내에 있는 데이터베이스 트랜잭션을 종결시키고, 모든 변화를 다른 사용자들이 볼 수 있게 만들어 준다. 일반적인 포맷은 BEGIN WORK 구문으로 시작하여, COMMIT 구문이 나온다. 다른 방법으로 ROLLBACK 구문으로 시작될 수 있으며, 이것은 BEGIN WORK로 시작된 모든 작업을 그 이전으로 되돌린다. COMMIT 구문은 또한 현존하는 SAVEPOINT가 사용될 수 있을 것이다.<br/>
트랜잭션의 측면에서 커밋의 반대는 트랜잭션의 임시적인 변화를 포기하는 것(롤백)이다.</p>
<h3 id="4-트랜잭션이란">4. 트랜잭션이란?</h3>
</li>
</ul>
<p>데이터베이스 트랜잭션(Database Transaction)은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다.</p>
<p>이론적으로 데이터베이스 시스템은 각각의 트랜잭션에 대해 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 영구성(Durability)을 보장한다. 이 성질을 첫글자를 따 ACID라 부른다. 그러나, 실제로는 성능향상을 위해 이런 특성들이 종종 완화되곤 한다.</p>
<p>어떤 시스템들에서는 트랜잭션들은 논리적 작업 단위(LUW, Logical Units of Work)로 불린다.</p>
<h3 id="5-아래-객체에-대하여-설명하시오">5. 아래 객체에 대하여 설명하시오.</h3>
<ul>
<li><p>Connection
특정 데이터 원본에 대한 커넥션은 Connection 인터페이스가 구현된 클래스의 객체로 표현된다. 어떤 SQL 문장을 실행시키기 전에 우선 Connection 객체가 있어야 한다.
Connection 객체는 특정 데이터 원본과 연결된 커넥션을 나타내고, 특정한 SQL 문장을 정의하고 실행시킬 수 있는 Statement 객체를 생성할 때 Connection 객체를 사용한다.<br/>
Connection 객체는 데이터베이스에 대한 데이터인 메타데이터(Meta Data)에 관한 정보를 데이터 원본에 질의하는데 사용한다. 이 때, 사용 가능한 테이블의 이름, 특정 테이블의 열에 정보 등이 포함된다.</p>
</li>
<li><p>Statement
Statement 인터페이스는  Connection 객체를 통해 프로그램에 리턴되는 객체에 의해 구현되는 일종의 메소드 집합을 정의한다. Statement 객체는 Statement 인터페이스를 구현한 객체로, 항상 인수가 없는 Connection 클래스의 CreateSteatement() 메소드를 호출함으로써 얻어진다.<br/>
Statement 객체를 생성하면 Statement 객체의 exequteQuery() 메소드를 호출하여 SQL 질의를 실행시킬 수 있다.
메소드의 인수로는 SQL 질의 문장을 담은 String 객체를 전달한다.
Statement 객체는 단순한 질의문을 사용할 경우에 좋다.</p>
</li>
<li><p>ResultSet
SQL 문에서 SELECT 문을 사용한 질의의 경우 성공 시 결과물로 ResultSet을 반환한다.
ResultSet은 SQL 질의에 의해 생성된 테이블을 담고 있다. 또한 ResultSet 객체는 <code>커서(cursor)</code>라고 불리는 것을 가지고 있는데, 그것으로 ResultSet에서 특정 행에 대한 참조를 조작할 수 있다.<br/>
<code>커서</code>는 초기에 첫번째 행의 직전을 가리키도록 되어 있는데, ResultSet객체의 next() 메소드를 사용하면 다음 위치로 커서를 옮길 수 있다.
<img src="https://velog.velcdn.com/images/guryena_/post/cfaf086e-7db2-409d-9700-536919b08cd1/image.png" alt=""></p>
<br/>
ResultSet에서 행을 처리하는데 반복문을 사용하여 next() 메소드가 유효한 행이 있으면 true, 없으면 false를 리턴하는 것을 이용하여 while문으로 제어할 수 있다.<br/>
ResultSet 객체에서 현재 행에서 필드명 혹은 레코드셋에서의 위치를 통해 어떤 필드의 값을 가져올 수 있는 메소드를 제공한다.
![](https://velog.velcdn.com/images/guryena_/post/87c94561-4ff1-4a15-9eb9-49b084599dca/image.png)
<br/>
해당 필드의 데이터 타입이 문자열이면 getString()이 되고, 해당 필드의 데이터 타입이 int면 getInt()가 된다.

</li>
</ul>
<h3 id="6-empjsp-emp-테이블에-있는-모든-데이타를-뽑아-오시오">6. emp.jsp (emp 테이블에 있는 모든 데이타를 뽑아 오시오.)</h3>
<pre><code>&lt;%@page import=&quot;java.sql.DriverManager&quot;%&gt;
&lt;%@page import=&quot;java.sql.ResultSet&quot;%&gt;
&lt;%@page import=&quot;java.sql.Statement&quot;%&gt;
&lt;%@page import=&quot;java.sql.Connection&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;%
    String url = &quot;jdbc:oracle:thin:@localhost:1521/xe&quot;;
    Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);

    String sql = &quot;SELECT * FROM dept&quot;;
    String sqlEMP = &quot;SELECT * FROM EMP&quot;;
    String sqlSal = &quot;SELECT ENAME AS 이름, SAL *12 + NVL(COMM, 0) AS 연봉 FROM EMP&quot;;

    Connection con = DriverManager.getConnection(url, &quot;scott&quot;, &quot;tiger&quot;);
    Statement st = con.createStatement();
    ResultSet rs2 = st.executeQuery(sqlEMP);


    while(rs2.next()){
        out.print(rs2.getString(&quot;EMPNO&quot;) +&quot; || &quot; + rs2.getString(&quot;ENAME&quot;) + &quot; || &quot; + rs2.getString(&quot;JOB&quot;) +&quot; || &quot; + 
                rs2.getString(&quot;MGR&quot;) +&quot; || &quot; +rs2.getString(&quot;HIREDATE&quot;) +&quot; || &quot; +rs2.getString(&quot;SAL&quot;) 
                +&quot; || &quot; +rs2.getString(&quot;COMM&quot;) +&quot; || &quot; +rs2.getString(&quot;DEPTNO&quot;) +&quot;&lt;br&gt;&quot;);
        out.print(&quot;&lt;hr&gt;&quot;);
    }


    rs.close();
    st.close();
    con.close();


%&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[SW53일차 공부]]></title>
            <link>https://velog.io/@guryena_/SW53%EC%9D%BC%EC%B0%A8-%EA%B3%B5%EB%B6%80</link>
            <guid>https://velog.io/@guryena_/SW53%EC%9D%BC%EC%B0%A8-%EA%B3%B5%EB%B6%80</guid>
            <pubDate>Mon, 27 Mar 2023 08:41:05 GMT</pubDate>
            <description><![CDATA[<h3 id="1구구단을-gugudanjsp-로-짜시오">1.구구단을 gugudan.jsp 로 짜시오.</h3>
<ul>
<li><p>scriptlet</p>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
  pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

  &lt;%
      for (int x =1; x &lt;10; x++){
          out.print(&quot;=====&quot; + x + &quot;단&quot; + &quot;=====&lt;br /&gt;&quot;);
          for (int y = 1; y &lt; 10; y++ ){
              out.print(x + &quot; x &quot; + y + &quot; = &quot; + x*y + &quot;&lt;br&gt;&quot;);
          }

          out.print(&quot;&lt;hr&gt;&quot;);
      }
  %&gt;
</code></pre></li>
</ul>
</body>
</html>
```




<h3 id="2-아래의-용어를-설명하시오">2. 아래의 용어를 설명하시오.</h3>
<ul>
<li><p>스크립트릿 
자바 서버 페이지(JSP) 기술에서 스크립틀릿(scriptlet)은 HTML과 같은 JSP 코드에 내장된 자바 코드의 한 부분이다. 스크립트릿은 &lt;% %&gt; 태그 내의 모든 것이다. 이 사이에서 사용자는 유효한 스크립트릿, 즉 유효한 Java 코드를 추가할 수 있다.<br/>
애플스크립트에서 스크립틀릿은 작은 스크립트이다.<br>
윈도에서 스크립트릿(scriptlet)은 HTML 코드와 다양한 스크립트 언어로 작성될 수 있는 스크립트를 포함하는 COM 구성 요소이다.<br>
스크립트릿(scriptlet)은 RPM 패키지 관리 시스템에서 SPEC 파일에 포함된 스크립트이다.</p>
<pre><code>&lt;%  java source code %&gt; </code></pre></li>
<li><p>선언문(declaration) 
JSP 선언 태그는 필드 및 메서드를 선언하는 데 사용된다.<br>
jsp 선언 태그 내부에 작성된 코드는 자동 생성 서블릿의 service() 메서드 외부에 배치된다.<br>
따라서 요청할 때마다 메모리를 얻지 못한다.</p>
<pre><code>&lt;%!  field or method declaration %&gt;  </code></pre></li>
<li><p>표현식(expression)
JSP 식 태그 내에 배치된 코드는 응답의 출력 스트림에 기록된다. 따라서 데이터를 쓰기 위해 out.print()를 쓸 필요가 없다. 주로 변수나 방법의 값을 인쇄하는 데 사용된다.</p>
<pre><code>&lt;%  java source code %&gt;  </code></pre></li>
</ul>
<h3 id="3-국어-영어-수학을-입력gradejsp후-grade_resultjsp-에-총점-평균-학점이-나오도록-짜시오">3. 국어 영어 수학을 입력(grade.jsp)후 grade_result.jsp 에 총점 평균 학점이 나오도록 짜시오.</h3>
<pre><code>&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;grade&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;form action=&#39;grade_result.jsp&#39; method=&quot;post&quot;&gt;
    국어 &lt;input type=&quot;number&quot; name=&#39;kor&#39;&gt;
    영어 &lt;input type=&quot;number&quot; name=&#39;eng&#39;&gt;
    수학 &lt;input type=&quot;number&quot; name=&#39;math&#39;&gt;
    &lt;input type=&#39;submit&#39; value=&#39;결과&#39;&gt;
    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><pre><code>&lt;%@page import=&quot;servletEx02.grade.Grade&quot;%&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;grade_result&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;%

        String getKor = request.getParameter(&quot;kor&quot;.trim()); //trim() removes meaningless spaces 
        String getEng = request.getParameter(&quot;eng&quot;.trim());
        String getMath = request.getParameter(&quot;math&quot;.trim());

        double kor = Double.valueOf(getKor);
        double eng = Double.valueOf(getEng);
        double math = Double.valueOf(getMath);


        Grade grade = new Grade(kor, eng, math);
        double sum = grade.getSum();
        double avg = grade.getAvg();
        char chgrade = grade.getGrade();
    %&gt;

        합계 : &lt;%= sum %&gt;
        평균 : &lt;%= avg %&gt;
        등급 : &lt;%= chgrade %&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><pre><code>package servletEx02.grade;

public class Grade {
    private double kor;
    private double eng;
    private double math;

    public Grade(double kor, double eng, double math) {
        this.kor=kor;
        this.eng=eng;
        this.math=math;
    }

    public double getSum() {
        double sum = kor + eng + math;
        return sum;
    }
    public double getAvg() {
        double avg = (double) getSum() / 3;
        return avg;
    }

    public char getGrade() {
        char grade = &#39;가&#39;;
        if (getAvg()&gt;=90) {
            grade = &#39;수&#39;;
        }
        else if (getAvg()&gt;=80) {
            grade = &#39;우&#39;;
        }
        else if (getAvg()&gt;=70) {
            grade = &#39;미&#39;;
        }
        else if (getAvg()&gt;=60) {
            grade = &#39;양&#39;;
        }
        return grade;
    }

}
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 52일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-52%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-52%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 27 Mar 2023 07:50:37 GMT</pubDate>
            <description><![CDATA[<h3 id="1-오라클-substr-과-자바의-substring--차이는">1. 오라클 substr 과 자바의 substring  차이는?</h3>
<ul>
<li><p>SUBSTR 
오라클에서 문자열을 자를 때는 SUBSTR 함수를 사용한다. 다른 DB의 SQL 함수인 SUBSTRING, LEFT, RIGHT 함수와 동일한 기능을 하며, 문자열을 바이트 단위로 자를 때는 SUBSTRB 함수를 사용하면 된다. SUBSTR 함수는 자를 문자열의 시작위치와 자를 길이를 사용하여 문자열을 자르며, 뒤에서 문자열을 자를 때는 시작 위치를 음수(-) 값으로 부여하면 된다.
<img src="https://velog.velcdn.com/images/guryena_/post/98eccf2f-3352-429c-88e4-9aa6795199d8/image.png" alt=""></p>
</li>
<li><p>substring
java.lang.String 클래스의 substring() 메소드는 문자열의 특정 부분을 잘라내는 데 사용한다.
substring() 메소드에 파라미터를 1개만 전달(startIndex)하면 문자열의 startIndex부터 끝까지의 문자열을 잘라서 리턴한다. (index는 0부터 시작)</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/guryena_/post/cbd82eb1-f929-4bf6-9656-cb0fed5632ee/image.png" alt=""></p>
<h3 id="2-09월-달에-입사한-사원은">2. 09월 달에 입사한 사원은?</h3>
<pre><code>SELECT ENAME as 사원명, 19 || SUBSTR(HIREDATE, 1, 2) AS 연, SUBSTR(HIREDATE, 4, 2) AS MONTH FROM EMP WHERE SUBSTR(HIREDATE, 4, 2) = &#39;09&#39;;</code></pre><h3 id="3-----o----rac-----le---공백문자를-제거-하시오">3. &#39;    O    RAC     LE  &#39; 공백문자를 제거 하시오.</h3>
<pre><code>SELECT LTRIM(&#39;                     ORACLE    &#39;) FROM DUAL;
SELECT RTRIM(&#39;                     ORACLE    &#39;) FROM DUAL;
SELECT TRIM(&#39;                     ORA C L      E    &#39;) FROM DUAL;</code></pre><h3 id="4-floor-함수-round-함수-length-함수의-차이는">4. floor 함수 round 함수 length 함수의 차이는?</h3>
<ul>
<li><p>floor
FLOOR.MATH 함수는 숫자를 가장 가까운 정수 또는 지정된 유의값의 배수로 내린다. 음수의 경우 모드에 따라 0에 가까워지거나 0에서 멀어지는 방향으로 반올림된다. </p>
</li>
<li><p>round
ROUND 함수는 숫자를 지정한 자릿수로 반올림한다. 예를 들어 셀 A1에 23.7825가 포함된 경우 값을 소수 2자리로 반올림하려면 다음 수식을 사용할 수 있다.<br>
=ROUND(A1, 2)<br>
이 함수의 결과는 23.78이다.</p>
</li>
<li><p>length
Array 인스턴스의 length 속성은 배열의 길이를 반환한다. 반환값은 부호 없는 32비트 정수형이며, 배열의 최대 인덱스보다 항상 크다. length 속성에 값을 설정할 경우 배열의 길이를 변경한다.</p>
</li>
</ul>
<h3 id="5-servlet-파일에서-get-방식과-post-방식의-한글-처리-방식은">5. servlet 파일에서 get 방식과 post 방식의 한글 처리 방식은?</h3>
<p>서블릿(Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성하는 자바 기반의 웹 애플리케이션 프로그래밍 기술이다.</p>
<ul>
<li><p>get
GET 방식은 URL주소에 데이터를 붙여서 전송하는 방식으로,데이터를 전송하면 개인정보가 유출될 수 있다. 데이터 검색에 많이 사용하며 데이터 크기 한계가 있다.</p>
</li>
<li><p>post
HTTP헤더의 내용으로 보내는 방식이며 데이터 크기에 제한이 없고 헤더에 포함되어 보안이 뛰어나다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 51일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-51%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-51%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 23 Mar 2023 09:04:05 GMT</pubDate>
            <description><![CDATA[<h3 id="1포트-번호란">1.포트 번호란?</h3>
<ul>
<li>인터넷 프로토콜 스위트에서 포트(port)는 운영 체제 통신의 종단점이다. 이 용어는 하드웨어 장치에도 사용되지만, 소프트웨어에서는 네트워크 서비스나 특정 프로세스를 식별하는 논리 단위이다. 주로 포트를 사용하는 프로토콜은 전송 계층 프로토콜이라 하며, 예를 들어 전송 제어 프로토콜(TCP)와 사용자 데이터그램 프로토콜(UDP)가 있다. 각 포트는 번호로 구별되며 이 번호를 포트 번호라고 한다. 포트 번호는 IP 주소와 함께 쓰여 해당하는 프로토콜에 의해 사용된다.</li>
</ul>
<h3 id="2아래의-sql구문을-완성하시오">2.아래의 SQL구문을 완성하시오.</h3>
<ul>
<li><p>ALLEN 이 근무하는 위치-서브쿼리</p>
<pre><code>SELECT ENAME, LOC FROM EMP E , DEPT D WHERE D.DEPTNO = E.DEPTNO AND ENAME = &#39;ALLEN&#39;;</code></pre><p><img src="https://velog.velcdn.com/images/guryena_/post/c94b08d8-7bb4-40bd-acd6-2fb521b29f68/image.png" alt=""></p>
</li>
<li><p>연봉을 3000이상 받는 사원이 소속된 부서(서브쿼리)와 동일한 부서(연산자)에서 근무하는 사원들의 정보를 출력(메인)하는 쿼리문</p>
<pre><code>SELECT ENAME AS 이름, DNAME AS 부서, SAL AS 연봉 FROM EMP E, DEPT D WHERE E.DEPTNO=D.DEPTNO AND SAL &gt;=3000;</code></pre><pre><code>SELECT * FROM EMP WHERE DEPTNO IN (SELECT DEPTNO FROM EMP WHERE SAL &gt;=3000);</code></pre></li>
</ul>
<p><img src="https://velog.velcdn.com/images/guryena_/post/13056f98-bce9-4e14-a042-b4947ce4157b/image.png" alt=""></p>
<ul>
<li>사원들의 평균 급여 보다 더 많은 급여를 받는 사원을 검색하는 쿼리문<pre><code>SELECT ENAME, SAL FROM EMP WHERE SAL &gt; (SELECT AVG(SAL) FROM EMP);</code></pre><img src="https://velog.velcdn.com/images/guryena_/post/8444a77c-f618-4e23-a174-74e23a1224ec/image.png" alt=""></li>
</ul>
<ul>
<li>job 이 세일즈맨 인 사람들이 근무하는 위치는?<pre><code>SELECT ENAME, LOC FROM EMP E, DEPT D WHERE D.DEPTNO =E.DEPTNO AND JOB=&#39;SALESMAN&#39;;</code></pre><img src="https://velog.velcdn.com/images/guryena_/post/55c32a21-313f-48b3-bdf5-d86100e11964/image.png" alt=""></li>
</ul>
<ul>
<li>각 사원의 급여가 몇 등급인지 살펴보는 쿼리문<pre><code>SELECT EMPNO AS 사번, ENAME AS 이름, JOB AS 담당업무, HIREDATE AS 입사일,  DNAME AS 부서, SAL AS 연봉, GRADE AS 등급
FROM DEPT D, EMP E, SALGRADE G WHERE D.DEPTNO = E.DEPTNO AND SAL BETWEEN LOSAL AND HISAL;</code></pre><img src="https://velog.velcdn.com/images/guryena_/post/c011fd45-6e24-4bcc-8957-226a8d713e34/image.png" alt=""></li>
</ul>
<ul>
<li>SMITH 의 메니져 이름<pre><code>SELECT E.ENAME, M.ENAME FROM EMP E, EMP M WHERE E.MGR = M.EMPNO AND E.ENAME = &#39;SMITH&#39;;</code></pre><img src="https://velog.velcdn.com/images/guryena_/post/9bfea09a-a72c-4ec8-b06b-a6b02799065f/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 50일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-50%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-50%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 22 Mar 2023 09:53:49 GMT</pubDate>
            <description><![CDATA[<h3 id="1-카테이션-곱에-대하여-설명하시오">1. 카테이션 곱에 대하여 설명하시오.</h3>
<p>union(교집합)/ interction(합집합)</p>
<ul>
<li>From절에 2개 이상의 Table이 있을때 두 Table 사이에 유효 join 조건을 적지 않았을때 해당 테이블에 대한 모든 데이터를 전부 결합하여 Table에 존재하는 행 갯수를 곱한 만큼의 결과값이 반환되는 것이다.</li>
</ul>
<h3 id="2-join-에-대하여-설명하시오">2. JOIN 에 대하여 설명하시오.</h3>
<p>두 개 이상의 테이블을 서로 연결하여 데이터를 검색할 때 사용하는 방법으로, 두 개의 테이블을 마치 하나의 테이블인 것처럼 보여준다.</p>
<pre><code>1) 일반
SELECT 테이블.컬럼, 테이블.컬럼
FROM 테이블1,테이블2           
WHERE 조건</code></pre><blockquote>
<h4 id="조인의-종류">조인의 종류</h4>
</blockquote>
<ul>
<li>Inner Join<pre><code>1)
SELECT 조회할 컬럼
FROM 테이블1, 테이블2
[WHERE 조건문]
&gt;
2)
SELECT 조회할 컬럼
FROM 테이블1
(INNER) JOIN 테이블2
ON 테이블1.컬럼 = 테이블2.컬럼
[WHERE 추가조건]</code></pre><blockquote>
</blockquote>
</li>
<li>Natural Join<pre><code>SELECT 조회할 컬럼
FROM 테이블1
NATURAL JOIN 테이블2
[WHERE 조건문]</code></pre><blockquote>
</blockquote>
</li>
<li>Full Outer Join<pre><code>SELECT 조회할 컬럼
FROM 테이블1 
FULL OUTER JOIN 테이블2
ON 조건문
[WHERE 추가조건문]</code></pre></li>
<li>Left Outer Join<pre><code>SELECT 조회할 컬럼
FROM 기준테이블1 
LEFT OUTER JOIN 테이블2
ON 조건문
[WHERE 추가조건문]</code></pre><blockquote>
</blockquote>
</li>
<li>Right Join<pre><code>SELECT 조회할 컬럼
FROM 테이블1 
RIGHT OUTER JOIN 기준테이블2
ON 조건문
[WHERE 추가조건문]</code></pre><blockquote>
</blockquote>
</li>
<li>Cross Join<pre><code>1)
SELECT 조회할컬럼
FROM 테이블1, 테이블2
&gt;
2)
SELECT 조회할컬럼
FROM 테이블1
JOIN 테이블2
&gt;
3)
SELECT 조회할컬럼
FROM 테이블1
CROSS JOIN 테이블2</code></pre></li>
</ul>
<h3 id="3-프로젝트에-시간을-넣으시오">3. 프로젝트에 시간을 넣으시오.</h3>
<pre><code>let today = new Date();   

let year = today.getFullYear(); // 년도
let month = today.getMonth() + 1;  // 월
let date = today.getDate();  // 날짜
let day = today.getDay();  // 요일

document.write(year + &#39;/&#39; + month + &#39;/&#39; + date)
document.write(&#39;&lt;br&gt;&#39;)
document.write(day);</code></pre><h3 id="4-jquery-로-구구단을-짜시오">4. jquery 로 구구단을 짜시오.</h3>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;구구단&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;script&gt;
        var i = 2;
        var j = 1;

        // for 문
        document.write(&quot;for 을 이용한 출력&quot;, &quot;&lt;br&gt;&quot;);
        for (i = 2; i &lt; 10; i++) {
            for (j = 1; j &lt; 10; j++) {
                document.write(i + &quot; * &quot; + j + &quot; = &quot; + (i * j) + &quot;&lt;br&gt;&quot;);
            }
            document.write(&quot;&lt;hr&gt;&quot;);
        }
    &lt;/script&gt;
&lt;/body&gt;&lt;/html&gt;</code></pre><h3 id="5-아래-쿼리를-완성-하시오">5. 아래 쿼리를 완성 하시오.</h3>
<ul>
<li>Jones 의 사무실 위치를 출력하시오.<pre><code>SELECT ENAME, LOC FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND ENAME=&#39;JAMES&#39;;</code></pre></li>
<li>부서의 최대값과 최소값을 구하되, 최대 급여가 2900 이상인 부서만 출력하는 쿼리문<pre><code>SELECT MAX(EMPNO), MIN(EMPNO)  FROM EMP WHERE SAL&gt;=2900;</code></pre></li>
<li>부서별 평균 급여가 2000 이상인부서의 번호와 부서별 평균 급여를 출력하는 쿼리문<pre><code>SELECT AVG(SAL), DEPTNO FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) &gt;= 2000</code></pre></li>
<li>부서별 부서의 번호와 부서별 평균 급여를 출력하는 쿼리문<pre><code>SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO;</code></pre></li>
<li>부서별 사원의 수와 커미션을 받는 사원의 수를 계산하는 쿼리문<pre><code>SELECT COUNT(EMPNO), COUNT(COMM) FROM EMP GROUP BY DEPTNO;</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 49일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-49%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-49%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 17 Mar 2023 09:19:00 GMT</pubDate>
            <description><![CDATA[<h3 id="1-httpsluckyguystorytistorycom205-를-푸시오">1. <a href="https://luckyguystory.tistory.com/205">https://luckyguystory.tistory.com/205</a> 를 푸시오.</h3>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
    &lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.6.3/jquery.min.js&quot;&gt;&lt;/script&gt;

    &lt;script&gt;
        $(function () {
            $.ajax({
                type : &quot;get&quot;,
                url : &quot;http://sample.bmaster.kro.kr/contacts?pageno=3&amp;pagesize=10&quot;,
                success : function (data) {
                console.log(&quot;complete communication&quot;);

                $(data.contacts).each(function (index, member) {
                    console.log(member);
                    let copy = $(&quot;#table&quot;).clone();

                        $(copy).each(function(x) {
                            $(copy[x]).html(&quot;&lt;td&gt;&quot;+member.no+&quot;&lt;/td&gt;&quot;
                            +&quot;&lt;td&gt;&quot;+member.name+&quot;&lt;/td&gt;&quot;
                            +&quot;&lt;td&gt;&quot;+member.tel+&quot;&lt;/td&gt;&quot;
                            +&quot;&lt;td&gt;&quot;+member.address+&quot;&lt;/td&gt;&quot;
                            +&quot;&lt;td&gt;&lt;img src=&#39;&quot;+member.photo+&quot;&#39;&lt;/img&gt;&lt;/td&gt;&quot;
                            +&quot;&lt;td&gt;&lt;button class=&#39;deleteBtn&#39;&gt;삭제&lt;/button&gt;&lt;/td&gt;&quot;)
                            copy.appendTo(&quot;#border&quot;)
                        })

                    });
                    let tableArr = $(&quot;#table&quot;);
                    $(&#39;.deleteBtn&#39;).click(function () {
                        $(this.parentNode.parentNode).remove();
                    })

                }
            });
        });
    &lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table id=&quot;border&quot; border=&quot;1&quot;&gt;
        &lt;tr id=&quot;table&quot;&gt;
            &lt;td&gt;no&lt;/td&gt;
            &lt;td&gt;name&lt;/td&gt;
            &lt;td&gt;tel&lt;/td&gt;
            &lt;td&gt;address&lt;/td&gt;
            &lt;td&gt;photo&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;

        &lt;/tr&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><h3 id="2json-이란">2.json 이란?</h3>
<blockquote>
<p>JSON(JavaScript Object Notation)은 속성-값 쌍(attribute–value pairs), 배열 자료형(array data types) 또는 기타 모든 시리얼화 가능한 값(serializable value) 또는 &quot;키-값 쌍&quot;으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷이다. 비동기 브라우저/서버 통신 (AJAX)을 위해, 넓게는 XML(AJAX가 사용)을 대체하는 주요 데이터 포맷이다. 특히, 인터넷에서 자료를 주고 받을 때 그 자료를 표현하는 방법으로 알려져 있다. 자료의 종류에 큰 제한은 없으며, 특히 컴퓨터 프로그램의 변수값을 표현하는 데 적합하다.<br/>
본래는 자바스크립트 언어로부터 파생되어 자바스크립트의 구문 형식을 따르지만 언어 독립형 데이터 포맷이다. 즉, 프로그래밍 언어나 플랫폼에 독립적이므로, 구문 분석 및 JSON 데이터 생성을 위한 코드는 C, C++, C#, 자바, 자바스크립트, 펄, 파이썬 등 수많은 프로그래밍 언어에서 쉽게 이용할 수 있다.<br/>
JSON 포맷은 본래 더글라스 크록포드가 규정하였다. RFC 7159와 ECMA-404 그리고 ISO/IEC 21778:2017 표준에 의해 기술되고 있다. KS 부합화 표준은 아직 제정되지 않았으며, TTA 협회 표준명은 TTAE.OT-10.0394이다. ECMA 표준과 ISO/IEC 표준은 문법만 정의할 정도로 최소한으로만 정의되어 있는 반면 RFC는 시맨틱, 보안적 고려 사항을 일부 제공 한다. JSON의 공식 인터넷 미디어 타입은 application/json이며, JSON의 파일 확장자는 .json이다.</p>
</blockquote>
<h3 id="3-ajax-에-대하여-설명하시오">3. ajax 에 대하여 설명하시오.</h3>
<blockquote>
<p>Ajax(Asynchronous JavaScript and XML, 에이잭스)는 비동기적인 웹 애플리케이션의 제작을 위해 아래와 같은 조합을 이용하는 웹 개발 기법이다.<br/></p>
</blockquote>
<ul>
<li>표현 정보를 위한 HTML (또는 XHTML) 과 CSS</li>
<li>동적인 화면 출력 및 표시 정보와의 상호작용을 위한 DOM, 자바스크립트</li>
<li>웹 서버와 비동기적으로 데이터를 교환하고 조작하기 위한 XML, XSLT, XMLHttpRequest (Ajax 애플리케이션은 XML/XSLT 대신 미리 정의된 HTML이나 일반 텍스트, JSON, JSON-RPC를 이용할 수 있다).<blockquote>
</blockquote>
DHTML이나 LAMP와 같이 Ajax는 자체가 하나의 특정한 기술을 말하는 것이 아니며, 함께 사용하는 기술의 묶음을 지칭하는 용어이다. 실제로 AFLAC와 같이 사실상 Ajax에 바탕을 두고 있는 유사/복합 기술들이 속속 나타나고 있다.<blockquote>
</blockquote>
Ajax 애플리케이션은 실행을 위한 플랫폼으로 위에서 열거한 기술들을 지원하는 웹 브라우저를 이용한다. 이것을 지원하는 브라우저로는 모질라 파이어폭스, 인터넷 익스플로러, 오페라, 사파리, 구글 크롬 등이 있다. 단, 오페라는 현재 XSL 포맷팅 객체와 XSLT 변환을 지원하지 않는다.</li>
</ul>
<h3 id="4-클릭시-아래가-복사-되도록-하시오">4. 클릭시 아래가 복사 되도록 하시오</h3>
<p><img src="https://velog.velcdn.com/images/guryena_/post/f1f7f304-333f-4065-b3db-f1b779370e2c/image.png" alt=""></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
    &lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.6.3/jquery.min.js&quot;&gt;&lt;/script&gt;

    &lt;script&gt;
        $(document).ready(function () {

            $(&#39;#eDiv&#39;).click(function () {
            console.log(&quot;click event!&quot;);
            let copy = $(this).clone(this);
            copy.appendTo($(&#39;body&#39;));
        });

        $(&quot;#eDiv&quot;).mousedown(function () {
            console.log(&quot;mousedown event!&quot;);
        });

        $(&quot;#eDiv&quot;).mouseup(function () {
            console.log(&quot;mouseup event!&quot;);
        });

        $(&quot;#eDiv&quot;).mousemove(function () {
            console.log(&quot;mousemove event!&quot;);
        });

        $(&quot;#eDiv&quot;).mouseover(function () {
            console.log(&quot;mouseover event!&quot;);
        });

        $(&quot;#eDiv&quot;).mouseout(function () {
            console.log(&quot;mouseout event!&quot;);
        });

        $(&quot;#eDiv&quot;).mouseenter(function () {
            console.log(&quot;mouseenter event!&quot;);
        });

        $(&quot;#eDiv&quot;).mouseleave(function () {
            console.log(&quot;mouseleave event!&quot;);
        });
    })

    &lt;/script&gt;
    &lt;style&gt;
        #eDiv {
            width: 100px;
            height: 100px;
            background: #ff0000;
            line-height: 100px;
            text-align: center;
            color: #ffffff;
            font-weight: bolder;
            margin: 20px;
            display: inline-block;
        }
    &lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div id=&quot;eDiv&quot;&gt;jQuery Event&lt;/div&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 48일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-48%EC%9D%BC%EC%B0%A8-0eo9rk74</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-48%EC%9D%BC%EC%B0%A8-0eo9rk74</guid>
            <pubDate>Thu, 16 Mar 2023 10:10:28 GMT</pubDate>
            <description><![CDATA[<h3 id="1-remove-함수와-empty-함수의-차이는">1. remove 함수와 empty 함수의 차이는?</h3>
<pre><code>$(&quot;#removeMthod&quot;).remove();
$(&quot;#emptyMthod&quot;).empty();</code></pre><ul>
<li><p><code>$(dom).remove()</code>
<code>$(dom)</code>과 그 하위 요소를 전부 제거한다.
제거된 요소가 jQuery 데이터 형태로 유지되나, 제거된 요소 및 하위 요소들의 데이터, 이벤트는 전부 제거된다.</p>
</li>
<li><p><code>$(dom).empty()</code>
<code>$(dom)</code>의 하위요소들(텍스트 포함)을 제거한다.
자식 요소들의 데이터, 이벤트도 함께 제거된다.
detach와 달리, 제거된 요소가 데이터로 유지되지 않는다.
<img src="https://velog.velcdn.com/images/guryena_/post/088fe754-85fd-4ea2-99a4-d6dea3f7390e/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><code>$(dom).detach()</code>
<code>$(dom)</code>과 그 하위 요소를 전부 제거한다.
제거된 요소가 jQuery 데이터 형태로 유지되고, 제거된 요소의 데이터, 이벤트도 제거되지 않고 유지된다.
화면에서 제거하였다가 추후 재삽입할 경우 사용된다.
<img src="https://velog.velcdn.com/images/guryena_/post/851db523-2dc5-4251-94d5-a5251f738f99/image.png" alt=""></li>
</ul>
<h3 id="2-셀렉터html-vs-셀렉터text-vs-셀렉터val-의-차이는">2. <code>$(&quot;셀렉터&quot;).html()</code> vs <code>$(&quot;셀렉터&quot;).text()</code> vs <code>$(&quot;셀렉터&quot;).val()</code> 의 차이는?</h3>
<ul>
<li><p><code>$(&quot;셀렉터&quot;).html()</code>
<code>.html()</code>은 선택한 요소 안의 내용을 가져오거나, 다른 내용으로 바꾼다. <code>.text()</code>와 비슷하지만 태그의 처리가 다르다. HTML 태그를 포함하여 선택한 요소 안의 내용을 가져온다.</p>
<pre><code>var jb = $( &#39;h1&#39; ).html();</code></pre><p>h1 요소의 내용을 변수 jb에 저장한다.</p>
<pre><code>$( &#39;div&#39; ).html( &#39;&lt;h1&gt;Lorem&lt;/h1&gt;&#39; );</code></pre><p>이전 내용을 지우고 새로운 내용을 넣는다. div 요소의 내용을 <code>&lt;h1&gt;Lorem&lt;/h1&gt;</code>로 바꾼다.
div 요소 안의 내용을 가져와서 그 내용을 출력한다. div 요소가 여러 개 있으면 첫번째 요소의 내용을 가져온다. HTML 태그까지 함께 저장한다는 것에 주의한다.
div 요소 안의 내용을 지우고 새로운 내용을 넣는다. div 요소가 여러 개 있으면 모든 요소에 적용된다. 삽입하는 내용에 있는 HTML 태그는 텍스트가 아니라 태그로 인식한다.</p>
</li>
<li><p><code>$(&quot;셀렉터&quot;).text()</code>
<code>.text()</code>는 선택한 요소 안의 내용을 가져오거나, 다른 내용으로 바꾼다. <code>.html()</code>과 비슷하지만 태그의 처리가 다르다.</p>
<pre><code>var jb = $( &#39;h1&#39; ).text();</code></pre><p>h1 요소의 내용을 변수 jb에 저장한다.</p>
</li>
</ul>
<p><code>$( &#39;div&#39; ).html( &#39;&lt;h1&gt;Lorem&lt;/h1&gt;&#39; );</code>
이전 내용을 지우고 새로운 내용을 넣는다.
div 요소의 내용을 <code>&lt;h1&gt;Lorem&lt;/h1&gt;</code>로 바꾼다. HTML 태그는 텍스트로 처리한다.
div 요소 안의 내용을 가져와서 그 내용을 출력한다. div 요소가 여러 개 있으면 모든 내용을 가져온다. HTML 태그는 제외한다는 것에 주의한다.</p>
<ul>
<li><code>$(&quot;셀렉터&quot;).val()</code>
양식(form)의 값을 가져오거나 값을 설정하는 메소드이다.
<code>var jb = $( &#39;input#jbInput&#39; ).val();</code>
아이디가 jbInput인 input 요소의 값을 변수 jb에 저장한다.
<code>$( &#39;input#jbInput&#39; ).val( &#39;ABCDE&#39; );</code>
아이디가 jbInput인 input 요소의 값을 ABCDE로 정한다.</li>
</ul>
<h3 id="3-jquery-에-대하여-설명하시오">3. jquery 에 대하여 설명하시오.</h3>
<p> 제이쿼리는 자바스크립트 언어를 간편하게 사용할 수 있도록 단순화시킨 오픈 소스 기반의 자바스크립트 라이브러리이다.</p>
<p>제이쿼리를 이용하면 문서 객체 모델(DOM)과 이벤트에 관한 처리를 손쉽게 구현할 수 있다.</p>
<p>또한, Ajax 응용 프로그램 및 플러그인도 제이쿼리를 활용하여 빠르게 개발할 수 있다.</p>
<h3 id="4-아래를-구현하시오">4. 아래를 구현하시오.</h3>
<p><img src="https://velog.velcdn.com/images/guryena_/post/200f83b7-1826-49cc-bceb-7ab5d6c509c7/image.png" alt=""></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;체크 박스 선택 결과 출력&lt;/title&gt;

    &lt;script&gt;
        onload = function () {
            function checkboxHandler() {
                console.log(&quot;a&quot;);
                let checked = [];
                let boxValue = document.getElementsByClassName(&quot;li&quot;);
                for (let i = 0; i &lt; boxValue.length; i++) {
                    if (boxValue[i].checked == true) {
                        checked.push(boxValue[i].value);
                    }
                }

                // var checkedResult = document.getElementById(&quot;result-content&quot;);
                document.getElementById(&quot;result-content&quot;).innerHTML = checked.toString();

            }
            var checkboxButton = document.getElementById(&quot;result-button&quot;);
            checkboxButton.addEventListener(&quot;click&quot;, checkboxHandler);
        }
    &lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;h1&gt;취미&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;야구&lt;input class=&quot;li&quot; type=&quot;checkbox&quot; value=&quot;야구&quot;&gt;&lt;/li&gt;
        &lt;li&gt;농구&lt;input class=&quot;li&quot; type=&quot;checkbox&quot; value=&quot;농구&quot;&gt;&lt;/li&gt;
        &lt;li&gt;게임&lt;input class=&quot;li&quot; type=&quot;checkbox&quot; value=&quot;게임&quot; &gt;&lt;/li&gt;

        &lt;button id=&quot;result-button&quot;&gt;결과보기&lt;/button&gt;
        &lt;p&gt;결과값: &lt;br&gt;
        &lt;h1&gt;&lt;span id=&quot;result-content&quot;&gt;
                &lt;br&gt;

            &lt;/span&gt;&lt;/h1&gt;
        &lt;/p&gt;
    &lt;/ul&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 47일차 ]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-47%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-47%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 14 Mar 2023 08:39:05 GMT</pubDate>
            <description><![CDATA[<h3 id="1-dom-에-대하여-설명하시오">1. Dom 에 대하여 설명하시오.</h3>
<p>문서 객체 모델(The Document Object Model, 이하 DOM) 은 HTML, XML 문서의 프로그래밍 interface 이다.
DOM은 문서의 구조화된 표현(structured representation)을 제공하며 프로그래밍 언어가 DOM 구조에 접근할 수 있는 방법을 제공하여 그들이 문서 구조, 스타일, 내용 등을 변경할 수 있게 돕는다.
DOM 은 nodes와 objects로 문서를 표현한다. 이들은 웹 페이지를 스크립트 또는 프로그래밍 언어들에서 사용될 수 있게 연결시켜주는 역할을 담당한다.</p>
<p>이러한 DOM은 W3C의 표준 객체 모델이며, 다음과 같이 계층 구조로 표현된다.</p>
<p><img src="https://velog.velcdn.com/images/guryena_/post/015d858c-eb6e-4313-840b-883b6f6f10c9/image.png" alt=""></p>
<p>W3C DOM 표준은 세 가지 모델로 구분된다.</p>
<ol>
<li><p>Core DOM : 모든 문서 타입을 위한 DOM 모델</p>
</li>
<li><p>HTML DOM : HTML 문서를 위한 DOM 모델</p>
</li>
<li><p>XML DOM : XML 문서를 위한 DOM 모델</p>
</li>
</ol>
<h3 id="2-bom-에-대하여-설명하시오">2. Bom 에 대하여 설명하시오.</h3>
<p>자바스크립트를 이용하면 브라우저의 정보에 접근하거나 브라우저의 여러 기능들을 제어할 수 있다. 이때 사용할 수 있는 객체 모델이 바로 브라우저 객체 모델(BOM, Browser Object Model)이다.
브라우저 객체 모델(BOM)은 문서 객체 모델(DOM)과는 달리 W3C의 표준 객체 모델은 아니다. 하지만 이 모델은 자바스크립트가 브라우저의 기능적인 요소들을 직접 제어하고 관리할 방법을 제공한다.
자바스크립트에서는 이러한 BOM 모델의 객체들을 전역 객체(global object)로 사용할 수 있다.</p>
<ul>
<li>Window 객체
window 객체는 웹 브라우저의 창(window)을 나타내는 객체로, 대부분의 웹 브라우저에서 지원하고 있다.
자바스크립트의 모든 객체, 전역 함수, 전역 변수들은 자동으로 window 객체의 프로퍼티가 된다.
window 객체의 메소드는 전역 함수이며, window 객체의 프로퍼티는 전역 변수가 된다.
문서 객체 모델(DOM)의 요소들도 모두 window 객체의 프로퍼티가 된다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/guryena_/post/cad04ef4-6e99-4da2-bbe2-59511a1fed6a/image.png" alt=""></p>
<h3 id="3-자바스크립트에서-객체를-만드는-방법을-설명하시오">3. 자바스크립트에서 객체를 만드는 방법을 설명하시오.</h3>
<p>자바스크립트의 기본 타입(data type)은 객체(object)이다.
객체란 이름(name)과 값(value)으로 구성된 프로퍼티(property)의 정렬되지 않은 집합이다.
프로퍼티의 값으로 함수가 올 수도 있는데, 이러한 프로퍼티를 메소드(method)라고 한다.</p>
<ul>
<li>문법<pre><code>객체이름.프로퍼티이름
</code></pre></li>
</ul>
<p>또는</p>
<p>객체이름[&quot;프로퍼티이름&quot;]</p>
<p>var person = {</p>
<pre><code>name: &quot;홍길동&quot;,      // 이름 프로퍼티를 정의함.

birthday: &quot;030219&quot;,  // 생년월일 프로퍼티를 정의함.

pId: &quot;1234567&quot;,      // 개인 id 프로퍼티를 정의함.

fullId: function() { // 생년월일과 개인 id를 합쳐서 주민등록번호를 반환함.

    return this.birthday + this.pId;

}</code></pre><p>};</p>
<p>person.name    // 홍길동</p>
<p>person[&quot;name&quot;] // 홍길동</p>
<pre><code>
- 객체의 메소드 참조</code></pre><p>객체이름.메소드이름()
var person = {</p>
<pre><code>name: &quot;홍길동&quot;,

birthday: &quot;030219&quot;,

pId: &quot;1234567&quot;,

fullId: function() {

    return this.birthday + this.pId;

}</code></pre><p>};</p>
<p>person.fullId() // 0302191234567</p>
<p>person.fullId;  // function () { return this.birthday + this.pId; } </p>
<pre><code>

### 4. new Grade(국,영,수)를 코딩 하시오.(생성자 함수를 짜시오)</code></pre><p>function Grade(Kor, Eng, Math) {
    this.Kor = Kor;
    this.Eng = Eng;
    this.Math = Math;
    this.Sum = function () {
        let sum = this.Kor + this.Eng + this.Math;
        return sum;
    }
    this.Avg = function () {
        let avg = this.Sum()/3;
        return avg;
    }
}
const grade = new Grade(30, 60, 90);
console.log(grade.Sum());
console.log(grade.Avg());</p>
<pre><code>

### 5. 아래 코드에 대하여 10초 후에 사진이 변화 하도록 하시오.</code></pre><p>var str = &quot;&quot;;
str += &quot;<p id='jsTitle'> javascript &amp; node.js </p>&quot;;
str += &quot;&lt;img id=&#39;logoImg&#39;, src=&#39;./img/logo.png&#39;,&quot;;
str += &quot;width=&#39;170&#39;, height=&#39;67&#39;, tempData=&#39;logoImg&#39;&gt;&quot;;
document.body.innerHTML = str;
var titleNode = document.getElementById(&quot;jsTitle&quot;);
titleNode.innerHTML = &quot;<h1>JS &amp; node</h1>&quot;;
var logoNode = document.getElementById(&quot;logoImg&quot;);
logoNode.setAttribute(&quot;src&quot;, &quot;./img/arm_mbed.png&quot;);
logoNode.setAttribute(&quot;width&quot;, 297);
logoNode.setAttribute(&quot;height&quot;, 124);</p>
<pre><code></code></pre><p>window.onload = function () {
    let str = &quot;&quot;;
    str += &quot;&lt;img id = &#39;logoImg&#39;, src = &#39;logo.png&#39;, &quot;
    str += &quot;width=&#39;170&#39;, height=&#39;67&#39;, tempData=&#39;logoImg&#39;&gt;&quot;;</p>
<pre><code>document.body.innerHTML = str;

let logoNode = document.getElementById(&quot;logoImg&quot;);

let changeImg = setInterval(() =&gt; {
    logoNode.setAttribute(&quot;src&quot;, &quot;arm_mbed.png&quot;);
    document.body.appendChild(logoNode);    
}, 3000);</code></pre><p>}
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 46일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-46%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-46%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 14 Mar 2023 04:20:39 GMT</pubDate>
            <description><![CDATA[<h3 id="1-콜백함수란">1. 콜백함수란?</h3>
<p>프로그래밍에서 콜백(callback) 또는 콜백 함수(callback function)는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있다.</p>
<p>일반적으로 콜백수신 코드로 콜백 코드(함수)를 전달할 때는 콜백 함수의 포인터 (핸들), 서브루틴 또는 람다함수의 형태로 넘겨준다. 콜백수신 코드는 실행하는 동안에 넘겨받은 콜백 코드를 필요에 따라 호출하고 다른 작업을 실행하는 경우도 있다. 다른 방식으로는 콜백수신 코드는 넘겨받은 콜백 함수를 &#39;핸들러&#39;로서 등록하고, 콜백수신 함수의 동작 중 어떠한 반응의 일부로서 나중에 호출할 때 사용할 수도 있다 (비동기 콜백). 콜백은 폴리모피즘과 제네릭프로그래밍의 단순화된 대체 수법이며, 콜백 수신 함수의 정확한 동작은 콜백 함수에 의해 바뀐다. 콜백은 코드 재사용을 할 때 유용하다.
<img src="https://velog.velcdn.com/images/guryena_/post/4327f339-ce52-4789-afaf-bfcee3807793/image.png" alt=""></p>
<h3 id="2-함수에서-arguments-객체에-대하여-설명하시오">2. 함수에서 arguments 객체에 대하여 설명하시오.</h3>
<p>arguments 객체는 함수에 전달된 인수에 해당하는 Array 형태의 객체이다.</p>
<p>arguments 객체는 모든 함수 내에서 이용 가능한 지역 변수이다. arguments 객체를 사용하여 함수 내에서 모든 인수를 참조할 수 있으며, 호출할 때 제공한 인수 각각에 대한 항목을 갖고 있다. 항목의 인덱스는 0부터 시작한다.</p>
<h3 id="3-클로저에-대하여-설명하시오">3. 클로저에 대하여 설명하시오.</h3>
<p>내부함수와 밀접한 관계를 가지고 있는 주제다. 내부함수는 외부함수의 지역변수에 접근 할 수 있는데 외부함수의 실행이 끝나서 외부함수가 소멸된 이후에도 내부함수가 외부함수의 변수에 접근 할 수 있다. 이러한 메커니즘을 클로저라고 한다.</p>
<pre><code>    function init() {
      var name = &quot;Mozilla&quot;; // name은 init에 의해 생성된 지역 변수이다.
      function displayName() { // displayName() 은 내부 함수이며, 클로저다.
        alert(name); // 부모 함수에서 선언된 변수를 사용한다.
      }
      displayName();
    }
    init();</code></pre><p>클로저(Closure)는 일급 객체 함수(first-class functions)의 개념을 이용하여 스코프(scope)에 묶인 변수를 바인딩 하기 위한 일종의 기술이다. 기능상으로, 클로저는 함수를 저장한 레코드(record)이며, 스코프(scope)의 인수(Factor)들은 클로저가 만들어질 때 정의(define)되며, 스코프 내의 영역이 소멸(remove)되었어도 그에 대한 접근(access)은 독립된 복사본인 클로저를 통해 이루어질 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 45일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-45%EC%9D%BC%EC%B0%A8-wmlk2y75</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-45%EC%9D%BC%EC%B0%A8-wmlk2y75</guid>
            <pubDate>Fri, 10 Mar 2023 08:20:23 GMT</pubDate>
            <description><![CDATA[<h3 id="1-자바스크립트로-구구단을-짜시오">1. 자바스크립트로 구구단을 짜시오.</h3>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
    &lt;style&gt;
        #wrap {
            width: 90%;
            margin: auto;
            padding: 10px;
        }

        table {
            width: 100%;
            border: 2px black;
            border-style: dotted;
        }

        tr,
        td {
            border: 2px red;
            border-style: inset;
            font-style: italic;
            font-family: Verdana, Geneva, Tahoma, sans-serif;
            text-align: center;
        }

        .first {
            width: 5%;
        }

        .second {
            width: 10%;
        }
    &lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div id=&quot;wrap&quot;&gt;
        &lt;table&gt;
            &lt;script&gt;
                for (var y = 1; y &lt;= 10; y++) {
                    document.write(&quot;&lt;tr&gt;&quot;);
                    for (var x = 1; x &lt; 10; x++) {
                        if (y == 1) {
                            if (x == 1) {
                                document.write(&quot;&lt;td&gt;&lt;/td&gt;&quot;);
                            }
                            else if (x &gt; 1) {
                                document.write(&quot;&lt;td&gt;&quot; + x + &quot;단&quot; +&quot;&lt;/td&gt;&quot; );
                            }
                        }
                        else if (y &gt; 1) {
                            if (x == 1) {
                                var i = y-1;
                                document.write(&quot;&lt;td&gt;&quot; + i + &quot;&lt;/td&gt;&quot;);
                            }
                            else if (x &gt; 1) {
                                var result = x + &quot; x &quot; + y + &quot; = &quot; + x * y;
                                document.write(&quot;&lt;td&gt;&quot; + result + &quot;&lt;/td&gt;&quot;);
                            }
                        }
                    }
                    document.write(&quot;&lt;/tr&gt;&quot;);
                }
            &lt;/script&gt;
        &lt;/table&gt;
    &lt;/div&gt;

&lt;/body&gt;

&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/guryena_/post/f22388e5-9783-4d52-af53-0a9ccfafb168/image.png" alt=""></p>
<h3 id="2-자바-스크립트로-국영수-점수를-입력-받아--총점과-평균을-디스플레이-하시오">2. 자바 스크립트로 국영수 점수를 입력 받아 , 총점과 평균을 디스플레이 하시오.</h3>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
    &lt;script&gt;
        var retry = confirm(&quot;retry?&quot;);
        // document.write(retry);
        var kor = prompt(&quot;kor&quot;, &quot;input kor grade&quot;);
        var eng = prompt(&quot;eng&quot;, &quot;input eng grade&quot;);
        var math = prompt(&quot;math&quot;, &quot;input math grade&quot;);
        var sum = Number(kor) + Number(eng) + Number(math);
        var avg = sum / 3;
        document.write(&quot;sum : &quot; + sum + &quot;&lt;br&gt;&quot; + &quot;avg : &quot; + avg);
    &lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;

&lt;/body&gt;

&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/guryena_/post/7f617f4b-fb27-409e-8a13-60789d44eb4a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/guryena_/post/6b9f3236-5ffa-48b8-b70f-003e1ddca822/image.png" alt=""></p>
<h3 id="3-자바스크립트-데이터-타입에-대하여-정리-하시오">3. 자바스크립트 데이터 타입에 대하여 정리 하시오.</h3>
<blockquote>
<p>동적 타입
JavaScript는 느슨한 타입(loosely typed)의 동적(dynamic) 언어이다. JavaScript의 변수는 어떤 특정 타입과 연결되지 않으며, 모든 타입의 값으로 할당 (및 재할당) 가능하다.</p>
</blockquote>
<pre><code>let foo = 42 // foo가 숫자
foo = &#39;bar&#39; // foo가 이제 문자열
foo = true // foo가 이제 불리언</code></pre><blockquote>
<p>JavaScript의 타입
JavaScript 언어의 타입은 원시 값과 객체로 나뉜다.</p>
<blockquote>
<ul>
<li>원시 값 (언어의 최고 로우레벨에서 직접 표현되는 불변 데이터)
객체를 제외한 모든 타입은 불변 값(변경할 수 없는 값)을 정의한다. 예를 들어 (C 언어와는 달리) 문자열은 불변하다. 이런 일련의 타입을 &quot;원시 값&quot;이라고 한다.</li>
</ul>
<blockquote>
<ul>
<li>Boolean 타입
 논리 요소를 나타내며 true와 false 두 가지의 값을 가질 수 있다.</li>
</ul>
</blockquote>
</blockquote>
</blockquote>
<ul>
<li>Null 타입
Null 타입은 null 하나의 값만 가질 수 있다.</li>
<li>undefined 타입
값을 할당하지 않은 변수는 undefined 값을 가진다.</li>
<li>Number 타입
ECMAScript는 Number와 BigInt 두 가지의 내장 숫자 타입을 가지고 있다.
Number 타입은 배정밀도 64비트 이진 형식 IEEE 754 값(-(2^53 − 1)부터 2^53 − 1까지의 수)이다. Number 타입은 부동소수점 숫자 외에도 +Infinity, -Infinity, NaN(&quot;Not a Number&quot;) 세 개의 상징적인 값을 가진다.
±Infinity 범위 내에서 가능한 가장 크거나 작은 수를 확인하려면 Number.MAX_VALUE와 Number.MIN_VALUE 상수를 사용할 수 있다.</li>
<li>String 타입
JavaScript의 String 타입은 텍스트 데이터를 나타낼 때 사용한다. String은 16비트 부호 없는 정수 값 &quot;요소&quot;로 구성된 집합으로, 각각의 요소가 String의 한 자리를 차지한다. 첫 번째 요소는 인덱스 0에, 그 다음 요소는 인덱스 1, 그 다음은 2, ...이다. String의 길이는 그 안의 요소 수와 같다.
C 언어와 같은 일부 프로그래밍 언어와 달리 JavaScript 문자열은 불변하다. 즉 문자열을 생성한 후 바꾸는 것은 불가능하다.
그러나 원본 문자열을 사용해 새로운 문자열을 생성하는 것은 가능하다. 예를 들어,<blockquote>
<blockquote>
<blockquote>
<blockquote>
<p>원본 문자열에서 각각의 문자를 선택하거나 String.substr()을 사용해 생성한 부분문자열
연결 연산자(+)를 사용하거나 String.concat()을 사용해 두 개의 문자열을 합친 결과물</p>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</li>
<li>Symbol 타입
Symbol은 고유하고 변경 불가능한 원시 값이며 객체의 속성 키로 사용할 수 있다. 어떤 프로그래밍 언어들에선 &quot;아톰&quot;이라고 부르기도 한다.</li>
<li>객체 (속성의 컬렉션)
식별자로 참조할 수 있는 메모리 상의 값을 말한다.</li>
</ul>
<h3 id="4-typeof-함수란">4. typeof 함수란?</h3>
<p>typeof 연산자는 피연산자의 평가 전 자료형을 나타내는 문자열을 반환한다.</p>
<pre><code> typeof operand
 typeof(operand)</code></pre><p><img src="https://velog.velcdn.com/images/guryena_/post/e88f71d0-2e3e-402e-a204-c981ea17bba6/image.png" alt=""></p>
<h3 id="5-자바스크립트에서-스트링을-넘버형으로-바꾸는-방법은--자바에서도-어떻게-하는가-설명하시오">5. 자바스크립트에서 스트링을 넘버형으로 바꾸는 방법은 ? 자바에서도 어떻게 하는가 설명하시오.</h3>
<ul>
<li><p>JavaScript
Number()함수를 사용하여 JavaScript에서 문자열을 숫자로 변환
parseInt()함수를 사용하여 JavaScript에서 문자열을 정수로 변환
Math객체를 사용하여 JavaScript에서 문자열을 정수로 변환</p>
</li>
<li><p>Java
valueOf() 메서드는 특정 객체의 원시 값을 반환한다.</p>
<pre><code>object.valueOf(&#39;value&#39;);</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 44일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-44%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-44%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 08 Mar 2023 09:07:36 GMT</pubDate>
            <description><![CDATA[<h3 id="1-박스모델에-대하여-설명하시오">1. 박스모델에 대하여 설명하시오.</h3>
<p>문서의 레이아웃을 계산할 때, 브라우저의 렌더링 엔진은 표준 CSS 기본 박스 모델에 따라 각각의 요소를 사각형 박스로 표현한다. CSS는 박스의 크기, 위치, 속성(색, 배경, 테두리 모양 등)을 결정한다.</p>
<p>하나의 박스는 네 부분(영역)으로 이루어진다. 각 영역을 콘텐츠 영역, 안쪽 여백(패딩) 영역, 테두리 영역, 그리고 바깥 여백(마진) 영역이라고 부른다.</p>
<ul>
<li><p>CSS Box model
콘텐츠 영역(content area)은 콘텐츠 경계(content edge)가 감싼 영역으로, 글이나 이미지, 비디오 등 요소의 실제 내용을 포함한다. 콘텐츠 영역의 크기는 콘텐츠 너비(콘텐츠 박스 너비)와 콘텐츠 높이(콘텐츠 박스 높이)이다. 배경색과 배경 이미지를 가지고 있기도 한다.
box-sizing 속성의 값이 기본값인 content-box이며 요소가 블록 레벨 요소인 경우, 콘텐츠 영역의 크기를 width, min-width, max-width, height, min-height, max-height 속성을 사용해 사용해 명시적으로 설정할 수 있다.</p>
</li>
<li><p>안쪽 여백 영역(패딩 영역, padding area)은 안쪽 여백 경계(padding edge)가 감싼 영역으로, 콘텐츠 영역을 요소의 안쪽 여백까지 포함하는 크기로 확장한다. 영역의 크기는 안쪽 여백 박스 너비와 안쪽 여백 박스 높이이다.
안쪽 여백의 두께는 padding-top, padding-right, padding-bottom, padding-left와 단축 속성인 padding이 결정한다.</p>
</li>
<li><p>테두리 영역(border area)은 테두리 경계(border edge)가 감싼 영역으로, 안쪽 여백 영역을 요소의 테두리까지 포함하는 크기로 확장한다. 영역의 크기는 테두리 박스 너비와 테두리 박스 높이이다.
테두리의 두께는 border-width와 단축 속성인 border가 결정한다. box-sizing 속성의 값이 border-box라면 테두리 영역의 크기를 width, min-width, max-width, height, min-height, max-height 속성을 사용해 명시적으로 설정할 수 있다. 박스의 배경(background-color 또는 background-image)은 테두리의 바깥 경계까지 늘어나고, 그릴 땐 테두리에 가려진다. 이 동작 방식은 background-clip 속성으로 바꿀 수 있다.</p>
</li>
<li><p>바깥 여백 영역(마진 영역, margin area)은 바깥 여백 경계(margin edge)가 감싼 영역으로, 테두리 요소를 확장해 요소와 인근 요소 사이의 빈 공간까지 포함하도록 만든다. 영역의 크기는 바깥 여백 박스 너비와 바깥 여백 박스 높이이다.
바깥 여백 영역의 크기는 margin-top, margin-right, margin-bottom, margin-left와 단축 속성인 margin이 결정한다. 여백 상쇄가 발생할 때는 요소 간에 바깥 여백이 공유되므로 여백 영역이 명확하게 결정되지 않다.</p>
</li>
</ul>
<p>끝으로, 비대체 인라인 요소가 차지하는 공간의 크기(줄 높이에 기여하는 양)는, 요소 주위에 테두리와 안쪽 여백이 표시되더라도 line-height (en-US) 속성으로 결정한다는 점을 주의하라.</p>
<h3 id="2-float-에-대하여-설명-하시오">2. float 에 대하여 설명 하시오.</h3>
<p>CSS 속성(property) float 은 한 요소(element)가 보통 흐름(normal flow)으로부터 빠져 텍스트 및 인라인(inline) 요소가 그 주위를 감싸는 자기 컨테이너의 좌우측을 따라 배치되어야 함을 지정한다.</p>
<ul>
<li>float : left;
<img src="https://velog.velcdn.com/images/guryena_/post/864061e0-dfe9-4776-b490-84d3b99fcd77/image.png" alt=""></li>
<li>float : right;
<img src="https://velog.velcdn.com/images/guryena_/post/c0b64e7c-4868-4505-8512-32e9c9ab049c/image.png" alt=""></li>
</ul>
<h3 id="3-마진과-패딩의-차이는">3. 마진과, 패딩의 차이는</h3>
<ul>
<li><p>margin
margin CSS 속성은 요소의 네 방향 바깥 여백 영역을 설정한다. margin-top, margin-right, margin-bottom, margin-left의 단축 속성이다.
위와 아래 여백은 대체 요소가 아닌 <span>, <code> 등 인라인 요소에선 아무 효과도 없다.</p>
</li>
<li><p>padding
padding CSS 속성은 요소의 네 방향 안쪽 여백 영역을 설정합니다. padding-top, padding-right, padding-bottom, padding-left의 단축 속성이다.
<img src="https://velog.velcdn.com/images/guryena_/post/baaf4640-9f4f-49f7-a3aa-7071d0a3b0e6/image.png" alt="">
요소의 안쪽 여백 영역은 콘텐츠와 테두리 사이의 공간이다.</p>
</li>
</ul>
<h3 id="4-아래를-구현하시오">4. 아래를 구현하시오.</h3>
<p>  <img src="https://velog.velcdn.com/images/guryena_/post/e822eaff-7853-4a4e-8d36-06d51d7c429a/image.png" alt=""></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Test02&lt;/title&gt;
    &lt;style&gt;
        #wrap {
            width: 800px;
            margin: 0 auto;
            /* overflow: hidden; */
            padding: 10px;
            /* box-sizing: border-box; */
        }
        h1{
            line-height: 100px;
        }
        #header, #footer{
            height: 100px;
            background-color: blue;
        }
        #header{
            text-align: center;
        }
        #contents{
            height: 200px;
            border-top: 1px solid red;
            border-bottom: 1px solid red;
        }
        #contents p:nth-child(1){
            width: 70%;
            height: 200px;
            float: left;
            display: inline;
            background-color: yellowgreen;
            margin: auto;
            padding-top: 10px;
            padding-left: 5px;
            box-sizing:border-box;

        }
        #contents p:nth-child(2) {
            width: 30%;
            height: 200px;
            padding-top: 10px;
            padding-left: 5px;
            float: right;
            display: inline;
            margin: auto;
            background-color: purple;
            box-sizing:border-box;
        }

    &lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;div id=&quot;wrap&quot;&gt;
        &lt;div id=&quot;header&quot;&gt;
            &lt;h1&gt;고정 그리드 레이아웃&lt;/h1&gt;
        &lt;/div&gt;
        &lt;div id=&quot;contents&quot;&gt;
            &lt;p&gt;본문&lt;/p&gt;
            &lt;p&gt;사이드바&lt;/p&gt;
        &lt;/div&gt;
        &lt;div id=&quot;footer&quot;&gt;
            푸터
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre><h3 id="5-line-height-의-용도는">5. line-height 의 용도는?</h3>
<p>선 높이 CSS 속성은 선 상자의 높이를 설정한다. 일반적으로 텍스트 줄 사이의 거리를 설정하는 데 사용된다. 블록 레벨 요소에서는 요소 내에서 선 상자의 최소 높이를 지정한다. 교체되지 않은 인라인 요소에서는 선 상자 높이를 계산하는 데 사용되는 높이를 지정한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 43일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-43%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-43%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 07 Mar 2023 08:10:56 GMT</pubDate>
            <description><![CDATA[<h3 id="1-선택자selectors란-그리고-종류는">1. 선택자(Selectors)란 그리고 종류는?</h3>
<p>CSS 선택자는 CSS 규칙을 적용할 요소를 정의한다.</p>
<blockquote>
<p>유형 선택자
html에 div 또는 span으로 정의한 경우 해당 선택자를 css에 사용한다.</p>
</blockquote>
<pre><code>div {
  width: 300px;
}</code></pre><p>html로 코딩된 모든 div를 선택하기 때문에 header, nav, section, article로 나눈다</p>
<blockquote>
</blockquote>
<p>전체 선택자
*{}로 접근하여 전역으로 영향을 미친다.</p>
<blockquote>
</blockquote>
<p>id 선택자</p>
<pre><code>&lt;div id=&quot;name&quot;&gt;id selector&lt;/div&gt;
&lt;style&gt;
  #id {
    width: 100px;
  }
&lt;/style&gt;</code></pre><blockquote>
</blockquote>
<p>class 선택자</p>
<pre><code>&lt;div class=&quot;name name2&quot;&gt;id selector&lt;/div&gt;
&lt;style&gt;
  .name {
    width: 100px;
  }
  .name2 {
    height: 200px;
  }
&lt;/style&gt;</code></pre><blockquote>
</blockquote>
<p>자식 선택자
바로 아래 있는 요소만 선택된다.</p>
<blockquote>
</blockquote>
<p>즉 하나 아래 자식만 선택되고 한번더 nesting된 자식은 선택되지 않는다.</p>
<pre><code>&lt;div class=&quot;div_box&quot;&gt;
  &lt;div&gt;
    children
    &lt;div&gt;not selected&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
  div.div_box &gt; div {
    background: orange;
  }
&lt;/style&gt;</code></pre><blockquote>
</blockquote>
<p>자손 선택자
하위 자손 모두 선택한다.</p>
<blockquote>
</blockquote>
<p>1, 2, 2-1 모두 선택됩니다.</p>
<pre><code>&lt;section&gt;
  &lt;div&gt;1&lt;/div&gt;
  &lt;div&gt;
    2
    &lt;div&gt;2-1&lt;/div&gt;
  &lt;/div&gt;
&lt;/section&gt;
&lt;style&gt;
  /* section안의 div를 모두 가져온다 */
  section div {
    background: orange;
  }
&lt;/style&gt;</code></pre><blockquote>
</blockquote>
<p>인접(형제) 선택자</p>
<ul>
<li>기호를 사용한다.<blockquote>
</blockquote>
앞의 요소 바로 다음 요소만 사용 가능하다.<pre><code>&lt;div&gt;
&lt;input type=&quot;checkbox&quot; id=&quot;checkform&quot; /&gt;
&lt;label for=&quot;checkform&quot;&gt;
  &lt;em&gt;&lt;/em&gt;
&lt;/label&gt;
&lt;/div&gt;</code></pre><pre><code>&lt;style&gt;
input[id=&quot;checkform&quot;] {
  display: none;
}
input[id=&quot;checkform&quot;] + label em {
  padding: 10px;
}
&lt;/style&gt;</code></pre></li>
</ul>
<blockquote>
</blockquote>
<p>속성 선택자
#element[attr=&quot;value&quot;]
attr는 기본요소에 추가적으로 들어오는 값</p>
<pre><code>&lt;!-- name이 attr --&gt;
&lt;input type=&quot;text&quot; name=&quot;user-id&quot; /&gt;
&lt;style&gt;
  input[name=&quot;user-id&quot;] {
    background: red;
  }
&lt;/style&gt;</code></pre><p>#element[attr^=&quot;value&quot;]</p>
<blockquote>
</blockquote>
<p>해당 속성을 가진 선택자를 모두 사용한다.</p>
<pre><code>&lt;div&gt;
  &lt;a href=&quot;http://naver.com&quot;&gt;네이버&lt;/a&gt;
  &lt;a href=&quot;http://google.com&quot;&gt;구글&lt;/a&gt;
  &lt;!-- 요건 http가 없어서 css 안먹음 --&gt;
  &lt;a href=&quot;youtube.com&quot;&gt;유튜브&lt;/a&gt;
&lt;/div&gt;
&lt;style&gt;
  a[href^=&quot;http&quot;] {
    background: red;
  }
&lt;/style&gt;</code></pre><p>#element[attr$=&quot;value&quot;]
value로 끝나는 속성을 가져온다</p>
<pre><code>&lt;div&gt;
  &lt;a href=&quot;/file/selector.pdf&quot;&gt;네이버&lt;/a&gt;
&lt;/div&gt;
&lt;style&gt;
  a[href$=&quot;.pdf&quot;] {
    background: red;
  }
&lt;/style&gt;</code></pre><p>#element[attr*=&quot;value&quot;]
value를 포함한 요소를 가져온다</p>
<pre><code>&lt;div&gt;
  &lt;a href=&quot;http://naver.com&quot;&gt;네이버&lt;/a&gt;
  &lt;a href=&quot;http://naverblog.com&quot;&gt;블로그&lt;/a&gt;
  &lt;a href=&quot;http://news-naver.com&quot;&gt;블로그&lt;/a&gt;
&lt;/div&gt;
&lt;style&gt;
  a[href*=&quot;naver&quot;] {
    background: red;
  }
&lt;/style&gt;</code></pre><p>#구조적 가상요소 선택자
#:first-child
첫번째 요소 가져옴</p>
<blockquote>
</blockquote>
<p>#:last-child
마지막 요소 가져옴</p>
<blockquote>
</blockquote>
<p>#:nth-child(n)
n번째 요소 가져옴</p>
<h3 id="2-css-란">2. CSS 란?</h3>
<p>종속형 시트 또는 캐스케이딩 스타일 시트(영어: Cascading Style Sheet)는 마크업 언어가 실제 표시되는 방법을 기술하는 스타일 언어(영어: Style sheet language 스타일 시트 랭귀지)로, HTML과 XHTML에 주로 쓰이며, XML에서도 사용할 수 있다. W3C의 표준이고, 레이아웃과 스타일을 정의할 때의 자유도가 높다.</p>
<p>기본 파일명은 style.css이다.</p>
<p>마크업 언어(ex: HTML)가 웹사이트의 몸체를 담당한다면 CSS는 옷과 액세서리처럼 꾸미는 역할을 담당한다고 할 수 있다. 즉, HTML 구조는 그대로 두고 CSS 파일만 변경해도 전혀 다른 웹사이트처럼 꾸밀 수 있다.</p>
<h3 id="3-시멘틱semantic-태그에-대하여-설명하고-그-종류는">3. 시멘틱(Semantic) 태그에 대하여 설명하고, 그 종류는?</h3>
<p>시맨틱(semantic)이라는 &#39;의미의&#39;, &#39;의미론적인&#39;라는 뜻을 가진 형용사이다.
즉, 시맨틱 태그는 의미를 부여한 태그라는 뜻이다.</p>
<p>&lt;<em>div</em>&gt;태그에 의미를 부여했다고 생각하시면 이해가 편하다. 이런 시맨틱 태그는 HTML5에서는 처음 등장하였다. 예를 들자면 &lt;<em>header</em>&gt;나 &lt;<em>footer</em>&gt; 같은 태그들을 말한다. 이 태그들은 이름만 봐도 상단과 하단이라는 것이다. 이렇게 시맨틱 태그의 등장으로 인해 우리는 태그만 보고서도 문서를 더 쉽게 이해할 수 있게 되었다.</p>
<blockquote>
</blockquote>
<h4 id="사용하는-이유">사용하는 이유</h4>
<p>HTML 문서의 가독성과 유지보수가 쉬워진다. 만약 모든 태그들을 div로 만들었다고 가정한다. HTML 문서가 길어진다면 어디가 어느 부분인지, 어떤 영역인지 한눈에 파악하기가 힘들어진다. 하지만 시맨틱 태그를 활용하면 유지보수를 할 때나 다른 작업자가 코드를 파악하기가 보다 쉬워진다.
웹 브라우저가 HTML만 보고도 상단(header), 본문(main), 하단(footer), 사이드(aside) 어느 영역인지 쉽게 알 수 있다. 이는 웹 접근성 시각에서 볼 때도 중요하게 사용된다. 예를 들어 시각장애인들이 사이트를 사용할 때 사용되는 화면의 텍스트를 읽어주는 스크린 리더기 등을 통해 활용될 수 있다.
검색엔진이 검색을 수행할 때 HTML내의 태그를 분석할 수 있다. 예를 들자면 검색엔진의 검색로봇에서는 <article> 태그가 사용된 콘텐츠를 재배포할 수 있는 콘텐츠로 인식한다. 반대로 <section> 태그로 묶은 콘텐츠는 재 배포를 금지하는 콘텐츠로 인식한다. </p>
<p>  <img src="https://velog.velcdn.com/images/guryena_/post/4262fc26-009c-414d-a26f-6318551eab43/image.png" alt=""></p>
<h3 id="4-class-와-id-선택자의-차이와-어떨-때-사용하는가">4. class 와 id 선택자의 차이와 어떨 때 사용하는가?</h3>
<ul>
<li><p>아이디 선택자는 동일한 이름을 부여할 수 없고, 하나의 태그에 이름을 정해서 디자인을 할 수 있다.
html 표시 : id=&quot;이름&quot;  / css 표시 : #이름<br/>
아이디 선택자는 HTML 요소의 id 속성 값을 참조하여 선택하는 방법으로, 이때 id 속성 값은 하나의 HTML 문서에 한 번만 사용할 수 있기 때문에 아이디 선택자를 사용하면 유일한 요소를 선택할 수 있다.</p>
<br/>
- 클래스 선택자는 동일한 이름을 가질 수 있고, 여러 곳에 적용해서 디자인을 할 수 있다. 
html 표시 : class="이름" / css 표시 : .이름<br/>
클래스 선택자는 HTML 요소의 class 속성 값을 참조하여 선택하는 방법으로, 이때 class 속성 값은 하나의 HTML 요소에 여러 개를 지정할 수 있기 때문에 다중 class를 선택자로 지정할 수도 있다.


</li>
</ul>
<h3 id="5-px-과-em-의-차이는-font">5. px 과 em 의 차이는? (font)</h3>
<p>CSS의 단위로는 절대 단위와 상대 단위가 있다. px는 절대 단위이고, 이외의 cm, mm, ic(인치), pc, pt(포인트) 등이 있다. 상대 단위로는 em, ch, rem, vh, vw 등이 있다. 대부분의 브라우저에서는 폰트 사이즈의 기본값이 12pt, 16pt, 1em, 100%로 이루어져 있다.</p>
<ul>
<li><p>px
픽셀인 px는 ** 모니터에 따라 상대적인 크기**를 가짐으로써, 반응형 웹에는 적절하지 않다. 그렇기 때문에 웹디자인의 경우 px를 권장하지 않는다.</p>
</li>
<li><p>em &amp; rem
em은 ** 부모 요소의 글꼴 크기 <strong>를 의미하고, rem은 ** 루트 요소의 글꼴 크기</strong>를 의미한다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 42일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-42%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-42%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 06 Mar 2023 08:56:49 GMT</pubDate>
            <description><![CDATA[<h3 id="1-mime-type-이란">1. mime type 이란?</h3>
<p>Multipurpose Internet Mail Extensions의 약자로써 파일 변환을 뜻한다.
MIME은 이메일과 함께 동봉할 파일을 텍스트 문자로 전환하여 이메일 시스템을 통해 전달하기 위해 개발되었기 때문에 Internet Mial Extension이다.</p>
<h3 id="2-블럭-태그와-인라인-태그의-차이는">2. 블럭 태그와 인라인 태그의 차이는?</h3>
<blockquote>
<p>Block 태그는 box를 치는 태그들이라고 생각하면 편하다. 전체적인 틀을 짠다던지 구조를 만들 때 사용하는 태그들은 Block 태그들이다.
<b/></p>
</blockquote>
<ul>
<li>자신의 내용과 앞뒤 태그의 내용을 다른 라인에 출력하는 태그</li>
<li>자신의 내용만으로 한 라인을 독점해서 출력하는 태그(*)</li>
<li>영역(구조)을 만들때 사용 &gt; 컨테이너 역할 &gt; 레이아웃 구성(틀 만들기)</li>
<li>내용물의 크기와 상관없이 너비는 항상 100%, 높이는 내용물의 크기에 맞춰 변화</li>
</ul>
<blockquote>
<p>Inline 태그는 위에 block 태그와는 다르게 내용을 적는 태그라 생각하면 된다. 블록 태그로 짜여진 틀 안에 내용을 적을 때 사용하는 태그들이다. 
<b/></p>
</blockquote>
<ul>
<li>자신의 내용과 앞뒤 태그의 내용을 같은 라인에 출력하는 태그</li>
<li>구성 요소 역할을 한다.(출력 내용 역할)</li>
<li>내용물의 크기가 태그의 영역이 된다.</li>
</ul>
<h3 id="3-태그들을-블럭태그와-인락인-태그의-종류를-나열-하시오">3. 태그들을 블럭태그와 인락인 태그의 종류를 나열 하시오.</h3>
<blockquote>
<ul>
<li>Block 태그
&lt; div &gt;, Division </li>
</ul>
</blockquote>
<ul>
<li>사용자 정의 영역을 표현 </li>
<li>정해진 역할이 없음 </li>
<li>블럭태그 +CSS, Javascript    <b/>
기타 블럭 태그 종류
```
<address>, <article>, <aside>, <audio>, <blockquote>, <canvas>, <dd>, <div>, <dl>, <fieldset>, <figcaption>, <figure>, <footer>, <form>, <h1>, <h2>, <h3>, <h4>, <h5>, <h6>, <header>, <hgroup>, <hr>, <noscript>, <ol>, <output>, <p>, <pre>, <section>, <table>, <ul>, <video>
```

</li>
</ul>
<blockquote>
<ul>
<li>Inline 태그
&lt; span &gt;, Span</li>
</ul>
</blockquote>
<ul>
<li>사용자 정의 영역을 표현</li>
<li>정해진 역할이 없음</li>
<li>인라인 태그+CSS, Javascript<b/>
기타 인라인 태그 종류
```
<a>, <abbr>, <acronym>, <b>, <bdo>, <big>, <br/>, <button>, <cite>, <code>, <dfn>, <em>, <i>, <img>, <input>, <kbd>, <label>, <map>, <object>, <q>, <samp>, <small>, <script>, <select>, <span>, <strong>, <sub>, <sup>, <textarea>, <tt>, <var>
```




</li>
</ul>
<h3 id="4get-방식과-post-방식의-차이란">4.get 방식과 post 방식의 차이란?</h3>
<p>form 태그의 method 속성은 폼 데이터(form data)가 서버로 제출될 때 사용되는 HTTP 메소드를 명시한다.
method 속성은 속성값으로는 GET과 POST 두 가지 중 하나를 선택할 수 있다.</p>
<blockquote>
<p>GET 방식은 URL에 폼 데이터를 추가하여 서버로 전달하는 방식이다.
GET 방식의 HTTP 요청은 브라우저에 의해 캐시되어(cached) 저장된다.
또한, GET 방식은 보통 쿼리 문자열(query string)에 포함되어 전송되므로, 길이의 제한이 있다.
<b/>
따라서 보안상 취약점이 존재하므로, 중요한 데이터는 POST 방식을 사용하여 요청하는 것이 좋다.</p>
</blockquote>
<blockquote>
<p>POST 방식은 폼 데이터를 별도로 첨부하여 서버로 전달하는 방식이다.
POST 방식의 HTTP 요청은 브라우저에 의해 캐시되지 않으므로, 브라우저 히스토리에도 남지 않다.
또한, POST 방식의 HTTP 요청에 의한 데이터는 쿼리 문자열과는 별도로 전송된다.
따라서 데이터의 길이에 대한 제한도 없으며, GET 방식보다 보안성이 높다.</p>
</blockquote>
<h3 id="5아래를-코딩-하시오">5.아래를 코딩 하시오.</h3>
<p><img src="https://velog.velcdn.com/images/guryena_/post/68e75906-9100-43d7-986d-c785288cc34e/image.png" alt=""></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Form&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;form action=&quot;#&quot; method=&quot;post&quot;&gt;
        이름 : &lt;input type=&quot;text&quot; name=&quot;uname&quot; size=&quot;10&quot; /&gt;&lt;br /&gt;

        아이디 : &lt;input type=&quot;text&quot; name=&quot;uid&quot; /&gt;&lt;br /&gt;

        비밀번호 : &lt;input type=&quot;password&quot; name=&quot;upw&quot; /&gt;&lt;br /&gt;

        연락처 : &lt;input type=&quot;text&quot; name=&quot;uphone1&quot; size=&quot;5&quot;&gt; -
        &lt;input type=&quot;text&quot; name=&quot;uphone2&quot; size=&quot;5&quot;&gt; -
        &lt;input type=&quot;text&quot; name=&quot;uphone3&quot; size=&quot;5&quot;&gt;&lt;br /&gt;

        사진 : &lt;input type=&quot;file&quot; name=&quot;upic&quot;&gt;&lt;br /&gt;

        성별 : &lt;input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;m&quot;&gt;남
        &lt;input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;f&quot;&gt;여&lt;br /&gt;

        언어 : &lt;input type=&quot;checkbox&quot; name=&quot;lan&quot; value=&quot;kor&quot; checked=&quot;checked&quot;&gt;한글
        &lt;input type=&quot;checkbox&quot; name=&quot;lan&quot; value=&quot;eng&quot; checked=&quot;checked&quot;&gt;영어
        &lt;input type=&quot;checkbox&quot; name=&quot;lan&quot; value=&quot;jap&quot; checked=&quot;checked&quot;&gt;일어
        &lt;input type=&quot;checkbox&quot; name=&quot;lan&quot; value=&quot;chi&quot; checked=&quot;checked&quot;&gt;중국어
        &lt;br /&gt;

        자기소개 : &lt;textarea rows=&quot;5&quot; cols=&quot;20&quot;&gt;간단하게 입력하세요.&lt;/textarea&gt;&lt;br /&gt;

        국적 : &lt;select&gt;
            &lt;option&gt;KOREA&lt;/option&gt;
            &lt;option&gt;USA&lt;/option&gt;
            &lt;option&gt;JAPAN&lt;/option&gt;
            &lt;option&gt;CHINA&lt;/option&gt;
        &lt;/select&gt;&lt;br /&gt;

        좋아하는 음식 : &lt;select multiple=&quot;multiple&quot;&gt;
            &lt;option&gt;김치&lt;/option&gt;
            &lt;option&gt;불고기&lt;/option&gt;
            &lt;option&gt;파전&lt;/option&gt;
            &lt;option&gt;비빔밥&lt;/option&gt;
        &lt;/select&gt;&lt;br /&gt;
        &lt;input type=&quot;submit&quot; /&gt;
    &lt;/form&gt;
&lt;/body&gt;

&lt;/html&gt;
</code></pre><h3 id="6form-태그에-대하여-설명하시오">6.form 태그에 대하여 설명하시오.</h3>
<p>정의 및 특징
&lt; form &gt; 태그는 사용자로부터 입력을 받을 수 있는 HTLM 입력 폼(form)을 정의할 때 사용한다.
로그인 창이나, 회원가입 폼 등이 이에 해당된다.
텍스트 필드에 글자를 입력하거나, 체크박스나 라디오 버튼을 클릭하고 제출 버튼을 누르면 백엔드 서버에 양식이 전달되어 정보를 처리하게 된다.</p>
<p>&lt; form &gt; 요소는 다음과 같은 요소들을 하나 이상 포함할 수 있다.</p>
<pre><code>- &lt;button&gt;

- &lt;fieldset&gt;

- &lt;input&gt;

- &lt;label&gt;

- &lt;option&gt;

- &lt;optgroup&gt;

- &lt;select&gt;

- &lt;textarea&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 41일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-41%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-41%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 28 Feb 2023 08:55:38 GMT</pubDate>
            <description><![CDATA[<h3 id="1서버-클라이언트-일대일-채팅-프로그램을-짜시오">1.서버 클라이언트 일대일 채팅 프로그램을 짜시오.</h3>
<ul>
<li>서버<pre><code>import java.net.ServerSocket;
import java.net.Socket;
</code></pre></li>
</ul>
<p>public class TcpServer {</p>
<pre><code>public static void main(String[] args) {
    ServerSocket serverSocket = null; // Create Server socket
    Socket socket = null; // Create Client socket

    try {
        serverSocket = new ServerSocket(7777); // 7777=port number
        socket = serverSocket.accept(); // Accept to Server

        Sender sender = new Sender(socket);
        Receiver receiver = new Receiver(socket);

        sender.start();
        receiver.start();

    } catch (Exception e) {
        e.printStackTrace();
    }
}</code></pre><p>}</p>
<pre><code></code></pre><p>import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;</p>
<p>public class Sender extends Thread {
    Socket socket;
    DataOutputStream out;
    String name;</p>
<pre><code>public Sender(Socket socket) {
    this.socket = socket;

    try {
        out = new DataOutputStream(socket.getOutputStream());
        name = &quot;[&quot; + socket.getInetAddress() + &quot;:&quot; + socket.getPort() + &quot;]&quot;;
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void run() {
    Scanner scanner = new Scanner(System.in);
    while (out != null) {
        try {
            out.writeUTF(name + scanner.nextLine());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}</code></pre><p>}</p>
<pre><code>- 클라이언트</code></pre><p>import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;</p>
<p>public class Receiver extends Thread {
    Socket socket;
    DataInputStream in;
    String name;</p>
<pre><code>public Receiver(Socket socket) {
    this.socket = socket;

    try {
        in = new DataInputStream(socket.getInputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void run() {
    Scanner scanner = new Scanner(System.in);
    while (in != null) {
        try {
            System.out.println(in.readUTF()); // UTF is don&#39;t crash korea

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}</code></pre><p>}</p>
<pre><code></code></pre><p>import java.net.Socket;</p>
<p>public class TcpClient {</p>
<pre><code>public static void main(String[] args) {
    String serverIP = &quot;127.0.0.1&quot;; // It&#39;s myself IP
    try {
        Socket socket = new Socket(serverIP, 7777);

        System.out.println(&quot;Connect Server&quot;);

        Sender sender = new Sender(socket);
        Receiver receiver = new Receiver(socket);

        sender.start();
        receiver.start();

    } catch (Exception e) {
        e.printStackTrace();
    }
}</code></pre><p>}</p>
<p>```</p>
<h3 id="2-socket-에-대하여-설명하시오">2. Socket 에 대하여 설명하시오.</h3>
<p>소켓은 특정한 파이프의 끝, 파이프 이음쇠 또는 위생 기구를 수용하기 위해 확장한 것으로, 또 다른 파이프의 끝이나 파이프 이음쇠을 가리킨다. 또한 소켓(socket)은 통신선 또는 전기선, 전구 따위를 끼워 넣어 연결선과 접속하게 하는 연결기구를 가리킨다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 40일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-40%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-40%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 24 Feb 2023 09:23:41 GMT</pubDate>
            <description><![CDATA[<h3 id="1-단일-프로세스와-멀티-프로세스에-대하여-설명하시오">1. 단일 프로세스와 멀티 프로세스에 대하여 설명하시오.</h3>
<ul>
<li><p>스레드(Thread)
스레드는 CPU의 이용의 기본 단위다.
프로세스 내에서 프로그램 명령을 실행하는 기본 단위이자 흐름, 개체라고 할 수 있다.
스레드는 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택 으로 구성된다.
스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 열린 파일이나 신호와 같은 운영체제 자원들을 공유한다.</p>
<b/>
프로세스에 하나의 제어 모델이 있으면 단일 스레드이며,
프로세스가 다수의 제어 스레드를 가진다면 다중 스레드 모델이다.
</li>
<li><p>단일 스레드</p>
<blockquote>
<p>하나의 프로세스에서 하나의 스레드 실행
하나의 레지스터와 스택으로 표현</p>
</blockquote>
</li>
<li><p>멀티 스레드</p>
<blockquote>
<p>프로그램을 다수의 실행 단위로 나누어 실행
프로세스 내에서 자원을 공유하여 자원생성과 관리의 중복을 최소화
서버가 많은 요청을 효율적으로 수행할 수 있는 환경을 제공
각각의 스레드가 고유의 레지스터와 스택으로 표현됨</p>
</blockquote>
</li>
</ul>
<h3 id="2-프로세스와-쓰레드의-차이는">2. 프로세스와 쓰레드의 차이는?</h3>
<ul>
<li><p>프로그램(Program)
사전적 의미
“어떤 작업을 위해 실행할 수 있는 파일”</p>
</li>
<li><p>프로세스(Process) 란</p>
<blockquote>
<ul>
<li>사전적 의미
“컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램”
메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
운영체제로부터 시스템 자원을 할당받는 작업의 단위
즉, 동적인 개념으로는 실행된 프로그램을 의미한다.<b/></li>
<li>할당받는 시스템 자원의 예
CPU 시간
운영되기 위해 필요한 주소 공간
Code, Data, Stack, Heap의 구조로 되어 있는 독립된 메모리 영역<b/>
프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다.
Ex. 파이프, 파일, 소켓 등을 이용한 통신 방법 이용
</li>
</ul>
</blockquote>
</li>
<li><p>스레드(Thread)</p>
<blockquote>
<ul>
<li>사전적 의미
“프로세스 내에서 실행되는 여러 흐름의 단위”
프로세스의 특정한 수행 경로
프로세스가 할당받은 자원을 이용하는 실행의 단위<b/></li>
<li>특징
스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행된다.
같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다. 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.</li>
</ul>
</blockquote>
</li>
</ul>
<h3 id="3아래의-가로-찍기와-세로찍기를-쓰레드로-돌리시오">3.아래의 가로 찍기와 세로찍기를 쓰레드로 돌리시오.</h3>
<pre><code>    for(int i=0; i &lt; 300; i++)
        System.out.printf(&quot;%s&quot;, new String(&quot;-&quot;));        


    for(int i=0; i &lt; 300; i++) 
        System.out.printf(&quot;%s&quot;, new String(&quot;|&quot;));    </code></pre><pre><code>public class MultyTreadTest {

    public static void main(String[] args) {
        MyThread1 th1 = new MyThread1();
        MyThread2 th2 = new MyThread2();
                                        //Never direct run in Thread because &#39;th1.run();&#39; is single thread
                                        //th1.run();
        th1.run();
        th2.run();
//        th1.start();
//        th2.start();

        System.out.println(&quot;mian end&quot;);
    }

}

class MyThread1 extends Thread {

    @Override
    public void run() {
        for (int i = 0; i &lt; 300; i++) {
            System.out.println(i + &quot;a&quot;);
        }
    }
}

class MyThread2 extends Thread {

    @Override
    public void run() {
        for (int i = 0; i &lt; 300; i++) {
            System.out.println(i + &quot;b&quot;);
        }
    }
}</code></pre><h3 id="4-아래의-의미를-설명해-보시오">4. 아래의 의미를 설명해 보시오.</h3>
<blockquote>
<p>메인 스레드가 종료되더라도 실행 중인 스레드가 하나라도 있다면 프로세스는 종료되지 않습니다.</p>
</blockquote>
<p>자바의 모든 애플리케이션은 메인 스레드(main thread)가 main() 메소드를 실행하면서 시작한다. 메인 스레드는 main() 메소드의 첫 코드부터 아래로 순차적으로 실행하고, main() 메소드의 마지막 코드를 실행하거나 return 문을 만나면 실행이 종료된다.</p>
<p>메인 스레드는 필요에 따라 작업 스레드들을 만들어서 병렬로 코드를 실행할 수 있다. 즉, 멀티 스레드를 생성해서 멀티 태스킹을 수행한다.</p>
<p>싱글 스레드 애플리케이션에서는 메인 스레드가 종료하면 프로세스도 종료된다. 하지만 멀티 스레드 애플리케이션에서는 실행 중인 스레드가 하나라도 있다면, 프로세스는 종료되지 않는다. 메인 스레드가 작업 스레드보다 먼저 종료되더라도 작업 스레드가 계속 실행 중이라면 프로세스는 종료되지 않는다.</p>
<h3 id="5-학생마다-student-객체를-생성하고-4명의-학생-정보를arrayliststudent-컬렉션에-저장한-후에-arrayliststudent의-모든-학생4명-정보를-출력하고-학생-이름을-입력-받아-해당-학생의-학점-평균을-출력하는-프로그램을-작성하라">5. 학생마다 Student 객체를 생성하고 4명의 학생 정보를ArrayList<Student> 컬렉션에 저장한 후에, ArrayList<Student>의 모든 학생(4명) 정보를 출력하고 학생 이름을 입력 받아 해당 학생의 학점 평균을 출력하는 프로그램을 작성하라.</h3>
<p>학생 이름, 학과, 학번, 학점평균 입력하세요.</p>
<blockquote>
<blockquote>
<p>황기태, 모바일, 1, 4.1
이재문, 안드로이드, 2, 3.9
김남윤, 웹공학, 3, 3.5
최찬미, 빅데이터, 4, 4.25</p>
</blockquote>
</blockquote>
<hr>
<p>이름: 황기태
학과: 모바일
학번: 1
학점평균: 4.1</p>
<hr>
<p>이름: 이재문
학과: 안드로이드
학번: 2
학점평균: 3.9</p>
<hr>
<p>이름: 김남윤
학과: 웹공학
학번: 3
학점평균: 3.5</p>
<hr>
<p>이름: 최찬미
학과: 빅데이터
학번: 4
학점평균: 4.25</p>
<hr>
<p>학생 이름 &gt;&gt; 최찬미
최찬미, 빅데이터, 4, 4.25
학생 이름 &gt;&gt; 이재문
이재문, 안드로이드, 2, 3.9
학생 이름 &gt;&gt; 그만</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 39일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-39%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-39%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 23 Feb 2023 09:24:44 GMT</pubDate>
            <description><![CDATA[<h3 id="1-아래와-같이-파일-복사되도록-프로그램을-짜시오">1. 아래와 같이 파일 복사되도록 프로그램을 짜시오</h3>
<blockquote>
</blockquote>
<p>대상 파일: a.pptx
사본 이름: d.pptx</p>
<pre><code>import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Scanner;

public class FileCopy {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print(&quot;대상 파일 : &quot;);
        String src = sc.nextLine();
        System.out.print(&quot;사본 이름 : &quot;);
        String dst = sc.nextLine();

        try (InputStream in = new FileInputStream(src); 
                OutputStream out = new FileOutputStream(dst)) {
//            int data;
            byte buf[] = new byte[1024];
            int len;
            while (true) {
//                data = in.read(); //Read 1byte from the File
                len = in.read(buf);
//                if (data == -1)
                if (len ==-1)
                { // If when there is no more data to read 
                    break;
                }
//                out.write(data); // 1byte is written to the file.
                out.write(buf, 0, len);

            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

}</code></pre><h3 id="2-스트림에-대하여-설명하시오">2. 스트림에 대하여 설명하시오.</h3>
<h4 id="스트림stream">스트림(stream)</h4>
<p>자바에서는 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림(stream)이라는 흐름을 통해 다룬다.
스트림(stream)이란 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미한다.
즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할을 한다.</p>
<p><img src="https://velog.velcdn.com/images/guryena_/post/49eb7134-94e5-4e01-a227-1a8a36c549c6/image.png" alt=""></p>
<ul>
<li>입출력 스트림
스트림은 한 방향으로만 통신할 수 있으므로, 입력과 출력을 동시에 처리할 수는 없다.
따라서 스트림은 사용 목적에 따라 입력 스트림과 출력 스트림으로 구분된다. <b/>
자바에서는 java.io 패키지를 통해 InputStream과 OutputStream 클래스를 별도로 제공하고 있다.
<b/>
즉, 자바에서의 스트림 생성이란 이러한 스트림 클래스 타입의 인스턴스를 생성한다는 의미이다.
<b/>
InputStream 클래스에는 read() 메소드가, OutputStream 클래스에는 write() 메소드가 각각 추상 메소드로 포함되어 있다.
<b/>
사용자는 이 두 메소드를 상황에 맞게 적절히 구현해야만 입출력 스트림을 생성하여 사용할 수 있다.

</li>
</ul>
<p><img src="https://velog.velcdn.com/images/guryena_/post/68cbe40d-f7e0-450c-bdb9-9b881eb58a43/image.png" alt=""></p>
<blockquote>
<p>read() 메소드는 해당 입력 스트림에서 더 이상 읽어들일 바이트가 없으면, -1을 반환해야 한다.
그런데 반환 타입을 byte 타입으로 하면, 0부터 255까지의 바이트 정보는 표현할 수 있지만 -1은 표현할 수 없게 된다.
따라서 InputStream의 read() 메소드는 반환 타입을 int형으로 선언하고 있다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/guryena_/post/b7bb1495-2e1b-4d8e-acac-d1995e6f8f2c/image.png" alt=""></p>
<ul>
<li>보조 스트림
자바에서 제공하는 보조 스트림은 실제로 데이터를 주고받을 수는 없지만, 다른 스트림의 기능을 향상시키거나 새로운 기능을 추가해 주는 스트림이다.<b/>
자바에서는 다음과 같은 다양한 보조 스트림을 제공하고 있다.


</li>
</ul>
<p><img src="https://velog.velcdn.com/images/guryena_/post/5c5efd17-36b9-4d16-973d-7b7a6ea75427/image.png" alt=""></p>
<ul>
<li>문자 기반 스트림
자바에서 스트림은 기본적으로 바이트 단위로 데이터를 전송한다.<b/>
하지만 자바에서 가장 작은 타입인 char 형이 2바이트이므로, 1바이트씩 전송되는 바이트 기반 스트림으로는 원활한 처리가 힘든 경우가 있다.
<b/>
따라서 자바에서는 바이트 기반 스트림뿐만 아니라 문자 기반의 스트림도 별도로 제공한다.
<b/>
이러한 문자 기반 스트림은 기존의 바이트 기반 스트림에서 InputStream을 Reader로, OutputStream을 Writer로 변경하면 사용할 수 있다.
<b/>
자바에서는 다음과 같은 다양한 문자 기반의 입출력 스트림을 제공하고 있다.


</li>
</ul>
<p><img src="https://velog.velcdn.com/images/guryena_/post/e400ccf7-b1ce-40c6-bc1a-98df9992c14e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/guryena_/post/2a272994-e1d0-482a-9b26-cbfa6f993cc5/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 38일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-38%EC%9D%BC%EC%B0%A8-kcu0zaf6</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-38%EC%9D%BC%EC%B0%A8-kcu0zaf6</guid>
            <pubDate>Wed, 22 Feb 2023 10:14:48 GMT</pubDate>
            <description><![CDATA[<h3 id="1프로그래밍-하시오">1.프로그래밍 하시오.</h3>
<blockquote>
<p>나라 이름과 인구를 입력하세요.(예: Korea 5000)
나라 이름, 인구 &gt;&gt; Korea 5000
나라 이름, 인구 &gt;&gt; USA 1000000
나라 이름, 인구 &gt;&gt; Swiss 2000
나라 이름, 인구 &gt;&gt; France 3000
나라 이름, 인구 &gt;&gt; 그만
<b/>
인구 검색 &gt;&gt; France
France의 인구는 3000
인구 검색 &gt;&gt; 스위스
스위스 나라는 없습니다.
인구 검색 &gt;&gt; 그만</p>
</blockquote>
<pre><code>package _Map;

import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;

public class Test {

    public static void main(String[] args) {
//나라 이름과 인구를 입력하세요.(예: Korea 5000)
//나라 이름, 인구 &gt;&gt; Korea 5000
//나라 이름, 인구 &gt;&gt; USA 1000000
//나라 이름, 인구 &gt;&gt; Swiss 2000
//나라 이름, 인구 &gt;&gt; France 3000
//나라 이름, 인구 &gt;&gt; 그만
//    
//인구 검색 &gt;&gt; France
//France의 인구는 3000
//인구 검색 &gt;&gt; 스위스
//스위스 나라는 없습니다.
//인구 검색 &gt;&gt; 그만
        Scanner sc = new Scanner(System.in);
        HashMap&lt;String, Integer&gt; popSearch = new HashMap&lt;&gt;();
        System.out.println(&quot;나라 이름과 인구를 입력하세요.&quot;);
        while (true) {
            String country = sc.next();
            if (country.equals(&quot;stop&quot;)) {
                break;
            } else {
                try {
                    int population = sc.nextInt();
                    popSearch.put(country, population);
                    System.out.println(&quot;Country, Population &gt;&gt; &quot; + country + &quot; &quot; + population);
                } catch (Exception e) {
                    // TODO: handle exception
                    sc.nextLine();
                    System.out.println(&quot;It&#39;s not number&quot;);
                }
            }

        }

        Set&lt;String&gt; ks = popSearch.keySet();
        while (true) {
            String search = sc.next();

            try {
                if (search.equals(&quot;stop&quot;)) {
                    System.exit(0);
                } else {

                    System.out.println(&quot;Search &gt;&gt; &quot; + search);
                    System.out.println(&quot;Population &gt;&gt; &quot; + popSearch.get(search).toString());
                }

            } catch (Exception e) {
                // TODO: handle exception
                System.out.println(&quot;There is no&quot; + search + &quot; country&quot;);
            }
        }
    }

}</code></pre><h3 id="2-다음을-프로그래밍-하시오">2. 다음을 프로그래밍 하시오.</h3>
<blockquote>
</blockquote>
<p>도시 이름, 위도, 경도 정보를 가진 Location 클래스를 작성하고, 도시 이름을 &#39;키&#39;로 하는 HashMap&lt;String, Location&gt; 컬렉션을 만들고, 사용자로부터 입력 받아 4개의 도시를 저장하라. 그리고 도시 이름으로 검색하는 프로그램을 작성하라.</p>
<p>도시, 경도, 위도를 입력하세요.</p>
<blockquote>
<blockquote>
<p>서울, 37, 126
LA, 34, -118
파리, 2, 48
시드니, 151, -33</p>
</blockquote>
</blockquote>
<hr>
<p>서울 37 126
LA 34 -118
파리 2 48
시드니 151 -33</p>
<hr>
<p>도시 이름 &gt;&gt; 피리
피리는 없습니다.
도시 이름 &gt;&gt; 파리
파리 2 48
도시 이름 &gt;&gt; 그만</p>
<pre><code>
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;

public class Test1 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        HashMap&lt;String, Location&gt; map = new HashMap&lt;&gt;();

        while (true) {
            String city = sc.next();
            if (city.equals(&quot;stop&quot;)) {
                break;
            } else {
                try {

                    double lati = sc.nextDouble();
                    double longi = sc.nextDouble();
                    Location location = new Location(lati, longi);
                    map.put(city, location);
                    System.out.println(&quot;Input &gt;&gt; &quot; + city + &quot; &quot; + lati + &quot; &quot; + longi);
                } catch (Exception e) {
                    sc.nextLine();
                    System.out.println(&quot;Wrong input&quot;);
                }
            }

        }

        Set&lt;String&gt; ks = map.keySet();

        while (true) {
            System.out.print(&quot;City &gt;&gt; &quot;);

            String search = sc.next();
            try {

                if (search.equals(&quot;stop&quot;)) {
                    System.exit(0);
                    ;
                } else {
                    System.out.println(search);
                    System.out.println(search + &quot; &quot; + map.get(search).toString());
                }
            } catch (Exception e) {
                System.out.println(&quot;No &quot; + search);
            }
        }
    }

}
</code></pre><pre><code>package Test;

public class Location {
    private double latitude;
    private double longitude;
    public Location(double lati, double longi) {
        this.latitude = lati;
        this.longitude = longi;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return latitude + &quot; &quot; +longitude;
    }

}
</code></pre><h3 id="3큐와-스택에-대하여-설명하시오필수">3.큐와 스택에 대하여 설명하시오.(필수)</h3>
<blockquote>
<p>스택(stack)
이란 쌓아 올린다는 것을 의미한다. 
따라서 스택 자료구조라는 것은 책을 쌓는 것처럼 차곡차곡 쌓아 올린 형태의 자료구조를 말한다.</p>
</blockquote>
<ul>
<li>스택의 특징
스택은 위의 사진처럼 같은 구조와 크기의 자료를 정해진 방향으로만 쌓을수 있고,
top으로 정한 곳을 통해서만 접근할 수 있다.
top에는 가장 위에 있는 자료는 가장 최근에 들어온 자료를 가리키고 있으며,
삽입되는 새 자료는 top이 가리키는 자료의 위에 쌓이게 된다.
스택에서 자료를 삭제할 때도 top을 통해서만 가능하다.
스택에서 top을 통해 삽입하는 연산을 &#39;push&#39; , top을 통한 삭제하는 연산을 &#39;pop&#39;이라고 한다.<b/>
따라서 스택은 시간 순서에 따라 자료가 쌓여서 가장 마지막에 삽입된 자료가 가장 먼저 삭제된다는 구조적 특징을 가지게 된다.
<b/>
이러한 스택의 구조를 후입선출(LIFO, Last-In-First-Out) 구조이라고 한다.
그리고 비어있는 스택에서 원소를 추출하려고 할 때 stack underflow라고 하며,
스택이 넘치는 경우 stack overflow라고 한다.
<b/></li>
<li>스택의 활용 예시
스택의 특징인  후입선출(LIFO)을 활용하여 여러 분야에서 활용 가능하다.
웹 브라우저 방문기록 (뒤로 가기) : 가장 나중에 열린 페이지부터 다시 보여준다.
역순 문자열 만들기 : 가장 나중에 입력된 문자부터 출력한다.
실행 취소 (undo) : 가장 나중에 실행된 것부터 실행을 취소한다.
후위 표기법 계산
수식의 괄호 검사 (연산자 우선순위 표현을 위한 괄호 검사)</li>
</ul>
<blockquote>
</blockquote>
<h3 id="4-map-에-대하여-설명하시오">4. Map 에 대하여 설명하시오.</h3>
<h3 id="5-아래의-treemap의-value를-확인-하기-위한-소스를-짜시오필수">5. 아래의 TreeMap의 Value를 확인 하기 위한 소스를 짜시오.(필수)</h3>
<pre><code>TreeMap&lt;Integer, String&gt; map = new TreeMap&lt;&gt;();
map.put(45, &quot;Brown&quot;);
map.put(37, &quot;James&quot;);
map.put(23, &quot;Martin&quot;);</code></pre><pre><code>import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;

public class _TreeMap {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TreeMap&lt;Integer, String&gt; map = new TreeMap&lt;&gt;();

        //Save data that type Key-Value
        map.put(45, &quot;Brown&quot;);
        map.put(37, &quot;James&quot;);
        map.put(23, &quot;Martin&quot;);

        //Detected data
        System.out.println(&quot;23번 : &quot; + map.get(23));
        System.out.println(&quot;37번 : &quot; + map.get(37));
        System.out.println(&quot;45번 : &quot; + map.get(45));
        System.out.println();

        //Create Collection Instance on only Key
        Set&lt;Integer&gt; ks = map.keySet();

        //Output all Key(for-each)
        for (Integer n : ks) {
            System.out.print(n.toString()+&quot;\t&quot;);
        }
        System.out.println();

        //Output all Value(for-each)
        for (Integer n : ks) {
            System.out.print(map.get(n).toString()+&quot;\t&quot;);
        }
        System.out.println();

        //Output all Value(Iterator)
        for (Iterator&lt;Integer&gt; itr = ks.iterator(); itr.hasNext();) {
            System.out.print(map.get(itr.next())+&quot;\t&quot;);

        }
        System.out.println();


        //Remove data
        map.remove(37);

        //Check remove data
        System.out.println(&quot;37번 : &quot; + map.get(37));
    }

}
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 37일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-37%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-37%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 20 Feb 2023 09:34:12 GMT</pubDate>
            <description><![CDATA[<h3 id="1-arraylist-와-linkedlist-의-장단점은">1. ArrayList 와 LinkedList 의 장단점은?</h3>
<p>ArrayList는 기본적으로 배열을 사용한다. 하지만 일반 배열과 차이점이 존재한다.
일반 배열은 처음에 메모리를 할당할 때 크기를 지정해주어야 하지만, ArrayList는 크기를 지정하지 않고 동적으로 값을 삽입하고 삭제할 수 있다.</p>
<ul>
<li><p>조회
ArrayList는 각 데이터의 index를 가지고 있고 무작위 접근이 가능하기 때문에, 해당 index의 데이터를 한번에 가져올 수 있다.</p>
</li>
<li><p>데이터 삽입과 삭제
데이터의 삽입과 삭제시 ArrayList는 그만큼 위치를 맞춰주어야 한다.
위의 사진으로 예를들면 5개의 데이터가 있을 때 맨 앞의 2를 삭제했다면 나머지 뒤의 4개를 앞으로 한칸씩 이동해야 한다.
삽입과 삭제가 많다면 ArrayList는 비효율적이다.</p>
<p>** LinkedList **는 내부적으로 양방향의 연결 리스트로 구성되어 있어 참조하려는 원소에 따라 처음부터 정방향 또는 역순으로 순회 가능(배열의 단점을 보완하기 위해 LinkedList가 고안되었다.)</p>
</li>
<li><p>조회
LinkedList는 순차적 접근이기 때문에 검색의 속도가 느리다.</p>
</li>
<li><p>데이터 삽입과 삭제
LinkedList는 데이터를 추가·삭제시 가리키고 있는 주소값만 변경해주면 되기 때문에 ArrayList에 비해 상당히 효율적이다.
위의 사진으로 예를들면 2번째 값을 삭제하면 1번째 노드가 3번째 노드를 가리키게 하기만 하면 된다.</p>
</li>
</ul>
<h3 id="2-scanner-클래스로--1이-입력될-때까지-양의-정수를-입력-받아-저장list객체하고-검색하여-가장-큰-수를-출력하는-프로그램을-작성하라">2. Scanner 클래스로 -1이 입력될 때까지 양의 정수를 입력 받아 저장(List객체)하고 검색하여 가장 큰 수를 출력하는 프로그램을 작성하라.</h3>
<pre><code>import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Test {

    public static void main(String[] args) {
//        Scanner 클래스로 -1이 입력될 때까지 양의 정수를 입력 받아 저장(List객체)하고 검색하여 가장 큰 수를 출력하는 프로그램을 작성하라.

        Scanner sc = new Scanner(System.in);
        List&lt;Integer&gt; list = new ArrayList();
        while (true) {

            int input = sc.nextInt();
            list.add(input);
            if (input == -1) {
                break;
            }

        }
        int max = Collections.max(list);
        System.out.println(max);
    }

}
</code></pre><h3 id="3-scanner-클래스를-사용하여-6개-학점a-b-c-d-f을-문자로-입력받아-arraylist에-저장하고-arraylist를-검색하여-학점을-점수a40-b30-c20-d10-f0로-변환하여-평균을-출력하는-프로그램을-작성하라">3. Scanner 클래스를 사용하여 6개 학점(&#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;D&#39;, &#39;F&#39;)을 문자로 입력받아 ArrayList에 저장하고, ArrayList를 검색하여 학점을 점수(A=4.0, B=3.0, C=2.0, D=1.0, F=0)로 변환하여 평균을 출력하는 프로그램을 작성하라.</h3>
<blockquote>
</blockquote>
<p>6개의 학점을 빈 칸으로 분리 입력(A/B/C/D/F) &gt;&gt; A C A B F D 2.3333333333333335
A: 4.0
B: 3.0
C: 2.0
D:1.0
F:0.0</p>
<pre><code>package Test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.DoubleSummaryStatistics;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Scanner;

public class Test1 {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        List&lt;String&gt; list = new ArrayList();

        List&lt;Double&gt; listG = new ArrayList();

        for (int i = 0; i &lt; 6; i++) {
            String grade = sc.nextLine();
            list.add(grade);
            if (grade.equals(&quot;A&quot;)) {
                listG.add(4.0);
            }
            else if (grade.equals(&quot;B&quot;)) {
                listG.add(3.0);
            }
            else if (grade.equals(&quot;C&quot;)) {
                listG.add(2.0);
            }
            else if (grade.equals(&quot;D&quot;)) {
                listG.add(1.0);
            }
            else if (grade.equals(&quot;F&quot;)) {
                listG.add(0.0);
            }
        }

        DoubleSummaryStatistics stats = listG.stream()
                .mapToDouble(Double::doubleValue)
                .summaryStatistics();
        System.out.println(stats.getAverage());

    }

    }

</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[SW공부 36일차]]></title>
            <link>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-36%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@guryena_/SW%EA%B3%B5%EB%B6%80-36%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 17 Feb 2023 08:41:54 GMT</pubDate>
            <description><![CDATA[<h3 id="1-제네릭generic이란">1. 제네릭(Generic)이란?</h3>
<p>자바에서 제네릭(generic)이란 데이터의 타입(data type)을 일반화한다(generalize)는 것을 의미한다.</p>
<p>데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법이다.</p>
<p>제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법이다.</p>
<p>이렇게 컴파일 시에 미리 타입 검사(type check)를 수행하면 다음과 같은 장점을 가진다.</p>
<ol>
<li><p>클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다</p>
</li>
<li><p>반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다.</p>
</li>
</ol>
<h3 id="2-아래가-돌아-가도록-짜시오">2. 아래가 돌아 가도록 짜시오.</h3>
<pre><code>   Box&lt;Apple&gt; aBox = new Box&lt;Apple&gt;();    // T를 Apple로 결정
   Box&lt;Orange&gt; oBox = new Box&lt;Orange&gt;();    // T를 Orange로 결정

   aBox.set(new Apple());   // 사과를 상자에 담는다.
   oBox.set(new Orange());   // 오렌지를 상자에 담는다.

   Apple ap = aBox.get();   // 사과를 꺼내는데 형 변환 하지 않는다.
   Orange og = oBox.get();   // 오렌지를 꺼내는데 형 변환 하지 않는다.

   System.out.println(ap); // 출력 : 이것은 사과 입니다.
   System.out.println(og); // 출력 : 이것은 오렌지 입니다.</code></pre><pre><code>public class Box {
    private Object ob;

    public void set(Object ob) {
        this.ob = ob;
    }

    public Object get() {
        return ob;
    }
}</code></pre><pre><code>public class Apple {

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return &quot;I am an apple&quot;;
    }
}</code></pre><pre><code>public class Orange {

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return &quot;I am an orange&quot;;
    }

}</code></pre><h3 id="3-아래가-돌아-가도록-짜시오">3. 아래가 돌아 가도록 짜시오.</h3>
<pre><code>    Person&lt;String, Integer&gt; p = new Person&lt;String, Integer&gt;();
   p.set(&quot;홍길동&quot;, 25);
   System.out.println(box); //출력 : 홍길동 25 세 입니다. </code></pre><pre><code>public class Person&lt;NAME, AGE&gt; {
    private NAME name;
    private AGE age;

    public void set(NAME name, AGE age){
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return name + &quot; &quot;  + age +&quot;세 입니다.&quot;;
    }


}
</code></pre>]]></description>
        </item>
    </channel>
</rss>