<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>LEEHEES</title>
        <link>https://velog.io/</link>
        <description>iOS 개발 공부</description>
        <lastBuildDate>Sat, 16 Jul 2022 17:09:10 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>LEEHEES</title>
            <url>https://velog.velcdn.com/images/lee-hees/profile/e63ab7b7-97d0-4af3-98c3-9dbbc6b82308/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. LEEHEES. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/lee-hees" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[비동기 처리]]></title>
            <link>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Sat, 16 Jul 2022 17:09:10 GMT</pubDate>
            <description><![CDATA[<blockquote>
</blockquote>
<p>여러 개의 루틴을 동시에 실행하는 방법</p>
<h2 id="코루틴-coroutine">코루틴 (coroutine)</h2>
<pre><code class="language-kotlin">import kotlinx.coroutines.*</code></pre>
<blockquote>
</blockquote>
<p>코루틴은 제어 범위 및 실행 범위 지정 가능
→ 코루틴의 Scope</p>
<blockquote>
</blockquote>
<h3 id="globalscope">GlobalScope</h3>
<p>프로그램의 어디서나 제어, 동작 가능한 기본 범위</p>
<blockquote>
</blockquote>
<h3 id="coroutinescope">CoroutineScope</h3>
<p>특정한 목적의 Dispatcher 를 지정하여 제어, 동작 가능한 범위</p>
<blockquote>
</blockquote>
<h3 id="dispatcher">Dispatcher</h3>
<p>Dispatchers.Default - 기본적인 백그라운드 동작
Dispatcher.IO - 네트워크나 디스크 등 I/O에 최적화된 동작
Dispatcher.Main - 메인( UI ) 스레드에서 동작
모든 플랫폼에서는 지원되지 않으니 지원되는 플랫폼에 따라 사용해야 함</p>
<blockquote>
</blockquote>
<pre><code class="language-kotlin">val scope = CoroutineScope(Dispatcher.Default)
val coroutineA = scope.launch { }  →  반환 값이 없는 Job 객체 ( 람다함수의 형태 )
val coroutineB = scope.async { }  →  반환 값이 있는 Deffered 객체 ( 람다함수의 형태 - 마지막 구문 반환 )</code></pre>
<blockquote>
</blockquote>
<p><strong>코루틴은 제어되는 스코프 또는 프로그램 전체가 종료되면 함께 종료되기 때문에
코루틴이 끝까지 실행되는 것을 보장하려면 일정한 범위에서 코루틴이 모두 실행될 때까지 기다려야함</strong></p>
<blockquote>
</blockquote>
<p>runBlocking { } 을 이용하여 프로그램이 종료되기 전 잠시 기다리며 블록을 실행 함</p>
<blockquote>
</blockquote>
<pre><code>※ 안드로이드에서는 메인 스레드에서 runBlocking 을 걸어주면
일정 시간 응답이 없는 경우 ANR 이 발생하여 앱이 강제 종료됨</code></pre><h2 id="루틴의-대기를-위한-추가-함수">루틴의 대기를 위한 추가 함수</h2>
<blockquote>
</blockquote>
<h3 id="delaymilisecond-long">delay(milisecond: Long)</h3>
<p>milisecond 단위로 루틴을 잠시 대기 시킴</p>
<blockquote>
</blockquote>
<h3 id="jobjoin">Job.join()</h3>
<p>Job 실행이 끝날때까지 대기하는 함수</p>
<blockquote>
</blockquote>
<h3 id="deferredawait">Deferred.await()</h3>
<p>Deferred 의 실행이 끝날때까지 대기하는 함수
Deferred 의 결과도 반환함</p>
<blockquote>
</blockquote>
<p><strong>세 함수 delay() / join() / await() 는 코루틴 내부 또는 runBlocking{ } 과 같은 
루틴의 대기가 가능한 구문 안에서만 동작 가능</strong></p>
<h2 id="코루틴-중단">코루틴 중단</h2>
<blockquote>
</blockquote>
<h3 id="cancel">cancel()</h3>
<ol>
<li>코루틴 내부의 delay() 함수 또는 yield() 함수가 사용된 위치까지 수행된 뒤 종료</li>
<li>cancel() 로 인해 속성인 isActive 가 false 가 되므로 이를 확인하여 수동으로 종료</li>
</ol>
<h2 id="제한시간-내에-수행되면-결과물을-아니면-null-반환">제한시간 내에 수행되면 결과물을 아니면 null 반환</h2>
<blockquote>
</blockquote>
<pre><code>withTimeoutOrNull( milisecond: Long ){
    구문
    결과 값
}</code></pre><blockquote>
</blockquote>
<p>이 함수도 blocking 함수</p>
<h2 id="풀코드">풀코드</h2>
<pre><code class="language-kotlin">import kotlinx.coroutines.*

fun main() {

    blocking_function()

    println()
    println(&quot;====================&quot;)
    println()

    _cancel()

    println()
    println(&quot;====================&quot;)
    println()

    _withTimeoutOrNull()

}

fun blocking_function() {

    runBlocking {
        val a = launch {
            for (i in 1..5) {
                println(i)
                delay(1000)
            }
        }

        val b = async {
            &quot;async 반환&quot;
        }

        println(&quot;async 대기&quot;)
        println(b.await())

        println(&quot;launch 대기&quot;)
        a.join()
        println(&quot;launch 종료&quot;)

    }

}

fun _cancel() {

    runBlocking {
        val a = launch {
            for (i in 1..5) {
                println(i)
                delay(1000)
            }
        }

        val b = async {
            &quot;async 반환&quot;
        }

        println(&quot;async 대기&quot;)
        println(b.await())

        println(&quot;launch 취소&quot;)
        a.cancel()
        println(&quot;launch 종료&quot;)

    }

}

fun _withTimeoutOrNull() {

    runBlocking {
        val a = withTimeoutOrNull(50){
//        실패
//        val a = withTimeoutOrNull(500){
//        성공

            for(i in 1..10){
                println(i)
                delay(10)
            }
            &quot;결과 값&quot;
        }
        println(a)
    }

}

//async 대기
//1
//async 반환
//launch 대기
//2
//3
//4
//5
//launch 종료
//
//====================
//
//async 대기
//1
//async 반환
//launch 취소
//launch 종료
//
//====================
//
//1
//2
//3
//4
//null</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[비트 연산]]></title>
            <link>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EB%B9%84%ED%8A%B8-%EC%97%B0%EC%82%B0</link>
            <guid>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EB%B9%84%ED%8A%B8-%EC%97%B0%EC%82%B0</guid>
            <pubDate>Sat, 16 Jul 2022 17:09:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
</blockquote>
<p>정수형 변수를 10진법 대신 2진법으로 연산할 수 있는 단위</p>
<blockquote>
</blockquote>
<p>실무에서는 계산에서는 거의 사용하지 않으며
정수형의 값을 비트 단위로 나누어 데이터를 좀 더 작은 단위로 담아
경제성을 높이기 위한 용도로 사용
( 2진법을 이용한 연산 최적화가 필요하다면 컴파일러의 기능을 사용하는 경우가 대부분 )</p>
<blockquote>
</blockquote>
<p>변수 하나에 여러 개의 값을 담아 사용하는 등으로 사용</p>
<blockquote>
</blockquote>
<p>단, 비트연산을 사용하는 부하도 무시할 수 없으므로 
주로 플래그 값을 처리하거나
네트워크에서 프로토콜의 데이터 양을 줄이기 위해 자주 사용됨</p>
<blockquote>
</blockquote>
<p>좌측으로 갈 수록 상위비트
우측으로 갈 수록 하위비트</p>
<blockquote>
</blockquote>
<p>코틀린은 모든 정수형이 부호를 포함하므로 
최상위 비트를 부호비트로 사용하기 때문에 데이터를 담지 않는 것이 좋음</p>
<h2 id="bitwise-shift-operator">bitwise shift operator</h2>
<blockquote>
</blockquote>
<p>부호 비트를 제외한 모든 비트를 밀어주는 기능</p>
<blockquote>
</blockquote>
<p>좌측으로 밀어주는 shl
우측으로 밀어주는 shr
부호비트를 포함하여 우측으로 밀어주는 ushr</p>
<h2 id="bitwise-operator">bitwise operator</h2>
<blockquote>
</blockquote>
<p>둘 다 1인 경우 1을 반환하는 and
→ 특정 위치에 1이 있는지 확인하는 용도
→ 특정 위치를 0으로 만드는 용도</p>
<blockquote>
</blockquote>
<p>둘 중 하나만 1인 경우 1을 반환하는 or
→ 특정 위치를 1로 만드는 용도</p>
<blockquote>
</blockquote>
<p>두 비트가 다른 경우 1을 반환하는 xor
→ 특정 위치가 동일한지 확인하는 용도</p>
<h2 id="inv-함수">inv() 함수</h2>
<blockquote>
</blockquote>
<p>비트를 모두 반전시키는 함수</p>
<h2 id="풀코드">풀코드</h2>
<pre><code>※ 출력 시 처음으로 1이 등장한 비트부터 출력</code></pre><pre><code class="language-kotlin">fun main() {

    var bitData: Int = 0b10000

    println(bitData.toString(2))

    bitData = bitData or (1 shl 2)
    println(bitData.toString(2))
//    00001 ( 1 )
//    00100 ( 1 shl 2 )
//    10000 [ bitData ]
//    10100 ( bitData or (1 shl 2) )

    var result = bitData and (1 shl 4)
    println(result.toString(2))
//    00001 ( 1 )
//    10000 ( 1 shl 4 )
//    10100 [ bitData ]
//    10000 ( bitData and (1 shl 4) )

    println(result shr 4)
//    00001 ( result shr 4 )
//    1 [ 10진수로 출력 ]

    bitData = bitData and ((1 shl 4).inv())
    println(bitData.toString(2))
//    00001 ( 1 )
//    10000 ( a shl 4 )
//    01111 ( (1 shl 4).inv() )
//    10100 [ bitData ]
//    00100 ( bitData and ((1 shl 4).inv()) )

    println((bitData xor (0b10100)).toString(2))
//    00100 ( bitData )
//    10100 ( 0b10100 )
//    10000 ( bitData xor (0b10100)) )

}

//10000
//10100
//10000
//1
//100
//10000</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Enum Class]]></title>
            <link>https://velog.io/@lee-hees/%EC%BD%94%EB%93%A4%EB%A6%B0-%EC%97%B4%EA%B1%B0%ED%98%95-%ED%81%B4%EB%9E%98%EC%8A%A4</link>
            <guid>https://velog.io/@lee-hees/%EC%BD%94%EB%93%A4%EB%A6%B0-%EC%97%B4%EA%B1%B0%ED%98%95-%ED%81%B4%EB%9E%98%EC%8A%A4</guid>
            <pubDate>Sat, 16 Jul 2022 17:08:51 GMT</pubDate>
            <description><![CDATA[<blockquote>
</blockquote>
<p>열거형</p>
<blockquote>
</blockquote>
<p><strong>여러 가지 상태를 구분하기 위한 객체들을 이름을 붙혀 여러 개 생성해 두고,
그 중 하나의 상태를 선택하여 나타내기 위한 클래스</strong></p>
<blockquote>
</blockquote>
<p>상태는 대문자를 사용하는 것이 관례</p>
<blockquote>
</blockquote>
<p>Enum 의 객체들은 고유한 속성을 가질 수 있음</p>
<blockquote>
</blockquote>
<pre><code>생성자를 만들어 속성을 갖도록 하면, 객체를 선언할 때 속성 설정 가능</code></pre><blockquote>
</blockquote>
<p>일반 클래스처럼 함수 추가 가능</p>
<blockquote>
</blockquote>
<pre><code>객체 추가 마지막 부분에 ;(세미콜론)을 추가한 후 함수 기술하면 됨</code></pre><h2 id="풀코드">풀코드</h2>
<pre><code class="language-kotlin">fun main() {

    _state()

}

fun _state() {

    var a = state.SING
    println(a)

    a = state.EAT
    println(a.messeage)

    a=state.SLEEP
    println(a.isSleeping())


}

enum class state(val messeage: String) {
    SING(&quot;sing&quot;),
    EAT(&quot;eat&quot;),
    SLEEP(&quot;sleep&quot;);

    fun isSleeping() = this == state.SLEEP
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Data Class]]></title>
            <link>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%81%B4%EB%9E%98%EC%8A%A4</link>
            <guid>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%81%B4%EB%9E%98%EC%8A%A4</guid>
            <pubDate>Sat, 16 Jul 2022 17:08:40 GMT</pubDate>
            <description><![CDATA[<p><strong>데이터를 다루는데 최적화된 Class</strong></p>
<p>5가지 기능을 내부적으로 자동으로 생성</p>
<blockquote>
</blockquote>
<p><strong>1. equals() - 내용의 동일성 판단</strong></p>
<blockquote>
</blockquote>
<p><strong>2. hashcode() - 객체의 내용에서 고유한 코드 생성</strong></p>
<blockquote>
</blockquote>
<p><strong>3. toString() - 포함된 속성을 보기 쉽게 나타냄</strong></p>
<blockquote>
</blockquote>
<p><strong>4. copy() - 객체를 복사하여 똑같이 내용의 새 객체를 만듦</strong></p>
<blockquote>
</blockquote>
<pre><code>※ 파라미터 없이 생성할 수도 있고,
  파라미터를 전달하여 일부 속성 교체 가능</code></pre><blockquote>
</blockquote>
<p><strong>5. componentX() - 속성을 순서대로 반환</strong></p>
<blockquote>
</blockquote>
<pre><code>※ 배열이나 리스트 등에 Data Class 객체가 담겨 있을 때
  이 내용을 자동으로 꺼내 쓸 수 있는 기능을 지원하기 위한 함수</code></pre><h3 id="풀코드">풀코드</h3>
<pre><code class="language-kotlin">fun main() {

    equals_hashcode_tostring()

    println()
    println(&quot;====================&quot;)
    println()

    _componextX()

}

fun equals_hashcode_tostring() {

    val a = General(&quot;name1&quot;, 1)

    println(a == General(&quot;name1&quot;, 1))
    println(a.hashCode())
    println(a)

    println()

    val b = Data(&quot;name2&quot;, 2)

    println(b == Data(&quot;name2&quot;, 2))
    println(b.hashCode())
    println(b)

    println()

    println(b.copy())
    println(b.copy(&quot;name3&quot;))
    println(b.copy(id = 3))

}

fun _componextX() {

    val llist = listOf(
            Data(&quot;name11&quot;, 1),
            Data(&quot;name12&quot;, 2),
            Data(&quot;name13&quot;, 3)
    )

    for ((a, b) in llist) {
        println(&quot;$a : $b&quot;)
    }

}

class General(val name: String, val id: Int)

data class Data(val name: String, val id: Int)
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[오브젝트]]></title>
            <link>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Sat, 16 Jul 2022 17:06:46 GMT</pubDate>
            <description><![CDATA[<blockquote>
</blockquote>
<p>클래스의 인스턴스를 단 하나만 만들어 사용하도록 하는 코딩 아키텍처 패턴</p>
<pre><code class="language-kotlin">object 오브젝트명 { ... }</code></pre>
<pre><code class="language-kotlin">오브젝트명.속성
오브젝트명.함수()</code></pre>
<pre><code class="language-kotlin">fun main() {
    println(Counter.count)

    Counter.add()
    println(Counter.count)
    Counter.add()
    println(Counter.count)

    Counter.clear()
    println(Counter.count)
}

object Counter{
    var count=0

    fun add(){
        count++
    }

    fun clear(){
        count=0
    }
}</code></pre>
<h2 id="companion-object">companion object</h2>
<blockquote>
</blockquote>
<p>클래스 내의 오브젝트
(static 과 비슷함)</p>
<pre><code class="language-kotlin">companion object { ... }</code></pre>
<pre><code class="language-kotlin">클래스명.속성
클래스명.함수()</code></pre>
<pre><code class="language-kotlin">fun main() {
    var a = JJ(&quot;짜장&quot;)
    var b = JJ(&quot;짬뽕&quot;)

    a.vote()
    a.vote()

    b.vote()
    b.vote()
    b.vote()

    println(&quot;짜장 투표수 : ${a.count}&quot;)
    println(&quot;짬뽕 투표수 : ${b.count}&quot;)
    println(&quot;최종 투표수 : ${JJ.total}&quot;)
}

class JJ(val name: String) {
    companion object {
        var total = 0
    }

    var count = 0
    fun vote() {
        total++
        count++
    }
}

//짜장 투표수 : 2
//짬뽕 투표수 : 3
//최종 투표수 : 5</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[스코프]]></title>
            <link>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%8A%A4%EC%BD%94%ED%94%84</link>
            <guid>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%8A%A4%EC%BD%94%ED%94%84</guid>
            <pubDate>Sat, 16 Jul 2022 17:06:31 GMT</pubDate>
            <description><![CDATA[<blockquote>
</blockquote>
<p>패키지 / 클래스 / 함수에서 적용되는 개년</p>
<blockquote>
</blockquote>
<p>패키지 안에서 변수, 함수, 클래스들이 하나의 스코프
함수 / 클래스 안에서 변수, 함수들이 하나의 스코프</p>
<blockquote>
</blockquote>
<p><strong>특징)</strong>
외부에서는 내부 멤버를 참조 연산자(.)로 참조 가능
동일 스코프 내에서 멤버 공유
하위 스코프에서 상위 스코프 멤버 재정의</p>
<h2 id="접근제한자">접근제한자</h2>
<blockquote>
</blockquote>
<p>변수(속성), 함수, 클래스 앞에 붙여 제한</p>
<blockquote>
</blockquote>
<h3 id="패키지">패키지</h3>
<blockquote>
</blockquote>
<pre><code>public        어떤 패키지에서도 접근 가능
internal    같은 모듈 내에서 접근 가능
private        같은 파일에서 접근 가능</code></pre><blockquote>
</blockquote>
<h3 id="클래스">클래스</h3>
<blockquote>
</blockquote>
<pre><code>public        클래스 외부에서도 접근 가능
private        클래스 내부에서만 접근 가능
protected    클래스 자신, 상속받은 클래스에서 접근 가능</code></pre><h2 id="스코프-함수">스코프 함수</h2>
<blockquote>
</blockquote>
<p>클래스에서 생성한 인스턴스 → 스코프 함수를 통해 따로 작업 가능
인스턴스에서의 참조 연산자 사용 없이 구문 작성 가능
속성이나 함수를 좀 더 깔끔하게 불러 사용할 수 있다
<strong>→ main 함수와 별도의 스코프에서 작업 수행 
→ 코드 단순화</strong></p>
<pre><code class="language-kotlin">fun main() {

    val price=99999

    var a = Book(&quot;코틀린&quot;, 10000).apply {
        name = &quot;[초특가] &quot; + name
        discount()
//        price -= 5000
    }

    a.run {
        println(name)
        println(&quot;$price&quot;)
    }

    with(a){
        println(name)
        println(&quot;$price&quot;)
    }

    a.also {
        it.price -= 5000
    }

    a.let {
        println(it.name)
        println(&quot;${it.price}&quot;)
    }

}

class Book(var name: String, var price: Int) {
    fun discount() {
        price -= 2000
    }
}</code></pre>
<h3 id="apply">apply</h3>
<blockquote>
</blockquote>
<p>초기화와 동시에 수행</p>
<blockquote>
</blockquote>
<p><strong>클래스를 생성과 동시에 구문이 수행됨</strong></p>
<pre><code class="language-kotlin">var a = 클래스명(초기화).apply { 수행할 구문 }</code></pre>
<h3 id="run">run</h3>
<blockquote>
</blockquote>
<p>마지막 구문 반환
이미 인스턴스가 만들어진 후 인스턴스의 속성, 함수를
스코프 내에서 사용할 때 유용</p>
<pre><code class="language-kotlin">a.run { 수행할 구문 }</code></pre>
<h3 id="with-인스턴스-">with( 인스턴스 )</h3>
<blockquote>
</blockquote>
<p>run 기능과 동일</p>
<pre><code class="language-kotlin">with(a){ 수행할 구문 }</code></pre>
<h3 id="also">also</h3>
<blockquote>
</blockquote>
<p>apply 와 같은 기능
main 에서의 속성과 ㅎ마수의 속성 이름이 같을 때, 구분하기 위해 <strong>&#39;it&#39;</strong> 을 사용해 구분</p>
<pre><code class="language-kotlin">a.also { 
    ...
    it.price -= 5000
    ...
}</code></pre>
<h3 id="let">let</h3>
<blockquote>
</blockquote>
<p>run 과 같은 기능
main 에서의 속성과 ㅎ마수의 속성 이름이 같을 때, 구분하기 위해 <strong>&#39;it&#39;</strong> 을 사용해 구분</p>
<pre><code class="language-kotlin">var a = 클래스명(초기화).apply { 수행할 구문 }</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[클래스]]></title>
            <link>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%ED%81%B4%EB%9E%98%EC%8A%A4</link>
            <guid>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%ED%81%B4%EB%9E%98%EC%8A%A4</guid>
            <pubDate>Sat, 16 Jul 2022 17:06:04 GMT</pubDate>
            <description><![CDATA[<blockquote>
</blockquote>
<p>속성 + 함수
인스턴스를 만드는 틀</p>
<blockquote>
</blockquote>
<p>클래스의 파라미터는 속성 + 생성자</p>
<pre><code class="language-kotlin">class 클래스명 (파라미터) {
    ...
    fun 함수명 (파라미터) { ... }
    ...
}

fun main(){
    var 인스턴스명 = 클래스명(파라미터 초기화)

    인스턴스명.함수명(인자)
}</code></pre>
<h2 id="생성자">생성자</h2>
<blockquote>
</blockquote>
<p>인스턴스의 속성 초기화 + 생성 시 구문 수행</p>
<pre><code class="language-kotlin">class 클래스명(파라미터){
    init { ... } // 생성 시 바로 수행되는 함수
}</code></pre>
<blockquote>
</blockquote>
<h4 id="-보조-생성자">※ 보조 생성자</h4>
<p>constructor에서의 this에 의해 init이 가장 먼저 수행됨</p>
<pre><code class="language-kotlin">class 클래스명(파라미터){
    init { ... } // 생성 시 바로 수행되는 함수
    constructor (파라미터) : this (파라미터, 고정 값) { ... }
}</code></pre>
<h2 id="상속">상속</h2>
<blockquote>
</blockquote>
<p>기존의 클래스의 멤버를 확장하기 위한 목적으로 상, 하 구조를 가지도록 구성하는 것</p>
<blockquote>
</blockquote>
<p>슈퍼 클래스</p>
<pre><code class="language-kotlin">open class ...</code></pre>
<blockquote>
</blockquote>
<p>서브 클래스</p>
<pre><code class="language-kotlin">class 서브 클래스명 (일부 파라미터) : 슈퍼 클래스명 ( ... ) { ... }</code></pre>
<blockquote>
<h4 id="풀코드">풀코드</h4>
</blockquote>
<pre><code class="language-kotlin">fun main() {
    var SUPER = Super()
    println(SUPER.a)

    println()

    var SUB = Sub()
    println(SUB.a)
    println(SUB.b)
}

//1
//
//1
//11

open class Super {
    val a = 1
}

class Sub : Super() {
    val b = 11
}</code></pre>
<h2 id="오버라이딩">오버라이딩</h2>
<blockquote>
</blockquote>
<p>슈퍼 클래스에 open을 붙이고
서브 클래스에서 override를 붙여 이름과 형태가 같은 함수 재정의 가능</p>
<pre><code class="language-kotlin">fun main() {
    var SUPER = Super()
    println(SUPER.a)
    SUPER.superfunc()

    println()

    var SUB = Sub()
    println(SUB.a)
    println(SUB.b)
    SUB.superfunc()
    SUB.subfunc()
}

//1
//super fun
//
//1
//11
//override super fun
//sub fun

open class Super {
    val a = 1
    open fun superfunc(){
        println(&quot;super fun&quot;)
    }
}

class Sub : Super() {
    val b = 11
    override fun superfunc() {
        println(&quot;override super fun&quot;)
    }
    fun subfunc(){
        println(&quot;sub fun&quot;)
    }
}</code></pre>
<h2 id="추상화">추상화</h2>
<blockquote>
</blockquote>
<p>형식만 선언하고 실제 구현을 서브 클래스에 일임</p>
<blockquote>
</blockquote>
<p>추상 클래스, 함수에는 반드시 &#39;abstract&#39; 키워드를 붙여야 함
상속 받은 클래스에서 재정의 가능</p>
<pre><code class="language-kotlin">fun main() {
    var b = B()
    b.a()
    b.b()
}

abstract class A() {
    abstract fun a()
    fun b() {
        println(&quot;fun b&quot;)
    }
}

class B : A() {
    override fun a() {
        println(&quot;override fun a&quot;)
    }
}

//override fun a
//fun b</code></pre>
<h2 id="인터페이스">인터페이스</h2>
<blockquote>
</blockquote>
<p>abstract 와 달리 생성자가 없음
Java와 달리 구현된 일반 함수도 구현 가능, 속성도 선언 가능
→ abstract 와 open 키워드가 필요 없음
→ 서브 클래스에서 override를 이용해 모두 구현, 재정의 가능</p>
<blockquote>
</blockquote>
<pre><code>※ 여러 인터페이스를 하나의 서브 클래스에 상속 받는 것이 가능해 유연한 코딩(구현) 가능</code></pre><blockquote>
</blockquote>
<p>인터페이스 A, B를 한 번에 C로 상속 가능</p>
<blockquote>
</blockquote>
<p>클래스 C를 인스턴스로 생성하여 
함수 a, b, c 사용 가능</p>
<pre><code class="language-kotlin">fun main() {
    var c = C()
    c.a()
    c.b()
    c.c()
}

interface A {
    fun a()
}

interface B {
    fun b()
    fun c() {
        println(&quot;fun c&quot;)
    }
}

class C : A, B {
    override fun a() {
        println(&quot;override fun a&quot;)
    }

    override fun b() {
        println(&quot;override fun b&quot;)
    }
}</code></pre>
<h2 id="다형성">다형성</h2>
<pre><code class="language-kotlin">fun main() {
    var 변수1: 클래스1 = 클래스2()
    변수1.함수1()
//    변수1.함수2()

    println()

    var 변수2 = 클래스2()
    변수2.함수1()
    변수2.함수2()

    println()

    if (변수1 is 클래스1) {
        var 변수3 = 변수1 as 클래스2
        변수3.함수1()
        변수3.함수2()
    } else {
        println(&quot;...&quot;)
    }
}

open class 클래스1 {
    open fun 함수1() {
        println(&quot;구문1&quot;)
    }
}

class 클래스2 : 클래스1() {
    override fun 함수1() {
        println(&quot;구문1 재정의&quot;)
    }

    fun 함수2() {
        println(&quot;구문2&quot;)
    }
}

//구문1 재정의
//
//구문1 재정의
//구문2
//
//구문1 재정의
//구문2</code></pre>
<blockquote>
</blockquote>
<h3 id="up-casting">up-casting</h3>
<blockquote>
</blockquote>
<p><strong>&lt; 하위 클래스가 상위 클래스화 되는 것 &gt;</strong></p>
<blockquote>
</blockquote>
<p>var 인스턴스: 상위 클래스 = 하위 클래스()</p>
<blockquote>
</blockquote>
<p>상위 클래스화 하기 위해서 인스턴스의 클래스 타입 지정</p>
<blockquote>
</blockquote>
<pre><code>※ 인스턴스의 클래스 타입을 지정하지 않으면
  자동으로 하위 클래스로 추론됨</code></pre><blockquote>
</blockquote>
<h3 id="down-casting">down-casting</h3>
<blockquote>
</blockquote>
<p><strong>&lt; 상위 클래스화 된 인스턴스를 지정한 하위 클래스화 하는 것 &gt;</strong></p>
<blockquote>
</blockquote>
<p>is와 as 키워드 사용</p>
<blockquote>
</blockquote>
<p>if (인스턴스 is 클래스) → 인스턴스의 클래스 확인용 조건에 사용</p>
<blockquote>
</blockquote>
<p>var 인스턴스 = 존재하는 인스턴스 as 하위 클래스
up-casting 된 인스턴스를 하위 클래스로 캐스팅</p>
<blockquote>
</blockquote>
<p>is 로 조건을 걸어서 as 로 down-casting 하는 방법이 일반적</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[반복문]]></title>
            <link>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EB%B0%98%EB%B3%B5%EB%AC%B8</link>
            <guid>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EB%B0%98%EB%B3%B5%EB%AC%B8</guid>
            <pubDate>Sun, 10 Jul 2022 12:21:09 GMT</pubDate>
            <description><![CDATA[<h2 id="조건">조건</h2>
<pre><code class="language-kotlin">while (조건) { ... }</code></pre>
<pre><code class="language-kotlin">do { ... } while (조건)</code></pre>
<h2 id="범위-반복-횟수">범위 (반복 횟수)</h2>
<pre><code class="language-kotlin">for (인덱싱 변수명 in 시작..끝 step 증가량) { ... } //시작부터 끝까지 증가량씩 증가
for (인덱싱 변수명 in 시작douwnTo끝 step 증가량) { ... } //끝부터 시작까지 증가량씩 감소</code></pre>
<blockquote>
</blockquote>
<p>&#39;step 증가량&#39; 이 없는 경우 1씩 증감</p>
<h2 id="흐름제어">흐름제어</h2>
<pre><code class="language-kotlin">반복문 ( ... ) {
    ...
    break //반복문 종료
    continue //다시 반복 조건 확인
    ...
}</code></pre>
<h2 id="이름-부여-label">이름 부여 (label)</h2>
<blockquote>
</blockquote>
<p>반복문에 이름( label ) 부여하여 유연한 흐름제어</p>
<pre><code class="language-kotlin">이름@반복문1 ( ... ) {
    반복문2 ( ... ) {
        ...
        break@이름 //반복문2 안에서 반복문1을 바로 종료
        continue@이름 //바로 반복문1의 다음 조건 확인
        ...
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[조건문]]></title>
            <link>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%A1%B0%EA%B1%B4%EB%AC%B8</link>
            <guid>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%A1%B0%EA%B1%B4%EB%AC%B8</guid>
            <pubDate>Sun, 10 Jul 2022 10:54:53 GMT</pubDate>
            <description><![CDATA[<h2 id="기본형">기본형</h2>
<pre><code class="language-kotlin">if (조건식)
{
    실행문
} 
else if (조건식)
{
    실행문
}
else {
    실행문
}</code></pre>
<h2 id="비교-연산자">비교 연산자</h2>
<blockquote>
</blockquote>
<p><strong>&lt;</strong>
<strong>&lt;=</strong>
<strong>&gt;</strong>
<strong>&gt;=</strong>
<strong>==</strong>
<strong>!=</strong></p>
<blockquote>
</blockquote>
<p>l-value 와 r-value 비교</p>
<blockquote>
</blockquote>
<p><strong>!is</strong>
<strong>is</strong></p>
<blockquote>
</blockquote>
<p>l-value 의 자료형이 r-value 와 일치하는지 확인</p>
<h2 id="다중-조건문-when">다중 조건문 (when)</h2>
<pre><code class="language-kotlin">when(변수){
    데이터 -&gt; 구문 //데이터와의 일치여부
    (!)is 자료형 -&gt; 구문 //자료형 확인
    ...
    else -&gt; 구문 //모든 조건과 맞지 않을 때 (마지막에 else는 반드시 필요)
}</code></pre>
<blockquote>
</blockquote>
<p>구문 부분에 데이터를 반환하여 when()의 결과를 데이터로 사용가능 ( var 변수2 = when(변수){ ... } )</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[함수]]></title>
            <link>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%ED%95%A8%EC%88%98</guid>
            <pubDate>Sun, 10 Jul 2022 10:54:13 GMT</pubDate>
            <description><![CDATA[<h2 id="기본형태">기본형태</h2>
<blockquote>
</blockquote>
<p>파라미터와 자료형은 타입추론 불가능</p>
<pre><code class="language-kotlin">fun 함수명(파라미터):자료형 { 
    ... 
    return 반환값 //종료
    ... 
}

fun main(){
    함수명(인자)
}</code></pre>
<h2 id="단일-표현식-함수">단일 표현식 함수</h2>
<pre><code class="language-kotlin">fun 함수명(파라미터) = 반환식</code></pre>
<h2 id="고차함수">고차함수</h2>
<blockquote>
</blockquote>
<p>함수를 마치 클래스에서 만들어낸 인스턴스처럼 취급하는 방법
함수를 파라미터로 넘기거나 결과 값을 반환 받을 수도 있음
모든 함수는 고차함수로 이용 가능</p>
<pre><code class="language-kotlin">fun main() {
    b(::a)
}

fun a(str:String){
    println(&quot;$str 함수 a&quot;)
}

fun b(function:(String)-&gt;Unit){
    function(&quot;b가 호출한&quot;)
}

//b가 호출한 함수 a</code></pre>
<blockquote>
</blockquote>
<p>b(::a)</p>
<blockquote>
</blockquote>
<p>function = a
function(&quot;b가 호출한&quot;)</p>
<blockquote>
</blockquote>
<p>str = &quot;b가 호출한&quot;
println(&quot;b가 호출한 함수 a&quot;)</p>
<h2 id="람다함수">람다함수</h2>
<blockquote>
</blockquote>
<p>자체가 고차함수
별도의 연산자 없이도 변수에 담을 수 있음</p>
<pre><code class="language-kotlin">fun main() {
    val c: (String) -&gt; Unit = { str: String -&gt; println(&quot;$str 람다함수 a&quot;) }
    val cc: (String) -&gt; Unit = { str -&gt; println(&quot;$str 람다함수 a&quot;) }
    val ccc = { str: String -&gt; println(&quot;$str 람다함수 a&quot;) }

    b(c)
    b(cc)
    b(ccc)
}

fun b(function: (String) -&gt; Unit) {
    function(&quot;b가 호출한&quot;)
}

//b가 호출한 람다함수 a
//b가 호출한 람다함수 a
//b가 호출한 람다함수 a</code></pre>
<blockquote>
</blockquote>
<p>a 함수 없이 람다함수로 작성 가능</p>
<blockquote>
</blockquote>
<ol>
<li>&#39;-&gt;&#39; 이후 부분에 여러 구문 작성 가능
 &#39;-&gt;&#39; 이후 부분의 반환 값이 존재하는(Unit이 아닌) 경우, 마지막 구문이 반환됨</li>
<li>파라미터가 없는 경우, 구문만 작성(&#39;-&gt;&#39; 없이)</li>
<li>파라미터가 1개인 경우, &#39;it&#39;으로 대체 가능</li>
</ol>
<h2 id="오버로딩">오버로딩</h2>
<blockquote>
</blockquote>
<p>같은 스코프 안에서 서로 다른 파라미터를 가진 같은 이름의 함수를 사용하는 방법</p>
<blockquote>
</blockquote>
<p><em>※ 파라미터의 종류와 갯수가 중요함. 이름이 다른 것은 상관 없음</em></p>
<pre><code class="language-kotlin">fun main() {

    A(10)
    A(&quot;문자열&quot;)

}

fun A(x: Int) {
    println(&quot;$x&quot;)
}

fun A(x: String) {
    println(x)
}</code></pre>
<h2 id="argument-인자">Argument (인자)</h2>
<blockquote>
<h3 id="default-argument">default argument</h3>
<p>굳이 입력하지 않아도 기본 값이 있는 파라미터를 가진 함수를 만드는 방법</p>
</blockquote>
<pre><code class="language-kotlin">fun main() {

    B(&quot;지정 문자열1&quot;)
    B(&quot;지정 문자열1&quot;, 88)
    B(&quot;지정 문자열1&quot;, 99, &quot;지정 문자열2&quot;)

}

fun B(a: String, b: Int = 1, c: String = &quot;기본 문자열&quot;) {
    println(&quot;$a\t$b\t$c&quot;)
}</code></pre>
<blockquote>
<h3 id="named-argument">named argument</h3>
<p>순서대로 인자를 입력하지 않고 사이의 값을 기본갑으로 설정하기 위해서
설정할 파라미터의 이름을 지정하여 설정하는 방법</p>
</blockquote>
<pre><code class="language-kotlin">fun main() {

    B(&quot;지정 문자열1&quot;, c = &quot;지정 문자열2&quot;)

}

fun B(a: String, b: Int = 1, c: String = &quot;기본 문자열&quot;) {
    println(&quot;$a\t$b\t$c&quot;)
}</code></pre>
<blockquote>
<h3 id="variable-number-of-argument-vararg">variable number of argument (vararg)</h3>
<p>같은 자료형을 개수에 상관없이 파라미터로 받을 때 사용하는 방법</p>
</blockquote>
<p><em>※ vararg 와 다른 파라미터를 함께 사용하는 경우 마지막에 작성</em></p>
<pre><code class="language-kotlin">fun main() {

    C(&quot;문자열&quot;, 1, 1, 1, 1)

}

fun C(str: String, vararg numbers: Int) {
    var sum = 0

    for (n in numbers) {
        sum += n
    }

    println(&quot;$str, $sum&quot;)
}</code></pre>
<h2 id="infix-함수">infix 함수</h2>
<blockquote>
</blockquote>
<p>연산자처럼 쓸 수 있는 함수</p>
<blockquote>
</blockquote>
<p><em>※ class 안에서 infix 함수를 선언할 때에는 적용할 클래스가 자기 자신이므로 클래스의 이름을 쓰지 않는다</em></p>
<pre><code class="language-kotlin">fun main() {

    println(6 D 4)
    println(6.D(4))

}

infix fun Int.D(x: Int): Int = this * x</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[배열]]></title>
            <link>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EB%B0%B0%EC%97%B4</link>
            <guid>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EB%B0%B0%EC%97%B4</guid>
            <pubDate>Sun, 10 Jul 2022 10:53:40 GMT</pubDate>
            <description><![CDATA[<h2 id="배열-생성">배열 생성</h2>
<blockquote>
</blockquote>
<p>Array&lt;T&gt;
var 배열명 : Array&lt;자료형&gt; = arrayOf(1,2,3,4,...)
→ (튜플)안에 데이터를 지정하여 정해진 개수 및 데이터의 배열 생성</p>
<pre><code class="language-kotlin">fun main(args: Array&lt;String&gt;) {
    var array_1: Array&lt;Int&gt; = arrayOf(1, 2, 3, 4, 5)

    array_1.forEach { print(it) }
}</code></pre>
<blockquote>
</blockquote>
<p>var 배열명 : Array&lt;자료형?&gt; = arrayOfNulls&lt;자료형&gt;(크기)
→ 크기가 정해진 배열 생성 (데이터는 추후에 입력 가능)
배열명[인덱스] = 데이터 의 방법으로 입력</p>
<pre><code class="language-kotlin">fun main(args: Array&lt;String&gt;) {
    var array_1: Array&lt;Int?&gt; = arrayOfNulls&lt;Int&gt;(5)
    array_1[0] = 1
    array_1[1] = 2
    array_1[2] = 3
    array_1[3] = 4
    array_1[4] = 5

    array_1.forEach { print(it) }
}</code></pre>
<h2 id="int형-정수를-0-부터-채우는-배열">Int형 정수를 0 부터 채우는 배열</h2>
<blockquote>
</blockquote>
<p>var 배열명 : Array&lt;자료형&gt; = Array&lt;자료형&gt;(크기) {임시변수 -&gt; 임시변수}</p>
<pre><code class="language-kotlin">fun main(args: Array&lt;String&gt;) {
    var array_1: Array&lt;Int&gt; = Array&lt;Int&gt;(5) { i -&gt; i }

    array_1.forEach { print(it) }
}</code></pre>
<h2 id="그-외의-자료형">그 외의 자료형</h2>
<blockquote>
</blockquote>
<p>var 배열명 : Array&lt;자료형&gt; = Array&lt;자료형&gt;(크기) {임시변수 -&gt; 임시변수.to자료형()}</p>
<pre><code class="language-kotlin">fun main(args: Array&lt;String&gt;) {
    var array_1: Array&lt;String&gt; = Array&lt;String&gt;(5) { i -&gt; i.toString() }

    array_1.forEach { print(it) }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[변수]]></title>
            <link>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EB%B3%80%EC%88%98</link>
            <guid>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EB%B3%80%EC%88%98</guid>
            <pubDate>Sun, 10 Jul 2022 10:51:49 GMT</pubDate>
            <description><![CDATA[<h2 id="선언">선언</h2>
<blockquote>
</blockquote>
<p>일반적으로 var 을 사용하여 선언
val 을 이용하여 초기화한 경우 변경 불가능 (Java 의 final)</p>
<blockquote>
</blockquote>
<p><strong>선언 방법</strong>
var 변수명 : 자료형 = 초기값 (null 사용 불가)
var 변수명 : 자료형? = 초기값 (null 사용 가능)</p>
<h2 id="자료형">자료형</h2>
<blockquote>
<h3 id="정수형">정수형</h3>
<p>0b : 2진수
0x : 16진수</p>
<blockquote>
</blockquote>
<p>( 8 bit) <strong>Byte</strong>
(16 bit) <strong>Short</strong>
(32 bit) <strong>Int</strong> - 기본형
(64 bit) <strong>Long</strong> - 데이터 끝에 &#39;L&#39; 붙이기</p>
</blockquote>
<blockquote>
<h3 id="실수형">실수형</h3>
<p>지수 표기법 가능</p>
<blockquote>
</blockquote>
<p>(32 bit) <strong>Float</strong> - 데이터 끝에 &#39;f&#39; 붙이기
(64 bit) <strong>Double</strong> - 기본형</p>
</blockquote>
<blockquote>
<h3 id="문자형">문자형</h3>
<blockquote>
</blockquote>
<p>(2 Byte) - <strong>Char</strong> - UTF-16 BE</p>
</blockquote>
<blockquote>
<h3 id="논리형">논리형</h3>
<blockquote>
</blockquote>
<p>(1 bit) - <strong>Boolean</strong> - true / false</p>
</blockquote>
<blockquote>
<h3 id="문자열">문자열</h3>
<blockquote>
</blockquote>
<p><strong>String</strong>
&quot;...&quot; - 기본
&quot;&quot;&quot;...&quot;&quot;&quot; - 작성한 모양대로 출력</p>
</blockquote>
<blockquote>
<h3 id="반환-값-없음">반환 값 없음</h3>
<blockquote>
</blockquote>
<p><strong>Unit</strong></p>
</blockquote>
<h2 id="형변환">형변환</h2>
<blockquote>
</blockquote>
<p>암시적 형변환 불가능
명시적 형변환으로 사용
-&gt; <strong>변수명.to자료형()</strong></p>
<h2 id="타입추론">타입추론</h2>
<blockquote>
<h3 id="정수">정수</h3>
<p>10, 2, 16 진수는 Int 가 기본
정수에 &#39;L&#39; 을 붙이면 Long 으로 인식</p>
</blockquote>
<blockquote>
<h3 id="실수">실수</h3>
<p>Double 이 기본
실수에 &#39;f&#39; 를 붙이면 Float 로 인식</p>
</blockquote>
<blockquote>
<h3 id="논리형-1">논리형</h3>
<p>Boolean 이 기본</p>
</blockquote>
<blockquote>
<h3 id="문자">문자</h3>
<p>Char 가 기본</p>
</blockquote>
<h2 id="증감-연산자">증감 연산자</h2>
<blockquote>
<h3 id="전위">전위</h3>
<p>(++변수 / --변수)
증감이 적용된 상태로 문장 수행</p>
</blockquote>
<blockquote>
<h3 id="후위">후위</h3>
<p>(변수++ / 변수--)
문장이 끝한 후 증감 적용</p>
</blockquote>
<h2 id="논리-연산자">논리 연산자</h2>
<p>true / false 를 비교하여 true / false 값 도출</p>
<blockquote>
</blockquote>
<p><strong>AND</strong> : &amp;&amp;
<strong>OR</strong> : ||
<strong>NOT</strong> : ! </p>
<h2 id="고급">고급</h2>
<p><em>val 은 할당된 객체를 바꿀 수 없을 뿐, 객체 내부 속성을 변경 가능</em></p>
<blockquote>
<h3 id="상수">상수</h3>
<blockquote>
</blockquote>
<p>컴파일 시점에 결정되어 절대 변경 불가능한 값
const val 으로 선언</p>
<blockquote>
</blockquote>
<p>상수로 선언될 수 있는 값은 String 을 포함한 기본 자료형만 가능하며
런타임에 생성될 수 있는 일반적인 다른 클래스의 객체들은 담을 수 없음</p>
<blockquote>
</blockquote>
<p>클래스의 속성이나 지역 변수 등으로 사용 불가능</p>
<blockquote>
</blockquote>
<p>반드시 companion object 안에 선언하여
객체의 생성과 관계없이 클래스와 관련된 고정적인 값으로만 사용해야함</p>
<blockquote>
</blockquote>
<p>이름은 의례적으로 대문자와 언더바를 사용한 표기법</p>
<blockquote>
</blockquote>
<p><strong>☞
변수의 경우 런타임시 객체를 생성하는데 시간이 더 소요되어 성능의 하락이 있기 때문에 
늘 고정적으로 사용할 값은 상수를 통해 객체 생성 없이 메모리에 값을 고정하여 사용하여 
성능을 향상시킬 수 있는 장점이 있음</strong></p>
</blockquote>
<blockquote>
<h3 id="늦은-초기화--lateinit-">늦은 초기화 ( lateinit )</h3>
<blockquote>
</blockquote>
<p>변수 선언 시, 객체를 바로 할당하지 않으면 컴파일이 되지 않음
변수에 객체를 할당하는 것을 선언과 동시에 할 수 없는 경우도 있음</p>
<blockquote>
</blockquote>
<p>이런 경우, lateinit var 으로 변수를 선언하고
초기값의 할당을 나중에 진행할 수 있도록 하는 키워드</p>
<blockquote>
</blockquote>
<p>※ 초기값 할당 전까지 변수 사용 불가능 ( 에러 발생 )
※ 기본 자료형에는 사용 불가능 ( String 에는 가능 )</p>
<blockquote>
</blockquote>
<p>※ ::변수.isInitialized → lateinit 변수에 초기값이 할당 되었는지 확인 가능</p>
</blockquote>
<blockquote>
<h3 id="지연-대리자-속성--lazy-delegate-properties-">지연 대리자 속성 ( lazy delegate properties )</h3>
<blockquote>
</blockquote>
<p>변수를 사용하는 시점까지 초기화를 자동으로 늦춰주는 기능
val 변수 : 자료형 by lazy { 초기값 }</p>
<blockquote>
</blockquote>
<p>코드에서 선언 시 즉시 객체를 생성 및 할당하여 변수를 초기화하는 형태를 갖고 있지만
실제 실행 시에는 변수를 사용하는 시점에 초기화하여 코드의 실행시간 최적화 가능</p>
<blockquote>
</blockquote>
<p>람다 함수로 초기화가 진행되므로 여러 개의 구문이 들어갈 수 있으며
마지막 구문이 변수에 할당됨</p>
</blockquote>
<h2 id="풀코드">풀코드</h2>
<pre><code class="language-kotlin">fun main() {
    _constant()
    println()
    println(&quot;=========================&quot;)
    println()
    _lateinit()
    println()
    println(&quot;=========================&quot;)
    println()
    _lazy()
}

fun _constant() {
    val foodCourt = FoodCourt()

    foodCourt.searchPrice(FoodCourt.FOOD_CREAM_PASTA)
    foodCourt.searchPrice(FoodCourt.FOOD_STEAK)
    foodCourt.searchPrice(FoodCourt.FOOD_PIZZA)
}

class FoodCourt {
    fun searchPrice(foodName: String) {
        val price = when (foodName) {
            FOOD_CREAM_PASTA -&gt; 13000
            FOOD_STEAK -&gt; 13000
            FOOD_PIZZA -&gt; 13000
            else -&gt; 0
        }
        println(&quot;$foodName : $price&quot;)
    }

    companion object {
        const val FOOD_CREAM_PASTA = &quot;크림파스타&quot;
        const val FOOD_STEAK = &quot;스테이크&quot;
        const val FOOD_PIZZA = &quot;피자&quot;
    }
}

fun _lateinit() {
    val a = LateInitSample()
    println(a.getLateIntitText())

    a.text = &quot;새로운 값&quot;
    println(a.getLateIntitText())
}

class LateInitSample {
    lateinit var text: String

    fun getLateIntitText(): String {
        if (::text.isInitialized) {
            return text
        } else {
            return &quot;기본값&quot;
        }
    }
}

fun _lazy() {
    val number: Int by lazy {
        println(&quot;초기화&quot;)
        7
    }

    println(&quot;코드 시작&quot;)
    println(number)
    println(number)
}

//크림파스타 : 13000
//스테이크 : 13000
//피자 : 13000
//
//=========================
//
//기본값
//새로운 값
//
//=========================
//
//코드 시작
//초기화
//7
//7</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[주석]]></title>
            <link>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%A3%BC%EC%84%9D</link>
            <guid>https://velog.io/@lee-hees/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%A3%BC%EC%84%9D</guid>
            <pubDate>Sun, 10 Jul 2022 10:45:37 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-kotlin">// 주석

/*
 * 주석
 * 주석
 * 주석
 */</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[URL]]></title>
            <link>https://velog.io/@lee-hees/Conference-URL</link>
            <guid>https://velog.io/@lee-hees/Conference-URL</guid>
            <pubDate>Wed, 22 Jun 2022 20:24:35 GMT</pubDate>
            <description><![CDATA[<h1 id="2022">2022</h1>
<h2 id="토스-slash-22"><a href="https://toss.im/slash-22">토스: SLASH 22</a></h2>
<h2 id="라인"><a href="">라인: </a></h2>
<h2 id="카카오"><a href="">카카오: </a></h2>
<h2 id="네이버"><a href="">네이버: </a></h2>
<h2 id="우아한-형제들"><a href="">우아한 형제들: </a></h2>
<h2 id="넥슨"><a href="">넥슨: </a></h2>
<h2 id="구글"><a href="">구글: </a></h2>
<h2 id=""><a href=""></a></h2>
<h2 id="-1"><a href=""></a></h2>
<h2 id="-2"><a href=""></a></h2>
<h1 id="2023">2023</h1>
<h2 id="-3"><a href=""></a></h2>
<h2 id="-4"><a href=""></a></h2>
<h2 id="-5"><a href=""></a></h2>
<h2 id="-6"><a href=""></a></h2>
<h2 id="-7"><a href=""></a></h2>
<h2 id="-8"><a href=""></a></h2>
<h2 id="-9"><a href=""></a></h2>
<h2 id="-10"><a href=""></a></h2>
<h2 id="-11"><a href=""></a></h2>
<h2 id="-12"><a href=""></a></h2>
<h1 id="2024">2024</h1>
<h2 id="-13"><a href=""></a></h2>
<h2 id="-14"><a href=""></a></h2>
<h2 id="-15"><a href=""></a></h2>
<h2 id="-16"><a href=""></a></h2>
<h2 id="-17"><a href=""></a></h2>
<h2 id="-18"><a href=""></a></h2>
<h2 id="-19"><a href=""></a></h2>
<h2 id="-20"><a href=""></a></h2>
<h2 id="-21"><a href=""></a></h2>
<h2 id="-22"><a href=""></a></h2>
<h1 id="2025">2025</h1>
<h2 id="-23"><a href=""></a></h2>
<h2 id="-24"><a href=""></a></h2>
<h2 id="-25"><a href=""></a></h2>
<h2 id="-26"><a href=""></a></h2>
<h2 id="-27"><a href=""></a></h2>
<h2 id="-28"><a href=""></a></h2>
<h2 id="-29"><a href=""></a></h2>
<h2 id="-30"><a href=""></a></h2>
<h2 id="-31"><a href=""></a></h2>
<h2 id="-32"><a href=""></a></h2>
<h1 id="2026">2026</h1>
<h2 id="-33"><a href=""></a></h2>
<h2 id="-34"><a href=""></a></h2>
<h2 id="-35"><a href=""></a></h2>
<h2 id="-36"><a href=""></a></h2>
<h2 id="-37"><a href=""></a></h2>
<h2 id="-38"><a href=""></a></h2>
<h2 id="-39"><a href=""></a></h2>
<h2 id="-40"><a href=""></a></h2>
<h2 id="-41"><a href=""></a></h2>
<h2 id="-42"><a href=""></a></h2>
<h1 id="2027">2027</h1>
<h2 id="-43"><a href=""></a></h2>
<h2 id="-44"><a href=""></a></h2>
<h2 id="-45"><a href=""></a></h2>
<h2 id="-46"><a href=""></a></h2>
<h2 id="-47"><a href=""></a></h2>
<h2 id="-48"><a href=""></a></h2>
<h2 id="-49"><a href=""></a></h2>
<h2 id="-50"><a href=""></a></h2>
<h2 id="-51"><a href=""></a></h2>
<h2 id="-52"><a href=""></a></h2>
<h1 id="2028">2028</h1>
<h2 id="-53"><a href=""></a></h2>
<h2 id="-54"><a href=""></a></h2>
<h2 id="-55"><a href=""></a></h2>
<h2 id="-56"><a href=""></a></h2>
<h2 id="-57"><a href=""></a></h2>
<h2 id="-58"><a href=""></a></h2>
<h2 id="-59"><a href=""></a></h2>
<h2 id="-60"><a href=""></a></h2>
<h2 id="-61"><a href=""></a></h2>
<h2 id="-62"><a href=""></a></h2>
<h1 id="2029">2029</h1>
<h2 id="-63"><a href=""></a></h2>
<h2 id="-64"><a href=""></a></h2>
<h2 id="-65"><a href=""></a></h2>
<h2 id="-66"><a href=""></a></h2>
<h2 id="-67"><a href=""></a></h2>
<h2 id="-68"><a href=""></a></h2>
<h2 id="-69"><a href=""></a></h2>
<h2 id="-70"><a href=""></a></h2>
<h2 id="-71"><a href=""></a></h2>
<h2 id="-72"><a href=""></a></h2>
<h1 id="2030">2030</h1>
<h2 id="-73"><a href=""></a></h2>
<h2 id="-74"><a href=""></a></h2>
<h2 id="-75"><a href=""></a></h2>
<h2 id="-76"><a href=""></a></h2>
<h2 id="-77"><a href=""></a></h2>
<h2 id="-78"><a href=""></a></h2>
<h2 id="-79"><a href=""></a></h2>
<h2 id="-80"><a href=""></a></h2>
<h2 id="-81"><a href=""></a></h2>
<h2 id="-82"><a href=""></a></h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[아이디어]]></title>
            <link>https://velog.io/@lee-hees/toyProject20221%EC%95%84%EC%9D%B4%EB%94%94%EC%96%B4</link>
            <guid>https://velog.io/@lee-hees/toyProject20221%EC%95%84%EC%9D%B4%EB%94%94%EC%96%B4</guid>
            <pubDate>Wed, 22 Jun 2022 20:06:18 GMT</pubDate>
            <description><![CDATA[<h1 id="1-영화-박스오피스">1. 영화 박스오피스</h1>
<blockquote>
</blockquote>
<p><strong>OpenAPI (JSON)</strong>
<a href="https://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=f5eef3421c602c6cb7ea224104795888&amp;targetDt=20220614">https://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=f5eef3421c602c6cb7ea224104795888&amp;targetDt=20220614</a></p>
<blockquote>
</blockquote>
<ul>
<li>상위 10개 항목 -&gt; 1컬럼 리스트로 표현</li>
<li>전날대비 순위 등락 표현 (+0 / - / -0)</li>
</ul>
<h1 id="2-유류-가격-확인">2. 유류 가격 확인</h1>
<blockquote>
</blockquote>
<p><strong>OpenAPI (XML)</strong>
<a href="http://www.opinet.co.kr/api/avgAllPrice.do?out=F220425120&amp;code=F220425120">http://www.opinet.co.kr/api/avgAllPrice.do?out=F220425120&amp;code=F220425120</a></p>
<blockquote>
</blockquote>
<ul>
<li>고급휘발류, 자동차용경유, 휘발유, 실내등유, 자동차용부탄</li>
<li>전날대비 가격 등락 표현 (+0.00 / - / -0.00)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[기본문법 1]]></title>
            <link>https://velog.io/@lee-hees/Swift-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@lee-hees/Swift-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Wed, 22 Jun 2022 19:03:55 GMT</pubDate>
            <description><![CDATA[<h1 id="변수">변수</h1>
<blockquote>
</blockquote>
<p>var 키워드 사용</p>
<pre><code class="language-swift">var num = 5            // 5
num = 1                // 1 // 값 수정 가능</code></pre>
<h1 id="상수">상수</h1>
<blockquote>
</blockquote>
<p>let 키워드 사용</p>
<pre><code class="language-swift">let name = &quot;Jason&quot;    // Jason
name = &quot;Jay&quot;          // Jay   // 값 수정 불가능</code></pre>
<h1 id="string">String</h1>
<blockquote>
</blockquote>
<p>&quot;&quot; 으로 선언</p>
<pre><code class="language-swift">let quote = &quot;I&#39;m mother father genius, Man&quot; // I&#39;m mother father genius, Man</code></pre>
<h1 id="integer">Integer</h1>
<blockquote>
</blockquote>
<p>정수형 숫자 표현</p>
<pre><code class="language-swift">let num = 5                  // 5
let otherNum = num + 2       // 7
let halfOfNum = otherNum / 2 // 3</code></pre>
<blockquote>
</blockquote>
<p>내장함수</p>
<pre><code class="language-swift">let num = 360                                 // 360

// 3의 배수인지 확인하는 메소드
print(num.isMultiple(of: 3))                  // true

// 0~300 사이중 랜덤으로 수를 뽑아내는 메소드
let random = Int.random(in: 0...300)          // ..랜덤</code></pre>
<h1 id="double">Double</h1>
<blockquote>
</blockquote>
<p>소수점을 포함한 숫자</p>
<pre><code class="language-swift">let score = 3.6 // 3.6</code></pre>
<h1 id="boolean">Boolean</h1>
<blockquote>
</blockquote>
<p>참.거짓 표현</p>
<pre><code class="language-swift">let isMan = true    // true
let isHuman = false // false

var isSingle = true // true
isSingle.toggle()   // false
isSingle            // false</code></pre>
<h1 id="string-interpolation">String Interpolation</h1>
<blockquote>
</blockquote>
<p>데이터를 문자열로 표현</p>
<pre><code class="language-swift">let difficulty = &quot;쉽다&quot; // 쉽다
let maximumAge = 80     // 80

let message = &quot;\(maximumAge) 할머니도 배우는 iOS 개발은 \(difficulty)&quot; 
// &quot;80 할머니도 배우는 iOS 개발은 쉽다&quot;</code></pre>
<h1 id="배열-딕셔너리">배열, 딕셔너리</h1>
<blockquote>
</blockquote>
<p>데이터를 묵어 표현
[ ] 으로 선언</p>
<pre><code class="language-swift">// Array
let ages = [3, 20, 60]                  // [3, 20, 60]
let colors = [&quot;green&quot;, &quot;red&quot;, &quot;yellow&quot;] // [&quot;green&quot;, &quot;red&quot;, &quot;yellow&quot;]

let color = colors[0]                   // &quot;green&quot;

// Dictionary (Key: Value)
let languageCode = [
    &quot;한국&quot; : &quot;ko&quot;,
    &quot;미국&quot; : &quot;en&quot;,
    &quot;일본&quot; : &quot;ja&quot;,
]                                       //  [&quot;한국&quot; : &quot;ko&quot;, &quot;미국&quot; : &quot;en&quot;, &quot;일본&quot; : &quot;ja&quot; ]

let code = languageCode[&quot;한국&quot;]          // &quot;ko&quot;</code></pre>
<blockquote>
</blockquote>
<p>비어있는 배열, 딕셔너리 초기화</p>
<pre><code class="language-swift">// Array
var emptyArr: [Int] = []          // []

// Dictionary (Key: Value)
var emptyDic: [String: Any] = [:] // [:]</code></pre>
<h1 id="enum">enum</h1>
<blockquote>
</blockquote>
<p>서로 관계있는 값을 모아 표현한 것
<strong>특정 타입을 표시하기 좋음</strong></p>
<pre><code class="language-swift">// 요일을 한번 enum으로 만들어 보겠습니다. 
enum WeekDay {
    case mon
    case tue
    case wed
    case thu
    case fri
}

var today: WeekDay = .mon


// 미디어타입을 한번 enum으로 만들어 보겠습니다. 
enum MediaType {
    case audio
    case video
}

var mediaType: MediaType = .audio</code></pre>
]]></description>
        </item>
    </channel>
</rss>