<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>sujin's 개발 로그</title>
    <link>https://sujin7837.tistory.com/</link>
    <description>Front &amp;amp; Backend-Developer
</description>
    <language>ko</language>
    <pubDate>Thu, 27 Aug 2026 11:14:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>sujin7837</managingEditor>
    <image>
      <title>sujin's 개발 로그</title>
      <url>https://tistory1.daumcdn.net/tistory/4375854/attach/be6648d8de1d4a389df5879469e7173a</url>
      <link>https://sujin7837.tistory.com</link>
    </image>
    <item>
      <title>[React] 8. Effects</title>
      <link>https://sujin7837.tistory.com/560</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;state가 변화할 때 모든 component가 다시 실행되고, code들도 다시 실행됩니다. 그러나 component 내의 몇몇 코드들은 처음 한 번만 실행되고 다시 실행되지 않도록 할 필요가 있습니다. 이럴 때 &lt;b&gt;Effect&lt;/b&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;아래 코드에서 &quot;call an api&quot;는 한 번만 실행하면 되는 로그입니다. 그러나 버튼을 클릭할 때마다 항상 실행됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1671112025441&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useState } from &quot;react&quot;;

function App() {
  const [counter, setValue] = useState(0);
  const onClick = () =&amp;gt; setValue((prev) =&amp;gt; prev + 1);
  console.log(&quot;call an api&quot;);

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;{counter}&amp;lt;/h1&amp;gt;
      &amp;lt;button onClick={onClick}&amp;gt;click me&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;useEffect&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useEffect를 사용하면 코드가 처음 실행될 때 한 번만 실행되고, state가 바뀌어도 다시 실행되지 않습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1671112184189&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useState, useEffect } from &quot;react&quot;;

function App() {
  const [counter, setValue] = useState(0);
  const onClick = () =&amp;gt; setValue((prev) =&amp;gt; prev + 1);
  console.log(&quot;i run all the time&quot;);	// state가 변화하면 항상 실행됨
  const iRunOnlyOnce = () =&amp;gt; {
    console.log(&quot;i run only once&quot;);	// state가 변화해도 처음 한 번만 실행됨
  }
  useEffect(iRunOnlyOnce, []);
  useEffect(()=&amp;gt;{
    console.log(&quot;CALL THE API...&quot;);	// state가 변화해도 처음 한 번만 실행됨
  }, []);

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;{counter}&amp;lt;/h1&amp;gt;
      &amp;lt;button onClick={onClick}&amp;gt;click me&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;&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;useEffect(() =&amp;gt; {코드}, [지켜볼 대상]);&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지켜볼 대상이 없으면, 코드는 한 번만 실행됩니다.&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;따라서 useEffect를 이용하면 컴포넌트 변화에 따른 코드 실행을 변화시킬 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1671361269103&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Hello() {
  useEffect(() =&amp;gt; {
    console.log(&quot;created :)&quot;);	// 컴포넌트가 생성될 때 실행됨
    return ()=&amp;gt;console.log(&quot;destroyed :(&quot;);	// 컴포넌트가 소멸될 때 실행됨
  }, []);
  return &amp;lt;h1&amp;gt;Hello&amp;lt;/h1&amp;gt;;
}&lt;/code&gt;&lt;/pre&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_1671361581788&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Hello() {
  function byFn() {
    console.log(&quot;bye : (&quot;);
  }
  function hiFn() {
    console.log(&quot;created :)&quot;);
    return byFn;
  }
  useEffect(hiFn, []);
  return &amp;lt;h1&amp;gt;Hello&amp;lt;/h1&amp;gt;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React.js가 hiFn을 실행하고, component가 파괴될 때에 React.js는 hiFn이 return한 byFn을 실행합니다.&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;즉, useEffect를 사용하면 시작할 때만 code를 실행하게 할 수도 있고, 무언가가 변화할 때 code가 실행되게 할 수도 있고, component가 파괴될 때 code가 실행되게 할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;useEffect를 사용한 예시&lt;/h2&gt;
&lt;pre id=&quot;code_1671362094836&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useState, useEffect } from &quot;react&quot;;

function Hello() {
  useEffect(() =&amp;gt; {
    console.log(&quot;hi: )&quot;);
    return ()=&amp;gt; console.log(&quot;by :(&quot;);
  }, []);
  useEffect(function() {
    console.log(&quot;hi: )&quot;);
    return function() {
      console.log(&quot;by :(&quot;);
    }
  }, []);
  return &amp;lt;h1&amp;gt;Hello&amp;lt;/h1&amp;gt;;
}

function App() {
  const [showing, setShowing] = useState(false);
  const onClick = () =&amp;gt; setShowing((prev) =&amp;gt; !prev);
  return (
    &amp;lt;div&amp;gt;
      {showing ? &amp;lt;Hello /&amp;gt; : null}
      &amp;lt;button onClick={onClick}&amp;gt;{showing ? &quot;Hide&quot; : &quot;Show&quot;}&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;&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;size16&quot;&gt;출처 : 노마드코더&lt;/p&gt;</description>
      <category>프론트엔드/React</category>
      <author>sujin7837</author>
      <guid isPermaLink="true">https://sujin7837.tistory.com/560</guid>
      <comments>https://sujin7837.tistory.com/560#entry560comment</comments>
      <pubDate>Sun, 18 Dec 2022 20:15:04 +0900</pubDate>
    </item>
    <item>
      <title>[React] 7. Create-React-App</title>
      <link>https://sujin7837.tistory.com/559</link>
      <description>&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-3261371718694436&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Create-React-App&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Create-React-App은 많은 스크립트와 사전설정을 통해 ReactJS를 사용하기 훨씬 쉽게 해줍니다. 개발 서버에 접근하거나, 자동으로 새로고침을 하거나, 어플리케이션에 CSS를 즉각적으로 포함시켜주는 등 다양한 기능을 제공합니다.&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;1) node.js 설치&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;2) 콘솔에 node -v 입력&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;size18&quot;&gt;3) 콘솔에 npx 입력&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;size18&quot;&gt;4) npx create-react-app 생성할어플리케이션이름&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;size18&quot;&gt;5) vscode에서 생성된 어플리케이션 폴더를 열어줌&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;6) 터미널에 npm start를 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;development server(개발용 서버)를 만들게 되며 자동으로 브라우저가 열립니다.&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;7) src 폴더 안에 App.js와 index.js 파일만 남기고 나머지는 삭제&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;8) App.js&lt;/p&gt;
&lt;pre id=&quot;code_1670151025205&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function App() {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;Welcome back!&amp;lt;/h1&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;&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;9) index.js&lt;/p&gt;
&lt;pre id=&quot;code_1670151038347&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(
  &amp;lt;React.StrictMode&amp;gt;
    &amp;lt;App /&amp;gt;
  &amp;lt;/React.StrictMode&amp;gt;,
  document.getElementById(&quot;root&quot;)
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Module을 이용하여 style 적용&lt;/h2&gt;
&lt;pre id=&quot;code_1671111191129&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(
  &amp;lt;React.StrictMode&amp;gt;
    &amp;lt;App /&amp;gt;
    
  &amp;lt;/React.StrictMode&amp;gt;,
  document.getElementById(&quot;root&quot;)
);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1671111205613&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// App.js

import Button from './Button';
import styles from &quot;./App.module.css&quot;;

function App() {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1 className={styles.title}&amp;gt;Welcome back!&amp;lt;/h1&amp;gt;
      &amp;lt;Button text={&quot;Continue&quot;}/&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1671111231201&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Button.js

import PropTypes from &quot;prop-types&quot;;
import styles from &quot;./Button.module.css&quot;;

function Button({text}) {
    return &amp;lt;button className={styles.btn}&amp;gt;{text}&amp;lt;/button&amp;gt;;
    
}

Button.propTypes = {
    text: PropTypes.string.isRequired,
}

export default Button;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1671111249575&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Button.module.css

.btn {
    color: white;
    background-color: tomato;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1671111264850&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// App.module.css

.title {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
    font-size: 18px;
}&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;module을 이용하여 css를 적용하게 되면, className에 해당 모듈의 클래스명이 랜덤으로 지정되어 각 요소마다 다른 style을 적용할 수 있게 됩니다.&lt;/p&gt;</description>
      <author>sujin7837</author>
      <guid isPermaLink="true">https://sujin7837.tistory.com/559</guid>
      <comments>https://sujin7837.tistory.com/559#entry559comment</comments>
      <pubDate>Thu, 15 Dec 2022 22:35:19 +0900</pubDate>
    </item>
    <item>
      <title>[React] 6. Memo</title>
      <link>https://sujin7837.tistory.com/558</link>
      <description>&lt;pre id=&quot;code_1670139324490&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Btn({text, changeValue}) {
	console.log(text, &quot;was rendered&quot;);
    return (
      &amp;lt;button
        onClick = {changeValue}
        style={{
          backgroundColor: &quot;tomato&quot;,
          color: &quot;white&quot;,
          padding: &quot;10px 20px&quot;,
          border: 0,
          borderRadius: 10,
        }}
      &amp;gt;
        {text}
      &amp;lt;/button&amp;gt;
    );
  }
  function App() {
    const [value, setValue] = React.useState(&quot;Save Changes&quot;);
    const changeValue = () =&amp;gt; setValue(&quot;Revert Changes&quot;);
    return (
      &amp;lt;div&amp;gt;
        &amp;lt;Btn text={value} changeValue={changeValue} /&amp;gt; 
        &amp;lt;Btn text=&quot;Continue&quot; /&amp;gt;
      &amp;lt;/div&amp;gt;
    );
  }
    const root = document.getElementById(&quot;root&quot;);
    ReactDOM.render(&amp;lt;App /&amp;gt;, root);&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;스크린샷 2022-12-04 오후 4.21.27.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6HMCj/btrSJT82uo1/m3YoKROkCMoQb4COHJk3v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6HMCj/btrSJT82uo1/m3YoKROkCMoQb4COHJk3v1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6HMCj/btrSJT82uo1/m3YoKROkCMoQb4COHJk3v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6HMCj%2FbtrSJT82uo1%2Fm3YoKROkCMoQb4COHJk3v1%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;496&quot; height=&quot;122&quot; data-filename=&quot;스크린샷 2022-12-04 오후 4.21.27.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2022-12-04 오후 4.21.42.png&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTrGAC/btrSIrlfvYK/xKnMYM27AsZZuzEqJppQ2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTrGAC/btrSIrlfvYK/xKnMYM27AsZZuzEqJppQ2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTrGAC/btrSIrlfvYK/xKnMYM27AsZZuzEqJppQ2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTrGAC%2FbtrSIrlfvYK%2FxKnMYM27AsZZuzEqJppQ2k%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;528&quot; height=&quot;145&quot; data-filename=&quot;edited_스크린샷 2022-12-04 오후 4.21.42.png&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 버튼을 누르면 Save Changes에서 Revert Changes로 글자가 변경됩니다. 이때 위 코드에 의하면 버튼 두 개가 모두 새롭게 렌더링됩니다. 그런데 여기서 두번째 버튼은 변화가 없기 때문에 리렌더링되는 것이 비효율적입니다. 이러한 점을 개선하기 위해 Memo를 사용해줄 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Memo&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에게 어떤 컴포넌트가 다시 그려지는 것을 원치 않는다고 말해주는 기능입니다. 이 기능을 사용하면 prop에 변화가 있을 경우만 리렌더링해주고, 변화가 없을 경우에는 리렌더링을 하지 않습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1670139859903&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Btn({text, changeValue}) {
    console.log(text, &quot;was rendered&quot;);
    return (
      &amp;lt;button
        onClick = {changeValue}
        style={{
          backgroundColor: &quot;tomato&quot;,
          color: &quot;white&quot;,
          padding: &quot;10px 20px&quot;,
          border: 0,
          borderRadius: 10,
        }}
      &amp;gt;
        {text}
      &amp;lt;/button&amp;gt;
    );
  }
  const MemorizedBtn = React.memo(Btn);
  function App() {
    const [value, setValue] = React.useState(&quot;Save Changes&quot;);
    const changeValue = () =&amp;gt; setValue(&quot;Revert Changes&quot;);
    return (
      &amp;lt;div&amp;gt;
        &amp;lt;MemorizedBtn text={value} changeValue={changeValue} /&amp;gt;  
        &amp;lt;MemorizedBtn text=&quot;Continue&quot; /&amp;gt;
      &amp;lt;/div&amp;gt;
    );
  }
    const root = document.getElementById(&quot;root&quot;);
    ReactDOM.render(&amp;lt;App /&amp;gt;, root);&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;size16&quot;&gt;출처 : &lt;a href=&quot;https://nomadcoders.co/react-for-beginners/lectures/3276&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nomadcoders.co/react-for-beginners/lectures/3276&lt;/a&gt;&lt;/p&gt;</description>
      <category>프론트엔드/React</category>
      <author>sujin7837</author>
      <guid isPermaLink="true">https://sujin7837.tistory.com/558</guid>
      <comments>https://sujin7837.tistory.com/558#entry558comment</comments>
      <pubDate>Sun, 4 Dec 2022 16:57:08 +0900</pubDate>
    </item>
    <item>
      <title>[React] 5. Props</title>
      <link>https://sujin7837.tistory.com/557</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Props&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Props는 상위 컴포넌트가 하위 컴포넌트에 값을 전달할 때 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Props의 특징&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상위에서 하위로만 값을 전달하는 단방향 흐름을 가집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하위에서 프로퍼티를 수정할 수 없다는 특징을 가집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- props는 첫번째이자 유일한 인자입니다. ex) function Btn(props) {}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하위 컴포넌트에서 보낸 모든 것들을 갖는 오브젝트입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Props를 사용한 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼을 만들 때, 동일한 style을 갖는 버튼 여러 개를 생성하고자 한다면 여러개의 버튼 컴포넌트를 생성하고 props를 통해 버튼 이름을 전달해줄 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1669558154735&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  function Btn(props) {
    console.log(props);
    return (
      &amp;lt;button
        style={{
          backgroundColor: &quot;tomato&quot;,
          color: &quot;white&quot;,
          padding: &quot;10px 20px&quot;,
          border: 0,
          borderRadius: 10,
        }}
      &amp;gt;
        {props.banana}
      &amp;lt;/button&amp;gt;
    );
  }
  function App() {
    return (
      &amp;lt;div&amp;gt;
        &amp;lt;Btn banana=&quot;Save Changes&quot; /&amp;gt;  
        &amp;lt;Btn banana=&quot;Continue&quot; /&amp;gt;
      &amp;lt;/div&amp;gt;
    );
  }
    const root = document.getElementById(&quot;root&quot;);
    ReactDOM.render(&amp;lt;App /&amp;gt;, root);&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;이때, props는 {}로 줄여서 사용 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1669558392693&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  function Btn({banana}) {
    return (
      &amp;lt;button
        style={{
          backgroundColor: &quot;tomato&quot;,
          color: &quot;white&quot;,
          padding: &quot;10px 20px&quot;,
          border: 0,
          borderRadius: 10,
        }}
      &amp;gt;
        {banana}
      &amp;lt;/button&amp;gt;
    );
  }
  function App() {
    return (
      &amp;lt;div&amp;gt;
        &amp;lt;Btn banana=&quot;Save Changes&quot; /&amp;gt;  
        &amp;lt;Btn banana=&quot;Continue&quot; /&amp;gt;
      &amp;lt;/div&amp;gt;
    );
  }
    const root = document.getElementById(&quot;root&quot;);
    ReactDOM.render(&amp;lt;App /&amp;gt;, root);&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;props를 여러 개 사용할 수도 있습니다. 아래와 같이 text와 big을 사용하게 되면, 첫번째 버튼에는 big에 true가 할당되고, 두번째 버튼에는 big에 undefined가 할당됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1669558652861&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Btn({text, big}) {
    return (
      &amp;lt;button
        style={{
          backgroundColor: &quot;tomato&quot;,
          color: &quot;white&quot;,
          padding: &quot;10px 20px&quot;,
          border: 0,
          borderRadius: 10,
        }}
      &amp;gt;
        {text}
      &amp;lt;/button&amp;gt;
    );
  }
  function App() {
    return (
      &amp;lt;div&amp;gt;
        &amp;lt;Btn text=&quot;Save Changes&quot; big={true} /&amp;gt;  
        &amp;lt;Btn text=&quot;Continue&quot; /&amp;gt;
      &amp;lt;/div&amp;gt;
    );
  }
    const root = document.getElementById(&quot;root&quot;);
    ReactDOM.render(&amp;lt;App /&amp;gt;, root);&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;만약 상위 컴포넌트와 하위 컴포넌트가 같은 프로퍼티를 가지면, 상위 컴포넌트의 값이 세팅됩니다. 따라서 아래의 경우에는 폰트 크기가 변경됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1669558883816&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Btn({text, big}) {
    return (
      &amp;lt;button
        style={{
          backgroundColor: &quot;tomato&quot;,
          color: &quot;white&quot;,
          padding: &quot;10px 20px&quot;,
          border: 0,
          borderRadius: 10,
          fontSize: big ? 18 : 16,
        }}
      &amp;gt;
        {text}
      &amp;lt;/button&amp;gt;
    );
  }
  function App() {
    return (
      &amp;lt;div&amp;gt;
        &amp;lt;Btn text=&quot;Save Changes&quot; big={true} /&amp;gt;  
        &amp;lt;Btn text=&quot;Continue&quot; /&amp;gt;
      &amp;lt;/div&amp;gt;
    );
  }
    const root = document.getElementById(&quot;root&quot;);
    ReactDOM.render(&amp;lt;App /&amp;gt;, root);&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;Btn 컴포넌트 안에 프로퍼티를 만들어준다고 해서 자동으로 return에 들어가지 않습니다. 따라서 Btn의 프로퍼티 값으로 적어주어야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1670138042025&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Btn({text, changeValue}) {	// 2. Btn의 props를 등록
    return (
      &amp;lt;button
        onClick = {changeValue}	// 3. props 사용
        style={{
          backgroundColor: &quot;tomato&quot;,
          color: &quot;white&quot;,
          padding: &quot;10px 20px&quot;,
          border: 0,
          borderRadius: 10,
        }}
      &amp;gt;
        {text}
      &amp;lt;/button&amp;gt;
    );
  }
  function App() {
    const [value, setValue] = React.useState(&quot;Save Changes&quot;);
    const changeValue = () =&amp;gt; setValue(&quot;Revert Changes&quot;);
    return (
      &amp;lt;div&amp;gt;
        &amp;lt;Btn text={value} changeValue={changeValue} /&amp;gt;  // 1. Btn의 prop으로 text와 changeValue 생성
        &amp;lt;Btn text=&quot;Continue&quot; /&amp;gt;
      &amp;lt;/div&amp;gt;
    );
  }
    const root = document.getElementById(&quot;root&quot;);
    ReactDOM.render(&amp;lt;App /&amp;gt;, root);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Prop Types&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prop Types는 어떤 Type의 Prop을 받고 있는지 체크해줍니다. 따라서 잘못된 Type을 전달해줄 때 이를 수정하는데 용이합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Prop Types 사용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. script src을 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1670141250122&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;https://unpkg.com/prop-types@15.6/prop-types.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. prop에 type을 설정해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1670141915636&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Btn.propTypes = {
    text : PropTypes.string,
    fontSize : PropTypes.number
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Btn이라는 컴포넌트의 prop인 text와 fontSize의 타입을 각각 문자열과 숫자로 설정합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2022-12-04 오후 5.20.41.png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pZ4SY/btrSNZ8h050/7rdvqSFGyxA8jPQXyerexK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pZ4SY/btrSNZ8h050/7rdvqSFGyxA8jPQXyerexK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pZ4SY/btrSNZ8h050/7rdvqSFGyxA8jPQXyerexK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpZ4SY%2FbtrSNZ8h050%2F7rdvqSFGyxA8jPQXyerexK%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;300&quot; height=&quot;78&quot; data-filename=&quot;edited_스크린샷 2022-12-04 오후 5.20.41.png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-04 오후 5.20.29.png&quot; data-origin-width=&quot;2024&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lqn4G/btrSM3Xi03v/s7tWPNUTAEt78wYCkIbvfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lqn4G/btrSM3Xi03v/s7tWPNUTAEt78wYCkIbvfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lqn4G/btrSM3Xi03v/s7tWPNUTAEt78wYCkIbvfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLqn4G%2FbtrSM3Xi03v%2Fs7tWPNUTAEt78wYCkIbvfK%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;2024&quot; height=&quot;194&quot; data-filename=&quot;스크린샷 2022-12-04 오후 5.20.29.png&quot; data-origin-width=&quot;2024&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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_1670142142616&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;div id=&quot;root&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script crossorigin src=&quot;https://unpkg.com/react@17.0.2/umd/react.development.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script crossorigin src=&quot;https://unpkg.com/react-dom@17.0.2/umd/react-dom.development.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://unpkg.com/prop-types@15.6/prop-types.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/babel&quot;&amp;gt;
  function Btn({text, fontSize}) {
    console.log(text, &quot;was rendered&quot;);
    return (
      &amp;lt;button
        style={{
          backgroundColor: &quot;tomato&quot;,
          color: &quot;white&quot;,
          padding: &quot;10px 20px&quot;,
          border: 0,
          borderRadius: 10,
          fontSize,
        }}
      &amp;gt;
        {text}
      &amp;lt;/button&amp;gt;
    );
  }
  Btn.propTypes = {
    text : PropTypes.string,
    fontSize : PropTypes.number
  }
  function App() {
    return (
      &amp;lt;div&amp;gt;
        &amp;lt;Btn text=&quot;Save Changes&quot; fontSize={18} /&amp;gt;  
        &amp;lt;Btn text={14} fontSize={&quot;Continue&quot;} /&amp;gt;  

      &amp;lt;/div&amp;gt;
    );
  }
    const root = document.getElementById(&quot;root&quot;);
    ReactDOM.render(&amp;lt;App /&amp;gt;, root);
&amp;lt;/script&amp;gt;
&amp;lt;/html&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;size16&quot;&gt;&lt;a href=&quot;https://reactjs.org/docs/typechecking-with-proptypes.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://reactjs.org/docs/typechecking-with-proptypes.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 링크에서 propTypes에 대한 다양한 사용 예시를 확인해볼 수 있습니다.&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;출처 : 노마드코더&lt;/p&gt;</description>
      <category>프론트엔드/React</category>
      <author>sujin7837</author>
      <guid isPermaLink="true">https://sujin7837.tistory.com/557</guid>
      <comments>https://sujin7837.tistory.com/557#entry557comment</comments>
      <pubDate>Sun, 4 Dec 2022 16:43:00 +0900</pubDate>
    </item>
    <item>
      <title>[React] 4. State</title>
      <link>https://sujin7837.tistory.com/556</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;State&lt;/h2&gt;
&lt;pre id=&quot;code_1668351156865&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;root&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
  &amp;lt;script crossorigin src=&quot;https://unpkg.com/react@17.0.2/umd/react.production.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script crossorigin src=&quot;https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script type=&quot;text/babel&quot;&amp;gt;
    const root = document.getElementById(&quot;root&quot;);
    let counter = 0;
    function countUp() {
      counter = counter + 1;
      render();
    }

    function render() {
      ReactDOM.render(&amp;lt;Container /&amp;gt;, root);
    }
    function Container() {
       return (
        &amp;lt;div&amp;gt;
          &amp;lt;h3&amp;gt;Total clicks : {counter}&amp;lt;/h3&amp;gt;
          &amp;lt;button onClick={countUp}&amp;gt;Click me&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
      );
    }
    render();
  &amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 실행하고 브라우저의 개발자 도구 Elements에서 소스 코드를 확인해보면, h3, button, div들은 업데이트되지 않고 UI에서 바뀐 부분만 업데이트 해주는 것을 알 수 있습니다. 즉, React.js는 이전에 렌더링된 컴포넌트가 어떤건지 확인하고 다음에 렌더링될 컴포넌트가 무엇인지를 확인하여 다른 부분만 파악합니다. 따라서 모든 컴포넌트를 리렌더링할 필요 없이, 바뀐 부분만 다시 렌더링한다는 장점을 가지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;배열 쉽게 사용하기&lt;/h2&gt;
&lt;pre id=&quot;code_1668521967460&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const food = [&quot;tomato&quot;, &quot;potato&quot;]

// 기존 코드
// tomato -&amp;gt; 'tomato'
// potato -&amp;gt; 'potato'
const tomato = food[0];
const potato = food[1];


// 간단한 코드
// myFavFood -&amp;gt; 'tomato'
// mySecondFavFood &amp;gt; 'potato'
const [myFavFood, mySecondFavFood] = food;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;state 사용하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;React.useState() -&amp;gt; [변수, 함수]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) const [counter, setCounter] = React.useState(0);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;counter는 변수, setCounter 함수로 사용이 가능합니다.&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;따라서 state의 함수를 이용하여 렌더링을 손쉽게 구현할 수 있게 됩니다. 함수 내에 코드를 작성하여 코드가 바뀔 때마다 컴포넌트를 리렌더링하고 UI를 refresh할 수 있게 해줍니다. 가장 중요한 것은 state가 바뀌면 리렌더링이 일어난다는 것입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1668522736324&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;root&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
  &amp;lt;script crossorigin src=&quot;https://unpkg.com/react@17.0.2/umd/react.production.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script crossorigin src=&quot;https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script type=&quot;text/babel&quot;&amp;gt;
    const root = document.getElementById(&quot;root&quot;);
    let counter = 0;

    function App() {
      const [counter, setCounter] = React.useState(0);
      const onClick = () =&amp;gt; {
        setCounter(counter + 1);
      };
      return (
        &amp;lt;div&amp;gt;
          &amp;lt;h3&amp;gt;Total clicks : {counter}&amp;lt;/h3&amp;gt;
          &amp;lt;button onClick={onClick}&amp;gt;Click me&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
      );
    }
    ReactDOM.render(&amp;lt;App /&amp;gt;, root);
  &amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Inputs and State&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;js 문법&lt;/h4&gt;
&lt;pre id=&quot;code_1669026313952&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;root&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
  &amp;lt;script crossorigin src=&quot;https://unpkg.com/react@17.0.2/umd/react.production.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script crossorigin src=&quot;https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script type=&quot;text/babel&quot;&amp;gt;
    function App() {
      return (
        &amp;lt;div&amp;gt;
          &amp;lt;h1 class=&quot;hi&quot;&amp;gt;Super Converter&amp;lt;/h1&amp;gt; 
          &amp;lt;label for=&quot;minutes&quot;&amp;gt;Minutes&amp;lt;/label&amp;gt; 
          &amp;lt;input id=&quot;minutes&quot; placeholder=&quot;Minutes&quot; type=&quot;number&quot; /&amp;gt;
          &amp;lt;label for=&quot;hours&quot;&amp;gt;Hours&amp;lt;/label&amp;gt;
          &amp;lt;input id=&quot;hours&quot; placeholder=&quot;Hours&quot; type=&quot;number&quot; /&amp;gt;
        &amp;lt;/div&amp;gt;
      )
    }
      const root = document.getElementById(&quot;root&quot;);
      ReactDOM.render(&amp;lt;App /&amp;gt;, root);
  &amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;&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;jsx 문법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) script : production.min.js -&amp;gt; development.js&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) class -&amp;gt; className&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) for -&amp;gt; htmlFor&lt;/p&gt;
&lt;pre id=&quot;code_1669026443229&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;root&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
  &amp;lt;script crossorigin src=&quot;https://unpkg.com/react@17.0.2/umd/react.development.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script crossorigin src=&quot;https://unpkg.com/react-dom@17.0.2/umd/react-dom.development.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script type=&quot;text/babel&quot;&amp;gt;
    function App() {
      return (
        &amp;lt;div&amp;gt;
          &amp;lt;h1 className=&quot;hi&quot;&amp;gt;Super Converter&amp;lt;/h1&amp;gt; 
          &amp;lt;label htmlFor=&quot;minutes&quot;&amp;gt;Minutes&amp;lt;/label&amp;gt; 
          &amp;lt;input id=&quot;minutes&quot; placeholder=&quot;Minutes&quot; type=&quot;number&quot; /&amp;gt;
          &amp;lt;label htmlFor=&quot;hours&quot;&amp;gt;Hours&amp;lt;/label&amp;gt;
          &amp;lt;input id=&quot;hours&quot; placeholder=&quot;Hours&quot; type=&quot;number&quot; /&amp;gt;
        &amp;lt;/div&amp;gt;
      )
    }
      const root = document.getElementById(&quot;root&quot;);
      ReactDOM.render(&amp;lt;App /&amp;gt;, root);
  &amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;&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;input에서 value와 함수 이용하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{ } 안에 state의 value 혹은 함수를 넣어주면 state를 활용한 다양한 기능을 만들 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 예시에서는 시간 &amp;lt;-&amp;gt; 분 단위 변환하는 기능을 구현하고 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1669125812878&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;div id=&quot;root&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script crossorigin src=&quot;https://unpkg.com/react@17.0.2/umd/react.development.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script crossorigin src=&quot;https://unpkg.com/react-dom@17.0.2/umd/react-dom.development.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/babel&quot;&amp;gt;
  function App() {
    const [amount, setAmount] = React.useState(0);
    const [inverted, setInverted] = React.useState(false);
    const onChange = (event) =&amp;gt; {
      setAmount(event.target.value);
    }
    const reset = () =&amp;gt; setAmount(0);
    const onInvert = () =&amp;gt; {
      reset();
      setInverted((current) =&amp;gt; !current);
    }

    return (
      &amp;lt;div&amp;gt;
        &amp;lt;h1 className=&quot;hi&quot;&amp;gt;Super Converter&amp;lt;/h1&amp;gt; 
        &amp;lt;div&amp;gt;
          &amp;lt;label htmlFor=&quot;minutes&quot;&amp;gt;Minutes&amp;lt;/label&amp;gt; 
          &amp;lt;input 
            value={inverted ? amount*60 : amount}
            id=&quot;minutes&quot; 
            placeholder=&quot;Minutes&quot; 
            type=&quot;number&quot; 
            onChange={onChange}
            disabled={inverted}
          /&amp;gt;  
        &amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;
          &amp;lt;label htmlFor=&quot;hours&quot;&amp;gt;Hours&amp;lt;/label&amp;gt;
          &amp;lt;input 
            value={inverted ? amount : Math.round(amount/60)}
            id=&quot;hours&quot; 
            placeholder=&quot;Hours&quot; 
            type=&quot;number&quot; 
            onChange={onChange}
            disabled={!inverted}
          /&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;button onClick={reset}&amp;gt;Reset&amp;lt;/button&amp;gt;
        &amp;lt;button onClick={onInvert}&amp;gt;{inverted ? &quot;Turn back&quot; : &quot;Invert&quot;}&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    )
  }
    const root = document.getElementById(&quot;root&quot;);
    ReactDOM.render(&amp;lt;App /&amp;gt;, root);
&amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;&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;Component and State&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에 렌더링되는 과정은 App 컴포넌트를 통해 이뤄집니다. 따라서 브라우저에 화면을 띄우기 위해서는 App.js에 존재해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MinutesToHours 라는 컴포넌트를 만들고, App에 넣어주어 렌더링할 수 있습니다. 이것을 이용하여 select 박스를 만들고, 원하는 항목을 선택하였을 때 선택된 것만 렌더링되도록 하는 기능도 만들어줄 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1669127095277&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;div id=&quot;root&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script crossorigin src=&quot;https://unpkg.com/react@17.0.2/umd/react.development.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script crossorigin src=&quot;https://unpkg.com/react-dom@17.0.2/umd/react-dom.development.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/babel&quot;&amp;gt;
  function MinutesToHours() {
      const [amount, setAmount] = React.useState(0);
      const [inverted, setInverted] = React.useState(false);
      const onChange = (event) =&amp;gt; {
        setAmount(event.target.value);
      }
      const reset = () =&amp;gt; setAmount(0);
      const onInvert = () =&amp;gt; {
        reset();
        setInverted((current) =&amp;gt; !current);
      }

      return (
        &amp;lt;div&amp;gt;
          &amp;lt;div&amp;gt;
            &amp;lt;label htmlFor=&quot;minutes&quot;&amp;gt;Minutes&amp;lt;/label&amp;gt; 
            &amp;lt;input 
              value={inverted ? amount*60 : amount}
              id=&quot;minutes&quot; 
              placeholder=&quot;Minutes&quot; 
              type=&quot;number&quot; 
              onChange={onChange}
              disabled={inverted}
            /&amp;gt;  
          &amp;lt;/div&amp;gt;
          &amp;lt;div&amp;gt;
            &amp;lt;label htmlFor=&quot;hours&quot;&amp;gt;Hours&amp;lt;/label&amp;gt;
            &amp;lt;input 
              value={inverted ? amount : Math.round(amount/60)}
              id=&quot;hours&quot; 
              placeholder=&quot;Hours&quot; 
              type=&quot;number&quot; 
              onChange={onChange}
              disabled={!inverted}
            /&amp;gt;
          &amp;lt;/div&amp;gt;
          &amp;lt;button onClick={reset}&amp;gt;Reset&amp;lt;/button&amp;gt;
          &amp;lt;button onClick={onInvert}&amp;gt;{inverted ? &quot;Turn back&quot; : &quot;Invert&quot;}&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
      )
    }
  function KmToMiles() {
    return &amp;lt;h3&amp;gt;KM 2 M&amp;lt;/h3&amp;gt;
  }
  function App() {
    const [index, setIndex] = React.useState(&quot;xx&quot;);
    const onSelect = (event) =&amp;gt; {
      setIndex(event.target.value);
    } 
    console.log(&quot;render w/&quot;, index);
    return (
      &amp;lt;div&amp;gt;
        &amp;lt;h1 className=&quot;hi&quot;&amp;gt;Super Converter&amp;lt;/h1&amp;gt; 
        &amp;lt;select name=&quot;&quot; id=&quot;&quot; value={index} onChange={onSelect}&amp;gt;
            &amp;lt;option value=&quot;xx&quot;&amp;gt;Select your units&amp;lt;/option&amp;gt;
            &amp;lt;option value=&quot;0&quot;&amp;gt;Minutes &amp;amp; Hours&amp;lt;/option&amp;gt;
            &amp;lt;option value=&quot;1&quot;&amp;gt;Km &amp;amp; Miles&amp;lt;/option&amp;gt;
        &amp;lt;/select&amp;gt;
        &amp;lt;hr /&amp;gt;
        {index === &quot;xx&quot; ? &quot;Please select your units&quot; : null}
        {index === &quot;0&quot; ? &amp;lt;MinutesToHours /&amp;gt; : null}
        {index === &quot;1&quot; ? &amp;lt;KmToMiles /&amp;gt; : null}
      &amp;lt;/div&amp;gt;
    )
  }
    const root = document.getElementById(&quot;root&quot;);
    ReactDOM.render(&amp;lt;App /&amp;gt;, root);
&amp;lt;/script&amp;gt;
&amp;lt;/html&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;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;출처 : &lt;a href=&quot;https://nomadcoders.co/react-for-beginners/lectures/3275&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nomadcoders.co/react-for-beginners/lectures/3275&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1669127263303&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;All Courses &amp;ndash; 노마드 코더 Nomad Coders&quot; data-og-description=&quot;초급부터 고급까지! 니꼬쌤과 함께 풀스택으로 성장하세요!&quot; data-og-host=&quot;nomadcoders.co&quot; data-og-source-url=&quot;https://nomadcoders.co/react-for-beginners/lectures/3275&quot; data-og-url=&quot;https://nomadcoders.co/courses&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/RxBBK/hyQFfrLmW8/Lc5V1WWku0vs5Aw9T5w8R1/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260&quot;&gt;&lt;a href=&quot;https://nomadcoders.co/react-for-beginners/lectures/3275&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nomadcoders.co/react-for-beginners/lectures/3275&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/RxBBK/hyQFfrLmW8/Lc5V1WWku0vs5Aw9T5w8R1/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;All Courses &amp;ndash; 노마드 코더 Nomad Coders&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;초급부터 고급까지! 니꼬쌤과 함께 풀스택으로 성장하세요!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nomadcoders.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프론트엔드/React</category>
      <author>sujin7837</author>
      <guid isPermaLink="true">https://sujin7837.tistory.com/556</guid>
      <comments>https://sujin7837.tistory.com/556#entry556comment</comments>
      <pubDate>Tue, 22 Nov 2022 23:27:44 +0900</pubDate>
    </item>
    <item>
      <title>[React] 3. JSX</title>
      <link>https://sujin7837.tistory.com/555</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;JSX란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSX는 JavaScript를 확장한 문법으로, HTML에서 사용한 문법과 유사한 문법을 사용하여 React 요소를 만들 수 있게 합니다. 이를 통해 createElement를 대체하여 개발자들이 좀 더 편리하게 사용하도록 도와주기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668348165939&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// JSX

const Title = (
  &amp;lt;h3 id=&quot;title&quot; onMouseEnter={() =&amp;gt; consol.log(&quot;mouse enter&quot;)}&amp;gt;
    Hello I'm a title
  &amp;lt;/h3&amp;gt;
);
    
const Button = (
  &amp;lt;button 
    id=&quot;button&quot; 
    style={{backgroundColor: &quot;tomato&quot;,}} 
    onClick={() =&amp;gt; console.log(&quot;im clicked&quot;)}&amp;gt;
    Click me
  &amp;lt;/button&amp;gt;
);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1668348199430&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 기존 코드
const Title = React.createElement(
  &quot;h3&quot;, 
  {
    id: &quot;title&quot;, 
    onMouseEnter: () =&amp;gt; consol.log(&quot;mouse enter&quot;),
  }, 
  &quot;Hello I'm a span&quot;
);
    
const Button = React.createElement(
  &quot;button&quot;, 
  {
    onClick: () =&amp;gt; console.log(&quot;im clicked&quot;),
    style: &quot;tomato&quot;
  }, 
  &quot;Click me&quot;);&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;&lt;b&gt;Babel &amp;gt; Try it out&lt;/b&gt; 을 이용하면 JSX를 기존 코드로 변환할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Babel 추가하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React가 JSX를 인식하도록 하려면 Babel을 추가해주어야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1668348885428&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/babel&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. src 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 스크립트 타입 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;컴포넌트들을 포함하는 JSX 문법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 컴포넌트들을 함수로 만들어주어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 1) arrow function&lt;/p&gt;
&lt;pre id=&quot;code_1668349300473&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Button = () =&amp;gt; (
  &amp;lt;button 
    id=&quot;button&quot; 
    style={{backgroundColor: &quot;tomato&quot;,}} 
    onClick={() =&amp;gt; console.log(&quot;im clicked&quot;)}&amp;gt;
    Click me
  &amp;lt;/button&amp;gt;
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2) 일반 function&lt;/p&gt;
&lt;pre id=&quot;code_1668349351537&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Title() {
  return (
    &amp;lt;h3 id=&quot;title&quot; onMouseEnter={() =&amp;gt; consol.log(&quot;mouse enter&quot;)}&amp;gt;
      Hello I'm a title
    &amp;lt;/h3&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;2. 컴포넌트 렌더링 : 일반적인 HTML 태그인 것처럼 포함시켜줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1668349562610&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// JSX
const Container = (
  &amp;lt;div&amp;gt;
    &amp;lt;Title /&amp;gt;
    &amp;lt;Button /&amp;gt;
  &amp;lt;/div&amp;gt;
);


// 위 코드는 아래 코드와 같은 의미를 갖습니다.
const Container = (
  &amp;lt;div&amp;gt;
    &amp;lt;h3 id=&quot;title&quot; onMouseEnter={() =&amp;gt; consol.log(&quot;mouse enter&quot;)}&amp;gt;
      Hello I'm a title
    &amp;lt;/h3&amp;gt;
    &amp;lt;button 
        id=&quot;button&quot; 
        style={{backgroundColor: &quot;tomato&quot;,}} 
        onClick={() =&amp;gt; console.log(&quot;im clicked&quot;)}&amp;gt;
        Click me
      &amp;lt;/button&amp;gt;
  &amp;lt;/div&amp;gt;
);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1668349582650&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 기존 코드
const Container = React.createElement(&quot;div&quot;, null, [Title, Button]);&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;lt;Title /&amp;gt;, &amp;lt;Button /&amp;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;2-1. ReactDOM에 렌더링 할 경우&lt;/p&gt;
&lt;pre id=&quot;code_1668350043050&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Container = () =&amp;gt; (
  &amp;lt;div&amp;gt;
    &amp;lt;Title /&amp;gt;
    &amp;lt;Button /&amp;gt;
  &amp;lt;/div&amp;gt;
);
ReactDOM.render(&amp;lt;Container /&amp;gt;, root);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트를 함수로 만들어주고, render 내부에 HTML 태그 형태로 컴포넌트를 추가해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;최종 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1668350332722&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;root&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
  &amp;lt;script crossorigin src=&quot;https://unpkg.com/react@17.0.2/umd/react.production.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script crossorigin src=&quot;https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script type=&quot;text/babel&quot;&amp;gt;
    const root = document.getElementById(&quot;root&quot;);
    function Title() {
      return (
        &amp;lt;h3 id=&quot;title&quot; onMouseEnter={() =&amp;gt; consol.log(&quot;mouse enter&quot;)}&amp;gt;
          Hello I'm a title
        &amp;lt;/h3&amp;gt;
      );
    }

    const Button = () =&amp;gt; (
      &amp;lt;button 
        id=&quot;button&quot; 
        style={{backgroundColor: &quot;tomato&quot;,}} 
        onClick={() =&amp;gt; console.log(&quot;im clicked&quot;)}&amp;gt;
        Click me
      &amp;lt;/button&amp;gt;
    );

    const Container = () =&amp;gt; (
      &amp;lt;div&amp;gt;
        &amp;lt;Title /&amp;gt;
        &amp;lt;Button /&amp;gt;
      &amp;lt;/div&amp;gt;
    );
    ReactDOM.render(&amp;lt;Container /&amp;gt;, root);
  &amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프론트엔드/React</category>
      <author>sujin7837</author>
      <guid isPermaLink="true">https://sujin7837.tistory.com/555</guid>
      <comments>https://sujin7837.tistory.com/555#entry555comment</comments>
      <pubDate>Sun, 13 Nov 2022 23:35:58 +0900</pubDate>
    </item>
    <item>
      <title>[React] 2. Before React</title>
      <link>https://sujin7837.tistory.com/554</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;React와 React DOM import하기&lt;/h2&gt;
&lt;pre id=&quot;code_1667918635566&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;https://unpkg.com/react@18/umd/react.development.js&quot; crossorigin&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://unpkg.com/react-dom@18/umd/react-dom.development.js&quot; crossorigin&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;React JS&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Javascript를 이용하여 element를 생성하고, React JS가 그것을 HTML로 번역합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 바닐라 JS는 HTML -&amp;gt; JS 순서, 리액트는 JS -&amp;gt; HTML 순서 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ReactDOM&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ReactDOM은 React element를 HTML로 바꾸는 역할을 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1668347696115&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const h3 = React.createElement(&quot;h3&quot;, {onMouseEnter: () =&amp;gt; consol.log(&quot;mouse enter&quot;)}, &quot;Hello I'm a span&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(element, property, content) -&amp;gt; 괄호 안의 내용은 다음과 같은 의미를 갖습니다.&lt;/p&gt;</description>
      <category>프론트엔드/React</category>
      <author>sujin7837</author>
      <guid isPermaLink="true">https://sujin7837.tistory.com/554</guid>
      <comments>https://sujin7837.tistory.com/554#entry554comment</comments>
      <pubDate>Sun, 13 Nov 2022 22:55:24 +0900</pubDate>
    </item>
    <item>
      <title>[React] 1. React 설치 및 환경세팅</title>
      <link>https://sujin7837.tistory.com/553</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;React 설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Nodejs를 검색하여 LTS 버전을 설치합니다. 이때 설치 경로는 그대로 사용하는게 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Visual Studio Code를 검색하여 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 작업용 폴더를 하나 만들어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 터미널에서 3번 폴더 경로로 이동하여 아래 코드를 입력합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1667916993429&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx create-react-app 프로젝트명&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1667917237581&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// permission이 없다는 에러가 뜰 경우, 아래 코드로 입력
sudo npx create-react-app 프로젝트명&lt;/code&gt;&lt;/pre&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;h2 data-ke-size=&quot;size26&quot;&gt;Editor에서 프로젝트 오픈&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Visual Studio Code 에디터를 오픈합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. File - Open Folder - 오픈할폴더명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. App.js : 메인페이지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;브라우저 미리보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 에디터 상단 메뉴 중 Terminal - New Terminal 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. npm start 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;npx create-react-app 실행 오류&lt;/h2&gt;
&lt;pre id=&quot;code_1667917394702&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;You are running `create-react-app` 4.0.2, which is behind the latest release (4.0.3).

We no longer support global installation of Create React App.

Please remove any global installs with one of the following commands:
- npm uninstall -g create-react-app
- yarn global remove create-react-app

The latest instructions for creating a new app can be found here:
https://create-react-app.dev/docs/getting-started/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;해결법 1) 메시지대로 삭제하고 다시 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm uninstall -g create-react-app&lt;br /&gt;yarn global remove create-react-app&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;b&gt;해결법 2) 아래 실행 명령 순서대로 진행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667917522296&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. npm uninstall -g create-react-app
2. npm add create-react-app
3. 다시 npx create-react-app myapp&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;스크린샷 2022-11-08 오후 11.38.04.png&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5RGec/btrQKvg84hw/OnRF42Q71pBK9SUjFm9uR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5RGec/btrQKvg84hw/OnRF42Q71pBK9SUjFm9uR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5RGec/btrQKvg84hw/OnRF42Q71pBK9SUjFm9uR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5RGec%2FbtrQKvg84hw%2FOnRF42Q71pBK9SUjFm9uR0%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;453&quot; height=&quot;127&quot; data-filename=&quot;스크린샷 2022-11-08 오후 11.38.04.png&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;size16&quot;&gt;참고 : &lt;a href=&quot;https://velog.io/@milkyway/React-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0-You-are-running-create-react-app-4.0.2-which-is-behind-the-latest-release-4.0.3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@milkyway/React-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0-You-are-running-create-react-app-4.0.2-which-is-behind-the-latest-release-4.0.3&lt;/a&gt;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://codingapple.com/unit/react1-install-create-react-app-npx/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://codingapple.com/unit/react1-install-create-react-app-npx/&lt;/a&gt;&lt;/p&gt;</description>
      <category>프론트엔드/React</category>
      <author>sujin7837</author>
      <guid isPermaLink="true">https://sujin7837.tistory.com/553</guid>
      <comments>https://sujin7837.tistory.com/553#entry553comment</comments>
      <pubDate>Tue, 8 Nov 2022 23:39:21 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin] 흐름제어와 논리연산자</title>
      <link>https://sujin7837.tistory.com/552</link>
      <description>
&lt;h2 data-ke-size=&quot;size26&quot;&gt;흐름제어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;return&lt;/b&gt;&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;size18&quot;&gt;&lt;b&gt;break&lt;/b&gt;&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;size18&quot;&gt;&lt;b&gt;continue&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 반복 조건으로 즉시 넘어가는 역할을 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659930530868&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {
    for(i in 1..10) {
        if(i==3) continue
        println(i)
    }
}&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;코틀린은 다중 반복문에서 break나 continue가 적용되는 반복문을 label을 통해 지정할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659930545400&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {
    loop@for(i in 1..10) {
        for(j in 1..10) {
            if(i==1 &amp;amp;&amp;amp; j==2) break@loop
            println(&quot;i : $i, j : $j&quot;)
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;논리연산자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논리연산자(logical operators)는 논리 값을 연산하여 새로운 논리값을 도출할 때 쓰는 연산자입니다.&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;b&gt;&amp;amp;&amp;amp;(and 연산자)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;true &amp;amp;&amp;amp; true =&amp;gt; 둘 다 true일 때 true&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;b&gt;||(or 연산자)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;true || false =&amp;gt; 둘 중 하나라도 true일 때 true&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;b&gt;!(not 연산자)&lt;/b&gt;&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;</description>
      <category>Android</category>
      <author>sujin7837</author>
      <guid isPermaLink="true">https://sujin7837.tistory.com/552</guid>
      <comments>https://sujin7837.tistory.com/552#entry552comment</comments>
      <pubDate>Mon, 8 Aug 2022 12:53:56 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin] 반복문</title>
      <link>https://sujin7837.tistory.com/551</link>
      <description>
&lt;h2 data-ke-size=&quot;size26&quot;&gt;반복문&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;조건형 반복문&lt;/h4&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;size18&quot;&gt;&lt;b&gt;while&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659763065492&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {
	var a = 0
    
    while(a&amp;lt;5) {
        println(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;b&gt;do while&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건에 관계없이 최초 한번은 조건문 무조건 실행&lt;/p&gt;
&lt;pre id=&quot;code_1659763125719&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {
	var a = 0
    
    do {
        println(a++)
    } while(a&amp;lt;5)
}&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;/h4&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;size18&quot;&gt;&lt;b&gt;for&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1659763332493&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {
	for(i in 0..9 step 3) {
        print(i)
    }
    
    println()
    
    for(i in 9 downTo 0) {
        print(i)
    }
    
    println()
    
    for(i in 'a'..'e') {
        print(i)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1659763360564&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 결과
0369
9876543210
abcde&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;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.youtube.com/c/CHDiMo&quot;&gt;테크과학! DiMo&lt;/a&gt;&lt;/p&gt;</description>
      <category>Android</category>
      <author>sujin7837</author>
      <guid isPermaLink="true">https://sujin7837.tistory.com/551</guid>
      <comments>https://sujin7837.tistory.com/551#entry551comment</comments>
      <pubDate>Sat, 6 Aug 2022 14:23:06 +0900</pubDate>
    </item>
  </channel>
</rss>