<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>늘 겸손하게</title>
    <link>https://besforyou.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 30 Jun 2026 07:27:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>besforyou999</managingEditor>
    <item>
      <title>CS - 디자인 패턴</title>
      <link>https://besforyou.tistory.com/440</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
&lt;h2 style=&quot;color: black; margin-bottom: 15px;&quot; data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ul id=&quot;toc&quot; style=&quot;list-style-type: disc; color: black;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#id1&quot;&gt; 디자인 패턴 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id2&quot;&gt; 싱글톤 패턴 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id3&quot;&gt; 옵저버 패턴 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id4&quot;&gt; 팩토리 패턴 &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id1&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;디자인 패턴&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;디자인 패턴&lt;/b&gt;은 프로그램을 설계할 때 발생했던 문제점을 효율적으로 해결 할 수 있는 코딩 아이디어, 방법론을 말합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대표적인 디자인 패턴으로는 '싱글톤 패턴', '옵저버 패턴', '팩토리 패턴' 등이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id2&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;싱글톤 패턴&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하나의 클래스가 하나의 인스턴스만을 가지고 계속 재활용해 메모리를 아끼고, 데이터 공유를 수월하게 하는 디자인 패턴.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;보통 데이터베이스 연결 모듈에 많이 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;메모리 사용량을 줄일 수 있는 장점이 존재하나 모듈간의 결합이 강해져 유지보수성이 떨어지고, TDD를 어렵게 하는 단점이 존재합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Java&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1699683093764&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Singleton {
    private static class singleInstanceHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return singleInstanceHolder.INSTANCE;
    }
}

public class Hello {
    public static void main(String [] args) {
        Singleton a = Singleton.getInstance();
        Singleton b = Singleton.getInstance();
        
        if (a == b) {
            System.out.println(true); // true 출력됨.
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JavaScript&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1699683425499&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Singleton {
    constructor() {
        if (!Singleton.instance) {
            Singleton.instance = this
        }
        return Singleton.instance
    }
    
    getInstance() {
        return this.instance
    }
}

const a = new Singleton();
const b = new Singleton();
console.log(a === b); // true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;싱글톤 패턴의 장점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;같은 인스턴스를 재활용해 메모리 사용을 아낀다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;메모리 공유하기 유용하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;싱글톤 패턴의 단점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;모듈간 결합이 강해져 유지보수성이 떨어진다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;TDD를 어렵게 한다. TDD가 잘 이루어지려면 각각의 테스트는 독립적이어야 하나 싱글톤 패턴은 데이터를 공유하기 때문에 독립적인 테스트를 어렵게 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;싱글톤 패턴을 활용하기 좋은 경우&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;전역 상태 관리 : 싱글톤은 전역 객체로서 중앙에서 상태를 관리하는데 도움을 줌&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;리소스 공유&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;Lazy Loading : 인스턴스를 처음 사용할 때까지 생성하지 않는 '지연 로딩(Lazy Loading)'을 구현할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id3&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;옵저버 패턴&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주체가 어떤 객체의 상태 변화를 관찰하다가 상태 변화가 일어나면 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주체는 객체의 상태 변화를 관찰하는 관찰자이며, 상태 변화가 일어나면 옵저버들에게 변화를 알려줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;옵저버 패턴을 활용한 서비스로 '트위터'가 있습니다. 트윗을 날리면 옵저버(팔로워)들에게 트윗이 올라왔다는 신호가 감.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;옵저버 패턴은 주로 이벤트 기반 시스템에 사용하며 MVC(Model-View-Controller) 패턴에도 사용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;Java&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1699683978249&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.ArrayList;
import java.util.List;

interface Subject {
    public void register(Observer obj);
    public void unregister(Observer obj);
    public void notifyObservers();
    public Object getUpdate(Observer obj);
}

interface Observer {
    public void update(); 
}

class Topic implements Subject {
    private List&amp;lt;Observer&amp;gt; observers;
    private String message; 

    public Topic() {
        this.observers = new ArrayList&amp;lt;&amp;gt;();
        this.message = &quot;&quot;;
    }

    @Override
    public void register(Observer obj) {
        if (!observers.contains(obj)) observers.add(obj); 
    }

    @Override
    public void unregister(Observer obj) {
        observers.remove(obj); 
    }

    @Override
    public void notifyObservers() {   
        this.observers.forEach(Observer::update); 
    }

    @Override
    public Object getUpdate(Observer obj) {
        return this.message;
    } 
    
    public void postMessage(String msg) {
        System.out.println(&quot;Message sended to Topic: &quot; + msg);
        this.message = msg; 
        notifyObservers();
    }
}

class TopicSubscriber implements Observer {
    private String name;
    private Subject topic;

    public TopicSubscriber(String name, Subject topic) {
        this.name = name;
        this.topic = topic;
    }

    @Override
    public void update() {
        String msg = (String) topic.getUpdate(this); 
        System.out.println(name + &quot;:: got message &amp;gt;&amp;gt; &quot; + msg); 
    } 
}

public class HelloWorld { 
    public static void main(String[] args) {
        Topic topic = new Topic(); 
        Observer a = new TopicSubscriber(&quot;a&quot;, topic);
        Observer b = new TopicSubscriber(&quot;b&quot;, topic);
        Observer c = new TopicSubscriber(&quot;c&quot;, topic);
        topic.register(a);
        topic.register(b);
        topic.register(c); 
   
        topic.postMessage(&quot;amumu is op champion!!&quot;); 
    }
}
/*
Message sended to Topic: amumu is op champion!!
a:: got message &amp;gt;&amp;gt; amumu is op champion!!
b:: got message &amp;gt;&amp;gt; amumu is op champion!!
c:: got message &amp;gt;&amp;gt; amumu is op champion!!
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;옵저버 패턴의 장점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;느슨한 결합 : 주체와 옵저버 간 결합이 느슨하게 되어 있어 주체는 옵저버의 존재를 알지만, 구체적인 옵저버에 대해서는 알지 못합니다. 이는 코드의 유연성을 높여주고 유지보수를 쉽게 만듭니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;이벤트 기반 프로그래밍 : 옵저버 패턴은 이벤트 기반 프로그래밍에 적합합니다. 이벤트가 발생할 때마다 필요한 동작을 수행할 수 있어 비동기적인 이벤트 처리를 용이하게 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;모듈화와 재사용성 : 각 옵저버는 독립적으로 작성되어 모듈화가 잘 이루어집니다. 이는 새로운 옵저버를 추가하거나 기존의 옵저버를 변경해 재사용성을 높여줍니다.&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;옵저버 패턴의 단점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;오버헤드와 성능 문제 : 옵저버 수가 많을 경우, 옵저버에게 알림을 보내는데 오버헤드가 커 성능에 영향을 미칠 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;복잡성 : 다수의 주체와 옵저버, 복잡한 이벤트 처리 로직이 있는 경우 코드를 이해하고 유지보수하기 어려울 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;옵저버 패턴을 활용하기 좋은 경우&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;MVC 아키텍처 : 옵저버 패턴은 MVC 아키텍처에서 모델과 뷰 간의 통신에 사용됩니다. 모델의 상태가 변경될 때 뷰에게 알리고, 뷰는 갱신된 상태를 반영해 사용자에게 보여줍니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;분산 시스템에서 이벤트 처리 : 분산 시스템에서 여러 컴포넌트 간에 이벤트를 효과적으로 처리하는 데 사용할 수 있습니다. 여러 서비스나 모듈 간의 통신을 위해 옵저버 패턴을 활용 가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;id4&quot; style=&quot;font-weight: bold; border-bottom: 1px solid; color: black; margin: 10px 0px 5px; border-left: 5px solid; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;팩토리 패턴&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴이자 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;상위 클래스는 인스턴스 생성 방식에 대해 알 필요가 없기 때문에 더 많은 유연성을 갖게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699685165906&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Latte {
    constructor() {
        this.name = &quot;latte&quot;
    }
}

class Espresso {
    constructor() {
        this.name = &quot;Espresso&quot;
    }
}

class LatteFactory {
    static createCoffee() {
        return new Latte()
    }
}

class EspressoFactory {
    static createCoffee() {
        return new Espresso()
    }
}

const factoryList = { LatteFactory, EspressoFactory }

class CoffeeFactory {
    static createCoffee(type) {
        const factory = factoryList[type]
        return factory.createCoffee()
    }
}

const main = () =&amp;gt; {
    const coffee = CoffeeFactory.createCoffee(&quot;LatteFactory&quot;)
    
    console.log(coffee.name) // Latte
}

main()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;팩토리 패턴의 장점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;유연성과 확장성 : 새로운 객체가 추가되거나 기존 객체의 변경이 있을 때, 해당 객체를 생성하는 팩토리 클래스만 수정하면 됩니다. 이는 코드 변경을 최소화하고 시스템의 유연성과 확장성을 높입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;의존성 주입 : 팩토리 패턴은 의존성 주입을 통해 객체 생성에 필요한 의존성을 외부에서 주입할 수 있도록 합니다. 이는 테스트 용이성과 코드의 재사용성을 증가시킵니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;팩토리 패턴의 단점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;코드의 증가 : 클래스 당 하나의 팩토리 클래스를 만들어야 하므로 클래스 수에 비례해 코드의 양이 증가할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;클래스와 팩토리 간의 결합도 : 팩토리 클래스와 생성되는 객체 간의 결합도 증가. 팩토리의 변경이 생성되는 객체에 영향을 줄 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;팩토리 패턴을 활용하기 좋은 경우&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;객체 생성이 복잡하거나 변경이 빈번한 경우 : 객체 생성 로직을 팩토리 클래스에 캡슐화해 간편한 유지보수와 변경을 가능하게 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 16px;&quot;&gt;객체 생성 로직을 중앙화하고 표준화하고자 할때 : 여러 곳에서 동일한 타입의 객체를 생성하는데 객체 생성 로직을 중앙에서 표준화하고자 할 때 팩토리 패턴을 사용해 일관성 있는 객체 생성을 유지하는데 도움을 줍니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Computer Science</category>
      <author>besforyou999</author>
      <guid isPermaLink="true">https://besforyou.tistory.com/440</guid>
      <comments>https://besforyou.tistory.com/440#entry440comment</comments>
      <pubDate>Sat, 11 Nov 2023 15:47:20 +0900</pubDate>
    </item>
    <item>
      <title>TypeScript - 타입 가드</title>
      <link>https://besforyou.tistory.com/439</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;typescript.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckVLAF/btszDTeIHgT/b6QulI6DrerWRI7Zc7xsT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckVLAF/btszDTeIHgT/b6QulI6DrerWRI7Zc7xsT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckVLAF/btszDTeIHgT/b6QulI6DrerWRI7Zc7xsT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckVLAF%2FbtszDTeIHgT%2Fb6QulI6DrerWRI7Zc7xsT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;512&quot; data-filename=&quot;typescript.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;book-toc&quot;&gt;
&lt;h2 style=&quot;color: black; margin-bottom: 15px;&quot; data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ul id=&quot;toc&quot; style=&quot;list-style-type: disc; color: black;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#id1&quot;&gt; 단언의 문제점 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id2&quot;&gt; 타입 가드&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id1&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;단언의 문제점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단언으로 모든 오류를 해결할 순 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698906268923&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function printText(el: Element) {
  console.log(el.textContent)
}

const h1 = document.querySelector('h1')
printText(h1);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;타입스크립트는 마지막 줄에서 오류를 출력한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-02 오후 3.25.52.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GzfNx/btszGTSv8S5/MmwJ47fkT7ZJ8O73PVFbBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GzfNx/btszGTSv8S5/MmwJ47fkT7ZJ8O73PVFbBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GzfNx/btszGTSv8S5/MmwJ47fkT7ZJ8O73PVFbBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGzfNx%2FbtszGTSv8S5%2FMmwJ47fkT7ZJ8O73PVFbBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1386&quot; height=&quot;220&quot; data-filename=&quot;스크린샷 2023-11-02 오후 3.25.52.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여기서 단언을 통해 타입스크립트 에러 출력은 막을 수 있지만 실제 코드를 실행해보면 오류가 발생합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698906419955&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function printText(el: Element) {
  console.log(el.textContent)
}

const h1 = document.querySelector('h1') as HTMLHeadingElement
printText(h1);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-02 오후 3.28.27.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DcxYR/btszDRBb8xr/lOSuqzOIojkWbwEWvKZRc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DcxYR/btszDRBb8xr/lOSuqzOIojkWbwEWvKZRc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DcxYR/btszDRBb8xr/lOSuqzOIojkWbwEWvKZRc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDcxYR%2FbtszDRBb8xr%2FlOSuqzOIojkWbwEWvKZRc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;214&quot; data-filename=&quot;스크린샷 2023-11-02 오후 3.28.27.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위와 같은 문제 해결은 타입 가드를 통해 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id2&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;타입 가드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;방법 1&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;간단히 if 조건을 추가해 문제를 해결할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698906624736&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function printText(el: Element) {
  console.log(el.textContent)
}

const h1 = document.querySelector('h1')
if (h1) {
  printText(h1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;방법 2&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;instanceof를 활용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698906688624&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function printText(el: Element) {
  console.log(el.textContent)
}

const h1 = document.querySelector('h1')
if (h1 instanceof HTMLHeadingElement) {
  printText(h1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;방법 3&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;typeof 를 사용합니다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698907068668&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 타입 가드 (Guards)
function concatToStr(a: (number | string), b: (number | string)) {
  let result = 'Result : '
  if (typeof a === 'number') {
    result += a.toString()
  } else {
    result += a.toUpperCase()
  }

  result += ' '

  if (typeof b === 'number') {
    result += b.toString()
  } else {
    result += b.toUpperCase()
  }

  console.log(result)
}

concatToStr(100, &quot;200&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/TypeScript</category>
      <author>besforyou999</author>
      <guid isPermaLink="true">https://besforyou.tistory.com/439</guid>
      <comments>https://besforyou.tistory.com/439#entry439comment</comments>
      <pubDate>Thu, 2 Nov 2023 15:38:55 +0900</pubDate>
    </item>
    <item>
      <title>TypeScript - 타입 및 할당 단언</title>
      <link>https://besforyou.tistory.com/438</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;typescript.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P7uG9/btszAXu36Kt/HkEEkKct8Kzays30DW5e5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P7uG9/btszAXu36Kt/HkEEkKct8Kzays30DW5e5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P7uG9/btszAXu36Kt/HkEEkKct8Kzays30DW5e5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP7uG9%2FbtszAXu36Kt%2FHkEEkKct8Kzays30DW5e5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;512&quot; data-filename=&quot;typescript.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: black; margin-bottom: 15px;&quot; data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ul id=&quot;toc&quot; style=&quot;list-style-type: disc; color: black;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;#id1&quot;&gt;문제명&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;#id2&quot;&gt;문제풀이&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;#id3&quot;&gt;코드&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id1&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;단언?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단언은 '주저하지 않고 딱 잘라 말한다'는 의미이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터 타입을 개발자가 딱 잘라서 정하는 것을 '단언'이라 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;변수에 할당 가능한 데이터 타입이 여러가지일 경우 타입스크립트는 어떤 타입의 데이터가 할당될지 알 수 없는 경우가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때 개발자는 단언을 통해 할당되는 데이터 타입을 결정한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698838003303&quot; class=&quot;dart&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;const el = document.querySelector('body')
el.textContent = 'Hello world?!'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;식별자 el에는 HTMLBodyElement 혹은 null 타입의 데이터가 할당될 수 있다. ('body' 요소가 없을 수 있으니)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;타입스크립트는 el에 할당될 데이터 타입이 어떤 타입인지 알 길이 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러한 경우 개발자가 el 에 할당될 데이터의 타입은 '단언'하여야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id2&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;단언 키워드 - as&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예시 1&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698838003304&quot; class=&quot;dart&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;const el = document.querySelector('body')
el.textContent = 'Hello world?!'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;식별자 el에는 HTMLBodyElement 혹은 null 타입의 데이터가 할당될 수 있다. ('body' 요소가 없을 수 있으니)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;타입스크립트는 el에 할당될 데이터 타입이 어떤 타입인지 알 길이 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러한 경우 개발자가 el 에 할당될 데이터의 타입은 '단언'하여야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698838003305&quot; class=&quot;dart&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;const el = document.querySelector('body') as HTMLBodyElement
el.textContent = 'Hello world?!'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;예시 2&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698838003305&quot; class=&quot;reasonml&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;function getNumber(x: number | null | undefined) {
  return Number(x.toFixed(2))
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;x에 null, undefined 타입 데이터 또한 할당되면 to.Fixed() 호출이 불가능하므로 타입스크립트는 오류를 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여기서 as를 통해 '단언'을 하여 오류를 해결한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698838091202&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function getNumber(x: number | null | undefined) {
  return Number((x as number).toFixed(2))
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;예시 3&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698839303317&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 3)
function getValue(x: string | number, isNumber: boolean) {
  if (isNumber) {
    return x.toFixed(2);
  }
  return x.toUpperCase();
}

getValue('hello world', false); // 'HELLO WORLD'
getValue(3.1415926535, true); // 3.14&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;타입스크립트는 x.toFixed(2) 와 x.toUpperCase() 부분에서 오류를 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;string에는 toFixed가 없고 number에는 toUpperCase 메서드가 없기 때문.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이를 아래와 같이 고친다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698839391743&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function getValue(x: string | number, isNumber: boolean) {
  if (isNumber) {
    return Number((x as number).toFixed(2))
  }
  return (x as string).toUpperCase();
}

getValue('hello world', false); // 'HELLO WORLD'
getValue(3.1415926535, true); // 3.14&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id3&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;Non-null 단언 연산자 '!'&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;할당되는 데이터 타입은 &lt;b&gt;절대 null이나 undefined가 아니다&lt;/b&gt; 라는 의미.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698839551460&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Non-null 단언 연산자 : !
// 할당되는 데이터 타입은 절대 null이 아니다 라는 의미
const el = document.querySelector('body')
el!.textContent = 'Hello world?!'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698839629924&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function getNumber(x: number | null | undefined) {
  return Number(x!.toFixed(2))
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 첫 번째 예시에서 'body' 태그가 아닌 '.title' 클래스의 요소를 찾는데 html에 .title 클래스의 요소가 없다면?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;타입스크립트 오류는 보이지 않아도 코드가 제대로 동작하지 않을 것.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위와 같은 문제 해결을 위해 if문을 사용하는 방법이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698839925125&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const el = document.querySelector('body')
if (el) {
  el.textContent = 'Hello world?!'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위와 같은 코드는 찾아낸 요소가 없으면 el에 null이 할당되고 3줄은 절대 실행되지 않을 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위와 같은 방식을 &lt;b&gt;타입 가드(Guards)&lt;/b&gt;라 부른다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id1&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;할당 단언&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698840221355&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let num: number
console.log(num)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;TypeScript는 위 처럼 코드를 작성하면 아래와 같은 에러를 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-01 오후 9.04.09.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lBSf3/btszCGF8lPJ/iCzdEDi4Z5dMG3HYywyKIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lBSf3/btszCGF8lPJ/iCzdEDi4Z5dMG3HYywyKIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lBSf3/btszCGF8lPJ/iCzdEDi4Z5dMG3HYywyKIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlBSf3%2FbtszCGF8lPJ%2FiCzdEDi4Z5dMG3HYywyKIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;519&quot; height=&quot;116&quot; data-filename=&quot;스크린샷 2023-11-01 오후 9.04.09.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;말 그대로 변수를 할당되기 전에 사용해서 엄격한 규칙을 지닌 타입스크립트는 오류를 출력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만약 개발자가 예시와 같은 코드를 의도적으로 작성하려면 할당 단언을 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698840353198&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let num!: number
console.log(num)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/TypeScript</category>
      <category>TypeScript</category>
      <author>besforyou999</author>
      <guid isPermaLink="true">https://besforyou.tistory.com/438</guid>
      <comments>https://besforyou.tistory.com/438#entry438comment</comments>
      <pubDate>Wed, 1 Nov 2023 21:07:09 +0900</pubDate>
    </item>
    <item>
      <title>TypeScript - 타입 추론 (Inference)</title>
      <link>https://besforyou.tistory.com/437</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;typescript.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4viBf/btszyIDRKPI/2eyjGcI0fbqNZNkJb2cHp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4viBf/btszyIDRKPI/2eyjGcI0fbqNZNkJb2cHp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4viBf/btszyIDRKPI/2eyjGcI0fbqNZNkJb2cHp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4viBf%2FbtszyIDRKPI%2F2eyjGcI0fbqNZNkJb2cHp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;512&quot; data-filename=&quot;typescript.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;book-toc&quot;&gt;
&lt;h2 style=&quot;color: black; margin-bottom: 15px;&quot; data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ul id=&quot;toc&quot; style=&quot;list-style-type: disc; color: black;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#id1&quot;&gt; 타입추론 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id2&quot;&gt; 판단근거 1 - 초기화 된 변수 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id3&quot;&gt; 판단근거 2 - 기본값이 설정된 매개변수 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id4&quot;&gt; 판단근거 3 - 반환 값이 있는 함수 &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id1&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;타입 추론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;타입 추론은 말 그대로 변수의 데이터 타입을 추측하는 것을 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터 타입의 추측 근거는 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 초기화된 변수&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 기본값이 설정된 매개변수&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 함수의 반환값&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id2&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;판단 근거 1 - 초기화된 변수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698731779678&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let num = 12 
let country = 'Korea'
let isTrue = true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id3&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;판단 근거 2 - 기본값이 설정된 매개변수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;매개변수에 기본값이 정해져 있다면 기본값의 데이터 타입으로 식별자 데이터 타입 추론&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698731942511&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function multi2(a = 2) {
  return a * a;
}

// 이렇게 쓰지 않아도 됨
function multi2(a: number = 2) {
    return a * a;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;타입스크립트는 a의 데이터 타입을 number로 추론한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;font-weight: bold; border-bottom: 1px solid; color: black; margin: 10px 0px 5px; border-left: 5px solid; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;판단 근거 3 - 반환 값이 있는 함수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;반환값의 데이터 타입을 추론할 수 있다면 함수 반환값의 데이터 타입 또한 추론 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698732101893&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function add(a: number, b: number) {
  return a + b
}

// 이렇게 안 써도 된다.
function add2(a: number, b: number): number {
  return a + b
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/TypeScript</category>
      <category>TypeScript</category>
      <author>besforyou999</author>
      <guid isPermaLink="true">https://besforyou.tistory.com/437</guid>
      <comments>https://besforyou.tistory.com/437#entry437comment</comments>
      <pubDate>Tue, 31 Oct 2023 15:03:14 +0900</pubDate>
    </item>
    <item>
      <title>TypeScript - 타입 종류</title>
      <link>https://besforyou.tistory.com/436</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;typescript.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cI2ZTd/btszqfCsJsH/RaQpW4H8NIeW2u2M5rlSBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cI2ZTd/btszqfCsJsH/RaQpW4H8NIeW2u2M5rlSBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cI2ZTd/btszqfCsJsH/RaQpW4H8NIeW2u2M5rlSBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcI2ZTd%2FbtszqfCsJsH%2FRaQpW4H8NIeW2u2M5rlSBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;512&quot; data-filename=&quot;typescript.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;h2 style=&quot;color: black; margin-bottom: 15px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: black; margin-bottom: 15px;&quot; data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ul id=&quot;toc&quot; style=&quot;list-style-type: disc; color: black;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#id1&quot;&gt; TypeScript의 타입들 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id2&quot;&gt; string &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id3&quot;&gt; number &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id4&quot;&gt; boolean &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id5&quot;&gt; Null / Undefined &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id6&quot;&gt; 배열 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id7&quot;&gt; 객체 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id8&quot;&gt; 함수 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id9&quot;&gt; Any &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id10&quot;&gt; Unknown &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id11&quot;&gt; Tuple &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id12&quot;&gt; Never &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id13&quot;&gt; Union &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id14&quot;&gt; Intersection &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id1&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;TypeScript의 타입들&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트에서 변수에 값이 할당될 때 : (콜론) 기호로 변수에 할당될 값을 고정시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698651035901&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let age: number = 30
let name: string = 'Mike'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id2&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;string&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698652799057&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// string 

let str: string   // 지금은 undefined가 할당되어도 나중에는 string 타입이 와야한다는 의미
let red: string = &quot;Red&quot;
let blue: string = &quot;Blue&quot;
let templateStr: string = `I have color ${red} and ${blue}`
let attachStr: string = red + &quot; and &quot; + blue&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id3&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;number&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698652813531&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// number

let num: number // 지금은 undefined가 할당되어도 나중에는 number가 온다.
let integer: number = 6   // 변수명만 integer일뿐 정수가 아닌 number도 할당 가능
let float: number = 3.14  // 변수명만 float일뿐 실수가 아닌 number도 할당 가능
let infinity: number = Infinity
let nan: number = NaN&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id4&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;boolean&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698652849248&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// boolean

let isBoolean: boolean
let isTrue: boolean = true
let isFalse: boolean = false&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id5&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;Null / Undefined&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698652866340&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Null / Undefined

let isNull: null
let isUndefined: undefined
console.log(isNull) // isNull이 할당되기 전에 사용되었다고 오류가 발생함
console.log(isUndefined)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id6&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;배열&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698652878623&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 배열

const fruits: string[] = ['Apple', 'Pear', 'Strawberry']
const numbers: number[] = [1, 2, 3, 4, 5, 6, 7]
const union: (string|number)[] = ['Apple', 1, 'Pear', 2, 3]
const array: [] = [1, 2, 3] // 오류 발생. 빈 배열만 가능. 데이터를 넣고 싶으면 반드시 데이터 타입을 선언해주자&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id7&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;객체&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698652901273&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 객체

const obj: object = {}
const arr: object = []
const func: object = function() {}

const userA: {
  name: string
  age: number
  isAmerican: boolean
} = {
  name: 'Mike',
  age: 20,
  isAmerican: true
}

const userB: {
  name: string
  age: number
  isAmerican: boolean
} = {
  name: 'Neo',
  age: 25,
  isAmerican: true
}

// 위 예시처럼 user 객체 속성의 데이터 타입은 동일하다.
// 이를 interface로 통일시킬 수 있다.
interface User { // 일반적으로 인터페이스는 다른 변수와 구분하기 위해 대문자로 시작한다.
  name: string
  age: number
  isAmerican: boolean
}

const userC: User = {
  name: 'Amy',
  age: 15,
  isAmerican: false
}

const userD: User = {
  name: 'Cate',
  age: 20,
  isAmerican: true
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id8&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;함수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698652929947&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 함수
// 함수의 매개변수 타입과 반환값의 타입을 정할 수 있다.
// add 함수는 number 타입의 값 두개를 x, y 매개변수로 전달받고 number 타입의 값을 반환하는 함수
const add: (x: number, y: number) =&amp;gt; number = function(x, y) {
  return x + y
}

// 다른 버전. 위 함수와 동일한 형식
const add2 = function (x: number, y: number): number {
  return x + y
}

const a: number = add(1, 2)

// '() =&amp;gt; void ' 부분이 타입스크립트
const hello: () =&amp;gt; void = function () {
  console.log(&quot;Hello world~&quot;)
}

// 다른 버전
const hello2 = function(): void {
  console.log(&quot;Hello world~&quot;)
}

const h: void = hello()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id9&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;Any&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;변수에 어떠한 데이터 타입의 값도 할당 가능하다는 뜻.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 변수에 어떠한 데이터 타입도 할당 가능하면 TypeScript를 사용하는 의미가 없어지므로 가능하면 사용하지 않는것이 좋다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698722943028&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Any
let hello: any = 'Hello world'
hello = 123
hello = false
hello = null
hello = {}
hello = []
hello = function() {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id10&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt; Unknown&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;변수에 어떤 데이터 타입을 적용할지 모르겠다라는 의미.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;any 타입의 변수에는 unknown 타입의 값을 할당 가능하나 다른 타입 (boolean, number, string 등등)의 변수에는 unknown 타입의 값을 할당할 수 없다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698723192392&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Unknown
// 아직은 어떤 데이터 타입이 할당될지 모르겠다는 의미
const u: unknown = 123

// 모두 오류 난다.
const boo: boolean = u
const num: number = u
const arr: string[] = u
const obj: {x: string, y: number} = u&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터 타입을 모르겠다면 Any타입 대신 Unknown을 사용할 것.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id11&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt; Tuple&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;배열 데이터에서 원소에 순서가 있는 경우 사용 가능&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698727356156&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Tuple
const tuple: [string, number, boolean] = ['a', 1, false]
const users: [number, string, boolean][]
  = [[1, 'Neo', true], [2, 'Evan', false], [3, 'Lewis', true]]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id12&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt; Void&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;함수가 반환하는 값이 없는 경우 반드시 void 타입을 정해주어야만 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698727586546&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// void
function hello(msg: string): void {
  console.log(`Hello ${msg}`)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id13&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt; Never&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;배열에 타입이 지정되지 않아 어떤 데이터도 넣을 수 없다는 의미&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698727784511&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const nev: [] = []
nev.push(3) // 오류 발생&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id14&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt; Union&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하나 이상의 타입을 할당할 수 있게 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698727853302&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Union
let union: string | number
union = 'Hello type!'
union = 123
union = false // 오류 발생&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id15&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt; Intersection&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;두 개 이상의 인터페이스를 합칠 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698727977212&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Intersection
interface User {
  name: string,
  age: number
}

interface Validation {
  isValid: boolean
}

const inter: User &amp;amp; Validation = {
  name: 'Mike',
  age: 25,
  isValid: false
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/TypeScript</category>
      <category>TypeScript</category>
      <author>besforyou999</author>
      <guid isPermaLink="true">https://besforyou.tistory.com/436</guid>
      <comments>https://besforyou.tistory.com/436#entry436comment</comments>
      <pubDate>Mon, 30 Oct 2023 17:04:11 +0900</pubDate>
    </item>
    <item>
      <title>MySQL - case, when</title>
      <link>https://besforyou.tistory.com/435</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mysql.jpeg&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t99o0/btszk5AhxwA/L0oD5dPTvfsSkwkXsr6bSk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t99o0/btszk5AhxwA/L0oD5dPTvfsSkwkXsr6bSk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t99o0/btszk5AhxwA/L0oD5dPTvfsSkwkXsr6bSk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft99o0%2Fbtszk5AhxwA%2FL0oD5dPTvfsSkwkXsr6bSk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1020&quot; height=&quot;426&quot; data-filename=&quot;mysql.jpeg&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;h2 style=&quot;color: black; margin-bottom: 15px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: black; margin-bottom: 15px;&quot; data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ul id=&quot;toc&quot; style=&quot;list-style-type: disc; color: black;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#id1&quot;&gt; case문 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id2&quot;&gt; syntax-구문 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id3&quot;&gt; 예시 &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id1&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;CASE 문&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MySQL 구문으로 프로그래밍 언어의 if, else 문과 똑같은 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id2&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;Syntax - 구문&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698635764180&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CASE
    WHEN 조건1 THEN 결과1
    WHEN 조건2 THEN 결과2
    ..
    ..
    WHEN 조건N THEN 결과N
    ELSE 결과
END;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다른 프로그래밍 언어와 같이 위에서 아래로 조건을 탐색하다가 맞는 조건의 결과를 반환하고 탐색이 중단된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만약 어떤 조건도 맞추지 못한다면 ELSE 문의 결과를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ELSE 문도 없다면 NULL을 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id3&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt; car&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;소나타&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;3,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;람보르기니&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;30,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 테이블이 있다고 가정할때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698637236745&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select car,
	case
		when price &amp;gt; 10000 then 'expensive'
		when price &amp;lt; 10000 then 'cheap'
	end as '가격'
from cars&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 sql을 실행하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 60px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;car&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;가격&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;소나타&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;cheap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;람보르기니&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;expensive&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 테이블이 출력될 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/MySQL</category>
      <author>besforyou999</author>
      <guid isPermaLink="true">https://besforyou.tistory.com/435</guid>
      <comments>https://besforyou.tistory.com/435#entry435comment</comments>
      <pubDate>Mon, 30 Oct 2023 12:42:50 +0900</pubDate>
    </item>
    <item>
      <title>React - useEffect 두 번 렌더링되는 문제 해결 (의존성 배열 활용)</title>
      <link>https://besforyou.tistory.com/434</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;React2.png&quot; data-origin-width=&quot;5000&quot; data-origin-height=&quot;1679&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWkhu4/btszg0zR6ia/JGV2xXTJs3AoDGx2OjZntK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWkhu4/btszg0zR6ia/JGV2xXTJs3AoDGx2OjZntK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWkhu4/btszg0zR6ia/JGV2xXTJs3AoDGx2OjZntK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWkhu4%2Fbtszg0zR6ia%2FJGV2xXTJs3AoDGx2OjZntK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;5000&quot; height=&quot;1679&quot; data-filename=&quot;React2.png&quot; data-origin-width=&quot;5000&quot; data-origin-height=&quot;1679&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;book-toc&quot;&gt;
&lt;h2 style=&quot;color: black; margin-bottom: 15px;&quot; data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ul id=&quot;toc&quot; style=&quot;list-style-type: disc; color: black;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#id1&quot;&gt; 문제 상황 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id2&quot;&gt; 문제 원인 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id3&quot;&gt; 해결책 - dependencies 배열 (의존성 배열) &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id4&quot;&gt; dependencies 배열 특징에 따른 결과 &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id1&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;문제 상황&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;useEffect 메서드의 첫 번째 인자로 컴포넌트가 렌더링 된 이후에 실행할 코드를 넘겨주었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;api를 통해 데이터를 가져오는 코드였는데 데이터를 성공적으로 가져오면 dataRead state를 true로 변경하여 loading 화면에서 실제 앱 화면으로 변환되도록 구현했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 불필요하게 api 호출을 두 번하는 문제가 발생했습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698469398677&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;useEffect(() =&amp;gt; {
    async function fetch_data() {
      console.log(&quot;fetch_data&quot;)
      console.log(&quot;dataRead : &quot;, dataRead)
      const api_key = process.env.REACT_APP_APIKEY;
      const url = `https://api.odcloud.kr/api/15085727/v1/uddi:d57791f7-1e1e-46c9-bbfd-911fa64ee8a4?page=1&amp;amp;perPage=200&amp;amp;serviceKey=${api_key}&amp;amp;dataType=JSON`;
      try {
        const result = await fetch(url)
        fetch_success(result)
      } catch (err) {
        console.log(err);
        console.log(&quot;데이터 불러오기 실패. csv 데이터 파일 파싱 실행&quot;)
        fetch_fail()
      }
    }
    fetch_data()
 })&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-28 오후 2.04.05.png&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUTHPm/btszkaam8HZ/CggVIKrskw1nVbMH4ShxB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUTHPm/btszkaam8HZ/CggVIKrskw1nVbMH4ShxB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUTHPm/btszkaam8HZ/CggVIKrskw1nVbMH4ShxB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUTHPm%2Fbtszkaam8HZ%2FCggVIKrskw1nVbMH4ShxB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;482&quot; height=&quot;262&quot; data-filename=&quot;스크린샷 2023-10-28 오후 2.04.05.png&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id2&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;문제 원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;useEffect 내부 코드가 실행되어 데이터를 제대로 읽어오면 dataRead state를 변경합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컴포넌트는 state가 변경되면 리렌더링 되기 때문에 useEffect -&amp;gt; 코드 실행, api 호출 -&amp;gt; state 변경 -&amp;gt; 컴포넌트 리렌더링 -&amp;gt; useEffect -&amp;gt; 코드 실행, api 호출하는 루프가 생겨 발생한 문제였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id3&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;해결책 - dependencies 배열 (의존성 배열)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;useEffect의 두 번째 인자로 dependencies 배열을 줄 수 있습니다. 이 배열에는 useEffect 첫 인자로 준 코드에서 의존하고 있는 데이터 (props, state, 변수들)를 담는것이 원칙입니다. 이 dependencies 배열(의존성 배열)의 역할은 무엇일까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698470121019&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;useEffect(setup, dependencies?)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;useEffect는 컴포넌트가 렌더링 되었을때 처음 한 번 렌더링 되고, 의존성 배열에 담긴 값들이 변경되면 변경된 데이터를 가지고 useEffect setup 코드, 즉 첫 인자로 전달한 코드를 다시 실행합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉, setup 함수 내부의 데이터값을 동기화시키기 위해 setup 함수가 의존하고 있는 props, state, 변수를 dependencies 배열에 담아 두 번째 인자로 전달하는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;이 의존성 배열로 setup 코드가 두 번 실행되는 것을 막을 수 있습니다&lt;/b&gt;. 의존성 배열로 배열에 아무것도 담지 않은 빈 배열을 전달한다면 setup 코드는 컴포넌트가 렌더링되고&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; 단 한번&lt;/b&gt;&lt;/span&gt; 실행됩니다. 지금 문제를 해결하기 위한 알맞은 선택지인 거죠.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 위에 있는 코드에서 두 번째 인자로 빈 배열을 전달하면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698471303819&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;useEffect(() =&amp;gt; {
    async function fetch_data() {
      console.log(&quot;fetch_data&quot;)
      console.log(&quot;dataRead : &quot;, dataRead)
      const api_key = process.env.REACT_APP_APIKEY;
      const url = `https://api.odcloud.kr/api/15085727/v1/uddi:d57791f7-1e1e-46c9-bbfd-911fa64ee8a4?page=1&amp;amp;perPage=200&amp;amp;serviceKey=${api_key}&amp;amp;dataType=JSON`;
      try {
        const result = await fetch(url)
        fetch_success(result)
      } catch (err) {
        console.log(err);
        console.log(&quot;데이터 불러오기 실패. csv 데이터 파일 파싱 실행&quot;)
        fetch_fail()
      }
    }
    fetch_data()
 }, [])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-28 오후 2.36.14.png&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nK9sP/btszjCrt0j8/iDK9l0KjiilkXaPgCq1Ndk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nK9sP/btszjCrt0j8/iDK9l0KjiilkXaPgCq1Ndk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nK9sP/btszjCrt0j8/iDK9l0KjiilkXaPgCq1Ndk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnK9sP%2FbtszjCrt0j8%2FiDK9l0KjiilkXaPgCq1Ndk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;412&quot; height=&quot;176&quot; data-filename=&quot;스크린샷 2023-10-28 오후 2.36.14.png&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;setup 코드는 단 한번 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id4&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;dependencies 배열 특징에 따른 결과&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;useEffect에 두 번째 인자를 어떻게 전달하는지에 따라 실행방식이 달라집니다. 크게 &lt;b&gt;세 가지 경우&lt;/b&gt;로 나눌 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 의존성 배열 전달 안 함&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698471754380&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;useEffect(() =&amp;gt; {
	// ...
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의존성 배열을 주지 않으면 컴포넌트가 리렌더링 될 때마다 useEffect가 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이전과 같은 작업을 반복하게 될 가능성이 존재합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 의존성 배열에 의존하는 데이터(props, state, 변수 등) 전달&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698471764995&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;useEffect(() =&amp;gt; {
	// ...
}, [a, b]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;setup 코드가 의존하고 있는 데이터가 변경될 경우 useEffect가 다시 실행되어 setup 코드의 데이터가 동기화됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;setup 코드가 api를 통해 데이터를 호출하는 경우, 호출할 페이지 번호, 데이터 이름, url를 의존성 배열에 넣어 전달하면 url 혹은 호출할 페이지 번호가 변하면 useEffect가 다시 실행되게끔 구현할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. 의존성 배열에 빈 배열 전달&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698471898643&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;useEffect(() =&amp;gt; {
	// ...
}, []);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컴포넌트 내부 데이터(props, state, 변수 등)에 어떤 변화가 생기더라도 useEffect는 &lt;b&gt;단 한번&lt;/b&gt; 호출됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;setup 코드가 반복할 필요 없이 단 한번 수행하면 되는 작업인 경우 사용하기 적합합니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Toy Projects 기록/Korea Crime Graph</category>
      <category>react</category>
      <category>useEffect</category>
      <author>besforyou999</author>
      <guid isPermaLink="true">https://besforyou.tistory.com/434</guid>
      <comments>https://besforyou.tistory.com/434#entry434comment</comments>
      <pubDate>Sat, 28 Oct 2023 14:48:35 +0900</pubDate>
    </item>
    <item>
      <title> css - 마우스 포인터 hover 구현</title>
      <link>https://besforyou.tistory.com/433</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;css.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1693&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tFkx2/btszgnO5zOk/kEV0K47yaHHHch0Kf1usok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tFkx2/btszgnO5zOk/kEV0K47yaHHHch0Kf1usok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tFkx2/btszgnO5zOk/kEV0K47yaHHHch0Kf1usok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtFkx2%2FbtszgnO5zOk%2FkEV0K47yaHHHch0Kf1usok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;241&quot; height=&quot;340&quot; data-filename=&quot;css.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1693&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;h2 style=&quot;color: black; margin-bottom: 15px;&quot; data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ul id=&quot;toc&quot; style=&quot;list-style-type: disc; color: black;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#id1&quot;&gt; hover &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id2&quot;&gt; 코드 &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id1&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;hover&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 버튼 위에 마우스 포인터를 올리면 확대되는 이펙트를 본 적이 있을 겁니다. 이를 css로 구현 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mouseHover.gif&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eFbaRe/btszllob7yM/NLb6BUftSKLBefUDKCpzxK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eFbaRe/btszllob7yM/NLb6BUftSKLBefUDKCpzxK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eFbaRe/btszllob7yM/NLb6BUftSKLBefUDKCpzxK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/eFbaRe/btszllob7yM/NLb6BUftSKLBefUDKCpzxK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;434&quot; height=&quot;357&quot; data-filename=&quot;mouseHover.gif&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id2&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 요소에 대해 hover 되기 이전과 hover 된 상태의 css 스타일이 각각 한 개씩 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 gif에서 화살표 버튼의 id는 'scroll-to-top'입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 마우스가 요소 위로 올라왔을때올라왔을 때 요소 크기를 키우기 위해서는 ':hover' 가상 선택자를 붙여주고 transform: scale() 속성을 사용합니다. 아래와 같은 css를 적용하면 마우스가 요소 위로 올라왔을 때 요소 크기는 1.2배로 커집니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698395784644&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#scroll-to-top:hover {
  transform: scale(1.2);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 자연스러운 전환을 적용하고 싶으면 hover 되기 이전 스타일 규칙에 transition 속성을 적용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698395911575&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#scroll-to-top {
  // 다른 스타일들

  transition: 0.1s;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 코드는 요소가 전환될때 총 0.1s 정도의 시간 동안 천천히 변환시킵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id2&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;결과&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mouseHover.gif&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I66vY/btszi7x1LEc/9K4KbTCzgkRTUVtRkcqKK1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I66vY/btszi7x1LEc/9K4KbTCzgkRTUVtRkcqKK1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I66vY/btszi7x1LEc/9K4KbTCzgkRTUVtRkcqKK1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/I66vY/btszi7x1LEc/9K4KbTCzgkRTUVtRkcqKK1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;409&quot; height=&quot;336&quot; data-filename=&quot;mouseHover.gif&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Toy Projects 기록/Korea Crime Graph</category>
      <author>besforyou999</author>
      <guid isPermaLink="true">https://besforyou.tistory.com/433</guid>
      <comments>https://besforyou.tistory.com/433#entry433comment</comments>
      <pubDate>Fri, 27 Oct 2023 17:40:46 +0900</pubDate>
    </item>
    <item>
      <title>vscode csv 파일 데이터 깨짐</title>
      <link>https://besforyou.tistory.com/432</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;React2.png&quot; data-origin-width=&quot;5000&quot; data-origin-height=&quot;1679&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K59yM/btsy7gibzuC/KJNR11k3pKWZRoKtyVuQgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K59yM/btsy7gibzuC/KJNR11k3pKWZRoKtyVuQgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K59yM/btsy7gibzuC/KJNR11k3pKWZRoKtyVuQgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK59yM%2Fbtsy7gibzuC%2FKJNR11k3pKWZRoKtyVuQgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;5000&quot; height=&quot;1679&quot; data-filename=&quot;React2.png&quot; data-origin-width=&quot;5000&quot; data-origin-height=&quot;1679&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;book-toc&quot;&gt;
&lt;h2 style=&quot;color: black; margin-bottom: 15px;&quot; data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ul id=&quot;toc&quot; style=&quot;list-style-type: disc; color: black;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#id1&quot;&gt; 문제명 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id2&quot;&gt; 해결책 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id3&quot;&gt; 해결 &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id1&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;문제명&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트에 추가한 csv 파일이 깨지는 문제가 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오후 3.57.33.png&quot; data-origin-width=&quot;1588&quot; data-origin-height=&quot;1060&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clSh4h/btszcoMiWyb/kGWXupBGbenY1pypqrjLv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clSh4h/btszcoMiWyb/kGWXupBGbenY1pypqrjLv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clSh4h/btszcoMiWyb/kGWXupBGbenY1pypqrjLv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclSh4h%2FbtszcoMiWyb%2FkGWXupBGbenY1pypqrjLv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;695&quot; height=&quot;464&quot; data-filename=&quot;스크린샷 2023-10-25 오후 3.57.33.png&quot; data-origin-width=&quot;1588&quot; data-origin-height=&quot;1060&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id2&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;해결책&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인코딩 방식을 UTF-8에서 Korean(EUC-KR)로 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode 오른쪽 하단에 UTF-8을 클릭 &amp;gt; 인코딩하여 다시 열기 에서 'Korean(EUC-KR)'을 클릭하여 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오후 4.03.12.png&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coCcxh/btsy9jL2YIv/lwdJ0x6WAst0hGPTon17gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coCcxh/btsy9jL2YIv/lwdJ0x6WAst0hGPTon17gk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coCcxh/btsy9jL2YIv/lwdJ0x6WAst0hGPTon17gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoCcxh%2Fbtsy9jL2YIv%2FlwdJ0x6WAst0hGPTon17gk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;958&quot; height=&quot;296&quot; data-filename=&quot;스크린샷 2023-10-25 오후 4.03.12.png&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id3&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;해결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오후 4.03.20.png&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ncDOg/btszb4Alfvw/mYmOSZlBsjo3ZYoBHj8QX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ncDOg/btszb4Alfvw/mYmOSZlBsjo3ZYoBHj8QX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ncDOg/btszb4Alfvw/mYmOSZlBsjo3ZYoBHj8QX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FncDOg%2Fbtszb4Alfvw%2FmYmOSZlBsjo3ZYoBHj8QX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1150&quot; height=&quot;646&quot; data-filename=&quot;스크린샷 2023-10-25 오후 4.03.20.png&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Toy Projects 기록/Korea Crime Graph</category>
      <author>besforyou999</author>
      <guid isPermaLink="true">https://besforyou.tistory.com/432</guid>
      <comments>https://besforyou.tistory.com/432#entry432comment</comments>
      <pubDate>Wed, 25 Oct 2023 16:03:52 +0900</pubDate>
    </item>
    <item>
      <title>CS - Web Worker</title>
      <link>https://besforyou.tistory.com/431</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
&lt;h2 style=&quot;color: black; margin-bottom: 15px;&quot; data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ul id=&quot;toc&quot; style=&quot;list-style-type: disc; color: black;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#id1&quot;&gt; WebWorker &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#id2&quot;&gt; WebWorker 특징 &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id1&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;Web Worker&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML 페이지에서 스크립트를 실행하면 페이지는 스크립트가 완료할 때까지 기다리게 됩니다. 이는 사용자 입장에서 화면이 정지된 듯이 보여 불편함을 줄 수 있습니다. 이를 위해 웹 워커(Web Worker)를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 워커는 웹 브라우저에서 멀티스레딩 및 백그라운드 스레드 작업을 수행하기 위한 기술입니다. 웹 애플리케이션에서 CPU 집중적인 작업 또는 긴 처리 시간이 필요한 작업을 수행할 때 웹 워커를 사용하면 메인 스레드의 브라우저 성능에 영향을 미치지 않고 작업을 백그라운드에서 병렬로 처리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 싱글 스레드 언어입니다. 하지만 실제로는 멀티 스레드처럼 사용되는데 그 이유는 바로 Web Worker 덕분입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;id2&quot; style=&quot;font-weight: bold; color: black; border-bottom: 1px solid black; margin: 10px 0px 10px 0px; border-left: 5px solid black; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;Web Worker 특징&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 독립된 스레드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 워커는 메인 스레드와 별도로 동작하며, 작업을 병렬로 처리할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이로 힌해 메인 스레드의 렌더링 및 사용자 상호작용에 영향을 미치지 않습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 자바스크립트 파일&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 워크는 자바스크립트 파일로 구현됩니다. 메인 스레드에서 웹 워커를 생성하고 제어할 수 있으며, 웹 워커 내에서는 자바스크립트 코드를 실행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. 통신&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 워커와 메인 스레드 간에는 메시지를 통한 통신이 이루어집니다. 메인 스레드에서 웹 워커로 데이터를 보내고, 웹 워커에서 메인 스레드로 데이터를 반환할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. DOM, 브라우저 객체 접근 제한&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 워커는 메인 스레드와는 다르게 DOM 접근이나 브라우저 객체 접근이 제한됩니다. 따라서 웹 워커는 주로 순순한 계산 작업에 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science</category>
      <author>besforyou999</author>
      <guid isPermaLink="true">https://besforyou.tistory.com/431</guid>
      <comments>https://besforyou.tistory.com/431#entry431comment</comments>
      <pubDate>Wed, 25 Oct 2023 14:50:23 +0900</pubDate>
    </item>
  </channel>
</rss>