<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ksy-2311.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 02 Feb 2023 18:35:43 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. ksy-2311.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ksy-2311" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[AutoLayout인터페이스]]></title>
            <link>https://velog.io/@ksy-2311/AutoLayoutInter</link>
            <guid>https://velog.io/@ksy-2311/AutoLayoutInter</guid>
            <pubDate>Thu, 02 Feb 2023 18:35:43 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="온도계">온도계</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/ksy-2311/post/9576002a-32a2-42cc-a2aa-0db5290993d5/image.PNG" alt=""></p>
<blockquote>
<h3 id="영상">영상</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/ksy-2311/post/ad83b11e-d808-4488-8f1c-193012e9499a/image.PNG" alt=""></p>
<blockquote>
<h3 id="사이트">사이트</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/ksy-2311/post/821096c2-c30f-4928-b158-fc88f3fa4f53/image.PNG" alt=""></p>
<hr>
<p>소스로 구현되지 않은 부분의 보완을 위해 인터페이스도 올립니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AutoLayout 적용]]></title>
            <link>https://velog.io/@ksy-2311/AutoLayout2</link>
            <guid>https://velog.io/@ksy-2311/AutoLayout2</guid>
            <pubDate>Thu, 02 Feb 2023 18:29:04 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="iphone-14-pro">iPhone 14 Pro</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/ksy-2311/post/b79ec90a-fbf3-4044-ab72-e49fae1a0746/image.png" alt=""></p>
<blockquote>
<h3 id="ipone-se-3th-generation">iPone SE (3th generation)</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/ksy-2311/post/2d7078b1-6ae2-4a3b-bdc8-863772f0a2a3/image.png" alt=""></p>
<blockquote>
<h3 id="ipad-10th-generation">iPad (10th generation)</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/ksy-2311/post/925cb494-4d0a-4de3-8803-1889e84b3d78/image.PNG" alt=""></p>
<blockquote>
<h4 id="가로모드">가로모드</h4>
</blockquote>
<p><img src="https://velog.velcdn.com/images/ksy-2311/post/5a9b7210-a17b-4d7f-b03b-559cc96fca6d/image.png" alt=""></p>
<blockquote>
<h4 id="view-controller">View Controller</h4>
</blockquote>
<pre><code class="language-swift">//
//  ViewController.swift
//  change30
//
//  Created by 소프트웨어컴퓨터 on 2022/12/13.
//

import UIKit

class ViewController: UIViewController {


    @IBOutlet weak var Nm: UILabel!

    @IBOutlet weak var weaImg: UIImageView!

    @IBOutlet weak var txtweather: UITextField!

    @IBOutlet weak var wtresult: UILabel!

    @IBAction func Celsius(_ sender: UIButton) {
        if(txtweather.text == &quot;&quot;){
            wtresult.textColor = UIColor.red
            wtresult.text = &quot;온도를 입력하세요!!&quot;
            return
        }
        wtresult.backgroundColor = UIColor.white
        wtresult.textColor = UIColor(displayP3Red: 0.0, green: 1.0, blue: 1.0, alpha: 1.0)
        let txtweather = Double(txtweather.text!)!
        let celsius = (txtweather-32)*5/9
        let shortenedcelsius = String(format: &quot;%.1f&quot;, celsius)
        wtresult.clipsToBounds = true
        wtresult.layer.cornerRadius = 10
        wtresult.text = &quot;섭씨 : \(shortenedcelsius)도 입니다.&quot;

    }

    @IBAction func Fahrenheit(_ sender: UIButton) {
        if(txtweather.text == &quot;&quot;){
            wtresult.textColor = UIColor.red
            wtresult.text = &quot;온도를 입력하세요!!&quot;
            return
        }
        wtresult.backgroundColor = UIColor.white
        wtresult.textColor = UIColor(displayP3Red: 1.0, green: 0.0, blue: 1.0, alpha: 1.0)
        let txtweather = Double(txtweather.text!)!
        let fahrenheit = txtweather*1.8+32
        let shortenedfahrenheit = String(format: &quot;%.1f&quot;, fahrenheit)
        wtresult.clipsToBounds = true
        wtresult.layer.cornerRadius = 10
        wtresult.text = &quot;화씨 : \(shortenedfahrenheit)도 입니다.&quot;
    }

    @IBAction func Onoff(_ sender: UISwitch) {

        if sender.isOn{
            txtweather.backgroundColor = UIColor(displayP3Red: 0.7, green: 0.7, blue: 0.7, alpha: 1.0)
        }
        else {
            txtweather.backgroundColor = UIColor.white
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()

        Nm.translatesAutoresizingMaskIntoConstraints = false
        weaImg.translatesAutoresizingMaskIntoConstraints = false
        txtweather.translatesAutoresizingMaskIntoConstraints = false
        wtresult.translatesAutoresizingMaskIntoConstraints = false



        NSLayoutConstraint.activate([

            Nm.widthAnchor.constraint(equalToConstant: 240),
            Nm.heightAnchor.constraint(equalToConstant: 40),
            Nm.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor, constant: 55),
            Nm.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor, constant: 80),
            Nm.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor, constant: -80),

            weaImg.widthAnchor.constraint(equalToConstant: 240),
            weaImg.heightAnchor.constraint(equalToConstant: 130),
            weaImg.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
            weaImg.topAnchor.constraint(equalTo: self.wtresult.bottomAnchor, constant: 15),

            txtweather.widthAnchor.constraint(equalToConstant: 240),
            txtweather.heightAnchor.constraint(equalToConstant: 40),
            txtweather.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor, constant: 110),
            txtweather.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor, constant: 70),
            txtweather.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor, constant: -70),

            wtresult.widthAnchor.constraint(equalToConstant: 240),
            wtresult.heightAnchor.constraint(equalToConstant: 40),
            wtresult.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor, constant: 250),
            wtresult.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor, constant: 90),
            wtresult.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor, constant: -90)
         ])


    }


}</code></pre>
<blockquote>
<h4 id="prepareviewcontroller">PrepareViewController</h4>
</blockquote>
<pre><code class="language-swift">import UIKit
import AVKit

class PrepareViewController: UIViewController {


    @IBOutlet weak var hott: UILabel!


    @IBOutlet weak var coldd: UILabel!


    @IBAction func playhot(_ sender: UIButton) {
        let file:String? = Bundle.main.path(forResource:&quot;hotprepare&quot;, ofType: &quot;mp4&quot;)
        let url = NSURL(fileURLWithPath: file!)
        let playerController = AVPlayerViewController()
        let player = AVPlayer(url: url as URL)
        playerController.player = player
        self.present(playerController, animated: true)

        player.play()    }

    @IBAction func playcold(_ sender: UIButton) {
        let file:String? = Bundle.main.path(forResource:&quot;coldprepare&quot;, ofType: &quot;mp4&quot;)
        let url = NSURL(fileURLWithPath: file!)
        let playerController = AVPlayerViewController()
        let player = AVPlayer(url: url as URL)
        playerController.player = player
        self.present(playerController, animated: true)

        player.play()    }

    override func viewDidLoad() {
        super.viewDidLoad()


        hott.translatesAutoresizingMaskIntoConstraints = false
        coldd.translatesAutoresizingMaskIntoConstraints = false



        NSLayoutConstraint.activate([

            hott.widthAnchor.constraint(equalToConstant: 200),
            hott.heightAnchor.constraint(equalToConstant: 85),
            hott.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerYAnchor, constant: -140),
            hott.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerXAnchor, constant: -100),


            coldd.widthAnchor.constraint(equalToConstant: 200),
            coldd.heightAnchor.constraint(equalToConstant: 85),
            coldd.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerYAnchor, constant: 235),
            coldd.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerXAnchor, constant: -100),
         ])
    }

}
</code></pre>
<blockquote>
<h4 id="iteviewcontroller">iteViewController</h4>
</blockquote>
<pre><code class="language-swift">
import UIKit
import WebKit

class SiteViewController: UIViewController {

    @IBOutlet weak var webView: WKWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        guard let url = URL(string: &quot;https://weather.naver.com&quot;)
        else{ return}
        let request = URLRequest(url: url)
        webView.load(request)    }


    @IBAction func Sgsite(_ sender: UISegmentedControl) {
        if sender.selectedSegmentIndex == 0{
            guard let url = URL(string: &quot;https://weather.naver.com&quot;)
            else{ return}
            let request = URLRequest(url: url)
            webView.load(request)
        }
        else{
            guard let url = URL(string: &quot;https://www.weather.go.kr/w/index.do&quot;)
            else{ return }
            let request = URLRequest(url: url)
            webView.load(request)        }
    }

}
</code></pre>
<hr>
<p>소스에 없는 View들은 인터페이스를 통해 AutoLayout을 했습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[과제2 정리-3]]></title>
            <link>https://velog.io/@ksy-2311/swift3</link>
            <guid>https://velog.io/@ksy-2311/swift3</guid>
            <pubDate>Mon, 30 Jan 2023 06:33:50 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="열거형enum">열거형(enum)</h3>
</blockquote>
<p>관련 있는 데이터들이 멤버로 구성된 자료형 객체로, 주로 값이 한정될 때 사용한다.</p>
<pre><code class="language-swift">enum 열거형명 {
    열거형 정의
} </code></pre>
<p>switch를 통해 열거형 멤버의 기능을 정의할 수 있으며, 열거형 멤버에는 함수도 가능하다.
rawValue는 열거형 멤버의 내부에 값이 있을 경우, 값을 추출하기 위해 사용하며, 열거형명.열거형 멤버.rawValue로 사용한다. 열거형 멤버의 값이 지정되지 않으면 열거형 멤버의 이름으로 값이 지정된다.</p>
<blockquote>
<h3 id="구조체">구조체</h3>
</blockquote>
<pre><code class="language-swift">struct 구조체명{
프로퍼티
}
let a1 = 구조체명()</code></pre>
<p>Memberwise Initializer가 자동으로 생성하며, 기본 자료형이나 nil도 구조체에 해당한다.
구조체는 상속이 불가능하다.</p>
<blockquote>
<h4 id="swift에서의-오류-처리-방법">swift에서의 오류 처리 방법</h4>
</blockquote>
<p>swift에서는 오류를 처리하는 방법이 4가지 있다.</p>
<ul>
<li>Throwing Functions을 이용한 오류 전파 
매개 변수 뒤에 throws를 넣어 do-try-catch를 실행한다.</li>
<li>Do-try-catch를 이용한 오류 처리</li>
<li>Error를 옵셔널로 변환</li>
<li>오류 전파 비활성화</li>
</ul>
<blockquote>
<h3 id="generic">Generic</h3>
</blockquote>
<p>swift의 강력한 기능 중 하나며, 유연하고 재사용가능한 함수를 만들 때 사용한다.
swift의 Array도 Generic 구조체다.</p>
<hr>
<p>Smile Han의 Swift강좌를 참고해 작성한 글입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[과제2 정리-2]]></title>
            <link>https://velog.io/@ksy-2311/swift2</link>
            <guid>https://velog.io/@ksy-2311/swift2</guid>
            <pubDate>Sun, 29 Jan 2023 08:18:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="함수">함수</h3>
</blockquote>
<p>함수는 코드 블록을 얘기한다.
정의하는 부분을 매개변수(parameter), 호출하는 부분을 인수(argument)라고 한다.
swift의 클래스 내에서의 함수는 <strong>method</strong>라고 한다.</p>
<blockquote>
<p>함수 선언 방법</p>
</blockquote>
<pre><code class="language-swift">func exp(Num : Int, Str Cha : String) -&gt; String{
return (&quot;\(Cha) \(Num)&quot;)
}</code></pre>
<p>이 함수의 함수명은 exp(Num:Str:)이다.
함수명을 알기 위해서는 함수 내에 print(#function)을 넣으면 된다.
Str은 외부매개변수명이며 함수 밖에서 사용하고, Cha은 내부매개변수명이고 함수 안에서 사용한다. Num은 함수 밖과 안 모두 동일한 이름으로 사용한다. 
이때 함수의 타입은  (Int, String) -&gt; String이다.
<strong>()은 void를 나타내며, _은 매개변수명을 생략할 때 사용한다.</strong></p>
<blockquote>
<h3 id="함수를-매개변수처럼-사용하는-법">함수를 매개변수처럼 사용하는 법</h3>
</blockquote>
<p>swift에서는 함수를 매개변수처럼 사용할 수 있다.
swift의 함수는 1급객체이기 때문에 함수를 변수에 저장할 수 있으며, 함수를 매개변수나 리턴값으로 사용할 수 있다.</p>
<blockquote>
<h3 id="클로저">클로저</h3>
</blockquote>
<p>클로저는 c나 C++의 block과 같다.</p>
<pre><code class="language-swift">func exp(Num : Int, Str Cha : String) -&gt; String{
return (&quot;\(Cha) \(Num)&quot;)
}

let exp1 = {(Num : Int, Str Cha : String) -&gt; String in 
return (&quot;\(Cha) \(Num)&quot;)
}</code></pre>
<p>아랫부분이 클로저 표현식이다.</p>
<p>후행 클로저는 마지막 argument가 함수일 경우, 함수를 생략하고 함수 소괄호 외부에 클로저를 작성하는 방법이다.</p>
<blockquote>
<h3 id="클래스">클래스</h3>
</blockquote>
<p>클래스는 메서드가 하는 일이나 속성을 정의한다.</p>
<p>프로퍼티(property)는 클래스내의 저장되는 값을 뜻하며, 일반적으로 저장 프로퍼티를 말한다.
저장 프로퍼티의 초기값을 주기 위해서는 초기값이 있거나, init()으로 초기화하거나 옵셔널 변수 혹은 상수로 선언한다.
프로퍼티는 저장 프로퍼티(stored property)와 계산 프로퍼티(computed property)가 있다.</p>
<p>init으로 초기화할 때 모든 값을 초기화할 때 사용하는 생성자는 designated initializer라고 하며, 일부분만 초기화하는 생성자는 convenience initializer라고 한다. 초기화를 하지 않았을 경우에는 default initializer가 초기화한다.
소멸자는 deinit{}라고 한다.
계산 프로퍼티는 저장 프로퍼티가 저장 혹은 검색되는 시점에서 계산이나 파생된 값을 뜻한다. </p>
<pre><code class="language-swift">var Num : Int = 33
var CPm : Int {
    get{
        return Num + 1
    }
    set(newValue) // (newValue) 생략 가능
    {
        Num1 = newValue * 2
    }
} </code></pre>
<p>계산 프로퍼티 내에는 값을 리턴하는 getter와 값을 대입하는 setter가 있으며, setter가 있으면 getter는 생략할 수 있다.
setter의 매개변수명이 newValue일 경우에는 (newValue)를 생략할 수 있다.</p>
<p>클래스 내의 함수는 클래스 메서드 혹은 인스턴스 메서드라고 한다.</p>
<p>클래스 내에서는 생성자 중첩이 가능하다
init?으로 만들어진 생성자는 옵셔널로 래핑되었기 때문에 실패 가능한 생성자라고도 한다.</p>
<blockquote>
<h3 id="상속">상속</h3>
</blockquote>
<p>클래스만 가능한 기능으로, 클래스의 기능을 다른 클래스에 넘기기 위해 사용한다.
상속한 클래스는 부모 클래스, 상속받은 클래스는 자식클래스라고 하며, 자식 클래스는 상속받은 부모 클래스의 모든 기능을 상속받으며 자신의 기능을 추가할 수 있다.
swift에서는 자식클래스가 하나의 부모클래스만 상속받을 수 있지만, 프로토콜은 여러 개를 받을 수 있다.</p>
<pre><code class="language-swift">class 자식명 : 부모명, 프로토콜1, 프로토콜2 ... {}</code></pre>
<p>부모가 없을 경우에는 생략 가능하다.
부모 메서드를 호출할 때는 앞에 super를 붙여 호출한다.
override가 있으면 부모와 자식에 같은 메서드가 있을 때 자식 메서드를 우선한다.
자식클래스가 default initializer를 하는 경우에는 부모의 init()을 사용할 수 없다.</p>
<blockquote>
<h3 id="extention">extention</h3>
</blockquote>
<p>클래스, 구조체, 열거형, 프로토콜에 새 기능을 추가한다.</p>
<pre><code class="language-swift">extention Int {
    var Num : Int {
        return self * 2
    }
}</code></pre>
<p>Int에 2배의 값을 반환하는 프로퍼티를 추가한다.</p>
<p>주로 프로토콜을 추가할 때 extention을 사용해 추가한다.</p>
<hr>
<p>Smile Han의 Swift강좌를 참고해 작성한 글입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AutoLayout]]></title>
            <link>https://velog.io/@ksy-2311/AutoLayout</link>
            <guid>https://velog.io/@ksy-2311/AutoLayout</guid>
            <pubDate>Sat, 28 Jan 2023 12:40:15 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="autolayout">Autolayout</h3>
</blockquote>
<p>기존의 Frame-Based Layout과 다른 View들 간의 관계를 이용, 즉 제약조건(Constraint)을 이용하여 View의 위치와 크기를 동적으로 결정한다.</p>
<p>사용자 인터페이스(User Interface)를 배치하는 3가지 방법인 프로그래밍방식, autoresizing masks방식, Auto Layout방식 중 하나다.다른 2개의 방법과 달리 View들 간의 관계를 이용하기 때문에 뷰의 변경시 모든 뷰들을 일일히 변경할 필요가 없기 때문에 3가지 방법 중 유지 보수성이 제일 높다. </p>
<p>우선순위는 1~1000까지 있으며, 우선순위에 따라 적용되는 제약조건이 달라진다. 우선순위는 1000이 제일 높다.</p>
<p>왼쪽부터 위치를 정하는 Leading, 오른쪽부터 위치를 정하는Trailing, 위쪽부터 위치를 정하는 Top, 아래쪽부터 위치를 정하는 Bottom이 있으며, 이 외에도 길이의 중간인 CenterX와 높이의 중간인 CenterY가 있다.</p>
<p><strong>왼쪽에서 오른쪽방향이 +, 위쪽에서 아래쪽으로 향하는 방향이 +</strong> 이기 때문에 유의해야 한다.</p>
<p>제약조건을 만드는 방법은 2가지가 있는데, storyBoard에서 add new Constraints를 눌러 제약조건을 만드는 방법과 코드로 제약조건을 만드는 방법이 있다.</p>
<p>코드로 autoLayout을 구현할 경우 </p>
<pre><code class="language-swift">뷰.translatesAutoresizingMaskIntoConstraints = false</code></pre>
<p>translatesAutoresizingMaskIntoConstraints의 옵션을 false로 바꾸어 직접 제약조건을 수정할 수 있도록 해야한다.</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[과제2 정리-1]]></title>
            <link>https://velog.io/@ksy-2311/swift1</link>
            <guid>https://velog.io/@ksy-2311/swift1</guid>
            <pubDate>Wed, 25 Jan 2023 14:42:32 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="변수와-상수">변수와 상수</h3>
</blockquote>
<p>swift에서는 변수를 var로 지정하며, var로 지정된 값은 변경할 수 있다.</p>
<p>let으로 지정된 것은 상수라 부르며, 변수와 달리 값을 변경할 수 없다.
반복적으로 사용되는 특정 값을 사용할 때 주로 사용하며, 애플은 상수를 사용하는 것을 권장한다.</p>
<blockquote>
<h3 id="데이터-타입의-종류">데이터 타입의 종류</h3>
</blockquote>
<p>Int은 정수형 숫자를 넣기 위해 사용하는 데이터 타입이다.</p>
<p>Double은 실수형 숫자를 넣기 위해 사용하는 데이터 타입이다.</p>
<p>Character은 유니코드 문자 <strong><span style="color:red">하나</strong>를 저장하기 위해 사용하는 데이터 타입으로, 초기값을 넣을 때는 <strong>큰 따옴표</strong>를 사용해야 한다.</p>
<p>String은 문자열 데이터 타입이다.</p>
<p>Bool은 0 또는 1의 조건을 처리하기 위한 데이터 타입으로, true와 false의 두 개의 불리언 상수가 있다. </p>
<p>데이터 타입은 직접 지정하는 방법과 타입추론을 하는 방법 2가지가 있다.</p>
<ul>
<li>타입추론은 변수 혹은 상수에 값이 들어갈 경우 값을 통해 변수나 상수의 데이터 타입을 지정한다. <blockquote>
<pre><code class="language-swift">var Num : Int = 1 == var Num = 1</code></pre>
</blockquote>
<pre><code>이때 초기값이 있을 경우 swift가 타입추론을 하므로 데이터 타입을 지정하지 않아도 된다.(Int 생략 가능)
</code></pre></li>
</ul>
<blockquote>
<h3 id="튜플">튜플</h3>
</blockquote>
<p>여러 값을 하나의 객체에 묶는 방법으로, 배열처럼 데이터 타입을 맞출 필요가 없다.
특정 튜플의 값을 찾기 위해서는 인덱스 위치를 참조하면 된다.</p>
<blockquote>
<h3 id="optional">optional</h3>
</blockquote>
<p>optional은 값을 지정하지 않았을 때 주로 사용한다.
여러 optional을 선언하거나 언래핑할때는 콤마를 사용한다.
옵셔널 변수에 값이 있으면 래핑되었다고 하며, 래핑을 풀어주기 위해서는 강제 언래핑을 해야 한다.
옵셔널 선언은 변수 뒤에 ?나 !를 넣어 선언한다.</p>
<blockquote>
<p>변수 뒤에 ?를 넣어 선언할 경우는 강제 언래핑 전까지는 옵셔널 변수가 되며, !를 넣어 선언할 경우 optional로 사용하지 않으면 언래핑이 된다.
  ex. </p>
</blockquote>
<pre><code class="language-swift">  var Num : Int? = 3
  var Num2 : Int = Num!
  print(Num) // Optional(3)
  print(Num2) // 3</code></pre>
<p>언래핑은 4가지 방법이 있다.</p>
<blockquote>
<p>1.변수 뒤에 !을 넣어 강제 언래핑한다. 
  ex.</p>
</blockquote>
<pre><code class="language-swift">  var Num : Int? = 1
  print(Num!)</code></pre>
<ol start="2">
<li>optional binding을 사용해 강제 언래핑한다.
ex.<pre><code class="language-swift">if var No = Num{
}</code></pre>
</li>
<li>실패 가능한 연산자 <pre><code class="language-swift">let Num = m ?? &quot;&quot;</code></pre>
</li>
<li>Optional Chaining<pre><code class="language-swift">var Num2 = m?.account</code></pre>
</li>
</ol>
<p>  <span style="color:red">단, 언래핑을 할 때 값에 nil이 있으면 안된다.</p>
<blockquote>
<h3 id="연산자">연산자</h3>
</blockquote>
<p>대부분 C언어와 비슷하나 Swift 3에서 ++연산자와 --연산자가 없어저 사용할 수 없다는 차이가 있다.</p>
<blockquote>
<h4 id="범위연산자는-다음과-같이-사용한다">범위연산자는 다음과 같이 사용한다.</h4>
</blockquote>
<pre><code class="language-swift">  var Num = [1, 2, 3, 4, 5, 6, 7]
   for i in Num[2...5]
    {
    print(i)
    } // 3 4 5 6, 닫힌 범위 연산자
   for j in Num[ 1..&lt;3 ]
    {
    print(j)
    } // 2 3, 반 열린 범위 연산자
   for k in Num[4...]
    {
    print(i)
    } // 5 6 7, 한 방향 범위 연산자
   for l in Num[...5]
    {
    print(i)
    } // 1 2 3 4 5 6, 한 방향 범위 연산자</code></pre>
<p>Nil 합병연산자는 옵셔널 변수의 값이 nil일때 다른 값을 넣기 위해 사용한다.</p>
<pre><code class="language-swift">var Ni = CreN ?? defN</code></pre>
<p>변수 Ni의 값이 nil이 아닐 경우에는 CreN을 넣으며, nil일 경우에는 defN을 넣는다. </p>
<p>자식 클래스를 부모 클래스로 형 변환을 할 때는
자식클래스 as 부모클래스로 형변환한다.</p>
<blockquote>
<h3 id="제어문">제어문</h3>
</blockquote>
<p> for-in 반복문은 컬랙션이나 숫자 범위 내의 목록을 반복한다.
ex.   </p>
<pre><code class="language-swift">  var Num = [1, 2, 3, 4, 5, 6, 7]
   for i in Num[2...5]
    {
    print(i)
    } // 3 4 5 6</code></pre>
<p>repeat while은 do while의 대체로 나온 반복문이다.</p>
<pre><code class="language-swift">  repeat{
    }
    while 조건식{
    }</code></pre>
<p>의 형태로 사용하며 적어도 한번은 실행된다.</p>
<p>반복문을 빠져나오기 위해서는 break를, 반복문의 처음으로 돌아가기 위해서는 continue를 사용한다.</p>
<p>if문은 다른 언어의 if문과 비슷하지만 swift에서 사용하는 경우 무조건 괄호를 붙여야 한다. </p>
<pre><code class="language-swift">  if 조건식{ }</code></pre>
<p>기본적으로 불리언 표현식이 true인 경우에만 괄호 내의 코드가 실행된다.</p>
<p>guard문은 if와 반대로 조건식이 거짓일 경우에 괄호 내의 코드가 실행하며, 조건에 맞지 않는 경우 바로 반복문을 빠져나가는 조기 출구 전략을 사용한다.
guard문에서 언래핑된 변수는 guard문밖에서도 사용할 수 있다.
<span style="color:red">guard문은 거짓일 때 수행할 else문을 반드시 포함한다. </p>
<p>switch case문은 case를 사용하면 case내의 코드가 무조건 있어야 하며, where로 조건을 붙일 수 있다.
switch case는 조건에 맞는 case를 만나면 자동으로 break를 하기 때문에 계속 내려가기 위해서는 fallthrough를 사용한다.</p>
<hr>
<p>Smile Han의 Swift강좌를 참고해 작성한 글입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[iOS워크숍 과제1]]></title>
            <link>https://velog.io/@ksy-2311/iOS%EC%9B%8C%ED%81%AC%EC%88%8D-%EA%B3%BC%EC%A0%9C1</link>
            <guid>https://velog.io/@ksy-2311/iOS%EC%9B%8C%ED%81%AC%EC%88%8D-%EA%B3%BC%EC%A0%9C1</guid>
            <pubDate>Thu, 19 Jan 2023 17:09:24 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h4 id="1프로세스와-스레드의-차이는-무엇인가요">1.프로세스와 스레드의 차이는 무엇인가요?</h4>
</blockquote>
<p>A. 프로세스는 실행중인 프로그램을 의미하며, 스레드는 프로세스 내에서의 작업단위다. 스레드는 프로세스의 일부 특성을 가지고 있어 <strong>&#39;경량 프로세스&#39;</strong>라고도 칭한다.</p>
<blockquote>
<h4 id="2교착상태란-무엇이며-교착상태가-발생하기-위해서는-어떤-조건이-있어야-하나요">2.교착상태란 무엇이며, 교착상태가 발생하기 위해서는 어떤 조건이 있어야 하나요?</h4>
</blockquote>
<p>A. 교착상태는 둘 이상의 프로세스들이 자원을 점유하는 상태에서 서로 다른 프로세스가 점유하는 자원을 요구해 무한정 기다리는 현상을 의미한다. 
 상호 배제, 점유와 대기, 비선점, 환형 대기중에 하나라도 만족하면 교착상태가 발생할 수 있다.</p>
<blockquote>
<h4 id="3페이징와-세그멘테이션에-대해서-설명해-주세요">3.페이징와 세그멘테이션에 대해서 설명해 주세요.</h4>
</blockquote>
<p>A. 페이징은 프로세스를 일정한 크기의 페이지로 분할해서 메모리에 적재하는 방식이고, 세그멘테이션은 프로세스를 다양한 크기의 논리적 단위로 나누어 적재시키는 방식이다.</p>
<blockquote>
<h4 id="4first-fit-best-fit-worst-fit에-대해서-설명해-주세요">4.First Fit, Best Fit, Worst Fit에 대해서 설명해 주세요.</h4>
</blockquote>
<p>A. First Fit은 들어갈 수 있는 영역 중 가장 처음의 영역으로 들어가는 방식이다. 
 Best Fit은 들어갈 수 있는 영역 중에서 단편화를 가장 작게 남기는 영역으로 들어가는 방식이다.
 Worst Fit은 들어갈 수 있는 영역 중에서 단편화를 가장 많이 남기는 영역으로 들어가는 방식이다.</p>
<blockquote>
<h4 id="5osi-7계층에-대해서-설명해주세요">5.OSI 7계층에 대해서 설명해주세요.</h4>
</blockquote>
<p>A. OSI 7계층은 다른 시스템 간의 원활한 통신을 위해 ISO에서 제안한 통신규약이다.</p>
<blockquote>
<h4 id="6dnsdomain-name-system가-무엇인가요">6.DNS(Domain Name System)가 무엇인가요?</h4>
</blockquote>
<p>A. DNS은 사람이 읽을 수 있는 도메인 이름을 IP 주소로 변환하는 시스템이다.</p>
<blockquote>
<h4 id="7tcp와-udp의-차이에-대해서-설명해-주세요">7.TCP와 UDP의 차이에 대해서 설명해 주세요.</h4>
</blockquote>
<p>A. TCP는 연결형 서비스를 제공하는데 반해 UDP는 비연결형 서비스를 제공한다.</p>
<blockquote>
<h4 id="8http와-https의-차이는-무엇인가요">8.HTTP와 HTTPS의 차이는 무엇인가요?</h4>
</blockquote>
<p>A. HTTP에 보안 모듈을 결합시킨 프로토콜이 HTTPS이다.</p>
<blockquote>
<h4 id="9http-10과-11의-차이는-무엇인가요">9.HTTP 1.0과 1.1의 차이는 무엇인가요?</h4>
</blockquote>
<p>A. HTTP 1.0은 TCP 세션을 유지하지 않고, 1.1은 TCP 세션을 유지하기 때문에 지속성에 차이가 있다.</p>
<blockquote>
<h4 id="10http-get과-post의-차이는-무엇인가요">10.HTTP GET과 POST의 차이는 무엇인가요?</h4>
</blockquote>
<p>A. GET을 사용하면 URL에 데이터가 보이기 때문에 보안에 취약하지만 POST를 사용하면 패킷에 데이터를 넣어 보내기 때문에 상대적으로 보안에 강하다.</p>
<blockquote>
<h4 id="11쿠키와-세션에-대해서-설명해-주세요">11.쿠키와 세션에 대해서 설명해 주세요.</h4>
</blockquote>
<p>A. 쿠키는 클라이언트에 저장되는 키와 값이 들어있는 작은 데이터 파일이며, 세션은 서버에 저장되는 데이터 파일이다.</p>
<blockquote>
<h4 id="12웹브라우저에서-서버로-요청했을-때-흐름을-설명해주세요">12.웹브라우저에서 서버로 요청했을 때, 흐름을 설명해주세요.</h4>
</blockquote>
<p>A. URL을 입력하면 브라우저가 분석해, 도메인명으로 IP주소를 조회한다. IP와 PORT를 찾으면 HTTP 요청메세지를 생성해 서버에 패킷으로 전송한다. 서버에 패킷이 도착하면 패킷을 조회해 HTTP 응답 메세지를 생성해 브라우저로 전송한다. 브라우저는 도착한 메세지를 렌더링한다.</p>
<blockquote>
<h4 id="13rest-api에-대해서-설명해-주세요">13.REST API에 대해서 설명해 주세요.</h4>
</blockquote>
<p>A. REST는 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것이며, REST의 원리를 따르는 API를 REST API라고 한다.</p>
<blockquote>
<h4 id="14정규화에-대해서-설명해-주세요">14.정규화에 대해서 설명해 주세요.</h4>
</blockquote>
<p>A. 정규화란 종속성 이론을 이용하여 잘못 설계된 관계형 스키마를 분해하여 바람직한 스키마로 만들어가는 과정이다.</p>
<blockquote>
<h4 id="15인덱스란-무엇인가요">15.인덱스란 무엇인가요?</h4>
</blockquote>
<p>A. 검색 시간을 단축시키기 위해 만든 보조적인 데이터 구조다.</p>
<blockquote>
<h4 id="16다익스트라-알고리즘에-대해서-설명해-주세요">16.다익스트라 알고리즘에 대해서 설명해 주세요.</h4>
</blockquote>
<p>A. 다익스트라 알고리즘은 그래프 상에서 시작 정점부터 나머지 각 정점까지의 최단거리를 계산하는 알고리즘이며, 가중치(길이)를 이용하기 때문에 &#39;최소 비용&#39;을 구할 때 주로 사용한다.</p>
<blockquote>
<h4 id="17스택과-큐에-대해서-설명해-주세요">17.스택과 큐에 대해서 설명해 주세요.</h4>
</blockquote>
<p>A. 스택은 한쪽 끝으로만 자료의 삽입, 삭제 작업이 이루어지는 자료 구조며, 큐는 한쪽에서는 자료의 삽입, 다른 한쪽에서는 삭제 작업이 이루어지는 자료 구조다.</p>
<blockquote>
<h4 id="18객체지향이-무엇인가요">18.객체지향이 무엇인가요?</h4>
</blockquote>
<p>A. 현실의 개체를 기계의 부품처럼 하나의 객체로 만들어 객체들을 조립해서 작성할 수 있는 기법이다.</p>
<blockquote>
<h4 id="19객체지향-solid-원칙에-대해서-설명해-주세요">19.객체지향 SOLID 원칙에 대해서 설명해 주세요.</h4>
</blockquote>
<p>A. 객체지향 SOLID 원칙은 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 말하며, SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), ISP(인터페이스 분리 원칙), DIP(의존관계 역전 원칙)의 5가지 원칙이 있다.</p>
<blockquote>
<h4 id="20오버로딩과-오버라이딩의-차이는-무엇인가요">20.오버로딩과 오버라이딩의 차이는 무엇인가요?</h4>
</blockquote>
<p>A. 오버로딩은 하나의 클래스 내에서 메서드명은 같고, 매개변수의 개수나 타입이 다른 함수를 정의하는 것을 의미하고, 오버라이딩은 부모의 메서드를 자식 클래스가 재정의하는 것이다.</p>
<blockquote>
<h4 id="21클래스와-객체에-대해-설명해-주세요">21.클래스와 객체에 대해 설명해 주세요.</h4>
</blockquote>
<p>A. 객체는 데이터와 함수를 묶은 하나의 소프트웨어 모듈이며, 클래스는 공통된 속성과 연산을 갖는 객체의 집합이다.</p>
<blockquote>
<h4 id="22java-접근-제어자에-대해서-각각-설명해-주세요">22.Java 접근 제어자에 대해서 각각 설명해 주세요.</h4>
</blockquote>
<p>A. private은 클래스 내부에서만 접근할 수 있고, public은 모든 영역에서 접근할 수 있다. default은 동일한 패키지내에서 접근할 수 있으며, 기본 접근 제어자다. protected은 동일한 패키지와 상속받은 클래스까지 접근할 수 있다. </p>
<blockquote>
<h4 id="23java-generic에-대해서-설명해-주세요">23.Java Generic에 대해서 설명해 주세요.</h4>
</blockquote>
<p>A. Java Generic은 데이터 타입을 지정하지 않고 사용자의 호출에 의해 타입이 지정되는 것을 의미한다.</p>
<blockquote>
<h4 id="24mvc에-대해서-설명해-주세요">24.MVC에 대해서 설명해 주세요.</h4>
</blockquote>
<p>A. MVC는 모델, 뷰, 컨트롤러의 3개의 부분으로 구조화한 아키텍처 패턴이다.</p>
<blockquote>
<h4 id="25tdd란-무엇인가요">25.TDD란 무엇인가요?</h4>
</blockquote>
<p>A. 반복 테스트를 이용한 소프트웨어 방법론으로 작은 단위의 테스트 케이스를 작성하고 이를 통과하는 코드를 추가하는 단계를 반복하여 구현한다.</p>
<blockquote>
<h4 id="26애자일-방법론이란-무엇인가요">26.애자일 방법론이란 무엇인가요?</h4>
</blockquote>
<p>A. 일정한 주기를 반복하면서 개발 과정을 진행하는 방법론입니다.</p>
<blockquote>
<h4 id="27arcautomatic-reference-counting란-무엇인가요">27.ARC(Automatic Reference Counting)란 무엇인가요?</h4>
</blockquote>
<p>A. ARC은 앱의 참조메모리를 자동으로 관리하는 역할을 하며, Swift의 메모리 관리 모델이다. </p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[iOS워크숍 개강과제2]]></title>
            <link>https://velog.io/@ksy-2311/iOS%EA%B0%9C%EA%B0%95%EA%B3%BC%EC%A0%9C2</link>
            <guid>https://velog.io/@ksy-2311/iOS%EA%B0%9C%EA%B0%95%EA%B3%BC%EC%A0%9C2</guid>
            <pubDate>Tue, 17 Jan 2023 08:42:12 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="헥토이노베이션">헥토이노베이션</h3>
</blockquote>
<h3 id="ios개발-신규개발담당-앱개발1팀">iOS개발 (신규개발담당) 앱개발1팀</h3>
<h4 id="담당업무--ios앱개발">담당업무 : iOS앱개발</h4>
<h4 id="자격조건-및-우대사항">자격조건 및 우대사항</h4>
<p>ㆍObjective C &amp; Swift 개발 가능하신분
ㆍStoryBoard, AutoLayout 에 능숙하신 분
ㆍRestAPI를 활용한 UI 개발 경험이 있으신 분
ㆍPhone Device 제어 경험이 있으신분
   (NFC, Gyroscope, Bluetooth 등)
ㆍ서비스 앱을 론칭하고 1년 이상의 유지보수
   경험이 있는 분
ㆍ하이브리드앱 개발 경험
ㆍiOS 앱 개발 경험</p>
<h3 id="ios개발-신규개발담당-앱개발2팀">iOS개발 (신규개발담당) 앱개발2팀</h3>
<h4 id="담당업무">담당업무</h4>
<p>ㆍ이통사 부가서비스 앱 개발 및 유지보수
ㆍSKT PASS 앱 개발 및 유지보수</p>
<h4 id="자격조건-및-우대사항-1">자격조건 및 우대사항</h4>
<p>ㆍObjective-C, Swift개발 가능
ㆍSDK 배포 및 운영 경험 보유
ㆍAutolayout, Sroryboard 개발 가능한 분
ㆍ하이브리드 앱 개발 경험 및 웹과 네이티브간 다양한 인터페이스 경험 보유자
ㆍ디자인 패턴(MVVM, MVP, MVC) 개발 경험이 있으신 분
ㆍ이통사 부가서비스 개발/유지보수 경험이 있으신 분
ㆍReactive 프로그래밍에 대한 이해도가 높고 Combine 적용 경험</p>
<hr>
<p>모집유형이 2가지여서 2가지 모두 작성했습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[iOS워크숍 개강과제1]]></title>
            <link>https://velog.io/@ksy-2311/iOS</link>
            <guid>https://velog.io/@ksy-2311/iOS</guid>
            <pubDate>Tue, 17 Jan 2023 08:39:10 GMT</pubDate>
            <description><![CDATA[<p>라온시큐어 iOS 개발 (경력 2년이상)</p>
<h3 id="담당업무">담당업무</h3>
<ul>
<li>보안솔루션, 블록체인 제품 관련 앱 개발</li>
</ul>
<h3 id="자격요건">자격요건</h3>
<p><strong>[경력]</strong></p>
<ul>
<li>iOS 개발 경력 2년 이상이신 분</li>
<li>Objective-C 개발 가능하신 분</li>
<li>Autolayout, Storyboard로 개발이 가능하신 분</li>
</ul>
<h3 id="우대사항">우대사항</h3>
<ul>
<li>PKI 개발 또는 Swift, SwiftUI 개발 경험 있으신 분</li>
<li>C, JAVA 개발 가능하신 분</li>
<li>Xcode기반 디버깅 및 jenkins 기반 자동빌드 경험 있으신 분</li>
<li>상용 라이브러리 및 제품 개발 경험 있으신 분</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[15주차 요약]]></title>
            <link>https://velog.io/@ksy-2311/15%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</link>
            <guid>https://velog.io/@ksy-2311/15%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</guid>
            <pubDate>Sun, 12 Dec 2021 16:32:22 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="입출력-객체io-stream-object">입출력 객체(I/O stream object)</h3>
</blockquote>
<p>객체지향 프로그래밍을 하기 위해서는 입출력 객체 스트림을 이용하는 것이 좋다.
입출력 객체를 사용하기 위해서는 전처리기 지시자 &quot;#include&quot;문을 사용하여 <code>&lt;iostream&gt;</code>를 프로그램에 포함해야 한다.
cin 객체는 서식 지정이 필요 없고 입력 장소도 변수 자체를 대상으로 한다.</p>
<blockquote>
<h3 id="ios-클래스">ios 클래스</h3>
</blockquote>
<p>istream 클래스는 입력작업, ostream 클래스는 출력 작업에 필요한 기능들이 정의된 클래스이다.
iostream은 다중 상속된 파생클래스로 입력과 출력 모두를 제공하는 양방향 스트림이다.</p>
<blockquote>
<h3 id="연산자의-중첩">&quot;&lt;&lt;&quot;연산자의 중첩</h3>
</blockquote>
<p>&quot;&lt;&lt;&quot;은 모든 기본 자료형에 대하여 중첩 정의되어 있다.</p>
<blockquote>
<h3 id="형식-입출력">형식 입출력</h3>
</blockquote>
<p>형식 상태는 비트 형태로 표현되는 형식 플래그(format flag) 값에 의해 그 의미가 지정된다.
특정 비트의 값이 0이냐 1이냐에 따라 입출력 형식이 지정된다.
<code>ex. long setf(f1, f2);</code></p>
<blockquote>
<h3 id="입출력-조절자io-manipulator">입출력 조절자(I/O manipulator)</h3>
</blockquote>
<p>입출력 연산자와 함께 연속적으로 직접 기술이 가능하다.
<code>ex. cout&lt;&lt;setw(5)&lt;&lt;50</code>
setw()같이 매개변수를 갖는 조절자를 사용하는 경우에는 헤더 파일 <code>&lt;iomanip&gt;</code>를 포함해야 한다.</p>
<blockquote>
<h3 id="파일-입출력">파일 입출력</h3>
</blockquote>
<p>파일 입출력 동작을 수행하기 위하여 f가 들어간 클래스를 사용해야 한다.
<code>ex. ifstream, ofstream, fstream</code>
fstream 헤더파일에 클래스가 정의되어 있음으로 이 헤더 파일을 사용하여 동작을 수행 할 수 있다.
파일을 개방(open)하고 종결(close)하는 동작이 필요하다.</p>
<blockquote>
<h3 id="파일의-개방종결-형식">파일의 개방/종결 형식</h3>
</blockquote>
<blockquote>
<h4 id="개방형식">개방형식</h4>
</blockquote>
<ul>
<li><code>파일클래스 스트림객체명(파일명, 개방모드);</code></li>
</ul>
<p>*</p>
<pre><code>파일클래스 스트림객체명;
스트림객체명.open(파일명,개방모드);</code></pre><blockquote>
<h4 id="종결형식">종결형식</h4>
</blockquote>
<ul>
<li><code>스트림객체명.close();</code></li>
</ul>
<hr>
<p>C++프로그래밍(21-2학기)한성현교수 강의 내용 변형 및 요약</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[14주차 요약]]></title>
            <link>https://velog.io/@ksy-2311/C%EC%9A%94%EC%95%BD</link>
            <guid>https://velog.io/@ksy-2311/C%EC%9A%94%EC%95%BD</guid>
            <pubDate>Mon, 06 Dec 2021 16:07:47 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="템플릿-포괄적-함수generic-function">템플릿: 포괄적 함수(generic function)</h3>
</blockquote>
<p>포괄적 함수(generic function)다.
인자(매개변수)를 통한 다형성을 제공한다.
함수의 매개변수의 형과 수로 구분이 되고, 코드 자체도 다르게 구성될 수 있다.
코드는 전혀 바뀌지 않고 형만 다른 함수를 필요할 때 사용한다.</p>
<blockquote>
<h3 id="매개변수를-전달하는-방법">매개변수를 전달하는 방법</h3>
</blockquote>
<p>C 언어에서는 기본적으로 실매개 변수의 값을 형식 매개변수로 전달한다.</p>
<h4 id="call-by-value"><em>call by value</em></h4>
<p>형식 매개변수가 변할 때 실매개변수도 변하게 하려면 포인터를 이용하여 실매개 변수의 주소를 형식 매개변수로 전달하는 <em>call by reference</em>로 구현해야 한다.</p>
<blockquote>
<h3 id="포인터와-주소">포인터와 주소</h3>
</blockquote>
<p>메모리의 주소를 저장하려면 일반변수가 아닌 포인터를 사용해야 한다.
포인터는 주소를 저장하는 변수이므로 포인터 변수라고도 할 수 있다.
변수 앞에 &amp;연산자를 사용하면 변수의 메모리 번지를 알 수 있다.
<code>ex.변수가 sum이면 &amp;sum</code>
포인터도 변수이므로 사용하기 전에 선언해야 한다.
자료형과 변수명 사이에 구두점 <code>*</code>를 더 쓰면 된다. </p>
<h4 id="이때-는-곱하기-연산자가-아니다">이때 *는 곱하기 연산자가 아니다.</h4>
<blockquote>
<h3 id="c-언어에서-구두점-vs-연산자">C 언어에서 *(구두점 vs. 연산자)</h3>
</blockquote>
<p>선언문에서 *는 구두점이며, 포인터를 선언할 때 사용한다.
실행문에서 *는 참조 연산자이며, 주소로 가서 값을 가져올 때 사용한다.
참조 연산자일 때 *는 간접 값(indirect value) 연산자, dereferencing 연산자라고도 한다.</p>
<blockquote>
<h3 id="참조자reference">참조자(reference)</h3>
</blockquote>
<p>C++에서만 가능하다.
<code>int &amp; rx = x;</code>
참조자(rx)에 변화를 주면 그 타켓(x)도 변한다.</p>
<blockquote>
<h3 id="stlstandard-template-library">STL(Standard Template Library)</h3>
</blockquote>
<p>C++ 표준라이브러리의 일부분이다.
자주 사용되는 50여 개의 알고리즘과 다양한 자료구조들을 가지고 있다.</p>
<hr>
<blockquote>
<h2 id="stl의-주요-구성-요소">STL의 주요 구성 요소</h2>
</blockquote>
<blockquote>
<h3 id="컨테이너container">컨테이너(container)</h3>
</blockquote>
<p>객체들을 저장하는 객체나 클래스</p>
<blockquote>
<h4 id="시퀀스-컨테이너sequence-container">시퀀스 컨테이너(sequence container)</h4>
</blockquote>
<p><code>vector, deque, list</code></p>
<blockquote>
<h4 id="연관-컨테이너associative-container">연관 컨테이너(associative container)</h4>
</blockquote>
<p><code>set, multiset, map, multimap</code></p>
<blockquote>
<h4 id="연속-메모리-기반-contiquous-memory-컨테이너">연속 메모리 기반 (contiquous-memory) 컨테이너</h4>
</blockquote>
<p>배열 기반 컨테이너(array-based container) 라고도 하며, 데이터 여러 개가 하나의 메모리 단위에 저장한다.
<code>vector, string, deque</code></p>
<blockquote>
<h4 id="노드-기반node-based-컨테이너">노드 기반(node-based) 컨테이너</h4>
</blockquote>
<p>데이터 하나를 하나의 메모리 단위에 저장한다.
<code>list, set, multiset, map, multimap</code></p>
<blockquote>
<h3 id="반복자iterator">반복자(iterator)</h3>
</blockquote>
<p>컨테이너에 저장된 요소를 순회하고 접근하는 객체나 클래스이다.</p>
<blockquote>
<h3 id="알고리즘algorithm">알고리즘(algorithm)</h3>
</blockquote>
<p>데이터를 다루기 위한 함수다.
<code>find, sort, search 등</code></p>
<blockquote>
<h3 id="함수-객체function-object-함수자functor">함수 객체(function object), 함수자(functor)</h3>
</blockquote>
<p>함수처럼 동작하는 객체
operator() 연산자를 중첩한 클래스의 객체</p>
<hr>
<blockquote>
<h3 id="friend함수와-friend클래스">friend함수와 friend클래스</h3>
</blockquote>
<p>해당 클래스의 멤버 함수는 아니지만 클래스의 멤버를 자유롭게 사용할 수 있게 하는 함수이다.</p>
<pre><code>class 클래스명{
friend 리턴형 함수명(매개변수 리스트);
friend 리턴형 클래스명::함수명(매개변수리스트);
};</code></pre><blockquote>
<h3 id="예외처리exception-handling-error-handling">예외처리(exception handling, error handling)</h3>
</blockquote>
<p>에러(error)는 컴파일 에러 / 실행 타임 에러(Run time error)가 있다.
오류 발생을 알리고 종료해 오류를 처리하는 방법이 있지만, 컴퓨터를 종료할 수 없는 경우가 있다.
try로 예외를 감시하고자 하는 문장을 묶고, throw로 예외 발생을 알리고 던지며, catch로 예외를 처리한다.</p>
<hr>
<p>C++프로그래밍(21-2학기)한성현교수 강의 내용 변형 및 요약</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[13주차 요약]]></title>
            <link>https://velog.io/@ksy-2311/13%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</link>
            <guid>https://velog.io/@ksy-2311/13%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</guid>
            <pubDate>Fri, 03 Dec 2021 15:51:21 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="여러-개의-기본-클래스를-동시에-상속">여러 개의 기본 클래스를 동시에 상속</h3>
</blockquote>
<p>현재는 C++만 지원한다.
생성자는 기본 클래스가 지정된 순서대로 왼쪽에서 오른쪽으로 실행된다.
소멸자는 역순으로 실행된다.</p>
<blockquote>
<h3 id="가상함수virtual-function의-필요성">가상함수(virtual function)의 필요성</h3>
</blockquote>
<p>상속받은 클래스의 함수 중 고치고 싶은 함수가 있을 때 사용한다.
상속받은 함수(부모)를 실행하지 않고 자신(자식)의 함수를 실행할 때 사용한다.</p>
<h4 id="가상함수의-구현을-중복overriding이라고-한다"><em>가상함수의 구현을 중복(overriding)이라고 한다.</em></h4>
<blockquote>
<h3 id="오버라이딩-가상함수-구현">오버라이딩: 가상함수 구현</h3>
</blockquote>
<p>파생(자식) 클래스에서 재정의하고자 할 때 사용한다.
기본 클래스의 멤버 함수와 같은 이름의 함수를 파생 클래스에서 재정의하여 사용한다.
가상함수는 기본 클래스와 함수의 리턴값, 매개변수 개수, 형이 완전히 같아야 한다.
함수 중첩과 비슷하다.</p>
<blockquote>
<h3 id="바인딩binding">바인딩(binding)</h3>
</blockquote>
<p>변수와 함수에 대한 메모리 할당이나 함수 호출이 발생했을 때 실제로 처리해야 하는 명령어들이 결정되는 시점이다.
컴파일 시 결정되는 정적(static) 바인딩과 실제 실행할 때(run time) 결정되는 동적(dynamic) 바인딩이 있다.</p>
<blockquote>
<h3 id="정적static-멤버변수">정적(static) 멤버변수</h3>
</blockquote>
<p>모든 객체가 공유하는 멤버 변수이며, 객체들이 정보를 공유할 목적으로 사용하는 변수이다.</p>
<h4 id="객체가-여러-개여도-이-멤버-함수는-하나만-생성된다">객체가 여러 개여도 이 멤버 함수는 하나만 생성된다.</h4>
<blockquote>
<h3 id="가상함수virtual-function">가상함수(virtual function)</h3>
</blockquote>
<p>하나의 이름(인터페이스)으로 여러 개의 수단과 방법을 제공하는 객체지향 프로그래밍의 다형성을 구현하는 한 방법(오버 라이딩을 구현하는 방법)이다.
기본 클래스의 멤버 함수 앞에 &#39;virtual&#39;이라는 키워드를 쓴다.</p>
<blockquote>
<h3 id="c언어의-cast-연산자">C언어의 cast 연산자</h3>
</blockquote>
<p>(자료형)값_이나_변수의 형태로 사용한다.
<code>(int)x, (char)ch, (double)sum</code></p>
<blockquote>
<h3 id="c에서-새로-도입된-cast-연산자">C++에서 새로 도입된 cast 연산자</h3>
</blockquote>
<p><code>static_cast</code>는 <code>(double) sum</code>과 비슷한 역할을 한다.
<code>dynamic_cast</code>는 부모 클래스의 포인터에서 자식 클래스의 포인터로 안전한 <em>down casting</em>을 하기 위해 사용된다.</p>
<hr>
<p>C++프로그래밍(21-2학기)한성현교수 강의 내용 변형 및 요약</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[12주차 요약]]></title>
            <link>https://velog.io/@ksy-2311/12%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</link>
            <guid>https://velog.io/@ksy-2311/12%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</guid>
            <pubDate>Mon, 22 Nov 2021 11:59:05 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="상속성inheritance">상속성(inheritance)</h3>
</blockquote>
<p>C에서 한번 개발된 라이브러리는 정적인 특성이 있기 때문에 추가 및 수정이 불가능하다.
C++에서는 상속성을 통해 이미 존재하는 클래스로부터 기본적인 특성을 물려받되, 새로운 특성만 추가할 수 있다.
C++에서는 부모 클래스를 기본(Base)클래스, 자식 클래스를 파생(Derive) 클래스라고 한다.
상속 과정을 inherits from이라고 한다.</p>
<blockquote>
<h3 id="클래스들의-계층구조">클래스들의 계층구조</h3>
</blockquote>
<p>위쪽의 클래스는 속성이 간단하며, 아래 클래스들의 공통적인 속성만을 갖는다. 
아래쪽의 클래스는 위쪽 클래스의 속성을 상속받으며, 자신의 개별적인 속성을 추가하여 속성이 많아진다. </p>
<blockquote>
<h3 id="기본클래스와--파생클래스--is-a-is_a-is-a-관계">기본클래스와  파생클래스 : is-a, is_a, is a 관계</h3>
</blockquote>
<p><code>A is a subclass of B</code></p>
<p><code>B is a superclass of A</code></p>
<blockquote>
<h3 id="public-상속-접근제어">public 상속 접근제어</h3>
</blockquote>
<p>기본 클래스의 모든 public, protected 멤버들은 파생 클래스의 public, protected 멤버가 된다.
일반적으로 가장 많이 사용하는 상속 접근 제어이다.
기본 클래스의 private 멤버는 어떤 경우에도 자식 클래스에 상속할 수 없다.</p>
<blockquote>
<h3 id="private-상속-접근제어">private 상속 접근제어</h3>
</blockquote>
<p>기본 클래스의 모든 멤버가 파생 클래스의 private 멤버가 된다.
기본 클래스의 public 멤버들은 파생클래스의 멤버 함수 이외에는 접근할 수 없다.</p>
<blockquote>
<h3 id="protected-접근제어속성">protected 접근제어속성</h3>
</blockquote>
<p>기본 클래스에서 private 멤버 속성을 유지하면서 파생 클래스가 접근할 수 있도록 할 경우에 사용한다.
멤버 변수는 protected, 상속은 public을 많이 사용한다.</p>
<blockquote>
<h3 id="상속에서-생성자와-소멸자">상속에서 생성자와 소멸자</h3>
</blockquote>
<p>기본 클래스 생성자는 파생 클래스 생성자보다 먼저 실행된다.
파생 클래스의 소멸자는 기본 클래스의 소멸자보다 먼저 실행된다.</p>
<blockquote>
<h3 id="매개변수가-있는-생성자를-갖는-클래스의-상속">매개변수가 있는 생성자를 갖는 클래스의 상속</h3>
</blockquote>
<p>부모 클래스의 생성자가 매개변수를 가지고 있으면 그 매개변수 개수만큼  자식 클래스의 객체를 만들 때 넘겨줘야 한다.</p>
<hr>
<p>C++프로그래밍(21-2학기)한성현교수 강의 내용 변형 및 요약</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[11주차 요약]]></title>
            <link>https://velog.io/@ksy-2311/11%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</link>
            <guid>https://velog.io/@ksy-2311/11%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</guid>
            <pubDate>Mon, 22 Nov 2021 11:51:27 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="연산자-중첩operator-overloading">연산자 중첩(operator overloading)</h3>
</blockquote>
<p>연산자 오버로딩이라고 한다.
다형성을 구현하는 방법의 하나다.
기존에 사용하고 있는 연산자의 기능을 클래스에서 새롭게 정의하여 사용한다.
특별한 함수 이름을 가진 함수라고 할 수 있다.</p>
<blockquote>
<h3 id="연산자의-개념과-종류">연산자의 개념과 종류</h3>
</blockquote>
<p>연산자(operator)는 변수 또는 상수에 대하여 무엇인가를 행하도록 하는 단어나 기호를 의미한다.
<code>ex. + , - , * , % 등</code>
피연산자(operand)는 연산자가 연산하는 대상을 뜻한다.
피연산자의 수에 따라 단항(unary), 2항(binary), 3항(ternary)으로 구분한다.</p>
<blockquote>
<h3 id="연산자의-우선순위precedence">연산자의 우선순위(Precedence)</h3>
</blockquote>
<p>한 수식에 연산자들이 여러 개 있을 때 우선순위가 제일 높은 것은 괄호 안의 수식이다.
연산은 우선순위가 높은 것부터 실행하며, 우선순위가 같은 경우 왼쪽에서 오른쪽으로 실행한다.
<em>결합방향(Associativity)이 ‘-&gt;’ 이다.</em>
대입연산자는 결합방향이 ‘&lt;-’이다.</p>
<blockquote>
<h3 id="연산자-중첩의-필요성">연산자 중첩의 필요성</h3>
</blockquote>
<p>‘+’연산자가 다양한 덧셈에 사용할 수 있도록 연산자의 의미를 확대 재정의하기 위해 필요하다.
<em>더한다는 의미의 연산은 모두“+”연산자 하나로 구현한다.</em></p>
<blockquote>
<h3 id="--선언문구두점-vs-실행문연산자">* : 선언문(구두점) vs. 실행문(연산자)</h3>
</blockquote>
<p><code>int *px;</code> 포인터 px선언, 선언문에서 *는 포인터를 선언하는 두 점</p>
<p><code>y=*px; px</code>가 저장하고 있는 주소로 가서 값을 가져온다.</p>
<blockquote>
<h3 id="this-포인터">this 포인터</h3>
</blockquote>
<p>this 포인터는 자동으로 시스템이 만들어 주는 포인터이다.
this 포인터에는 현재 객체의 주소가 들어있다.
<code>*this</code>는 객체(의 값이)다.</p>
<blockquote>
<h3 id="연산자-중첩-형식">연산자 중첩 형식</h3>
</blockquote>
<p>객체와 객체 사이의 연산에서 사용자가 원하는 연산을 하도록 한다. 
단항연산자 중첩은 전치와 후치 2가지의 형식을 가진다.
<code>리턴형  operator 연산자명();  //전치, ++x</code></p>
<p><code>리턴형  operator 연산자명(int);  //후치, x++</code></p>
<p>이항연산자 중첩은‘리턴형  operator 연산자명(매개변수);’의 형식을 가진다.</p>
<blockquote>
<h3 id="단항-연산자-중첩">단항 연산자 중첩</h3>
</blockquote>
<p>++, --, -(부호)가 있다.
피연산자가 하나이다.
단항연산자를 중첩할 때는 객체가 정해져 있기 때문에 매개변수가 필요 없다.</p>
<blockquote>
<h3 id="전치-단항-연산자prefix-operator-중첩">전치 단항 연산자(Prefix Operator) 중첩</h3>
</blockquote>
<p>변수명 앞에 연산자가 오는 것을 말한다(++x, --i 등).
전치 연산자는 연산이 먼저 일어나고 대입이 된다.
리턴형 operator 연산자명();의 형식을 가진다.
매개변수가 없다.</p>
<blockquote>
<h3 id="후치-단항-연산자postfix-operator-중첩">후치 단항 연산자(Postfix Operator) 중첩</h3>
</blockquote>
<p>변수명 뒤에 연산자가 오는 것을 말한다(x++, i-- 등).
후치 연산자는 대입이 먼저 일어나고 연산이 된다.
리턴형 operator 연산자명(int);의 형식을 갖는다.
매개변수를 하나 가진다.</p>
<blockquote>
<h3 id="이항-연산자-중첩">이항 연산자 중첩</h3>
</blockquote>
<p>+, -, ×, ÷, % 등 연산자 양쪽에 피연산자가 필요한 연산자이다.
연산자의 왼쪽 피연산자가 연산자 함수의 주체가 되며, 오른쪽 피연산자는 매개변수가 된다.</p>
<blockquote>
<h3 id="형변환-함수type-conversion-function">형변환 함수(Type Conversion Function)</h3>
</blockquote>
<p>한 객체의 자료형을 다른 객체의 자료형으로 변환시키고자 할 때 이용한다.
<code>operator 리턴형() {return 변환값;}</code>
리턴형은 변환하고자 하는 자료형이고 변환값은 변환을 수행할 값이다. 
매개변수를 갖지 않으며 형변환을 수행하는 클래스의 멤버함수이어야 한다.</p>
<blockquote>
<h3 id="연산자-중첩의-제약">연산자 중첩의 제약</h3>
</blockquote>
<p><code>&lt;. &gt;, &lt; .*(멤버  포인터  연산자) &gt;, &lt; :: &gt;</code>
첫 번째 피연산자로 그 객체를 갖는다는 미리 정의된 의미를 가지기 때문에 중첩할 수 없다.
<code>&lt; ?: &gt;, &lt; sizeof &gt;</code>
중첩이 필요 없다고 생각하기 때문에 중첩할 수 없다.</p>
<blockquote>
<h3 id="연산자-중첩시-주의-사항">연산자 중첩시 주의 사항</h3>
</blockquote>
<p>우선순위를 변경할 수 없다.
단항 연산자를 다항 연산자로 변경할 수 없다.
임의의 새로운 연산자를 정의할 수 없다.
&quot;=&quot; 연산자를 제외하고, 연산자는 파생(자식) 클래스에 상속된다.</p>
<hr>
<p>C++프로그래밍(21-2학기)한성현교수 강의 내용 변형 및 요약</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[10주차 요약]]></title>
            <link>https://velog.io/@ksy-2311/10%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</link>
            <guid>https://velog.io/@ksy-2311/10%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</guid>
            <pubDate>Tue, 09 Nov 2021 08:20:24 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="함수-중첩function-overloading">함수 중첩(Function Overloading)</h3>
</blockquote>
<p>다형성을 구현하는 한 가지 방법이다.
C에서는 자료형과 기능에 따라 다른 이름의 함수를 사용한다.</p>
<ul>
<li>기능이 같아도, 자료형이 다를 경우 함수를 다른 것으로 판단하기 때문에 혼란을 막기 위해 다른 이름을 사용했다.</li>
<li>C++에서는 다형성을 제공하기 때문에 하나의 함수명을 
여러 개의 유사 목적으로 사용할 수 있다.
오버로드 된 함수가 자료형만 같고 리턴값만 다른 경우, 중첩할 수 없다.</li>
</ul>
<blockquote>
<h3 id="생성자-중첩">생성자 중첩</h3>
</blockquote>
<p>클래스의 멤버함수, 생성자는 중첩이 가능하다.
생성자 함수도 매개변수를 가질 수 있기 때문에 중첩이 가능하다.
소멸자는 중첩이 불가능하다.
생성자 함수를 중첩시키는 것은 객체에 초기값을 다양하게 주는 선택 기회를 제공하는 것이다.</p>
<blockquote>
<h3 id="디폴트-인자default-parameter-default-argument">디폴트 인자(Default Parameter, Default Argument)</h3>
</blockquote>
<p>int add(int, int);의 형태로, 매개변수가 2개다.
함수 중첩의 축약형이다.
C++에서는 함수 원형을 선언할 때 디폴트 값을 지정할 수 있다. 
해당 매개변수가 주어지지 않으면 디폴트 인자 값이 할당된다. 
<em>필요한 곳에만 디폴트 값을 주면 된다.</em>
디폴트 매개변수의 사용은 함수 중첩의 축약형이다.
디폴트 매개변수를 정의하기 시작하면 그 다음(오른쪽)의 매개변수들은 모두  디폴트 매개변수를 가져야 한다.</p>
<hr>
<p>C++프로그래밍(21-2학기)한성현교수 강의 내용 변형 및 요약</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[9주차 요약]]></title>
            <link>https://velog.io/@ksy-2311/9%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</link>
            <guid>https://velog.io/@ksy-2311/9%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</guid>
            <pubDate>Tue, 02 Nov 2021 09:56:25 GMT</pubDate>
            <description><![CDATA[<p>const char보단 std::string을 사용하는 것이 좋다.
클래스 안에서 만든 멤버함수는 자동 inline함수이지만, 밖에서 만든 것은 자동 inline함수가 아니다.</p>
<blockquote>
<h3 id="const-변수">const 변수</h3>
</blockquote>
<p>전처리기 #define으로 컴파일 전에 변수값을 변경할 수 있다.
const는 변수에 상수의 의미를 갖게 하여 값을 변경할 수 없게 한다.
const는 자료형 앞에서 쓰며, 항상 상수로 바꿀 변수에 초기값을 넣어줘야 한다.
C++11부터는 {}로 초기화를 할 수 있다.</p>
<blockquote>
<h3 id="함수에--사용하는--const">함수에  사용하는  const</h3>
</blockquote>
<p>매개변수가 const인 경우 함수 안에 const를 사용한다.
<code>ex. void display(const int);</code>
리턴값이  const며 reference(&amp;)를  리턴하는  경우, 함수의 자료형 앞에 const를 사용한다.
<code>ex. const int cat(int);</code>
함수가 const며, 멤버변수를 변경하지 않는 경우, 함수 뒤에 const를 사용한다.
<code>ex. int cat(int) const;</code></p>
<blockquote>
<h3 id="const-멤버">const 멤버</h3>
</blockquote>
<p>const형 멤버함수는 멤버변수를 변경하는 치환연산을 수행할 수 없다.
읽기 전용 함수인 get함수 뒤에는 const를 붙이는 것이 좋다.
(안 붙여도 사용이 가능하나, 붙이는 것이 좋다.)
생성자와 소멸자에서는 const를 사용할 수 없다.
멤버변수는 형 앞에 const를, 멤버함수는 함수의 괄호 다음에 const를 추가한다.</p>
<blockquote>
<h3 id="const-객체">const 객체</h3>
</blockquote>
<p>객체가 const로 지정되면 const로 지정된 멤버함수를 호출하는 경우를 제외하고 해당 객체에 초기화된 데이터는 변경할 수 없다.</p>
<blockquote>
<h3 id="포인터">포인터</h3>
</blockquote>
<p>포인터는 주소를 저장하는 변수다.
메모리의 주소를 이용해 메모리의 내용을 직접 접근할 수 있다.
변수의 메모리의 주소는 변수의 앞에 &amp;연산자를 사용하면 알 수 있다.
포인터는 메모리의 주소를 저장해준다.</p>
<blockquote>
<h3 id="포인터와-주소">포인터와 주소</h3>
</blockquote>
<p>메모리의 주소는 위치를 구분하기 위해 순서대로 붙어있는 번호다.</p>
<blockquote>
<h3 id="포인터-선언">포인터 선언</h3>
</blockquote>
<p>자료형과 변수 사이에 구두점 *을 더 쓰면 된다.
일반적으로 변수 앞에 구두점 *을 쓴다.</p>
<blockquote>
<h3 id="참조-연산자-">참조 연산자 *</h3>
</blockquote>
<p>포인터 변수 앞에서만 사용할 수 있다.
실행문에서 사용하며, 포인터의 주소로 가서 값을 가져온다.
참조연산자이다.
곱하기 연산자*보다 우선순위가 높다.</p>
<blockquote>
<h3 id="--선언문구두점-vs-실행문연산자">* : 선언문(구두점) vs. 실행문(연산자)</h3>
</blockquote>
<p>선언문에서는 포인터를 선언할 때 사용한다.
실행문에서는 주소로 가서 값을 가져올 때 사용한다.</p>
<blockquote>
<h3 id="포인터-변수의-크기">포인터 변수의 크기</h3>
</blockquote>
<p>대부분의  온라인  컴파일러는  8바이트이다.
Visual Studio는 기본적으로 4바이트이고 8바이트로 변경 할 수 있다.</p>
<blockquote>
<h3 id="포인터-변수의-자료형">포인터 변수의 자료형?</h3>
</blockquote>
<p><em>자료형 * * *포인트 변수명;</em>
변수가 자료형의 데이터를 참조하기 위해 작성한다.
int형인 경우 변수가 지시하는 곳에 int형의 데이터가 있다는 것을 알려준다.</p>
<blockquote>
<h3 id="포인터의-자료형과-대입할-수-있는-값">포인터의 자료형과 대입할 수 있는 값</h3>
</blockquote>
<p>int *px; 의 int는 int형의 데이터를 참조하기 위한 포인터로, int형의 주소만 대입할 수 있다.</p>
<blockquote>
<h3 id="포인터의-초기화">포인터의 초기화</h3>
</blockquote>
<p>자료형 *포인터_변수명=초기화 주소;
초기화 주소에 특정 번지값을 넣는 것은 위험하다.
변수의 주소로 초기화하는 것이 안전하다.</p>
<blockquote>
<h3 id="sisi"><code>s[i]==*(s+i)</code></h3>
</blockquote>
<p>배열의 이름은 그 배열의 시작 주소를 저장하는 포인터와 같다.</p>
<blockquote>
<h3 id="지역local-변수와--전역global-변수">지역(local) 변수와  전역(global) 변수</h3>
</blockquote>
<p>지역 변수는 해당 함수나 블록({ }) 내에서만 사용할 수 있고 전역 변수는 소스 전체에서 사용할 수 있다.
전역 변수는 값을 찾기 힘들기 때문에 되도록 사용을 자제하고 있다.</p>
<blockquote>
<h3 id="코드-영역과-데이터-영역">코드 영역과 데이터 영역</h3>
</blockquote>
<p>지역 변수는 stack영역을 사용한다.
정적 메모리 stack영역이 넓지 않기 때문에 동적 메모리인 heap영역을 할당받아 사용할 때가 있다.</p>
<blockquote>
<h3 id="컴퓨터의-프로그램-메모리-레이아웃">컴퓨터의 프로그램 메모리 레이아웃</h3>
</blockquote>
<ul>
<li>지역변수는 자신의 지역({ }) 내에서만 유효하며, 함수가 반환되면 사라진다.</li>
<li>전역변수는 프로그램이 끝날 때까지 값을 유지하고, 모든 부분에서 접근이 가능하지만, 이해하기 어렵고 유지 보수하기 어렵다.</li>
<li>동적메모리할당은 지역변수이지만, 할당받은 메모리를 해제하기 전까지 값을 유지한다.</li>
</ul>
<blockquote>
<h3 id="동적-메모리를-사용하는-이유">동적 메모리를 사용하는 이유</h3>
</blockquote>
<ol>
<li>지역변수를 전역변수처럼 프로그램이 끝날 때까지 
값을 유지하고 싶은 경우</li>
<li>프로그램을 실행할 때(runtime) 메모리의 양을 결정해야 하는 경우</li>
<li>스택 공간이 부족하면 stack overflow 오류가 일어나기 때문에 heap에 할당해야 하는 경우</li>
</ol>
<blockquote>
<h3 id="정적-vs-동적-메모리-할당">정적 vs. 동적 메모리 할당</h3>
</blockquote>
<h4 id="정적-메모리-할당">정적 메모리 할당</h4>
<p>컴파일 시 필요한 메모리를 할당한다.
너무 큰 메모리는 할당할 수 없다.</p>
<h4 id="동적-메모리-할당">동적 메모리 할당</h4>
<p>실행시 필요한 메모리(heap)를 할당한다.
필요한 만큼만 잡는다.
메모리의 주소를 사용(포인터 이용)하여 접근하기 때문에 포인터에 대한 이해가 필요하다.</p>
<blockquote>
<h3 id="동적--메모리할당-c-vs-c">동적  메모리할당: C vs. C++</h3>
</blockquote>
<p>C에서는 malloc()함수와 free()함수를 사용한다.
C++에서는 new와 delete를 사용한다.</p>
<blockquote>
<h3 id="new와-delete">new와 delete</h3>
</blockquote>
<p>new는 메모리를 동적으로 할당하고, 할당된 메모리에 대한 주소를 반환하는 연산자이다.
delete는 더 이상 필요 없는 메모리를 해제한다.
<code>ex. int *pi=new int;</code></p>
<blockquote>
<h3 id="new와-delete의-장점">new와 delete의 장점</h3>
</blockquote>
<p>new는 지정된 형의 포인터(메모리 시작주소)를 자동으로 반환한다.
생성자를 자동으로 호출한다.
malloc.h나 stdlib.h를 포함할 필요가 없어진다.</p>
<blockquote>
<h3 id="variable-length-array--실행-가능">Variable-length Array : 실행 가능?</h3>
</blockquote>
<p>visual stdio에서는 사용할 수 없다.
온라인 컴파일러에선 대부분 가능하지만, stack overflow가 발생할 수 있음으로 사용하지 않는 것이 좋다.</p>
<hr>
<p>C++프로그래밍(21-2학기)한성현교수 강의 내용 변형 및 요약</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[7주차 요약]]></title>
            <link>https://velog.io/@ksy-2311/7%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</link>
            <guid>https://velog.io/@ksy-2311/7%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</guid>
            <pubDate>Sun, 17 Oct 2021 19:48:04 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="privateprotected과-public-멤버의-접근-방법">Private(Protected)과 Public 멤버의 접근 방법</h3>
</blockquote>
<blockquote>
<h4 id="privateprotected">Private(Protected)</h4>
</blockquote>
<p>private 함수는 외부에서 접근할 수 없으며, public을 통해서만 접근할 수 있다.
private에는 멤버변수가 주로 들어간다.</p>
<blockquote>
<h4 id="public">Public</h4>
</blockquote>
<p>어디에서나 접근할 수 있다.
외부와 private를 연결하는 통로 역할도 가지고 있다.
멤버변수를 처리하는 멤버함수가 주로 들어간다.</p>
<blockquote>
<h3 id="객체의-멤버-호출">객체의 멤버 호출</h3>
</blockquote>
<p>직접참조연산자‘.’이나 간접참조연산자 -&gt; 을 사용한다.</p>
<ul>
<li>C와 C++ 이외에는 포인터 객체가 없기 때문에 직접참조연산자‘.’를 많이 사용한다.</li>
<li>게임 소스 등 속도가 중요한 경우, 간접참조연산자‘-&gt;’를 많이 사용한다.</li>
<li>‘.’은 객체를 이동시키기 때문에 주소만 옮기는 ‘-&gt;’에 비해 속도가 느리기 때문이다.*</li>
</ul>
<blockquote>
<h3 id="변수와-배열">변수와 배열</h3>
</blockquote>
<blockquote>
<h4 id="변수">변수</h4>
</blockquote>
<p>변수는 하나만 넣을 수 있다.</p>
<blockquote>
<h3 id="배열">배열</h3>
</blockquote>
<p>배열은 많은 수의 변수가 사용될 때 사용하기 유용하다.
대괄호를 이용해서 변수를 몇 개를 넣을 수 있는지 정할 수 있다.
<code>int x[5]면 x[0], x[1], x[2], x[3], x[4] 총 5개의 변수가 생긴다.</code></p>
<blockquote>
<h3 id="일차원-배열">일차원 배열</h3>
</blockquote>
<p><code>예시: int x[5]</code>
배열의 첫 번째 번호는 0이다.
<code>int x[5]의 첫번째 변수는 x[0]이다.</code>
괄호 안에 있는 숫자는 원소라고 한다.</p>
<blockquote>
<h4 id="일차원-배열-초기화">일차원 배열 초기화</h4>
</blockquote>
<p>원소가 많음으로 ‘{}’로 묶어서 초기화한다.
초기화할 때는 초기화할 변수의 개수가 정해져 있기 때문에 대괄호 안의 숫자를 안 써도 실행할 수 있다.</p>
<blockquote>
<h4 id="문자형-배열-초기화">문자형 배열 초기화</h4>
</blockquote>
<p>‘’로 각각의 문자의 원소를 넣는 방법과 “”로 문자열을 넣는 방법이 있다.
&#39;&#39;로 원소를 넣는 경우, 마지막 문자는 null문자인 ‘\0’을 사용해야 한다.
“”로 넣는 경우, 마지막에 null문자가 자동으로 포함된다.</p>
<blockquote>
<h4 id="배열-초기화-방법">배열 초기화 방법</h4>
</blockquote>
<p>배열 원소가 초기화 데이터보다 많으면 나머지 원소는 모두 0으로 초기화된다.
배열 원소가 초기화 데이터보다 적으면 오류가 발생한다.</p>
<blockquote>
<h4 id="다차원-배열">다차원 배열</h4>
</blockquote>
<p>3차원 이상은 어려워서 잘 사용하지 않는다.
2차원 배열은 int x[3][2]의 형태로 사용한다.
2차원 배열의 초기화 방법은 2가지다.
<code>1.int x[4][2]={1,2,3,4,5,6,7,8}</code></p>
<pre><code> 2.int x[4][2]={1,2}
               {3,4}
               {5,6}
               {7,8}
</code></pre><blockquote>
<h4 id="문자열과-문자형-배열">문자열과 문자형 배열</h4>
</blockquote>
<p>문자열은 두 개 이상의 문자 묶음이다.
문자열은 “”로 묶어야 한다.
‘a’는 1바이트, “a”는 null문자가 자동으로 포함되어 있기 때문에 2바이트다.</p>
<blockquote>
<h3 id="배열-복사-strcpy">배열 복사 strcpy()</h3>
</blockquote>
<p>strcpy()는 배열 이름만 사용한다.
(첨자를 사용하면 오류가 발생한다.)
visual studio는 안전하지 않다고 경고가 뜬다.
<code>#define _CRT_SECURE_NO_WARNINGS를 넣어야 한다.</code>
Visual Studio의 경우 #include <string>을 추가해야 하며, 리눅스 환경의 온라인 컴파일러의 경우 #include &lt;string.h&gt;을 추가해야 한다.</p>
<blockquote>
<h3 id="생성자와-소멸자">생성자와 소멸자</h3>
</blockquote>
<p>멤버함수이며, 사용자가 꼭 정의할 필요는 없다.(정의하지 않아도 존재한다.)
직접 정의할 경우, 기존에 존재한 값은 사라진다.
자동으로 호출할 수 있다.</p>
<blockquote>
<h4 id="생성자">생성자</h4>
</blockquote>
<p>멤버함수의 초기화를 한다.
<em>초기화하지 않으면 멤버함수에는 쓰레깃값이 들어간다.</em>
생성자 이름과 클래스명은 같다.
생성자는 예외로 리턴형을 쓰지 않는다.
<code>리턴값이 없으므로 void형을 지정하면 안 된다.</code>
하나의 클래스에 여러 개가 중복해서 존재할 수 있다.</p>
<blockquote>
<h3 id="c에서-변수를-초기화하는-방법">C++에서 변수를 초기화하는 방법</h3>
</blockquote>
<p>int a=10; 는 C에서도 쓰이는 방법으로, 복사 초기화다.
사용하는 것을 추천하지 않다.
int a(10); 은 C++에서 추천하는 방법으로, 직접 초기화다.
int a{10}; 은 유니폼 초기화다.</p>
<blockquote>
<h3 id="소멸자">소멸자</h3>
</blockquote>
<p>객체가 소멸할 때 자동으로 호출된다.
소멸자의 이름은 클래스명과 같다.
<code>생성자의 이름과 같기 때문에, 이를 구분하기 위해 앞에‘~’(tilde)를 붙인다.</code>
하나의 클래스에 유일하다.
리턴형과 매개변수가 없기 때문에 void를 사용할 수 없다.
메모리 청소할 때 쓰인다.</p>
<blockquote>
<h3 id="this포인터">this포인터</h3>
</blockquote>
<p>자동으로 시스템이 만들어주는 포인터다.
객체의 주소를 가지고 있다.
멤버변수는 객체마다 따로 생성되며, 멤버함수는 모든 객체가 공유한다.
<code>this포인터가 이를 이용하여 현재 객체의 주소를 알 수 있다.</code></p>
<hr>
<p>C++프로그래밍(21-2학기)한성현교수 강의 내용 변형 및 요약</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[6주차 요약]]></title>
            <link>https://velog.io/@ksy-2311/6%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</link>
            <guid>https://velog.io/@ksy-2311/6%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</guid>
            <pubDate>Mon, 11 Oct 2021 23:07:59 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="클래스-멤버의-접근권한">클래스 멤버의 접근권한</h3>
</blockquote>
<blockquote>
<h4 id="전용private">전용(Private)</h4>
</blockquote>
<p>전용은 해당 클래스 내부에서만 접근이 가능하다.
C++의 기본속성은 private이다.
멤버 변수는 주로 private로 사용한다.</p>
<blockquote>
<h4 id="범용public">범용(Public)</h4>
</blockquote>
<p>어디에서나 접근할 수 있다.
멤버 함수는 멤버 변수의 접근을 위해 주로 범용으로 사용한다.</p>
<blockquote>
<h4 id="보호protected">보호(Protected)</h4>
</blockquote>
<p>자신과 자식 클래스만 접근할 수 있다.
<em>외부 입장에서는 private와 protected 모두 접근할 수 없기 때문에 같다고 본다.</em></p>
<blockquote>
<h3 id="void">Void</h3>
</blockquote>
<p>리턴값이나 매개변수가 없을 때 사용한다.</p>
<ul>
<li>함수의 괄호 안에 쓰이는 void는 매개변수가 없을 때 사용하는 void이며, 생략할 수 있다.</li>
<li>함수 앞에 void가 쓰일 때는 리턴값이 없다는 것을 의미하며, 이 경우에는 생략할 수 없다.</li>
</ul>
<blockquote>
<h3 id="함수-정의">함수 정의</h3>
</blockquote>
<p>함수를 만드는 것을 함수 정의라고 한다.</p>
<blockquote>
<h4 id="함수-호출">함수 호출</h4>
</blockquote>
<p>argument가 없을 때는 빈칸(void)을 사용한다.</p>
<blockquote>
<h3 id="함수-선언">함수 선언</h3>
</blockquote>
<p>함수의 사용법을 의미하며, 컴파일러에게 함수의 정보를 준다.
함수 뒤에 세미콜론(;)을 붙여서 함수를 선언한다.
ex.<code>void display(void);</code></p>
<blockquote>
<h3 id="함수를-사용할-때">함수를 사용할 때</h3>
</blockquote>
<p>함수를 호출한 값은 직접 보여주기보단 변수에 넣어 사용하는 것이 좋다.
함수를 main()함수 뒤에 정의할 때는 main()함수 앞에 함수를 선언해야 한다.
<em>사용하지 않을 시 오류가 발생한다.</em></p>
<blockquote>
<h3 id="멤버-함수의-선언과-정의">멤버 함수의 선언과 정의</h3>
</blockquote>
<p>멤버 함수는 클래스 안에서 정의하는 방법과 클래스 밖에서 정의하는 방법이 있다.
클래스 안에서 정의하는 경우는 잘 사용하지 않는다.
<code>멤버 함수가 비대해질 경우, 클래스의 몸체도 커지기 때문에 수정이 어렵기 때문이다.</code></p>
<ul>
<li>멤버함수를 클래스 안에서 정의하는 경우<pre><code>class Cat {
private:
  int age;
public:
  int getAge()
  {
      return age;
  }
};
</code></pre></li>
</ul>
<pre><code>
* 멤버함수를 클래스 밖에서 정의하는 경우</code></pre><p>class Cat {
private:
    int age;
public:
    int getAge();
};
int Cat::getAge()
{
    return age;
}</p>
<p>```</p>
<blockquote>
<h3 id="범위-지정-연산자scope-resolution-operator-">범위 지정 연산자(scope resolution operator) &#39;::&#39;</h3>
</blockquote>
<p>앞에 namespace가 있을 때 ‘::’은 어느 클래스에 포함되어 있는지 알려주는 역할을 가진다.
앞에 아무것도 없으면 ‘::’은 함수 안에서 전역변수로 접근하고 싶을 때 사용하는 역할이다.</p>
<blockquote>
<h3 id="using과-namespace">Using과 Namespace</h3>
</blockquote>
<p>namespace는 이름의 충돌하는 것을 막기 위해 사용된다.
모든 식별자(변수, 함수 등의 이름)가 유일하도록 보장하는 코드 영역을 정의해 충돌을 막는다.</p>
<blockquote>
<h3 id="using-지시문">Using 지시문</h3>
</blockquote>
<p>컴파일러가 인식하지 못하는 이름이나 네임스페이스를 알 수 없는 것을 만나면 std 스페이스에서 찾도록 하는 지시문이다.
함수의 이름이 cout, cin등과 같다면 using 지시문을 사용해도 찾을 수 없다는 단점이 있다.</p>
<blockquote>
<h3 id="inline함수">Inline함수</h3>
</blockquote>
<p>컴파일러에 의해 처리된다. 
함수 코드 블록의 복사본인 기계어 코드가 직접 삽입된다.
함수를 호출하고 값을 반환하는데 드는 시간상의 지체(overhead)를 줄일 수 있다.
inline 함수를 반복하다 보면 실행 파일 사이즈가 커진다는 단점이 있다.
Visual C++에서는 한/두 줄의 짧은 실행문을 갖는 함수를 inline 함수로 취급한다.</p>
<blockquote>
<h3 id="자동-inline함수">자동 Inline함수</h3>
</blockquote>
<p>멤버 함수가 클래스 내부에서 정의되면 자동으로 inline 함수가 된다.</p>
<blockquote>
<h4 id="객체의-멤버-호출">객체의 멤버 호출</h4>
</blockquote>
<p>직접 참조연산자는 ‘ . ’을 사용하고, 간접참조연산자는 ‘-&gt;’을 사용한다.</p>
<hr>
<p>C++프로그래밍(21-2학기)한성현교수 강의 내용 변형 및 요약</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[5주차 요약]]></title>
            <link>https://velog.io/@ksy-2311/5%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</link>
            <guid>https://velog.io/@ksy-2311/5%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</guid>
            <pubDate>Sun, 03 Oct 2021 22:15:21 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="구조체">구조체</h3>
</blockquote>
<p>구조체에는 변수만 들어갈 수 있다.
C에서 struct은 구조체로만 사용할 수 있다.
C++에서는 class도 사용할 수 있다.</p>
<h5 id="c에서의-구조체는-함수도-들어갈-수-있다"><strong>(C++에서의 구조체는 함수도 들어갈 수 있다.)</strong></h5>
<p>C++에서는 struct을 생략해도 구조체로 사용이 가능하다.
구조체는 클래스와는 기본 접근 속성이 다르다.
<code>struct은 public, class는 private</code></p>
<blockquote>
<h3 id="포인트-변수">포인트 변수</h3>
</blockquote>
<p>포인터 변수는‘-&gt;’로 접근한다.</p>
<blockquote>
<h4 id="구조체-변수의-초기화와-멤버-대입">구조체 변수의 초기화와 멤버 대입</h4>
</blockquote>
<p>예시</p>
<pre><code class="language-C++">#include &lt;iostream&gt;
class Man { 
public:
    char name[10]; 
    int age; 
    double weight; 
};
int main(void)
{
    Man gildong, sunhee, comso[160];
    gildong.age = 20;
    sunhee.weight = 52.5;
    comso[0].age = 25;
    std::cout &lt;&lt; gildong.age &lt;&lt; &quot; &quot; &lt;&lt; sunhee.weight &lt;&lt; &quot; &quot;&lt;&lt; comso[0].age &lt;&lt; std::endl;
    return 0;
}</code></pre>
<blockquote>
<h3 id="man구조체-선언">Man구조체 선언</h3>
</blockquote>
<p>예시</p>
<pre><code class="language-C++">#include &lt;iostream&gt;
class score {
public:
    char hakbun[10];
    char name[10];
    int kor, eng, tot;
    double ave;
};
int main(void)
{
    score h = { &quot;202345678&quot;,&quot;하니&quot;,80,90 }; 
    h.tot = h.kor + h.eng;
    h.ave = h.tot / 2.0;
    std::cout &lt;&lt; h.hakbun &lt;&lt; &quot; &quot; &lt;&lt; h.name &lt;&lt; &quot; &quot; &lt;&lt; h.kor &lt;&lt; &quot; &quot; &lt;&lt; h.eng &lt;&lt; &quot; &quot; &lt;&lt; h.tot &lt;&lt; &quot; &quot; &lt;&lt; h.ave &lt;&lt; std::endl;
    return 0;//202345678 하니 80 90 170 85.00
}
</code></pre>
<blockquote>
<h3 id="구조체-변수들의-대입-연산">구조체 변수들의 대입 연산</h3>
</blockquote>
<p>예시</p>
<pre><code class="language-C++">#include &lt;iostream&gt;
using std::cout;
using std::endl;
typedef class score {
public:
    char hakbun[10];
    char name[10];
    int kor, eng, tot;
    double ave;
}SCORE;
int main(void)
{
    SCORE j, h = { &quot;202345678&quot;, &quot;하니&quot;,80,90 };
    h.tot = h.kor + h.eng;
    j = h;
    cout &lt;&lt; h.hakbun &lt;&lt; &quot; &quot; &lt;&lt; h.name &lt;&lt; &quot; &quot; &lt;&lt; h.kor &lt;&lt; &quot; &quot; &lt;&lt; h.eng &lt;&lt; &quot; &quot; &lt;&lt; h.tot &lt;&lt; endl;
    cout &lt;&lt; j.hakbun &lt;&lt; &quot; &quot; &lt;&lt; j.name &lt;&lt; &quot; &quot; &lt;&lt; j.kor &lt;&lt; &quot; &quot; &lt;&lt; j.eng &lt;&lt; &quot; &quot; &lt;&lt; j.tot &lt;&lt; endl;
    return 0;
}
</code></pre>
<blockquote>
<h4 id="software-crisis">Software crisis</h4>
</blockquote>
<p>소프트웨어는 시간이 지날수록 비싸진다.
(대부분의 비용은 인건비로 나간다.)
사람마다 개발 스타일이 다른 경우가 많아서 유지보수가 어렵다.
-&gt;개발이 힘들어진다.</p>
<h4 id="이를-막기-위한-대응-방안">이를 막기 위한 대응 방안</h4>
<p>이를 막기 위한 대안이 여러 가지 나왔다.
<em>ex. 객체 지향 프로그래밍, 구조적 프로그래밍</em></p>
<h4 id="구조적-프로그래밍-structured-programing">구조적 프로그래밍 (<strong>structured programing</strong>)</h4>
<p>구조적 프로그래밍은 기능에 따라 함수가 세분되어있다.
수정하기가 어렵기 때문에 프로그램이 복잡해질수록 유지보수가 어려워진다.
구조적 프로그래밍의 단점을 보완하기 위해 나온 것이 객체 지향 프로그래밍이다.</p>
<blockquote>
<h4 id="객체-지향-프로그래밍-oop-object-oriented-programing">객체 지향 프로그래밍 (OOP, Object-Oriented Programing)</h4>
</blockquote>
<p>실세계에 존재하는 객체들을 중심으로 생각한다.
실세계를 반영한다.
프로그램을 수정하기 수월해지기 때문에 소프트웨어 확장 및 재사용 기회가 늘어났다.
자료와 처리 동작(연산=함수, method)을 하나로 합친 
객체(object)개념이 도입되어 있다.
<em>객체는 구체적이며 실체를 가졌다.</em></p>
<p>객체 지향 언어의 실질적 원조는 스몰 토크(Smalltalk, 1972-1980)이다.</p>
<blockquote>
<h3 id="c언어">C++언어</h3>
</blockquote>
<p>C++은 클래스를 가진 C언어다. 
<code>C언어는 객체 지향 언어가 아니다.</code>
C언어와 C++ 언어는 프로그래밍 스타일이 매우 다르다.
<strong>printf()를 cout으로 변경하는 것은 C++에 포함되어 있지만 C++ 학습은 아니다.</strong></p>
<h4 id="중요한-c-문법">중요한 C++ 문법</h4>
<ul>
<li>** inline 함수**</li>
<li><strong>클래스의 생성자(Constructor)와
소멸자(Destructor)</strong></li>
<li><strong>함수 중첩(Function Overloading)</strong></li>
<li><strong>디폴트 인자(Default Parameter)</strong></li>
<li><strong>클래스 상속</strong></li>
<li><strong>가상 함수(Virtual Function)</strong></li>
</ul>
<blockquote>
<h3 id="클래스class">클래스(Class)</h3>
</blockquote>
<p>각 객체의 속성을 정의하는 수단, 즉 객체의 타입이며 객체의 기본 규격이다.
설계도에 비유되는 추상적인 개념이다.
필수적인 것은 아니다. 
<em>그러나 클래스가 없으면 프로그래밍하는 데 어려움이 많다.</em></p>
<p>클래스로부터 만들어진 객체는 인스턴스(instance)라고 한다.
우리나라에서는 객체와 인스턴스를 혼용해서 말한다.
(객체라고 말하는 경우가 많다.)
영어권에서는 주로 인스턴스라고 말한다.</p>
<blockquote>
<h3 id="객체-지향-프로그래밍의-중심-기술">객체 지향 프로그래밍의 중심 기술</h3>
</blockquote>
<h4 id="캡슐화abstraction-data-type추상-자료형">캡슐화(Abstraction Data Type,추상 자료형)</h4>
<p>사용자 정의 자료형이다.
C++에서는 class로 지원한다.
<strong>캡슐화된 정보는 외부에서 접근할 수 없다.</strong>
-&gt;이 특징 때문에 캡슐화된 정보 안에는 완성된 소스가 있다.</p>
<h4 id="상속inheritance">상속(Inheritance)</h4>
<p>기존에 있는 자료 및 연산을 상속받는 것을 의미한다.</p>
<ul>
<li>자료 및 연산을 물려주는 상위 클래스는 기본 클래스, 부모 클래스라고 한다.</li>
<li>상속을 받는 하위 클래스는 파생 클래스, 자식 클래스라고 한다.</li>
</ul>
<p>상위 클래스일수록 일반화되어 있으며, 하위 클래스일수록 세분되고 구체화한 클래스다.
<em><strong>상위 클래스가 필요한 경우는 직접 만들기보다 상속받는 것이 더 프로그래밍하기 수월하다.</strong></em></p>
<h4 id="다형성polymorphism">다형성(Polymorphism)</h4>
<p>poly와 morph가 결합한 단어로, 사전적 의미로 많은 형태를 뜻한다.
유사한 기능을 하나의 이름으로 묶어 복잡도를 감소시킨다.
Overloading은 다형성을 구현하는 방법의 하나다.
유사한 기능을 하나의 이름으로 묶어 복잡도를 감소시킨다.
이름은 <strong>하나</strong>로 써야 한다. (함수 중첩, 연산자 중첩 등)</p>
<blockquote>
<h3 id="uml">UML</h3>
</blockquote>
<p>다이어그램을 그리는 언어</p>
<blockquote>
<h3 id="객체지향-용어비교">객체지향 용어비교</h3>
</blockquote>
<p>조작, 즉 행위는 C++을 제외한 언어에서는 메소드(method)라고 한다.
<code>C++에서는 예외적으로 멤버 함수라고 한다.</code></p>
<p>데이터는 언어마다 부르는 명칭이 다른데, Swift, Delphi, VB에서는 프로퍼티(Property), JAVA, C#,VB·NET에서는 필드(Field), C++에서는 멤버 변수/자료 멤버(Member variable / Data member), Objective-C에서는 Instance variable이라고 한다.</p>
<blockquote>
<h3 id="정수intenger-클래스"><strong>정수(Intenger) 클래스</strong></h3>
</blockquote>
<p>변수 앞에서는 private를 사용하고, 함수 앞에서는 public을 사용한다.
객체 앞에 클래스를 사용해 객체를 정의하는 방법이 있다.</p>
<blockquote>
<h3 id="c에서의-클래스-멤버-접근-권한">C++에서의 클래스 멤버 접근 권한</h3>
</blockquote>
<h4 id="전용private">전용(Private)</h4>
<p>해당 클래스 내부에서만 접근할 수 있다.
캡슐화되어있어 자료 및 연산을 감추는 데 유리하다.</p>
<h4 id="범용public">범용(Public)</h4>
<p>어디에서나 접근할 수 있다.</p>
<h4 id="보호protected">보호(Protected)</h4>
<p>자신과 자식 클래스 외에는 접근할 수 없다.
(private와 비슷하다.)</p>
<hr>
<p>C++프로그래밍(21-2학기)한성현교수 강의 내용 변형 및 요약</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[4주차 요약]]></title>
            <link>https://velog.io/@ksy-2311/4%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</link>
            <guid>https://velog.io/@ksy-2311/4%EC%A3%BC%EC%B0%A8-%EC%9A%94%EC%95%BD</guid>
            <pubDate>Sun, 26 Sep 2021 19:10:37 GMT</pubDate>
            <description><![CDATA[<hr>
<p>함수의 매개변수와 인자로 입력을 하며, 함수가 돌려주는 결과값으로 출력을 한다.</p>
<p>리턴값이나 매개변수가 없으면 void를 사용한다.
<em>(단 void는 생략이 가능하다.)</em></p>
<p>return문은 결과값을 호출한 함수로 반환한다.
return문을 만나면 함수의 나머지 부분에 상관없이 함수의 실행을 종료하고 호출한 함수로 넘어간다.
main()함수의 경우 return문을 만나면 프로그램이 끝난다.</p>
<p>함수를 만드는 것을 함수를 정의 한다고 한다.
함수를 호출할 때는 함수 이름과 괄호 안에 argument를 개수만큼 써야 한다.</p>
<p><code>const char*나 char은 C++에서 std::string으로 대체할 수 있다.</code></p>
<p>함수의 머리 부분을 다음과 같이 하나의 문장 (세미콜론으로 끝남)으로
만드는 것을 함수 선언 또는 함수 원형(prototype)이라 한다.</p>
<p>선언한 함수를 main()함수에서 호출할 때, 함수가 main()함수의 뒤에 있을 경우, main()함수 앞에 선언문을 넣지 않으면 오류가 발생한다.
<code>printf()함수도 #include&lt;stdio.h&gt;를 통해 &lt;stdio.h&gt;파일 안에 있는 _CRTIMP int __cdecl printf(const char *, ...);과 int printf(문자열,…);이 간접적으로 선언되었다.</code></p>
<p>함수가 함수 내에서 자신을 호출하는 것을 재귀호출이라고 한다.
그리고 그를 허용하는 것이 재귀함수라고 한다.
재귀함수는 반복문으로 변환할 수 있다.
재귀함수를 쓸 때는 스택 오버플로우를 주의해야한다.</p>
<p>헤더 파일을 이용하면 전처리기와 함수선언을 .c파일에 직접 안적을 수 있다.</p>
<p>기억 클래스 중 auto변수는 가장 많이 사용하는 기억 클래스이며, 선언한 함수 밖에서 사용하면 기억 영역이 소거된다.
<code>auto변수는 생략이 가능하다.</code>
<em>C++11에서는 기억 클래스가 아닌 동적으로 변환이 가능해졌기 때문에 앞 확장자를 .cpp로 바꿀 경우, 오류가 발생한다.</em></p>
<p>정적(static)함수는 auto함수와 다르게 생략이 불가능하다.
<em>단, 전역 함수는 기본적으로 정적함수이기 때문에 전역함수에서는 생략이 가능하다.</em>
그러나 스택이 아니라 정적 데이터 영역에 저장되기 때문에 auto함수와 다르게 선언한 함수 밖에서도 사용할 수 있다.</p>
<p>구조체는 C에서는 <em>변수의 모임</em>으로만 사용했지만, C++에서는 <em>변수와 함수의 모임</em>으로 사용한다.
<code>차이점은 C에서는 struct, C++에서는 class를 사용하는데, struct은 public을, class는 private를 기본으로 한다.</code>
<code>C++에서는 struct가 기본이기 때문에 따로 선언하지 않아도 된다.</code></p>
<p>구조체 변수가 자신의 멤버한테 접근하기 위해서는 <em>-&gt;</em>나 *&quot;.&quot;*를 사용해야 한다.</p>
<hr>
<p>C++프로그래밍(21-2학기)한성현교수 강의 내용 요약</p>
]]></description>
        </item>
    </channel>
</rss>