<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>AR삽질러</title>
    <link>https://arang95.tistory.com/</link>
    <description>기록공간입니다. 
질문과 가르침 감사합니다.</description>
    <language>ko</language>
    <pubDate>Thu, 9 Apr 2026 20:44:25 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>아랑팡팡</managingEditor>
    <image>
      <title>AR삽질러</title>
      <url>https://tistory1.daumcdn.net/tistory/5940474/attach/2cd4809afd3440c19e9a8620d06b71ec</url>
      <link>https://arang95.tistory.com</link>
    </image>
    <item>
      <title>React.js</title>
      <link>https://arang95.tistory.com/427</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; React.js&lt;/b&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;b&gt;1. React.js란&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EB%A6%AC%EC%95%A1%ED%8A%B8_(%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC)&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.wikipedia.org/wiki/%EB%A6%AC%EC%95%A1%ED%8A%B8_(%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724841757011&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;리액트 (자바스크립트 라이브러리) - 위키백과, 우리 모두의 백과사전&quot; data-og-description=&quot;위키백과, 우리 모두의 백과사전. 리액트(React, React.js 또는 ReactJS)는 자바스크립트 라이브러리의 하나로서[2] 사용자 인터페이스를 만들기 위해 사용된다. 페이스북과 개별 개발자 및 기업들 공&quot; data-og-host=&quot;ko.wikipedia.org&quot; data-og-source-url=&quot;https://ko.wikipedia.org/wiki/%EB%A6%AC%EC%95%A1%ED%8A%B8_(%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC)&quot; data-og-url=&quot;https://ko.wikipedia.org/wiki/%EB%A6%AC%EC%95%A1%ED%8A%B8_(%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC)&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bKRHBF/hyWVRdoZaX/J4IJDrSQVKj9eEy4k7xzBk/img.png?width=1200&amp;amp;height=1068&amp;amp;face=0_0_1200_1068,https://scrap.kakaocdn.net/dn/cX4dw3/hyWVWlqHLr/XcrNTJTWfoKcaf65xQsyf1/img.png?width=800&amp;amp;height=712&amp;amp;face=0_0_800_712,https://scrap.kakaocdn.net/dn/lli1y/hyWV5bDqb4/soOZKOUgzGKOXBT7zY5fNk/img.png?width=640&amp;amp;height=570&amp;amp;face=0_0_640_570&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EB%A6%AC%EC%95%A1%ED%8A%B8_(%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC)&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.wikipedia.org/wiki/%EB%A6%AC%EC%95%A1%ED%8A%B8_(%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC)&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bKRHBF/hyWVRdoZaX/J4IJDrSQVKj9eEy4k7xzBk/img.png?width=1200&amp;amp;height=1068&amp;amp;face=0_0_1200_1068,https://scrap.kakaocdn.net/dn/cX4dw3/hyWVWlqHLr/XcrNTJTWfoKcaf65xQsyf1/img.png?width=800&amp;amp;height=712&amp;amp;face=0_0_800_712,https://scrap.kakaocdn.net/dn/lli1y/hyWV5bDqb4/soOZKOUgzGKOXBT7zY5fNk/img.png?width=640&amp;amp;height=570&amp;amp;face=0_0_640_570');&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;리액트 (자바스크립트 라이브러리) - 위키백과, 우리 모두의 백과사전&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;위키백과, 우리 모두의 백과사전. 리액트(React, React.js 또는 ReactJS)는 자바스크립트 라이브러리의 하나로서[2] 사용자 인터페이스를 만들기 위해 사용된다. 페이스북과 개별 개발자 및 기업들 공&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.wikipedia.org&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Meta(Facebook)에서 개발한 오픈소스 JavaScript라이브러리로 대규모 웹 서비스의 UI를 . 더편하게 개발하기 위해 만들어진 기술&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- React.js는 컴포넌트 기반 아키텍처를 사용해 복잡한 UI를 작은 컴포넌트 단위로 나누어 관리할 . 수있어 효율적인 렌더링을 위해 Virtual DOM을 도입해 웹 애플리케이션의 성능을 최적화한다.&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;대표 서비스별 기술 사용 예시&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Web Server&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Mobile App&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Desktop App&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Netflix, Airbnb&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Facebook&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Slack, Discord&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;size18&quot;&gt;&lt;b&gt;2. &lt;b&gt;React의 기술적인 특징&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2-1. 컴포넌트(Component)를 기반으로 UI를 표현한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 화면을 구성하는  독립적인 UI 요소로 각각의 컴포넌트는 자신의 상태와 로직을 관리하며 UI의 일부분을 담당한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2-2. 화면 업데이트 구현이 쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- React의 선언형 프로그래밍 : React의 선언형 프로그래밍 과정은 생략하고 목적만 간결하게 명시하는 방법으로 무엇을 할 것인지를 명시적으로 선언하는 방식이다. UI가 특정 상태에 따라 어떻게 보여야 하는지 선언하고 React가 내부적으로 이것을 처리하기 위해 자동으로 화면을 업데이트 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2-3. 화면 업데이트가 빠르게 처리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Virtual DOM 기술을 사용해 화면 업데이트를 효율적으로 처리한다. React에서는 상태변화가 발생핼 때 이 가상의 DOM에서 변경 사항을 계산하고 그 결과를 실제 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;
&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>WEB/React</category>
      <category>App</category>
      <category>javascript</category>
      <category>node.js</category>
      <category>react</category>
      <category>Web</category>
      <category>Web Server</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/427</guid>
      <comments>https://arang95.tistory.com/427#entry427comment</comments>
      <pubDate>Wed, 28 Aug 2024 20:43:14 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 동기와 비동기(19)</title>
      <link>https://arang95.tistory.com/426</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;동기와&amp;nbsp;비동기(19)&lt;/b&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;b&gt;1. 동기(Synchronous)와 비동기(Asynchronous)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-  동기와 비동기는 코드가 실행되는 방식을 설명하며 실행 흐름과 처리방식에 영향을 미치게된다.&lt;/p&gt;
&lt;pre id=&quot;code_1724409802994&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(1);
setTimeout(() =&amp;gt; {
  console.log(2);
}, 3000);

console.log(3);&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;- console.log(2), console.log(3)은 순서대로 실행되는 동기작업&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;- setTimeout(() =&amp;gt; { console.log(2); }, 3000); 는 비동기 함수로 JavaScript엔진에 의해서 호출된 후 내부적으로 타이머가 설정된다.&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. 동기(Synchronous)&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;&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;- 동기 방식은 작업이 오래 걸리거나 시간이 지연되는 경우 전체 프로그램이 문제가 될수 있다. 예로 UI가 멈추가나 웹앱이 응답하지 않는 문제가 발생할 수 있다.&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;3. 비동기(Asynchronous)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 작업이 동시에 실행될 수 있도록 관리되며 특정 작업이 완료될 때까지 기다리지 않고 다음 작업을 바로 실행한다. 콜백함수나 Promise 등을 사용해 비동기 작업이 완료된 후에 동작을 정의한다.&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;b&gt;4. 비동기 - 콜백&lt;/b&gt;&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: 55.8139%; height: 128px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.1019%;&quot; rowspan=&quot;3&quot;&gt;콜백함수의 특징&lt;/td&gt;
&lt;td style=&quot;width: 68.8981%;&quot;&gt;비동기 작업을 처리하기 위한 기본적인 방법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 68.8981%;&quot;&gt;중첩된 콜백 함수를 사용할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 68.8981%;&quot;&gt;콜백 함수가 중첩되면 콜백 지옥 문제가 발생한다.&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;pre id=&quot;code_1724409982781&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function add(a, b, callback) {
  setTimeout(() =&amp;gt; {
    const sum = a + b;
    callback(sum);
  }, 3000);
}

add(1, 2, (value) =&amp;gt; {
  console.log(value);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;add(a, b, callback)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- a, b 에서 숫자를 받아 callback에서 두수를 더해 콜백 함수로 처리한다.&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;- add함수가 호출될 때 세번째 인수로 전달되는 익명함수 (value) =&amp;gt; { console.log(value)};가 콜백 함수로 사용되고 sum값을 인수로 받아 해당 값을 콘솔에 출력하는 역할&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;b&gt;비동기 작업을 연속적으로 실행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1724410170498&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function orderFood(callback) {
  setTimeout(() =&amp;gt; {
    const food = &quot;치킨&quot;;
    callback(food);
  }, 3000);
}

function deliveryFood(food, callback) {
  setTimeout(() =&amp;gt; {
    const delivery = 주문하신 ${food} 이 배달되었습니다.;
    callback(delivery);
  }, 2000);
}

function review(food, callback) {
  setTimeout(() =&amp;gt; {
    const reviewMessage = ${food} 은 맛있었나요? 리뷰를 작성해주세요!;
    callback(reviewMessage);
  }, 1500);
}

orderFood((food) =&amp;gt; {
  console.log(food);

  deliveryFood(food, (delivery) =&amp;gt; {
    console.log(delivery);

    review(delivery, (reviewMessage) =&amp;gt; {
      console.log(reviewMessage);
    });
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;orderFood(callback)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 3초뒤에 &quot;치킨&quot;을 준비하고 콜백함수로 전달해 출력한다.&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;deliveryFood(food, callback)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- orderFood() 함수의 결과인 food를 받아 2초후 메시지를 생성하고 콜백함수로 전달한다.&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;review(food, callback)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- deliveryFood() 함수의 결과인 배달 메시지를 받아 1.5초 후 메시지를 생성하고 콜백함수로 전달한다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;orderFood(food)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 콜백으로 전달된 food 값을 받아 출력한후 deliveryFood() 함수가 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;deliveryFood()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 콜백에서 메시지를 출력한 후 review()함수가 실행된다.&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;4-1. 콜백지옥&lt;/b&gt;&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: 54.8838%; height: 57px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 46.086%; height: 57px; text-align: center;&quot; rowspan=&quot;3&quot;&gt;콜백지옥의 특징&lt;/td&gt;
&lt;td style=&quot;width: 53.914%; height: 19px;&quot;&gt;중첩된 구조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 53.914%; height: 19px;&quot;&gt;복잡성 증가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 53.914%; height: 19px;&quot;&gt;가독성 문제&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;5. 비동기 - Promise&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Promise는 비동기 작업을 감싸는 객체로 비동기 작업의 성공 또는 실패 여부를 표현하고 이를 처리하는 방식으로 콜백지옥 문제를 해결할 수 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 55.5814%; height: 98px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 45.3975%; text-align: center;&quot; rowspan=&quot;3&quot;&gt;Promise의 특징&lt;/td&gt;
&lt;td style=&quot;width: 147.021%;&quot;&gt;상태관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 147.021%;&quot;&gt;체이닝&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 147.021%;&quot;&gt;에러처리&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;table style=&quot;border-collapse: collapse; width: 73.8372%; height: 83px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 34.1207%; text-align: center;&quot; rowspan=&quot;3&quot;&gt;Promise의 3가지 상태&lt;/td&gt;
&lt;td style=&quot;width: 25.1443%; text-align: center;&quot;&gt;대기(Pending)&lt;/td&gt;
&lt;td style=&quot;width: 40.7349%;&quot;&gt;아직 작업이 완료되지 않은 상태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1443%; text-align: center;&quot;&gt;성공(Fulfilled)&lt;/td&gt;
&lt;td style=&quot;width: 40.7349%;&quot;&gt;비동기 작업이 성공적으로 마무리 된 상태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1443%; text-align: center;&quot;&gt;실패(Rejected)&lt;/td&gt;
&lt;td style=&quot;width: 40.7349%;&quot;&gt;비동기 작업이 실패한 상태&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;b&gt;Promise 체이닝&lt;/b&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;&amp;nbsp;- then()메서드로 새로운 Promise객체를 반환해 다음 then()에서 이를 받아 또 다른 비동기 작업을 실행할 수 있도록한다.&lt;/p&gt;
&lt;pre id=&quot;code_1724413065962&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;promise
  .then((result) =&amp;gt; {
    console.log(result);
    return addNumber(result);
  })
  .then((result) =&amp;gt; {
    console.log(result);
    return addNumber(null);
  })
  .then((result) =&amp;gt; {
    console.log(result);
  })
  .catch((error) =&amp;gt; {
    console.log(error);
  });&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;&lt;b&gt;Promise&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1724411846325&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function addNumber(num) {
  const promise = new Promise((resolve, reject) =&amp;gt; {
    setTimeout(() =&amp;gt; {
      if (typeof num === &quot;number&quot;) {
        resolve(num + 10);
      } else {
        reject(&quot;num은 숫자가 아닙니다.&quot;);
      }
    }, 3000);
  });
  return promise;
}

const p = addNumber(0);
p.then((result) =&amp;gt; {
  console.log(result);
  return addNumber(result);
})
  .then((result) =&amp;gt; {
    console.log(result);
    return addNumber(null);
  })
  .then((result) =&amp;gt; {
    console.log(result);
  })
  .catch((error) =&amp;gt; {
    console.log(error);
  });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;addNumber(num)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- promise객체를 생성해 반환한다. Promise는 3초뒤 resolve(), reject()반환하는 비동기 작업이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- resolve() 는 num 숫자이면 호출되어 num + 10 결과를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- reject()는 num이 숫자가 아닐때 호출되어 오류메시지를 반환한다.&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;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;b&gt;6. 비동기 - async, await&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &lt;b&gt;async, await를 &lt;/b&gt;사용해 비동기 코드를 동기 코드 처럼 작성할 수 있고 Promise체이닝보다 더 간결하고 직관적이게 코드를 작성할 수 있다.&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;6-1. async&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 함수를 비동기 함수로 만들어주는 키워드로 함수가 Promise를 반환하도록 변환해주는 키워드로 함수 앞에 async키워드를 붙여 자동으로 Promise를 반환하게 한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724591334626&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function getDate() {
  return {
    name: &quot;AR&quot;,
    id: &quot;arangs&quot;,
  };
}
console.log(getDate());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getDate() 함수는 async()로 정의되어 있어 자동으로 Promise를 반환하고 이 결과는 then()으로 처리가 가능한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMzxzt/btsJfmrzO9p/KIXEYaKZgRFIr3JUdcKVR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMzxzt/btsJfmrzO9p/KIXEYaKZgRFIr3JUdcKVR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMzxzt/btsJfmrzO9p/KIXEYaKZgRFIr3JUdcKVR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMzxzt%2FbtsJfmrzO9p%2FKIXEYaKZgRFIr3JUdcKVR1%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;275&quot; height=&quot;253&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;253&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;b&gt;6-2. await&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Promise가 처리될 때까지 기다리는 역할로 await는 async함수 내부에서만 사용이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- await키워드는 Promise가 resolve될 때까지 기다린후 그 결과 값을 반환해 비동기 작업을 수행하고 await키워드를 사용해 동키 코드처럼 결과를 기다렸다가 다음 코드를 실행할 수 있도록 해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1724592329402&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function getData() {
  return new Promise((resolve, reject) =&amp;gt; {
    setTimeout(() =&amp;gt; {
      resolve({
        name: &quot;AR&quot;,
        id: &quot;arangs&quot;,
      });
    }, 1500);
  });
}

async function printData() {
  const data = await getData();
  console.log(data);
}

printData();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;async함수는 항상 Promise를 반환하며 함수 내에서 return을 사용해 해당 값이 Promise.resolve()로 감싸져 반환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;async함수 내에서는 await키워드를 사용해 비동기 작업을 기다린 후 결과를 처리할 수 있다.&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;await키워드는 함수 내부에서만 사용할 수 있다. 또, await키워드는 비동기 작업이 완료될때 까지 기다렸다가 결과를 반환한다. await는 Promise객체 앞에서 사용되며 비동기 작업의 완료를 기다린후에 다음 코드를 실행할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;279&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y717i/btsJe90nHUx/Y54GDvtvfLNqDvELaz4Pu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y717i/btsJe90nHUx/Y54GDvtvfLNqDvELaz4Pu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y717i/btsJe90nHUx/Y54GDvtvfLNqDvELaz4Pu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy717i%2FbtsJe90nHUx%2FY54GDvtvfLNqDvELaz4Pu1%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;279&quot; height=&quot;129&quot; data-origin-width=&quot;279&quot; data-origin-height=&quot;129&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;</description>
      <category>WEB/JavaScript</category>
      <category>Asychronous</category>
      <category>java</category>
      <category>javascript</category>
      <category>synchronous</category>
      <category>동기</category>
      <category>동기와 비동기</category>
      <category>비동기</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/426</guid>
      <comments>https://arang95.tistory.com/426#entry426comment</comments>
      <pubDate>Sun, 25 Aug 2024 22:28:39 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - Date객체와 날짜(18)</title>
      <link>https://arang95.tistory.com/425</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;Date객체와&amp;nbsp;날짜(18)&lt;/b&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;b&gt;1. Date객체와&amp;nbsp;날짜&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Date객체는 날짜와 시간을 다룰 수 있는 도구로 Date객체를 사용하면 현재 날짜와 시간, 특정 날짜와 시간을 생성하거나 날짜간의 차리를 계산하는 등의 작업이 가능하다.&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;1-1. 기본 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1724343409882&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let now = new Date();
console.log(now);&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;1-2. 특정날짜로 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- month는 0부터 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- year는 4자리 숫자로 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 나머지 매개변수는 생략가능하며 생략시 값은 0이 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1724343617626&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let date1 = new Date();
let date2 = new Date(&quot;2024/08/22&quot;);
let date2 = new Date(&quot;2024,08,22,12,00,00&quot;);
console.log(date1);
console.log(date2);&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;2. 타임 스탬프&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 1970년 01월 01일 00시 00분 00초 이후의 밀리초(타임스탬프)를 전달해 Date객체를 생성할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1724343928473&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let ts1 = date1.getTime();
console.log(ts1);
let date4 = new Date(ts1);
console.log(date1, date4);&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;3. Date객체로 부터 시간 요소들을 추출하는 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- getMonth()의 경우 객체에서 월을 추출할때 0부터 시작하므로 실제 월을 얻기 위해서 1을 더해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1724344077102&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let year = date1.getFullYear();
let month = date1.getMonth() + 1;
let date = date1.getDate();
let hour = date1.getHours();
let minute = date1.getMinutes();
let seconds = date1.getSeconds();

console.log(year, month, date, hour, minute, seconds);&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;4. Date객체로 부터 시간 수정하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- date객체에서 날짜와 시간을 변경할때는 set을 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1724344357101&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;date1.setFullYear(2000);
date1.setMonth(2);
date1.setDate(20);
date1.setHours(22);
console.log(date1);&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;5. 시간 여러 포맷으로 출력하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- toDateString()은 객체의 날짜를 사람이 읽을 수 있는 문자열 형식으로 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- toLocalDateString()은 국가 및 언어 설정에 따라 다르게 반환된다.&lt;/p&gt;
&lt;pre id=&quot;code_1724344464824&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(date1.toDateString());
console.log(date1.toLocaleDateString());&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;&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>WEB/JavaScript</category>
      <category>Date</category>
      <category>date객체와 날짜</category>
      <category>javascript</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/425</guid>
      <comments>https://arang95.tistory.com/425#entry425comment</comments>
      <pubDate>Fri, 23 Aug 2024 01:34:30 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 배열 메서드(17)</title>
      <link>https://arang95.tistory.com/424</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;배열&amp;nbsp;메서드(17)&lt;/b&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;b&gt;1. 배열&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 여러개의 값을 순서대로 저장할 수 있는 자료구조로 각 값에는 index로 접근할 수 있다.&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;pre id=&quot;code_1724311751849&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr = [1, 2, 3];
console.log(arr.length);
console.log(arr[0]);
console.log(arr[1]);
console.log(arr[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;b&gt;2. 배열 - 요소 조작&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;push메서드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 배열의 끝에 요소를 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1724312098887&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr1 = [1, 2, 3];
const newLength = arr1.push(4, 5, 6, 7);

console.log(newLength);
console.log(arr1);&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;pop메서드&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;pre id=&quot;code_1724312232142&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr2 = [1, 2, 3];
const popedItem = arr2.pop();

console.log(popedItem);
console.log(arr2);&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;shift&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;pre id=&quot;code_1724312405056&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr3 = [1, 2, 3];
const shiftedItem = arr1.shift();
console.log(shiftedItem, arr3);&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;unshift&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;pre id=&quot;code_1724312541708&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr4 = [1, 2, 3];
const newLength2 = arr4.unshift(0);
console.log(newLength2, arr4);&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;slice&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;pre id=&quot;code_1724312988491&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr5 = [1, 2, 3, 4, 5];
let sliced = arr5.slice(2, 5);
console.log(sliced);
console.log(arr5);

let sliced2 = arr5.slice(2);
console.log(sliced2);

let sliced3 = arr5.slice(-2);
console.log(sliced3);&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;concat&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;pre id=&quot;code_1724313110587&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr6 = [1, 2];
let arr7 = [3, 4];
let concatedItem = arr6.concat(arr7);
console.log(concatedItem);&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;3. 배열 - 순회와 탐색&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;forEach&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 모든 요소를 순회하면서 각 요소에 특정 동작을 수행시키는 메서드&lt;/p&gt;
&lt;pre id=&quot;code_1724324817459&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr1 = [1, 2, 3];

arr1.forEach(function (item, idx, arr) {
  console.log(idx, item * 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;includes&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;- 반환값 : boolean&lt;/p&gt;
&lt;pre id=&quot;code_1724325103628&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr2 = [1, 2, 3];
let isInclude = arr2.includes(30);
console.log(isInclude);&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;indexOf&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 특정 요소의 인덱스(위치)를 찾아서 반환하며 요소가 없다면 -1을 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 반환값 : 첫번째로 일치하는 요소의 인덱스&lt;/p&gt;
&lt;pre id=&quot;code_1724325293635&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr3 = [2, 2, 20];
let index = arr3.indexOf(20);
console.log(index);&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;findIndex&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 조건을 만족하는 첫번째 요소의 인덱스를 반환한다. 조건을 만족하는 요소가 없으면 -1을 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 반환값 : 첫번째로 조건을 만족하는 요소의 인덱스&lt;/p&gt;
&lt;pre id=&quot;code_1724325908596&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr4 = [1, 2, 3];
const findedIndex = arr4.findIndex((item) =&amp;gt; {
  if (item % 2 !== 0) return true;
});
console.log(findedIndex);&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;find&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 조건을 만족하는 첫번째 요소를 반환한다. 조건을 만족하는 요소가 없으면 undefind를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 반환값 : 첫 번째로 조건을 만족하는 요소&lt;/p&gt;
&lt;pre id=&quot;code_1724326138536&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr5 = [{ name: &quot;AR&quot; }, { name: &quot;arang&quot; }];
const finded = arr5.find((item) =&amp;gt; item.name === &quot;AR&quot;);
console.log(finded);&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;b&gt;4. 변형&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;filter&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;pre id=&quot;code_1724329132187&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr1 = [
  { name: &quot;피카츄&quot;, type: &quot;전기&quot; },
  { name: &quot;파이리&quot;, type: &quot;불&quot; },
  { name: &quot;이상해씨&quot;, type: &quot;풀&quot; },
];

const pokemon = arr1.filter((item) =&amp;gt; item.type == &quot;전기&quot;);
console.log(pokemon);&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;map&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;pre id=&quot;code_1724329820502&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr2 = [1, 2, 3];
const mapResult1 = arr2.map((item, idx, arr) =&amp;gt; {
  return item * 2;
});

let names = arr1.map((items) =&amp;gt; items.name);
console.log(names);&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;sort&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 배열을 사전순으로 정렬하는 메서드&lt;/p&gt;
&lt;pre id=&quot;code_1724332682364&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr3 = [&quot;a&quot;, &quot;c&quot;, &quot;b&quot;];
arr3.sort();
console.log(arr3);&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;
&lt;pre id=&quot;code_1724332881417&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr3 = [10, 3, 5];
arr3.sort((a, b) =&amp;gt; {
  if (a &amp;gt; b) {
    return 1; // b가 a앞에
  } else if (a &amp;lt; b) {
    return -1; // a가 b 앞에
  } else {
    return 0; // 자리 유지
  }
});
console.log(arr3);&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_1724332925405&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr3 = [10, 3, 5];
arr3.sort((a, b) =&amp;gt; {
  if (a &amp;gt; b) {
    return -1; // b가 a앞에
  } else if (a &amp;lt; b) {
    return 1; // a가 b 앞에
  } else {
    return 0; // 자리 유지
  }
});
console.log(arr3);&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;toSorted&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;- sort와 동일하게 배열을 사전순을 정렬하지만 정렬된 새로운 배열을 반환하는 메서드&lt;/p&gt;
&lt;pre id=&quot;code_1724333236505&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr5 = [&quot;c&quot;, &quot;a&quot;, &quot;b&quot;];
const sorted = arr5.toSorted();

console.log(arr5);
console.log(sorted);&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;join&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;pre id=&quot;code_1724333373996&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr5 = [&quot;c&quot;, &quot;a&quot;, &quot;b&quot;];
const sorted = arr5.toSorted();

console.log(arr5);
console.log(sorted);

let arr6 = [&quot;hello&quot;, &quot;jini&quot;, &quot;woo&quot;];
const joined = arr6.join(&quot; &quot;);
console.log(joined);&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;</description>
      <category>WEB/JavaScript</category>
      <category>javascript</category>
      <category>객체와 날짜</category>
      <category>배열</category>
      <category>배열 메서드</category>
      <category>배열변형</category>
      <category>순회와탐색</category>
      <category>요소조작</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/424</guid>
      <comments>https://arang95.tistory.com/424#entry424comment</comments>
      <pubDate>Thu, 22 Aug 2024 22:29:46 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript -  원시타입과 객체타입(16)</title>
      <link>https://arang95.tistory.com/423</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;&amp;nbsp;원시타입과&amp;nbsp;객체타입(16)&lt;/b&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;b&gt;1. 원시타입(Primitive Type)과 객체타입(Object Type)&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;원시타입 : Number, String, Boolean, Null, Undefind&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;객체타입 : Object(Array, Function, RegexExp)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- JavaScript에서 값은 두가지로 나뉘며 두 타입은 메모리에서 값이 어떻게 저장되고 처리되는지에 차이가 있다.&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. 원시타입(Primitive Type)&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;&amp;nbsp;- 불변값으로 메모리 값 수정이 불가능&lt;/p&gt;
&lt;pre id=&quot;code_1724292867304&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a = 10;
let b = a;
b = 20;
console.log(a);
console.log(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;b&gt;3. 객체타입(Object Type)&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;&amp;nbsp;- 가변값으로 메모리 값 수정 가능&lt;/p&gt;
&lt;pre id=&quot;code_1724292958634&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let obj1 = { name: &quot;AR&quot; };
console.log(obj1.name);
let obj2 = obj1;
obj2.name = &quot;Arang&quot;;
console.log(obj1.name);
console.log(obj2.name);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- obj1과 obj2는 같은 객체를 참조하고 있기 때문에 obj2의 속성을 변경하면 obj1의 속성도 변경된다.&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;pre id=&quot;code_1724292394787&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let o1 = {name: &quot;AR&quot;}
let o2 = 01;&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;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;pre id=&quot;code_1724292418256&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let o1 = {name: &quot;AR&quot;}
let 02 = {...o1};&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;&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>WEB/JavaScript</category>
      <category>javascript</category>
      <category>object type</category>
      <category>primitive type</category>
      <category>객체타입</category>
      <category>원시타입</category>
      <category>원시타입과 객체타입</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/423</guid>
      <comments>https://arang95.tistory.com/423#entry423comment</comments>
      <pubDate>Thu, 22 Aug 2024 12:47:39 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - Spread연산자와 Rest매개변수 (15)</title>
      <link>https://arang95.tistory.com/422</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; Spread연산자와 Rest매개변수&lt;/b&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;b&gt;1. JavaScript&amp;nbsp;-&amp;nbsp; Spread연산자와&amp;nbsp;Rest매개변수란&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. Spread연산자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 배열이나 객체의 요소들을 개별적으로 펼쳐서 다른 배열이나 객체에 복사하거나 함수의 인수로 전달할 때 사용된다.&lt;/p&gt;
&lt;pre id=&quot;code_1724145788575&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr1 = [1, 2, 3];
let arr2 = [4, ...arr1, 5, 6];
console.log(arr2);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;...arr1는 arr1배열의 요소들인 [1, 2, 3]을 개별 요소로 펼친다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열 arr2의 다른 요소들과 결합되어 [4, 1, 2, 3, 5, 6]이라는 새로운 배열이 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724146472172&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let obj1 = { a: 1, b: 2 };
let obj2 = { ...obj1, c: 3, c: 4 };
console.log(obj2);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;...obj1객체의 속성들을 펼쳐서 새로운 객체 obj2에 복사한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 { a: 1, b: 2, c: 4} 객체가 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724147148725&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function funcA(p1, p2, p3) {
  console.log(p1, p2, p3);
}

funcA(...arr1);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;...arr1의 요소들인 [1, 2, 3,]을 개별 인수로 펼쳐서 함수 funcA에 전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한수 funcA는 p1 = 1, p2 = 2, p3 =3 인수로 받게되고 결과적으로 1 2 3이 출력된다.&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-origin-width=&quot;269&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MuaVO/btsI8p4t322/AxKfbemFD53kqTT4ykGQ10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MuaVO/btsI8p4t322/AxKfbemFD53kqTT4ykGQ10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MuaVO/btsI8p4t322/AxKfbemFD53kqTT4ykGQ10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMuaVO%2FbtsI8p4t322%2FAxKfbemFD53kqTT4ykGQ10%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;269&quot; height=&quot;126&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. Rest 매개변수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Rest 매개변수는 함수 정의에서 사용되는 문법으로 함수가 전달받은 나머지 인수들을 하나의 배열로 모아주는 역할을 한다. 나머지, 나머지 매개변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724148547366&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function funcB(one, ...rest) {
  console.log(rest);
}
funcB(...arr1);&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;funcB 함수는 one을 받고 나머지 인수들은 rest라는 배열로 모으게 되는데 one에 첫번째 인수가 할당되면 그외 나머지 인수들은 모두 rest배열에 담긴다.&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;funcB(...arr1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- arr1 배열의 값이 [1, 2, 3]일때 funcB(one에 1을 할당하고 나머지 2, 3을 rest배열로 받게된다.&lt;/p&gt;</description>
      <category>WEB/JavaScript</category>
      <category>javascript</category>
      <category>rest매개변수</category>
      <category>spread연산자</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/422</guid>
      <comments>https://arang95.tistory.com/422#entry422comment</comments>
      <pubDate>Tue, 20 Aug 2024 19:11:04 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 구조분해할당(Destructuring Assignment) (14)</title>
      <link>https://arang95.tistory.com/421</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript&amp;nbsp;-&amp;nbsp;구조분해할당(Destructuring&amp;nbsp;Assignment)&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;1. 구조분해할당(Destructuring&amp;nbsp;Assignment)란?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 배열이나 객체 등 복합적인 데이터 구조에서 개별 요소를 추출해 변수에 쉽게 할당하는 방법이다.&lt;/p&gt;
&lt;pre id=&quot;code_1724142830478&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let ary = [1, 2, 3];

let [one, two, three, four = 4] = ary;
console.log(one, two, three);
console.log(one, two);
console.log(one, two, three, four);&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;- 배열에 없는 네 번쨰 요소는 기본값인 4가 할당되고 기본값이 설정되지 않은 요소는 undefined가 추출된다.&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-origin-width=&quot;591&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZaU4v/btsI8124WvZ/RmojLJVLAi7QQIvkuj4b81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZaU4v/btsI8124WvZ/RmojLJVLAi7QQIvkuj4b81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZaU4v/btsI8124WvZ/RmojLJVLAi7QQIvkuj4b81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZaU4v%2FbtsI8124WvZ%2FRmojLJVLAi7QQIvkuj4b81%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;591&quot; height=&quot;137&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;137&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;b&gt;2. 객체의 구조분해할당&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 객체의 속성이름과 다른 변수이름으로 할당할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1724143130769&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let person = {
  name: &quot;AR&quot;,
  age: 22,
  hobby: &quot;운동&quot;,
};

let { age: myAge, hobby, name, talk = &quot;hello&quot; } = person;
console.log(name, myAge, hobby, talk);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- age: myAge는 person객체의 age속성값을 myAge변수에 할당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- talk속성은 person객체에 없기 때문에 기본값인 hello가 할당된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4AiGp/btsJamY0Y1j/gx38vFbLB4ks53jK4fhNDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4AiGp/btsJamY0Y1j/gx38vFbLB4ks53jK4fhNDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4AiGp/btsJamY0Y1j/gx38vFbLB4ks53jK4fhNDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4AiGp%2FbtsJamY0Y1j%2Fgx38vFbLB4ks53jK4fhNDk%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;278&quot; height=&quot;127&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;127&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;b&gt;3. 객체 구조 분해 할당을 이용한 함수의 매개변수를 받는 방법&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1724143825852&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let person = {
  name: &quot;AR&quot;,
  age: 22,
  hobby: &quot;운동&quot;,
};

let { age: myAge, hobby, talk = &quot;hello&quot; } = person;

const func = ({ name, age: myAge, hobby, talk = &quot;hi&quot; }) =&amp;gt; {
  console.log(name, myAge, hobby, talk);
};

func(person);&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;- func(person) 호출시 person객체에서 구조분해 할당으로 필요한 속성을 추출한뒤 name, age, hobby, talk 값을 콘솔에 출력한다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;264&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XS8sI/btsJaeUpMGM/oIGi9y3aEqWTnf9gC9Bx90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XS8sI/btsJaeUpMGM/oIGi9y3aEqWTnf9gC9Bx90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XS8sI/btsJaeUpMGM/oIGi9y3aEqWTnf9gC9Bx90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXS8sI%2FbtsJaeUpMGM%2FoIGi9y3aEqWTnf9gC9Bx90%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;264&quot; height=&quot;75&quot; data-origin-width=&quot;264&quot; data-origin-height=&quot;75&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;</description>
      <category>WEB/JavaScript</category>
      <category>Destructuring assignment</category>
      <category>javascript</category>
      <category>구조분해할당</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/421</guid>
      <comments>https://arang95.tistory.com/421#entry421comment</comments>
      <pubDate>Tue, 20 Aug 2024 17:59:41 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 단락평가(Short-circuit Evaluation) (13)</title>
      <link>https://arang95.tistory.com/420</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;단락평가(Short-circuit&amp;nbsp;Evaluation)&lt;/b&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;b&gt;1. 단락평가(Short-circuit Evaluation)란&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 논리연산자 &amp;amp;&amp;amp;, || 가 평가 도중에 불필요한 연산을 생락하는 것으로 성능을 최적화하고 코드를 간결하게 작성하는데 유용하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 논지연산자가 좌항의 값만으로 결과를 결정할 수 있을 경우 우항의 표현식은 평가하지 않고 결과를 반환하는 것을 의미한다.&lt;/p&gt;
&lt;pre id=&quot;code_1723715934793&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let varA = false;
let varB = true;

console.log(varA &amp;amp;&amp;amp; varB);
console.log(varA || varB);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;varA &amp;amp;&amp;amp; varB
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;varA가 false이기 때문에 varB는 평가되지 않고 결과는 false가 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;varA || varB
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;varA가 false이기 때문에 varB가 평가되고 결과는 true가 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;amp;&amp;amp;(AND) 연산자는 &lt;b&gt;좌항&lt;/b&gt;이 &lt;b&gt;Falsy&lt;/b&gt; 값일 경우, &lt;b&gt;우항을 평가하지 않고&lt;/b&gt; 바로 &lt;b&gt;좌항&lt;/b&gt;의 값을 반환합니다. 좌항이 &lt;b&gt;Truthy&lt;/b&gt; 값일 경우, &lt;b&gt;우항&lt;/b&gt;을 평가하여 그 &lt;b&gt;결과&lt;/b&gt;를 반환합니다.&lt;/li&gt;
&lt;li&gt;||(OR) 연산자는 &lt;b&gt;좌항&lt;/b&gt;이 &lt;b&gt;Truthy&lt;/b&gt; 값일 경우, &lt;b&gt;우항을 평가하지 않고&lt;/b&gt; 바로 &lt;b&gt;좌항&lt;/b&gt;의 값을 반환합니다. 좌항이 &lt;b&gt;Falsy&lt;/b&gt; 값일 경우, &lt;b&gt;우항&lt;/b&gt;을 평가하여 그 &lt;b&gt;결과&lt;/b&gt;를 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. || (OR) 연산자의 단락 평가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1723716625492&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function returnFalse() {
  console.log(&quot;False함수&quot;);
  return false;
}

function returnTrue() {
  console.log(&quot;True함수&quot;);
  return true;
}

console.log(returnFalse() &amp;amp;&amp;amp; returnTrue());&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;- returnFalse 함수가 먼저 호출되어 False함수 메시지를 출력후 false를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 좌항이 Falsy값이기 때문에 우항을 평가하지 않아 returnTrue()함수는 호출되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBMS7T/btsI4khoSHf/T3ycBTnH4Q02RfSxRnSMJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBMS7T/btsI4khoSHf/T3ycBTnH4Q02RfSxRnSMJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBMS7T/btsI4khoSHf/T3ycBTnH4Q02RfSxRnSMJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBMS7T%2FbtsI4khoSHf%2FT3ycBTnH4Q02RfSxRnSMJ0%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;566&quot; height=&quot;120&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;120&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;pre id=&quot;code_1723717053940&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(returnTrue() &amp;amp;&amp;amp; returnFalse());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- returnTrue 함수가 먼저 호출되어 True함수 메시지를 출력한 후 true를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &amp;amp;&amp;amp; 연산자는 좌항이 Truthy값일 경우 우항을 평가해 returnFasle() 함수도 호출된다.&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-origin-width=&quot;559&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eKZ4Mf/btsI4QmPxaY/q9QmxRSKYDnGjf5FeEGs4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eKZ4Mf/btsI4QmPxaY/q9QmxRSKYDnGjf5FeEGs4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eKZ4Mf/btsI4QmPxaY/q9QmxRSKYDnGjf5FeEGs4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeKZ4Mf%2FbtsI4QmPxaY%2Fq9QmxRSKYDnGjf5FeEGs4k%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;559&quot; height=&quot;141&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;141&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;pre id=&quot;code_1723717311421&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function returnFalse() {
  console.log(&quot;False함수&quot;);
  return undefined;
}

function returnTrue() {
  console.log(&quot;True함수&quot;);
  return 100;
}

console.log(returnTrue() || returnFalse());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;returnFalse()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- False함수 메시지를 출력하고 undefined를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;returnTrue()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- True함수 메시지를 출력하고 100을 반환한다.&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;returnTrue()함수가 먼저 호출되고 True함수 메시지를 출력한후 100을 반환하는데 좌항이 Truthy값이라면 우항을 평가하지 않는다. 100은 Truthy값으로 returnFalse함수는 호출되지 않는다.&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;b&gt;3. 단락평가 예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1724119409791&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function printUserName(person) {
  const name = person &amp;amp;&amp;amp; person.name;
  console.log(name || &quot;person의 값이 없습니다.&quot;);
}

printUserName();
printUserName({ name: &quot;AR&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;person &amp;amp;&amp;amp; person.name&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- persion이 전달되었을 때만 persion.name을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- name이 없다면 person의 값이 없습니다. 라는 기본 메시지를 출력하게된다.&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;printUserName();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- person을 전달하지 않아 undefined가 된다.&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;amp;&amp;amp;연산자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- person &amp;amp;&amp;amp; person.name 에서 person이 존재하면 person.name의 값을 그렇지 않을 경우 undefined로 처리된다.&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;- console.log(name || &quot;person의 값이 없습니다.&quot;); 에서 name이 없다면 메지시를 출력하게된다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F7bzg/btsI3UjeetO/fXdau50MQaGxKddAAEBMQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F7bzg/btsI3UjeetO/fXdau50MQaGxKddAAEBMQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F7bzg/btsI3UjeetO/fXdau50MQaGxKddAAEBMQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF7bzg%2FbtsI3UjeetO%2FfXdau50MQaGxKddAAEBMQK%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;589&quot; height=&quot;121&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;121&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;</description>
      <category>WEB/JavaScript</category>
      <category>javascript</category>
      <category>short-circuit evaluation</category>
      <category>단락평가</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/420</guid>
      <comments>https://arang95.tistory.com/420#entry420comment</comments>
      <pubDate>Tue, 20 Aug 2024 11:28:16 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - Truthy와 Falsy (12)</title>
      <link>https://arang95.tistory.com/419</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;Truthy와&amp;nbsp;Falsy&amp;nbsp;(12)&lt;/b&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;b&gt;1. Truthy &amp;amp; Falsy란&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- JavaScript에서 값이 Boolean일때 어떻게 평가되는지 나타내며 참이나 거짓을 의미하지 않는 값이라도 조건문 내에서 참이나 거짓으로 평가하는 특징 &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. Falsy한 값&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Falsy값은 불리언 문맥에서 false로 평가되는 값으로 if조건문이나 논리 연산에서 false처럼 동작한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;false&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;boolean&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&quot;&quot;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;빈 문자열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;숫자 0&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;null&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;값이 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;-0&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;음수&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;undefined&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;정의되지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;0n&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Bigint 0&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;NaN&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Not-a-Number&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;pre id=&quot;code_1723713729777&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. Falsy한 값
let f1 = undefined;
let f2 = null;
let f3 = 0;
let f4 = -0;
let f5 = NaN;
let f6 = &quot;&quot;;
let f7 = 0n;

if (!f1) {
  console.log(&quot;falsy&quot;);
}

if (!f2) {
  console.log(&quot;falsy&quot;);
}

if (!f3) {
  console.log(&quot;falsy&quot;);
}

if (!f4) {
  console.log(&quot;falsy&quot;);
}

if (!f5) {
  console.log(&quot;falsy&quot;);
}

if (!f6) {
  console.log(&quot;falsy&quot;);
}

if (!f7) {
  console.log(&quot;falsy&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wJdN5/btsI6ivB6lR/Yzk9II1fz9jlzRHnolyJ6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wJdN5/btsI6ivB6lR/Yzk9II1fz9jlzRHnolyJ6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wJdN5/btsI6ivB6lR/Yzk9II1fz9jlzRHnolyJ6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwJdN5%2FbtsI6ivB6lR%2FYzk9II1fz9jlzRHnolyJ6k%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;889&quot; height=&quot;206&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;206&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;b&gt;3. Truthy&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 7가지 Falsy한 값들을 제외한 나머지 모든 값&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;true&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;boolean&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;객체&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;모든 객체(배열 포함)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;number&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;0이 아닌 모든 숫자&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;함수&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;모든 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;string&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;빈 문자열이 아닌 모든 문자열&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Bigint&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;0n 이 아닌 모든 Bigint&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;pre id=&quot;code_1723713974772&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let t1 = &quot;hello&quot;;
let t2 = &quot;123&quot;;
let t3 = [];
let t4 = {};
let t5 = () =&amp;gt; {};

if (t5) {
  console.log(&quot;Truthy&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;size18&quot;&gt;&lt;b&gt;4. Falsy한 값을 활용해 기본값을 설정하고 사용자 입력이 없을 경우 기본값을 출력하는 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1723714779453&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function getUserName(person) {
  if (!person) {
    console.log(&quot;person의 값이 없습니다.&quot;);
    return;
  }
  console.log(person.name);
}

let person = { name: &quot;AR&quot; };
getUserName(person);
getUserName(&quot;&quot;);
getUserName();&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;getUserName(person)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- person이 Falsy인지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- person값이 undefined, null, 빈문자열, &quot;&quot;, 0, NaN, false 같은 Falsy한 값이라면 설정된 값을 출력하고 함수를 종료한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnxwVw/btsI6A3Ta0M/rYNpUfzeBkU97jMvuH1uPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnxwVw/btsI6A3Ta0M/rYNpUfzeBkU97jMvuH1uPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnxwVw/btsI6A3Ta0M/rYNpUfzeBkU97jMvuH1uPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnxwVw%2FbtsI6A3Ta0M%2FrYNpUfzeBkU97jMvuH1uPK%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;651&quot; height=&quot;134&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;134&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;
&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>WEB/JavaScript</category>
      <category>falsy</category>
      <category>javascript</category>
      <category>truthy</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/419</guid>
      <comments>https://arang95.tistory.com/419#entry419comment</comments>
      <pubDate>Thu, 15 Aug 2024 18:46:47 +0900</pubDate>
    </item>
    <item>
      <title>초파 로봇 1, 2, 3, 4, 5호 (36)</title>
      <link>https://arang95.tistory.com/418</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;초파&amp;nbsp;로봇&amp;nbsp;1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4,&amp;nbsp;5호&amp;nbsp;(36)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-36-26 006.jpeg&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;1428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAlDfv/btsISKyPkxo/XQGDUlysUkmlXFRK367kMK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAlDfv/btsISKyPkxo/XQGDUlysUkmlXFRK367kMK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAlDfv/btsISKyPkxo/XQGDUlysUkmlXFRK367kMK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAlDfv%2FbtsISKyPkxo%2FXQGDUlysUkmlXFRK367kMK%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;564&quot; height=&quot;752&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-36-26 006.jpeg&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;1428&quot;/&gt;&lt;/span&gt;&lt;/figure&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;b&gt;초파 로봇 1, 2, 3, 4, 5호&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;조립시간 : 약 1시간&lt;/b&gt;&lt;br /&gt;&lt;b&gt;가격&amp;nbsp; : 1, 2, 3, 4, 5호 9,600원 * 5&lt;/b&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_KakaoTalk_Photo_2024-07-30-11-19-15 002.jpeg&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;1014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cP0t8V/btsIPZdC8FD/bCNNWlgEoXdHv8rUSrYBP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cP0t8V/btsIPZdC8FD/bCNNWlgEoXdHv8rUSrYBP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cP0t8V/btsIPZdC8FD/bCNNWlgEoXdHv8rUSrYBP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcP0t8V%2FbtsIPZdC8FD%2FbCNNWlgEoXdHv8rUSrYBP0%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;556&quot; height=&quot;537&quot; data-filename=&quot;edited_KakaoTalk_Photo_2024-07-30-11-19-15 002.jpeg&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;1014&quot;/&gt;&lt;/span&gt;&lt;/figure&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;b&gt;1. 초파 로봇 1호 쵸파 탱크&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-36-26 003.jpeg&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;1428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/77dVR/btsIRlGK3aX/K1RK1AYGAIuklwcY50ky11/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/77dVR/btsIRlGK3aX/K1RK1AYGAIuklwcY50ky11/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/77dVR/btsIRlGK3aX/K1RK1AYGAIuklwcY50ky11/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F77dVR%2FbtsIRlGK3aX%2FK1RK1AYGAIuklwcY50ky11%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;493&quot; height=&quot;657&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-36-26 003.jpeg&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;1428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-19-16 008.jpeg&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;1400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uROPA/btsIPVPZjxc/8QQUA5xz2mjg0nfX3uEj6K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uROPA/btsIPVPZjxc/8QQUA5xz2mjg0nfX3uEj6K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uROPA/btsIPVPZjxc/8QQUA5xz2mjg0nfX3uEj6K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuROPA%2FbtsIPVPZjxc%2F8QQUA5xz2mjg0nfX3uEj6K%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;443&quot; height=&quot;591&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-19-16 008.jpeg&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;1400&quot;/&gt;&lt;/span&gt;&lt;/figure&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;b&gt;2. 초파 로봇 2호 쵸파 윙&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-36-26 005.jpeg&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;1428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXJ9v4/btsIQJgOqgA/12g07qr8m7TUEUn3pytxRK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXJ9v4/btsIQJgOqgA/12g07qr8m7TUEUn3pytxRK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXJ9v4/btsIQJgOqgA/12g07qr8m7TUEUn3pytxRK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXJ9v4%2FbtsIQJgOqgA%2F12g07qr8m7TUEUn3pytxRK%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;498&quot; height=&quot;664&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-36-26 005.jpeg&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;1428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-19-16 007.jpeg&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;1400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDvH7Y/btsIPSFFMWG/OcChkK0TzE6kobdnEDKt4k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDvH7Y/btsIPSFFMWG/OcChkK0TzE6kobdnEDKt4k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDvH7Y/btsIPSFFMWG/OcChkK0TzE6kobdnEDKt4k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDvH7Y%2FbtsIPSFFMWG%2FOcChkK0TzE6kobdnEDKt4k%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;452&quot; height=&quot;603&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-19-16 007.jpeg&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;1400&quot;/&gt;&lt;/span&gt;&lt;/figure&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;b&gt;3. 초파 로봇 3호 쵸파 잠수함&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_KakaoTalk_Photo_2024-07-30-11-36-26 002.jpeg&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;1089&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtdQQ0/btsISetpr04/MKoLGieWTS9q2HlHxIQvy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtdQQ0/btsISetpr04/MKoLGieWTS9q2HlHxIQvy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtdQQ0/btsISetpr04/MKoLGieWTS9q2HlHxIQvy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtdQQ0%2FbtsISetpr04%2FMKoLGieWTS9q2HlHxIQvy1%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;487&quot; height=&quot;495&quot; data-filename=&quot;edited_KakaoTalk_Photo_2024-07-30-11-36-26 002.jpeg&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;1089&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-19-15 006.jpeg&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;1400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7l3eH/btsIQxuabDp/oyzxvp84T7I2FYDEeHAKKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7l3eH/btsIQxuabDp/oyzxvp84T7I2FYDEeHAKKk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7l3eH/btsIQxuabDp/oyzxvp84T7I2FYDEeHAKKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7l3eH%2FbtsIQxuabDp%2Foyzxvp84T7I2FYDEeHAKKk%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;486&quot; height=&quot;648&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-19-15 006.jpeg&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;1400&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. 초파 로봇 4호&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-36-26 004.jpeg&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;1428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzJhDV/btsIRZ4foFy/SshL7Vx0ByTrzc8I4krw71/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzJhDV/btsIRZ4foFy/SshL7Vx0ByTrzc8I4krw71/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzJhDV/btsIRZ4foFy/SshL7Vx0ByTrzc8I4krw71/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzJhDV%2FbtsIRZ4foFy%2FSshL7Vx0ByTrzc8I4krw71%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;454&quot; height=&quot;605&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-36-26 004.jpeg&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;1428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-19-15 005.jpeg&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;1400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhAIJA/btsISIgKhJp/Xd2tLQmx0k79j0MoEBPtM0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhAIJA/btsISIgKhJp/Xd2tLQmx0k79j0MoEBPtM0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhAIJA/btsISIgKhJp/Xd2tLQmx0k79j0MoEBPtM0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhAIJA%2FbtsISIgKhJp%2FXd2tLQmx0k79j0MoEBPtM0%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;471&quot; height=&quot;628&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-19-15 005.jpeg&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;1400&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;5. 초파 로봇 5호 쵸파 드릴&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-36-25 001.jpeg&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;1428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q86Sy/btsIPJoDCKN/qg8O3f146DMFXZGegslM50/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q86Sy/btsIPJoDCKN/qg8O3f146DMFXZGegslM50/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q86Sy/btsIPJoDCKN/qg8O3f146DMFXZGegslM50/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq86Sy%2FbtsIPJoDCKN%2Fqg8O3f146DMFXZGegslM50%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;474&quot; height=&quot;632&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-36-25 001.jpeg&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;1428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-19-15 004.jpeg&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;1400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bapnAF/btsIQzerzZN/dA4PBWIH57dKCKSrT7Js60/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bapnAF/btsIQzerzZN/dA4PBWIH57dKCKSrT7Js60/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bapnAF/btsIQzerzZN/dA4PBWIH57dKCKSrT7Js60/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbapnAF%2FbtsIQzerzZN%2FdA4PBWIH57dKCKSrT7Js60%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;433&quot; height=&quot;577&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-19-15 004.jpeg&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;1400&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;쵸파 로봇 완성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-19-16 010.jpeg&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;673&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xVnF8/btsIPVvHeZY/vxhMfLD1XohYQk3Aos2xk1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xVnF8/btsIPVvHeZY/vxhMfLD1XohYQk3Aos2xk1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xVnF8/btsIPVvHeZY/vxhMfLD1XohYQk3Aos2xk1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxVnF8%2FbtsIPVvHeZY%2FvxhMfLD1XohYQk3Aos2xk1%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;1594&quot; height=&quot;673&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-19-16 010.jpeg&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;673&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-19-15 001.jpeg&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;1172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lp5Nx/btsIScPUNgW/QnlkPUZsLQ1ml3k7Qbu1EK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lp5Nx/btsIScPUNgW/QnlkPUZsLQ1ml3k7Qbu1EK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lp5Nx/btsIScPUNgW/QnlkPUZsLQ1ml3k7Qbu1EK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flp5Nx%2FbtsIScPUNgW%2FQnlkPUZsLQ1ml3k7Qbu1EK%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;605&quot; height=&quot;679&quot; data-filename=&quot;KakaoTalk_Photo_2024-07-30-11-19-15 001.jpeg&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;1172&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;</description>
      <category>日本語/バンダイ</category>
      <category>건담베이스</category>
      <category>반다이몰</category>
      <category>원피스</category>
      <category>쵸파</category>
      <category>쵸파로봇</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/418</guid>
      <comments>https://arang95.tistory.com/418#entry418comment</comments>
      <pubDate>Tue, 30 Jul 2024 13:04:18 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 배열 (11)</title>
      <link>https://arang95.tistory.com/417</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;배열&amp;nbsp;(11)&lt;/b&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;b&gt;1. 배열&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 여러개의 값을 순차적으로 담을 수 있는 자료형으로 배열의 각 요소는 index로 식별된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- index는 0에서 부터 시작하고 값의 리스트를 저장하고 조작하거나 접근하는데 유용하다.&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. 배열의 생성&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1719731834275&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. 배열 생성
let arr1 = new Array(); // 배열 생성자
let arr2 = [];

let arr3 = [1, 2, 3, true, &quot;Hi&quot;, null, undefined, () =&amp;gt; {}, {}, []];
console.log(arr3);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열 생성자(Array Constructor) : new Array() 구문으로 배열을 생성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열 리터럴(Array Literal) : [ ] 를 사용해 배열을 생성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열은 number, string, null, undefined등 다양한 데이터 타입을 포함시킬 수 있다.&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;3. 배열 요소 접근&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 배열 요소는 인덱스를 사용해 접근할 수 있고 인덱스는 0에서 부터 시작한다.&lt;/p&gt;
&lt;pre id=&quot;code_1719731968496&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let item1 = arr3[0];
let item2 = arr3[1];

arr3[0] = &quot;Hello&quot;; // 수정
console.log(item1, item2);
console.log(arr3);&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;4. 객체(Object)와 배열(Array)의 차이&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체(Object)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;key - value 로 구성된 비순차적 데이터 구조&lt;/li&gt;
&lt;li&gt;속성- 값 쌍을 표현하는데 사용된다.&lt;/li&gt;
&lt;li&gt;동적으로 프로퍼티를 추가, 수정, 삭제 할 수 있다.&lt;/li&gt;
&lt;li&gt;키는 문자열과 심볼&lt;/li&gt;
&lt;li&gt;값은 어떤 데이터 타입도 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;배열(Array)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;index - value 쌍으로 구성도니 순차적인 데이터 구조&lt;/li&gt;
&lt;li&gt;주로 순서가 있는 리스트를 표현하는데 사용&lt;/li&gt;
&lt;li&gt;배열 메서드를 통해서 요소를 추가, 삭제, 수정할 수 있다.&lt;/li&gt;
&lt;li&gt;값은 어떤 데이터 타입도 가능하지만 동일한 타입의 데이터를 저장한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>WEB/JavaScript</category>
      <category>array</category>
      <category>javascript</category>
      <category>배열</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/417</guid>
      <comments>https://arang95.tistory.com/417#entry417comment</comments>
      <pubDate>Sun, 30 Jun 2024 16:20:32 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 객체 (10)</title>
      <link>https://arang95.tistory.com/416</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;객체&amp;nbsp;(10)&lt;/b&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;b&gt;1. 객체(Object)&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;&amp;nbsp;자료형(DataType)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;원시자료형(Primitive Data Types)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- Number, String, Boolean, null, undefined, Symbol&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;객체타입(Object Data Types)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- Object, Array, Function, Date, Map, Set&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 객체는 key - value쌍의 컬렉션으로 키는 문자열 또는 심볼, 값은 어떠한 데이터 타입도 올 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1719728425008&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let obj1 = new Object(); // 객체 생성자
let obj2 = {}; // 객체 리터럴&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;3. 객체 속성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1719728436520&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let person = {
  name: &quot;arang&quot;,
  age: 29,
  hobby: &quot;보드&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;size18&quot;&gt;&lt;b&gt;4. 객체 속성을 다루는 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;4-1. 점표기법, 괄호 표기법&lt;/p&gt;
&lt;pre id=&quot;code_1719730222749&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let name = person.name;
console.log(name);

let age = person[&quot;age&quot;];
console.log(age);

let property = &quot;hobby&quot;;
let hobby = person[property];
console.log(hobby);&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;4-2. 프로퍼티를 추가하는 방법&lt;/p&gt;
&lt;pre id=&quot;code_1719730247033&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;person.job = &quot;developer&quot;;
person[&quot;faveriteFood&quot;] = &quot;치킨&quot;;
console.log(person);&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;4-3. 프로퍼티를 수정하는 방법&lt;/p&gt;
&lt;pre id=&quot;code_1719730258351&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;person.job = &quot;educator&quot;;
person[&quot;faveriteFood&quot;] = &quot;초콜릿&quot;;
console.log(person);&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;4-4. 프로퍼티를 삭제하는 방법&lt;/p&gt;
&lt;pre id=&quot;code_1719730278917&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;delete person.job;
console.log(person);&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;4-5. 프로퍼티의 존재 유무를 확인하는 방법(in 연산자)&lt;/p&gt;
&lt;pre id=&quot;code_1719730299661&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let result1 = &quot;name&quot; in person;
console.log(result1);
let result2 = &quot;job&quot; in person;
console.log(result2);&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;5. 상수(Constant Object)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- const키워드로 선언된 객체의 속성은 자유롭게 추가, 수정, 삭제할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1719730957912&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 5. 상수객체
const animal = {
  type: &quot;강아지&quot;,
  name: &quot;리트리버&quot;,
  color: &quot;black&quot;,
};

animal.age = 9; // 추가
animal.name = &quot;골든리트리버&quot;; // 수정
delete animal.color; // 삭제
console.log(animal);&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;6. 메서드&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;&amp;nbsp;- 메서드는 점 표기법, 대괄호 표기법을 사용해서 호출할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1719730962717&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 6. 메서드
// 값이 함수인 프로퍼티

const person = {
  name: &quot;arang&quot;,
  // 메서드 선언
  sayHello() {
    console.log(&quot;안녕하세요.&quot;);
  },
};

person.sayHello();
person[&quot;sayHello&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjGekS/btsIieH6T4W/bVJs56lZ4xp0mEoFeHkhp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjGekS/btsIieH6T4W/bVJs56lZ4xp0mEoFeHkhp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjGekS/btsIieH6T4W/bVJs56lZ4xp0mEoFeHkhp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjGekS%2FbtsIieH6T4W%2FbVJs56lZ4xp0mEoFeHkhp0%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;364&quot; height=&quot;92&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;92&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;</description>
      <category>WEB/JavaScript</category>
      <category>object</category>
      <category>객체</category>
      <category>객체타입</category>
      <category>원시자료형</category>
      <category>자바</category>
      <category>자바스크립트</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/416</guid>
      <comments>https://arang95.tistory.com/416#entry416comment</comments>
      <pubDate>Sun, 30 Jun 2024 16:07:59 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 스코프 (9)</title>
      <link>https://arang95.tistory.com/415</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;스코프&amp;nbsp;(9)&lt;/b&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;b&gt;스코프(Scope)&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;&amp;nbsp;- 전역 스코프(Global Scope) 와 지역 스코프(Local Scope)로 나눌 수 있다.&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;1. 전역스코프(Global Scope)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 전역 스코프는 어디에서나 전체 영역에서 접근 가능한 범위로 함수나 블록 밖에서 선언된다.&lt;/p&gt;
&lt;pre id=&quot;code_1719726262505&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a = 1; // 전역 스코프&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;2. 지역 스코프(Local Scope)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 지역 스코프는 특정 영역에서만 접근 가능한 범위로 함수 안에서 선언된 변수는 함수 외부에서 접근할 수 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1719726271200&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function funcA() {
  let b = 2;
  console.log(a); // 지역 스코프

  function funcB() {}
}

funcA();
funcB();
console.log(b);

if (true) {
  let c = 1;
}

console.log(c);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;function funcA()함수는 전역 스코프에 선언되어 전체 코드에서 호출 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;let b = 2; 변수 b는 funcA함수의 지역 스코프에 선언되어 funcA함수 내부에서만 접근이 가능한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;function funcB()함수는 funcA함수내의 지역 스코프에 선언되어 있기 때문에 funcA 함수 내부에서만 접근이 가능하다.&lt;/p&gt;
&lt;p 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;
&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>WEB/JavaScript</category>
      <category>javascript</category>
      <category>스코프</category>
      <category>자바스크립트</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/415</guid>
      <comments>https://arang95.tistory.com/415#entry415comment</comments>
      <pubDate>Sun, 30 Jun 2024 16:07:49 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 콜백함수 (8)</title>
      <link>https://arang95.tistory.com/414</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;콜백함수&amp;nbsp;(8)&lt;/b&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;b&gt;콜백함수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 자신이 아닌 다른 함수의 인수로 전달되어 실행되는 함수를 의미하며 해당 함수 내부에서 호출되는 함수로 주로 비동기 작업(이벤트처리, 타이머, 네트워크 요청 등)과 배열에서 자주 사용된다.&lt;/p&gt;
&lt;pre id=&quot;code_1719565007298&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function main(value){

}

function sub(){
	console.log(&quot;sub&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;size18&quot;&gt;&lt;b&gt;콜백함수의 활용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1719723979447&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function repeat(count, callback) {
  for (let idx = 1; idx &amp;lt;= count; idx++) {
    callback(idx);
  }
}

repeat(5, (idx) =&amp;gt; {
  console.log(idx);
});

repeat(5, (idx) =&amp;gt; {
  console.log(idx * 2);
});

repeat(5, (idx) =&amp;gt; {
  console.log(idx * 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;repeat함수는 count, callback 두개의 매개변수를 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;repeat는 for로 1부터 전달받은 count까지 반복한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 반복에 callback함수를 호출해 현재 인덱스에 idx를 인수로 전달해 출력한다.&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;</description>
      <category>WEB/JavaScript</category>
      <category>javascript</category>
      <category>콜백함수</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/414</guid>
      <comments>https://arang95.tistory.com/414#entry414comment</comments>
      <pubDate>Sun, 30 Jun 2024 16:07:36 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 함수표현식과 화살표함수 (7)</title>
      <link>https://arang95.tistory.com/413</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;함수표현식과&amp;nbsp;화살표함수&amp;nbsp;(7)&lt;/b&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;b&gt;1. 함수표현식&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 함수 표현식은 함수 선언과 다르게 함수의 이름을 생략하고 변수에 익명함수를 할당하는 방식이다.&lt;/p&gt;
&lt;pre id=&quot;code_1719457071732&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. 함수표현식
function funcA() {
  console.log(&quot;funcA&quot;);
}

let varA = funcA;
varA();&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;2. 익명함수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 이름이 없는 함수로 주로 함수 표현식에서 사용된다.&lt;/p&gt;
&lt;pre id=&quot;code_1719457127806&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let varB = function(){
	console.log(&quot;funcB&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. 화살표 함수 (Arrow Function)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 화살표 함수는 ES6에서 도입된 간결한 함수 표현식으로 일반 함수표현식보다 짥은 문법을 제공한다.&lt;/p&gt;
&lt;pre id=&quot;code_1719457303745&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 2. 화살표 함수
let varC = (value) =&amp;gt; value + 1;

console.log(varC(10));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(value) =&amp;gt; value + 1 : value를 매개변수로 받아 1을 더한 값을 반환하는 화살표 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;let varC = (value) =&amp;gt; value + 1 : 화살표 함수를 varC변수에 할당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;console.log(varC(10)) : varC함수를 호출해 결과를 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1719457318674&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let varD = (value) =&amp;gt; {
  console.log(value);
  return value + 1;
};

console.log(varC(10));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(value) =&amp;gt; { .. } : 여러 줄의 코드가 필요한 경우 중괄호 {} 를 사용해 블록 바디를 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;return value + 1 : value에 1을 더한 값을 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;console.log(varD(10)); : varD함수를 호출해 결과를 출력한다.&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>WEB/JavaScript</category>
      <category>javascript</category>
      <category>함수표현식</category>
      <category>화살표함수</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/413</guid>
      <comments>https://arang95.tistory.com/413#entry413comment</comments>
      <pubDate>Thu, 27 Jun 2024 12:03:30 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 함수 (6)</title>
      <link>https://arang95.tistory.com/412</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;함수&amp;nbsp;(6)&lt;/b&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;b&gt;함수&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 함수 호출&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1719454339873&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 함수선언
function greeting() {
  console.log(&quot;안녕하세요&quot;);
}

console.log(&quot;함수 호출 전&quot;);
greeting();
console.log(&quot;함수 호출 후&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;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 매개변수와 반환값&lt;/p&gt;
&lt;pre id=&quot;code_1719455599640&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function getArea(width, height) {// 매개변수
  function hello() { // 중첩함수
    console.log(&quot;함수호출&quot;);
  }

  hello();
  let area = width * height;

  return area; // 반환값
}

let area1 = getArea(10, 20); // 인수
console.log(area1);

let area2 = getArea(20, 20); // 인수
console.log(area2);

let area3 = getArea(100, 20); // 인수
console.log(area3);&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;3. 호이스팅&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 함수선언은 코드의 맨 위로 끌어올려져 함수 호출이 선언보다 먼저 있어도 동작하는데 문제가 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1719455716917&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(&quot;함수 호출 전&quot;);
greeting();

// 함수선언
function greeting() {
  console.log(&quot;안녕하세요&quot;);
}

console.log(&quot;함수 호출 후&quot;);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>WEB/JavaScript</category>
      <category>function</category>
      <category>javascript</category>
      <category>함수</category>
      <category>호이스팅</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/412</guid>
      <comments>https://arang95.tistory.com/412#entry412comment</comments>
      <pubDate>Thu, 27 Jun 2024 11:56:56 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 반복문 (5)</title>
      <link>https://arang95.tistory.com/411</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;반복문&amp;nbsp;(5)&lt;/b&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;b&gt;반복문(Loop, Iteration)&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. for&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 반복 횟수가 명확할 때 주로 사용된다.&lt;/p&gt;
&lt;pre id=&quot;code_1719453446242&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. 반복문
for (let idx = 1; idx &amp;lt;= 5; idx++) {
  if (idx % 2 === 0) {
    continue;
  }
  console.log(idx);

  if (idx &amp;gt;= 5) {
    break;
  }
}&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;2. while&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 주어진 조건이 참인 동안 코드를 반복해서 실행한다. 조건이 거짓이 될경우 반복을 종료한다.&lt;/p&gt;
&lt;pre id=&quot;code_1719453954730&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 2. while
let i = 1;
while (i &amp;lt;= 5) {
  console.log(i);
  i++;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;let i = 1 : 초기화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while(i &amp;lt;= 5) : i가 5보다 작은 동안 반복을 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i++ : 반복이 끝날 때마다 i를 1씩 증가&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;3. do while&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 조건이 거짓이더라도 코드 블록은 최소 한번이상 실행된다.&lt;/p&gt;
&lt;pre id=&quot;code_1719454118225&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let j = 1;
do {
  console.log(j);
  j++;
} while (j &amp;lt;= 3);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;do while(i &amp;lt;= 3) : do 코드를 먼저 실행하고 while조건이 참인 동안 반복을 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>WEB/JavaScript</category>
      <category>javascript</category>
      <category>반복문</category>
      <category>인프런</category>
      <category>한입 크기로 잘라먹는</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/411</guid>
      <comments>https://arang95.tistory.com/411#entry411comment</comments>
      <pubDate>Thu, 27 Jun 2024 11:56:42 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 조건문 (4)</title>
      <link>https://arang95.tistory.com/410</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;조건문&amp;nbsp;(4)&lt;/b&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;b&gt;조건문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 특정 조건을 만족했을 때 실행되는 코드를 작성하기 위한 문법으로 if, switch 조건문이 대표적이다.&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;1. if&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- if 조건문은 주어진 조건이 참일때 특정코드를 실행하며 else if, else 를 사용해 여러 조건을 처리할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1719450920182&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. if 조건문
let num = 1;

if(num &amp;gt;= 10){
    console.log(&quot;num은 10 이상입니다.&quot;);
}
else{
    console.log(&quot;num은 10 이하입니다.&quot;);
}&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_1719451005964&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. if 조건문
let num = 6;

if(num &amp;gt;= 10){
    console.log(&quot;num은 10 이상입니다.&quot;);
}else if(num &amp;gt;= 5){
    console.log(&quot;num은 5이상입니다.&quot;);
}else{
    console.log(&quot;조건이 거짓입니다.&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- num이 10 이상인 경우 &quot;num은 10 이상입니다.&quot;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- num이 10이하인 경우 &quot;num은 10 이하입니다.&quot;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- else if num이 5이상인 경우 &quot;num은 5이상입니다.&quot;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- else 앞의 모든 조건이 거짓인 경우 &quot;조건이 거짓입니다.&quot;&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. switch 문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 변수의 값에 따라 여러 코드중 하나를 실행할수 있으며 case블록과 default블록을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- if문과 기능은 동일하지만 다수의 조건을 처리할 때 if보다 더 직관적이다.&lt;/p&gt;
&lt;pre id=&quot;code_1719451487203&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 2. switch문
let animal = &quot;dog&quot;;
switch (animal) {
  case &quot;dog&quot;: {
    console.log(&quot;강아지&quot;);
    break;
  }
  case &quot;cat&quot;: {
    console.log(&quot;고양이&quot;);
    break;
  }
  case &quot;bear&quot;: {
    console.log(&quot;곰&quot;);
    break;
  }
  case &quot;snake&quot;: {
    console.log(&quot;뱀&quot;);
    break;
  }
  case &quot;tiger&quot;: {
    console.log(&quot;호랑이&quot;);
    break;
  }
  default: {
    console.log(&quot;잘못된 값입니다.&quot;);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>WEB/JavaScript</category>
      <category>Else</category>
      <category>Else If</category>
      <category>If</category>
      <category>javascript</category>
      <category>switch</category>
      <category>조건문</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/410</guid>
      <comments>https://arang95.tistory.com/410#entry410comment</comments>
      <pubDate>Thu, 27 Jun 2024 11:55:13 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 연산자 (3)</title>
      <link>https://arang95.tistory.com/409</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;연산자&amp;nbsp;(3)&lt;/b&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;b&gt;연산자(Operator)&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;&amp;nbsp;&lt;/p&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;&amp;nbsp;- 변수에 값을 할당하는데 사용된다.&lt;/p&gt;
&lt;pre id=&quot;code_1719448863929&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. 대입연산자
let var1 = 1;&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;2. 산술연산자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 숫자간의 산술 연산을 수행&lt;/p&gt;
&lt;pre id=&quot;code_1719448890463&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let num1 = 5 + 2;
let num2 = 5 + 2;
// * / % 는 + - 보다 우선순위가 높다.
let num3 = 5 * 2;
let num4 = 5 / 2;
let num5 = 5 % 2;
let num6 = 5 + 2 * 10;
console.log(num6);&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;3. 복합대입연산자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 연산과 할당을 동시에 수행&lt;/p&gt;
&lt;pre id=&quot;code_1719449205265&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 3. 복합 대입 연산자
let num7 = 10;
num7 += 20;
num7 -= 20;
num7 *= 20;
num7 /= 20;
num7 %= 20;
console.log(num7);&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;4. 증감 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 변수의 값을 1씩 증가 또는 감소시킨다.&lt;/p&gt;
&lt;pre id=&quot;code_1719449264372&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let num8 = 10;
num8++; // 후위연산: 해당 라인이 끝난 후 1 증가
++num8; // 전위연산: 바로 1 증가
--num8;
num8--;
console.log(num8);&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;5. 논리 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 논리적인 연산을 수행&lt;/p&gt;
&lt;pre id=&quot;code_1719449303673&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let and = true &amp;amp;&amp;amp; false;
let or = true || false;
let not = !true;
console.log(and, or, not);&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;6. 비교 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 두값을 비교해 해당 결과를 불리언 값으로 변환&lt;/p&gt;
&lt;pre id=&quot;code_1719449347573&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let comp1 = 1 === '2';
let comp2 = 1 !== 2;
console.log(comp1, comp2);

let comp3 = 2 &amp;gt; 1;
let comp4 = 2 &amp;lt; 1;
console.log(comp3, comp4);

let comp5 = 2 &amp;gt;= 2;
let comp6 = 2 &amp;lt;= 2;
console.log(comp5, comp6);&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;7. null병합 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 존재하는 값을 추려내는 기능으로 null, nudefined가 아닌 값을 찾아내는 연산자&lt;/p&gt;
&lt;pre id=&quot;code_1719449538866&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let var1; // undefind
let var2 = 10;
let var3 = 20;

let var4 = var1 ?? var2;
let var5 = var1 ?? var3;
let var6 = var3 ?? var2;
console.log(var4);
console.log(var5);
console.log(var6);

let userName = &quot;arang&quot;;
let userNickName = &quot;AR&quot;;

let display = userName ?? userNickName;
console.log(display);&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;b&gt;8. typeof연산자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 값의 타입을 문자열로 반환하는 기능을 하는 연산자&lt;/p&gt;
&lt;pre id=&quot;code_1719450446128&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// typeof 연산자
// 값의 타입을 문자열로 반환하는 기능을 하는 연산자
let var7 = 1;
let t1 = typeof var7;
console.log(t1); // number

let var8 = &quot;hello&quot;;
let t2 = typeof var8;
console.log(t2); // string

let var9 = true;
let t3 = typeof var9;
console.log(t3); // boolean&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;9. 삼항 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 항을 3개 사용하는 연산자로 조건식을 이용해서 참 혹은 거짓일 때의 값을 다르게 반환한다.&lt;/p&gt;
&lt;pre id=&quot;code_1719450580387&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 삼항 연산자
// 항을 3개 사용하는 연산자로 조건식을 이용해서 참 혹은 거짓일 때의 값을 다르게 반환한다.
let var10 = 10;
let res = var10 % 2 == 0 ? &quot;짝수&quot; : &quot;홀수&quot;;
console.log(res);&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;&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>WEB/JavaScript</category>
      <category>javascript</category>
      <category>operator</category>
      <category>연산자</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/409</guid>
      <comments>https://arang95.tistory.com/409#entry409comment</comments>
      <pubDate>Thu, 27 Jun 2024 11:54:53 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 형변환 (2)</title>
      <link>https://arang95.tistory.com/408</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;형변환&amp;nbsp;(2)&lt;/b&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;b&gt;1. 형 변환(Type Casting)&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;&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_1719385558052&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. 묵시적 형 변환
// 자바스크립트 엔진이 형 변환을 하는것
let num = 10;
let str = &quot;20&quot;;

const result = num + str;
console.log(result);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l35CZ/btsId6iwDLb/AD8oa83xBULzK9H7h8xDSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l35CZ/btsId6iwDLb/AD8oa83xBULzK9H7h8xDSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l35CZ/btsId6iwDLb/AD8oa83xBULzK9H7h8xDSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl35CZ%2FbtsId6iwDLb%2FAD8oa83xBULzK9H7h8xDSk%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;974&quot; height=&quot;28&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;28&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;명시적 형 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 개발자가 직접 함수 등을 이용해서 형 변환을 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1719385718303&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 2. 명시적 형 변환
// 개발자가 내장함수 등을 사용해 직접 형 변환을 명시한다.
let str1 = &quot;10&quot;;
let strNum = Number(str1);
console.log(10 + strNum);

let str2 = &quot;10개&quot;;
let strNum2 = parseInt(str2);
console.log(strNum2);

// 숫자 -&amp;gt; 문자열
let num1 = 20;
let numStr1 = String(num1);
console.log(numStr1 + &quot;입니다.&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;69&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PCcCw/btsIcoZmz90/b7FyHxZilJxlwIdAIQ4kL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PCcCw/btsIcoZmz90/b7FyHxZilJxlwIdAIQ4kL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PCcCw/btsIcoZmz90/b7FyHxZilJxlwIdAIQ4kL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPCcCw%2FbtsIcoZmz90%2Fb7FyHxZilJxlwIdAIQ4kL1%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;967&quot; height=&quot;69&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;69&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;</description>
      <category>WEB/JavaScript</category>
      <category>javascript</category>
      <category>인프런</category>
      <category>한입크기</category>
      <category>형변환</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/408</guid>
      <comments>https://arang95.tistory.com/408#entry408comment</comments>
      <pubDate>Thu, 27 Jun 2024 11:54:40 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 자료형Type (1)</title>
      <link>https://arang95.tistory.com/407</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;자료형Type&amp;nbsp;(1)&lt;/b&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;b&gt;1. 원시 타입(Primitive Types)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;숫자형(Number)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 정수 및 실수 형태의 숫자를 포함한다.&lt;/p&gt;
&lt;pre id=&quot;code_1719384132382&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 원시타입(Primitive Types)
// 1. Number Type
let num1 = 30;
let num2 = 3.5;
let num3 = -20;

console.log(num1 + num2);
console.log(num1 - num2);
console.log(num1 * num2);
console.log(num1 / num2);
console.log(num1 % num2);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9I0Yl/btsIdVuNinL/bsb7Bxe9I9UkxAn64rOvgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9I0Yl/btsIdVuNinL/bsb7Bxe9I9UkxAn64rOvgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9I0Yl/btsIdVuNinL/bsb7Bxe9I9UkxAn64rOvgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9I0Yl%2FbtsIdVuNinL%2Fbsb7Bxe9I9UkxAn64rOvgK%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;981&quot; height=&quot;124&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;124&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;문자형(String)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 텍스트 데이터를 포함하며 '', &quot;&quot;, ``으로 감싸서 표현한다.&lt;/p&gt;
&lt;pre id=&quot;code_1719384604572&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let name = &quot;arang&quot;;
let age = '29';

// 템플릿 리터럴
let intro = `저의 이름은 ${name}이고 나이는 ${age}입니다.`;
console.log(intro);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLU3m9/btsId6Jyj7P/p3hKntACEY0qCRGKdOkkm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLU3m9/btsId6Jyj7P/p3hKntACEY0qCRGKdOkkm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLU3m9/btsId6Jyj7P/p3hKntACEY0qCRGKdOkkm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLU3m9%2FbtsId6Jyj7P%2Fp3hKntACEY0qCRGKdOkkm1%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;980&quot; height=&quot;34&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;34&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;불리언형(Boolean)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 참 또는 거짓 값을 가진다.&lt;/p&gt;
&lt;pre id=&quot;code_1719384794375&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 원시타입(Primitive Types)
// 3. Boolean Type
let isOn = true;
let isOff = 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;undefind&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 값이 할당되지 않은 변수의 기본이 되는 값&lt;/p&gt;
&lt;pre id=&quot;code_1719384888912&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 원시타입(Primitive Types)
// 5. undefined
let none;
console.log(none);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;32&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGn75b/btsIb3VrMrT/xpwbEUjbBeWwXqkLkNsbW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGn75b/btsIb3VrMrT/xpwbEUjbBeWwXqkLkNsbW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGn75b/btsIb3VrMrT/xpwbEUjbBeWwXqkLkNsbW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGn75b%2FbtsIb3VrMrT%2FxpwbEUjbBeWwXqkLkNsbW0%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;976&quot; height=&quot;32&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;32&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;null&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 의도적으로 값이 없다는것을 나타내는 값&lt;/p&gt;
&lt;pre id=&quot;code_1719384828569&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 원시타입(Primitive Types)
// 4. Null
let empty = null;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>WEB/JavaScript</category>
      <category>javascript</category>
      <category>null</category>
      <category>undefined</category>
      <category>문자형</category>
      <category>불리언</category>
      <category>숫자형</category>
      <category>원시타입</category>
      <category>자료형</category>
      <category>한입크기로 잘라먹는</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/407</guid>
      <comments>https://arang95.tistory.com/407#entry407comment</comments>
      <pubDate>Thu, 27 Jun 2024 11:54:10 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript - 변수와 상수 (0)</title>
      <link>https://arang95.tistory.com/406</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JavaScript&amp;nbsp;-&amp;nbsp;변수와&amp;nbsp;상수&amp;nbsp;(0)&lt;/b&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;b&gt;1. 변수 var, let&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;let 동일한 변수 이름은 다시 선언할 수 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1719382413939&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. 변수 let
let age = 29;
console.log(age);

age = 30;
console.log(age);&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;var 동일한 변수 이름을 다시 선언할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1719382477576&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 2. 변수 var
var name = &quot;Arang&quot;;
console.log(name);

var name = &quot;AR&quot;;
console.log(name);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;183&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIMxLR/btsIbvxHlqL/oEyZkK3XbNvCuvKpFs0hM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIMxLR/btsIbvxHlqL/oEyZkK3XbNvCuvKpFs0hM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIMxLR/btsIbvxHlqL/oEyZkK3XbNvCuvKpFs0hM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIMxLR%2FbtsIbvxHlqL%2FoEyZkK3XbNvCuvKpFs0hM0%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;209&quot; height=&quot;65&quot; data-origin-width=&quot;183&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Iubfd/btsIcZ5GMGF/pvUlw5LWTYpXgsVckyTr60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Iubfd/btsIcZ5GMGF/pvUlw5LWTYpXgsVckyTr60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Iubfd/btsIcZ5GMGF/pvUlw5LWTYpXgsVckyTr60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIubfd%2FbtsIcZ5GMGF%2FpvUlw5LWTYpXgsVckyTr60%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;977&quot; height=&quot;87&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 상수 const&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 상수는 선언과 동시에 초기화를 해줘야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1719382613740&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 3. 상수
const number = 3;
number = 5;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X5Tu8/btsId4yeBU6/6aYNC34EWAoKKmkqNzYxXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X5Tu8/btsId4yeBU6/6aYNC34EWAoKKmkqNzYxXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X5Tu8/btsId4yeBU6/6aYNC34EWAoKKmkqNzYxXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX5Tu8%2FbtsId4yeBU6%2F6aYNC34EWAoKKmkqNzYxXK%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;983&quot; height=&quot;132&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;132&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;b&gt;3. 변수 네이밍 규칙&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1. camelCase&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;pre id=&quot;code_1719383165575&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let userNamel
let currentAge;&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;pre id=&quot;code_1719383264235&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let 1num;
let num1;&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_1719383243746&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let _Value;
let $Value;&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;&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>WEB/JavaScript</category>
      <category>.log</category>
      <category>Console</category>
      <category>java</category>
      <category>javascript</category>
      <category>Let</category>
      <category>변수</category>
      <category>상수</category>
      <category>인프런</category>
      <category>한입크기로 잘라먹는 리액트</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/406</guid>
      <comments>https://arang95.tistory.com/406#entry406comment</comments>
      <pubDate>Thu, 27 Jun 2024 11:53:24 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - Theme (25)</title>
      <link>https://arang95.tistory.com/405</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter&amp;nbsp;기초&amp;nbsp;-&amp;nbsp;Theme&amp;nbsp;(25)&lt;/b&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;b&gt;1. Theme&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 테마를 사용해 App전체에 일관된 시각적 스타일을 적용하여 사용자경험 UX를 향상시킬 수 있다.&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. ThemeData&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- MaterialApp의 theme속성에서 제공되고 앱 전체에서 공통 스타일을 적용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1716533621944&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  MaterialApp(
    theme: ThemeData(
      primary: Colors.indigo,
      secondary: Colors.green,
      teriary: Colors.yellow
    ),
  );
}&lt;/code&gt;&lt;/pre&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;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.2558%;&quot;&gt;primaryColor&lt;/td&gt;
&lt;td style=&quot;width: 76.7442%;&quot;&gt;앱의 기본색상으로 툴바, 탭바 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.2558%;&quot;&gt;accentColor&lt;/td&gt;
&lt;td style=&quot;width: 76.7442%;&quot;&gt;버튼, 액션 버튼, 체크박스 등 사용자와 상호작용하는 요소에서 사용되는 색상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.2558%;&quot;&gt;brightness&lt;/td&gt;
&lt;td style=&quot;width: 76.7442%;&quot;&gt;앱의 전체적인 밝기를 설정한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.2558%;&quot;&gt;textTheme&lt;/td&gt;
&lt;td style=&quot;width: 76.7442%;&quot;&gt;앱 내 텍스트의 스타일을 정의하고 글꼴 크기, 색상, 글꼴 등을 조정할 수 있다.&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;size18&quot;&gt;&lt;b&gt;3. 테마 적용 방법&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716535300582&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Container(
	color: Theme.of(context).accentColor,
    chiled: Text(
    	'Welcome to Flutter',
        style: Theme.of(context).textTheme.headline6,
    ),
)&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;b&gt;4. Material Design 3&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://m3.material.io/styles/color/system/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://m3.material.io/styles/color/system/overview&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716535363682&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Color &amp;ndash; Material Design 3&quot; data-og-description=&quot;Create accessible, personal color schemes communicating your product's hierarchy, state, and brand&quot; data-og-host=&quot;m3.material.io&quot; data-og-source-url=&quot;https://m3.material.io/styles/color/system/overview&quot; data-og-url=&quot;https://m3.material.io/styles/color/system/overview&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jBlAR/hyV9RZ1E5F/mjByiHAdgW25PNrPjlTgUk/img.png?width=512&amp;amp;height=300&amp;amp;face=0_0_512_300&quot;&gt;&lt;a href=&quot;https://m3.material.io/styles/color/system/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://m3.material.io/styles/color/system/overview&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jBlAR/hyV9RZ1E5F/mjByiHAdgW25PNrPjlTgUk/img.png?width=512&amp;amp;height=300&amp;amp;face=0_0_512_300');&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;Color &amp;ndash; Material Design 3&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Create accessible, personal color schemes communicating your product's hierarchy, state, and brand&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;m3.material.io&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;
&lt;pre id=&quot;code_1716535481515&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;final customTheme = ThemeData(
  colorScheme: ColorScheme.fromSeed(seedColor: Colors.indigo),
  textTheme: const TextTheme(
    bodyLarge: TextStyle(fontWeight: FontWeight.normal, fontSize: 10)
  ),
  useMaterial3: 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;ColorScheme.fromSeed&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- ColorScheme.fromSeed는 seedColor를 기반으로 전체 색상 스키마를 생성한다. Colors.indigo 색을 기반으로 관련된 색생을 생성해 버튼, 배경, 텍스트 등 요소에 사용한다.&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;TextTheme&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- textTheme 은 앱 내의 텍스트 스타일을 정의한다. bodyLarge는 기본 텍스트 타일로 크기와 굵기를 설정한다.&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;UserMaterial3: true&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 애플리케이션에서 MaterialDesign3 디자인을 사용하도록 설정해 스타일과 컴포넌트를 활성화시킨다.&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>Dart/Flutter</category>
      <category>android</category>
      <category>DART</category>
      <category>Flutter</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/405</guid>
      <comments>https://arang95.tistory.com/405#entry405comment</comments>
      <pubDate>Fri, 24 May 2024 16:37:24 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - 페이지이동2 (24)</title>
      <link>https://arang95.tistory.com/404</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter&amp;nbsp;기초&amp;nbsp;-&amp;nbsp;페이지이동2&amp;nbsp;(24)&lt;/b&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;b&gt;1. 페이지 이동 및 네비게이션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Navigator Widget을 사용해 Navigator 앱 내에서 페이지 간의 이동을 관리한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 77.5581%; height: 74px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 23.4884%; height: 17px;&quot;&gt;Navigator.push&lt;/td&gt;
&lt;td style=&quot;width: 76.5116%; height: 17px;&quot;&gt;새로운 화면을 현재의 네비게이션 스택에 푸쉬한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 23.4884%; height: 19px;&quot;&gt;Navigator.pop&lt;/td&gt;
&lt;td style=&quot;width: 76.5116%; height: 19px;&quot;&gt;스택의 가장 위에 있는 라우트를 제거하여 이전 페이지로 돌아간다.&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;size18&quot;&gt;&lt;b&gt;2. MaterialPageRoute&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. 새로운 페이지로 이동&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716527764882&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Navigator.push(
	context,
    MaterialPageRoute(builder: (context) =&amp;gt; const NewPage()),
);&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;4. 이전 페이지로 이동&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716527734745&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Navigator.pop(context);&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;5. Navigotor.popUntil&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716527722010&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Navigator.popUntil(context, (route) =&amp;gt; route.isFirst);&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;6. 네비게이션, 라우트&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716527694966&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MaterialApp(
	routes: {
    	'/': (context) =&amp;gt; HomeScreen(),
        '/second': (context) =&amp;gt; SecondScreen(),
    },
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. HomeWidget&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716527857899&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class HomeWidget extends StatefulWidget {
  const HomeWidget({super.key});

  @override
  State&amp;lt;HomeWidget&amp;gt; createState() =&amp;gt; _HomeWidgetState();
}

class _HomeWidgetState extends State&amp;lt;HomeWidget&amp;gt; {
  late int index;

  @override
  void initState() {
    super.initState();
    index = 0;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('App Bar'),
      ),
      body: Center(
        child: TextButton(
          child: const Text('Go to Page'),
          onPressed: () {
            Navigator.push(
                context,
                MaterialPageRoute(builder: (context) =&amp;gt; const NewPage())
            );
          },
        ),
      ),
    );
  }
}&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;HomeWidget은 기본 화면을 설정하고 사용자가 'Go to Page'를 클릭하면 NewPage로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Navigator.push(context, MaterialPageRoute(builder: (context) =&amp;gt; const NewPage())는 새로운 페이지로 이동할 때 사용되고 현재의 컨텍스트와 새로운 페이지 위젯을 MaterialPageRoute 생성자에 전달하여 호출된다.&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. NewPage&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716528394844&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class NewPage extends StatelessWidget {
  const NewPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('This is New Page'),
      ),
      body: Center(
        child: Column(
          children: [
            TextButton(
              child: const Text('Go to Back'),
              onPressed: () {
                Navigator.pop(context);
              },
            ),
            TextButton(
              child: const Text('Go to New Page2'),
              onPressed: () {
                Navigator.push(context,
                    MaterialPageRoute(builder: (context) =&amp;gt; const NewPage2()));
              },
            ),
          ],
        ),
      ),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NewPage에서 사용자가 'Go to Back'벝ㄴ을 클릭하면 Navigator.pop(context)메소드를 사용해서 현재 페이지를 네비게이터 스택에서 제거한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'Go to New Page2'를 클릭하면 Navigator.push(context, MaterialPageRoute(builder: (context) =&amp;gt; const NewPage2로 이동한다.&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;3. NewPage2&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716528419658&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class NewPage2 extends StatelessWidget {
  const NewPage2({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('This is New Page2'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          mainAxisSize: MainAxisSize.min,
          children: [
            TextButton(
              child: const Text('Go to Back'),
              onPressed: () {
                Navigator.pop(context);
              },
            ),
            TextButton(
                child: const Text('Go to Home'),
                onPressed: () {
                  Navigator.popUntil(context, (route)=&amp;gt; route.isFirst);
    })
    ],
        ),
      ),
    );
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NewPage2에서 'Go to Back' 버튼을 사용해 바로 이전의 페이지로 돌아간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;'Go to Home' 버튼은 Navigator.popUtil(context, (route) =&amp;gt; route.isFirst)로 모든 중간 페이지를 건너뛰고 처음 페이지로 돌아간다.&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-origin-width=&quot;292&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPcEaF/btsHBPhuWvX/SZGrXT6evFcRK8qWxqKkbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPcEaF/btsHBPhuWvX/SZGrXT6evFcRK8qWxqKkbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPcEaF/btsHBPhuWvX/SZGrXT6evFcRK8qWxqKkbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPcEaF%2FbtsHBPhuWvX%2FSZGrXT6evFcRK8qWxqKkbk%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;253&quot; height=&quot;405&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;467&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;</description>
      <category>Dart/Flutter</category>
      <category>DART</category>
      <category>Flutter</category>
      <category>isfirst</category>
      <category>page</category>
      <category>pop</category>
      <category>popUntil</category>
      <category>route</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/404</guid>
      <comments>https://arang95.tistory.com/404#entry404comment</comments>
      <pubDate>Fri, 24 May 2024 16:37:08 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - Callback (22)</title>
      <link>https://arang95.tistory.com/403</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter&amp;nbsp;기초&amp;nbsp;-&amp;nbsp; Callback&amp;nbsp;(22)&lt;/b&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;b&gt;1. Callback&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. Gesture&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 사용자의 터치입력으로 GestureDetector 위젯을 사용해 탭, 더블탭, 드래그, 핀치 등의 이벤트를 처리할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716445622979&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MaterialApp(home: HomeWidget()));
}

class HomeWidget extends StatelessWidget {
  const HomeWidget({super.key});

  @override
  Widget build(BuildContext context) {
    return const SafeArea(
      child: Scaffold(
        body: Body(),
      ),
    );
  }
}

class Body extends StatefulWidget {
  const Body({super.key});

  @override
  _BodyState createState() =&amp;gt; _BodyState();
}

class _BodyState extends State&amp;lt;Body&amp;gt; {
  @override
  Widget build(BuildContext context) {
    return const TestWidget();
  }
}

class TestWidget extends StatefulWidget {
  const TestWidget({super.key});

  @override
  State&amp;lt;TestWidget&amp;gt; createState() =&amp;gt; _TestWidgetState();
}

class _TestWidgetState extends State&amp;lt;TestWidget&amp;gt; {
  int value = 0;

  void addCounter() {
    setState(() =&amp;gt; ++value);
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Center(
          child: Text('Count : $value', style: const TextStyle(fontSize: 30)),
        ),
        TestButton(addCounter),
      ],
    );
  }
}

class TestButton extends StatelessWidget {
  const TestButton(this.callback, {super.key});

  final VoidCallback callback;

  @override
  Widget build(BuildContext context) {
    return Container(
      margin: const EdgeInsets.symmetric(vertical: 8),
      width: double.infinity,
      child: GestureDetector(
        onTap: callback,
        child: Center(
            child: Container(
                padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8),
                decoration: BoxDecoration(border: Border.all()),
                child: const Text(
                  'Up Counter',
                  style: TextStyle(fontSize: 24),
                ))),
      ),
    );
  }
}&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; TestWidget&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- addCounter함수에서 버튼이 클릭되어 호출되었을때 value를 증가시키고 UI를 업데이트한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Text위젯을 통해서 화면에 증가된 값이 표시되고 TestButton을 통해서 사용자 입력을 받아 카운터를 증가 시킨다.&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;TestButton&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 버튼이 탭될때마다 주어진 콜백을 실행하고 GestureDetector를 사용해 이벤트를 감지한다. 탭이 될때 callback함수가 실행되어 _TestWidgetState의 addCounter메소드가 호출되 카운터 값이 증가한다.&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-origin-width=&quot;321&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmyqpw/btsHy65vtE8/VCHQ6QTFiv4Dt1ho6BHkCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmyqpw/btsHy65vtE8/VCHQ6QTFiv4Dt1ho6BHkCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmyqpw/btsHy65vtE8/VCHQ6QTFiv4Dt1ho6BHkCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmyqpw%2FbtsHy65vtE8%2FVCHQ6QTFiv4Dt1ho6BHkCk%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;321&quot; height=&quot;463&quot; data-origin-width=&quot;321&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Dart/Flutter</category>
      <category>android</category>
      <category>CallBack</category>
      <category>DART</category>
      <category>Flutter</category>
      <category>gestrue</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/403</guid>
      <comments>https://arang95.tistory.com/403#entry403comment</comments>
      <pubDate>Thu, 23 May 2024 20:35:37 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - 페이지이동1 (23)</title>
      <link>https://arang95.tistory.com/402</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter 기초 -  페이지이동1 (23)&lt;/b&gt;&lt;/h3&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-origin-width=&quot;324&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjWpub/btsHAeu8erp/vj9pC1J2pHMdOLMkl1XYp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjWpub/btsHAeu8erp/vj9pC1J2pHMdOLMkl1XYp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjWpub/btsHAeu8erp/vj9pC1J2pHMdOLMkl1XYp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjWpub%2FbtsHAeu8erp%2Fvj9pC1J2pHMdOLMkl1XYp1%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;220&quot; height=&quot;401&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;591&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;pre id=&quot;code_1716459235615&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class _HomeWidgetState extends State&amp;lt;HomeWidget&amp;gt; {
  late int index;

  @override
  void initState() {
    super.initState();
    index = 0;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('App Bar'),
      ),
      body: homeBody(),
      bottomNavigationBar: BottomNavigationBar(
        items: const [
          BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'),
          BottomNavigationBarItem(icon: Icon(Icons.search), label: 'Search'),
          BottomNavigationBarItem(icon: Icon(Icons.person), label: 'User'),
        ],
        currentIndex: index,
        onTap: (newIndex) {
          setState(() {
            index = newIndex;
          });
        },
      ),
    );
  }

  Widget homeBody() {
    switch (index) {
      case 1:
        return const Center(child: Icon(Icons.search, size: 100));
      case 2:
        return const Center(child: Icon(Icons.person, size: 100));
      case 0:
      default:
        return const Center(child: Icon(Icons.home, size: 100));
    }
  }
}&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; Scaffold&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-  상단 앱바 AppBar&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 본문 Body&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 하단 탭 bottomNavigationBar&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;BottomNavigationBar&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 하단 탭바로 BottomNavigationBar는 사용자가 탭할 수 있는 여러개의 항목을 포함한다.&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;currentIndex&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;onTap&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 사용자가 탭을 클릭할때 호출되며 선택된 탭의 인덱스로 index를 업데이트한다.&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;homeBody&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;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Dart/Flutter</category>
      <category>Button</category>
      <category>CallBack</category>
      <category>DART</category>
      <category>Flutter</category>
      <category>Gesture</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/402</guid>
      <comments>https://arang95.tistory.com/402#entry402comment</comments>
      <pubDate>Thu, 23 May 2024 20:34:39 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - PopupMenu  (21)</title>
      <link>https://arang95.tistory.com/401</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter&amp;nbsp;기초&amp;nbsp;-&amp;nbsp; PopupMenu&amp;nbsp;&amp;nbsp;(21)&lt;/b&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;b&gt;1. PopupMenu&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- itemBuilder속성을 통해서 메뉴 항목을 생성한다. 각 메뉴 항목에서 PopupMenuItem Widget을 사용해 정의하고 onSelected콜백에서 처리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716373152586&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class TestPopupMenu extends StatefulWidget {
  const TestPopupMenu({super.key});

  @override
  State&amp;lt;TestPopupMenu&amp;gt; createState() =&amp;gt; _TestPopupMenuState();
}

class _TestPopupMenuState extends State&amp;lt;TestPopupMenu&amp;gt; {
  TestRadioValue selectValue = TestRadioValue.test1;

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text(selectValue.name),  // 현재 선택된 값을 화면에 표시
        PopupMenuButton&amp;lt;TestRadioValue&amp;gt;(
          onSelected: (TestRadioValue value) {
            setState(() {
              selectValue = value;
            });
          },
          itemBuilder: (BuildContext context) {
            return TestRadioValue.values.map((e) =&amp;gt;
                PopupMenuItem&amp;lt;TestRadioValue&amp;gt;(
                  value: e,
                  child: Text(e.name),
                )
            ).toList();  // toList() is now correctly placed outside the map function
          },
        ),
      ],
    );
  }
}&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;TestPopupMenu&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- StateWidget으로 사용자의 작용에 따라 상태가 변할 수 있다.&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;b&gt;PopupMenuButton Widget&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- PopupMenuButton&amp;lt;TestRadioValue&amp;gt; : 제네릭 타입으로 TestRadioValue를 사용해 팝업 메뉴의 항목이 TestRadioValue열거형의 값을 가지도록 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- onSelected : 팝업 메뉴에서 항목을 선택했을때 실행되는 콜백 함수로 선택된 값을 selectValue에 할당하고 setState()를 호출해 UI를 업데이트 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- itemBuilder : 팝업 메뉴 항목을 동적으로 생성해 TestRadioValue.values를 이용해서 열거형의 모든 값을 순회하며 각 값에 대해서 PopupMenuItem&amp;lt;TestRadioValue&amp;gt;를 생성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1e6rE/btsHyXNBv65/3BzBHAopwZZRCyteQvuqMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1e6rE/btsHyXNBv65/3BzBHAopwZZRCyteQvuqMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1e6rE/btsHyXNBv65/3BzBHAopwZZRCyteQvuqMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1e6rE%2FbtsHyXNBv65%2F3BzBHAopwZZRCyteQvuqMK%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;308&quot; height=&quot;383&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;383&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;</description>
      <category>Dart/Flutter</category>
      <category>DART</category>
      <category>Flutter</category>
      <category>fvm</category>
      <category>PopupMenu</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/401</guid>
      <comments>https://arang95.tistory.com/401#entry401comment</comments>
      <pubDate>Wed, 22 May 2024 19:24:53 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - Switch  (20)</title>
      <link>https://arang95.tistory.com/400</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter&amp;nbsp;기초&amp;nbsp;-&amp;nbsp; Switch&amp;nbsp;&amp;nbsp;(20)&lt;/b&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;b&gt;1. Switch&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. Switch Widget 기본 사용법&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.7442%;&quot;&gt;value&lt;/td&gt;
&lt;td style=&quot;width: 78.2558%;&quot;&gt;스위치의 현재 상태를 나타낸다.(true, false)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.7442%;&quot;&gt;onChanged&lt;/td&gt;
&lt;td style=&quot;width: 78.2558%;&quot;&gt;스위치의 값이 변경될 때 호출되는 콜백 함수로 스위치를 토글할 때마다 함수에 새로운 상태가 전달된다.&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716371069133&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class TestSwitch extends StatefulWidget {
  const TestSwitch({super.key});

  @override
  State&amp;lt;TestSwitch&amp;gt; createState() =&amp;gt; _TestSwitchState();
}

class _TestSwitchState extends State&amp;lt;TestSwitch&amp;gt; {

  bool value = false;

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Switch(value: value, onChanged: (newValue)=&amp;gt; setState(() =&amp;gt; value = newValue)),
        CupertinoSwitch(value: value, onChanged: (newValue)=&amp;gt; setState(() =&amp;gt; value = newValue))
      ],
    );
  }
}&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;_TestSwitchState&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; value : 스위치의 현재 상태를 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; onChanged : 스위치의 값이 변경될 때 마다 실행되는 콜백함수로 새로운 값(newValue)로 value를 업데이트한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;CupertinoSwitch&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; value와 onChange속성은 Switch위젯과 동일하게 작동하며 ios에서 주로 사용된다.&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-origin-width=&quot;310&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LMlVX/btsHxQWb7Op/DsfbNczdd3n9VQK4vA4NIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LMlVX/btsHxQWb7Op/DsfbNczdd3n9VQK4vA4NIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LMlVX/btsHxQWb7Op/DsfbNczdd3n9VQK4vA4NIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLMlVX%2FbtsHxQWb7Op%2FDsfbNczdd3n9VQK4vA4NIk%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;310&quot; height=&quot;358&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Dart/Flutter</category>
      <category>DART</category>
      <category>Flutter</category>
      <category>switch</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/400</guid>
      <comments>https://arang95.tistory.com/400#entry400comment</comments>
      <pubDate>Wed, 22 May 2024 19:24:43 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - Slider  (19)</title>
      <link>https://arang95.tistory.com/399</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter&amp;nbsp;기초&amp;nbsp;-&amp;nbsp; Slider&amp;nbsp;&amp;nbsp;(19)&lt;/b&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;b&gt;1. Slider&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Slider Widget은 사용자에게 시각적인 피드백을 제공하면서 값의 범위를 조정할 수 있는 인터페이스를 제공한다.&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 95px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 24.8837%; height: 19px;&quot;&gt;value&lt;/td&gt;
&lt;td style=&quot;width: 75.1163%; height: 19px;&quot;&gt;현재의 슬라이더 값으로 min, max의 사이어야 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 24.8837%; height: 19px;&quot;&gt;onChanged&lt;/td&gt;
&lt;td style=&quot;width: 75.1163%; height: 19px;&quot;&gt;슬라이더를 움직일때 호출되는 콜백함수로 조작시 현재 슬라이더 값이 전달된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 24.8837%; height: 19px;&quot;&gt;min, max&lt;/td&gt;
&lt;td style=&quot;width: 75.1163%; height: 19px;&quot;&gt;슬라이더의 최소값, 최대값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 24.8837%; height: 19px;&quot;&gt;divisions&lt;/td&gt;
&lt;td style=&quot;width: 75.1163%; height: 19px;&quot;&gt;사용자가 선택할 수 있는 값의 수로 값을 설정하므로써 눈금표시와 특정 눈금에 위치시킬 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 24.8837%; height: 19px;&quot;&gt;label&lt;/td&gt;
&lt;td style=&quot;width: 75.1163%; height: 19px;&quot;&gt;사용자가 슬라이더를 조작할 때 보여줄 수 있는 텍스트 레이블로 현재 값을 표시하는데 사용된다.&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;pre id=&quot;code_1716369810893&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class TestSlider extends StatefulWidget {
  const TestSlider({super.key});

  @override
  State&amp;lt;TestSlider&amp;gt; createState() =&amp;gt; _TestSlider();
}

class _TestSlider extends State&amp;lt;TestSlider&amp;gt; {
  double _currentVolume = 20;

  @override
  Widget build(BuildContext context) {
    return Slider(
      value: _currentVolume,
      min: 0,
      max: 100,
      divisions: 10,
      activeColor: Colors.red,
      label: _currentVolume.round().toString(),
      onChanged: (double value) {
        setState(() {
          _currentVolume = value;
        });
      },
    );
  }
}&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;TestSlider는 StateWidget 선언되어 현재 값을 기준으로 사용자의 작용에 의해 변할 수 있는 상태이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; CreateState()메서드는 _TestSlider클래스의 인스턴스를 반환하고 이는 슬라이더의 상태를 관리하는 역할을 수행한다.&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;b&gt;Slider Widget&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; value : 슬라이더의 현재 값을 나타내며 _currentVolume 변수에 의해 동적으로 관리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; min, max : 슬라이더에 나타낼 최소, 최대값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; division : 전체를 10으로 나누어 10단위로 조정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; activeColor : 슬라이더의 색상(현재값 ~ 마지막값)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; label : 슬라이더를 조정할 때 나타나는 풍선 도움말에 현재 값의 정수 부분을 문자열로 표시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; onChanged : 슬라이더의 값이 변할때마다 호출된다. 콜백 함수는 새로운 슬라이더 값(value)를 받아 _currentVolume을 업데이트하고 setState를 호출해 위젯을 다시 빌드한다.&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-origin-width=&quot;303&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZV5R9/btsHyaUnZ5Z/1KkeGX8ETQD9KYFIVff511/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZV5R9/btsHyaUnZ5Z/1KkeGX8ETQD9KYFIVff511/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZV5R9/btsHyaUnZ5Z/1KkeGX8ETQD9KYFIVff511/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZV5R9%2FbtsHyaUnZ5Z%2F1KkeGX8ETQD9KYFIVff511%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;303&quot; height=&quot;393&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;393&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;</description>
      <category>Dart/Flutter</category>
      <category>DART</category>
      <category>divisions</category>
      <category>Flutter</category>
      <category>label</category>
      <category>MAX</category>
      <category>MIN</category>
      <category>Slider</category>
      <category>value</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/399</guid>
      <comments>https://arang95.tistory.com/399#entry399comment</comments>
      <pubDate>Wed, 22 May 2024 19:24:34 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - RadioButton (18)</title>
      <link>https://arang95.tistory.com/398</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter 기초 -  RadioButton (18)&lt;/b&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;b&gt;1. Radio버튼&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. Radio버튼 기본구조&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%;&quot;&gt;value&lt;/td&gt;
&lt;td style=&quot;width: 83.1395%;&quot;&gt;라디오 버튼의 고유한 값으로 열거형(enum)을 사용해 각 옵션을 명시한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%;&quot;&gt;groupValue&lt;/td&gt;
&lt;td style=&quot;width: 83.1395%;&quot;&gt;현재 그룹에서 선택된 값을 나타내며 value값과 같을 경우 해당 라디오 버튼이 선택된 것으로 표시된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%;&quot;&gt;onChanged&lt;/td&gt;
&lt;td style=&quot;width: 83.1395%;&quot;&gt;라디오 버튼의 값이 변경될때 실행할 콜백함수로 사용자가 라디오 버튼중 하나를 탭할 때 마다 호출된다.&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;size18&quot;&gt;&lt;b&gt;3. RadioButton동작방식&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716366163178&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;oValue { test1, test2, test3 }

class TestRadioButton extends StatefulWidget {
  const TestRadioButton({super.key});

  @override
  State&amp;lt;TestRadioButton&amp;gt; createState() =&amp;gt; _TestRadioButtonState();
}

class _TestRadioButtonState extends State&amp;lt;TestRadioButton&amp;gt; {
  TestRadioValue? selectValue;
  final Map&amp;lt;TestRadioValue, String&amp;gt; labels = {
    TestRadioValue.test1: &quot;라디오 1&quot;,
    TestRadioValue.test2: &quot;라디오 2&quot;,
    TestRadioValue.test3: &quot;라디오 3&quot;,
  };

  @override
  Widget build(BuildContext context) {
    return Column(
      children: TestRadioValue.values.map((value) {
        return ListTile(
          leading: Radio&amp;lt;TestRadioValue&amp;gt;(
            value: value,
            groupValue: selectValue,
            onChanged: (TestRadioValue? newValue) {
              if (newValue != null) {
                setState(() {
                  selectValue = newValue;
                });
              }
            },
          ),
          title: Text(labels[value]!),
          onTap: () {
            setState(() {
              selectValue = value;
            });
          },
        );
      }).toList(),
    );
  }
}&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;TestRadioButton&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 라디오 버튼을 구현하는 StatefulWidget으로 TestRadioValue에 열거형으로 정의된 값중 하나를 선택할 수 있다.&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;b&gt;_TestRadioButtonState&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- selectValue : 현재선택된 라디오버튼의 값을 저장하는 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- lables : 라디오 버튼과 연결된 레이블을 저장하는 맵으로 라디오 버튼의 value와 사용자에게 보여줄 문자열을 연결한다.&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;Column내부에서 TestRadioValue.values.map을 사용해 각 라디오 값에 대한 ListTile을 생성하고 ListTile은 사용자 인터렉션을 쉽게 만들어주는 위젯 .&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;b&gt;Radio Widget&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- value : 라디오 버튼 값 (TestRadioValue.test1, test2, test3)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- groupValue : 현재 그룹에서 선택된 값(selectValue)가 value와 같다면 라디오버튼은 선택된 것으로 표시된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- onChanged : 라디오 버튼을 탭할 때 호출되는 콜백으로 새 값을 받아 selectValue를 업데이트하고 setState를 호출해 UI를 갱신한다.&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-origin-width=&quot;296&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QBmbO/btsHzeg7P6q/uMUCdGBARbWaTILxcdiNOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QBmbO/btsHzeg7P6q/uMUCdGBARbWaTILxcdiNOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QBmbO/btsHzeg7P6q/uMUCdGBARbWaTILxcdiNOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQBmbO%2FbtsHzeg7P6q%2FuMUCdGBARbWaTILxcdiNOk%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;296&quot; height=&quot;447&quot; data-origin-width=&quot;296&quot; data-origin-height=&quot;447&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;</description>
      <category>Dart/Flutter</category>
      <category>android</category>
      <category>DART</category>
      <category>Flutter</category>
      <category>Radio</category>
      <category>radiobutton</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/398</guid>
      <comments>https://arang95.tistory.com/398#entry398comment</comments>
      <pubDate>Wed, 22 May 2024 19:24:23 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - CheckBox (17)</title>
      <link>https://arang95.tistory.com/397</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter 기초 -  CheckBox (17)&lt;/b&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;b&gt;1. Checkbox&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 사용자가 설정을 켜거나 끄는 요소로 Boolean (false | true) 로 변경하고 UI에 나타낼 수 있다.&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. CheckBox사용방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;value&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 체크박스의 현재 상태를 나타내며 true, false, null 이 될수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- null은 체크박스가 선택 가능한 상태를 표시하지만 아직 선택되지 않았을때에는 null로 입력도니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;onChanged&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 체크박스의 값이 변경될때 호출되는 콜백함수로 사용자가 체크박스를 탭했을 경우 함수가 호출되고 체크박스의 새로운 상태가 매개변수로 전달된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716346060758&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart';
import 'dart:math';

void main() {
  runApp(
    const MaterialApp(home: HomeWidget()),
  );
}

class HomeWidget extends StatelessWidget {
  const HomeWidget({super.key});

  @override
  Widget build(BuildContext context) {
    return const SafeArea(
      child: Scaffold(
        body: Body(),
      ),
    );
  }
}

class Body extends StatefulWidget {
  const Body({super.key});

  @override
  _BodyState createState() =&amp;gt; _BodyState();
}

class _BodyState extends State&amp;lt;Body&amp;gt; {
  @override
  Widget build(BuildContext context) {
    return const Column(
      children: [
        TestCheckbox(),
      ],
    );
  }
}

class TestCheckbox extends StatefulWidget {
  const TestCheckbox({super.key});

  @override
  State&amp;lt;TestCheckbox&amp;gt; createState() =&amp;gt; _TestCheckboxState();
}

class _TestCheckboxState extends State&amp;lt;TestCheckbox&amp;gt; {
  late List&amp;lt;bool&amp;gt; values;

  @override
  void initState() {
    super.initState();
    values = [false, false, false];
  }

  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        Checkbox(
            value: values[0],
            onChanged: (value) =&amp;gt; changeValue(0, value: value)),
        Checkbox(
            value: values[1],
            onChanged: (value) =&amp;gt; changeValue(1, value: value)),
        Checkbox(
            value: values[2],
            onChanged: (value) =&amp;gt; changeValue(2, value: value)),
      ],
    );
  }

  void changeValue(int index, {bool? value}) {
    setState(() {
      values[index] = value!;
    });
  }
}

class TestRaioButton extends StatefulWidget {
  const TestRaioButton({super.key});

  @override
  State&amp;lt;TestRaioButton&amp;gt; createState() =&amp;gt; _TestRaioButtonState();
}

class _TestRaioButtonState extends State&amp;lt;TestRaioButton&amp;gt; {
  @override
  Widget build(BuildContext context) {
    return const Placeholder();
  }
}&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;HomeWidget&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Flutter App의 루트 위젯역할로 HomteWidget내부에는 SafeArea, Scaffold로 구성된 레이아웃이 포함되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;SafeArea&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;Scaffold&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Material Design의 사각적 레이아웃 구조를 제공하는 위젯으로 앱의 기본적인 시각 구성 요소를 포함할 수 있따.&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;b&gt;Body&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Body에서 SatefulWidget(변경 가능한 상태)를 가질수 있는 위젯으로 정의되어 상태를 가지는 위젯은 사용자의 인터렉션에 따라 상태가 변경되고 UI가 업데이트 될 수 있다.&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;b&gt;_BodyState&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Column은 자식 위젯들을 수직으로 배열한다.&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;b&gt;TextCheckbox&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- TestCheckbox는 StatefulWidge(변경 가능한 상태)를 사용해 사용자가 체크박스의 상태를 변경할 수 있는 위젯이다.&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;b&gt;_TestCheckboxState&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- List&amp;lt;bool&amp;gt; values : 각 체크박스의 선택 상태를 저장하는 boolean 리스트로 초기값은 false이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Checkbox : 세 개의 체크박스를 표시하고 각 체크박스는 values리스트의 해당 인덱스에 저장된 값을 사용해 현재 상태를 표시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- onChanged : 체크박스를 탭할 때 호출되는 콜백함수로 changeValue를 호출해 체크박스의 값을 변경하고 setState를 통해서 UI를 업데이트 한다.&lt;/p&gt;
&lt;figure data-ke-type=&quot;image&quot; data-ke-style=&quot;alignCenter&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEoiql/btsHv7xBgPZ/oc5LzdTsOj1sSANWPvUcM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEoiql/btsHv7xBgPZ/oc5LzdTsOj1sSANWPvUcM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEoiql/btsHv7xBgPZ/oc5LzdTsOj1sSANWPvUcM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEoiql%2FbtsHv7xBgPZ%2Foc5LzdTsOj1sSANWPvUcM0%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;163&quot; height=&quot;344&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;650&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;</description>
      <category>Dart/Flutter</category>
      <category>DART</category>
      <category>Flutter</category>
      <category>os</category>
      <category>widget 라이프사이클</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/397</guid>
      <comments>https://arang95.tistory.com/397#entry397comment</comments>
      <pubDate>Wed, 22 May 2024 19:24:10 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - Stateful, Stateless (16)</title>
      <link>https://arang95.tistory.com/396</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter&amp;nbsp;기초&amp;nbsp;-&amp;nbsp; State&amp;nbsp;Basic&amp;nbsp;(16)&lt;/b&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;b&gt; StatelessWidget&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태가 없는 위젯으로 생성될 때 한번 설정되고 데이터에 따라 동적으로 변하지 않는 의미로 StateWidget은 입력 데이터나 내부 상태의 변화 없이 동일한 정보를 표시할 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 초기화시 입력된 파라미터를 기반으로 UI를 렌더링 한다.&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;b&gt;StatefullWidget&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;동적인 상태를 가질 수 있는 위젯으로 데이터의 변경에 따라 내부 상태가 변할 수 있고 변화된 상태에 따라 UI가 업데이트된다. StatefulWidget은 State객체를 생성하고 상태를 관리해 setState()메소드를 통해 상태가 변경되었을때 UI를 다시 빌드한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 위젯의 동적 상태 관리를 관리하기 위해 State클래스가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- StatefulWidget은 생성 업데이트, 소멸 등의 라이프사이클을 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1716097432445&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart';
import 'dart:math';

void main() {
  runApp(
    MaterialApp(
      home: HomeWidget(),
    ),
  );
}

class HomeWidget extends StatelessWidget {
  const HomeWidget({super.key});

  @override
  Widget build(BuildContext context) {
    return const SafeArea(
      child: Scaffold(
        body: Body(),
      ),
    );
  }
}

class Body extends StatelessWidget {
  const Body({super.key});

  @override
  Widget build(BuildContext context) {
    return Column(children: [
      ExampleStateless(),
      ExampleStateful(index: 3),
    ]);
  }
}

class ExampleStateless extends StatelessWidget {
  const ExampleStateless({super.key});

  @override
  Widget build(BuildContext context) {
    return Expanded(
      flex: 1,
      child: Container(
        color: Colors.red,
      ),
    );
  }
}

class ExampleStateful extends StatefulWidget {
  final int index;

  const ExampleStateful({required this.index, super.key});

  @override
  State&amp;lt;ExampleStateful&amp;gt; createState() =&amp;gt; _ExampleStatefulState();
}

class _ExampleStatefulState extends State&amp;lt;ExampleStateful&amp;gt; {
  late int _index;
  late TextEditingController textEditingController;

  @override
  void initState() {
    super.initState();
    _index = widget.index;
    textEditingController = TextEditingController();
  }

  @override
  void dispose() {
    textEditingController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Expanded(
      flex: 1,
      child: GestureDetector(
        onTap: () {
          setState(() {
            if (_index == 5) {
              _index = 0;
              return;
            }
            _index++;
            print(_index);
          });
        },
        child: Container(
          color: Colors.blue.withOpacity(_index / 5),
          child: Center(
            child: Text('$_index'),
          ),
        ),
      ),
    );
  }
}&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;HomeWidget&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 상태가 없는 위젯(StatelessWidget)으로 앱의 기본화면을 구성하며 Scaffold를 사용해 앱의 기본 레이아웃을 설정하고 내부 Body위젯을 포함한다.&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;Body&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- StatelessWidget이며, 두개의 자식 위젯을 Column으로 배치한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 첫번째 자식위젯 : ExampleStateless&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 두번째 자식위젯 : ExampleStateful&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;ExampleStateless&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;ExampleStateful&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 상태가 있는 위젯(StatefulWidget)은 사용자 상호작용에 반응해 내부 상태를 변경한다. 아래의 탭을 클릭할때 마다 _index가 증가해 특정값에 도달하면 0으로 리셋된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;1322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMVxxb/btsHuJ9Eybo/PFzVCBbDVkmniU2Pc71SW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMVxxb/btsHuJ9Eybo/PFzVCBbDVkmniU2Pc71SW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMVxxb/btsHuJ9Eybo/PFzVCBbDVkmniU2Pc71SW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMVxxb%2FbtsHuJ9Eybo%2FPFzVCBbDVkmniU2Pc71SW1%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;255&quot; height=&quot;562&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;1322&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;</description>
      <category>Dart/Flutter</category>
      <category> state basic</category>
      <category>Flutter</category>
      <category>Flutter 기초</category>
      <category>stateful</category>
      <category>stateless</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/396</guid>
      <comments>https://arang95.tistory.com/396#entry396comment</comments>
      <pubDate>Sun, 19 May 2024 14:50:42 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - Widget Stack (15)</title>
      <link>https://arang95.tistory.com/395</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter&amp;nbsp;기초&amp;nbsp;-&amp;nbsp; Widget&amp;nbsp;Stack&amp;nbsp;(15)&lt;/b&gt;&lt;/h3&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-origin-width=&quot;678&quot; data-origin-height=&quot;1388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xzhIT/btsHteCGhDe/b6HNh6CoVoxXor5ZKvwz6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xzhIT/btsHteCGhDe/b6HNh6CoVoxXor5ZKvwz6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xzhIT/btsHteCGhDe/b6HNh6CoVoxXor5ZKvwz6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxzhIT%2FbtsHteCGhDe%2Fb6HNh6CoVoxXor5ZKvwz6K%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;133&quot; height=&quot;272&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;1388&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;b&gt;Widget&amp;nbsp;Stack&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Stack위젯은 자식 위젯들을 겹쳐서 배치할 수 있게 해주는 위젯으로 Stack의 자식들은 기본적으로 왼쪽 상단 모서리에서 시작하여 쌓고 다른 위젯과 달리 각 자식 위젯들은 서로의 위치를 고려하지 않고 독립적으로 배치된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Stack은 가장 먼저 선언된 Container가 가장 아래에 위치하고 이후 선언된 위젯들은 위로 쌓이게 된다.&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;Stack - Align&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Align위젯은 Stack내에서 특정한 위치에 자식을 배치하고자 할때 사용되며 Stack전체 공간 내에서 자식 위젯의 정확한 위치를 조정하고 alignment속성을 통해서 결정한다.&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;Stack - Align - alignment&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- alignment속성은 Align위젯 내에서 자식을 정렬하는 방법을 결정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715934220619&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        title: Text('Flexible and Expanded'),
      ),
      body: Body(),
    ),
  ));
}

class Body extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Stack(
      children: [
        Container(
          width: 500,
          height: 500,
          color: Colors.blue,
        ),
        Container(
          width: 400,
          height: 400,
          color: Colors.red,
        ),
        Container(
          width: 300,
          height: 300,
          color: Colors.black,
        ),
        Align(
            alignment: Alignment(0.5, -0.5),
            child: Container(
              width: 200,
              height: 200,
              color: Colors.yellow,
            )),
      ],
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Dart/Flutter</category>
      <category>Flutter</category>
      <category>Flutter 기초</category>
      <category>Stack</category>
      <category>widget</category>
      <category>widget stack</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/395</guid>
      <comments>https://arang95.tistory.com/395#entry395comment</comments>
      <pubDate>Sun, 19 May 2024 12:35:09 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - Widget 비율 (14)</title>
      <link>https://arang95.tistory.com/394</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter&amp;nbsp;기초&amp;nbsp;-&amp;nbsp; Widget&amp;nbsp;비율&amp;nbsp;(14)&lt;/b&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;b&gt;Flexible, Expanded&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Flutter에서 Container공간 내의 공간비율을 조정할 때 사용되며 두 위젯은 비슷한 기능을 수행하지만 공간 할당 방식에서 약간의 차이가 존재한다.&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;1. Flexible&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;&amp;nbsp;- Flexible의 속성을 통해서 제어가 가능하다.&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%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.7674%;&quot;&gt;Flex&lt;/td&gt;
&lt;td style=&quot;width: 85.2326%;&quot;&gt;flex값이 다른 위젯 들과 비교해 공간의 분배 비율을 결정한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.7674%;&quot;&gt;Fit&lt;/td&gt;
&lt;td style=&quot;width: 85.2326%;&quot;&gt;기본값은 FlexFit.loose로 자식 위젯이 필요한 만큼의 공간만 차지하게 되어 할당된 공간을 최대한 채우도록 강제한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. Expanded&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- fit속성을 FlexFit.tight로 설정해 할당된 공간을 강제로 채운다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 자삭이 가능한 많은 공간을 차지하도록 하고 싶을 때 사용&lt;/p&gt;
&lt;pre id=&quot;code_1715930199303&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        title: Text('Flexible and Expanded'),
      ),
      body: Body(),
    ),
  ));
}

class Body extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Flexible(
          flex: 1,
          child: Container(
            height: 100,
            color: Colors.red,
            child: Center(child: Text('Flexible 1')),
          ),
        ),
        Flexible(
          flex: 2,
          child: Container(
            height: 100,
            color: Colors.blue,
            child: Center(child: Text('Flexible 2')),
          ),
        ),
        Expanded(
          child: Container(
            color: Colors.blue,
            child: Center(child: Text('Expanded')),
          ),
        )
      ],
    );
  }
}&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;-&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;1324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhQlkn/btsHr8iIQbp/4nHWrYjv5655B4SHNqtr21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhQlkn/btsHr8iIQbp/4nHWrYjv5655B4SHNqtr21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhQlkn/btsHr8iIQbp/4nHWrYjv5655B4SHNqtr21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhQlkn%2FbtsHr8iIQbp%2F4nHWrYjv5655B4SHNqtr21%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;286&quot; height=&quot;603&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;1324&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Dart/Flutter</category>
      <category>Expanded</category>
      <category>Flexible</category>
      <category>Flutter</category>
      <category>Flutter 기초</category>
      <category>widget 비율</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/394</guid>
      <comments>https://arang95.tistory.com/394#entry394comment</comments>
      <pubDate>Sun, 19 May 2024 12:34:57 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - SingleChildScrollView (13)</title>
      <link>https://arang95.tistory.com/393</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter&amp;nbsp;기초&amp;nbsp;-&amp;nbsp; SingleChildScrollView&amp;nbsp;(13)&lt;/b&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;b&gt;&amp;nbsp; SingleChildScrollView&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. SingleChildScrollView&amp;nbsp; (Vertical Scroll)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 수직 스크롤은 &lt;b&gt;Column&lt;/b&gt;위젯과 함께 사용되며 목록, 이미지, 텍스트 등의 요소들을 수직 방향으로 스크롤할 수 있도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- SingleChildScrollView의 기본 스크롤 방향으로 Column위젯을 사용해 위젯을 수직으로 나열한다.&lt;/p&gt;
&lt;pre id=&quot;code_1715866499678&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        title: Text('Vertical Scroll Example'),
      ),
      body: SingleChildScrollView(
        child: Column(
          children: List.generate(20, (index) =&amp;gt;
              Card(
                child: Padding(
                  padding: const EdgeInsets.all(16.0),
                  child: Text('Item $index', style: TextStyle(fontSize: 24)),
                ),
              ),
          ),
        ),
      ),
    ),
  ));
}&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;2. SingleChildScrollView (Horizontal Scroll)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 수평 스크롤은 Row위젯과 함께 사용되며 이미지 갤러리, 메뉴바, 카드 리스트 등에서 여러 개의 요소를 가로 방향으로 배열하고자 할때 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 스크롤 방향을 수직과는 다르게 수평으로 설정하려면 scrollDirection속성에 명시적으로 Axis.horizontal로 설정해야 자식 위젯을 수평 방향으로 스크롤을 가능하게 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1715868457863&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        title: Text('Horizontal Scroll Example'),
      ),
      body: SingleChildScrollView(
        scrollDirection: Axis.horizontal,
        child: Row(
          children: List.generate(10, (index) =&amp;gt;
          Container(
            width: 160,
            height: 160,
            color: Colors.blue,
            child: Center(
              child: Text(
                'Box &amp;amp;index',
                style: TextStyle(color: Colors.white, fontSize: 20),
              ),
            ),
          ),
        ),
      ),
    ),
    )));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;1304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDNOft/btsHq8imRbg/VEpNT9JlZACK9onLdWbCtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDNOft/btsHq8imRbg/VEpNT9JlZACK9onLdWbCtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDNOft/btsHq8imRbg/VEpNT9JlZACK9onLdWbCtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDNOft%2FbtsHq8imRbg%2FVEpNT9JlZACK9onLdWbCtk%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;279&quot; height=&quot;589&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;1304&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;</description>
      <category>Dart/Flutter</category>
      <category>column</category>
      <category>horizontal scroll</category>
      <category>Row</category>
      <category>SingleChildScrollView</category>
      <category>vertical scroll</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/393</guid>
      <comments>https://arang95.tistory.com/393#entry393comment</comments>
      <pubDate>Thu, 16 May 2024 23:16:14 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - Widget상하 좌우 배치 (12)</title>
      <link>https://arang95.tistory.com/392</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter 기초 -  Widget상하 좌우 배치 (12)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; Column과 Row는 수직 및 수평 방향으로 자식 위젯들을 정렬하고 배치하는데 사용된다.&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;1. Column&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 자식들을 수직 방향으로 배열한다.&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 26.6279%; height: 17px;&quot;&gt;mainAxisSize&lt;/td&gt;
&lt;td style=&quot;width: 73.3721%; height: 17px;&quot;&gt;Column높이를 결정한다.&lt;br /&gt;MainAxisSize.min&lt;br /&gt;MainAxisSize.max&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 26.6279%; height: 17px;&quot;&gt;mainAxisAlignment&lt;/td&gt;
&lt;td style=&quot;width: 73.3721%; height: 17px;&quot;&gt;주축(수평)에 대한 자식 위젯들의 정렬 방식을 결정한다.&lt;br /&gt;MainAxisAlignment.start&lt;br /&gt;MainAxisAlignment.end&lt;br /&gt;MainAxisAlignment.center&lt;br /&gt;MainAxisAlignment.spaceBetween&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 26.6279%; height: 17px;&quot;&gt;crosAxisAlignment&lt;/td&gt;
&lt;td style=&quot;width: 73.3721%; height: 17px;&quot;&gt;교차 축(수직)에 대한 자식 위젯들의 정렬 방식으로 결정한다.&lt;br /&gt;CrossAxisAlignment.start&lt;br /&gt;CrossAxisAlignment.end&lt;br /&gt;CrossAxisAlignment.center&lt;br /&gt;CrossAxisAlignment.stretch&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;2. Row&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%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 26.9767%;&quot;&gt;mainAxisSize&lt;/td&gt;
&lt;td style=&quot;width: 73.0233%;&quot;&gt;Row의 너비를 결정한다.&lt;br /&gt;MainAxisSize.min&lt;br /&gt;MainAxisSize.max&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 26.9767%;&quot;&gt;mainAxisAlignment&lt;/td&gt;
&lt;td style=&quot;width: 73.0233%;&quot;&gt;주축(수평)에 대한 자식 위젯들의 정렬 방식을 결정한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 26.9767%;&quot;&gt;crossAxisAlignment&lt;/td&gt;
&lt;td style=&quot;width: 73.0233%;&quot;&gt;교차축(수직)에 대한 자식 위젯들의 정렬 방식을 결정한다.&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;pre id=&quot;code_1715861889419&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Container(
  width: double.infinity,  // 가로 방향으로 무한대의 너비를 가짐
  //child: Row(
  child: Column(
    mainAxisSize: MainAxisSize.max,  // 수직 방향으로 가능한 모든 공간을 차지
    mainAxisAlignment: MainAxisAlignment.center,  // 수직 방향 중앙에 자식 위젯 배치
    crossAxisAlignment: CrossAxisAlignment.center,  // 수평 방향 중앙에 자식 위젯 배치
    children: [
      Container(
        width: 100,
        height: 80,
        color: Colors.red,
        child: Text('Container1'),
      ),
      Container(
        width: 100,
        height: 80,
        color: Colors.green,
        child: Text('Container2'),
      ),
      Container(
        width: 100,
        height: 80,
        color: Colors.blue,
        child: Text('Container3'),
      ),
    ],
  ),
);&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;</description>
      <category>Dart/Flutter</category>
      <category>Flutter 기초</category>
      <category>widget</category>
      <category>배치</category>
      <category>상하</category>
      <category>좌우</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/392</guid>
      <comments>https://arang95.tistory.com/392#entry392comment</comments>
      <pubDate>Thu, 16 May 2024 22:17:03 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - Container, Center Widget (11)</title>
      <link>https://arang95.tistory.com/391</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter 기초 -  Container, Center Widget (11)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1715838547656&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Study to Container'),
        ),
        body: CustomContainer(),
      ),
    ),
  );
}

class CustomContainer extends StatelessWidget {
  const CustomContainer({super.key});

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        width: 300,
        height: 300,
        padding: EdgeInsets.fromLTRB(10, 12, 10, 12),
        decoration: BoxDecoration(
          color: Color(0xFF85D07B),
          border: Border.all(color: Colors.red, width: 5, style: BorderStyle.solid),
          borderRadius: BorderRadius.circular(100),
          boxShadow: [
            BoxShadow(color: Colors.black.withOpacity(0.3), offset: Offset(6, 6), blurRadius: 10, spreadRadius: 10),
            BoxShadow(color: Colors.blue.withOpacity(0.3), offset: Offset(-6, -6), blurRadius: 10, spreadRadius: 10),
          ]
        ),
        child: Center(
          child: Container(
            color: Colors.yellow,
            child: Text('Hello Container'),
          ),
        ),
      ),
    );
  }
}&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;1. Container&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.0698%;&quot;&gt;크기 조정&lt;/td&gt;
&lt;td style=&quot;width: 80.9302%;&quot;&gt;width, height 로 크기 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.0698%;&quot;&gt;Padding&lt;/td&gt;
&lt;td style=&quot;width: 80.9302%;&quot;&gt;내부 자식 위젯과 Container 경계 사이의 공간을 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.0698%;&quot;&gt;Decoration&lt;/td&gt;
&lt;td style=&quot;width: 80.9302%;&quot;&gt;배경색, 테두기, 둥근 모서리, 그림자 등을 지정&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;width, height : 300 정사각형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pading: EdgeInstets.fromLTRB : 모든 방향에 패팅을적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;decoration: BoxDecoration : 배경색, 테두리, 모서리, 그림자&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. Center Widget&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;1320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pCbP5/btsHqa8RaA7/CUVIQkhgZfWHZX23jJz3vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pCbP5/btsHqa8RaA7/CUVIQkhgZfWHZX23jJz3vK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pCbP5/btsHqa8RaA7/CUVIQkhgZfWHZX23jJz3vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpCbP5%2FbtsHqa8RaA7%2FCUVIQkhgZfWHZX23jJz3vK%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;285&quot; height=&quot;595&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;1320&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;</description>
      <category>Dart/Flutter</category>
      <category>center widget</category>
      <category>Container</category>
      <category>Flutter</category>
      <category>Flutter 기초</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/391</guid>
      <comments>https://arang95.tistory.com/391#entry391comment</comments>
      <pubDate>Thu, 16 May 2024 14:54:34 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - MaterialApp, Scaffold (10)</title>
      <link>https://arang95.tistory.com/390</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter&amp;nbsp;기초&amp;nbsp;-&amp;nbsp; MaterialApp,&amp;nbsp;Scaffold&amp;nbsp;(10)&lt;/b&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;b&gt;1. MaterialApp&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 앱의 최상위 레벨에 위치하며 Material Design앱을 만드는데에 필요한 여러 설정과 기능을 제공한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.5349%;&quot;&gt;네비게이션&lt;/td&gt;
&lt;td style=&quot;width: 85.4651%;&quot;&gt;Navigator를 이용해 화면간의 라우팅 관리를 한다.&lt;br /&gt;(홈 화면, 상세 화면 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.5349%;&quot;&gt;테마&lt;/td&gt;
&lt;td style=&quot;width: 85.4651%;&quot;&gt;전체 애플리케이션에 일관된 테마(색상, 폰트, 아이콘 스타일 등)를 적용해 앱의 외관을 통일할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.5349%;&quot;&gt;로케일&lt;/td&gt;
&lt;td style=&quot;width: 85.4651%;&quot;&gt;다국어 지원을 위한 로케일 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1715746135428&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  runApp(MaterialApp(
    home: Scaffold(
      
    ),
  ))
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- main함수에서 시작해 MaterialApp 위젯을 앱 전체를 감싸 MaterialApp 위젯이 최상위 컨테이너 역할 을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- home속성으로 Scaffold를 사용해 앱이 실행될때 처음 보여지는 화면을 나타내고 Scafflod 위젯은 기본적인 레이아웃 구조를 제공한다.&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. Scaffold&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Material Design의 레이아웃 구조를 구현하는 위젯으로 다양한 UI요소를 손쉽게 추가하고 관리할 수 있도록 한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.4419%;&quot;&gt;AppBar&lt;/td&gt;
&lt;td style=&quot;width: 77.5581%;&quot;&gt;화면 상단에 위치하는 앱바(툴바)로 제목, 네비게이션 아이콘, 액션 버튼 등을 포함할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.4419%;&quot;&gt;Body&lt;/td&gt;
&lt;td style=&quot;width: 77.5581%;&quot;&gt;실제 앱의 내용이 표시되는 영역으로 주요 위젯을 배치한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.4419%;&quot;&gt;FloatingActionButton&lt;/td&gt;
&lt;td style=&quot;width: 77.5581%;&quot;&gt;동작 버튼으로 중요한 액션을 유도하는데 사용된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.4419%;&quot;&gt;Drawer&lt;/td&gt;
&lt;td style=&quot;width: 77.5581%;&quot;&gt;옆에서 슬라이드하여 나오는 메뉴로 앱의 네비게이션 링크를 포함할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.4419%;&quot;&gt;BottomNavigationBar&lt;/td&gt;
&lt;td style=&quot;width: 77.5581%;&quot;&gt;화면 하단에 위치하는 메뉴 바&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;AppBar&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- title: Text 위젯을 사용해 앱 바의 제목을 표시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- contentTitle 위젯은 제목의 위치를 결정하고 false로 설정할 경우 왼쪽에 위치하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- actions 위젯은 앱바에서 수행할 수 있는 액션을 배열 형태고 정의한다.&lt;/p&gt;
&lt;pre id=&quot;code_1715746444743&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  runApp(MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        contentTitle: false,
        title: Text('This is App bar'),
        actions: [
          IconButton(icon: Icon(Icons.home), onPressed: (){
            print('Tab!');
          })
          Icon(Icons.play_arrow),
        ],
      ),
    ),
  ));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1715746037988&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: Scaffold(
      appBar: AppBar(
          actions: [
      IconButton(icon: Icon(Icons.home), onPressed: () {
        print('Tab!');
    }, ),
      Icon(Icons.play_arrow),
      ],
        centerTitle: false,
        title: Text('This is App bar'),
    ),
    body: TestWidget(),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.bug_report),
        onPressed: (){
          print('Tab! FAB!');
        },
      ),
  ),
  ),);
}

class TestWidget extends StatelessWidget {
  const TestWidget({super.key});

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Center(
        child: Text(
          'Hello, Flutter',
          style: TextStyle(
            fontSize: 60,
            color: Colors.lightBlue,
          ),
        ),
      ),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;1334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnUIrq/btsHq2nDWX8/MvLgjKNLjuboD0uyF97BzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnUIrq/btsHq2nDWX8/MvLgjKNLjuboD0uyF97BzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnUIrq/btsHq2nDWX8/MvLgjKNLjuboD0uyF97BzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnUIrq%2FbtsHq2nDWX8%2FMvLgjKNLjuboD0uyF97BzK%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;218&quot; height=&quot;447&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;1334&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;</description>
      <category>Dart/Flutter</category>
      <category>Flutter</category>
      <category>Flutter기초</category>
      <category>materialapp</category>
      <category>scaffold</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/390</guid>
      <comments>https://arang95.tistory.com/390#entry390comment</comments>
      <pubDate>Thu, 16 May 2024 14:54:23 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - Hot restart, Hot reload (9)</title>
      <link>https://arang95.tistory.com/389</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter 기초 -  Hot restart, Hot reload (9)&lt;/b&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;b&gt;Hot restart&lt;/b&gt;&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%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.3023%;&quot;&gt;작동 방식&lt;/td&gt;
&lt;td style=&quot;width: 80.6977%;&quot;&gt;전체 앱을 다시 컴파일하여 기존의 상태를 초기화후 앱을 다시 실행한다. 앱 빌드 시간이 걸리지만 Hot Reload보다 포괄적인 코드 적용이 가능하다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.3023%;&quot;&gt;사용 시기&lt;/td&gt;
&lt;td style=&quot;width: 80.6977%;&quot;&gt;전역 변수, 초기화 코드, 앱의 실행 흐름을 변경했을때 필요하며 Hot Reload에서 해결되지 않는 문제가 발생했을 때 유용하다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.3023%;&quot;&gt;한계&lt;/td&gt;
&lt;td style=&quot;width: 80.6977%;&quot;&gt;애플리케이션의 상태가 완전히 초기화되어 데이터나 이전 상태는 모두 반영되지 않는다.&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;size18&quot;&gt;&lt;b&gt;Hot reload&lt;/b&gt;&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%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.7209%;&quot;&gt;작동 방식&lt;/td&gt;
&lt;td style=&quot;width: 81.2791%;&quot;&gt;개발자가 코드내에서 UI 또는 로직을 변경하게 되면 변경된 부분만 즉시 빌드하여 실행 중인 애플리케이션에 푸시하게된다. 이 때 앱의 상태는 유지되어 사용자가 입력한 데이터 값이나 앱의 상태가 초기화 되지 않는다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.7209%;&quot;&gt;사용 시기&lt;/td&gt;
&lt;td style=&quot;width: 81.2791%;&quot;&gt;UI레이아웃, 스타일, 애니메이션, 위젯 등 수정이 있을 경우&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.7209%;&quot;&gt;한계&lt;/td&gt;
&lt;td style=&quot;width: 81.2791%;&quot;&gt;전역 분수 혹은 초기화 단계를 변경했을 경우에는 Hot Reload가 반영되지 않는다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v10XM/btsHo4OtETf/zaNEDc8CF228t564vb02f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v10XM/btsHo4OtETf/zaNEDc8CF228t564vb02f1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v10XM/btsHo4OtETf/zaNEDc8CF228t564vb02f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv10XM%2FbtsHo4OtETf%2FzaNEDc8CF228t564vb02f1%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;826&quot; height=&quot;244&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;244&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;&lt;span style=&quot;color: #777777; text-align: center;&quot;&gt;번개 표시를 클릭하면 Hot reload가 실행되어 변경사항이 즉시 반영된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #777777; text-align: center;&quot;&gt;옆에 박스번개를 클릭하면 Hot restart가 실행되어 상태를 초기화하고 변경사항을 반영할 수 있다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Dart/Flutter</category>
      <category>Flutter</category>
      <category>Flutter 기초</category>
      <category>Hot Reload</category>
      <category>Hot Restart</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/389</guid>
      <comments>https://arang95.tistory.com/389#entry389comment</comments>
      <pubDate>Wed, 15 May 2024 11:14:45 +0900</pubDate>
    </item>
    <item>
      <title>Flutter 기초 - Widget (8)</title>
      <link>https://arang95.tistory.com/388</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flutter&amp;nbsp;기초&amp;nbsp;-&amp;nbsp;Widget&amp;nbsp;(9)&lt;/b&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;b&gt;Flutter State Basic&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Flutter에서 상태(State)는 앱이 실행될 때 동적으로 변경될 수 있는 정보로 상태는 기본적으로 State Widget에서 관리된다.&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;StatefulWidget&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 변할 수 있는 상태를 가진 위젯으로 변경사항에 따라 내용이 변할 수 있다. Stateful Widget은 State객체를 생성해 상태를 관리하고 상태가 변경될때 마다 위젯을 다시 빌드하도록 한다.&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;StatelessWidget&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 불변의 상태를 가지는 위젯으로 위젯 생성 시점에 전달된 구성 정보를 기반으로 UI를 구성해 변경되지 않고 간단한 UI표현에서 주로 사용된다.&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;Flutter Architecture&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 위젯, 렌더링엔진, 패키지 매니저 이 요소는 UI를 구성하는 기본요소로 Flutter엔진은 Dart코드를 네이티브 코드로 변환하여 렌더링 한다.&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;Flutter Gesture&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- GestureDetector위젯을 통해 이루어지며 위젯을 사용해 탭, 드래그, 핀치 등의 다양한 사용자 입력을 감지하고 응답할 수 있다.&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;Flutter Setting&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 개발 환경 설정, 플랫폼 특화설정, 테마 및 로케일 설정 등이 포함되며 Setting메뉴나 구성 파일을 통해서 사용자의 요구에 맞도록 동작방식 등을 조정 할수 있다.&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;Flutter Navigator&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 위젯간의 화면 전환을 관리하며 Navigator를 사용하면 스택 기반의 네비게이션 시스템을 구현할 수 있고 화면 간의 데이터를 전달하면서 앱 내에서 전환할 수도 있다.&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>Dart</category>
      <category>Flutter</category>
      <category>Flutter기초</category>
      <category>widget</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/388</guid>
      <comments>https://arang95.tistory.com/388#entry388comment</comments>
      <pubDate>Wed, 15 May 2024 11:14:28 +0900</pubDate>
    </item>
    <item>
      <title>Dart 기초 - 레코드 (9)</title>
      <link>https://arang95.tistory.com/387</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Dart&amp;nbsp;기초&amp;nbsp;-&amp;nbsp;레코드&amp;nbsp;(9)&lt;/b&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;b&gt;1. 레코드란&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Dart3.0 이상 부터 사용할 수 있는 새로운 타입으로 포지셔널 파라미터(positional parameter), 네임드 파라미터(named parameter)가 이 두 방식은 함수에 값을 전달할 때 유연성과 명확성을 제공한다.&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. 포지셔널 파라미터(Positional Parameter)&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;&amp;nbsp;필수 포지셔널 파라미터 : 함수를 호출할 때 반드시 값을 제공해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;선택적 포지셔널 파라미터 : 대괄호 [ ] 를 사용해 정의하며 호출시 값을 생략할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1715736051098&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  (String, int) arang = ('아랑', 25);
  print(arang);
}&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_1715736097894&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  (String, int) arang = (25, '아랑');
  print(arang);
}&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;3. 네임드 파라미터(Named Parameter)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 네임드 파라미터는 각 파라미터에 이름을 지정해 함수를 호출할 때 해당 이름을 명시해야한다. 순서는 자유롭게 사용하고 중괄호 { } 를 사용해 정의한다. 필수로 네임드 파라미터를 정의하기 위해서는 required키워드를 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1715736485740&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  arang(name: '아랑');
}

void arang({required String name, int? age}){
  print('이름 : $name 나이 : $age');
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA6ZpG/btsHpepIRFd/A8ekwyzCpT4aT03KE0gdBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA6ZpG/btsHpepIRFd/A8ekwyzCpT4aT03KE0gdBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA6ZpG/btsHpepIRFd/A8ekwyzCpT4aT03KE0gdBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA6ZpG%2FbtsHpepIRFd%2FA8ekwyzCpT4aT03KE0gdBk%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;614&quot; height=&quot;160&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;160&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>Dart</category>
      <category>DART</category>
      <category>Dart 기초</category>
      <category>Flutter</category>
      <category>레코드</category>
      <category>플러터3.0</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/387</guid>
      <comments>https://arang95.tistory.com/387#entry387comment</comments>
      <pubDate>Wed, 15 May 2024 10:37:45 +0900</pubDate>
    </item>
    <item>
      <title>Dart 기초 - 비동기 프로그래밍 (8)</title>
      <link>https://arang95.tistory.com/386</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Dart&amp;nbsp;기초&amp;nbsp;-&amp;nbsp;비동기&amp;nbsp;프로그래밍&amp;nbsp;(8)&lt;/b&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;b&gt;1. 동기 프로그래밍(Synchronous)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 동기 / 비동기는 프로그램의 작업의 실행순서나 방식에 대한 특성을 나타낸다.&lt;/p&gt;
&lt;pre id=&quot;code_1715685153176&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;동기(Synchronoous)
 - 동기 프로그래밍은 순차적으로 실행되는 방식
 - 하나의 작업이 끝나고 나서 다음 작업이 시작된다.
 - 하나씩 실행되기 때문에 순서가 명확하고 예측하기 쉽지만 작업시간이 많이 요소되는 어떠한 작업이 있을 경우 전체적인
 프로그램의 효율이 저하될수 있다.
 
 ex)
  웹 페이지에서 광고를 로딩하는 경우 광고가 완전히 불러와지기 전까지는 다른 웹 페이지가 차단될 수있다.&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1715689804895&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'dart:io';

void main(){
  print(&quot;동기 시작&quot;);
  time();
  print(&quot;동기 완료&quot;);
}

void time(){
  sleep(Duration(seconds: 3));
  print('3초 작업 완료');
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLTxlZ/btsHqpX5D05/REgr5cJsa1bdTAKRfcXkP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLTxlZ/btsHqpX5D05/REgr5cJsa1bdTAKRfcXkP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLTxlZ/btsHqpX5D05/REgr5cJsa1bdTAKRfcXkP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLTxlZ%2FbtsHqpX5D05%2FREgr5cJsa1bdTAKRfcXkP1%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;446&quot; height=&quot;236&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;236&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;b&gt;2. 비동기 프로그래밍(Asynchronous)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1715689698579&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;비동기(Asynchronous)
 - 특정 작업의 처리 결과를 기다리지 않고 다음 작업을 수행할 수 있도록한다.
 - 여러 작업을 처리할 수 있어 효율적인 작업 수행이 가능하고 시간이 많이 걸리는 작업은 백그라운드로 처리해 완료 여부에
 따라 콜백 함수나 이벤트를 통해 결과를 처리할 수 있다.
 
ex)
 광고가 다른 기능들과는 독립적으로 재생될수 있어 광고가 로드 되는동안 페이지 내에서 다른 기능을 이용할 수 있다.&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1715690266635&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'dart:io';

void main() async{
  print(&quot;작업 시작&quot;);
  time();
  print(&quot;작업 완료&quot;);
}

Future&amp;lt;void&amp;gt; time() async{
  print('비동기 시작');
  await Future.delayed(Duration(seconds: 3));
  print('비동기 완료');
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E2bkb/btsHp38P9zl/GHqAI0CeSUL5wlB91ieV1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E2bkb/btsHp38P9zl/GHqAI0CeSUL5wlB91ieV1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E2bkb/btsHp38P9zl/GHqAI0CeSUL5wlB91ieV1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE2bkb%2FbtsHp38P9zl%2FGHqAI0CeSUL5wlB91ieV1k%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;360&quot; height=&quot;288&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;288&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;</description>
      <category>Dart</category>
      <category>DART</category>
      <category>Dart 기초</category>
      <category>동기</category>
      <category>비동기</category>
      <category>비동기 프로그램</category>
      <category>비동기프로그래밍</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/386</guid>
      <comments>https://arang95.tistory.com/386#entry386comment</comments>
      <pubDate>Tue, 14 May 2024 21:38:22 +0900</pubDate>
    </item>
    <item>
      <title>Dart 기초 - 예외처리 (7)</title>
      <link>https://arang95.tistory.com/385</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Dart&amp;nbsp;기초&amp;nbsp;-&amp;nbsp;예외처리&amp;nbsp;(7)&lt;/b&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;b&gt;1. 예외란?&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1715522039490&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;프로그램 실행 중 발생하는 오류로 잘못된 프로그램의 결과값(사용자입력, 실패요청, null값 등)으로 발생할 수 있는
요소로 예외처리를 통하여 프로그램을 효율적으로 구현할 수 있다.&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;2. 예외처리 try-catch&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1715684176048&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  try{
    int result = 10 ~/ 0;
  }catch (e){
    print('에러 : $e ');
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wPzJF/btsHpyH7fBg/049pTObqDWjXWxdjKc8tbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wPzJF/btsHpyH7fBg/049pTObqDWjXWxdjKc8tbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wPzJF/btsHpyH7fBg/049pTObqDWjXWxdjKc8tbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwPzJF%2FbtsHpyH7fBg%2F049pTObqDWjXWxdjKc8tbK%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;736&quot; height=&quot;149&quot; data-origin-width=&quot;840&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;&amp;nbsp;- 0으로 는 나눌 수 없기 때문에 try에서 예외가 발생되고 catch에서 예외가 잡혀 메시지가 출력된다.&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;3. 특정 예외처리 try - catch - on&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1715684396408&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  try{
    int result = 10 ~/ 0;
  }on IntegerDivisionByZeroException{
    print('0으로 나누기 불가');
  } catch(e){
    print('에러 : $e');
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9J1Pv/btsHqukte40/KFhSwK9fZ2OnJU4NlXAVik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9J1Pv/btsHqukte40/KFhSwK9fZ2OnJU4NlXAVik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9J1Pv/btsHqukte40/KFhSwK9fZ2OnJU4NlXAVik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9J1Pv%2FbtsHqukte40%2FKFhSwK9fZ2OnJU4NlXAVik%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;590&quot; height=&quot;128&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;128&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;Dart에서 on키워드를 사용해 특정한 예외처리가 가능한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- on 키워드를 사용해 예상 가능한 예외를 특장하고 나머지 예외는 catch에서 처리한다.&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;4. finally&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1715684554295&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  try{
    int result = 10 ~/ 0;
  }on IntegerDivisionByZeroException{
    print('0으로 나누기 불가');
  } catch(e){
    print('에러 : $e');
  } finally{
    print('final은 항상 실행');
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlObsP/btsHpeiPOSv/nJb9emDHe9QGjtkNSCs9H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlObsP/btsHpeiPOSv/nJb9emDHe9QGjtkNSCs9H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlObsP/btsHpeiPOSv/nJb9emDHe9QGjtkNSCs9H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlObsP%2FbtsHpeiPOSv%2FnJb9emDHe9QGjtkNSCs9H1%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;444&quot; height=&quot;232&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;232&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;finally는 예외 발생 여부와 상관없이 항상 실행되는 코드로 주로 파일닫기 혹은 리소스해제 등에 사용된다.&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>Dart</category>
      <category>Catch</category>
      <category>DART</category>
      <category>Dart 기초</category>
      <category>exception</category>
      <category>try</category>
      <category>예외처리</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/385</guid>
      <comments>https://arang95.tistory.com/385#entry385comment</comments>
      <pubDate>Tue, 14 May 2024 21:38:11 +0900</pubDate>
    </item>
    <item>
      <title>Dart 기초 - 반복문 (6)</title>
      <link>https://arang95.tistory.com/384</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Dart&amp;nbsp;기초&amp;nbsp;-&amp;nbsp;반복문&amp;nbsp;(6)&lt;/b&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;b&gt;1. 반복문 Loop Statements&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 반복문은 특정 조건이 만족되는 동안 해당 조건의 코드를 반복적으로 실행하는 역할로 for, for in, while, do-while문을 사용할수 있다.&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;b&gt;1-1. For Loop&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- for 반복문은 반복횟수가 명확할때 주로 사용되며 초기화, 조건검사, 증감으로 구성되어 활용된다.&lt;/p&gt;
&lt;pre id=&quot;code_1714123679894&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (기존 변수; 조건식; 가변치){
	조건식이 참일 경우 반복하는 코드
}&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;- 조건 : 조건이 true일때 블록이 실행되고 반복문이 끝난뒤 다시 실행된다.&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;pre id=&quot;code_1714228444886&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  for(int i = 0; i &amp;lt; 5; i++){
    print(&quot;i값 : $i&quot;);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GxyZH/btsGYmWnFqN/15ByrXoRykBQqfkqKU5rjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GxyZH/btsGYmWnFqN/15ByrXoRykBQqfkqKU5rjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GxyZH/btsGYmWnFqN/15ByrXoRykBQqfkqKU5rjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGxyZH%2FbtsGYmWnFqN%2F15ByrXoRykBQqfkqKU5rjk%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;202&quot; height=&quot;216&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;348&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;&lt;b&gt;1-2. For in&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 컬렉션의 요소들을 for-in은 데이터 컬렉션을 순차적으로 순회할 때 사용되며 List, Set, Map 등을 다룰때 사용하고 인덱스를 직접 관리할 필요가 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1714123851849&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(단일 변수 in 컬렉션 (List, Set, Map){
	컬랙션 내의 요소들의 수 / 변수 만큼 사용될 반복문
}&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;List&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 순서가 있는 요소의 집합으로 중복된 요소를 포함할 수 있고 인덱스를 통해 요소에 접근이 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1714290107724&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
 List&amp;lt;String&amp;gt; lists = ['apple', 'banana', 'cherry'];
 for(var list in lists){
   print(list);
 }
 print(lists.length);
 print(lists[0]);
}&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; Set&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 중복되지 않는 요소의 집합으로 순서가 없고 유일성을 보장해야할때 사용된다.&lt;/p&gt;
&lt;pre id=&quot;code_1714291387658&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  Set&amp;lt;String&amp;gt; colors = {'red', 'blue', 'green', 'yellow'};
  for(var color in colors){
    print(color);
  }
  
  colors.add('white');
  print(colors);
}&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;Map&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- key와 value 쌍으로 구성된 집합으로 각 키는 유일해야하고 해당 키는 하나의 값을 가진다.&lt;/p&gt;
&lt;pre id=&quot;code_1714291899305&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  Map&amp;lt;String, int&amp;gt; members = {
    'Arang' : 25,
    'Hana' : 33,
    'hyunie' : 28
  };

  for(var member in members.entries){
    print('이름 : ${member.key}, 전화번호 : ${member.value}');
  }

  print(members['Arang']);

  members['Arang'] = 30;
  print(members);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 66.0465%; height: 88px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%; text-align: center;&quot; colspan=&quot;2&quot;&gt;for, for-in의 차이점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.5581%;&quot;&gt;for&lt;/td&gt;
&lt;td style=&quot;width: 82.4419%;&quot;&gt;반복 횟수가 명확하거나 복잡한 조건을 제어할 때 사용한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.5581%;&quot;&gt;for-in&lt;/td&gt;
&lt;td style=&quot;width: 82.4419%;&quot;&gt;모든 요소를 순화할때 사용하여 간결한 코드를 사용한다.&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;table style=&quot;border-collapse: collapse; width: 66.1628%; height: 85px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.1628%;&quot;&gt;List&lt;/td&gt;
&lt;td style=&quot;width: 83.8372%;&quot;&gt;순차적인 요소 접근이 필요할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.1628%;&quot;&gt;Set&lt;/td&gt;
&lt;td style=&quot;width: 83.8372%;&quot;&gt;중복이 없는 요소를 관리할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.1628%;&quot;&gt;Map&lt;/td&gt;
&lt;td style=&quot;width: 83.8372%;&quot;&gt;키-값 싸으로 데이터를 관리할 때&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;1-3. while&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -  조건이 true인 동안 코드 블록을 반복하여 실행하는데 사용된다.&lt;/p&gt;
&lt;pre id=&quot;code_1714292077283&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while(조건식){
	조건식이 참일 경우 실행되는 반복문
}&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_1715520944098&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  int i = 1;
  while(i &amp;lt; 5){
    print(i);
    i++;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- i의 초기값이 1이고 i가 5보다 작을 동안 조건은 true가되어 계속 실행된다. 각 반복마다 i가 출력되고 i의 값은 1씩 증가하고 6이되면 false가되어 반복문이 종료된다.&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;b&gt;1-4. do while&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 조건이 true인 동안 코드 블록을 반복하여 실행하는데 사용되며 while과 달리 do-while은 코드 블록을 먼저 실행한 후 조건을 검사한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715521167839&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  do{
    // 실행할 본문
  }while(조건문);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1715521285626&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  int i = 1;
  do{
    print(i);
    i++;
  }while(i &amp;lt;= 5);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- i의 초기값은 1로 do{ 의 코드가 먼저 실행되어 i가 출력된다. }, i가 출력되고 i는 1씩 증가하여 다음 while조건문에서 검사되고 조건이 true인 동안에 반복된다.&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;b&gt;1-5. break, continue&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- break, continue 키워드는 반복문을 제어할 때 사용되며 break, continue키워드를 사용해 반복문의 흐름을 변경하여 특정한 조건이 충족될때 반복문을 중단하거나 건너뛸수 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 63.4883%; height: 85px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.1953%;&quot;&gt;break&lt;/td&gt;
&lt;td style=&quot;width: 77.8047%;&quot;&gt;루프를 완전히 종료한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.1953%;&quot;&gt;continue&lt;/td&gt;
&lt;td style=&quot;width: 77.8047%;&quot;&gt;continue키워드를 만나는 조건의 반복문을 건너뛴다.&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;break&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 반복문이 break를 만났을때 반복문을 종료한다.&lt;/p&gt;
&lt;pre id=&quot;code_1715521517966&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  int i = 1;
  while(i &amp;lt;= 10){
    print(i);
    if(i == 5){
      break;
    }
    i++;
  }
  print('반복문종료');
}&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;continue&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- continu를 만났을때 해당 반복을 건나뛰어 실행되지 않는다.&lt;/p&gt;
&lt;pre id=&quot;code_1715521599096&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  for(int i = 1; i &amp;lt;= 10; i++){
    if(i % 2 == 0){
      continue;
    }
    print(i);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- i가 짝수일 경우 continue 키워드를 사용해 해당 반복문을 건너뛸 수 있다.&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>Dart</category>
      <category>Break</category>
      <category>continue</category>
      <category>DART</category>
      <category>do while</category>
      <category>Flutter</category>
      <category>for</category>
      <category>for in</category>
      <category>while</category>
      <category>반복문</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/384</guid>
      <comments>https://arang95.tistory.com/384#entry384comment</comments>
      <pubDate>Sun, 12 May 2024 22:47:55 +0900</pubDate>
    </item>
    <item>
      <title>Dart 기초 - 분기문 (5)</title>
      <link>https://arang95.tistory.com/383</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Dart 기초 - 분기문 (5)&lt;/b&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;b&gt;1. 분기문 Conditional Statements&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 50.815%; height: 164px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 24.9319%; height: 19px;&quot;&gt;if&lt;/td&gt;
&lt;td style=&quot;width: 75.0681%; height: 19px;&quot;&gt;if문이 참일 경우&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 24.9319%; height: 19px;&quot;&gt;else if&lt;/td&gt;
&lt;td style=&quot;width: 75.0681%; height: 19px;&quot;&gt;첫번째 if 문이 거짓일 경우&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 24.9319%; height: 19px;&quot;&gt;else&lt;/td&gt;
&lt;td style=&quot;width: 75.0681%; height: 19px;&quot;&gt;모든 조건이 거짓일 경우&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 24.9319%; height: 17px;&quot;&gt;siwch&lt;/td&gt;
&lt;td style=&quot;width: 75.0681%; height: 17px;&quot;&gt;값에 따라 다양한 케이스의 조건을 실행할 수 있다.&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;1-1. if, else if, else&lt;/p&gt;
&lt;pre id=&quot;code_1714122507674&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  int num = 90;

  if(num &amp;gt;= 90){
    print(&quot;90이상입니다.&quot;);
  } else if(num &amp;gt;= 90){
    print(&quot;80이상입니다.&quot;);
  } else {
    print(&quot;값이 이상합니다..&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;1-2. switch&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 모든 case 블록의 끝에는 break를 포함시켜야하고 default케이스는 어떤 케이스도 일치하지 않을 경우 실행된다.&lt;/p&gt;
&lt;pre id=&quot;code_1714122964195&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  String score = 'B';

  switch(score){
    case 'A':
      print(&quot;굿굿굿&quot;);
    case 'B':
      print(&quot;굿굿&quot;);
    default:
      print(&quot;잘못된 결과..&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;&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>Dart</category>
      <category>DART</category>
      <category>Flutter</category>
      <category>반복문</category>
      <category>분기문</category>
      <category>조건분기</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/383</guid>
      <comments>https://arang95.tistory.com/383#entry383comment</comments>
      <pubDate>Fri, 26 Apr 2024 18:19:53 +0900</pubDate>
    </item>
    <item>
      <title>Dart 기초 - 함수와 메서드 (4)</title>
      <link>https://arang95.tistory.com/382</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Dart&amp;nbsp;기초&amp;nbsp;-&amp;nbsp;함수와&amp;nbsp;메서드&amp;nbsp;(4)&lt;/b&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;b&gt;1. 함수 Function&lt;/b&gt;&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: 71.7442%; height: 101px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%; text-align: center;&quot; colspan=&quot;2&quot;&gt;&lt;b&gt;함수의 특징&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.5818%;&quot;&gt;재사용성&lt;/td&gt;
&lt;td style=&quot;width: 76.4182%;&quot;&gt;한번의 정의로 여러번 호출하여 사용할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.5818%;&quot;&gt;모듈성&lt;/td&gt;
&lt;td style=&quot;width: 76.4182%;&quot;&gt;복잡한 코드단을 작은 코드단으로 나누어 구분할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.5818%;&quot;&gt;독립성&lt;/td&gt;
&lt;td style=&quot;width: 76.4182%;&quot;&gt;다른 코드와 독립적으로 존재할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1714110846608&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
	int num1 = 10;
    int num2 = 20;
    int sum = add(num1, num2);
    
    print(sum);
}

int add(int num1, int num2){
	return num1 + num2;
}&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;2. 메서드 Method&lt;/b&gt;&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: 73.2558%; height: 181px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%; text-align: center;&quot; colspan=&quot;2&quot;&gt;&lt;b&gt;메서드의 특징&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.2504%;&quot;&gt;연관성&lt;/td&gt;
&lt;td style=&quot;width: 76.7496%;&quot;&gt;특정 객체와 연관되어 객체의 속성과 메서드를 묶어 클래스로 정의한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.2504%;&quot;&gt;접근제어&lt;/td&gt;
&lt;td style=&quot;width: 76.7496%;&quot;&gt;객체의 상태를 외부에서 직접 접근하는 대신 메서드를 통해서 접근함으로써 데이터를 보호할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.2504%;&quot;&gt;상속성&lt;/td&gt;
&lt;td style=&quot;width: 76.7496%;&quot;&gt;부모 클래스의 메서드를 재사용할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.2504%;&quot;&gt;다형성&lt;/td&gt;
&lt;td style=&quot;width: 76.7496%;&quot;&gt;같은 이름의 메서드가 다른 동작을 수행할 수 있도록 오버라이딩이 가능하다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1714111854947&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
	Calc calc = Calc();
    int sum = calc.add(10, 20);
    print(sum);
}

class Calc{
	int add(int num1, int num2){
	    return num1 + num2;
}&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;b&gt;3. 함수와 메서드의 차이&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;&amp;nbsp;메서드 : 클래스의 일부로 클래스의 인스턴스를 통해 호출된다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Dart</category>
      <category>DART</category>
      <category>Dart 기초</category>
      <category>메서드</category>
      <category>함수</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/382</guid>
      <comments>https://arang95.tistory.com/382#entry382comment</comments>
      <pubDate>Fri, 26 Apr 2024 15:12:41 +0900</pubDate>
    </item>
    <item>
      <title>Dart 기초 - 클래스, 생성자 (3)</title>
      <link>https://arang95.tistory.com/381</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Dart&amp;nbsp;기초&amp;nbsp;-&amp;nbsp;클래스,&amp;nbsp;생성자&amp;nbsp;(3)&lt;/b&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;b&gt;1.  Class 클래스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- class는 객체를 만들기위한 템플릿으로 class를 활용해 데이터와 코드를 그룹화해 관련된 코드를 유지하고 복잡한 문제를 관리 및 재사용성, 유지보수성을 높이는데 효율적이다.&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: 88.8363%; height: 122px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 19px; text-align: center;&quot; colspan=&quot;2&quot;&gt;Class의 구성요소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 17.6702%; height: 17px;&quot;&gt;Fields&lt;/td&gt;
&lt;td style=&quot;width: 82.3298%; height: 17px;&quot;&gt;클래스 내에 선언된 변수들로 객체의 상태나 특성을 저장해 각 인스턴스마다 고유값을 가질 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 17.6702%; height: 17px;&quot;&gt;Methods&lt;/td&gt;
&lt;td style=&quot;width: 82.3298%; height: 17px;&quot;&gt;클래스에서 정의된 함수로 객체가 수행할 수 있는 행동으로 데이터 조작, 계산 등의 결과를 수행하고 반환한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 17.6702%; height: 17px;&quot;&gt;Constructor&lt;/td&gt;
&lt;td style=&quot;width: 82.3298%; height: 17px;&quot;&gt;클래스에서 객체를 생성할때 호출되는 메서드로 생성자는 객체의 초기상태를 설정해 사용한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 17.6702%; height: 35px;&quot;&gt;Getters&lt;br /&gt;Setters&lt;/td&gt;
&lt;td style=&quot;width: 82.3298%; height: 35px;&quot;&gt;필드에 접근을 제어하는 메서드로 getter는 필드의 값을 반환하고 setter는 필드의 값을 설정한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 17.6702%; height: 17px;&quot;&gt;Inheritance&lt;/td&gt;
&lt;td style=&quot;width: 82.3298%; height: 17px;&quot;&gt;클래스가 다른 클래스의 필드나 메서드를 상속받을 수 있다. 해당 상속을 통해서 기존의 코드를 재사용하고 확장할 수 있다.&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;pre id=&quot;code_1714015361906&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
  Point point = Point(3, 3);
  print(point);
  print(point.x);
  print(point.y);
  
  Point aPoint = Point(2, 5);
  print(aPoint.x);
  print(aPoint.y);
  Point bPoint = Point(3, 10);
  print(bPoint.x);
  print(bPoint.y);
}

class Point{
  double? x;
  double? y;
  
  Point(this.x, this.y);
}&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;2. Constructor 생성자&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Default Constructors 기본생성자&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 매개변수가 없는 생성자로 클래스 내에서 명시적으로 정의하지 않았다면 컴파일러가 자동으로 제공하여 매개변수가 없는 기본 생성자를 만든다.&lt;/p&gt;
&lt;pre id=&quot;code_1714013522443&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Car{
	Car(){
    	print(&quot;이것은 디폴트 생성자&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;Redirecting Constructors 리다이렉팅 생성자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 목적이 동일한 생성자로 생성자의 본문은 비어 있지만 전달 된 생성자에 대한 초기값 등을 구현할 때 활용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1714013580974&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Car{
	String model;
    int year;
    
    Car(this.model, this.year);
    Car.namedConstructor(String model) : this(model, 2024);
}&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;Named Constructors 이름이 있는 생성자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 이름이 있는 생성자는 클래스에 여러 옵션을 제공한다.&lt;/p&gt;
&lt;pre id=&quot;code_1714013647295&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Car{
	String model;
    int year;
    Car(this.model, this.year);
    Car.named(String model){
    	this.model = model;
        this.year = DateTime().now().year;
    }
}&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;Const Constructors 상수 생성자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 컴파일 시점에서 상수로 선언된 객체를 생성하며 모든 필드는 final이어야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1714013687372&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Num{
	final int x, y;
    const Num(this.x, this.y);
}&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;Factory Constructors 팩토리 생성자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 생성자가 새로운 객체의 인스턴스를 반환하지 않도록 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1714013756865&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Num {
	static Num? _instance;
    Num._instance();
    factory Signleton(){
    	return _instance ??= Singleton._internal();
    }
}&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;</description>
      <category>Dart</category>
      <category>const</category>
      <category>constructor</category>
      <category>DART</category>
      <category>default</category>
      <category>Factory</category>
      <category>named</category>
      <category>redirecting</category>
      <category>생성자</category>
      <category>클래스</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/381</guid>
      <comments>https://arang95.tistory.com/381#entry381comment</comments>
      <pubDate>Thu, 25 Apr 2024 12:23:42 +0900</pubDate>
    </item>
    <item>
      <title>Dart 기초 - 연산자 (2)</title>
      <link>https://arang95.tistory.com/380</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Dart&amp;nbsp;기초&amp;nbsp;-&amp;nbsp;연산자&amp;nbsp;(2)&lt;/b&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;b&gt;1. 연산자&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;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;덧셈 + , &amp;nbsp;뺄셈 - , 곱셈 *, 나눗셈 /, 나머지 %&lt;/p&gt;
&lt;pre id=&quot;code_1713935750097&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
    int num1 = 10;
    int num2 = 20;

    print(num1 + num2);
    print(num1 - num2);
    print(num1 * num2);
    print(num1 / num2);
}&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;3. 대입연산자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;+=, -=, *=, /=, %=&lt;/p&gt;
&lt;pre id=&quot;code_1713936541182&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
	int num1 = 10;
    int num2 = 20;
    
	int num3 += num1;
    print(num3);
}&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;4. 비교 연산자&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 70.9302%; height: 109px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;==&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;같다&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;&amp;lt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;보다 작다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;!=&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;같지 않다&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;&amp;gt;=&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;크거나 같다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;보다 크다&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;&amp;lt;=&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;작거나 같다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1713936186138&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
	int num1 = 10;
    int num2 = 20;
    
    print(num1 == num2);  // false
    print(num1 != num2);  // true
    print(num1 &amp;gt;= num2);  // 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;size18&quot;&gt;&lt;b&gt;5. 논리 연산자&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 38.0233%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&amp;amp;&amp;amp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;논리곱(AND)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;||&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;논리합(OR)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;!&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;논리부정(NOT)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1713936623053&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
	bool bool1 = true;
    bool bool2 = false;
    
    print(bool1 &amp;amp;&amp;amp; bool2);  // false
	print(bool1 || bool2);  // true
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1713936975474&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
	bool bool1 = true;
    print(!bool1);  // 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;size18&quot;&gt;&lt;b&gt;6. 삼항 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;논리연산 ?&amp;nbsp; 참일경우 : 거짓일 경우&lt;/p&gt;
&lt;pre id=&quot;code_1713937120527&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String answer = 10 &amp;lt; 20 ? '참' : '거짓';
print(answer);&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;b&gt;7. Null Safety&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Null Safety란 변수가 절대 null이 되지 않도록 보장함으로써 웹 앱의 안정성을 향상시키고 런타임 오류를 줄일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Null을 허용하는 타입은 변수 뒤에 ? 을 붙여서 활용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;ex) int? double? bool? String?&lt;/p&gt;
&lt;pre id=&quot;code_1713935519308&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int? age;
String? name;&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;8. Non-nullable Type&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Null을 비허용하는 타입으로 변수뒤에 !를 붙여서 활용한다. 만약 값이 null인 경우에는 에러가 발생한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;ex) int!, double!, bool!, String!&lt;/p&gt;
&lt;pre id=&quot;code_1713937436666&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(){
	int? num1;
    int num2 = 10;
    
    num1 = 10;
    
    print(num1 != num2);
    print((num1 ?? 5) + num2!);
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Dart</category>
      <category>client</category>
      <category>DART</category>
      <category>Dart 기초</category>
      <category>Fultter</category>
      <category>server</category>
      <category>Web</category>
      <category>연산자</category>
      <category>연습문제</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/380</guid>
      <comments>https://arang95.tistory.com/380#entry380comment</comments>
      <pubDate>Wed, 24 Apr 2024 14:45:21 +0900</pubDate>
    </item>
    <item>
      <title>Dart 기초 - 변수와 타입 (1)</title>
      <link>https://arang95.tistory.com/379</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; Dart 기초 - 변수와 타입 (1)&lt;/b&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;b&gt;1. 변수란&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Dart언어로 프로그래밍할 때 가장 기본이 되는 단위로 특정한 값을 담아두는 그릇&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Dart에서 변수를 선언할때 타입을 명시할 수도 있고 var키워드를 사용해 타입추론을 할수도 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1713875309283&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int age = 25;
double pi = 3.14;
String name = &quot;arang&quot;;
bool isBoo = 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;size18&quot;&gt;&lt;b&gt;2. 타입&lt;/b&gt;&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%;&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: 100%; text-align: center;&quot; colspan=&quot;2&quot;&gt;&lt;b&gt;Flutter에서의 타입&lt;/b&gt;&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;bool&lt;br /&gt;int&lt;br /&gt;double&lt;br /&gt;String&lt;br /&gt;null&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;List&lt;br /&gt;Set&lt;br /&gt;Map&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;Object&lt;br /&gt;Enum&lt;br /&gt;Future&lt;br /&gt;Stream&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;&amp;nbsp;- 참 거짓 bool&lt;/p&gt;
&lt;pre id=&quot;code_1713876219792&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool 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;- 정수 int&lt;/p&gt;
&lt;pre id=&quot;code_1713876235963&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int num = 100;&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;- 실수 double&lt;/p&gt;
&lt;pre id=&quot;code_1713876258974&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;double num2 = 3.14;
double num3 = 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;- 문자 String&lt;/p&gt;
&lt;pre id=&quot;code_1713876321459&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String string = '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;- Null&lt;/p&gt;
&lt;pre id=&quot;code_1713876544490&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Null thisIsNull = null;&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;3. 타입추론&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- var 변수 선언지 타입을 명시하지 않고 var를 사용하면 컴파일러는 할당된 값에 따라 타입을 자동으로 추론한다.&lt;/p&gt;
&lt;pre id=&quot;code_1713875594483&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var age = 25;
var height = 181.9;
var name = &quot;arang&quot;;
var isboo = 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;size18&quot;&gt;&lt;b&gt;4. 동적타입&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- dynamic 어떠한 타입의 값도 저장할 수 있는 변수를 선언할 때 사용되며 dynamic변수의 타입은 런타임에 결정된다.&lt;/p&gt;
&lt;pre id=&quot;code_1713875698017&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dynamic anythig = &quot;hello&quot;;
anything = 100;&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;5. 상수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;final&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 한번 값을 할당한 후에 값이 변하지 않는 것이 상수로 객체의 속성이 변경될 수있지만 객체 자제는 변경할 수 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1713875993079&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;final String nickname = &quot;AR&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;const&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 컴파일 시점에 결정되는 상수로써 런타임에 값을 변경할 수 없고 const로 선언된 객체는 불변의 객체이다.&lt;/p&gt;
&lt;pre id=&quot;code_1713876009861&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const double pi = 3.141592;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Dart</category>
      <category>DART</category>
      <category>dart기초</category>
      <category>Flutter</category>
      <category>변수</category>
      <category>타입</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/379</guid>
      <comments>https://arang95.tistory.com/379#entry379comment</comments>
      <pubDate>Wed, 24 Apr 2024 13:49:43 +0900</pubDate>
    </item>
    <item>
      <title>Dart 기초 - Dart와 Flutter (0)</title>
      <link>https://arang95.tistory.com/378</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Dart&amp;nbsp;기초&amp;nbsp;-&amp;nbsp;Dart와&amp;nbsp;Flutter&amp;nbsp;(0)&lt;/b&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;b&gt;1. Dart&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Google에서 디자인안 멀티플랫폼 프로그래밍언어로 JavaScript를 대체가능하며 크로스플랫폼(CrossPlatform) 프로그래밍 언어를 목표로 설계되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EB%8B%A4%ED%8A%B8_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.wikipedia.org/wiki/%EB%8B%A4%ED%8A%B8_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1713873019177&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;다트 (프로그래밍 언어) - 위키백과, 우리 모두의 백과사전&quot; data-og-description=&quot;위키백과, 우리 모두의 백과사전.&quot; data-og-host=&quot;ko.wikipedia.org&quot; data-og-source-url=&quot;https://ko.wikipedia.org/wiki/%EB%8B%A4%ED%8A%B8_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)&quot; data-og-url=&quot;https://ko.wikipedia.org/wiki/%EB%8B%A4%ED%8A%B8_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EB%8B%A4%ED%8A%B8_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.wikipedia.org/wiki/%EB%8B%A4%ED%8A%B8_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;다트 (프로그래밍 언어) - 위키백과, 우리 모두의 백과사전&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;ko.wikipedia.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 95px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 19px; text-align: center;&quot; colspan=&quot;2&quot;&gt;Dart언어의 특징&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 24.6512%; height: 19px;&quot;&gt;객체지향 및 타입의 안정성&lt;/td&gt;
&lt;td style=&quot;width: 75.3488%; height: 19px;&quot;&gt;Dart는 객체지향 프로그래밍언어로 Class기반 상속과 인터페이스를 지원한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 24.6512%; height: 19px;&quot;&gt;컴파일 및 인터프리트의 실행&lt;/td&gt;
&lt;td style=&quot;width: 75.3488%; height: 19px;&quot;&gt;JIT(Just-In-Time)컴파일을 통해서 개발 중에 빠르게 테스트가능하며 AOT(Ahead-Of-Time)컴파일로 빠른 프로덕션 코드를 작성할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 24.6512%; height: 19px;&quot;&gt;효율적인 개발&lt;/td&gt;
&lt;td style=&quot;width: 75.3488%; height: 19px;&quot;&gt;Dart는 Flutter와 함께 사용될 때 핫 리로드 기능을 제공하여 변경된 코드를 실시간으로 앱에 반영할 수 있도록 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 24.6512%; height: 19px;&quot;&gt;표준 라이브러리&lt;/td&gt;
&lt;td style=&quot;width: 75.3488%; height: 19px;&quot;&gt;파일시스템, 네트워킹 등 다양한 기능을 지원하는 라이브러리를 가지고 있다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. Flutter?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Google에서 개발한 크로스 플랫폼 개발 프래임워크로 Web과 IOS와 Android 모바일 플랫폼에서 지원되는 Cross Platform으로 알려져 있고 현재 Windows / MacOS / Linux 등 Desktop Application과 Web Application 모두 Flutter로 구현할 수 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 91px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; text-align: center; height: 17px;&quot; colspan=&quot;2&quot;&gt;Flutter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 38px;&quot;&gt;쉽다&lt;/td&gt;
&lt;td style=&quot;width: 75%; height: 38px;&quot;&gt;난이도가 낮은 Dart언어를 사용해 난이도가 낮고 다른 프레임워크에 비해 쉽다.&lt;br /&gt;Widget들의 조합과 배치로 레이아웃을 구성할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot; rowspan=&quot;2&quot;&gt;높은 생산성&lt;/td&gt;
&lt;td style=&quot;width: 75%; height: 19px;&quot; rowspan=&quot;2&quot;&gt;Flutter는 생산성이 높아 하나의 코드로 여러 플랫폼을 동시에 개발가능하며 재사용이 용이하다.&lt;br /&gt;작은 모바일 기기부터 태블릿 PC, Web, Desktop을 위한 큰 사이즈의 모니터까지 대다수의 디스플레이에서 각각의 레이아웃을 제공할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;성능&lt;/td&gt;
&lt;td style=&quot;width: 75%;&quot;&gt;JIT(Just-In-Time)개발 단계에서 빠른 개발속도와 AOT(Ahead-Of-Time)컴파일로 배포시 높은 성능을 휴지할 수 있다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. Cross Platform?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 클로스플랫폼(cross-platform) 혹은 멀티플랫폼(multi-platform)은 컴퓨터 프로그램, 운영체제, 컴퓨터언어, 프로그래밍언어, 소프트웨어 등 여로 종류의 컴퓨터 플랫폼에서 동작할 수 있는 것을 뜻하는 용어로 두개 이상의 플랫폼에서 실행할 수 있다.&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;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%; text-align: center;&quot; colspan=&quot;2&quot;&gt;크로스플랫폼의 장점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.3256%;&quot;&gt;효율성&lt;/td&gt;
&lt;td style=&quot;width: 72.6744%;&quot;&gt;하나의 코드를 여러 플랫폼에서 사용할 수 있어 개발시간과 비용을 절약할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.3256%;&quot;&gt;사용자경험&lt;/td&gt;
&lt;td style=&quot;width: 72.6744%;&quot;&gt;일관된 디자인과 기능을 사용할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.3256%;&quot;&gt;시장 접근&lt;/td&gt;
&lt;td style=&quot;width: 72.6744%;&quot;&gt;여러 플랫폼의 앱을 배포해 많은 사용자가 사용할 수 있게된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.3256%;&quot;&gt;유지보수&lt;/td&gt;
&lt;td style=&quot;width: 72.6744%;&quot;&gt;하나의하나의 코드베이스에서 버그 수정이나 업데이트시 모든 플랫폼의 애플리케이션이 동시에 갱신되어 유지보수 작업이 간소화 될 수 있다.&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Dart</category>
      <category>android</category>
      <category>DART</category>
      <category>Flutter</category>
      <category>ios</category>
      <category>vscode</category>
      <category>WBS</category>
      <author>아랑팡팡</author>
      <guid isPermaLink="true">https://arang95.tistory.com/378</guid>
      <comments>https://arang95.tistory.com/378#entry378comment</comments>
      <pubDate>Wed, 24 Apr 2024 13:49:31 +0900</pubDate>
    </item>
  </channel>
</rss>