<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>0000_0010.log</title>
        <link>https://velog.io/</link>
        <description>= 이 진</description>
        <lastBuildDate>Thu, 13 Apr 2023 16:03:10 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>0000_0010.log</title>
            <url>https://velog.velcdn.com/images/0000_0010/profile/2fc7b017-8298-4440-a90f-99e779cd430e/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 0000_0010.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/0000_0010" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[SwiftUI] Firebase 연동하기-3]]></title>
            <link>https://velog.io/@0000_0010/SwiftUI-Firebase-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0-3</link>
            <guid>https://velog.io/@0000_0010/SwiftUI-Firebase-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0-3</guid>
            <pubDate>Thu, 13 Apr 2023 16:03:10 GMT</pubDate>
            <description><![CDATA[<p>지난 번, Firebase에 저장한 데이터를 View로 불러오는 것을 해봤습니다.</p>
<p>실제 개발을 진행한다면 앞선 방식보다는 정형화된 방법으로 데이터를 저장하고 다루는것이 공동개발과 유지보수에도 좋을 겁니다. 그렇다면 아키텍쳐 디자인 패턴인 <strong>MVVM 패턴</strong>에 대해 공부해보겠습니다.</p>
<h2 id="mvvm-패턴이란">MVVM 패턴이란?</h2>
<p>마이크로소프트에서는 MVVM 패턴에 대해 <a href="https://learn.microsoft.com/ko-kr/windows/uwp/data-binding/data-binding-and-mvvm">다음</a>과 같이 정의하고 있습니다.</p>
<blockquote>
<p>MVVM(Model-View-ViewModel)은 UI 및 비 UI 코드를 분리하기 위한 UI 아키텍처 디자인 패턴입니다. MVVM을 사용하여 UI를 XAML로 선언적으로 정의하고 데이터 바인딩 태그를 사용하여 데이터 및 명령을 포함하는 다른 계층에 연결합니다. 데이터 바인딩 인프라는 UI 및 연결된 데이터를 동기화된 상태로 유지하고, 사용자 입력을 적절한 명령으로 라우팅하는 느슨한 결합을 제공합니다.</p>
<p>느슨한 결합을 제공하기 때문에, 데이터 바인딩을 사용하면 서로 다른 종류의 코드 간에 하드 종속성이 줄어듭니다. 이렇게 하면 다른 단원에서 의도치 않은 부작용을 발생시키지 않고도 개별 코드 단위(메서드, 클래스, 컨트롤 등)를 보다 쉽게 변경할 수 있습니다. 이러한 분리는 여러 디자인 패턴에서 중요한 개념인 문제의 분리 예입니다.</p>
</blockquote>
<p>즉,</p>
<p>1) UI와 UI가 아닌 코드를 분리하여 정의한다.</p>
<p>2) 데이터 바인딩 태그를 사용하여 다른 계층에 연결하고 UI 및 연결된 데이터를 동기화된 상태로 유지한다.</p>
<p>3) 느슨한 결합을 제공하여 하드 종속성이 줄어 의도치 않은 부작용을 발생시키지 않고 개별 코드 단위를 보다 쉽게 변경할 수 있다.</p>
<h2 id="mvvm-패턴의-구조">MVVM 패턴의 구조</h2>
<p><img src="https://user-images.githubusercontent.com/124751277/231778403-aded9c57-1841-4247-8839-ae65d8346512.png" alt="자산 1@3x"></p>
<ul>
<li><p>모델 (Model)</p>
<p>  데이터를 나타내는 형식을 정의한다.</p>
</li>
<li><p>뷰 (View)</p>
<p>  사용자에게 보여지는 역할, 유저의 입력을 받아 뷰 모델(View Model)에게 명령을 내립니다.</p>
<p>  뷰는 재사용성이 강조되며 중복되는 코드를 줄이는 것이 중요하다.</p>
</li>
<li><p>뷰 모델 (View Model)</p>
<p>  핵심적인 비즈니스 로직을 담고 있는 계층입니다.</p>
<p>  뷰(View)와 데이터 바인딩을 하여 연결 후, 뷰(View)에게서 액션을 받고 또한 뷰(View)를 업데이트합니다.</p>
</li>
</ul>
<h2 id="mvvm-패턴의-장점">MVVM 패턴의 장점</h2>
<p>그렇다면 MVVM 패턴을 사용하는 이유는 무엇일까?</p>
<ul>
<li>뷰(View)와 모델(Model)이 서로 전혀 알지 못하기에 독립성을 유지할 수 있습니다.</li>
<li>독립성을 유지하기 때문에 효율적인 유닛테스트가 가능합니다.</li>
<li>뷰(View)와 뷰 모델(View Model)을 바인딩하기 때문에 코드의 양이 줄어듭니다.</li>
</ul>
<h2 id="mvvm-패턴-예제">MVVM 패턴 예제</h2>
<p><a href="https://www.youtube.com/watch?v=uQtM6StTsQg&amp;list=LL&amp;index=5">다음 동영상</a>을 참고하여 SwiftUI에서 MVVM 패턴을 사용해보겠습니다.</p>
<h3 id="--파일-생성">- 파일 생성</h3>
<p>기본적으로 생성되는 <code>뷰(ContentView)</code> 파일과 함께 추가로 <code>모델(Person)</code>, <code>뷰 모델(PersonViewModel)</code> 파일을 생성해줍니다.</p>
<center><img width="270" alt="스크린샷 2023-04-13 오후 11 21 34" src="https://user-images.githubusercontent.com/124751277/231817085-1ff62c57-3674-47ad-b963-1a3338fae48d.png"></center>
생성 단계에서의 코드는 다음과 같습니다.

<pre><code class="language-swift">// Person
import SwiftUI

struct Person: Identifiable {
    var id = UUID()
    var name: String
    var email: String
    var phoneNumber: String
}</code></pre>
<pre><code class="language-swift">// ContentView
import SwiftUI

struct ContentView: View {
    var body: some View {
        Text(&quot;Hello World&quot;)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}</code></pre>
<pre><code class="language-swift">// PersonViewModel
import SwiftUI

class PersonViewModel: ObservableObject {
    @Published var people: [Person] = []
}</code></pre>
<p>뷰 모델에는 <code>ObservableObject</code> 프로토콜을 부여하여 후에 뷰가 뷰 모델의 변경사항을 감시할 수 있게 됩니다.</p>
<p>추가로 <code>@Published</code>로 표시된 속성이 있는 오브젝트가 변경될 때마다 해당 오브젝트를 사용하는 모든 뷰가 다시 로드되어 해당 변경 사항을 반영합니다.</p>
<h3 id="--뷰-모델에-기능과-데이터를-추가합니다">- 뷰 모델에 기능과 데이터를 추가합니다.</h3>
<p>다음 포스팅에는 Firebase로부터 가져온 데이터를 저장하고 활용하겠지만 지금은 데이터를 임의로 추가해줍니다.</p>
<pre><code class="language-swift">// PersonViewModel

import SwiftUI

class PersonViewModel: ObservableObject {
    @Published var people: [Person] = []

    init() {
        addPeople()
    }

    func addPeople() {
        people = peopleData
    }

    func shuffleOrder() {
        people.shuffle()
    }

    func reverseOrder() {
        people.reverse()
    }

    func removeLastPerson() {
        people.removeLast()
    }
}

let peopleData = [
    Person(name: &quot;Paul Atreides&quot;, email: &quot;Paul@naver.com&quot;, phoneNumber: &quot;111-1111&quot;),
    Person(name: &quot;Lady Jessica&quot;, email: &quot;Jessica@naver.com&quot;, phoneNumber: &quot;222-2222&quot;),
    Person(name: &quot;Duke Atreides&quot;, email: &quot;Leto@naver.com&quot;, phoneNumber: &quot;333-3333&quot;),
    Person(name: &quot;Baron Harkonnen&quot;, email: &quot;Harkonnen@naver.com&quot;, phoneNumber: &quot;444-4444&quot;),
    Person(name: &quot;Duncan Idaho&quot;, email: &quot;Duncan@naver.com&quot;, phoneNumber: &quot;555-5555&quot;)
]</code></pre>
<p>데이터를 생성해주고 <code>init()</code>을 사용하여 최초 실행 시 <code>people</code>변수에 데이터를 추가해 줍니다.</p>
<h3 id="--데이터-바인딩">- 데이터 바인딩</h3>
<pre><code class="language-swift">// ContentView
import SwiftUI

struct ContentView: View {
    @ObservedObject var viewModel = PersonViewModel()

    var body: some View {
        VStack(alignment: .leading) {
            ForEach(viewModel.people) { person in
                HStack {
                    Text(person.name)
                        .font(.title)
                    Text(person.email)
                }
            }
            Button {
                viewModel.reverseOrder()
            } label: {
                Text(&quot;Reverse&quot;)
            }
            Button {
                viewModel.removeLastPerson()
            } label: {
                Text(&quot;RemoveLast&quot;)
            }
        }
        .padding()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}</code></pre>
<p><code>@ObservedObject</code>는 관찰중인 객체의 변경에 반응해서 화면을 업데이트할 수 있게 해주는 프로퍼티 래퍼입니다. <code>ObservableObject</code>속성을 사용하는 <code>PersonViewModel</code>의 변경사항을 감시하게 됩니다.</p>
<p><code>PersonViewModel</code>의 인스턴스를 생성하고 프로퍼티를 사용하여 저장된 데이터를 불러오고 사용할 수 있습니다.</p>
<center><img width="250px" alt="스크린샷 2023-04-14 오전 12 00 45" src="https://user-images.githubusercontent.com/124751277/231802570-5e09e7e4-cc56-4663-86f2-df06b9279c23.png"></center>


<blockquote>
<p>마지막으로 MVVM 패턴의 불필요성에 대한 글이 있어 함께 공유합니다.</p>
<p><a href="https://gist.github.com/unnnyong/439555659aa04bbbf78b2fcae9de7661">SwiftUI에서 MVVM 사용을 멈추자&quot;라고 생각이 들었던 이유</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SwiftUI] Firebase와 연동하기-1]]></title>
            <link>https://velog.io/@0000_0010/SwiftUI-firebase%EC%99%80-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0-1</link>
            <guid>https://velog.io/@0000_0010/SwiftUI-firebase%EC%99%80-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0-1</guid>
            <pubDate>Tue, 11 Apr 2023 15:57:11 GMT</pubDate>
            <description><![CDATA[<p>앱에 사용되는 데이터를 firebase의 firestore를 통해 사용할 것이다.
그러기 위해서는 몇 가지 준비단계가 필요하다.</p>
<h2 id="0-xcode에서-새로운-프로젝트-생성">0. Xcode에서 새로운 프로젝트 생성</h2>
<p>새로운 SwiftUI 프로젝트를 생성한다.</p>
<h2 id="1-firebase-프로젝트-생성">1. Firebase 프로젝트 생성</h2>
<p><a href="https://console.firebase.google.com/u/0/?hl=ko">Firebase console</a>에 들어가 새로운 프로젝트를 생성한다.
<img src="https://velog.velcdn.com/images/0000_0010/post/dd8a11c7-7943-47d0-be6d-80ce6f26d775/image.png" alt=""></p>
<p>iOS를 선택하여 다음 단계로 넘어간다.</p>
<h2 id="2-apple-앱에-firebase-추가">2. Apple 앱에 Firebase 추가</h2>
<h3 id="1-앱-등록">1) 앱 등록</h3>
<p><img src="https://velog.velcdn.com/images/0000_0010/post/c39b7385-7956-4e2b-abbf-a35ab5a1f403/image.png" alt="">
<strong>Apple 번들 ID</strong>는 프로젝트명.xcodeproj &gt; General &gt; Identity &gt; Bundle Identifier에서 확인할 수 있다.
<img src="https://velog.velcdn.com/images/0000_0010/post/efd2170d-7944-4b11-9a35-d3a3c0bf272f/image.png" alt=""></p>
<h3 id="2-구성-파일-다운로드">2) 구성 파일 다운로드</h3>
<p><img src="https://velog.velcdn.com/images/0000_0010/post/51a9a8a3-3c58-4fd6-a76e-4778091ecba0/image.png" alt="">
제공되는 파일을 다운받아 프로젝트 하단에 추가해준다.
<img src="https://velog.velcdn.com/images/0000_0010/post/ae5a8f08-b0cd-41e9-9aee-366b1caba1a4/image.png" alt="">
(다양한 방법으로 파일을 추가할 수 있지만 그럴 경우 에러가 발생한다는 이야기가 있으므로 <code>Add Files to...</code>로 추가해주는 것을 추천한다.)</p>
<h3 id="3-firebase-sdk-추가">3) Firebase SDK 추가</h3>
<p><img src="https://velog.velcdn.com/images/0000_0010/post/6412dbfa-c114-4286-baaa-3d9536701775/image.png" alt="">
Xcode에서 <strong>File &gt; Add Packages</strong>로 이동하여 검색란에 주어진 URL을 입력하여 나오는 패키지를 <code>Add Packages</code>한다.
<img src="https://velog.velcdn.com/images/0000_0010/post/e974ff6c-88b3-4cc7-b8a8-1fccdf3c4ec8/image.png" alt="">
<img src="https://velog.velcdn.com/images/0000_0010/post/eb9c9214-1388-47c5-8bfb-88881692c6de/image.png" alt=""></p>
<h3 id="4-초기화-코드-추가">4) 초기화 코드 추가</h3>
<p><img src="https://velog.velcdn.com/images/0000_0010/post/b458db68-91e7-409c-aa9a-968bfb8dcd22/image.png" alt="">
예시에는 위와 같은 코드로 나와있지만 다음과 같은 코드로도 적용 가능하다.
(ContentView.swift 파일이 아닌 프로젝트 생성 시 자동으로 생성되는 &#39;<strong>프로젝트명App.swift</strong>&#39; 파일이다.)</p>
<pre><code class="language-swift">//프로젝트명App.swift
import SwiftUI
import Firebase

@main
struct 프로젝트명App: App {

    init() {
        FirebaseApp.configure()
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}</code></pre>
<p>다음 포스팅에서는 Firebase에 간단한 데이터를 저장하고 앱으로는 그 데이터를 보여주는 것을 해보겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SwiftUI] How to Hide Tab Bar]]></title>
            <link>https://velog.io/@0000_0010/SwiftUI-How-to-Hide-Tab-Bar</link>
            <guid>https://velog.io/@0000_0010/SwiftUI-How-to-Hide-Tab-Bar</guid>
            <pubDate>Mon, 10 Apr 2023 09:36:55 GMT</pubDate>
            <description><![CDATA[<p><a href="https://velog.io/@0000_0010/SwiftUI-Custom-Tab-Bar">커스텀 탭바</a>를 통해 보여줄 페이지를 생성하였다.
각 페이지의 상단에는 NavigationLink를 통해 새로운 페이지로 넘어갈 수 있게 하였다.
<img src="https://velog.velcdn.com/images/0000_0010/post/ef5e67e6-ddad-4100-b26e-4d93cf3b304c/image.GIF" alt=""></p>
<p>그러나, 새로운 페이지가 실행돼도 하단의 탭바가 사라지지 않고 존재했다.
원인을 찾아보니 NavigationStack의 위치 때문에 발생한 것이었다.
<a href="https://github.com/TreatTrick/Hide-TabBar-In-SwiftUI">해당 사이트</a>를 참고하였다.</p>
<img src = "https://velog.velcdn.com/images/0000_0010/post/f0cc676a-6faa-4447-b3d5-866f7dcab5ce/image.png" width="30%">

<p>기존 구조는 NavigationView()가 NavigationLink의 바로 상위에서 감싸고 있었다. 이는 새로운 페이지로 이동하여도 하단의 CustomTabView가 보이게 되는 사태를 초래했다.</p>
<img src = https://velog.velcdn.com/images/0000_0010/post/2abdff04-e6b2-4d63-b289-800e8a072779/image.png width="30%">

<p>수정한 구조는 NavigationView()가 가장 상위단계에 위치하게 된다. 이를 통해 새로운 페이지로 이동할 시 CustomTabView가 보이지 않게 된다.</p>
<p><img src="https://velog.velcdn.com/images/0000_0010/post/712f66c6-4731-45bb-87cf-2018258d19ee/image.GIF" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SwiftUI] Custom Tab Bar]]></title>
            <link>https://velog.io/@0000_0010/SwiftUI-Custom-Tab-Bar</link>
            <guid>https://velog.io/@0000_0010/SwiftUI-Custom-Tab-Bar</guid>
            <pubDate>Fri, 07 Apr 2023 05:19:00 GMT</pubDate>
            <description><![CDATA[<p>앱을 사용하다보면 우리는 다양한 <strong>Tab bar</strong>를 보게된다.
<img src="https://velog.velcdn.com/images/0000_0010/post/55daed96-c85b-42cf-9173-fbfb4408c34e/image.png" alt=""></p>
<p>SwiftUI에서는 <strong>TabView</strong>를 통해 쉽게 구현할 수 있다.</p>
<pre><code class="language-swift">//TabView
struct ContentView : View {
  var body: some View {
    TabView {
      Text(&quot;The First Tab&quot;)
        .tabItem {
          Image(systemName: &quot;1.square.fill&quot;)
        }
      Text(&quot;The Second Tab&quot;)
        .tabItem {
          Image(systemName: &quot;2.square.fill&quot;)
        }
      Text(&quot;The Third Tab&quot;)
        .tabItem {
            Image(systemName: &quot;3.square.fill&quot;)
        }
    }
  }
}</code></pre>
<p><strong><div align="center">[SwiftUI의 TabView]</div></strong></p>
<p><img src="https://velog.velcdn.com/images/0000_0010/post/dffad987-57fb-4413-b988-1f6a75703c42/image.GIF" alt=""></p>
<p>하지만 내가 만들고자 하는 Tab Bar를 구현하기 위해서는 많은 수정이 불가피했다.
<a href="https://www.youtube.com/watch?v=v19fln0e_qQ">다음 동영상</a>을 참고하여 <strong>Custom Tab Bar</strong>를 구현해보았다.</p>
<pre><code class="language-swift">//Custom TabView
enum Tab {
    case first
    case second
    case third
}

struct ContentView : View {
    @State var selectedTab: Tab = .first
    var body: some View {
        VStack {
            Spacer()
            switch selectedTab {
            case .first:
                Text(&quot;The First Tab&quot;)
            case .second:
                Text(&quot;The Second Tab&quot;)
            case .third:
                Text(&quot;The Third Tab&quot;)
            }
            Spacer()
            CustomTabView(selectedTab: $selectedTab)
        }
    }
}

struct CustomTabView: View {
    @Binding var selectedTab: Tab
    var body: some View {
        HStack {
            Spacer()
            Button() {
                selectedTab = .first
            } label: {
                Image(systemName: &quot;1.square.fill&quot;)
            }
            Spacer()
            Button {
                selectedTab = .second
            } label: {
                Image(systemName: &quot;2.square.fill&quot;)
            }
            Spacer()
            Button {
                selectedTab = .third
            } label: {
                Image(systemName: &quot;3.square.fill&quot;)
            }
            Spacer()
        }
    }

}</code></pre>
<p><strong><div align="center">[Custom TabView]</div></strong></p>
<p><img src="https://velog.velcdn.com/images/0000_0010/post/15112b0f-7ca2-48ba-8a7b-e17c79979a42/image.GIF" alt=""></p>
<p>ZStack을 사용해 동그란 버튼을 만들고 offset으로 위치를 변경하였다.</p>
<pre><code class="language-swift">struct CustomTabView: View {
    @Binding var selectedTab: Tab
    var body: some View {
        HStack {
            Spacer()
            Button() {
                selectedTab = .first
            } label: {
                Image(systemName: &quot;1.square&quot;)
            }
            Spacer()
            ZStack {
                Circle()
                    .foregroundColor(Color(.orange))
                    .frame(width: 90, height: 90)
                Button {
                    selectedTab = .second
                } label: {
                    Image(systemName: &quot;2.square&quot;)
                }
            }
            .offset(y: -32)
            Spacer()
            Button {
                selectedTab = .third
            } label: {
                Image(systemName: &quot;3.square&quot;)
            }
            Spacer()
        }
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/0000_0010/post/7f53be7d-322c-4f6a-933a-0075cf977633/image.GIF" alt=""></p>
<p>Tab Bar의 배경은 도형을 그리는 것이 익숙치 않아 이미지로 넣어주었고 색상은 Assets에 &quot;Symbol&quot;로 지정하여 사용하였다.
몇가지를 추가로 수정한 코드와 결과는 다음과 같다.</p>
<pre><code class="language-swift">struct CustomTabView: View {

    @Binding var selectedTab: Tab

    var body: some View {
        ZStack {
            Image(&quot;background&quot;)
                .resizable()
                .aspectRatio(contentMode: .fill)
                .offset(y: 15)
            HStack {
                Spacer()
                Button {
                    selectedTab = .home
                } label: {
                    Image(systemName: selectedTab == .home ? &quot;house.fill&quot; : &quot;house&quot;)
                        .resizable()
                        .aspectRatio(contentMode: .fit)
                        .frame(width: 30)
                        .foregroundColor(.white)
                }
                Spacer()
                Button {
                    selectedTab = .shop
                } label: {
                    ZStack {
                        Circle()
                            .foregroundColor(Color(&quot;Symbol&quot;))
                            .frame(width: 90, height: 90)
                        Image(systemName: selectedTab == .shop ? &quot;basket.fill&quot; : &quot;basket&quot;)
                            .resizable()
                            .aspectRatio(contentMode: .fit)
                            .frame(width: 40)
                            .foregroundColor(.white)
                    }
                    .offset(y: -32)
                }
                Spacer()
                Button {
                    selectedTab = .profile
                } label: {
                    Image(systemName: selectedTab == .profile ? &quot;person.fill&quot; : &quot;person&quot;)
                        .resizable()
                        .aspectRatio(contentMode: .fit)
                        .frame(width: 30)
                        .foregroundColor(.white)
                }
                Spacer()
            }
        }
        .frame(height: 50)
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/0000_0010/post/7d2320d3-9e26-4928-a736-e16efc056c61/image.GIF" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Swift] Argument label? Parameter name?]]></title>
            <link>https://velog.io/@0000_0010/Swift-Argument-label-Parameter-name</link>
            <guid>https://velog.io/@0000_0010/Swift-Argument-label-Parameter-name</guid>
            <pubDate>Wed, 22 Mar 2023 15:31:03 GMT</pubDate>
            <description><![CDATA[<p>Swift에서 함수를 사용하다보면 <strong>argument label</strong>과 <strong>parameter name</strong>이 혼동될 때가 있다. 
이 참에 확실히 정리해보겠다.</p>
<h2 id="-argument-parameter-그게-뭔데">• Argument, Parameter 그게 뭔데?</h2>
<p>다음은 Swift에서의 함수 예시이다.</p>
<pre><code class="language-swift">func plus(a: Int, b: Int) -&gt; Int {
    return a + b
}

plus(4, 6)</code></pre>
<p>함수를 정의할 때 사용되는 변수를 <strong>Parameter</strong>(매개변수),
실제로 함수가 호출될 때 넘기는 변수값을 <strong>Argument</strong>(인수) 라고 한다.
위 예시에서 Parameter는 <code>a</code>, <code>b</code>가, Argument는 <code>4</code>, <code>6</code>이 된다.</p>
<h2 id="argument-label과-parameter-name">•Argument label과 Parameter name</h2>
<p>Swift에서는 함수를 정의할 때 함수 사용자의 입장에서 매개변수의 역할을 좀 더 명확하게 표현하고자 할 때 <strong>Argument label</strong>(인자이름)을 사용할 수 있다.</p>
<pre><code class="language-swift">func 함수명(인자이름 매개변수: 인자타입) -&gt; (반환 타입) {
  var result = 매개변수
  return result
}

함수명(인자이름: 15)</code></pre>
<pre><code class="language-swift">func convertToString(from numbers: Set&lt;Int&gt;) -&gt; String {
    let result = numbers.map { String($0) }.joined(separator: &quot;, &quot;)

    return result
}

let exampleNumbers: Set&lt;Int&gt; = [2, 4, 1, 6, 5]
convertToString(from: exampleNumbers) // &quot;2, 4, 1, 6, 5&quot;</code></pre>
<p>위 예시에서 <strong>Parameter name</strong>은 <code>numbers</code>가, <strong>Argument label</strong>은 <code>from</code>이 된다.</p>
<h2 id="-그럼-이건">• 그럼 이건?</h2>
<p>다음 예시에서 Parameter name과 Argument label은 각각 무엇일까?</p>
<pre><code class="language-swift">func greet(person: String) {
    let greeting = &quot;Hello, &quot; + person + &quot;!&quot;
    print(greeting)
}

greet(person: &quot;Jimmy&quot;)    // &quot;Hello, Jimmy!&quot;</code></pre>
<p>Parameter name과 Argument label이 구별되어 있지 않은 경우엔 <strong>동일한 의미</strong>가 된다.
즉, 모두 <code>person</code>을 의미한다.</p>
<blockquote>
<p><a href="https://docs.swift.org/swift-book/documentation/the-swift-programming-language/functions/#:~:text=By%20default%2C%20parameters%20use%20their%20parameter%20name%20as%20their%20argument%20label."><em>By default, parameters use their parameter name as their argument label.</em></a></p>
</blockquote>
<h2 id="-번외">• 번외</h2>
<p>함수를 호출할 때 Argument label을 쓰는 것이 번거로울 경우도 있습니다.
이 때는 <code>_</code>를 통해 인자이름을 생략하여 쓸 수 있습니다.</p>
<pre><code class="language-swift">func orderTo(_ coffee: String) {
    print(&quot;주문하신 \(coffee) 나왔습니다.&quot;)
}

orderTo(&quot;caffeLatte&quot;)    // &quot;주문하신 caffeLatte 나왔습니다.&quot;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Swift] API DESIGN GUIDELINES - Naming]]></title>
            <link>https://velog.io/@0000_0010/Swift-Naming</link>
            <guid>https://velog.io/@0000_0010/Swift-Naming</guid>
            <pubDate>Mon, 20 Mar 2023 12:56:13 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.swift.org/documentation/api-design-guidelines/#naming">Swift API DESIGN GUIDELINES</a> 참고</p>
<blockquote>
<ul>
<li>Promote Clear Usage (명확하게 사용하기)</li>
<li>Strive for Fluent Usage (자연스러운 사용을 위해 노력하기)</li>
<li>Use Terminology Well (적절한 기술 용어 사용하기)</li>
</ul>
</blockquote>
<h2 id="-promote-clear-usage-명확하게-사용하기">• Promote Clear Usage (명확하게 사용하기)</h2>
<ul>
<li><p><strong>Include all the words needed to avoid ambiguity</strong>
(모호함을 피하기 위해 모든 단어를 포함한다.)</p>
<pre><code class="language-swift">✅
extension List {
public mutating func remove(at position: Index) -&gt; Element
}
employees.remove(at: x)</code></pre>
<pre><code class="language-swift">⛔️
employees.remove(x) // unclear: are we removing x?</code></pre>
<p><code>at</code> 이라는 단어를 생략한다면 x의 쓰임을 분명하게 알 수 없다.</p>
</li>
<li><p><strong>Omit needless words</strong>
(불필요한 단어는 생락한다.)</p>
<pre><code class="language-swift">⛔️
public mutating func removeElement(_ member: Element) -&gt; Element?
</code></pre>
</li>
</ul>
<p>allViews.removeElement(cancelButton)</p>
<pre><code>```swift
✅
public mutating func remove(_ member: Element) -&gt; Element?

allViews.remove(cancelButton) // clearer</code></pre><p>분명한 의도를 위해 더 많은 단어가 필요할 수 있지만, 읽는 사람이 이미 알고 있는 <strong>중복</strong>되는 정보는 생략한다.</p>
<pre><code class="language-swift">⛔️
func setIntToString(setInt: Set&lt;Int&gt;) -&gt; String {
    let setInt = setInt
    let setString = setInt.map {String($0)}
    let string = setString.joined(separator: &quot;, &quot;)

    return string
}</code></pre>
<pre><code class="language-swift">✅
func convertToString(from numbers: Set&lt;Int&gt;) -&gt; String {
    let result = numbers.map {String($0)}.joined(separator: &quot;, &quot;)

    return result
}</code></pre>
<p>특히, <strong>타입</strong> 정보만 반복하는 단어는 생략한다.
타입 제약이 아닌 <strong>해당 역할</strong>에 따라 변수, 매개변수 및 연관 타입을 명명한다.</p>
<h2 id="-strive-for-fluent-usage-자연스러운-사용을-위해-노력하기">• Strive for Fluent Usage (자연스러운 사용을 위해 노력하기)</h2>
<ul>
<li><strong>Prefer method and function names that make use sites form grammatical English phrases.</strong>
(사용되는 메서드와 함수의 이름은 영어 문법에 맞는 구가 되는 것이 좋다.)<pre><code class="language-swift">✅
x.insert(y, at: z)          “x, insert y at z”
x.subViews(havingColor: y)  “x&#39;s subviews having color y”
x.capitalizingNouns()       “x, capitalizing nouns”</code></pre>
<pre><code class="language-swift">⛔️
x.insert(y, position: z)
x.subViews(color: y)
x.nounCapitalize()</code></pre>
</li>
<li><strong>Begin names of factory methods with “make”</strong>, e.g. x.makeIterator().
(x.makeIterator()와 같이 팩토리 메서드는 &quot;make&quot;로 시작한다.)</li>
<li><strong>Name functions and methods according to their side-effects</strong>
(함수와 메서드는 그 부수 효과에 따라서 명명한다.)</li>
<li><ul>
<li><ul>
<li>without side-effects<strong>, e.g. x.distance(to: y), i.successor()
부수 효과가 없는 함수 및 메서드는 **명사 구</strong>로 읽는다.</li>
<li><ul>
<li><ul>
<li>with side-effects<strong>, e.g., print(x), x.sort(), x.append(y)
부수 효과가 있는 함수 및 메서드는 명령형인 **동사 구</strong>로 읽는다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="-use-terminology-well-적절한-기술-용어-사용하기">• Use Terminology Well (적절한 기술 용어 사용하기)</h2>
<ul>
<li><strong>Avoid obscure terms</strong>
(이해하기 힘든 용어는 피한다.)
Don’t say “epidermis” if “skin” will serve your purpose.
&quot;피부&quot; 로 의미가 전달된다면 &quot;표피&quot; 로 말하지 않는다.</li>
<li><strong>Avoid abbreviations.</strong>
(축약어는 피한다.)<pre><code class="language-swift">⛔️
var randomNum: Int
var resultArr: [String]</code></pre>
<pre><code class="language-swift">✅
var randomNumber: Int
var resultArray: [String]</code></pre>
</li>
<li><strong>Embrace precedent</strong>
(선례를 따르도록 한다.)
It is better to name a contiguous data structure <code>Array</code> than to use a simplified term such as <code>List</code>.
연속적인 자료구조의 이름으로 <code>List</code>보다는 <code>Array</code>를 사용하는 것이 좋다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[후기] 노션AI 사용후기]]></title>
            <link>https://velog.io/@0000_0010/%ED%9B%84%EA%B8%B0-%EB%85%B8%EC%85%98AI-%EC%82%AC%EC%9A%A9%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@0000_0010/%ED%9B%84%EA%B8%B0-%EB%85%B8%EC%85%98AI-%EC%82%AC%EC%9A%A9%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Thu, 23 Feb 2023 07:16:33 GMT</pubDate>
            <description><![CDATA[<p>노션에서도 AI서비스를 출시했습니다. 사용방법은 간단합니다.
스페이스바만 누르면 다음과 같이 노션AI를 이용할 수 있습니다.
<img src = 'https://velog.velcdn.com/images/0000_0010/post/14c28220-7858-4034-b7f1-7a7ffd48df5e/image.PNG' width="70%">
노션AI와 챗GPT는 비슷하면서도 다릅니다.
텍스트로 만들어준다는 점은 같지만 노션AI는 엄연히 노션 안에 탑재된 기능입니다. <strong>글쓰기 도우미</strong>로 생각하면 이해가 쉬울 것입니다. 챗GPT는 <strong>인공지능 챗봇</strong>입니다.인공지능 학습에 사용된 데이터 세트에서도 차이가 있습니다. 노션AI는 오픈AI의 언어모델 <strong>GPT-3</strong>를 학습했고, 챗GPT는 이보다 개선된 <strong>GPT-3.5</strong>를 기반으로 합니다.</p>
<hr>
<p>이제는 직접 사용해봅시다.
가장 먼저 챗GPT와의 차이를 물었습니다.</p>
<blockquote>
<p><strong>Q : 너와 chatgpt의 차이가 뭐야</strong></p>
<p><strong>A : 제가 할 수 있는 작업 범위가 미리 정해져 있고, 그 범위 내에서 명령을 수행합니다. 반면, chatgpt는 인공지능 챗봇으로 대화를 통해 범위를 넘어서는 다양한 작업을 수행할 수 있습니다. 또한 chatgpt는 자연어 처리 능력이 뛰어나기 때문에 대화의 유연성과 자연스러움에서 우수합니다.</strong></p>
</blockquote>
<p>다음으로, 네이버에서 오늘 자 뉴스를 가져오게 했습니다</p>
<blockquote>
<p><strong>Q : <a href="https://www.naver.com/">https://www.naver.com/</a>에서 오늘의 뉴스 크롤링해줘</strong></p>
<p><strong>A :</strong>
<strong>오늘의 뉴스</strong></p>
<ul>
<li><a href="https://news.naver.com/main/read.naver?mode=LSD&amp;mid=sec&amp;sid1=107&amp;oid=413&amp;aid=0000148720"><strong>손흥민, 토트넘과 2년 연장 계약...한국인 역대 최고 연봉(골닷컴)</strong></a></li>
<li><a href="https://news.naver.com/main/read.naver?mode=LSD&amp;mid=sec&amp;sid1=104&amp;oid=001&amp;aid=0011646548"><strong>미법원 &quot;트럼프 &#39;탄핵&#39; 건 살아남았다&quot;...의회 집권여부 결정할 듯(종합)</strong></a></li>
<li><a href="https://news.naver.com/main/read.naver?mode=LSD&amp;mid=sec&amp;sid1=104&amp;oid=081&amp;aid=0003180116"><strong>美, 대만 군사력 공식 지원 결정…中, &quot;우리 군사력 강화 필요&quot;</strong></a></li>
<li><a href="https://news.naver.com/main/read.naver?mode=LSD&amp;mid=sec&amp;sid1=102&amp;oid=001&amp;aid=0011646165"><strong>&#39;유럽도 질식&#39;…&#39;초미세 먼지&#39; 서구 국가들도 미세먼지로 고민(종합)</strong></a></li>
<li><a href="https://news.naver.com/main/read.naver?mode=LSD&amp;mid=sec&amp;sid1=105&amp;oid=366&amp;aid=0000646918"><strong>유즈루, 눈길 끄는 &#39;우주복&#39; 투입…연말까지 3차례 테스트</strong></a></li>
</ul>
<p><strong>위 네이버 뉴스 페이지에서 스크래핑한 오늘의 뉴스입니다. 각 뉴스의 제목을 클릭하면 해당 뉴스의 본문을 읽을 수 있습니다.</strong></p>
</blockquote>
<p>다음으로는 직접 크롤링을 할 수 있는 코드를 짜달라고 해봤습니다.</p>
<blockquote>
<p><strong>Q : <a href="https://www.naver.com/">https://www.naver.com/</a>에서 오늘의 뉴스 크롤링 코드 짜줘</strong></p>
<p><strong>A :</strong></p>
<pre><code>import requests
from bs4 import BeautifulSoup

url = &#39;&lt;https://news.naver.com/main/home.naver&gt;&#39;

# requests.get()을 사용해 해당 URL 페이지를 가져옵니다.
response = requests.get(url)

# 가져온 페이지의 html 소스코드를 파싱합니다.
soup = BeautifulSoup(response.text, &#39;html.parser&#39;)

# 오늘의 뉴스 전체를 담고 있는 태그를 찾습니다.
today_news = soup.find(&#39;div&#39;, {&#39;class&#39;: &#39;hdline_flick_item&#39;})

# 각 뉴스마다 제목과 링크를 출력합니다.
for news in today_news:
    title = news.find(&#39;a&#39;).text
    link = news.find(&#39;a&#39;)[&#39;href&#39;]
    print(title)
    print(link)
</code></pre><p><strong>위 코드를 사용해 오늘의 뉴스를 크롤링할 수 있습니다. 뉴스의 제목과 링크를 출력하며, 뉴스의 내용을 크롤링하려면 해당 링크를 따라가서 내용을 가져와야 합니다. 이를 위해서는 각 뉴스마다 링크를 따로 저장해야 합니다.</strong></p>
<p>*<em>주의: 이 코드는 네이버 뉴스 페이지의 구조가 바뀌거나, 뉴스의 링크 형식이 바뀌면 작동하지 않을 수 있습니다. *</em></p>
</blockquote>
<p>위 기능은 실로 엄청나다고 생각합니다.</p>
<p>네이버가 임의로 지정한 뉴스 클래스 고유의 태그(<strong>&#39;hdline_flick_item&#39;</strong>)를 노션AI가 실제 웹 사이트에 들어가 추출해온 결과입니다. 이렇듯 <strong>‘뉴스’</strong>라는 사람의 자연어를 파악하고 네이버에서 뉴스 클래스의 태그를 가져온 것이죠. 더 나아가 그것을 바로 크롤링 할 수 있게 코드로까지 구현하는 수준입니다.</p>
<blockquote>
<p><strong>Q : 도봉구청 공지사항 크롤링 코드 짜줘</strong></p>
<p><strong>A : 
도봉구청 공지사항 크롤링 코드</strong></p>
<p><strong>도봉구청 공지사항을 크롤링하기 위해서는 파이썬에서 <code>BeautifulSoup</code>과 <code>requests</code> 라이브러리를 사용해야 합니다. 아래는 도봉구청 공지사항 페이지에서 제목과 링크를 추출하는 코드입니다.</strong></p>
<pre><code>import requests
from bs4 import BeautifulSoup

url = &#39;&lt;http://www.dobong.go.kr/subpage/main.jsp?id=www0402010000&gt;&#39;
response = requests.get(url)

soup = BeautifulSoup(response.text, &#39;html.parser&#39;)
notice_list = soup.select(&#39;.table_list tbody tr&#39;)

for notice in notice_list:
    title = notice.select_one(&#39;a&#39;).text.strip()
    link = &#39;&lt;http://www.dobong.go.kr&gt;&#39; + notice.select_one(&#39;a&#39;)[&#39;href&#39;]
    print(title, link)
</code></pre><p><strong>위 코드를 실행하면 도봉구청 공지사항 페이지에서 최신 10개의 제목과 링크를 출력합니다. 이 코드를 활용해 필요한 정보를 추출하시면 됩니다.</strong></p>
</blockquote>
<p>마찬가지로 도봉구청의 공지사항을 크롤링해오는 코드를 부탁했습니다. 하지만 이번에는 해당하는 웹사이트의 주소를 알려주지 않았습니다. 알아서 도봉구청 홈페이지의 공지사항 페이지로 들어가 코드로 구현하는 모습입니다.</p>
<p>마지막으로 그림을 부탁해봤습니다.</p>
<blockquote>
<p><strong>Q : 파이썬으로 헬로키티 그려줘</strong></p>
<p><strong>A : 아래는 파이썬을 사용하여 헬로키티를 그리는 코드입니다. 이 코드를 실행하려면 <code>turtle</code> 모듈이 필요합니다.</strong></p>
<pre><code>import turtle

def draw_circle(color, radius, x, y):
    turtle.penup()
    turtle.goto(x, y)
    turtle.pendown()
    turtle.fillcolor(color)
    turtle.begin_fill()
    turtle.circle(radius)
    turtle.end_fill()

def draw_ribbon(color, width, length, x, y):
    turtle.penup()
    turtle.goto(x, y)
    turtle.setheading(0)
    turtle.pendown()
    turtle.color(color)
    turtle.pensize(width)
    turtle.forward(length)

def draw_hellokitty():
    draw_circle(&#39;#ffffff&#39;, 100, 0, 0)  # face
    draw_circle(&#39;#000000&#39;, 10, -40, 120)  # left eye
    draw_circle(&#39;#000000&#39;, 10, 40, 120)  # right eye
    draw_circle(&#39;#ff66af&#39;, 30, 0, 80)  # nose
    draw_circle(&#39;#ffffff&#39;, 20, -40, 130)  # left eye ball
    draw_circle(&#39;#ffffff&#39;, 20, 40, 130)  # right eye ball
    draw_circle(&#39;#ff66af&#39;, 60, 0, -40)  # ribbon
    draw_ribbon(&#39;#ffffff&#39;, 10, 80, 0, -20)  # ribbon
    draw_ribbon(&#39;#ff66af&#39;, 10, 60, -40, -60)  # ribbon
    draw_ribbon(&#39;#ff66af&#39;, 10, 60, 40, -60)  # ribbon

turtle.speed(10)
draw_hellokitty()
turtle.done()
</code></pre><p><strong>이 코드를 실행하면 헬로키티가 그려진 윈도우 창이 열립니다.</strong></p>
</blockquote>
<p>위 노션AI가 작성해준 코드를 실행해보았습니다.</p>
<center><img src='https://velog.velcdn.com/images/0000_0010/post/444e4c4a-8326-477c-8d84-4b971f353d1c/image.gif' width='50%'></center>


<p>이 세계의 헬로키티는 아닌 듯 합니다.</p>
<hr>
<p>저는 컴퓨터를 배우는 사람이지만 요새 열풍을 일으키는 챗GPT에 대해 비관적인 입장을 가지고 있었습니다. &#39;기껏해봐야 심심이 삼촌 정도 아니겠어?&#39; 하며 말이죠. 하지만 직접 사용해 본 노션AI는 상상 그 이상이었습니다. 올해가 얼마 지나지 않았지만 단연코 올해 최고의 발견이라고 할 수 있겠습니다. 더군다나 챗GPT는 노션AI보다 뛰어난 성능을 갖췄다고 하니 사용해보지 않을 수 없겠습니다.
이러한 것은 어쩌면 <strong>유화불굴</strong>인지도 모르겠습니다.
<br></p>
<p>유화불굴이 무엇이냐고요?</p>
<blockquote>
<p><strong>Q : 세상이 너무 빠르게 흘러간다는 뜻의 사자성어는?</strong></p>
<p><strong>A : 세상이 너무 빠르게 흘러간다는 뜻의 사자성어는 &quot;유화불굴(流花不遇)&quot;입니다.</strong></p>
</blockquote>
<p>유화불굴이라는 사자성어는 사실 존재하지 않습니다.
AI의 판단이 모두 정답일 순 없겠지만 많은 것을 바꿔놓을 향후 미래가 기대됩니다.</p>
<p>감사합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 분석 - 03. Pandas 심화]]></title>
            <link>https://velog.io/@0000_0010/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-03.-Pandas-%EC%8B%AC%ED%99%94</link>
            <guid>https://velog.io/@0000_0010/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-03.-Pandas-%EC%8B%AC%ED%99%94</guid>
            <pubDate>Wed, 11 May 2022 01:55:33 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>1.조건으로 검색하기
2.함수로 데이터 처리하기
3.그룹으로 묶기
4.MultiIndex &amp; pivot_table</p>
</blockquote>
<h2 id="1-조건으로-검색하기">1. 조건으로 검색하기</h2>
<p>numpyarray와 마찬가지로 <strong>masking 연산</strong>이 가능
조건에 맞는 DataFrame row를 추출 가능하다
<img src="https://velog.velcdn.com/images/0000_0010/post/c7293eb2-4e5c-4266-967c-43533e920900/image.png" alt=""></p>
<pre><code class="language-py">import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(5, 2), columns=[&quot;A&quot;, &quot;B&quot;])

df[(df[&quot;A&quot;] &lt; 0.5) &amp; (df[&quot;B&quot;] &gt; 0.3)] #인덱스 방식
df.query(&quot;A &lt; 0.5 and B &gt; 0.3&quot;) #query 방식</code></pre>
<p><strong>문자열</strong>이라면 다른 방식으로도 조건 검색이 가능하다
<img src="https://velog.velcdn.com/images/0000_0010/post/bbed92cd-3bc5-4bf5-af6e-bd00d7c44a8f/image.png" alt=""></p>
<pre><code class="language-py">pet[&quot;animal&quot;].str.contains(&quot;cat&quot;) #contains
pet.animal.str.match(&quot;cat&quot;)          #match</code></pre>
<h2 id="2-함수로-데이터-처리하기">2. 함수로 데이터 처리하기</h2>
<p><strong>apply</strong>를 통해서 함수로 데이터를 다룰 수 있다
<img src="https://velog.velcdn.com/images/0000_0010/post/ef088200-c0c9-4c04-9f5f-166612dd7e44/image.png" alt=""></p>
<pre><code class="language-py">df= pd.DataFrame(np.arange(5), columns=[&quot;Num&quot;])

def square(x):
  return x**2

df[&#39;Square_1&#39;] = df[&quot;Num&quot;].apply(square)
df[&quot;Square_2&quot;] = df.Num.apply(lambda x: x ** 2) #람다식</code></pre>
<p><strong>replace</strong>: apply 기능에서 데이터 값만 대체하고 싶을때 사용
<img src="https://velog.velcdn.com/images/0000_0010/post/f50a98b3-b28a-4093-b4dc-f0fabfa39159/image.png" alt=""></p>
<pre><code class="language-py">df[&#39;age&#39;] = df.age.replace({&quot;child&quot;: 0, &quot;adult&quot;: 1})   #변수에 값 대입
df.age.replace({&quot;child&quot;: 0, &quot;adult&quot;: 1}, inplace=True) #값 바로 변경
</code></pre>
<h2 id="3-그룹으로-묶기">3. 그룹으로 묶기</h2>
<p><img src="https://velog.velcdn.com/images/0000_0010/post/13cc798f-c6b4-4df1-aca2-ef6983f64674/image.png" alt=""></p>
<p>df <strong>/</strong> df.groupby(<strong>&#39;key&#39;</strong>).sum() <strong>/</strong> df.groupby(<strong>[&#39;key&#39;,&#39;data1&#39;]</strong>).sum()</p>
<pre><code class="language-py">df= pd.DataFrame({&#39;key&#39;: [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;A&#39;, &#39;B&#39;, &#39;C&#39;],
                  &#39;data1&#39;: [1,2,3,1,2,3],
                  &#39;data2&#39;:np.random.randint(0, 6, 6)})

df.groupby(&#39;key&#39;)
#&lt;pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f5d92085d10&gt;
df.groupby(&#39;key&#39;).sum()
df.groupby([&#39;key&#39;,&#39;data1&#39;]).sum()</code></pre>
<ul>
<li><strong>aggregate</strong>
groupby를 통해서 집계를 한번에 계산하는 방법</li>
</ul>
<p><img src="blob:https://velog.io/1aa8c8dc-be58-457b-8469-d7e55b9aabc5" alt="업로드중.."></p>
<pre><code class="language-py">df.groupby(&#39;key&#39;).aggregate([&#39;min&#39;, np.median, max])
df.groupby(&#39;key&#39;).aggregate({&#39;data1&#39;: &#39;min&#39;, &#39;data2&#39;: np.sum})</code></pre>
<ul>
<li><strong>filter</strong>
groupby를 통해서 그룹 속성을 기준으로 데이터 필터링
<img src="blob:https://velog.io/47fe4c08-155d-464b-84ce-f36c8961b180" alt="업로드중.."></li>
</ul>
<pre><code class="language-py">def filter_by_mean(x):
  return x[&#39;data2&#39;].mean() &gt; 3

df.groupby(&#39;key&#39;).mean()
df.groupby(&#39;key&#39;).filter(filter_by_mean)</code></pre>
<ul>
<li><strong>apply</strong>
groupby를 통해서 묶인 데이터에 함수 적용
<img src="blob:https://velog.io/8c5a0610-72fd-4c26-b200-5276ee2f18db" alt="업로드중.."></li>
</ul>
<pre><code class="language-py">df.groupby(&#39;key&#39;).apply(lambda x: x.max() - x.min())</code></pre>
<h2 id="4-multiindex--pivot_table">4. MultiIndex &amp; pivot_table</h2>
<ul>
<li><strong>MultiIndex</strong>
인덱스를 계층적으로 만들 수 있다.
<img src="blob:https://velog.io/e8afa174-f7f4-4523-bb18-f89f16643526" alt="업로드중.."><pre><code class="language-py">df= pd.DataFrame(np.random.randn(4, 2), 
               index=[[&#39;A&#39;, &#39;A&#39;, &#39;B&#39;, &#39;B&#39;], [1, 2, 1, 2]],
               columns=[&#39;data1&#39;, &#39;data2&#39;])</code></pre>
열 인덱스 또한 계층적으로 만들 수 있다.</li>
</ul>
<p><img src="blob:https://velog.io/ac25c56f-a324-4328-ad50-99285cb48677" alt="업로드중.."></p>
<pre><code class="language-py">df= pd.DataFrame(np.random.randn(4, 4),
                 columns=[[&quot;A&quot;, &quot;A&quot;, &quot;B&quot;, &quot;B&quot;], [&quot;1&quot;, &quot;2&quot;, &quot;1&quot;, &quot;2&quot;]])</code></pre>
<ul>
<li><strong>pivot_table</strong>
데이터에서 필요한 자료만 뽑아서 새롭게 요약, 분석할 수 있는 기능
<img src="blob:https://velog.io/25693729-c7d8-492c-b3dd-4e2c6640f577" alt="업로드중.."></li>
</ul>
<pre><code class="language-py">df.pivot_table(index=&#39;sex&#39;, 
               columns=&#39;class&#39;, 
               values=&#39;survived&#39;, aggfunc=np.mean)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 분석 - 02. Pandas 기본]]></title>
            <link>https://velog.io/@0000_0010/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-02.-Pandas-%EA%B8%B0%EB%B3%B8</link>
            <guid>https://velog.io/@0000_0010/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-02.-Pandas-%EA%B8%B0%EB%B3%B8</guid>
            <pubDate>Sun, 08 May 2022 18:17:21 GMT</pubDate>
            <description><![CDATA[<h2 id="-pandas">• Pandas</h2>
<p>파이썬 라이브러리
<strong>구조화된 데이터</strong>를 효과적으로 처리하고 저장
Array 계산에 특화된 NumPy를 기반으로 설계</p>
<h2 id="-series">• Series</h2>
<ul>
<li>numpy array가 보강된 형태
Data와 Index를 가지고 있음
<img src="https://velog.velcdn.com/images/0000_0010/post/f46b1f82-e1fd-4c91-a512-467593611ffc/image.png" alt=""></li>
</ul>
<pre><code class="language-py">import pandas as pd

data = pd.Series([1, 2, 3, 4])</code></pre>
<ul>
<li>인덱스를 가지고 있고 인덱스로 접근 가능
<img src="https://velog.velcdn.com/images/0000_0010/post/3f54b23b-be27-4d00-871f-473b14f3d69a/image.png" alt=""><pre><code class="language-py">data = pd.Series([1, 2, 3, 4], index=[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;])
data[&#39;b&#39;] #2</code></pre>
</li>
<li>name 인자로 이름을 지정할 수 있음
<img src="https://velog.velcdn.com/images/0000_0010/post/cd3beef6-6891-4d73-9a51-d80c509c172e/image.png" alt=""><pre><code class="language-py">data = pd.Series([1, 2, 3, 4], index=[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;], name=&quot;Title&quot;)
data[&#39;c&#39;] = 5</code></pre>
</li>
<li>Dictionary로 Series 변환
<img src="https://velog.velcdn.com/images/0000_0010/post/e6f7ee6b-080d-4ce9-8b1e-5f590d200edb/image.png" alt=""><pre><code class="language-py">population_dict= {&#39;korea&#39;: 5180,
                &#39;japan&#39;: 12718,
                &#39;china&#39;: 141500,
                &#39;usa&#39;: 32676}
population = pd.Series(population_dict)</code></pre>
</li>
</ul>
<h2 id="-dataframe">• DataFrame</h2>
<p>여러 개의 Series가 모여서 행과 열을 이룬 데이터
<img src="https://velog.velcdn.com/images/0000_0010/post/ded8c3f5-6bbf-42ee-ab8a-5f71b22efae3/image.png" alt=""></p>
<pre><code class="language-py">population_dict= {&#39;korea&#39;: 5180,
                  &#39;japan&#39;: 12718,
                  &#39;china&#39;: 141500,
                  &#39;usa&#39;: 32676}
gdp_dict= {&#39;korea&#39;: 169320000,
           &#39;japan&#39;: 516700000,
           &#39;china&#39;: 1409250000,
           &#39;usa&#39;: 2041280000,}

population = pd.Series(population_dict)
gdp= pd.Series(gdp_dict)

country = pd.DataFrame({&#39;population&#39;: population,&#39;gdp&#39;: gdp})</code></pre>
<ul>
<li>Dictionary로 변환할 수 있다.
<img src="https://velog.velcdn.com/images/0000_0010/post/abf8ce67-c993-4c5f-b915-52a003926efa/image.png" alt=""></li>
</ul>
<pre><code class="language-py">country[&#39;gdp’] # ↑↑

country.index
#Index([&#39;china&#39;, &#39;japan&#39;, &#39;korea&#39;, &#39;usa&#39;], dtype=&#39;object’)
country.columns
#Index([&#39;gdp&#39;, &#39;population&#39;], dtype=&#39;object’)</code></pre>
<ul>
<li>Series도 numpy array처럼 연산자를 활용
<img src="https://velog.velcdn.com/images/0000_0010/post/0804b880-8381-4cc1-b15e-6ce6b07fd6e7/image.png" alt=""></li>
</ul>
<pre><code class="language-py">gdp_per_capita= country[&#39;gdp&#39;] / country[&#39;population&#39;]
country[&#39;gdp_per capita&#39;] = gdp_per_capita</code></pre>
<ul>
<li>저장과 불러오기<pre><code class="language-py">country.to_csv(“./country.csv”)     #csv 파일로 저장
country.to_excel(“country.xlsx”) #엑셀 파일로 저장
</code></pre>
</li>
</ul>
<p>country = pd.read_csv(“./country.csv”)  #csv 파일 불러오기
country = pd.read_excel(“country.xlsx”) #엑셀 파일 불러오기</p>
<pre><code>- 데이터 추가
리스트로 추가, 딕셔너리로 추가
![](https://velog.velcdn.com/images/0000_0010/post/7f274418-d8b8-4874-94c6-c217aa15e29e/image.png)

```py
dataframe= pd.DataFrame(columns=[&#39;이름&#39;,&#39;나이&#39;,&#39;주소&#39;])

dataframe.loc[0] = [&#39;둘리&#39;, &#39;6&#39;, &#39;한강&#39;] #리스트 방식
dataframe.loc[1] = {&#39;이름&#39;:&#39;길동&#39;, &#39;나이&#39;:&#39;45&#39;, &#39;주소&#39;:&#39;쌍문&#39;} #딕셔너리 방식</code></pre><ul>
<li>데이터 수정
<img src="https://velog.velcdn.com/images/0000_0010/post/a0a3010c-5905-45e1-99c2-4bb634313a02/image.png" alt=""></li>
</ul>
<pre><code class="language-py">dataframe.loc[0, &#39;주소&#39;] = &#39;쌍문&#39;</code></pre>
<ul>
<li>새로운 column 추가
<img src="https://velog.velcdn.com/images/0000_0010/post/7464f13e-c218-4127-ad53-e3d93fb69c5f/image.png" alt=""><pre><code class="language-py">dataframe[&#39;전화번호&#39;] = np.nan
dataframe.loc[1, &#39;전화번호&#39;] = &#39;011-7777-7777&#39;</code></pre>
</li>
<li>컬럼 선택하기
컬럼 이름이 하나만 있다면 Series
컬럼 이름이 리스트로 여러개 있다면 DataFrame
<img src="https://velog.velcdn.com/images/0000_0010/post/38f4de71-6fc3-4665-b66d-023b47c0dd25/image.png" alt=""><pre><code class="language-py">dataframe[&#39;이름&#39;]
dataframe[[&#39;이름&#39;,&#39;나이&#39;]] #대괄호 2개!</code></pre>
</li>
</ul>
<h2 id="-pandas-연산과-함수">• Pandas 연산과 함수</h2>
<ul>
<li>누락된 데이터 확인
현실의 데이터는 누락되어 있는 경우가 많다.
<img src="https://velog.velcdn.com/images/0000_0010/post/06084bd8-8ce2-4f0d-bab2-8c12f50e1e5a/image.png" alt=""><pre><code class="language-py">dataframe.notnull() #값이 null일 경우 False
dataframe.isnull()  #값이 null일 경우 True</code></pre>
<ul>
<li>누락된 데이터 제거 / 변경
<img src="https://velog.velcdn.com/images/0000_0010/post/a6321204-a269-45d8-bae8-8da73b0fc566/image.png" alt="">
기존 dataframe / dropna() 결과 / fillna() 결과<pre><code class="language-py">dataframe.dropna()
</code></pre>
</li>
</ul>
</li>
</ul>
<p>dataframe[&#39;전화번호&#39;] = dataframe[&#39;전화번호&#39;].fillna(&#39;전화번호없음&#39;)</p>
<pre><code>- 사칙 연산
![](https://velog.velcdn.com/images/0000_0010/post/2cafd81d-9baa-49b5-9b40-3edcbc3dc36f/image.png)
A / B / A+B / A.add(B, fill_value)
```py
A = pd.DataFrame(np.random.randint(0, 10, (2, 2)), columns=list(&quot;AB&quot;))
B = pd.DataFrame(np.random.randint(0, 10, (3, 3)), columns=list(&quot;ABC&quot;))
A + B
A.add(B, fill_value=0)</code></pre><ul>
<li>집계함수
<img src="https://velog.velcdn.com/images/0000_0010/post/94466ef3-b3d3-40c9-81cd-549b80e2154c/image.png" alt="">
df / df.sum() / df.mean()</li>
</ul>
<pre><code class="language-py">df = pd.DataFrame(np.random.randint(0, 10, (3, 3)), columns=list(&quot;ABC&quot;))

df.sum()
df.mean()
df[&#39;A&#39;].sum()</code></pre>
<ul>
<li>DataFrame 정렬
<img src="https://velog.velcdn.com/images/0000_0010/post/bedeff00-dd91-4bdf-ad43-5724cabe91db/image.png" alt=""><pre><code class="language-py">df= pd.DataFrame({&#39;col1&#39;: [2, 1, 9, 8, 7, 4],
                &#39;col2&#39;: [&#39;A&#39;, &#39;A&#39;, &#39;B&#39;, np.nan, &#39;D&#39;, &#39;C&#39;],
                &#39;col3&#39;: [0, 1, 9, 4, 2, 3],})
</code></pre>
</li>
</ul>
<p>df.sort_values(&#39;col1&#39;) #오름차순
df.sort_values(&#39;col1&#39;, ascending=False) #내림차순
df.sort_values([&#39;col2&#39;, &#39;col1&#39;])
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 분석 - 01. NumPy]]></title>
            <link>https://velog.io/@0000_0010/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-01.-NumPy</link>
            <guid>https://velog.io/@0000_0010/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-01.-NumPy</guid>
            <pubDate>Fri, 06 May 2022 11:19:35 GMT</pubDate>
            <description><![CDATA[<h2 id="-numpy">• NumPy</h2>
<p>Python에서 <strong>대규모 다차원 배열</strong>을 다룰 수 있게 도와주는 라이브러리
→ 파이썬 <strong>리스트(List)</strong>에 비해, <strong>빠른 연산</strong>을 지원하고 <strong>메모리를 효율적</strong>으로 사용</p>
<h3 id="-기본적인-배열-만들기">-기본적인 배열 만들기</h3>
<pre><code class="language-py">list(range(10)) 
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

import numpy as np

np.array([1, 2, 3, 4, 5]) 
#array([1, 2, 3, 4, 5])

np.array([[1, 2], [3, 4]])
#array([[1, 2], [3, 4]])

np.array([1, 2, 3, 4], dtype=&#39;float’)
#array([1., 2., 3., 4.])</code></pre>
<h3 id="-dtype--astype">-dtype / astype</h3>
<p>배열 데이터의 타입을 알아보기 위해 <strong>dtype</strong>을 사용한다.
배열 데이터의 타입을 변환하기 위해 <strong>astype</strong>을 사용한다.</p>
<pre><code class="language-py">arr= np.array([1, 2, 3, 4], dtype=float)
arr               #array([1., 2., 3., 4.])
arr.dtype         #dtype(‘float64’)
arr.astype(int) #array([1, 2, 3, 4])
arr.dtype        #dtype(&#39;int64&#39;)</code></pre>
<h3 id="-다양한-배열-만들기">-다양한 배열 만들기</h3>
<p><strong>◦ np.zeros((Shape))</strong>
배열을 주어진 행렬만큼 <strong>0</strong>으로 채운다.</p>
<p><strong>◦ np.ones((Shape))</strong>
배열을 주어진 행렬만큼 <strong>1</strong>로 채운다.</p>
<p><strong>◦ np.arange(A,B,Step)</strong>
배열을 구간에서 <strong>주어진 간격</strong>만큼 떨어져있는 수들로 채운다.</p>
<p><strong>◦ np.linspace(A,B,N)</strong>
배열을 구간 내 <strong>주어진 원소의 갯수</strong>만큼의 수들로 채운다.</p>
<pre><code class="language-py">np.zeros(10, dtype=int)
#array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

np.ones((3, 4), dtype=float)
#array([[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]])

np.arange(0, 20, 2)
#array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])

np.linspace(0, 1, 5)
#array([0. , 0.25, 0.5 , 0.75, 1. ])</code></pre>
<h3 id="-난수로-채워진-배열-만들기">-난수로 채워진 배열 만들기</h3>
<p><strong>◦ np.random.random((Shape))</strong>
배열을 범위 내의 임의의 <strong>실수</strong>로 채운다.</p>
<p><strong>◦ np.random.nomal(A,B,(Shape))</strong>
배열을 <strong>정규분포</strong>로부터 샘플링된 난수로 채운다.</p>
<p><strong>◦ np.random.randint(A,B,(Shape))</strong>
배열을 범위 내의 임의의 <strong>정수</strong>로 채운다.</p>
<pre><code class="language-py">np.random.random((2, 2))
#array([[0.30986539, 0.85863508],[0.89151021, 0.19304196]])

np.random.normal(0, 1, (2, 2))
#array([[ 0.44050683,  0.04912487],[-1.67023947, -0.70982067]])

np.random.randint(0, 10, (2, 2))
#array([[3, 9],[3, 2]])</code></pre>
<h3 id="-배열의-기초">-배열의 기초</h3>
<pre><code class="language-py">x2 = np.random.randint(10, size=(3, 4))
# array([[2, 2, 9, 0],[4, 2, 1, 0],[1, 8, 7, 3]])</code></pre>
<p><img src="https://velog.velcdn.com/images/0000_0010/post/fc0ac581-05f8-4045-9ae7-8c161dafa65f/image.png" alt=""></p>
<pre><code class="language-py">x2.ndim   #2       → 배열의 차원 수
x2.shape  #(3, 4) → 배열 각 차원(행,열..)의 크기
x2.size   #12       → 전체 원소의 갯수 반환
x2.dtype  #dtype(‘int64’) → 배열 데이터 타입</code></pre>
<h2 id="-indexing--slicing">• Indexing / Slicing</h2>
<p><strong>Indexing</strong>: 인덱스로 찾아냄
<img src="https://velog.velcdn.com/images/0000_0010/post/9560f0ea-2334-47b3-9294-8160db903bf2/image.png" alt=""></p>
<pre><code class="language-py">x = np.arange(7)
x[3]     #3
x[7]     #IndexError: index 7 is out of bounds
x[0]=10 #array([10, 1, 2, 3, 4, 5, 6])</code></pre>
<p><strong>Slicing</strong>: 인덱스 값으로 배열의 부분을 가져옴
<img src="https://velog.velcdn.com/images/0000_0010/post/9560f0ea-2334-47b3-9294-8160db903bf2/image.png" alt=""></p>
<pre><code class="language-py">x = np.arange(7)
x[1:4]  #array([1, 2, 3])
x[1:]    #array([1, 2, 3, 4, 5, 6])
x[:4]    #array([0, 1, 2, 3])
x[::2]    #array([0, 2, 4, 6])</code></pre>
<h2 id="-배열의-모양-바꾸기">• 배열의 모양 바꾸기</h2>
<p><strong>◦ reshape()</strong>
array의 shape를 변경
<img src="https://velog.velcdn.com/images/0000_0010/post/47cecd1f-f0c6-4332-a9e7-2a369516db54/image.png" alt=""></p>
<pre><code class="language-py">x = np.arange(8)
x.shape #(8,)

x2 = x.reshape((2, 4)) #array([[0, 1, 2, 3],[4, 5, 6, 7]])
x2.shape #(2, 4)</code></pre>
<p><strong>◦ concatenate()</strong>
array를 이어 붙임
<img src="https://velog.velcdn.com/images/0000_0010/post/bbf7374f-2f39-4521-b604-89e4cbba02e0/image.png" alt=""></p>
<pre><code class="language-py">x = np.array([0, 1, 2])
y = np.array([3, 4, 5])

np.concatenate([x, y]) #array([0, 1, 2, 3, 4, 5])</code></pre>
<p><img src="https://velog.velcdn.com/images/0000_0010/post/7436aefe-f780-47fc-a962-19299aed0def/image.png" alt=""></p>
<pre><code class="language-py">matrix = np.arange(4).reshape(2, 2)
np.concatenate([matrix, matrix], axis=0)</code></pre>
<p><strong>◦ split()</strong>
axis 축을 기준으로 분할
<img src="https://velog.velcdn.com/images/0000_0010/post/c1201116-f46c-4ad6-b011-06e55bd3508b/image.png" alt=""></p>
<pre><code class="language-py">matrix = np.arange(16).reshape(4, 4)
upper, lower = np.split(matrix, [3], axis=0)</code></pre>
<p><img src="https://velog.velcdn.com/images/0000_0010/post/1f11caf9-fb88-499a-98b7-38929ead0b8e/image.png" alt=""></p>
<pre><code class="language-py">matrix = np.arange(16).reshape(4, 4)
left, right = np.split(matrix, [3], axis=1)</code></pre>
<h2 id="-numpy-연산">• NumPy 연산</h2>
<h3 id="-사칙연산">-사칙연산</h3>
<p>array는 + - * / 에 대한 기본 연산을 지원</p>
<pre><code class="language-py">x = np.arange(4) #array([0, 1, 2, 3])

x + 5 #array([5, 6, 7, 8])
x - 5 #array([-5, -4, -3, -2])
x * 5 #array([ 0,  5, 10, 15])
x / 5 #array([0. , 0.2, 0.4, 0.6])</code></pre>
<h3 id="-행렬-간-연산">-행렬 간 연산</h3>
<p>다차원 행렬에서도 적용 가능
<img src="https://velog.velcdn.com/images/0000_0010/post/674e8044-5337-4dd7-8a6c-fafdd3f7d800/image.png" alt=""></p>
<pre><code class="language-py">x = np.arange(4).reshape((2, 2))
y = np.random.randint(10, size=(2, 2))

x + y #array([[1, 7],[6, 5]])
x - y #array([[-1, -5],[-2,  1]])</code></pre>
<h3 id="-브로드캐스팅">-브로드캐스팅</h3>
<p>shape이 다른 array끼리 연산
<img src="https://velog.velcdn.com/images/0000_0010/post/bab028d3-a39f-4d07-9252-99b6033b5783/image.png" alt=""></p>
<pre><code class="language-py">matrix + 5</code></pre>
<p><img src="https://velog.velcdn.com/images/0000_0010/post/f722b7a0-d421-4c63-b5a4-d07523596745/image.png" alt=""></p>
<pre><code class="language-py">matrix + np.array([1, 2, 3])</code></pre>
<p><img src="https://velog.velcdn.com/images/0000_0010/post/cd17bddf-92a0-4f2a-8159-0cad474408f2/image.png" alt=""></p>
<pre><code class="language-py">np.arange(3).reshape((3,1)) + np.arange(3)</code></pre>
<h3 id="-집계함수">-집계함수</h3>
<p>데이터에 대한 요약 통계</p>
<pre><code class="language-py">x = np.arange(8).reshape((2, 4))

np.sum(x)  #28
np.min(x)  #0
np.max(x)  #7
np.mean(x) #3.5

np.sum(x, axis=0) #array([ 4,  6,  8, 10])
np.sum(x, axis=1) #array([ 6, 22])</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 기초 - 08. 객체지향 프로그래밍]]></title>
            <link>https://velog.io/@0000_0010/08.%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</link>
            <guid>https://velog.io/@0000_0010/08.%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</guid>
            <pubDate>Fri, 06 May 2022 08:10:19 GMT</pubDate>
            <description><![CDATA[<h2 id="-객체지향-프로그래밍">• 객체지향 프로그래밍</h2>
<p>앞서 공부한 <strong>반복문</strong>, <strong>함수</strong>, <strong>모듈</strong>이 도입된 이유는 <strong>효율적인 코드</strong>를 위해서이다.</p>
<pre><code class="language-py">print(&quot;hi&quot;)         =        for i in range(5):
print(&quot;hi&quot;)                        print(&quot;hi&quot;)
print(&quot;hi&quot;)
print(&quot;hi&quot;)
print(&quot;hi&quot;)</code></pre>
<h3 id="-객체">-객체</h3>
<p><strong>성질</strong>과 할 수 있는 <strong>행동</strong>이 담긴 자료</p>
<h3 id="-클래스-class">-클래스 (Class)</h3>
<p>객체를 만들 수 있는 <strong>틀</strong></p>
<p><strong>-클래스 생성</strong>
class 클래스이름:</p>
<pre><code class="language-py">class Human:</code></pre>
<h3 id="-필드-field">-필드 (Field)</h3>
<p>객체가 가지고 있는 <strong>성질</strong> = 객체가 가지고 있는 <strong>변수</strong></p>
<pre><code class="language-py">class Human:
    name : &#39;jin&#39;
    age : 24</code></pre>
<h3 id="-메서드-method">-메서드 (Method)</h3>
<p>객체가 할 수 있는 <strong>행동</strong> = 객체가 할 수 있는 <strong>함수</strong></p>
<pre><code class="language-py">class Human:
    def study(self):
        print(“hard!”)</code></pre>
<pre><code>self: 메서드라면 가져야 하는 첫번째 매개변수</code></pre><h3 id="-인스턴스-instance">-인스턴스 (Instance)</h3>
<p>객체를 만들 수 있는 <strong>틀(클래스)</strong>로 찍어낸 객체
<img src="https://velog.velcdn.com/images/0000_0010/post/7792d011-476c-4e6b-a4f0-cba755ffabb7/image.jpg" alt="">
<strong>-인스턴스 만들기</strong>
인스턴스 이름 = 클래스 이름()</p>
<pre><code class="language-py">Lee = Human()</code></pre>
<p><strong>-인스턴스의 변수</strong>
인스턴스.변수</p>
<pre><code class="language-py">Lee = Human()
Lee.name #jin
Lee.age #24</code></pre>
<p><strong>-인스턴스의 메서드</strong>
인스턴스.메서드()</p>
<pre><code class="language-py">Lee = Human()
Lee.study() #hard!</code></pre>
<h3 id="-객체지향-프로그래밍의-특징">-객체지향 프로그래밍의 특징</h3>
<blockquote>
<ol>
<li>추상화 (Abstraction)</li>
<li>상속 (Inheritance)</li>
<li>다형성 (polymorphism)</li>
<li>캡슐화 (Encapsulation)</li>
</ol>
</blockquote>
<h4 id="1-추상화-abstraction">1. 추상화 (Abstraction)</h4>
<p>객체들의 공통적인 특징(기능, 속성)을 도출하는 것
객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있다.</p>
<h4 id="2-상속-inheritance">2. 상속 (Inheritance)</h4>
<p>하나의 클래스가 가진 특징(함수, 데이터)을 다른 클래스가 그대로 물려받는 것
이미 작성된 클래스를 받아서 새로운 클래스를 생성하는 것</p>
<h4 id="3-다형성-polymorphism">3. 다형성 (polymorphism)</h4>
<p>약간 다른 방법으로 동작하는 함수를 동일한 이름으로 호출하는 것
동일한 명령의 해석을 연결된 객체에 의존하는 것</p>
<h4 id="4-캡슐화-encapsulation">4. 캡슐화 (Encapsulation)</h4>
<p>객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리하는 것
코드가 묶여있어서 오류가 없어 편리하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 기초 - 07. 모듈과 패키지]]></title>
            <link>https://velog.io/@0000_0010/07.%EB%AA%A8%EB%93%88%EA%B3%BC-%ED%8C%A8%ED%82%A4%EC%A7%80</link>
            <guid>https://velog.io/@0000_0010/07.%EB%AA%A8%EB%93%88%EA%B3%BC-%ED%8C%A8%ED%82%A4%EC%A7%80</guid>
            <pubDate>Fri, 06 May 2022 08:09:18 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>• 모듈
• 모듈 사용하기
• 모듈 활용하기
• 모듈과 패키지</p>
</blockquote>
<h2 id="-모듈">• 모듈</h2>
<p>특정 목적을 가진 <strong>함수, 자료의 모임</strong></p>
<pre><code>코드의 길이가 길어지는 상황
이때, 모든 함수, 변수를 구현하는 것은 불가능
→ 누군가 만들어놓은 함수, 변수 등을 활용</code></pre><h3 id="-모듈-사용하기">-모듈 사용하기</h3>
<p><strong>import</strong>(불러오다) 키워드를 이용해서 모듈 사용</p>
<pre><code class="language-py">import random
#random 모듈 불러오기</code></pre>
<p><strong>.(dot)</strong>을 쓴 후에 모듈 속 함수/변수 사용</p>
<pre><code class="language-py">import random
print(random.randrange(0,2))
#0이상 2미만 수 중 임의로 출력</code></pre>
<h3 id="-모듈-만들기">-모듈 만들기</h3>
<p>우리가 원하는 내용이 담긴 모듈 제작 가능
<strong>.py</strong>(파이썬파일)로 만들 수 있다</p>
<p>1) py파일을 생성 후, 함수와 변수를 만든다</p>
<pre><code class="language-py">#cal.py
def plus(a, b):
    c = a + b
    return c</code></pre>
<p>2) 다른 파일에서 만들어 둔 py파일을 불러온다</p>
<pre><code class="language-py">#main.py
import cal</code></pre>
<p>3) 불러온 모듈 속 함수, 변수를 활용한다</p>
<pre><code class="language-py">#main.py
import cal
print(cal.plus(3,4)) #7</code></pre>
<h3 id="-모듈-활용하기">-모듈 활용하기</h3>
<blockquote>
<p>◦ math
◦ random
◦ time
이외 다수..</p>
</blockquote>
<h4 id="◦-math">◦ math</h4>
<p>수학 연산을 도와주는 모듈</p>
<pre><code class="language-py">import math

print(math.pi) #3.141592...
print(math.e) #2.718281...</code></pre>
<h4 id="◦-random">◦ random</h4>
<p>랜덤한 숫자를 선택해주는 함수들이 담긴 모듈</p>
<pre><code class="language-py">import random

print(random.randrange(1, 11)) 
#1부터10까지의숫자중하나를출력</code></pre>
<h4 id="◦-time">◦ time</h4>
<p>시간 데이터를 다루는 함수들이 담긴 모듈</p>
<pre><code class="language-py">import time

print(time.time())
#1970년 1월 1일을 기준으로 현재시각을 초로 나타내는 실수형 반환</code></pre>
<h2 id="-모듈과-패키지">• 모듈과 패키지</h2>
<h3 id="-패키지">-패키지</h3>
<p>모듈을 폴더(Directory)로 구분하여 관리하는 것
모듈을 편리하게 관리하기 위해 존재한다.</p>
<pre><code>project/
    script/
    sound/
    audio/
    ...</code></pre><h3 id="-패키지-속-모듈-사용하기">-패키지 속 모듈 사용하기</h3>
<h4 id="1-import을-이용해서-폴더를-불러온-후-함수-실행">1) import을 이용해서 폴더를 불러온 후, 함수 실행</h4>
<pre><code class="language-py">import user.cal

print(cal.plus(3, 4))</code></pre>
<h4 id="2-from-import사용">2) from-import사용</h4>
<p>함수/변수 사용 시 <strong>.(dot)</strong>을 써주지 않아도 된다</p>
<pre><code class="language-py">from user.cal import plus

print(plus(3, 4)) 
#cal.plus()라고 적어주지 않아도 된다</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 기초 - 06. 함수와 메서드]]></title>
            <link>https://velog.io/@0000_0010/06.%ED%95%A8%EC%88%98%EC%99%80-%EB%A9%94%EC%84%9C%EB%93%9C</link>
            <guid>https://velog.io/@0000_0010/06.%ED%95%A8%EC%88%98%EC%99%80-%EB%A9%94%EC%84%9C%EB%93%9C</guid>
            <pubDate>Fri, 06 May 2022 07:49:12 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>• 함수
• 함수의 종류
• 전역 변수와 지역 변수
• 메서드 (Method)</p>
</blockquote>
<h2 id="-함수">• 함수</h2>
<p>특정 기능을 수행하는 코드
재사용할 수 있게 만들어 놓은 것</p>
<h2 id="-함수의-종류">• 함수의 종류</h2>
<h3 id="-내장-함수">-내장 함수</h3>
<p>아무런 설정없이 바로 사용 가능한 내장된 함수</p>
<blockquote>
<p>◦ input() - 자료를 입력하는 함수
◦ print() - 자료를 출력하는 함수
◦ max() - 시퀀스 자료의 최댓값을 구하는 함수
◦ min() - 시퀀스 자료의 최솟값을 구하는 함수
◦ sum() - 숫자 원소로 이뤄진 시퀀스의 합
◦ len() - 시퀀스 자료의 길이를 구하는 함수
외 다수...</p>
</blockquote>
<h3 id="-사용자-지정-함수">-사용자 지정 함수</h3>
<p>사용자가 새로 만든 함수
<strong>def</strong>ine(정의하다) 키워드를 이용해서 함수 정의</p>
<pre><code class="language-py">def 함수이름(매개변수):
    &lt;수행할명령&gt;

    return반환값

def plus(a, b):
    c = a+b
    return c

print(plus(3,4)) #7</code></pre>
<p><strong>매개변수</strong>를 이용해서 함수 내부로 값을 전달
<strong>return</strong>을 이용해서 함수 외부로 값을 전달</p>
<h2 id="-전역-변수와-지역-변수">• 전역 변수와 지역 변수</h2>
<pre><code class="language-py">def my_func(a):
    x = “엑스”
    return a

a = 3
print(my_func(a)) #3
print(x) #error</code></pre>
<p>함수 안에서 일어난 일은 함수 밖에 영향을 끼치지 않는다</p>
<h3 id="-전역변수">-전역변수</h3>
<p><strong>어디서든지</strong> 사용할 수 있는 변수</p>
<pre><code class="language-py">x = “Hi!”
def my_func():
    print(x)

my_func() #Hi!
print(x) #Hi!</code></pre>
<h3 id="-지역변수">-지역변수</h3>
<p><strong>특정구문</strong>(for문,함수...) 안에서 정의한 변수
변수를 정의한 범위에서만 사용이 가능</p>
<pre><code class="language-py">def my_func():
    x = “Hi?”
    print(x)

my_func() #Hi?
print(x) #error</code></pre>
<h2 id="-메서드-method">• 메서드 (Method)</h2>
<p>특정 자료에 대해 특정 기능을 하는 코드</p>
<h3 id="-함수와의-차이">-함수와의 차이</h3>
<p><strong>메서드</strong>는 특정 자료와 연관지어 기능을한다
(자료뒤에.을찍어사용한다)</p>
<pre><code class="language-py">my_list= [1, 2, 3]
my_list.append(4)
my_list.count(2)
my_list.pop()</code></pre>
<p><strong>함수</strong>는 특정 기능을 한다
(<strong>매개변수</strong>를 이용해 자료를 전달해준다)</p>
<pre><code class="language-py">my_list= [1, 2, 3]
len(my_list)
sum(my_list)
min(my_list)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 기초 - 05. 기초 자료형2]]></title>
            <link>https://velog.io/@0000_0010/05.%EA%B8%B0%EC%B4%88-%EC%9E%90%EB%A3%8C%ED%98%952</link>
            <guid>https://velog.io/@0000_0010/05.%EA%B8%B0%EC%B4%88-%EC%9E%90%EB%A3%8C%ED%98%952</guid>
            <pubDate>Thu, 05 May 2022 19:22:01 GMT</pubDate>
            <description><![CDATA[<h2 id="-문자열리스트-활용">• 문자열/리스트 활용</h2>
<blockquote>
<ol>
<li>list.pop(index)</li>
<li>seq.count(data)</li>
<li>str.split(char)</li>
<li>list(str)</li>
<li>str.join(list)</li>
</ol>
</blockquote>
<h3 id="1-listpopindex">1. list.pop(index)</h3>
<p><strong>인덱스 index</strong>의 원소를 <strong>제거</strong> 후 그 원소를 <strong>반환</strong>
(괄호를 비울 시 <strong>마지막 원소</strong>)</p>
<pre><code class="language-py">my_list = [1, 2, 3, 4, 5]
print(my_list.pop(0)) #1
print(my_list.pop()) #5</code></pre>
<h3 id="2-seqcountdata">2. seq.count(data)</h3>
<p>시퀀스 내부의 <strong>자료 data의 개수</strong>를 반환</p>
<pre><code class="language-py">my_seq = [2,2,2,4,4]
print(my_seq.count(2)) #3</code></pre>
<h3 id="3-strsplitchar">3. str.split(char)</h3>
<p><strong>char를 기준</strong>으로 문자열을 쪼개서 리스트를 반환
(괄호를 비울 시 <strong>공백</strong>)</p>
<pre><code class="language-py">my_str= “1 2 3 4 5”
print(my_str.split()) #[‘1’, ‘2’, ‘3’, ‘4’, ‘5’]
element = “Na,Mg,Al,Si”
print(element.split(‘,’)) #[‘Na’, ‘Mg’, ‘Al’, ‘Si’]</code></pre>
<h3 id="4-liststr">4. list(str)</h3>
<p>문자열 str을 리스트로 반환</p>
<pre><code class="language-py">my_str=&quot;Lion&quot;
print(list(my_str)) #[&#39;L&#39;,&#39;i&#39;,&#39;o&#39;,&#39;n&#39;]</code></pre>
<h3 id="5-strjoinlist">5. str.join(list)</h3>
<p><strong>str을 기준</strong>으로 리스트 원소들을 전부 합쳐서 문자열을 반환
(괄호를 비울 시 공백)</p>
<pre><code class="language-py">my_list = [‘a’, ‘p’, ‘p’, ‘l’, ‘e’]
print(‘’.join(my_list)) #apple
friend = [‘Pat’, ‘Mat’]
print(‘&amp;’.join(friend)) #Pat&amp;Mat</code></pre>
<hr>
<h2 id="-튜플-tuple">• 튜플 (Tuple)</h2>
<p>여러자료를 함께 담을 수 있는 자료형
() <strong>소괄호</strong>로 묶어서 표현</p>
<pre><code class="language-py">tuple_zero= ()
tuple_one= (1,)
tuple_ = (1, 2, 3, 4, 5)
tuple_ = 1, 2, 3, 4, 5</code></pre>
<h3 id="-튜플의-특징">-튜플의 특징</h3>
<blockquote>
<p>시퀀스 자료형으로 <strong>인덱싱/슬라이싱</strong> 가능
<strong>in</strong> 연산자로 튜플 안에 원소 확인
<strong>len()</strong> 함수로 튜플의 길이 확인
<strong>+</strong> 연산자로 튜플과 튜플을 연결
<strong>*** 연산자로 튜플을 반복
**자료추가, 삭제, 변경 불가 한번 만들어지면 고정</strong></p>
</blockquote>
<hr>
<h2 id="-딕셔너리-dictionary">• 딕셔너리 (Dictionary)</h2>
<p>짝이 있는 자료형
{key : value}의 형식: <strong>key</strong>를 알면 <strong>value</strong>를 알 수 있음
{} <strong>중괄호</strong>로 묶어서 표현</p>
<pre><code class="language-py">dict_zero= {}
person = {‘name’:‘Michael’, ‘age’:10}</code></pre>
<h3 id="-key">-key</h3>
<p>열쇠처럼 자료를 꺼낼 수 있는 도구
ex) name, age</p>
<h3 id="-value">-value</h3>
<p>딕셔너리에서 key로 꺼낸 자료
ex) Michael, 10</p>
<h3 id="-dictionarykey">-Dictionary[key]</h3>
<p>딕셔너리에서 자료를 꺼내고 추가하기</p>
<pre><code class="language-py">person = {‘name’:‘Michael’, ‘age’:10}
print(person[‘name’]) #Michael
person[‘hometown’] = Seoul #딕셔너리에 추가
print(person[‘hometown’]) #Seoul</code></pre>
<h3 id="-del">-del</h3>
<p><strong>del</strong> 함수로 딕셔너리의 원소 삭제</p>
<pre><code class="language-py">person = {‘name’:‘Michael’, ‘age’:10}
del person[‘age’]
print(person) #{‘name’:‘Michael’}</code></pre>
<h3 id="-딕셔너리의-특징">-딕셔너리의 특징</h3>
<blockquote>
<p><strong>key</strong>는 변할 수 없는 자료형이기 때문에 <strong>리스트</strong>는 안되고 <strong>튜플</strong>은 된다.</p>
</blockquote>
<pre><code class="language-py">datas= {[1, 2, 3]:‘Alphabet’} #Error
datas= {(1, 2, 3):‘Number’} #OK</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 기초 - 04. 반복문]]></title>
            <link>https://velog.io/@0000_0010/04.%EB%B0%98%EB%B3%B5%EB%AC%B8</link>
            <guid>https://velog.io/@0000_0010/04.%EB%B0%98%EB%B3%B5%EB%AC%B8</guid>
            <pubDate>Thu, 05 May 2022 18:39:25 GMT</pubDate>
            <description><![CDATA[<h2 id="-반복문">• 반복문</h2>
<p>어떠한 <strong>조건</strong>이나, <strong>범위 내</strong>에서 어떠한 명령을 반복적으로 수행하는 것</p>
<h3 id="-for-문">• for 문</h3>
<p><strong>원소로 반복</strong>하는 방법
시퀀스의 원소를 <strong>하나씩 변수에 넣어가면서</strong> 명령 실행</p>
<pre><code class="language-py">for 변수 in 시퀀스:
    &lt;수행할 명령&gt;

sum = 0
for i in [1,2,3]:
    sum = sum + i</code></pre>
<h3 id="-for-range-문">• for range 문</h3>
<h4 id="-range">-range</h4>
<p><strong>연속되는 숫자</strong>를 만들어주는 시퀀스 자료형</p>
<pre><code class="language-py">range(0,9) #0,1,2,..,6,7,8
range(5) #range(0,5) | 0,1,2,3,4</code></pre>
<h4 id="-for-rangeab">-for range(a,b)</h4>
<p>구간으로 반복하는 방법 
<strong>a이상 b미만의 수</strong>를 변수에 넣어가면서  명령을수행</p>
<pre><code class="language-py">a = [1]
for i in range(2, 4):
    a.append(i)
print(a) #[1, 2, 3]</code></pre>
<h4 id="-for-rangea">-for range(a)</h4>
<p>횟수로 반복하는 방법
<strong>a번</strong> 만큼 명령을 수행</p>
<pre><code class="language-py">count = 0
for i in range(10):
    count = count + 1
print(count) #10</code></pre>
<h3 id="-while-문">• while 문</h3>
<p><strong>조건으로 반복</strong>하는 방법
<strong>조건이 True</strong>이면 명령을 수행</p>
<pre><code class="language-py">while 조건:
    &lt;수행할 명령&gt;

i = 5
while i&lt;10:
    print(i)
    i++</code></pre>
<p><strong>-while문에서 조건이 항상 True라면</strong>
→ 무한정 코드가 실행된다. 빠져나올 수 없는 <strong>무한루프</strong>에 빠진다.</p>
<h3 id="-break-문">• break 문</h3>
<p><strong>if 문</strong>으로 조건을 걸어준 다음, break 실행
반복문을 <strong>탈출</strong>하는 역할</p>
<pre><code class="language-py">i= 0
while True:
    print(“knock”)
    if i&gt;=3:
        break
    i= i+ 1

&gt;&gt;&gt;knock
&gt;&gt;&gt;knock
&gt;&gt;&gt;knock
&gt;&gt;&gt;knock</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 기초 - 03. 리스트]]></title>
            <link>https://velog.io/@0000_0010/03.%EB%A6%AC%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@0000_0010/03.%EB%A6%AC%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Thu, 05 May 2022 18:19:35 GMT</pubDate>
            <description><![CDATA[<h2 id="-리스트-활용">• 리스트 활용</h2>
<blockquote>
<ol>
<li>list.append(data)</li>
<li>list.insert(index, data)</li>
<li>list.remove(data)</li>
<li>list.sort()</li>
</ol>
</blockquote>
<h3 id="1-listappenddata">1. list.append(data)</h3>
<p>자료 data를 리스트 마지막 원소 뒤에 추가
오직 한 개의 자료만 넣을 수 있다</p>
<pre><code class="language-py">a = []
b = [‘a’, ‘b’, ‘c’]
a.append(10)
b.append(‘d’)
print(a) #[10]
print(b) #[‘a’, ‘b’, ‘c’, ‘d’]</code></pre>
<h3 id="2-listinsertindex-data">2. list.insert(index, data)</h3>
<p>인덱스 index에 자료 data를 추가
오직 한 개의 자료만 넣을 수 있다</p>
<pre><code class="language-py">c = [1, 2, 4, 5]
c.insert(2, 3)
print(c) #[1, 2, 3, 4, 5]</code></pre>
<h3 id="3-listremovedata">3. list.remove(data)</h3>
<p>처음 나오는 자료 data를 제거</p>
<pre><code class="language-py">d = [3, 1, 2, 3]
d.remove(3)
print(d) #[1, 2, 3]</code></pre>
<h3 id="4-listsort">4. list.sort()</h3>
<p>리스트를 정렬
숫자형은 오름차순, 문자열은 사전순</p>
<pre><code class="language-py">e = [6, 2, 4, 1]
f = [‘carrot’, ‘apple’, ‘banana’]
e.sort()
f.sort()
print(e) #[1, 2, 4, 6]
print(f) #[‘apple’, ‘banana’, ‘carrot]</code></pre>
<h2 id="-시퀀스-자료형">• 시퀀스 자료형</h2>
<p><strong>순서</strong>가 있는 자료형
<strong>리스트</strong>, <strong>문자열</strong> 등이 이에 속함</p>
<pre><code class="language-py">a = “Black” #문자열
b = [&#39;P&#39;,&#39;I&#39;,&#39;N&#39;,&#39;K&#39;] #리스트
c = (1,2,3,4,5) #튜플</code></pre>
<h3 id="-시퀀스의-특징">-시퀀스의 특징</h3>
<blockquote>
<ol>
<li>원소 간의 순서가 존재</li>
<li>멤버 조회</li>
<li>길이 확인</li>
<li>연결 연산</li>
<li>반복 연산</li>
</ol>
</blockquote>
<h4 id="1-원소-간의-순서가-존재">1. 원소 간의 순서가 존재</h4>
<p><strong>인덱싱/슬라이싱</strong>이 가능하다.
<strong>음수</strong>를 넣거나 <strong>자리를 비우는 것</strong>이 가능</p>
<pre><code class="language-py">a = “Black”
b = [&#39;P&#39;,&#39;I&#39;,&#39;N&#39;,&#39;K&#39;]
print(a[3]) #c
print(b[0:2]) #[&#39;P&#39;,&#39;I&#39;,&#39;N&#39;]
print(a[-1]) #k | 뒤에서 1번째 원소
print(b[:2]) #[‘P’, ‘I’, ‘N’] | 처음~3번째 슬라이싱</code></pre>
<h4 id="2-멤버-조회">2. 멤버 조회</h4>
<p><strong>in</strong> 연산자로 시퀀스 안에 원소가 있는지 확인 가능</p>
<pre><code class="language-py">a = “Black”
b = [&#39;P&#39;,&#39;I&#39;,&#39;N&#39;,&#39;K&#39;]
print(&#39;b&#39; in a) #True
print(&#39;B&#39; in b) #False</code></pre>
<h4 id="3-길이-확인">3. 길이 확인</h4>
<p><strong>len</strong> 연산자로 시퀀스 안에 원소가 몇 개인지 확인 가능</p>
<pre><code class="language-py">a = “Black”
b = [&#39;P&#39;,&#39;I&#39;,&#39;N&#39;,&#39;K&#39;]
print(len(a)) #5
print(len(b)) #4</code></pre>
<h4 id="4-연결-연산">4. 연결 연산</h4>
<p><strong>+</strong> 연산자로 같은 시퀀스 두개를 이어 붙일 수 있다</p>
<pre><code class="language-py">c = [&#39;P&#39;,&#39;I&#39;] + [&#39;N&#39;,&#39;K&#39;]
print(c) #[&#39;P&#39;,&#39;I&#39;,&#39;N&#39;,&#39;K&#39;]</code></pre>
<h4 id="5-반복-연산">5. 반복 연산</h4>
<p>***** 연산자로 시퀀스를 반복할 수 있다</p>
<pre><code class="language-py">d = &quot;area&quot; * 3
print(d) #areaareaarea</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 기초 - 02. 조건문]]></title>
            <link>https://velog.io/@0000_0010/02.%EC%A1%B0%EA%B1%B4%EB%AC%B8</link>
            <guid>https://velog.io/@0000_0010/02.%EC%A1%B0%EA%B1%B4%EB%AC%B8</guid>
            <pubDate>Thu, 05 May 2022 17:25:41 GMT</pubDate>
            <description><![CDATA[<h2 id="-input">• input()</h2>
<p>변수를 사용하여 사용자가 전달한 값을 보관합니다.
변수 = input()</p>
<pre><code class="language-py">var = input()</code></pre>
<p>무엇을 입력하든 <strong>문자열</strong>로 입력이 받아진다.
만약 숫자를 입력해야 한다면 입력을 받은 후 <strong>가공</strong>을 해주어야 한다.</p>
<h2 id="-형-변환">• 형 변환</h2>
<blockquote>
<p><strong>int</strong>erger → 숫자(정수)
<strong>float</strong> → 숫자(실수)
<strong>str</strong>ing → 문자열
<strong>list</strong> → 리스트</p>
</blockquote>
<pre><code class="language-py">a = ‘345’
b = int(‘345’)
print(a,b) #345 345
print(type(a)) #&lt;class ‘str’&gt; | 문자열
print(type(b)) #&lt;class ‘int’&gt; | 숫자</code></pre>
<h2 id="-논리형-자료와-비교연산">• 논리형 자료와 비교연산</h2>
<blockquote>
<ol>
<li>논리 자료형</li>
<li>비교 연산자</li>
<li>논리 자료형의 연산</li>
</ol>
</blockquote>
<h3 id="1-논리-자료형">1. 논리 자료형</h3>
<p><strong>참(True)</strong> 혹은 <strong>거짓(False)</strong>을 나타내는 자료형을 <strong>논리 자료형</strong>이라고 합니다.</p>
<h3 id="2-비교-연산자">2. 비교 연산자</h3>
<p>숫자나 문자의 값을 비교하는 연산자
주어진 진술이 참이면 <strong>True</strong>, 거짓이면 <strong>False</strong></p>
<h4 id="-비교-연산자의-종류">-비교 연산자의 종류</h4>
<pre><code>==: 같다
!=: 다르다
&gt;: 왼쪽이 더 크다
&lt;: 오른쪽이 더 크다
&gt;=: 왼쪽이 같거나 크다
&lt;=: 오른쪽이 같거나 크다</code></pre><pre><code class="language-py">print(2 &lt; 7)   #True
print(8 == 5)  #False
print(3 &gt;= 12) #False
print(5 != 14) #True</code></pre>
<h3 id="3-논리-자료형의-연산">3. 논리 자료형의 연산</h3>
<blockquote>
<ol>
<li>AND</li>
<li>OR</li>
<li>NOT</li>
</ol>
</blockquote>
<h4 id="1-and">1. AND</h4>
<p>각 논리가 <strong>모두</strong> True여야 True</p>
<pre><code class="language-py">print(4==4 and 2&lt;=5 and 6&gt;2)
#세 항이 모두 True이므로, True!
&gt;&gt;&gt;True</code></pre>
<h4 id="2-or">2. OR</h4>
<p>논리들 중 True가 <strong>존재</strong>하면 True</p>
<pre><code class="language-py">print(3==6 or 2&lt;=7 or 4&lt;1)
#2&lt;=7이 True이므로, True가존재하기에 True!
&gt;&gt;&gt;True</code></pre>
<h4 id="3-not">3. NOT</h4>
<p>논리값을 뒤집는다</p>
<pre><code class="language-py">print(not3==4)
#False에 Not을 붙였으므로, True!
&gt;&gt;&gt;True</code></pre>
<h2 id="-조건문">• 조건문</h2>
<p>어떠한 <strong>특정 조건</strong>에 따라서 <strong>실행되는 명령이 달라지는</strong> 구문</p>
<h3 id="-if-문">-if 문</h3>
<p>조건이 <strong>True</strong>일때, <strong>명령</strong> 실행</p>
<pre><code class="language-py">if 조건:
    &lt;수행할 명령&gt;
    &lt;수행할 명령&gt;

if array[0]==3:
    count = count + 1
    print(array)</code></pre>
<h3 id="-if-else-문">-if else 문</h3>
<p>조건이 <strong>True</strong>면 if문, <strong>False</strong>면 else문 실행</p>
<pre><code class="language-py">if 조건:
    &lt;수행할 명령&gt;
else:
    &lt;수행할 명령&gt;

x = input()
if x in [‘a’, ‘e’, ‘i’, ‘o’, ‘u’]:
    print(“모음입니다.”)
else:
    print(“자음입니다.”)</code></pre>
<h3 id="-if-elif-문">-if elif 문</h3>
<p>조건1이 <strong>True</strong>면 if문, 조건1이 <strong>False</strong>이면서 조건2가 <strong>True</strong>면 elif문 실행</p>
<pre><code class="language-py">if 조건:
    &lt;수행할 명령&gt;
elif 조건:
    &lt;수행할 명령&gt;

x = int(input())
if x%2==0:
    print(“2의배수입니다.”)
elif x%3==0:
    print(“3의배수입니다.”)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 기초 - 01. 기초 자료형]]></title>
            <link>https://velog.io/@0000_0010/01.%EA%B8%B0%EC%B4%88%EC%9E%90%EB%A3%8C%ED%98%95</link>
            <guid>https://velog.io/@0000_0010/01.%EA%B8%B0%EC%B4%88%EC%9E%90%EB%A3%8C%ED%98%95</guid>
            <pubDate>Thu, 05 May 2022 16:40:58 GMT</pubDate>
            <description><![CDATA[<h2 id="-기본-자료형">• 기본 자료형</h2>
<blockquote>
<ol>
<li>숫자형 (Number)</li>
<li>문자열 (String)</li>
<li>리스트 (List)</li>
</ol>
</blockquote>
<h3 id="1-숫자형-number">1. 숫자형 (Number)</h3>
<p>숫자로 이루어진 자료형 정수나 실수 등을 다룰수있다.
숫자끼리의 연산이 가능하다.</p>
<pre><code class="language-py">3      #정수형(integer)
3.14 #실수형(float)
3+4j #복소수
</code></pre>
<h3 id="2-문자열-string">2. 문자열 (String)</h3>
<p>문자나 문자들을 늘어놓은것
큰 따옴표(&quot; &quot;)와 작은 따옴표(&#39; &#39;)로 구분</p>
<pre><code class="language-py">&#39;안녕하세요&#39;
&#39;3.14&#39; #작은 따옴표 OK
&quot;3.14&quot; #큰 따옴표 OK</code></pre>
<h3 id="3-리스트-list">3. 리스트 (List)</h3>
<p>여러 자료를 보관하는 자료형
다른 종류의 자료를 함께 담을 수 있습니다. 자료 안에 순서가 있습니다.</p>
<pre><code class="language-py">[] #빈 리스트
[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]
[&#39;1&#39;, 1] #문자 1과 숫자 1
[[&#39;x&#39;, &#39;y&#39;], 2, &#39;e&#39;]</code></pre>
<h2 id="-변수">• 변수</h2>
<p>자료를 ʻ그릇ʼ에 담아서보관, 사용하면 편리합니다.
이를 변수(variable)라 합니다.</p>
<h3 id="-변수-사용방법">-변수 사용방법</h3>
<p>변수 이름 = 자료</p>
<pre><code class="language-py">num = 10 #숫자
name = ‘Michael’ #문자열
grade = [‘A+’, ‘B+’, ‘A0’] #리스트</code></pre>
<h3 id="-변수-작명방법">-변수 작명방법</h3>
<ol>
<li>숫자, 알파벳, 한글, 언더바(_) 등을 사용할 수 있다.</li>
<li>변수 이름이 숫자로 시작하면 안 된다.</li>
<li>파이썬에서 사용되는 예약어(ex. if, while...) 사용 금지</li>
<li>공백 문자(&#39; &#39;)와 연산자(+, -, * 등) 사용 금지</li>
</ol>
<h2 id="-자료형의-연산">• 자료형의 연산</h2>
<blockquote>
<ol>
<li>숫자형 자료의 연산</li>
<li>문자형 자료의 연산</li>
</ol>
</blockquote>
<h3 id="1-숫자형-자료의-연산">1. 숫자형 자료의 연산</h3>
<h4 id="숫자형-자료의-사칙연산">숫자형 자료의 사칙연산</h4>
<p>+: 덧셈 연산자
-: 뺄셈 연산자
*: 곱셈 연산자
/: 나누셈 연산자</p>
<pre><code class="language-py">print(2+5) #7
print(2-5) #-3
print(2*5) #10
print(2/5) #0.4</code></pre>
<h4 id="숫자형-자료의-특수연산">숫자형 자료의 특수연산</h4>
<p>//: 몫 연산자
%: 나머지 연산자
**: 제곱 연산자</p>
<pre><code class="language-py">print(12//5) #2
print(12%5)     #2
print(2**5)     #32</code></pre>
<h3 id="2-문자형-자료의-연산">2. 문자형 자료의 연산</h3>
<p>+: 이어붙이기
*: 반복하기</p>
<pre><code class="language-py">print(&quot;안녕&quot;+&quot;하세요&quot;) #안녕하세요
print(&quot;안녕&quot;*3) #안녕안녕안녕</code></pre>
<h2 id="-문자열리스트-접근하기">• 문자열/리스트 접근하기</h2>
<blockquote>
<p>&#39;IM FEARLESS&#39;과 &#39;LE SSERAFIM&#39;은 <strong>다른</strong> 문자열이다.
[1, 2, 3]과 [3, 2, 1]은 <strong>다른</strong> 리스트이다.</p>
</blockquote>
<p><strong>→ 원소의 배치 순서가 다르기 때문이다.</strong></p>
<h3 id="-인덱스">-인덱스</h3>
<p>문자열과 리스트 자료형은 여러 원소로 이루어져있고 각각의 위치를 0부터 순서대로 매길 수 있습니다.</p>
<pre><code class="language-py">&#39;happy&#39;            [2,4,6,8]
 01234 → 인덱스 ←  0 1 2 3</code></pre>
<h3 id="-인덱싱">-인덱싱</h3>
<p>Index를 이용해서 리스트나 문자열의 특정 위치의 원소를 가져오는 방법</p>
<pre><code class="language-py"># alpha에서 인덱스1인 원소‘e’를 출력
alpha = ‘Ready’
print(alpha[1])
&gt;&gt;&gt; e</code></pre>
<h3 id="-슬라이싱">-슬라이싱</h3>
<p>Index를 이용해서 리스트나 문자열의 일부분을 잘라서 가져오는 방법</p>
<pre><code class="language-py"># beta에서 2번째 원소 이상, 5번째 원소 미만을 가져온다.
beta = [2, 4, 6, 8, 10, 12, 14]
print(beta[2:5])
&gt;&gt;&gt; [6, 8, 10]</code></pre>
]]></description>
        </item>
    </channel>
</rss>