<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>솔트펀 티스토리</title>
    <link>https://saltfun.tistory.com/</link>
    <description>존재하는 이유를 적어도 하나는 얻을 수 있습니다</description>
    <language>ko</language>
    <pubDate>Tue, 7 Jul 2026 22:45:24 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>SALTFUN</managingEditor>
    <image>
      <title>솔트펀 티스토리</title>
      <url>https://tistory1.daumcdn.net/tistory/3523113/attach/b6ee9b8d10224d10a2acd9bf4ce1b14e</url>
      <link>https://saltfun.tistory.com</link>
    </image>
    <item>
      <title>Intel 13th Gen Raptor Lake CPUs Lineup</title>
      <link>https://saltfun.tistory.com/39</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.xda-developers.com/intel-13th-gen-raptor-lake/#intel-13th-gen-raptor-lake-desktop-lineup&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.xda-developers.com/intel-13th-gen-raptor-lake/#intel-13th-gen-raptor-lake-desktop-lineup&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685865215044&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;Intel 13th Gen Raptor Lake: Everything you need to know about Intel&amp;rsquo;s next-gen processors&quot; data-og-description=&quot;Intel's 13th Gen processors are here!&quot; data-og-host=&quot;www.xda-developers.com&quot; data-og-source-url=&quot;https://www.xda-developers.com/intel-13th-gen-raptor-lake/#intel-13th-gen-raptor-lake-desktop-lineup&quot; data-og-url=&quot;https://www.xda-developers.com/intel-13th-gen-raptor-lake/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b4eBFr/hySRTT0U4P/KMhJ8tgQI2FW8OMl5UM100/img.jpg?width=1200&amp;amp;height=800&amp;amp;face=0_0_1200_800,https://scrap.kakaocdn.net/dn/vNWQN/hySRW4hkX3/gVWqgkeZZYadcLHJrJgyek/img.jpg?width=1200&amp;amp;height=800&amp;amp;face=0_0_1200_800&quot;&gt;&lt;a href=&quot;https://www.xda-developers.com/intel-13th-gen-raptor-lake/#intel-13th-gen-raptor-lake-desktop-lineup&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.xda-developers.com/intel-13th-gen-raptor-lake/#intel-13th-gen-raptor-lake-desktop-lineup&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b4eBFr/hySRTT0U4P/KMhJ8tgQI2FW8OMl5UM100/img.jpg?width=1200&amp;amp;height=800&amp;amp;face=0_0_1200_800,https://scrap.kakaocdn.net/dn/vNWQN/hySRW4hkX3/gVWqgkeZZYadcLHJrJgyek/img.jpg?width=1200&amp;amp;height=800&amp;amp;face=0_0_1200_800');&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;Intel 13th Gen Raptor Lake: Everything you need to know about Intel&amp;rsquo;s next-gen processors&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Intel's 13th Gen processors are here!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.xda-developers.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;

&lt;div style=&quot;background-color: #181818; color: #000000; text-align: start;&quot;&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;color: #d3d3d3; text-align: left;&quot;&gt;
					&lt;span&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Desktop CPU&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;
					&lt;span&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Enterprise + Essentials vPro&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;
					&lt;span&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Enterprise vPro&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;/tr&gt;

			&lt;tr style=&quot;background-color: #252525;&quot;&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; S-Series (65W)&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; i5-13500, i5-13600, i7-13700, i9-13900&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; N/A&lt;/span&gt;&lt;/td&gt;
			&lt;/tr&gt;

			&lt;tr&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; T-Series (35W)&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; i5-13500T, i5-13600T, i7-13700T, i9-13900T&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; N/A&lt;/span&gt;&lt;/td&gt;
			&lt;/tr&gt;

			&lt;tr style=&quot;background-color: #252525;&quot;&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; S-Series K (125W)&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; N/A&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; i5-13600K, i7-13700K, i9-13900K&lt;/span&gt;&lt;/td&gt;
			&lt;/tr&gt;

		&lt;/tbody&gt;
	&lt;/table&gt;
&lt;/div&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;/p&gt;

&lt;div style=&quot;background-color: #181818; color: #000000; text-align: start;&quot;&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;color: #d3d3d3; text-align: left;&quot;&gt;
					&lt;span&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; Mobile CPU&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left; &quot;&gt;
					&lt;span&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; Enterprise vPro&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;
					&lt;span&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; Essentials vPro&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;
					&lt;span&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; Enterprise for Chrome vPro&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;/tr&gt;

			&lt;tr style=&quot;background-color: #252525;&quot;&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; U-Series&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; i5-1345U, i7-1365U&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; i5-1334U, i5-1335U, i7-1355U&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; i5-1345U, i7-1365U&lt;/span&gt;&lt;/td&gt;
			&lt;/tr&gt;

			&lt;tr&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; P-series&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; i5-1350P, i7-1370P&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; i5-1340P, i7-1360P&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; i5-1350P, i7-1370P&lt;/span&gt;&lt;/td&gt;
			&lt;/tr&gt;

			&lt;tr style=&quot;background-color: #252525;&quot;&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; H/HX/HK-series&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; i5-13600H/X, i7,13800H/X, &lt;br /&gt;&amp;nbsp; i9-13900H/X&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; i5-13500H, i7-13700H, i9-13900HK&lt;/span&gt;&lt;/td&gt;
				&lt;td style=&quot;color: #d3d3d3; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp; N/A&lt;/span&gt;&lt;/td&gt;
			&lt;/tr&gt;
		&lt;/tbody&gt;
	&lt;/table&gt;
&lt;/div&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Desktop Lineup&lt;/b&gt;&lt;/h4&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;K-/KF-series, T-series, S-series&amp;nbsp;&lt;/p&gt;

&lt;table style=&quot;border-collapse: collapse; width: 130%;&quot; border=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
	&lt;tbody style=&quot;background-color: #073535; color: #eeeeee; &quot;&gt;

		&lt;tr style=&quot;background-color: #669999; text-align: center;&quot;&gt;
			&lt;td  style=&quot;color: #ffffff; font-size:11px; text-align: left;&quot; colspan=&quot;17&quot;&gt;&lt;b&gt;Unlocked Desktop Processors&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;125W K-series For gamers and enthusiasts who want the most power possible &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;


		&lt;tr&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Processor&lt;br /&gt;Number&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Processor&lt;br /&gt;Cores&lt;br /&gt;(P-E)&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Processor&lt;br /&gt;Threads&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Intel® Smart&lt;br /&gt;Cache(L3)&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 5%; text-align: center;&quot;&gt;Total L2&lt;br /&gt;Cache&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;P-core Max&lt;br /&gt;Turbo&lt;br /&gt;Frequency&lt;br /&gt;(GHz)&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;E-core Max&lt;br /&gt;Turbo&lt;br /&gt;Frequency&lt;br /&gt;(GHz)&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;P-core Base&lt;br /&gt;Frequency&lt;br /&gt;(GHz)&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;E-core Base&lt;br /&gt;Frequency&lt;br /&gt;(GHz)&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Unclocked&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Processor&lt;br /&gt;Graphics&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Total CPU&lt;br /&gt;PCIe Lanes&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 8%; text-align: center;&quot;&gt;Max Memory&lt;br /&gt;Speed&lt;br /&gt;(MT/s)&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 5%; text-align: center;&quot;&gt;Memory&lt;br /&gt;Capacity&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Processor&lt;br /&gt;Base&lt;br /&gt;Power&lt;br /&gt;(W)&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 5%; text-align: center;&quot;&gt;Max&lt;br /&gt;Turbo&lt;br /&gt;Power&lt;br /&gt;(W)&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 5%; text-align: center;&quot;&gt;RCP&lt;br /&gt;(USD)&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i9-13900K&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24(8-16)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;36MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;5.8&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;4.3&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.0&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.2&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;✓&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Intel® UHD&lt;br /&gt;Graphics&lt;br /&gt;770&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 5600&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;125&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;253&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$589&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i9-13900KF&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24(8-16)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;36MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;5.8&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;4.3&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.0&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.2&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;✓&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;n/a&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 5600&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;125&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;253&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$564&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #446666; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:5px; text-align: center;&quot; colspan=&quot;17&quot;&gt;&amp;nbsp;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i7-13700K&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16(8-8)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;30MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;5.4&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;4.2&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.4&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.5&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;✓&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Intel® UHD&lt;br /&gt;Graphics&lt;br /&gt;770&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 5600&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;125&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;253&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$409&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i7-13700KF&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16(8-8)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;30MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;5.4&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;4.2&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.4&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.5&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;✓&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;n/a&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 5600&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;125&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;253&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$384&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #446666; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:5px; text-align: center;&quot; colspan=&quot;17&quot;&gt;&amp;nbsp;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-13600K&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;14(6-8)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;5.1&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;3.9&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.5&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.6&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;✓&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Intel® UHD&lt;br /&gt;Graphics&lt;br /&gt;770&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 5600&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;125&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;181&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$319&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-13600KF&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;14(6-8)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;5.1&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;3.9&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.5&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.6&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;✓&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;n/a&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 5600&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;125&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;181&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$294&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #669999; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:11px; text-align: left;&quot; colspan=&quot;17&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;65W Desktop Processors&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;non-K series&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;


		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i9-13900&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24(8-16)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;36MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;5.6&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;4.2&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.0&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Intel® UHD&lt;br /&gt;Graphics&lt;br /&gt;770&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 5600&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;65&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;219&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$549&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i9-13900F&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24(8-16)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;36MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;5.6&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;4.2&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.0&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;n/a&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 5600&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;65&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;219&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$524&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #446666; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:5px; text-align: center;&quot; colspan=&quot;17&quot;&gt;&amp;nbsp;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i7-13700&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16(8-8)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;30MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;5.2&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;4.1&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.1&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Intel® UHD&lt;br /&gt;Graphics&lt;br /&gt;770&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 5600&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;65&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;219&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$384&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i7-13700F&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16(8-8)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;30MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;5.2&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;4.1&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.1&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;n/a&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 5600&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;65&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;219&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$359&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #446666; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:5px; text-align: center;&quot; colspan=&quot;17&quot;&gt;&amp;nbsp;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-13600&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;14(6-8)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;11.5MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;5.0&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;3.7&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.7&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.0&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Intel® UHD&lt;br /&gt;Graphics&lt;br /&gt;770&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 4800&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;65&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;154&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$255&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-13500&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;14(6-8)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;11.5MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;4.8&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;3.5&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.5&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.8&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Intel® UHD&lt;br /&gt;Graphics&lt;br /&gt;770&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 4800&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;65&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;154&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$232&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-13400&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;10(6-4)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;9.5MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;4.6&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;3.3&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.5&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.8&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Intel® UHD&lt;br /&gt;Graphics&lt;br /&gt;730&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 4800&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;65&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;148&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$221&lt;/td&gt;
		&lt;/tr&gt;


		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-13400F&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;10(6-4)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;9.5MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;4.6&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;3.3&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.5&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.8&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;n/a&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 4800&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;65&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;148&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$196&lt;/td&gt;
		&lt;/tr&gt;


		&lt;tr style=&quot;background-color: #669999; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:11px; text-align: left;&quot; colspan=&quot;17&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;T-series Desktop Processors with a 35W TDP&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;



		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i9-13900T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24(8-16)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;36MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;5.3&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;3.9&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.1&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;0.8&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Intel® UHD&lt;br /&gt;Graphics&lt;br /&gt;770&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 5600&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;35&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;106&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$549&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #446666; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:5px; text-align: center;&quot; colspan=&quot;17&quot;&gt;&amp;nbsp;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i7-13700&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16(8-8)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;30MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;4.9&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;3.6&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.4&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.0&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Intel® UHD&lt;br /&gt;Graphics&lt;br /&gt;770&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 5600&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;35&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;106&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$384&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #446666; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:5px; text-align: center;&quot; colspan=&quot;17&quot;&gt;&amp;nbsp;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-13600T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;14(6-8)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;11.5MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;4.8&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;3.4&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.8&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.3&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Intel® UHD&lt;br /&gt;Graphics&lt;br /&gt;770&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 4800&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;35&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;92&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$255&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-13500T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;14(6-8)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;11.5MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;4.6&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;3.2&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.6&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.2&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Intel® UHD&lt;br /&gt;Graphics&lt;br /&gt;770&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 4800&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;35&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;92&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$232&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-13400T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;10(6-4)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;9.5MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;4.4&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;3.0&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.3&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.0&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Intel® UHD&lt;br /&gt;Graphics&lt;br /&gt;730&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 4800&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;35&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;82&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$221&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #446666; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:5px; text-align: center;&quot; colspan=&quot;17&quot;&gt;&amp;nbsp;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i3-13100T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4(4-0)&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;4.2&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;n/a&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.5&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;n/a&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Intel® UHD&lt;br /&gt;Graphics&lt;br /&gt;730&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;DDR5 4800&lt;br /&gt;DDR4 3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;128GB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;35&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;69&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;$134&lt;/td&gt;
		&lt;/tr&gt;

	&lt;/tbody&gt;
&lt;/table&gt;




&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;/p&gt;

&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Mobile Lineup&lt;/b&gt;&lt;/h4&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;HX-/H-series, U-series, P-series, N-series&amp;nbsp;&lt;/p&gt;

&lt;table style=&quot;border-collapse: collapse; width: 130%;&quot; border=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
	&lt;tbody style=&quot;background-color: #073535; color: #eeeeee; &quot;&gt;

		&lt;tr style=&quot;background-color: #669999; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:11px; text-align: left;&quot; colspan=&quot;16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;HX-series&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Gaming Laptops and Mobile Workstations&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Processor&lt;br /&gt;Number&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Processor&lt;br /&gt;Cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Processor&lt;br /&gt;Threads&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Performance&lt;br /&gt;Cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 5%; text-align: center;&quot;&gt;Efficient&lt;br /&gt;Cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 5%; text-align: center;&quot;&gt;L3&lt;br /&gt;Cache&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Max Turbo&lt;br /&gt;Frequency&lt;br /&gt;P-cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Max Turbo&lt;br /&gt;Frequency&lt;br /&gt;E-cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Base&lt;br /&gt;Frequency&lt;br /&gt;P-cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Base&lt;br /&gt;Frequency&lt;br /&gt;E-cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Processor&lt;br /&gt;Graphics&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Max&lt;br /&gt;Graphics&lt;br /&gt;Frequency&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 8%; text-align: center;&quot;&gt;DDR5&lt;br /&gt;Frequency&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 6%; text-align: center;&quot;&gt;Processor&lt;br /&gt;Base&lt;br /&gt;Power&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 5%; text-align: center;&quot;&gt;Max&lt;br /&gt;Turbo&lt;br /&gt;Power&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; width: 5%; text-align: center;&quot;&gt;Intel&lt;br /&gt;vPro®&lt;br /&gt;eligible&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i9-13980HX&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;36MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.0GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.2GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.65GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5600&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;55W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;157W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
		&lt;/tr&gt;


		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i9-13950HX&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;36MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.0GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.2GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.65GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5600&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;55W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;157W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Enterprise&lt;/td&gt;
		&lt;/tr&gt;


		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i9-13900HX&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;36MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.2GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.65GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5600&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;55W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;157W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #446666; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:5px; text-align: center;&quot; colspan=&quot;16&quot;&gt;&amp;nbsp;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i7-13850HX&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;28T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;30MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5.3GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.8GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.1GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.60GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5600&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;55W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;157W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Enterprise&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i7-13700HX&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;30MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5.0GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.7GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.1GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.55GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4800&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;55W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;157W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i7-13650HX&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;14C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.55GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4800&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;55W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;157W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #446666; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:5px; text-align: center;&quot; colspan=&quot;16&quot;&gt;&amp;nbsp;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-13600HX&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;14C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.8GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.50GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4800&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;55W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;157W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Enterprise&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-13500HX&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;14C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.7GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.8GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.50GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4800&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;55W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;157W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-13450HX&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;10C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.8GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.45GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4800&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;55W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;157W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #669999; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:11px; text-align: left;&quot; colspan=&quot;16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;H-series&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Enthusiast Laptops&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Processor&lt;br /&gt;Number&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Processor&lt;br /&gt;Cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Processor&lt;br /&gt;Threads&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Performance&lt;br /&gt;Cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Efficient&lt;br /&gt;Cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;L3&lt;br /&gt;Cache&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Max Turbo&lt;br /&gt;Frequency&lt;br /&gt;P-cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Max Turbo&lt;br /&gt;Frequency&lt;br /&gt;E-cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Base&lt;br /&gt;Frequency&lt;br /&gt;P-cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Base&lt;br /&gt;Frequency&lt;br /&gt;E-cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Processor&lt;br /&gt;Graphics&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Max&lt;br /&gt;Graphics&lt;br /&gt;Frequency&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;LPDDR5&lt;br /&gt;Frequency&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Processor&lt;br /&gt;Base&lt;br /&gt;Power&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Max&lt;br /&gt;Turbo&lt;br /&gt;Power&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Intel&lt;br /&gt;vPro®&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i9-13900HK&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;14C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.1GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;96EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6400&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;45W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;115W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Essentials&lt;/td&gt;
		&lt;/tr&gt;


		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i9-13905H&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;14C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.1GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;96EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6400&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;45W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;115W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
		&lt;/tr&gt;


		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i9-13900H&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;14C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.1GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;96EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6400&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;45W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;115W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Enterprise&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #446666; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:5px; text-align: center;&quot; colspan=&quot;16&quot;&gt;&amp;nbsp;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i7-13800H&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;14C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5.2GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.0GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.8GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;96EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6400&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;45W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;115W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Enterprise&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i7-13705H&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;14C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5.0GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.7GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.8GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;96EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6400&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;45W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;115W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i7-13700H&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;14C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5.0GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.7GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.8GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;96EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6400&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;45W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;115W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Essentials&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i7-13620H&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;10C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.8GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;64EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;45W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;115W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;-&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #446666; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:5px; text-align: center;&quot; colspan=&quot;16&quot;&gt;&amp;nbsp;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-13600H&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;18MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.8GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.8GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.1GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;80EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6400&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;45W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;95W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Enterprise&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-13505H&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;18MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.7GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;80EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.45GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6400&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;45W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;95W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-13500H&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;18MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.7GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;80EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.45GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6400&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;45W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;95W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Essentials&lt;/td&gt;
		&lt;/tr&gt;


		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-13420H&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.1GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;48EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;45W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;95W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;-&lt;/td&gt;
		&lt;/tr&gt;


		&lt;tr style=&quot;background-color: #669999; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:11px; text-align: left;&quot; colspan=&quot;16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;U-series&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Modern Thin &amp; Light Laptops&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Processor&lt;br /&gt;Number&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Processor&lt;br /&gt;Cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Processor&lt;br /&gt;Threads&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Performance&lt;br /&gt;Cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Efficient&lt;br /&gt;Cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;L3&lt;br /&gt;Cache&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Max Turbo&lt;br /&gt;Frequency&lt;br /&gt;P-cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Max Turbo&lt;br /&gt;Frequency&lt;br /&gt;E-cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Base&lt;br /&gt;Frequency&lt;br /&gt;P-cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Base&lt;br /&gt;Frequency&lt;br /&gt;E-cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Processor&lt;br /&gt;Graphics&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Max&lt;br /&gt;Graphics&lt;br /&gt;Frequency&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;LPDDR5&lt;br /&gt;Frequency&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Processor&lt;br /&gt;Base&lt;br /&gt;Power&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Max&lt;br /&gt;Turbo&lt;br /&gt;Power&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Intel&lt;br /&gt;vPro®&lt;br /&gt;eligible&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i7-1365U&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;10C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5.2GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.8GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.3GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;96EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.30GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6400&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;15W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;55W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Enterprise&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i7-1355U&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;10C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5.0GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.7GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.7GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.2GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;96EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.30GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6400&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;15W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;55W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Essentials&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #446666; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:5px; text-align: center;&quot; colspan=&quot;16&quot;&gt;&amp;nbsp;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-1345U&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;10C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.7GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.2GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;80EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.25GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6400&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;15W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;55W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Enterprise&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-1335U&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;10C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.3GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;0.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;80EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.25GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6400&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;15W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;55W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Essentials&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-1334U&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;10C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.3GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;0.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;80EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.25GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;15W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;55W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Essentials&lt;/td&gt;
		&lt;/tr&gt;


		&lt;tr style=&quot;background-color: #669999; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:11px; text-align: left;&quot; colspan=&quot;16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;P-series&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Performance Thin &amp; Light Laptops&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i7-1370P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;14C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;20T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5.2GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;96EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;28W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;64W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Enterprise&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i7-1360P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;18MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;5.0GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.7GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;2.2GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;96EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;28W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;64W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Essentials&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #446666; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:5px; text-align: center;&quot; colspan=&quot;16&quot;&gt;&amp;nbsp;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-1350P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.7GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;80EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.5GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;28W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;64W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Enterprise&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i5-1340P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;16T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4P&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8E&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;12MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4.6GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;3.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.9GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;80EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;1.45GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;28W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;64W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Essentials&lt;/td&gt;
		&lt;/tr&gt;


		&lt;tr style=&quot;background-color: #669999; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:11px; text-align: left;&quot; colspan=&quot;16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;N-series&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Entry Level Laptops and Desktops&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Processor&lt;br /&gt;Number&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Processor&lt;br /&gt;Cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Processor&lt;br /&gt;Threads&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;L3&lt;br /&gt;Cache&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Max Turbo&lt;br /&gt;Frequency&lt;br /&gt;E-cores&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Processor&lt;br /&gt;Graphics&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Max&lt;br /&gt;Graphics&lt;br /&gt;Frequency&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;LPDDR5/DDR5/&lt;br /&gt;DDR4&lt;br /&gt;Frequency&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;Max&lt;br /&gt;Turbo&lt;br /&gt;Power&lt;/td&gt;
			&lt;td style=&quot;color: #e0e0e0; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i3-N-305&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;3.8GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;1.25GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4800/4800/&lt;br /&gt;3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;15W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;i3-N-300&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;8T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;3.8GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;1.25GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4800/4800/&lt;br /&gt;3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;7W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #446666; text-align: center;&quot;&gt;
			&lt;td  style=&quot;font-size:5px; text-align: center;&quot; colspan=&quot;16&quot;&gt;&amp;nbsp;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Intel®&lt;br /&gt;Processor&lt;br /&gt;N200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;3.7GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;32EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;750MHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4800/4800/&lt;br /&gt;3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr style=&quot;background-color: #335555; color: #eeeeee; &quot;&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Intel®&lt;br /&gt;Processor&lt;br /&gt;N100&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4C&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4T&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6MB&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;3.4GHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;24EU&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;Up to&lt;br /&gt;750MHz&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;4800/4800/&lt;br /&gt;3200&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&quot;&gt;6W&lt;/td&gt;
			&lt;td style=&quot;color: #d5d5d5; font-size:9px; text-align: center;&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;a href=&quot;https://en.wikipedia.org/wiki/Intel_vPro&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;vPro&lt;/b&gt;&lt;/a&gt;: Intel vPro® brand was created in 2007 as a solution for remote IT management and support. Intel vPro® isn't intended for the average consumer, and chances are, if you're shopping around for a personal PC, you won't need to worry about it.&lt;br /&gt;
PCs that receive the vPro® brand do not just have a vPro-enabled CPU (Intel Core or Intel Xeon); they also require several supporting features, hence the &quot;platform.&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #1a98ee;&quot; href=&quot;https://www.intel.ca/content/www/ca/en/products/docs/processors/vpro/vpro-platform-brief.html&quot; data-url=&quot;https://www.intel.ca/content/www/ca/en/products/docs/processors/vpro/vpro-platform-brief.html&quot; data-component-tracked=&quot;1&quot;&gt;Intel lists&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;the following as requirements:&lt;/p&gt;



&lt;ul style=&quot;list-style-type: disc;text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
	&lt;li style=&quot;list-style-type: disc;&quot;&gt;Specific chipsets&lt;/li&gt;
	&lt;li style=&quot;list-style-type: disc;&quot;&gt;Management-optimized networking&lt;/li&gt;
	&lt;li style=&quot;list-style-type: disc;&quot;&gt;High-end memory and I/O components&lt;/li&gt;
	&lt;li style=&quot;list-style-type: disc;&quot;&gt;Windows 10/11 Pro or Windows 10/11 Enterprise&lt;/li&gt;
&lt;/ul&gt;

&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Intel vPro® is a platform that allows for improved stability thanks to IT-managed system changes, lower IT costs thanks to remote management and troubleshooting capabilities, improved security from features like Intel Authenticate and discrete Trusted Platform Module (dTPM) chips, and better performance thanks to modern networking hardware (like Wi-Fi 6) and ports (like Thunderbolt 3 and 4).&lt;/p&gt;








&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PCIe&lt;/b&gt;: PCIe is short for “peripheral component interconnect express” and it's primarily used as a standardized interface for motherboard components including graphics, memory, and storage.&lt;/p&gt;

&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MT/s&lt;/b&gt;: MT/s is short for megatransfers (or million transfers) per second and is a more accurate measurement for the effective data rate (speed) of DDR SDRAM memory in computing.&lt;/p&gt;

&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RCP&lt;/b&gt;: RECOMMENDED RETAIL PRICE&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TDP&lt;/b&gt;: TDP stands for Thermal Design Power 열 설계 전력, in watts, and refers to the power consumption under the maximum theoretical load. Power consumption is less than TDP under lower loads. The TDP is the maximum power that one should be designing the system for. This ensures operation to published specs under the maximum theoretical workload.&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;K/non-K series&lt;/b&gt;: This ‘K’ means that the CPU is unlocked for overclocking. A CPU’s base clock (BCLK) is multiplied by its clock multiplier to give us its speed in megahertz (MHz) or gigahertz (GHz). An Intel K CPU is one that allows you to change its clock multiplier on supported motherboards.
&lt;br /&gt;
For example, if your CPU’s BCLK is 100MHz and its multiplier is 43, then its overall speed is 4,300MHz (4.3GHz). If this is an Intel K CPU then you could raise its multiplier to 45, making its overall speed 4,500MHz (4.5GHz).&lt;br /&gt;
Intel K processors are unlocked for overclocking whereas non-K processors are locked. The only way to overclock a non-K processor is by overclocking its BCLK, which is always tricky and risky, and is impossible on many chipsets. Intel K processors, on the other hand, can be overclocked easily on any supported chipset (such as ones on ‘Z’ motherboards).&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;F/non-F&lt;/b&gt;: Intel F processors are usually the same as their non-F counterparts, but they lack integrated graphics, meaning they lack the internal GPUs that non-F Intel CPUs have.&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;S-series&lt;/b&gt;: &quot;Performance-optimized lifestyle&quot; – a little lower performance in exchange for lower power draw.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;T-series&lt;/b&gt;: &quot;Power-optimized lifestyle&quot; – much lower performance, but also much lower power draw.&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HX/H-series&lt;/b&gt;: H in Intel Processors means that the CPU is High-Performance Optimised for Laptops. Meaning that H-series CPUs are only found in High-performance Laptops. The HX-series is an extension of the H-series in a physically bigger package and higher power envelope. 
The HX-series are using desktop silicons with higher core count, but also limited graphics performance.&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;X&lt;/b&gt;: &quot;X&quot; is simply the letter denoting the highest-end desktop CPU available from Intel in that generation.&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;U-series&lt;/b&gt;: U means &quot;ultra-low-power,&quot; and that's basically it—they're chips that aren't necessarily the very best in terms of CPU performance, but they're instead low-power designs made with efficiency in mind. They have lower clock speeds, lesser cores, and more importantly, a very low TDP.&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;P-series&lt;/b&gt;: Like the U-series, Intel's P-series are parts found on thin and lightweight laptops. However, power consumption is brought up a bit, and so is performance.
&lt;br /&gt;
P processors sip a little more power—28W, to be precise. That's almost twice (or even triple!) what a U-series chip requires. As such, power and thermal requirements for these chips are higher, and you'll need beefier cooling.
&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;N-series&lt;/b&gt;: Intel replaced Celeron and Pentium brands with something called N Series CPU’s. Put simply, N series CPU’s have no “Performance” cores. They are exclusively “Efficiency” cores.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>OTHERS</category>
      <category>Intel CPU #13th Gen #i9 CPU</category>
      <author>SALTFUN</author>
      <guid isPermaLink="true">https://saltfun.tistory.com/39</guid>
      <comments>https://saltfun.tistory.com/39#entry39comment</comments>
      <pubDate>Mon, 5 Jun 2023 13:00:09 +0900</pubDate>
    </item>
    <item>
      <title>백스터 효과 Backster Effect</title>
      <link>https://saltfun.tistory.com/36</link>
      <description>&lt;p&gt;백스터 효과에 대해 검색하던 중 찾아낸 글이다. 2002.3.28에 작성된 것.&lt;/p&gt;
&lt;p&gt;아래는 그 전문(全文)이다.&lt;/p&gt;
&lt;p&gt;백스터 효과 Backster Effect &lt;a href=&quot;http://www.rathinker.co.kr/skeptic/plants.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.rathinker.co.kr/skeptic/plants.html&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1603308812534&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;식물의 인식, 박스터 효과&quot; data-og-description=&quot;식물은 셀룰로스 세포벽은 있지만, 신경계 혹은 감각기관이 없는 살아있는 생명체이다. 이와 달리 동물은 세포벽은 없지만 신경계 혹은 감각기관을 가지고 있다. 식물 혹은 동물 생리학자들중&quot; data-og-host=&quot;www.rathinker.co.kr&quot; data-og-source-url=&quot;http://www.rathinker.co.kr/skeptic/plants.html&quot; data-og-url=&quot;http://www.rathinker.co.kr/skeptic/plants.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/plants.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.rathinker.co.kr/skeptic/plants.html&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;&gt;식물의 인식, 박스터 효과&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;식물은 셀룰로스 세포벽은 있지만, 신경계 혹은 감각기관이 없는 살아있는 생명체이다. 이와 달리 동물은 세포벽은 없지만 신경계 혹은 감각기관을 가지고 있다. 식물 혹은 동물 생리학자들중&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.rathinker.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2&gt;plant perception (a.k.a. the Backster effect) 식물의 인식 (백스터 효과)&lt;/h2&gt;
&lt;p&gt;식물은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.fibersource.com/f-tutor/cellulose.htm&quot;&gt;셀룰로스&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;세포벽은 있지만, 신경계 혹은 감각기관이 없는 살아있는 생명체이다. 이와 달리 동물은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.britannica.com/bcom/eb/article/8/0,5716,108758+1+106125,00.html?query=plant%20cells&quot;&gt;세포&lt;/a&gt;벽은 없지만 신경계 혹은 감각기관을 가지고 있다.&lt;/p&gt;
&lt;p&gt;식물 혹은 동물 생리학자들중에서 식물의 의식이나 초능력(&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/esp.html&quot;&gt;ESP&lt;/a&gt;)를 검사하려고 한 사람은 아무도 없었다. 이는 그들의 지식으로 식물이 인간 수준의 감정이나 인식을 할 가능성은 전혀 없다고 판단하기에 충분했기 때문이다. 일반 사람의 말로,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;식물은 뇌 혹은 뇌와 비슷한 어떠한 것도 가지고 있지 않다.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;그러나, 식물과 동물과학에 대해 완전히 무지한 어떤 사람이 식물의 인식과 감정을 검사했을 뿐만 아니라 식물이 상당한 감정과 생각을 한다는 과학적인 증거를 가지고 있다고 주장했다. 그는 식물이 사람의 마음을 읽을 수 있다고 까지 주장했다. 그의 이름은 클리브 백스터(&lt;a href=&quot;http://www.backster.net/&quot;&gt;Cleve Backster&lt;/a&gt;)였으며, 그는 그의 연구를 초심리학 국제 저널(&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;International Journal of Parapsychology&lt;/i&gt;)(&quot;식물의 삶에서 일차 인식의 증거 Evidence of a Primary Perception in Plant Life,&quot; 10, 1968)에 실었다. 그는 그의 화초를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/polygrap.html&quot;&gt;거짓말탐지&lt;/a&gt;기로 검사했으며, 화초가 생각과 위협에 반응한다는 것을 발견했다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://cihs.takeone.net/cihs/admin_resident.asp&quot;&gt;백스터 박사&lt;/a&gt;는 '메디치나 알터너티바(Medicina Alternativa)'에서 보완의학으로 D.Sc. 학위를 받았다고 주장한다(1996). 그는 박사 학위를 이용해서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://cihs.takeone.net/index.htm&quot;&gt;캘리포니아 인간 과학 연구소&lt;/a&gt;(사립대학 및 연구소)라는 히로시 모토야마가 &quot;3차원으로서의 인간&quot;에 대한 연구를 위해 설립한 비인가 대학에서 한자리를 차지했다. 모토야마 박사는 과학자이며, &quot;공간과 시간의 한계를 초월하여 볼 수 있는 '의식상태'로 해탈한&quot; 신도(神道) 승려라고 불리기도 한다.&lt;a href=&quot;http://cihs.takeone.net/whatsnew/motoyama_book.asp&quot;&gt;*&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;백스터의 주장은 호로위츠, 루이스, 및 가스타이거 (1975)와 크메츠(1977)에 의해서 반박되었다. 크메츠는 1978년 스켑틱칼 인콰이어러(&lt;i&gt;Skeptical Inquirer&lt;/i&gt;)에 백스터에 반대되는 사례를 정리했다. 백스터는 그의 연구를 함에 있어서 적절한 대조구를 사용하지 않았다. 대조구를 사용한 경우에는 사람의 생각 혹은 위협에 대한 식물의 반응이 검지되지 않았다. 이들 연구자들은 거짓말 탐지기가 심하게 움직인 것은 정전기, 방안에서 움직임, 습기의 변화등을 포함한 상당히 많은 요인에 의할 수 있음을 발견했습니다.&lt;/p&gt;
&lt;p&gt;그럼에도 불구하고, 백스터는 여러&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/occult.html&quot;&gt;오컬트&lt;/a&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/parapsy.html&quot;&gt;초심리학&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/pseudosc.html&quot;&gt;사이비과학&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;개념에서 매력적인 사람이 되었다. 그의 업적은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/dowsing.html&quot;&gt;수맥찾기&lt;/a&gt;&lt;b&gt;&lt;a href=&quot;http://www.hlla.com/reference/dowsing.html&quot;&gt;*&lt;/a&gt;&lt;/b&gt;, 다양한 형태의 에너지 치유&lt;b&gt;&lt;a href=&quot;http://www.lightworks.com/MonthlyAspectarian/1998/May/0598-05.htm&quot;&gt;*&lt;/a&gt;&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/remotevw.html&quot;&gt;천리안&lt;/a&gt;, 및&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/silva.html&quot;&gt;실바 마인트 컨트롤&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(현재는 실바 방법으로 알려짐)을 지지하는 것으로 인용되고 있다. 1995년, 벡스터는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.ecumenical.bigstep.com/generic.jhtml?pid=13&quot;&gt;텍사스 라레도(&lt;/a&gt;&lt;a href=&quot;http://www.ecumenical.bigstep.com/generic.jhtml?pid=13&quot;&gt;Laredo, Texas&lt;/a&gt;&lt;a href=&quot;http://www.ecumenical.bigstep.com/generic.jhtml?pid=13&quot;&gt;)에서 열린 실바 국제 컨벤션&lt;/a&gt;에서 강연 초청을 받았다. 처음 그의 발견이 있은지 거의 30년이나 지났지만, 그는 아직도 같은 이야기를 말했다. 이 이야기는 널리 알려진 이야기이며, 여기서 다시 서술할 가치가 있다. 이 이야기는 그의 호기심많은 성품을 드러낼 뿐만아니라&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/confirmbias.html&quot;&gt;편향확증&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/selfdeception.html&quot;&gt;자기기만&lt;/a&gt;의 위험성에 대한 그의 명백한 무지를 보여주기도 한다. 백스터는 분명히 왜 인과관계를 연구할 때 과학자들이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/control.html&quot;&gt;대조구&lt;/a&gt;를 사용하는지 이해하지 못함이 명백하다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;그 &quot;실험실&quot;과 유레카! 경험&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;백스터는 우리들에게, 처음 실험을 했던 것이 1966년 2월 2일 뉴욕에 있는 그의 실험실에서라고 말한다. 그의 실험실은 과학실험실이 아니었다. 사실, 처음에는 실험실과 비슷하지도 않았다. 그곳은 단지&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/polygrap.html&quot;&gt;거짓말 탐지기&lt;/a&gt;의 사용을 훈련하기 위한 장소였을 뿐이다. 그 방에는 식물이 한 그루 있었다. 그는 다음과 같이 회상했다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;무슨 이유에서인지, 나에게, 식물의 뿌리 부분에 물을 주면 얼마 후에 긴 줄기를 따라서 결국 잎으로 물이 도달하는지 알아보는 것이 매우 재미있을 것 같다는 생각이 떠올랐다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;식물에게 물을 충분히 준 다음에, 내 생각은, &quot;글쎄, 어떻게 할까...근처에 거짓말 탐지기가 있지, 거짓말 탐지기의 갈바니 피부반응 장치 부분을 잎에 대보자.&quot;&lt;a href=&quot;http://www.avlispub.com/id340.htm&quot;&gt;*&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;거짓말 탐지기의 갈바니 피부 반응(&lt;a href=&quot;http://www.xrefer.com/entry/150314&quot;&gt;galvanic skin response&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;, GSR) 부분은 피부의 저항을 측정하여 전류로 바꾸는 장치이다. 거짓말 탐지기를 옹호하는 사람들은 갈바니 피부 저항이 불안과 관련있으며, 그렇기 때문에 진실과도 관련이 있다고 생각한다. 이론에 따르면 사람이 거짓말을 할 때는 불안해지고, 땀의 많이 더 나는 것은 아니지만, 측정가능하다는 것이다. 땀이 증가하면, 전류에 대한 저항이 줄어든다. 분명히, 백스터는 호기심이 많은 사람이다. 호기심이 적은 사람이라면, 사무실의 나무에 물을 주었을 때 뿌리에서 잎까지 얼마나 시간이 걸릴지 관심도 없었을 것이다. 백스터는 관심을 가졌을 뿐만 아니라 그의 거짓말 탐지기 장비를 이용해서 이를 측정하려 하였다. 그는 다음과 같이 추론했다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;물을 주면 그 물이 줄기를 타고 올라와서 잎으로 내려간다면, 잎에는 물이 더 많아 질 것이고, 보다 전기가 잘 흐르게 될 것이고 ..나는 이것을 거짓말 탐기지의 기록지를 살펴봄으로써...물이 올라온 시간을 알 수 있을 것이라고 생각했습니다...&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;왜 거짓말 탐지기가 이것을 감지할 것이라고 생각했는가?그는 이것은, &quot;저항의 변화를 측정할 수 있도록 설계된 휘스톤 브릿지 회르를 사용하기 때문이다&quot;라고 말했다. 아마도 물이 잎으로 올라오면서 저항의 변화가 생기고 이것이 거짓말 탐지로에 검출될 것이다. 그는 저항이 서서히 감소할 것이라고 예측하고 물이 잎에 도달하면서 바늘이 올라갈 것을 계속 살피며 기다리고 있었다. 그런데, 대신에 반대의 현상이 일어난 것이다. 그는, 이것이 &quot;나를 약간 &amp;nbsp;놀라게 했다&quot;고 말했다.&lt;/p&gt;
&lt;p&gt;분명히, 그는 전극을 움직였고 거짓말 탐지기 기록지에 높고 낮게 움직이는 것이 사람을 대상으로&amp;nbsp;검사를 실시할 때, 당황스런 질문을 할 때 보이는 변화 모양&quot; 이었다. 백스터는 이제 식물의 뿌리에서 잎으로 물이 전달되는 시간을 측정하는 것에 대한 흥미를 잃었다고 한다. 그는 식물이 자신에게 사람 같은 반응을 보여주려고 한다고 믿었다고 말한다. 그 다음으로 떠오른 생각은 &quot;거짓말 탐지기 조사를 받고 있는 사람에게 범죄에 관한 적절한 질문을 할 경우, 그가 만약 거짓말을 하고 있었다면 위협이 될 수 있는 것처럼, 식물에게 어떻게 하면 위협이 될 수 있는가&quot;를 생각하게 되었다고 한다. 이것은 진짜 놀라운 일이다. 기록지의 그래프가, 즉시 그의 관심사를 확인하도록 만들었다. 분명히, 그 순간 전까지는 분명히 백스터는 사람들과 마찬가지이며 이와 비슷하게 반응할 것이라고 전혀 의심하지 않았다. 왜 그가 식물을 위협하려고 했는지는 분명하지 않다. 아마도 그가 피험자도 역시 위협했었지 않았을까 의심해볼 뿐이다. 그리고 왜 안녕(安寧)에 대한 위협이 거짓말을 하려고 할 때와 같은 종류의 반응인지도 분명하지 않다. 최소한, 백스터는 식물이 그를 속일 수 있다는 개념만큼은 진지하게 생각하지 않은 것 같다.&lt;/p&gt;
&lt;p&gt;백스터는 잎을 따뜻한 커피에 담기는 것과 같은 행위로 화초가 반응을 일어나도록 13분 55초간 시도했으나, 반응이 없었다고 한다. 소극적인 심문자라면 여기서 포기하고 집으로 돌아갔을 것이나, 백스터는 달랐다. 그는 화초가 지겨워 하고 있다고 결론을 내렸다. 그리고는, 드뎌 그는 갑자기 뭔가 번뜩이면서 방법을 알아냈다! &quot;나는 무엇을 해야할지 알았습니다. 나는 거짓말 탐지기에 연결된 바로 그 화초의 잎을 태우려 했습니다.&quot;여기서, 왜 그가 잎을 태우려 했는지는 분명하지 않다. 왜냐하면 태우면 a)수분을 제거하기 때문에&amp;nbsp;검류계(galvanic response)의 측정이 불가능하며, b) 화초의 잎에 연결된 그의 장비를 손상일 입힐 수 있기 때문이다. 어쨋든, 그는 자신의 계획을 실행하는데 문제가 있었다고 한다. 바로, 성냥이 없었던 것이다. 그러나, 그는 화초로부터 약 1.5 m 떨어져 서 있었음에도 불구하고 거짓말 탐지기가 &quot;매우 심하게 움직였다&quot;고 한다. 백스터는 이것이 드디어 물이 뿌리에서 잎으로 올라왔다거나, 혹은 다른 자연적인 일로 인하여 거짓말 탐지가의 바늘이 움직였다고 생각하지 않고, 화초가 그의 마음을 읽고 잎을 태우려는 의도에 대해 반응한 것이라고 확신했다. 이것한 추론을 그 시점에서 했다는 것은 참으로 흥미로운 것이다. 그는 그의 거짓말 탐지기의 움직임에 대해서 다른 가능할 법한 설명에 대해서 고려한 흔적도 없다. 이것을 보고 일부 독자들은, 매우 뛰어난 사람이 진실을 바로 파악했던, 좋은 일로 생각할 &amp;nbsp;수도 있다. 그러나, 이것은 직관이 틀릴 수 있기 때문에 나쁜 일이다. 그리고 이것보다 더 신기한 것은 이 실험이 있은 후 지난 30년 동안 그들이 말하는 식물의 인식의 연구에 대해서 대조구의 중요성을 백스터와 그의 지지자들이 이해하고 있다는 어떠한 증거도 없다는 점이다.&lt;/p&gt;
&lt;p&gt;어쨌거나, 원래 실험을 다시 살펴보면, 백스터는 과학의 이름으로 사소한 절도를 행했음을 인정했다. 즉 그는 다른 사무실로 가서, 비서의 책상 서랍을 열고 성냥을 꺼냈다. 그가 실험을 하기 위해서 다시 돌아오고, 성냥을 키자, 조심스럽고 관찰력이 뛰어났던 그는 거짓말 탐지가가 더 심하게 요동치기 때문에 더 이상의 움직을 측정할 수 없었다. 그래서, 그는 방을 나왔다. 그가 다시 올아왔을 때 &quot;이러한 현상이 다시 벌어졌고, 이것은 분명히 둥근 모양으로 나타났고 분명하고 분명한 양질(良質)의 관찰을 할 수 있었다&quot;라고 말했다. 그가 말한 &quot;분명하고 분명한 양질의 관찰&quot;이 무엇을 의미하는지는 명확하지 않다. 백스터의 진정한 천재성은 이 뛰어난 실험에 대한 그의 다음과 같은 마지막 의견에서 보여진다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;이제, 거짓말 탐지기 학교 당시 거짓말 탐지기를 같이 사용했던 나의 동료가 돌아오자, &amp;nbsp;그가 화초의 잎을 태우려 의도하는 동안 같은 현상이 일어났다. 만약 그가 식물의 잎을 태우려고 하는 시늉만 하면, 반응하지 않았다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;식물은 실제로 당신이 하려는 것과 시늉만 하는 것을 구분할 수 있었다. 이것은 그 자체가 식물 심리학의 입장에서 매우 흥미로운 것이었다.&lt;a href=&quot;http://www.avlispub.com/id340.htm&quot;&gt;*&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;식물 심리학? 나는 그날 밤 백스터가 이것을 발명했다고 생각한다. 그가 만약, 인과관계 설정에 있어서 대조구 실험의 중요성에 대해서 수박 겉핡기 식의 지식이라고 있었으면, 그는 아마도 다르게 결론을 내렸을 것이다. 첫 단계는 우선 명확하게 무엇을 시험할 것인가를 정의하고 각 단계마다 어떠한 순서로 해야하는지 명확하게 하는 것이다. 백스터와 그의 파트너는 불을 태우려는 의도와 불을 태우려고 의도를 흉내내는 것의 차이를 명확하게 정의하지 않았다. 그 다음, 거짓말 탐지기 이외에 화초의 전류를 측정하는 다른 좀더 좋은 방법이 있었을 것이다. 그들은 다른 전문가들과 상의해서 적절한 실험장치를 갖추고 실험을 했어야 한다. 그들이 어떠한 것을 검사하고 어떻게 검사할 것인지를 명확하게 한 후에 비서를 시켜서 그들도 모르게 의도 혹은 흉내를 내도록 하고, 20 회 가량을 한 후 그 결과를 수집해야 했다. 그들은 제 3자에게 어떤 것이 의도를 가진 것이고 어떠한 것이 의도가 아니라 흉내만 낸 것인지 말 하고, 제 3자들은 이것을 비서의 자료와 비교해야 한다. 제 3자는 거짓말 탐지기를 운영하는 사람이 비서가 실험중에 어떠한 행동을 하는지 볼 수 없고, 그렇기 때문에 그녀의 행동에 영향을 받지 않았다는 것을 확실히 해야 한다. 그리고 좀더 비서가 화초를 태우려고 의도할 때의 움직임이 거짓말 탐지기의 반응을 일으키지 않는다는 것을 확실하게 하기 위해서 의도할 때와 흉내낼 때 모두 같은 동작을 해야한다. 또한 그는 서로 다른 종류의 화초를 대상으로 여러번의 시도를 해야한다. 그리고 실험을 하기 직전에는 식물에 물을 주어서는 안될 것이다. 그는 습기와 습도가 검류계의 결과를 판독하는데 영향을 줄 수 있다는 것을 알아야만 한다. 백스터가 대조구 비슷한 실험을 전혀 한적이 없다는 것과 1966년 그가 화초에 거짓말 탐지기를 연결한 것에 대한 이해가 더 이상 발전하지 않았다는 것이 사실이다. 백스터의 추종자들은 충심으로 전세계에 걸쳐서 수천번이나 이러한 실험이 반복되었다고 한다. 불행히도, 재현되었다는 것은 첫 번 실험이 적절하게 수행되었을 때에만 그 결과를 정당화시키는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;씨를 뿌리고 수확하기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;백스터의 주장은 세상에 널리 알려지고 백스터 정도의 자질과 지식을 갖춘 몇 몇 사람들에 의해서지지받았다. 이들은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://atlantisrising.com/issue3/ar3thompkins.html&quot;&gt;저널리스트&lt;/a&gt;인 피터 톰킨스(Peter Tompkins), 그리고 1989년 식물의 사생활이라는 책을 냈던&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/1558212566/qid=980094321/sr=1-1/ref=sc_b_1/102-5094072-5355306&quot;&gt;정원사&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;크리스토퍼 버드이다. 이 책은 백스터와, 식물이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/telepath.html&quot;&gt;텔레파시&lt;/a&gt;를 이용해서 인식을 하고 두려움과 사랑같은 감장을 경험한다는 사실을 주장했다는 다른 과학자들의 연구 결과를 일반에 알렸다. 버드는&quot;현대 채소 정원 꾸미기(&lt;i&gt;Modern Vegetable Gardening&lt;/i&gt;)의 저자이며, 톰킨스 역시 '대 피라미드의 비밀들(1997)', '자연의 비밀스런 삶:요정에서 쿼크에 이르기까지 자연의 영혼의 비밀스런 세계와 조화롭게 살아가기(1997)', 및 '토양의 비밀들: 우리의 행성을 회복하기 위한 새로운 해결책(1998)'과 같은 몇 몇 &quot;비밀&quot;시리지의 저자이다.&lt;/p&gt;
&lt;p&gt;백스터의 결과에 대한 지지자이며 널리 알리고 있는 사람으로는 로버트 스톤 박사가 있다. 그는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.mensa.org/&quot;&gt;멘사&lt;/a&gt;(역주 : IQ 가 상위 2% 이상이 되어야만 가입할 수 있는 단체)의 회원이며, 1994년 출판된 '당신의 세포의 비밀스런 삶'의 저자이기도 하다. 스톤은 도한 '실바 방법(&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/9991400931/ref=ed_oe_h/102-5094072-5355306&quot;&gt;Silva Method&lt;/a&gt;)(Jose&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.silvamethod.co.uk/index.html&quot;&gt;Silva's&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;mind control and self-healing program)'과&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0671796372/qid=980095407/sr=1-31/ref=sc_b_6/102-5094072-5355306&quot;&gt;Silva Method: Unlocking the Genius Within&lt;/a&gt;&lt;/i&gt;의 저자이기도 한다. 스톤과 실바는 공동으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;&lt;a href=&quot;http://www.silvamethod.co.uk/page7.html&quot;&gt;You the Healer&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;라는 책을 내기도 했다. 그러나, 만약 어떤 사람이 과학 잡지를 조사한다면 그 사람은 식물이 텔레파시를 갖고 있거나 감정을 느낀다는 개념을 지지하는 논문을 찾지 못할 것이다.&lt;/p&gt;
&lt;p&gt;식물이 인식할 수 있다는 개념에 대한 과학적인 지지가 없음에도 불구하고 이러한 개념은 많은 사람들에게 사실로 받아들여질 뿐만 아니라, 수 많은 과학적인 연구에 의해서 확립되었다고 믿어지고 있다! 실제로, 식물이 &quot;생체 에너지장&quot;을 &quot;판독&quot;해서 인간의 생각을 이해하는 이러한 힘은 초심리자학자들에게 백스터 효과라고 알려져 있다.&lt;a href=&quot;http://www.vogelcrystals.com/legacymarcel.htm&quot;&gt;*&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;백스터의 주장을 방어하는 전형적인 증언은 다음과 같은 것이다. 그들이 얼마나 반복적으로 백스터의 실험이 수 많은 사람들에 의해서 여러번 재현되었다고 주장하는지 살펴보라. 그리고 마치 말 잘하는 이야기 꾼 처럼 이들 옹호자들은 이야기를 몇가지 흥미로운 과장을 덧붙인다는 것도 살펴보라. 그러나, 어떠한 이들 증언도 백스터의 주장을 검증하려는 과학적인 시도가 실패했다는 비판적인 연구는 언급하지 않을 것이며, 왜 그의 연구가 문제가 있는지 설명한 것은 하나도 없다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;클리브 백스터는 폴리그래프(거짓말 탐지기)를 사용해서 식물을 검사하기 위해서 전극을 잎에 대었습니다. 전기적인 신호를 기록함으로써 그는 식물이 그의 생각, 특히 식물의 안녕을 해치는 생각에 극도로 민감하게 반응한다는 것을 발견했습니다. 백스터는 근처의 가장 작은 세포가 죽게되는 경우에도 반응한다는 것을 관찰했습니다. 그는 그들이 일종의 기억을 가지고 있으며, 그 전에 근처의 식물에게 해를 끼친 사람에게 반응하기 때문에, 모르는 여러 사람을 한 줄로 세우면 식물이 그러한 행동을 한 사람을 찾아낼 수 있다고 지적했습니다.(죤 밴 마터, 신지학자).&lt;a href=&quot;http://www.theosophy-nw.org/theosnw/brother/br-jvmj2.htm&quot;&gt;*&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;hr width=&quot;50%&quot; /&gt;
&lt;p&gt;&lt;b&gt;클리브 백스터는 그가 식물이 일차적인 감각을 가지고 있으며 이것으로 인간의 생각을 감지하고 그것에 대해서 반응할 수 있다고 처음 주장한 1968년 이후로 널리 유명하고 악명도 높습니다. 이것은 민감한 의식을 가진 식물이 텔레파시를 가지고 있으며, 비 물리적인 정보를 처리할 수 있다는 것과 같은 말입니다. 이것은 물론, 모든 분야의 과학자들에게 상당한 충격과 분노, 그리고 두려움을 주었으며, 박스터는 대중매체에서 웃음거리가 되었으며, 그에 대해서 좋은 말을 해줄 것이 없는 냉철한 초심리학자을 기쁘게 했습니다.&lt;a href=&quot;http://www.skepdic.com/plants.html#note1&quot;&gt;*&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;1980년대 말 신경생물학자들이 식물이 &quot;미발달 신경망 (rudimentary neural nets)&quot;을 가지고 있기 때문에 &quot;일차 감각 인식&quot;기관이 있다는 것을 발견하고 확인하기까지는 백스터를 받아들이지 않는 불운한 사태를 해결하고자 하는 도움은 없었습니다.&lt;a href=&quot;http://www.biomindsuperpowers.com/Pages/RealStoryCh6.html&quot;&gt;*&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[잉고 스완의 이 주장은 완전히 실없는 소리입니다. 신경생물학자들은 식물을 연구하지 않으며, 백스터 효과를 검증하기 위해서 신경생물학자들의 논문 연대기를 조사해봐도 헛수고입니다.]&lt;/b&gt;&lt;/p&gt;
&lt;hr width=&quot;50%&quot; /&gt;
&lt;p&gt;&lt;b&gt;....&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/dowsing.html&quot;&gt;지도를 이용한 수맥찾기&lt;/a&gt;는 on-site dowsing의 가장 단순한 설명이다. 지도를 이용한 수맥찾기는 흔히 &quot;백스터 효과&quot;라고 불리는 것과 관련된 것으로 보인다. 백스터는 거짓말 탐지기 전문가이며 그는 검류계를 화초의 가장 윗 부분의 잎에 부착시켰다. 이 장치는 피부의 전기적 저항을 측정하는 것이다. 그는 화초에 물을 주고 물이 잎에 올라와서 저항을 변화시키는데 얼마나 걸릴지 측정하기를 기대했다. 거짓말 탐지기는 즉시 변화하여 측정하는 사람을 기쁘게 하지 않았다. 그는 이것을 이해하지 못했고, 화초의 잎을 태워서 겁을 먹게 하려고 결정했다. 이 화초는 그가 이러한 생각을 가지자마자 거짓말 탐지기에 두려움 반응을 나타냈다. 백스터의 실험은 약간씩 다른 방법을 사용했지만, 수 많은 사람들에 의해서 수천 번 재현되었으며, TV와 다른 많은 책으로 인하여 대중에 널리 알려지게 되었다. (워터 우드, 지도를 이용한 수맥기사 이며, '로빈에게 보내는 편지:진자 수맥찾기 단기과정'&amp;nbsp;이라는 20 페이지 소책자의 저자이다).&lt;/b&gt;&lt;/p&gt;
&lt;hr width=&quot;50%&quot; /&gt;
&lt;p&gt;&lt;b&gt;1960년대 말과 70년대 초의 백스터의 업적은 피터 톰킨과 크리스터퍼 버드의 &quot;식물의 사생활&quot;이 베스트 셀러가 되는 중요한 원동력이 되었다. 1980년대에는 그의 업적은 러버트 스톤의 &quot;당신의 세포의 비밀스러운 삶&quot;으로 이어진다. 그의 연구 여정은 1966년 식물이 감각 능력이 있으며 변화하는 감정과 관련된 인간의 강력한 의도에 대해서 반응한다는 것이 우연히도 재발견 됨으로 시작되었다. (20세기 초에 인도의 챤드라 보스(J. Chandra Bose&lt;a href=&quot;http://www.skepdic.com/plants.html#note2&quot;&gt;*&lt;/a&gt;)가 이와 비슷한 원리를 나타내 보였다.) 널리 팔리고 있는 거짓말 탐지기의 한 부분인 검류계 (GSR)을 측정하는 장치를 이용해서 백스터는 화초에 물을 주고 물이 올라오는 시간을 측정할 수 있는지 알아보고자 하였다. 측정할 수 없었다. 그러나 놀랍게도 검류계는 그가 갑자기 잎을 태우려 하는 생각이 떠오르자,.. 잎을 태우려하는 위헙에 반응했다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;지난 30년 동안에 말 그대로 수백건의 실험이 &quot;백스터 효과&quot;라고 알려진 생물간의 의사소통이 존재한다는 것을 증명했다. 안전한 그릇을 이용해서 요구르트를 배양할 때 나와 두명의 여성 동료가 성과 권력 문제로 논쟁을 할 때, 나를 흥분시키는 감정에 요구르트가 초자연적으로 반응하는 것을 보여주었다. 흥미롭게도, 요구르트는 같은 주제에 대한 지적인 토론에서는 반응하지 않았으며, 오직 우리의 말이 감정이 섞였을 때만 반응했다. 이러한 개인적인 경험으로 나는 의심하지 않고 믿게 되었다. (폴 폰 와드, MPA and M.S., &quot;의식과 최전선 과학&quot; 분야의 연구자이며 저술가&quot;).&lt;a href=&quot;http://www.lightworks.com/MonthlyAspectarian/1998/May/0598-05.htm&quot;&gt;*&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;hr width=&quot;50%&quot; /&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;1969년 마르셀 [죠셉 보겔]은 IBM의 공학자들을 위한 창조성에 관한 강좌를 한 것을 들었다.&amp;nbsp;그가 Argosy 라는 잡지에서 &quot;식물도 감정을 가지고 있을까&quot;라는 거짓말 탐지기 전문가 클리브 백스터가 식물과 인간의 상화작용이 반응을 보인다는 것을 처음으로 읽은 것이 바로 그때이다. 처음에는 인간-식물간의 상호작용이라는 개념을 거부했지만 그는 이러한 이상한 주장을 탐구해보기로 결정했다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;그는 식물을 바이오에너지장(인간의 마음을 나타내는)의 신호를 전달해주는 물질로 사용하여 백스터의 효과를 재현해낼 수 있었으며, 식물이 인간의 생각에 반응한다는 것을 증명하여 주었다. 그는 잎이 갈라진 필로덴드론(역주 -&amp;nbsp;화초의 일종)을 알려진 저항과 비교하여 모르는 저항을 측정하는 회로인 휘스톤 브릿지에 연결하였다. 그는 숨을 조용히 내쉴 때에는 식물에게서부터 거의 아무런 반응이 없다는 것을 알았다. 그러나 생각을 하면서 킁킁거리며 숨을 쉴 때는, 식물이 극적으로 반응하였다. 이러한 장은 인간의 호흡과 생각에 연결되어 있으며, 일정한 시간에만 일어나는 것이 아니다. 그리고 식물이 생각에 대해 반응하는 것은 8인치, 8피트, 혹은 8천마일이나 떨어져도 마찬가지이다! 이 실험의 결과에 근거하여 볼 때, 역제곱의 법칙(거리의 제곱에 반비례하는 법칙 - 대표적인 것인 광원으로부터 멀리 떨어지면 빛이 광원과 피사체 사이 거리의 제곱에 반비례 한다.)은 인간의 생각에는 적용되지 않는다. 이것이 마르셀(Marcel)이 순수한 이성적인 과학자에서부터 영적 혹은 신비적 과학자로 전환되는 시작이었다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;기본적으로, 식물은 잘린거나, 태워지거나 혹은 찢겨지는 것에 대한 실제 행동 보다는 생각에 더 잘 반응한다는 것을 발견했다. 그는 만약 그가 다른 식물의 잎을 찢으면, 다른 식물이 반응을 할 뿐만 아니라, 단지 찢으려는 마음만 먹어도 반응한다는 것을 발견했다. 식물은 마치 그의 정신적인 반응을 그대로 보여주는 것 같았다. 그는 그 식물은 그의 생각과 의도로 이루어진 에너지를 저장하고 있는 건전지 같다고 결론 내렸다. 그는 이들 실험에 대해서 &quot;나는 생각과 연결된 에너지가 있다는 것을 배웠다. 생각은 펄스를 낼 수 있고 생각과 연결된 에너지는 서로 모여서 마치 레이져와 같은 힘을 갖는다&quot;(Rumi Da, purveyor of fine crystals).&lt;a href=&quot;http://www.vogelcrystals.com/legacymarcel.htm&quot;&gt;*&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;hr width=&quot;50%&quot; /&gt;
&lt;p&gt;&lt;b&gt;70년대에 식물의 사생활이라는 한 베스트 셀러 서적은 전세계에 걸쳐서 식물의 지능을 탐구하려는 과학적인 연구를 잘 보여주었다. 뉴욕시의 퇴역 경찰관이며, 거짓말 탐지기를 사용하는 법을 훈련받은 클리브 백스터에 대해서 쓰여진 장은 나에게 가장 큰 인상을 남겼다. 장난으로 그는 그의 화초에 거짓말 탐지기를 연결하고 화초의 반응을 살펴보려고 하였다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;어느날, 백스터는 드라세나 맛상게아나(역주 : 화초의 이름, 일반적으로 '행운목'이라고 부른다.)에 불을 붙인 성냥을 가지고 다가가서 마치 태워 버릴 &amp;nbsp;것 같이 행동했다. 이 화초가 그래프상에서 매우 격렬하게 움직였을 뿐만 아니라, 그곳에 있던 다른 화초도 마찬가지였다. 실험을 계속하면서, 그는 화초가 그가 비록 수 마일 떨어진 곳에 있더라도, 그의 마음에 대해서 반응한다는 것을 발견했다. 어느날, 뉴저지주의 턴파이크에서 그는 화초들에게 생각을 통해서 자신이 집으로 돌아가고 있다는 것을 알리려고 결심했다. 도착했을 때, 그는 바로 그가 식물과 의사소통을 했던 시점에서 매우 격렬하게 반응했다는 것을 발견했다. 그를 감지하는 능력에 있어서 거리는 아무런 상관없었다!&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;모든 사람이 이 기술과 능력을 개발할 수 있다. 우리는 모두 자신안에 이러한 능력을 가지고 있다. 우리가 해야할 것은 단지 이것이 사실이라는 것을 받아들이고 열린 마음으로 시도하는 것이다.(Judith Handlesman, spiritual gardener and vegetarian).&lt;a href=&quot;http://here-and-now.org/judith/articles.html&quot;&gt;*&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;분명히, 백스터에게는 그를 추종하는 사람들이 있으며, 그들은 백스터가 과학에 있어서 매우 기본적이고 탁월한 업적을 이루었다고 생각한다. 왜 그는 아직 노벨 상을 받지 못했는가? 왜 거의 과학계 전체에서 그를 무시하는가? 이 질문의 답변은 명백하다. 그럼에도 불구하고, 백스터는 그의 작업을 캘리포이나 샌디아고에 있는 백스터 연구 센터에서 계속하고 있으며, 그곳에서 그는 화초들이 그의 사랑하는 생각에 잘 반응하고 있으며 그가 생각으로 하는 명령에 복종하기도 한다는 것을 시연해 보여줄 수 있다고 주장한다.&lt;a href=&quot;http://www.tcom.co.uk/hpnet/espfk04.htm&quot;&gt;*&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;지나친 추종자에 의한 수치!&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;백스터의 최대 추종자이며, 그의 주장을 방어하는 사람은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/remotevw.html&quot;&gt;천리안&lt;/a&gt;을 광고하고 다니는 잉고 스완(&lt;a href=&quot;http://skepdic.master.com/texis/master/search/?s=SS&amp;amp;q=ingo+swann&quot;&gt;Ingo Swann&lt;/a&gt;, &quot;Remote Viewing - The Real Story&quot;)이다. 스완은 앞서 인용한 글에서 나온 사람으로, 백스터의 업적을 정당화 시키려고 1980년대 신경생물학자가 식물에서 신경망을 발견했다고 &amp;nbsp;말했었다. 스완에 의하면 1971년 백스터는 그를 자신의 식물 실험실과 거짓말 탐지기 학교에 초대했다고 한다. 잉고는 그가 거짓말 탐지기의 바늘을 화초에 연결했고 그가 화초를 성냥으로 태우려 생각하면 &quot;미친 듯이 흥분&quot;했다고 주장한다. 그는 이러한 사건을 여러 번 반복할 수에야 이러한 반응이 일어나지 않았다고 한다. 스완은 이 사건을 회상하면서 그와 백스터가 생각하는 것이 논리적인 결론일 수밖에 없다고 생각했다. 물론, 이들중 어느 누구도 실수하거나 기만당했다고 생각하지 않았다. 또한 그들 중 어느 누구도 대조구 실험을 해야한다는 생각이 떠오르지 않았다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;나는 &quot;왜 이런 일이 벌어졌나요?&quot; 라고 물었다. 그는 &quot;믿을 수 없군요.&quot;라고 말했다. 그러고 나서, 아주 이상한 생각이 나에게 떠올랐다. 너무 놀라워서 소름이 끼쳤다. 나는 물었다. &quot;내가 잎을 태우려 할 때 진지하지 않다는 것을 화초가 학습했다는 것인가요? 그래서 화초가 더 이상 경고 할 필요성이 없다는 것을 알았다는 것인가요?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;백스터는 웃음지으며 말했다. &quot;당신이 알아낸 것이지, 제가 알아낸 것이 아닙니다. 식물에게 해가 되는 다른 생각을 시험해 보십시요.&quot; 그래서 나는 화초 화분에 산을 쏟아 붓는 생각을 했다. 맞았다! 그러나 곧 화초의 같은 &quot;학습 곡선&quot;이 반복되었다. 나는 화초에게 말을 하는 화초를 모든 사랑하는 사람처럼, 그당시 식물이 감각과 텔레파시능력이 있다는 &quot;진실&quot;을 이미 이해하고 있었다. 그러나, 그러한 식물이 진실과 사람의 의도를 흉내만 내는 것을 구분하는 것을 학습할 수 있다는 것은 나에게는 &quot;벼락&quot;같은 일이었다. 이러한 놀라운 경험으로 나는 최종적으로 먼곳 보기를 개발하는데 중요한 역할을 하는 &quot;학습 곡선&quot;라는 개념을 이해하게 되었다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;그러나 백스터는 계속 움직였다. &quot;당신이 과연 어떠한 종류의 마음이나 화학물질에 영향을 줄 수 있다고 생각합니까?&quot; &quot;나는 어떻게 영향을 줄 수 있는지 모르겠습니다. 그러나 나도 시도해보죠.&quot; 몇 주 동안 나는 타임즈 스퀘어의 실험실로 가서 금속이나 화학물질을 이용해서 실험했으며, 그리고 나도 모르게 빠져들어 1971년 10월로 접어들었다.&lt;a href=&quot;http://www.biomindsuperpowers.com/Pages/RealStoryCh6.html&quot;&gt;*&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;실험에 대한 이런 종류의 아마츄어식 접근과, 이러한 것들이 논쟁의 여지가 없는 증거로 확립된 사실이라는 생각을 순진하게 강화하는 것은 바로 백스터와 그의 지지자들의 전형적인 모습니다. 자질있는 과학자들은 이런 초보적인 추론을 절대로 하지 않는다. 그러나 과학적으로 무지한 사람들은 이러한 실험에 쉽게 속는다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;백스터 효과와 원시 종교&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;짐 클랜포드(Jim Cranford)는 또 한 명의 백스터의 옹호자이며, 그는 백스터가 애니미즘 종교가 실제로 식생(植生)과 의사소통을 할 수 있다는 증거를 제시한 사람으로 간주한다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;비록, 백스터와 비슷한 실험이 전세계에 걸쳐서 지난 15년이 넘도록 수천건이 반복되었지만, 우리는 그 의미를 파악하는데 실패했다. 이 문제의 일부는 백스터가 &quot;과학자&quot;가 아니며, &quot;그들&quot;은 그외 다른 사람들이 그 어떠한 것이라도 알 수 있다는 것을 인정하는 것을 좋아하지 않았다.&amp;nbsp;이것은 나쁘게 말해서 자존심 혹은 거만 이지만 실험실에서 보기 드믄 일도 아니다. 우리들의 나머지 사람들이 &quot;원시인&quot;들이 의식과 희생을 통해서 실제로 식물들과 의사소통을 할 수 있다는 것을 믿기 어렵다고 생각한다. 도처에서 우리보다 더&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;우리는 여기 주변에 우리외에 어떠한 &quot;지성체&quot;도 있을 수 있다는 것을 믿는 것을 명확히 거부하기 때문이다. 하지만, 원시 종교에 대한 우리의 총체적인 관점을 다시 생각해 볼 필요가 있다는 것은 명백하다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.insomniac.com/Tabari/otrhog/sacrifice.html&quot;&gt;*&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;최소한 크랜포드는 백스터가 과학자가 아니라는 것은 잘 알고 있다. &quot;그리고 앞에 말한 그들&quot;이 &amp;nbsp;인과관계를 연구할 때 대조구가 필요할 것이다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;백스터와 신지학&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;백스터의 생각을 지지하는 또 한 사람은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/theosoph.html&quot;&gt;신지학자&lt;/a&gt;인 죤 밴 마터 주니어 (John Van Mater, Jr.)로 그는 백스터의 업적이 아래와 같은 개념을 지지한다고 생각하고 있다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;...생명체를 둘러싸고 있는 우주 에너지인 생명력은 인간을 포함한 모든 계에서 공유하고 있다... 자연은 모든 존재들의 위대한 우애라고 볼 수 있다. 이것의 대부분은 우리가 검지할 수 없고 평범한 이해를 뛰어넘는다. 식물계는 살아있는 행성의 생명력(혹은&amp;nbsp;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/prana.html&quot;&gt;쁘라나&lt;/a&gt;)의 필수적인 층으로, 자신의 대사과정을 통해, 대기를 생산하고 조절할 뿐만 아니라, 에너지를 생물계로 전달한다. 식물은 또한, 각각의 계 혹은 레벨이 기능을 유지하고 진화하기 위해서 다른 존재들을 필요로 하는, 생명체 사슬의 한 부분이다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;(See&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.theosophy-nw.org/theosnw/brother/br-jvmj2.htm&quot;&gt;&quot;Our Intelligent Companions, the Plants,&quot;&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;John Van Mater, Jr.,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;Sunrise&lt;/i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;magazine, April/May 1987 published by&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.skepdic.com/theosoph.html&quot;&gt;Theosophical&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;University Press.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;그러므로, 백스터의 엉터리 과학은, 수맥찾기, 에너치 치료, 텔레파시, 먼곳보기 및 비슷한 그 어떠한 것을 주장하는 사람들을 옹호하는 형이상학적인 개념을 지지하게 되었다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;과학적인 지지?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;비록 주류과학에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/telepath.html&quot;&gt;텔레파시&lt;/a&gt;를 가진 식물이나, 식물의 &quot;일차 인식&quot;등의 백스터의 주장에 대해서 무시하고 있지만, &quot;첨단 과학&quot;책을 판매하고 있는 한 뉴에이지 UFO/환경론자 사이트인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.earthpulse.com/products/secret.html&quot;&gt;Earthpulse.com&lt;/a&gt;에서는, '식물의 사생활'이라는 책을 위한 짧은 광고를 버몬트 대학의 리챠드 클라인이라는 식물학자가 써주었다고 한다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;만약 내가 식물의 안으로 들어갈 수 없거나 혹은 식물에서 나오는 것을 느낄 수 없거나, 혹은 그렇게 할 수 있는 다른 사람을 모른다고 해서,&amp;nbsp;어떤 사람들이 그렇게 할 수 있거나 할 가능성을 줄여주는 것은 아니다...&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;정직한 말은 하나도 없다. 그러나 버몬트 대학의 웹사이트를 조사한 결과 생물학과나 다른 과에서 라챠드 클라인이라는 사람을 찾지 못했다. 아마도 클라인은 외계인에게 납치된 것 같다. 아니면 어쩌면 그는 백스터와 같이 이중맹 대조구 실험을 실시하고 있을 수도 있다. 어찌 되었건, 백스터는 거짓말 탐지기의 적절한 사용처 하나를 발견했을지도 모른다.&lt;/p&gt;
&lt;hr style=&quot;color: #000000; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-style: initial; text-decoration-color: initial;&quot; align=&quot;left&quot; width=&quot;25%&quot; /&gt;
&lt;p&gt;&lt;b&gt;&lt;a&gt;*note1&lt;/a&gt;: 죤 고메츠는 대중매체에 대한 생각이 달랐다. 고메츠는 다음과 같이 썼다. &quot;불행히도, 대중적인 신문들이 백스터의 실험을 받아들이고 그 결과를 대중들에게 제공해서 이제 많은 사람들이 식물이 실제로는 할 수 없는 것을 할 수 있다고 믿게 만들었다. 신문에서는 무엇보다, 백스터 효과가 단지 일곱 개의 &amp;nbsp;화초를 관찰한 것에 근거한 것이라는 것은 전혀 언급하지 않았다. 아마도 그들은 백스터를 포함해서 어느 누구도 다시 재현할 수 없는 (백스터는 다시 재현하기를 거부)&amp;nbsp;실험으로부터 유래한 주장을 과장한 것이라는 것을 상기할 필요가 있을 것이다.&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&lt;a&gt;*note&lt;/a&gt;2: Jagadis Chandra Bose 경(卿)은 벵골과학자이며 프랑스&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.rathinker.co.kr/skeptic/vitalism.html&quot;&gt;생기론자&lt;/a&gt;인 앙리 베르그송(Henri&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.kirjasto.sci.fi/bergson.htm&quot;&gt;Bergson&lt;/a&gt;)을 숭배한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;읽기 자료&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.aspb.org/&quot;&gt;American Society of Plant Physiologists&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and their journal&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;&lt;a href=&quot;http://www.aspb.org/publications/plantphys/&quot;&gt;Plant Physiology&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.avlispub.com/id340.htm&quot;&gt;Cleve Backster from 1995 Silva International Convention&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.whps.com/misaha/issue11.htm&quot;&gt;Cells Caught in the Act of Communication&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;by Robert B. Stone, Ph.D. (MISHA [Monterey Institute for the study of Alternative Healing Arts] newsletter 11)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Horowitz, K. A., D.C. Lewis, and E. L. Gasteiger. 1975. Plant primary perception.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;Science&lt;/i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;189: 478-480.&lt;/p&gt;
&lt;p&gt;Kmetz, J. M. 1977. A study of primary perception in plants and animal life.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;Journal of the American Society for Psychical Research&lt;/i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;71(2): 157-170.&lt;/p&gt;
&lt;p&gt;Kmetz, John M. 1978. Plant perception.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;The Skeptical Inquirer.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;Spring/Summer, 57-61.&lt;/p&gt;</description>
      <category>rapha</category>
      <category>Rafa</category>
      <category>생체정보</category>
      <category>생체정보프로그램</category>
      <category>정보에너지장</category>
      <author>SALTFUN</author>
      <guid isPermaLink="true">https://saltfun.tistory.com/36</guid>
      <comments>https://saltfun.tistory.com/36#entry36comment</comments>
      <pubDate>Thu, 22 Oct 2020 04:37:47 +0900</pubDate>
    </item>
    <item>
      <title>아파트브랜드 몇가지</title>
      <link>https://saltfun.tistory.com/35</link>
      <description>&lt;p&gt;힐스테이트 Hill State &lt;br /&gt;플로리체 Floriche Flower + Riche &lt;br /&gt;엠코타운 amco TOWN Asset Management Co.Ltd 현대엠코(현대-기아 자동차차그룹의 건설회사) &lt;br /&gt;2009년 '엠코' -&amp;gt; '현대엠코' 사명변경&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;비발디 Vivaldi&lt;/p&gt;
&lt;p&gt;더샵 THE SHARP&amp;nbsp; #&amp;nbsp; &amp;nbsp;포스코건설 &lt;a href=&quot;https://www.thesharp.co.kr/brand/bi_slogan.aspx&quot;&gt;https://www.thesharp.co.kr/brand/bi_slogan.aspx&lt;/a&gt; 더샵 포레스트, 더샵 퍼스트파크&lt;/p&gt;
&lt;p&gt;스타힐스&amp;nbsp; &amp;nbsp;서희건설&lt;/p&gt;
&lt;p&gt;2019년도 종합건설업자 시공능력평가액&amp;lt;토목건축공사업&amp;gt; &lt;a href=&quot;http://www.worker.co.kr/link/2002R100.asp&quot;&gt;http://www.worker.co.kr/link/2002R100.asp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sowGD/btqEJiIwuqD/9nz5zu7IcndgmLzkJQFRR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sowGD/btqEJiIwuqD/9nz5zu7IcndgmLzkJQFRR0/img.png&quot; data-alt=&quot;2019년도 종합건설업자 시공능력평가액&amp;amp;amp;lt;토목건축공사업&amp;amp;amp;gt;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sowGD/btqEJiIwuqD/9nz5zu7IcndgmLzkJQFRR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsowGD%2FbtqEJiIwuqD%2F9nz5zu7IcndgmLzkJQFRR0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;2019년도 종합건설업자 시공능력평가액&amp;lt;토목건축공사업&amp;gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;1&amp;nbsp; &amp;nbsp;삼성물산 &lt;b&gt;래미안&lt;/b&gt; 來美安 미來지향적이고 아름답고(美) 편安한 아파트&lt;br /&gt;2&amp;nbsp; &amp;nbsp;현대건설 &lt;b&gt;힐스테이트&lt;/b&gt; HILLSTATE(&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;현대엔지니어링&lt;/span&gt;&lt;/b&gt;과 공동사용)&lt;br /&gt;3&amp;nbsp; &amp;nbsp;대림산업 &lt;b&gt;e편한세상&lt;/b&gt;(같은 계열사인 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;삼호&lt;/b&gt;&lt;/span&gt;와 &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;고려개발&lt;/span&gt;&lt;/b&gt;도 2001년부터 브랜드 사용계약을 맺고 같은 브랜드 사용)&lt;br /&gt;4&amp;nbsp; &amp;nbsp;GS건설&amp;nbsp; &amp;nbsp;&lt;b&gt;자이&lt;/b&gt; XI&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #333333;&quot;&gt;LG건설시절인 2002.9 런칭.&amp;nbsp; 오피스텔: 자이엘라&amp;nbsp; &amp;nbsp;'특별한 지성 e&lt;/span&gt;&lt;b&gt;X&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;tra&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;I&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;ntelligent'&amp;nbsp;&lt;/span&gt;&lt;br /&gt;5&amp;nbsp; &amp;nbsp;대우건설 &lt;b&gt;푸르지오&lt;/b&gt;(2003년&amp;nbsp; 푸르다+GEO&lt;span style=&quot;color: #9d9d9d;&quot;&gt;대지, 공간&lt;/span&gt;)&lt;br /&gt;6&amp;nbsp; &amp;nbsp;POSCO 건설 &lt;b&gt;더샵&lt;/b&gt; THE SHARP #&lt;br /&gt;7&amp;nbsp; &amp;nbsp;현대엔지니어링 &lt;b&gt;힐스테이트&lt;/b&gt; &lt;span style=&quot;color: #333333;&quot;&gt;HILLSTATE&lt;/span&gt;(2014.4 현대엠코 amco 와 합병이후 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;현대건설&lt;/b&gt;&lt;/span&gt;과 공동사용)&lt;br /&gt;8&amp;nbsp; &amp;nbsp;롯데건설 &lt;b&gt;롯데캐슬&amp;nbsp;&lt;/b&gt; LOTTE CASTLE&lt;br /&gt;9&amp;nbsp; &amp;nbsp;HDC현대산업개발 &lt;b&gt;아이파크&lt;/b&gt; iPARK&lt;br /&gt;10 호반건설 &lt;b&gt;호반베르디움&lt;/b&gt; VERTIUM 과거에는 '리젠시빌' 사용, 2005년 본사를 서울로 이동하면서 베르디움으로 교체. VERT 푸른 숲을 뜻함, Imperium 공간, 대지를 뜻함 -&amp;gt; 자연이 숨쉬는 주거공간.&amp;nbsp; &amp;nbsp;&lt;b&gt;호반써밋&lt;/b&gt; SUMMIT (프리미엄브랜드, 구 써밋플레이스)&lt;br /&gt;11 SK건설 &lt;b&gt;SK뷰&lt;/b&gt;(지역 또는 건물 특성에 따라 VIEW를 앞이나 끝에 붙임. SK뷰PARK, SK리더스뷰, SK스카이뷰)&lt;br /&gt;12 한화건설&amp;nbsp; &lt;b&gt;포레나&lt;/b&gt;(&lt;b&gt;꿈에그린&lt;/b&gt;) FORENA&amp;nbsp;&lt;br /&gt;13 반도건설 &lt;b&gt;반도유보라&lt;/b&gt;(U.BORA 1984.2.에 입주한 부산 괴정 반도보라 맨션이 시초, 권홍사 회장의 장녀 권보라의 이름에서 따옴)&lt;br /&gt;14 태영건설 &lt;b&gt;데시앙&lt;/b&gt;(디자인 Dessin&lt;span style=&quot;color: #9d9d9d;&quot;&gt;데생&lt;/span&gt; + 접미어 AN -&amp;gt; DESSIAN&amp;nbsp; 안락하고 미학적인 주거공간의 디자이너)&lt;br /&gt;15 부영주택 &lt;b&gt;사랑으로&lt;/b&gt;, &lt;b&gt;애시앙&lt;/b&gt; &lt;span style=&quot;color: #9d9d9d;&quot;&gt;사랑으로가 촌스러워 애시앙으로 바꿔버리는 경우가 있음, 위례신도시에서는 아예 위례55&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;더힐&lt;/b&gt;&lt;/span&gt;로 바꿔버림&lt;/span&gt;&lt;br /&gt;16 한신공영 &lt;b&gt;한신더휴&lt;/b&gt; THE HUE, &lt;b&gt;한신더휴리저브&lt;/b&gt;(THE HUE RESERVE 프리미엄 주상복합단지) 韓信工營 HANSHIN Engineering &amp;amp; Construction Co., Ltd&lt;br /&gt;17 중흥토건 &lt;b&gt;중흥S-클래스&lt;/b&gt;&lt;br /&gt;18 계룡건설산업 &lt;b&gt;리슈빌&lt;/b&gt; RicheVille &lt;span style=&quot;color: #9d9d9d;&quot;&gt;풍요로운 마을&lt;/span&gt;&amp;nbsp; &amp;nbsp;鷄龍 Kyeryong Construction Industrial Co., Ltd.&lt;br /&gt;19 코오롱글로벌 &lt;b&gt;코오롱하늘채&lt;/b&gt;&lt;br /&gt;20 금호산업 &lt;b&gt;어울림&lt;/b&gt;&lt;br /&gt;21 호반산업&lt;br /&gt;22 효성중공업 &lt;b&gt;해링턴&lt;/b&gt; HARRINGTON (해링턴플레이스: 아파트, 해링턴타워 오피스텔, 해링턴스퀘어 주상복합, 해링턴코트 고급빌라)&lt;br /&gt;23 두산건설 &lt;b&gt;두산위브&lt;/b&gt; DOOSAN We've (&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;두산중공업&lt;/b&gt;&lt;/span&gt;도 이 브랜드를 사용). 고층아파트: 위브 뒤에 &lt;b&gt;더제니스&lt;/b&gt; The Zenith &lt;span style=&quot;color: #9d9d9d;&quot;&gt;천정, 정점 &lt;span style=&quot;color: #000000;&quot;&gt;를 붙임. 오피스텔: &lt;b&gt;센티움&lt;/b&gt;(Centi'um Centi- &lt;span style=&quot;color: #9d9d9d;&quot;&gt;세기&lt;/span&gt; + um &lt;span style=&quot;color: #9d9d9d;&quot;&gt;웅장한 건축물&lt;/span&gt;)을 뒤에 붙임&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;24 S&amp;amp;I코퍼레이션 Space &lt;span style=&quot;color: #9d9d9d;&quot;&gt;공간&lt;/span&gt; + I &lt;span style=&quot;color: #9d9d9d;&quot;&gt;나&lt;/span&gt;&lt;br /&gt;25 삼성엔지니어링&amp;nbsp;&lt;br /&gt;26 제일건설 &lt;b&gt;제일풍경채&lt;/b&gt;&lt;br /&gt;27 한라 &lt;b&gt;한라비발디&lt;/b&gt;, &lt;b&gt;한라하우젠트&lt;/b&gt;&lt;br /&gt;28 한양 &lt;b&gt;한양수자인&lt;/b&gt; SUJAIN&lt;br /&gt;29 신세계건설 &lt;b&gt;빌리브&lt;/b&gt; viLLiv.&amp;nbsp; Village &lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;모던한 형태의 마을&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;+ Live &lt;span style=&quot;color: #9d9d9d;&quot;&gt;존중되는 삶의 공간&lt;/span&gt; -&amp;gt; 섬세하고 감각적인 라이프스타일의 주거 브랜드&lt;br /&gt;30 삼호 &lt;span style=&quot;color: #9d9d9d;&quot;&gt;대림의 계열사&lt;/span&gt; &lt;b&gt;e편한세상&lt;/b&gt;&lt;br /&gt;31 IS동서 &lt;b&gt;에일린의 뜰&lt;/b&gt;: 아파트,&amp;nbsp; &lt;b&gt;W&lt;/b&gt;: 고급아파트&lt;br /&gt;32 쌍용건설 &lt;span style=&quot;color: #9d9d9d;&quot;&gt;스위닷홈-&amp;gt;스윗닷홈예가-&amp;gt;&lt;/span&gt;&lt;b&gt;쌍용예가&lt;/b&gt;: 아파트&amp;nbsp; -&amp;gt; &lt;b&gt;더플래티넘&lt;/b&gt; The PLATINUM: 주상복합아파트&amp;nbsp; 2006.4. 쌍용그룹에서 분리&lt;br /&gt;33 KCC건설 &lt;b&gt;스위첸&lt;/b&gt; Switzen. &lt;b&gt;웰츠타워&lt;/b&gt; WELLTZ TOWER: 고급브랜드. 1989. 금강에서 기업분할, 금강종합건설주식회사창립 -&amp;gt; 2005년 KCC건설로 바꿈&lt;br /&gt;34 대방건설 &lt;span style=&quot;color: #9d9d9d;&quot;&gt;대방노블리제, 대방샤인힐, 대방에이스힐 -&amp;gt;&lt;/span&gt;아파트: &lt;b&gt;대방노블랜드&lt;/b&gt; NOBLE LAND. 주상복합이나 오피스텔: &lt;b&gt;대방디엠씨티&lt;/b&gt; THE M CITY&lt;br /&gt;35 우미건설 &lt;b&gt;우미린&lt;/b&gt; Lynn(&lt;span&gt;隣&lt;/span&gt;: 이웃 린). 주상복합: 뒤에 스트라우스 Straus (Star + Haus &lt;span style=&quot;color: #9d9d9d;&quot;&gt;House의 독일어&lt;/span&gt;)가 붙음&lt;br /&gt;36 동부건설 &lt;b&gt;센트레빌&lt;/b&gt; CENTREVILLE&lt;br /&gt;37 동원개발 &lt;b&gt;동원로얄듀크&lt;/b&gt; ROYAL DUKE, &lt;b&gt;비스타&lt;/b&gt; Vista 동원, &lt;b&gt;동원베네스트&lt;/b&gt; &lt;span style=&quot;color: #9d9d9d;&quot;&gt;동원그룹 계열사인 동원건설산업의 아파트 브랜드&lt;/span&gt;&lt;br /&gt;38 서희건설 &lt;b&gt;스타힐스&lt;/b&gt; STARHILLS&lt;br /&gt;39 화성산업 &lt;b&gt;화성파크드림&lt;/b&gt; Park Dream&lt;br /&gt;40 금강주택 &lt;b&gt;금강펜테리움&lt;/b&gt;&lt;br /&gt;41 협성건설 &lt;span style=&quot;color: #9d9d9d;&quot;&gt;협성엠파이어 -&amp;gt;&lt;/span&gt; &lt;b&gt;협성휴포레 &lt;/b&gt;(Human + Forest 숲)&lt;b&gt;,&amp;nbsp; 협성르네상스&lt;/b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;: 협성종합건업의 아파트브랜드&lt;/span&gt;&lt;br /&gt;42 양우건설 양우내안애 (내안을 사랑&lt;span style=&quot;color: #9d9d9d;&quot;&gt;愛&lt;/span&gt;한다는 의미, 내 아내 My Wife 가 연상되도록 함)&lt;br /&gt;...&lt;br /&gt;67 신안종합건설 &lt;b&gt;신안인스빌,&amp;nbsp; 신안실크밸리&lt;/b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;: 신안건설산업의 아파트브랜드&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;수상한 이름들: 브랜드가 없거나 이상한&lt;/b&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;송파파인타운&lt;/b&gt;: 이 브랜드는 대체 뭐지? 다양한 건설사들이 참여한 대규모 장기전세 국민임대단지라서 그렇다.&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1단지: 삼중건설&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2단지: 울트라건설&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3단지: 신일건업&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4단지: 신한종합&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;5단지: 진흥기업&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;6단지: 경남기업&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;7단지: 극동건설&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;8단지: 신창건설&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;9단지: 신일건업&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;10단지: 중앙건설&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;11단지: 일성건설&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;12단지: 양우건설&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;13단지: 양우건설&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;위례35단지&lt;/b&gt;아파트: 왜 브랜드가 없지? 삼호에서 지었다. 영구임대다.&lt;br /&gt;&lt;b&gt;위례자연앤래미안 e편한세상&lt;/b&gt;: 래미안은 뭐고 e편한세상은 또 뭐? 삼성물산과 대림산업이 공동으로 시공했단다.&lt;br /&gt;&lt;b&gt;위례더힐55아파트&lt;/b&gt;: 더힐은 들어본 듯도 하지만 낯선데?&amp;nbsp; 원래 부영사랑으로 인데 이름이 촌스러워 아파트 이미지&amp;middot;가격에 부정적인 영향이 커 입주민들이 바꿔버렸대.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Temp</category>
      <category>더샵</category>
      <category>래미안</category>
      <category>롯데캐슬</category>
      <category>베르디움</category>
      <category>아파트브랜드</category>
      <category>이편한세상</category>
      <category>자이</category>
      <category>푸르지오</category>
      <category>호반써밋</category>
      <category>힐스테이트</category>
      <author>SALTFUN</author>
      <guid isPermaLink="true">https://saltfun.tistory.com/35</guid>
      <comments>https://saltfun.tistory.com/35#entry35comment</comments>
      <pubDate>Wed, 10 Jun 2020 06:43:05 +0900</pubDate>
    </item>
    <item>
      <title>OAuth 2.0</title>
      <link>https://saltfun.tistory.com/20</link>
      <description>&lt;p&gt;&lt;a name=&quot;처음&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;https://opentutorials.org/course/3405&quot;&gt;https://opentutorials.org/course/3405&lt;/a&gt;&lt;/p&gt;
&lt;!-- &gt; 목차 부분 &lt;--&gt;
&lt;ul style=&quot;list-style-type: none;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#intro0&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;0. INTRO&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chapt1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;1. 역할&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chapt2&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;2. 등록&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chapt3&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;3. Resource Owner의 승인&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chapt4&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;4. Resource Server의 승인&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chapt5&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;5. Access token&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chapt6&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;6. API 호출&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chapt7&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;7. Refresh token&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chapt8&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;8. 마무리&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- &gt; 내용 부분 &lt;--&gt;
&lt;p&gt;&lt;a name=&quot;intro0&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;0. INTRO&lt;/h1&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/hm2r6LtUbk8&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;사용자가 가입된 서비스의 API에 접근하기 위해서는 사용자로부터 권한을 위임 받아야 한다. 이 때 사용자의 패스워드 없이도 권한을 위임 받을 수 있는 방법이 필요하다. 이를 위해서 고안된 기술이 OAuth입니다. 오늘날 많은 API들이 OAuth를 통해서 상호 연동을 지원하고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;구글, 페이스북과 같은 서비스의 API에 사용자 대신에 접근하기 위해 반드시 필요한 기술이다. 또 아래 그림과 같이 다른 서비스로 로그인 하기 기능을 구현하는데도 필수적으로 필요한 기능이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;470&quot; height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tuLYx/btqBIIwEycf/oLikXbozXyc87FmZ8Mjs50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tuLYx/btqBIIwEycf/oLikXbozXyc87FmZ8Mjs50/img.png&quot; data-alt=&quot;Fig 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tuLYx/btqBIIwEycf/oLikXbozXyc87FmZ8Mjs50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtuLYx%2FbtqBIIwEycf%2FoLikXbozXyc87FmZ8Mjs50%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;470&quot; height=&quot;344&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;OAuth 2.0 Youtube 재생목록&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLuHgQVnccGMA4guyznDlykFJh28_R08Q-&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/playlist?list=PLuHgQVnccGMA4guyznDlykFJh28_R08Q-&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;참고&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://opentutorials.org/module/3648&quot;&gt;Express-Session &amp;amp; Auth&amp;nbsp;수업 바로가기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;또 OAuth는 애플리케이션 기술(PHP, Python, Ruby, JavaScript, Node.js, Java..)을 이용하기 때문에 이런 기술에 대한 이해가 필요하다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cg-developer.tistory.com/361&quot;&gt;https://cg-developer.tistory.com/361&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;OAuth는 Open Authorization, Open Authentication 뜻으로&amp;nbsp;&lt;/span&gt;&lt;span&gt;오픈 스탠다드 프로토콜을 말하는&lt;/span&gt;&lt;span&gt;데,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;OAuth 2.0은 다양한 플랫폼 환경에서 권한 부여를 위한 산업 표준 프로토콜이다. &lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;애&lt;/span&gt;&lt;span&gt;플리케이션(페이스북,구글,트위터등-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Service Provider)의 유저의 비밀번호를 나의 서비스&lt;/span&gt;&lt;span&gt;에&amp;nbsp;&lt;/span&gt;&lt;span&gt;제공 없&lt;/span&gt;&lt;span&gt;이 사용자 인증,인가를 할 수 있는 기술 이다.&amp;nbsp; &lt;/span&gt;&lt;span&gt;또는&amp;nbsp;&lt;/span&gt;&lt;span&gt;제 3의 앱이 자원의 소유자인 서비스 이용자를 대신하여 서비스를 요청할 수 있도록 자원 접&lt;/span&gt;&lt;span&gt;근 권&lt;/span&gt;&lt;span&gt;한을 위임하는 방법이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;OAuth 2.0은 페이스북이나 구글의 아이디로 제 3의 서비스에 로그인해서 등록되어 있는 정보(친구&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;목록)&lt;/span&gt;&lt;span&gt;나 기능(담벼락 글쓰기)&lt;/span&gt;&lt;span&gt;에 접근할 수 있는 권한을 제어하기 위한 표준 프로토콜이다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;OAuth&lt;/span&gt;&lt;span&gt;라는 기술과 관련&lt;/span&gt;&lt;span&gt;&amp;nbsp;3명의 참여자&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;- M&lt;/span&gt;&lt;span&gt;ine&amp;nbsp; = 나의 서비스&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;- U&lt;/span&gt;&lt;span&gt;ser&lt;/span&gt;&lt;span&gt;&amp;nbsp; =&amp;nbsp;&lt;/span&gt;&lt;span&gt;사용자&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;나의 서비스를 사용하는자 )&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&amp;nbsp;Their (나의 서비스가 연동하려고 하는 그들의 서비스)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;구글, 페이스북, 트위터&lt;/span&gt;&lt;span&gt;등&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;580&quot; height=&quot;402&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYeyfy/btqBJ7bDdGE/okUbqc8NJNU4CnucXMjGuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYeyfy/btqBJ7bDdGE/okUbqc8NJNU4CnucXMjGuK/img.png&quot; data-alt=&quot;Fig 2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYeyfy/btqBJ7bDdGE/okUbqc8NJNU4CnucXMjGuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYeyfy%2FbtqBJ7bDdGE%2FokUbqc8NJNU4CnucXMjGuK%2Fimg.png&quot; width=&quot;580&quot; height=&quot;402&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;b&gt;&lt;span&gt;OAuth라는 기술이 나오게 된 배경&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;나의 서비스가 사용자를 대신해서 사용자가 가입한 구글과 같은 서비스의 API에 접근하여&amp;nbsp;&lt;/span&gt;&lt;span&gt;CRUD&lt;/span&gt;&lt;span&gt;를&amp;nbsp;&lt;/span&gt;&lt;span&gt;하고싶다면&amp;nbsp;&lt;/span&gt;&lt;span&gt;사용자로부터 구글의 서비스에 접근할수 있도록 허가를 받아야 한다. &lt;/span&gt;&lt;span&gt;가장 쉬운 방법은&amp;nbsp;&lt;/span&gt;&lt;span&gt;사용자로부터 아이디와 비밀번호를 받아서 우리가 기억하고있다가 그들의 서비&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;스에 접속할때&amp;nbsp;&lt;/span&gt;&lt;span&gt;아이디와 비밀번호를 이용하는것이다. 하지만 보안상 여러가지로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;상당히 위험하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;사용자의 아이디, 패스워드 없이도 권한을 위임 받을 수 있는 방법이 필요하다. &lt;/span&gt;&lt;span&gt;그래서 이러한 문제점에서&amp;nbsp;&lt;/span&gt;&lt;span&gt;OAuth라는 기술이 고안 되었다.&amp;nbsp;&lt;/span&gt;&lt;span&gt;OAuth기술을 사용해 &lt;/span&gt;&lt;span&gt;훨씬 더 안전한 방법으로&amp;nbsp;&lt;/span&gt;&lt;span&gt;그들의 서비스와, 나&lt;/span&gt;&lt;span&gt;의 서비스가 상호작용 할수 있는것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;OAuth기술의 핵심 요약&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;OAuth&lt;/span&gt;&lt;span&gt;&amp;nbsp;를 통해서 나의 서비스가&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;accessToken&lt;/span&gt;&lt;/b&gt;&lt;span&gt;을 얻어낼수있다는게&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span&gt;가장&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;핵심&lt;/span&gt;&lt;span&gt;이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;575&quot; height=&quot;383&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O8Xfr/btqBJeITZVI/ZH9Q2KcO05ZvhqjPAIkcZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O8Xfr/btqBJeITZVI/ZH9Q2KcO05ZvhqjPAIkcZ1/img.png&quot; data-alt=&quot;Fig 3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O8Xfr/btqBJeITZVI/ZH9Q2KcO05ZvhqjPAIkcZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO8Xfr%2FbtqBJeITZVI%2FZH9Q2KcO05ZvhqjPAIkcZ1%2Fimg.png&quot; width=&quot;575&quot; height=&quot;383&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;1) 유저의 요청에 의해서 그들의 서비스가 accessToken을 나의 서비스에 발급해준다. &lt;/span&gt;&lt;span&gt;accessToken은 그들의 서비스의 비밀번호와 아이디가 아닌&lt;/span&gt;&lt;span&gt;&amp;nbsp;장점을 가지면서도 역할을 대신해주는것으로 볼 수 있다.&lt;br /&gt;&lt;/span&gt;&lt;span&gt;accessToken은 그들의 서비스가 가지고 있는 모든 기능이 아니라 그중에 나의 서비스가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;필&lt;/span&gt;&lt;span&gt;요&lt;/span&gt;&lt;span&gt;로 하는 기능만 부분적으로 허용하는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;accessToken을 통해서 그들의 서비스에 접근해서 데이터를 CRUD할수 있는것이다.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;이러한 기술을 Federated Identity라고 하는데 그 가장 기반에 있는&amp;nbsp; 것이 OAuth이다.&lt;/span&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;chapt1&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;1. 역할&lt;/h1&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/vo_0PW3V5zU&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;OAuth&lt;/span&gt;&lt;span&gt;라는 기술과 관련한&lt;/span&gt;&lt;span&gt;&amp;nbsp;3자 관계 재정의&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;580&quot; height=&quot;321&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbk6kp/btqBIIXJt71/UAcS2FePCB2HSr6nPI17rK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbk6kp/btqBIIXJt71/UAcS2FePCB2HSr6nPI17rK/img.png&quot; data-alt=&quot;Fig 4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbk6kp/btqBIIXJt71/UAcS2FePCB2HSr6nPI17rK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbk6kp%2FbtqBIIXJt71%2FUAcS2FePCB2HSr6nPI17rK%2Fimg.png&quot; width=&quot;580&quot; height=&quot;321&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- Resource server : 나의 서비스가 제어하고자 하는 자원, 데이터를&amp;nbsp;가지고 있는 서버라는뜻&lt;br /&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;이름, 나이 등 아이디 관련 정보를 제공하는 서버, 구글,페이스북등&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- Authorization Server :&amp;nbsp;&amp;nbsp;인증과 관련된 처리를 전담하는 서버이고&lt;br /&gt;&lt;/span&gt;&lt;span&gt;(로그인을 통해 인증 후 권한을 부여하는 서버. 구글, 페이스북 등). 공식 매뉴얼에서는 Resource Server와 Authorization Server를 구분하는데 여기서는 그냥 모두 Resource Server 로 본다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- Resource Owner :&amp;nbsp;&lt;/span&gt;&lt;span&gt;자원의 소유자를 뜻&lt;/span&gt;&lt;span&gt; 한다. 즉 나의 서비스를 이용하려고 하는 일반사용자&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;-&amp;nbsp;&lt;/span&gt;&lt;span&gt;Client :&amp;nbsp;&lt;/span&gt;&lt;span&gt;Resou&lt;/span&gt;&lt;span&gt;rce server에 접속해서 정보를 가져가는자. 서비슬 제공하려고 하는 &quot;나&quot;다. 내가 사용자에게 서비스를 제공하며 이때 인증서비스를 받으려고 하기 때문에 Client 가 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;chapt2&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;2. 등록&lt;/h1&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/_mm5ks5aWQ4&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt; OAuth를 이용해서 Resource Server에 접속하기 위해서는 우선 Resource Server에 등록하는 과정이 필요하다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;755&quot; height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLDeBc/btqBIIKb3xC/cH3rYrnjV4Efy4NCK9CCwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLDeBc/btqBIIKb3xC/cH3rYrnjV4Efy4NCK9CCwk/img.png&quot; data-alt=&quot;Fig 5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLDeBc/btqBIIKb3xC/cH3rYrnjV4Efy4NCK9CCwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLDeBc%2FbtqBIIKb3xC%2FcH3rYrnjV4Efy4NCK9CCwk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;755&quot; height=&quot;513&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 5&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Client가 Resource Server를 이용하기 위해서는 Resource Server의 승인을 사전에 받아 놓아야 하는데 그것이 등록 register이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp; 서비스 마다 등록하는 방법이 다 다르지만, Client ID, Client Secret, Authorized redirect URIs 의 세가지 요소는 공통적으로 가진다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;761&quot; height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bubI7F/btqBIJbhTc1/Sfx47q866WkSHtDIh26MYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bubI7F/btqBIJbhTc1/Sfx47q866WkSHtDIh26MYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bubI7F/btqBIJbhTc1/Sfx47q866WkSHtDIh26MYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbubI7F%2FbtqBIJbhTc1%2FSfx47q866WkSHtDIh26MYK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;761&quot; height=&quot;176&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;.Client ID: 우리가 만들고 있는 애플리케이션을 식별하는 ID, 식별자.&amp;nbsp; 외부에 노출됨&lt;br /&gt;Client Secret: Client ID 에 대한 비밀 번호. 절대로 노출되면 안된다. 엄청난 보안사고가 일어날 수 있다.&lt;br /&gt;Authorized redirect URIs: Resource Server가 권한을 부여하는 과정에서 우리에게 Authorized Code 값을 전달해주는데 어느 주소로 전달 받을지를 지정하는 값. 리소스 서버는&amp;nbsp; &amp;nbsp;지정된 주소가 아닌 곳으로부터의 요청을 무시할 것이다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Tistory에서도 이 서비스를 제공한다. Facebook 개발자페이지를 통해 실천의 예시를 살펴보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ML4dk/btqBIIDs9aG/Mcb0VkiA408KkxDa0LydE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ML4dk/btqBIIDs9aG/Mcb0VkiA408KkxDa0LydE0/img.png&quot; data-alt=&quot;Fig 6&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ML4dk/btqBIIDs9aG/Mcb0VkiA408KkxDa0LydE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FML4dk%2FbtqBIIDs9aG%2FMcb0VkiA408KkxDa0LydE0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 6&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;https://developers.facebook.com :facebook 개발자 페이지&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;370&quot; height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmVW1d/btqBL8AU4EF/VaKPkUXwSnik2zTqhqkMP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmVW1d/btqBL8AU4EF/VaKPkUXwSnik2zTqhqkMP1/img.png&quot; data-alt=&quot;Fig 7&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmVW1d/btqBL8AU4EF/VaKPkUXwSnik2zTqhqkMP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmVW1d%2FbtqBL8AU4EF%2FVaKPkUXwSnik2zTqhqkMP1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;370&quot; height=&quot;436&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 7&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btr283/btqBJ7pb1kW/J9X2i7e8Ewq0MvKtooBri0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btr283/btqBJ7pb1kW/J9X2i7e8Ewq0MvKtooBri0/img.png&quot; data-alt=&quot;Fig 8&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btr283/btqBJ7pb1kW/J9X2i7e8Ewq0MvKtooBri0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtr283%2FbtqBJ7pb1kW%2FJ9X2i7e8Ewq0MvKtooBri0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 8&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bywhSI/btqBJeIT9QC/aIHfqtbmkSVf4ggI8Jl2F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bywhSI/btqBJeIT9QC/aIHfqtbmkSVf4ggI8Jl2F1/img.png&quot; data-alt=&quot;Fig 9&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bywhSI/btqBJeIT9QC/aIHfqtbmkSVf4ggI8Jl2F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbywhSI%2FbtqBJeIT9QC%2FaIHfqtbmkSVf4ggI8Jl2F1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 9&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이제 Facebook Login을 Set Up 하면 다음 화면이 뜬다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H0Ok5/btqBGpx25Pt/qqdu3vLUhHk6h2NPkyDZrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H0Ok5/btqBGpx25Pt/qqdu3vLUhHk6h2NPkyDZrK/img.png&quot; data-alt=&quot;Fig 10&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H0Ok5/btqBGpx25Pt/qqdu3vLUhHk6h2NPkyDZrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH0Ok5%2FbtqBGpx25Pt%2Fqqdu3vLUhHk6h2NPkyDZrK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 10&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;그리고 Web을 하려고 한다면 Web을 클릭한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eqL1sR/btqBL8gBvgt/qyld1kiVWDNWvoHg09Q8QK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eqL1sR/btqBL8gBvgt/qyld1kiVWDNWvoHg09Q8QK/img.png&quot; data-alt=&quot;Fig 11&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eqL1sR/btqBL8gBvgt/qyld1kiVWDNWvoHg09Q8QK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeqL1sR%2FbtqBL8gBvgt%2Fqyld1kiVWDNWvoHg09Q8QK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 11&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lprIE/btqBIIDtbDq/qMbHJENMVAKBnX3Jv91eS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lprIE/btqBIIDtbDq/qMbHJENMVAKBnX3Jv91eS1/img.png&quot; data-alt=&quot;Fig 12&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lprIE/btqBIIDtbDq/qMbHJENMVAKBnX3Jv91eS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlprIE%2FbtqBIIDtbDq%2FqMbHJENMVAKBnX3Jv91eS1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 12&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Facebook Login/Settings 에서 Redirect URI to Check 에 URI를 입력하고 확인 후 저장한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JHhc4/btqBLjbPAii/yGuxnl6SGD4qOKed90YZL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JHhc4/btqBLjbPAii/yGuxnl6SGD4qOKed90YZL1/img.png&quot; data-alt=&quot;Fig 13&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JHhc4/btqBLjbPAii/yGuxnl6SGD4qOKed90YZL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJHhc4%2FbtqBLjbPAii%2FyGuxnl6SGD4qOKed90YZL1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 13&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Settings를 보면 App ID 와 App Secret 가 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;구글도 한 번 훑어보자.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Google Cloud Platform 에서 앱을 만드는데,&amp;nbsp; Select a Project/New Project에서 Project Name을&amp;nbsp; 설정한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LRwUf/btqBL8Vdqwf/H3IkjB4OHhJsMV2us5EJB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LRwUf/btqBL8Vdqwf/H3IkjB4OHhJsMV2us5EJB1/img.png&quot; data-alt=&quot;Fig 14&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LRwUf/btqBL8Vdqwf/H3IkjB4OHhJsMV2us5EJB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLRwUf%2FbtqBL8Vdqwf%2FH3IkjB4OHhJsMV2us5EJB1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 14&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;그러면 Project가 생성되고 이제 다시 project를 선택한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;484&quot; height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caX9cF/btqBL8HGtwl/GLjQ9XWI6TEif5Vy7rZdYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caX9cF/btqBL8HGtwl/GLjQ9XWI6TEif5Vy7rZdYk/img.png&quot; data-alt=&quot;Fig 15&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caX9cF/btqBL8HGtwl/GLjQ9XWI6TEif5Vy7rZdYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaX9cF%2FbtqBL8HGtwl%2FGLjQ9XWI6TEif5Vy7rZdYk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;484&quot; height=&quot;640&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 15&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;여기서 우리가 원하는 것은 API를 제어하는 것이다. 그러기 위해서는 제어할 수 있는 자격을 얻어야 하는데 구글에서는 Credentials에서 진행한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buNOdG/btqBIIpS7vu/SNz7VuH5uCJd0VTjAg9Et1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buNOdG/btqBIIpS7vu/SNz7VuH5uCJd0VTjAg9Et1/img.png&quot; data-alt=&quot;Fig 16&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buNOdG/btqBIIpS7vu/SNz7VuH5uCJd0VTjAg9Et1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuNOdG%2FbtqBIIpS7vu%2FSNz7VuH5uCJd0VTjAg9Et1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 16&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vy9MA/btqBHynNodW/DOqkUFyb9vLtbjDECKNGbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vy9MA/btqBHynNodW/DOqkUFyb9vLtbjDECKNGbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vy9MA/btqBHynNodW/DOqkUFyb9vLtbjDECKNGbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvy9MA%2FbtqBHynNodW%2FDOqkUFyb9vLtbjDECKNGbk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Consent Screen 설정&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;560&quot; height=&quot;798&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byEVRZ/btqBGZ6Za4r/MKXKm9ozzVdywpAtp9KLY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byEVRZ/btqBGZ6Za4r/MKXKm9ozzVdywpAtp9KLY0/img.png&quot; data-alt=&quot;Fig 17&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byEVRZ/btqBGZ6Za4r/MKXKm9ozzVdywpAtp9KLY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyEVRZ%2FbtqBGZ6Za4r%2FMKXKm9ozzVdywpAtp9KLY0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;560&quot; height=&quot;798&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 17&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이제 우리가 서비스할 애플리케이션 타입을 설정한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;388&quot; height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CsptN/btqBJea3KIe/Tak9AiWBkBxtjZWKbsk9M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CsptN/btqBJea3KIe/Tak9AiWBkBxtjZWKbsk9M0/img.png&quot; data-alt=&quot;Fig 18&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CsptN/btqBJea3KIe/Tak9AiWBkBxtjZWKbsk9M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCsptN%2FbtqBJea3KIe%2FTak9AiWBkBxtjZWKbsk9M0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;388&quot; height=&quot;778&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 18&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;514&quot; height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpDZ2n/btqBLHXRh3l/kdt1h6VqyCk1WKeoCaxkkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpDZ2n/btqBLHXRh3l/kdt1h6VqyCk1WKeoCaxkkk/img.png&quot; data-alt=&quot;Fig 19&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpDZ2n/btqBLHXRh3l/kdt1h6VqyCk1WKeoCaxkkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpDZ2n%2FbtqBLHXRh3l%2Fkdt1h6VqyCk1WKeoCaxkkk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;514&quot; height=&quot;605&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 19&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KB993/btqBLHDz78f/O9jCmpnZMoeDqtyJijvzo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KB993/btqBLHDz78f/O9jCmpnZMoeDqtyJijvzo1/img.png&quot; data-alt=&quot;Fig 20&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KB993/btqBLHDz78f/O9jCmpnZMoeDqtyJijvzo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKB993%2FbtqBLHDz78f%2FO9jCmpnZMoeDqtyJijvzo1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 20&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;chapt3&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;3. Resouce Owner의 승인&lt;/h1&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/UH5XnjkBqKE&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;등록을 마치면 Resource Server와 Client는 Client ID, Client Secret, Redirect URI 라는 3가지 핵심적인 정보를 동시에 갖게 된다. Client는 Redirect URI에 해당하는 페이지를 구현해놓고 준비해두고 있어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;먼저 한가지 내용을 짚고 가자. Resource Server 가 가지고 있는 기능이 A, B, C, D 4개 라면 Client가 Resource Server의 모든 기능이 다 필요한 것이 아니라 그 중 B, C에 해당되는 2개의 기능만 필요한 경우, 모든 기능에 대해 인증을 받는 것이 아니라 최소한의 기능에 대해서만 훨씬 용이하고 안전하다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Resource Owner 즉 user가 우리의 서버에 접속을 하면 우리가 Resource Server를 사용해야 하는 상황이 생길 수 있다. 예를 들어 Facebook에 글을 게시한다든지, Google Calendar에 날짜를 기록한다든지 등의 작업을 해야 한다면 우리는 Resource Owner에게 이런 화면을 보여주게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;343&quot; height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FuB2f/btqBHTLZYvt/kaoiF6s2S2NqhJYWSB7KEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FuB2f/btqBHTLZYvt/kaoiF6s2S2NqhJYWSB7KEk/img.png&quot; data-alt=&quot;Fig 22. user 즉 Client 에게 다른 사이트 계정을 이용하여 로그인하도록 하는 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FuB2f/btqBHTLZYvt/kaoiF6s2S2NqhJYWSB7KEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFuB2f%2FbtqBHTLZYvt%2FkaoiF6s2S2NqhJYWSB7KEk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;343&quot; height=&quot;316&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 22. user 즉 Client 에게 다른 사이트 계정을 이용하여 로그인하도록 하는 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&quot;지금 귀하께서 하시려고 하는 일은 페이스북의 ... 기능이 필요한데 그 기능을 쓰기 위해서는 하기 때문에 인증을 거쳐야 합니다&quot;라는 메세지와 함께.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;860&quot; height=&quot;529&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q1xoj/btqBHxP02YZ/msaPFzstSsYgKe5wn9URa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q1xoj/btqBHxP02YZ/msaPFzstSsYgKe5wn9URa1/img.png&quot; data-alt=&quot;Fig 23&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q1xoj/btqBHxP02YZ/msaPFzstSsYgKe5wn9URa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq1xoj%2FbtqBHxP02YZ%2FmsaPFzstSsYgKe5wn9URa1%2Fimg.png&quot; width=&quot;860&quot; height=&quot;529&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 23&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;어찌됐든 사용자의 동의를 해야만 다음 과정으로 넘어가게 될 것이다. 위 그림의 버튼을 클릭했다는 것은 사용자가 동의를 했다는 의미인데 저 버튼은 이런 링크를 가지고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;491&quot; height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qznpP/btqBGYNO4wt/K3M4pZTtUZwjNmrt815AA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qznpP/btqBGYNO4wt/K3M4pZTtUZwjNmrt815AA1/img.png&quot; data-alt=&quot;버튼이 가지고 있는 링크&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qznpP/btqBGYNO4wt/K3M4pZTtUZwjNmrt815AA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqznpP%2FbtqBGYNO4wt%2FK3M4pZTtUZwjNmrt815AA1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;491&quot; height=&quot;134&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;버튼이 가지고 있는 링크&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;인자로서 Client ID, 사용하려는 서비스 B와 C,&amp;nbsp; redirect uri 값이다. 실제로 저런 버튼의 링크를 보면 이렇다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Pikq/btqBHU5aTz6/aJ9tKkTqRBkt3tZVKfXvaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Pikq/btqBHU5aTz6/aJ9tKkTqRBkt3tZVKfXvaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Pikq/btqBHU5aTz6/aJ9tKkTqRBkt3tZVKfXvaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Pikq%2FbtqBHU5aTz6%2FaJ9tKkTqRBkt3tZVKfXvaK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Resource Owner는 버튼을 클릭하여 저 주소, 즉 Resource Server로 가게 되며, 이때 Resource Server 는 로그인 하도록 한다. 로그인이 되면 Resource Server는 Resource Owner가 보낸 URI에 있는 Client ID 가 있는 지를 확인하고, 계속해서 자신에게 등록되어 있는 redirect uri 와 저 주소의 redirect uri가 같은지를 또 확인하고 다르면 그냥 끝내버린다. 확인 되면 Resource Owner에게 scope에 해당되는 권한을 Client에게 부여할 것인지를 확인하는 메세지를 보낸다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9GIHy/btqBJd4gqQj/3po71KFHcl6rLGrxpIeR4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9GIHy/btqBJd4gqQj/3po71KFHcl6rLGrxpIeR4K/img.png&quot; data-alt=&quot;Fig 24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9GIHy/btqBJd4gqQj/3po71KFHcl6rLGrxpIeR4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9GIHy%2FbtqBJd4gqQj%2F3po71KFHcl6rLGrxpIeR4K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 24&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;사용자가 동의하면 Resource Server는 user id가 scope 에 해당하는 작업을 허용하는 것에 동의하였다는 정보를 가지게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;url을 보기 쉽게 decoding 도구: &lt;a href=&quot;https://urldecode.org&quot;&gt;https://urldecode.org&lt;/a&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;chapt4&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;4. Resouce Server의 승인&lt;/h1&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/O0Rx9SRPzs4&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;OAuth 2.0의 총 6 가지 인증 방식(grant type)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;인증 Grant Type이란 Client가 액세스토큰을 발급받기 위한 플로우라고 보면 된다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;1) Authorization Code Grant (인가 코드 그랜트 타입)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;OAuth2.0 Grant Type에서 가장 잘 알려진 인가 코드 그랜트 타입은 중요한 보안 이점을 제&lt;/span&gt;&lt;span&gt;공하는 방법이다. 일반적인 웹사이트에서 소셜로그인과 같은 인증을 받을 때 가장 많이 쓰&lt;/span&gt;&lt;span&gt;는 방식으로 기본적으로 지원하고 있는 방식이다. 클라이언트는 토큰을 발급 받기 전에 인증 &lt;/span&gt;&lt;span&gt;코드라는 것을 사전에 리소스 소유자에 의해서 받게 되고 그 인증코드(권한 부여코드)를 가&lt;/span&gt;&lt;span&gt;지고 인증서버에 요청을 보내야 토큰을 발급받을 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2) Implicit Grant&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;암시적 그랜트 타입&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;암시적 그랜트 타입은 서버가 없는 단순 웹 브라우저에서 직접 실행되는 자바스크립트 웹 애&lt;/span&gt;&lt;span&gt;플리케이션 클라이언트에게 적당한 권한 부여 방법이다. 별다른 인증방법없이 클라이언트&lt;/span&gt;&lt;span&gt;가 요청을 보내면 리소스 소유자의 Authentication(+사용자 동의 과정) 과정만 거치고 바로&amp;nbsp;&lt;/span&gt;&lt;span&gt;토큰을 발급해준다. 이 그랜트 타입은 클라이언트가 토큰을 안전하게 보관할 방법이 없기때&lt;/span&gt;&lt;span&gt;문에 리프레시 토큰을 발급해주지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;3) Resource Owner Password Credentials Grant&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Client에 아이디/패스워드를 받아 아이디/패스워드로 직접 access token을 받아오는 방식이&lt;/span&gt;&lt;span&gt;다. Client가 신용이 없을 때에는 사용하기에 위험하다는 단점이 있다. 클라이언트가 확실한&amp;nbsp;&lt;/span&gt;&lt;span&gt;신용이 보장될 때 사용할 수 있는 방식이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;4) Client Credentials Grant&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;5) Device Code Grant&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;6) Refresh Token Grant&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Resource Server 는 Access token을 발급하기 전에 한 가지 절차를 더 진행한다. 이때 사용하는 임시비밀번호가 Authorization Code이다. Resource Server 는 &lt;span style=&quot;color: #333333;&quot;&gt;Resource Owner에게 아래 &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그림의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;①과 같은 식으로 &lt;/span&gt;&amp;nbsp;Authorization Code를 전송한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;860&quot; height=&quot;498&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O5Qtd/btqBJ8n6fYX/L4cCOeDFjNmQNg43kOnBL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O5Qtd/btqBJ8n6fYX/L4cCOeDFjNmQNg43kOnBL1/img.png&quot; data-alt=&quot;Fig 25&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O5Qtd/btqBJ8n6fYX/L4cCOeDFjNmQNg43kOnBL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO5Qtd%2FbtqBJ8n6fYX%2FL4cCOeDFjNmQNg43kOnBL1%2Fimg.png&quot; width=&quot;860&quot; height=&quot;498&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 25&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;응답할때 Header 값으로 location을 줘서 저 주소로 이동하도록 명령하는 것이다. Resouce Server가 Resouce owner의 웹브라우저에게 https://client/callback?code=3&amp;nbsp; 로 이동하도록 한 것. 이 주소를 살펴보면 인자값으로 code=3 을 주고 있는데 여기서 이 3이 바로 Authorization code이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;② &lt;/span&gt;이에 따라 Resource owner의 웹브라우저는&amp;nbsp; 사용자[즉 Resource owner]가 인식하지 못하도록 은밀하게 &lt;span style=&quot;color: #333333;&quot;&gt;location 헤더 값 주소로 이동하게 된다. 그리하여 Client는 Authorization code 의 값 3을 얻게 된다. 이것이 Client가 Resouce Server로부트 Access token을 발급받기 전 단계이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;이제 &lt;/span&gt;&lt;span&gt;클라이언트는 리로스오너를 통하지않고 리소&lt;/span&gt;&lt;span&gt;스 서버에 직접 접속한다. 아래 그림과 같이 &lt;a href=&quot;https://resouce.server&quot;&gt;https://resouce.server&lt;/a&gt;/token?grant_type=authorization_code&amp;amp;code=3&amp;amp;redirect_uri=https:client/callback&amp;amp;client_secret=2 이라는 주소를 사용하여 접속하는데 여기서 grant_type 은 이 authorization code 방식을 지정하고 있는데 이 방식 외에도 4가지 방식이 더 있다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;393&quot; height=&quot;618&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDf79P/btqBL7os5gx/5fjkojKDt8dn05KTnSKgR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDf79P/btqBL7os5gx/5fjkojKDt8dn05KTnSKgR0/img.png&quot; data-alt=&quot;Fig 26&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDf79P/btqBL7os5gx/5fjkojKDt8dn05KTnSKgR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDf79P%2FbtqBL7os5gx%2F5fjkojKDt8dn05KTnSKgR0%2Fimg.png&quot; width=&quot;393&quot; height=&quot;618&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 26&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;authorization code와 함께 client_secret 값도 전송하게 되는데, &lt;span style=&quot;color: #333333;&quot;&gt;Resource Server는&lt;/span&gt; 이 두 개의 비밀정보와 redirection uri를 결합하여&amp;nbsp; 확인과정을 거친다.&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;chapt5&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;5. Access token&lt;/h1&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/BofCK1oWAyc&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;드이어 Access Token을 발급받게 되었다. 이제는 authorization code의 역할이 끝났기 때문에 Client 와 Resource Server 모두 authorization code 값을 지워버린다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;400&quot; height=&quot;428&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjO5WD/btqBGpY60fR/4kXqRoCxRrFQqio7ZCmdmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjO5WD/btqBGpY60fR/4kXqRoCxRrFQqio7ZCmdmK/img.png&quot; data-alt=&quot;Fig 27&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjO5WD/btqBGpY60fR/4kXqRoCxRrFQqio7ZCmdmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjO5WD%2FbtqBGpY60fR%2F4kXqRoCxRrFQqio7ZCmdmK%2Fimg.png&quot; width=&quot;400&quot; height=&quot;428&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 27&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;리소스 서버는 Access Token을 발급하고 클라이언트에게 응답하면,&amp;nbsp; &lt;/span&gt;&lt;span&gt;클라이언트는&amp;nbsp;&lt;/span&gt;&lt;span&gt;access token을 db나 파일 등에 내부적으로 저장하게 된다. &lt;/span&gt;&lt;span&gt;access token을 가지고 리소스 서버에 접근하면&amp;nbsp;&lt;/span&gt;&lt;span&gt;리소스 서버는&amp;nbsp;&lt;/span&gt;&lt;span&gt;access token을 보고서 userid 1번에 해당하는 사용자의 기능 b,c에 대해 허용해주&lt;/span&gt;&lt;span&gt;는것&lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt;다.&lt;/span&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;chapt6&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;6. API 호출&lt;/h1&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Avdyl5FWdwA&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;이제 Access Token을 활용하여 Resource Server를 handling 조작하기 위해서는, Resouce Server가 Client에게 알려 주는 방식을 지켜야 하는데, 이 방식이 API Application Programming Interface 라는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;469&quot; height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxrib0/btqBHTefyEu/xPzajj78RcjM5UePpl03a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxrib0/btqBHTefyEu/xPzajj78RcjM5UePpl03a0/img.png&quot; data-alt=&quot;Fig 28&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxrib0/btqBHTefyEu/xPzajj78RcjM5UePpl03a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcxrib0%2FbtqBHTefyEu%2FxPzajj78RcjM5UePpl03a0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;469&quot; height=&quot;492&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 28&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;실제 API의 모습을 한 번 살펴보자. 예를 들어 구글 캘린더를 Resource Server로 하여 그것을 제어하고 싶다면 이때 검색어는 마땅히 google calendar api 가 되어야 할 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckU3Ry/btqBGY1n4Te/UrZTMwTMj1NwfhNJkOHcWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckU3Ry/btqBGY1n4Te/UrZTMwTMj1NwfhNJkOHcWK/img.png&quot; data-alt=&quot;Fig 29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckU3Ry/btqBGY1n4Te/UrZTMwTMj1NwfhNJkOHcWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckU3Ry%2FbtqBGY1n4Te%2FUrZTMwTMj1NwfhNJkOHcWK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 29&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;저 링크로 접속하여 Reference 참조 를 보면 Acl, CalendarList, Calendars, Channels, Colors, Events, Freebusy, Settings 등 여러 개의 Resource types 이 있는데 여기서 CalendarList가 필요하다고 한다면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J68oW/btqBHxQadk4/7VCa2sH3fnW9RMvKIjKL4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J68oW/btqBHxQadk4/7VCa2sH3fnW9RMvKIjKL4K/img.png&quot; data-alt=&quot;Fig 30&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J68oW/btqBHxQadk4/7VCa2sH3fnW9RMvKIjKL4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ68oW%2FbtqBHxQadk4%2F7VCa2sH3fnW9RMvKIjKL4K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 30&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;그림에 표시된 저 부분의 주소를 베이스로 하여, list를 GET 하고 싶다면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;623&quot; height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkL7xN/btqBIJbrNyr/BkqYAXWkVy6yrn3dRs5LJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkL7xN/btqBIJbrNyr/BkqYAXWkVy6yrn3dRs5LJ0/img.png&quot; data-alt=&quot;Fig 31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkL7xN/btqBIJbrNyr/BkqYAXWkVy6yrn3dRs5LJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkL7xN%2FbtqBIJbrNyr%2FBkqYAXWkVy6yrn3dRs5LJ0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;623&quot; height=&quot;591&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 31&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;저 주소를 결합하여 전체 주소를 완성한다. 이제 이 주소를 주소창에 입력해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;774&quot; height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l98kc/btqBHx3BKqq/Is8DVmEmGfS0GS8FVotCy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l98kc/btqBHx3BKqq/Is8DVmEmGfS0GS8FVotCy1/img.png&quot; data-alt=&quot;Fig 32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l98kc/btqBHx3BKqq/Is8DVmEmGfS0GS8FVotCy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl98kc%2FbtqBHx3BKqq%2FIs8DVmEmGfS0GS8FVotCy1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;774&quot; height=&quot;242&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 32&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;이 주소가 바로 구글 캘린더의 리스트를 보여주는 API가 되는 것이다. 접속해보면 이런 결과를 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;588&quot; height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9AEfW/btqBMNwFciq/u9nkAVkN3mzkJffvbDVZVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9AEfW/btqBMNwFciq/u9nkAVkN3mzkJffvbDVZVk/img.png&quot; data-alt=&quot;Fig 33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9AEfW/btqBMNwFciq/u9nkAVkN3mzkJffvbDVZVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9AEfW%2FbtqBMNwFciq%2Fu9nkAVkN3mzkJffvbDVZVk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;588&quot; height=&quot;442&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 33&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;로그인이 되어 있지 않기 때문에 Login Required 가 있는 것을 보고 이 API는 인증이 필요하다고 판단할 수 있는데, 바로 OAuth를 통해, 즉 Access Token을 통해야만 저기의 데이터를 제대로 가져올 수 있는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;실제 Access Token을 가져오는 방법은 각각의 애플리케이션에서 해야 하는데 여기서 그 부분을 다루지는 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;google api access token oauth&amp;nbsp; 라고 구글링 해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIT50H/btqBIIcxFlX/tt51ZBhQFk3xw7jZk2iqRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIT50H/btqBIIcxFlX/tt51ZBhQFk3xw7jZk2iqRK/img.png&quot; data-alt=&quot;Fig 34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIT50H/btqBIIcxFlX/tt51ZBhQFk3xw7jZk2iqRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIT50H%2FbtqBIIcxFlX%2Ftt51ZBhQFk3xw7jZk2iqRK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 34&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.google.com/identity/protocols/OAuth2WebServer&quot;&gt;https://developers.google.com/identity/protocols/OAuth2WebServer&lt;/a&gt; 의 웹페이지를 열어보면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qEBaS/btqBLkoroHs/SKkj8JjL4CVz0aybeg5Oj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qEBaS/btqBLkoroHs/SKkj8JjL4CVz0aybeg5Oj0/img.png&quot; data-alt=&quot;Fig 35&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qEBaS/btqBLkoroHs/SKkj8JjL4CVz0aybeg5Oj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqEBaS%2FbtqBLkoroHs%2FSKkj8JjL4CVz0aybeg5Oj0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 35&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;많은 내용들이 들어 있는데 Client libraries를 쓸 수 있는 언어 별로 정리된 내용들도 있고,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhFRQm/btqBHzmTwRT/kTXiIkfviYI9NaNsfoPMk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhFRQm/btqBHzmTwRT/kTXiIkfviYI9NaNsfoPMk1/img.png&quot; data-alt=&quot;Fig 36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhFRQm/btqBHzmTwRT/kTXiIkfviYI9NaNsfoPMk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhFRQm%2FbtqBHzmTwRT%2FkTXiIkfviYI9NaNsfoPMk1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 36&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;기타 여러 가지 내용들이 있는데, 이 중에서 Calling Google APIs 부분을 보면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;765&quot; height=&quot;801&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpTUib/btqBLiYzjQp/VQxD7JEHfof80FcsfeKKVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpTUib/btqBLiYzjQp/VQxD7JEHfof80FcsfeKKVk/img.png&quot; data-alt=&quot;Fig 37&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpTUib/btqBLiYzjQp/VQxD7JEHfof80FcsfeKKVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpTUib%2FbtqBLiYzjQp%2FVQxD7JEHfof80FcsfeKKVk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;765&quot; height=&quot;801&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 37&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;두 가지 방법이 있는데, 하나는 access_token을 query parameter로 보내는 방법과, Authorizaiotn: Bearer를 HTTP header로 전송하는 방법인데 이 중에서 HTTP header 가 더 선호된다[안전하다] 고 설명하고 있다. access_token을 사용하는 방법은 파랑색으로 표시하였다. 앞에서 CalendarList의 캘린더 list를 GET하는 API를 완성하려면 Fig 32의 주소뒤에 access_token을 붙여줘야 하는데 실제 access_token은 이런 모양이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XxQ7a/btqBIIwWFKc/xRZf5zwu9s0gDhpRHXDJK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XxQ7a/btqBIIwWFKc/xRZf5zwu9s0gDhpRHXDJK1/img.png&quot; data-alt=&quot;Fig 38&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XxQ7a/btqBIIwWFKc/xRZf5zwu9s0gDhpRHXDJK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXxQ7a%2FbtqBIIwWFKc%2FxRZf5zwu9s0gDhpRHXDJK1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 38&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;그리고 이걸 이용하여 접속했을 때에는 제대로 데이터를 받게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjq0AA/btqBIHku0Ke/Mkhn3J9q3f2w8OkaJtEluK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjq0AA/btqBIHku0Ke/Mkhn3J9q3f2w8OkaJtEluK/img.png&quot; data-alt=&quot;Fig 39. 앞의 그림처럼 완성한 URI로 접속한 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjq0AA/btqBIHku0Ke/Mkhn3J9q3f2w8OkaJtEluK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbjq0AA%2FbtqBIHku0Ke%2FMkhn3J9q3f2w8OkaJtEluK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 39. 앞의 그림처럼 완성한 URI로 접속한 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;이것은 Client가 가지고 있는 캘린더들의 목록이다. 예제용으로 만든 것이기 때문에 내용이 많지는 않다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;이것이 첫 번째 방법인데 이 방법은 제공하지 않는 경우도 많다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;좀 더 선호되는 방법인 헤더값으로 Authorization: Bearer &amp;lt;access_token&amp;gt;을 전송하는 방법의 경우는 curl 이라는 프로그램을 이용하면 쉽게 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;791&quot; height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bunS8Z/btqBIHEOrZ0/eNor7SUoUgWWva7QEvydN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bunS8Z/btqBIHEOrZ0/eNor7SUoUgWWva7QEvydN1/img.png&quot; data-alt=&quot;Fig 40&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bunS8Z/btqBIHEOrZ0/eNor7SUoUgWWva7QEvydN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbunS8Z%2FbtqBIHEOrZ0%2FeNor7SUoUgWWva7QEvydN1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;791&quot; height=&quot;734&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 40&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ak5HT/btqBMMLtbq7/50NwwtEpjgXEWko9uXP4ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ak5HT/btqBMMLtbq7/50NwwtEpjgXEWko9uXP4ok/img.png&quot; data-alt=&quot;Fig 41&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ak5HT/btqBMMLtbq7/50NwwtEpjgXEWko9uXP4ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAk5HT%2FbtqBMMLtbq7%2F50NwwtEpjgXEWko9uXP4ok%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 41&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;curl 은 해당 주소에서 받은 코드를 살펴보는 프로그램이라고 할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;콘솔에서 실행시키면 좀 더 안전하게 결과를 가져올 수 있는 것을 확인할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;506&quot; height=&quot;773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTO1by/btqBIIw0gai/qa2UBk4vNwF5CaKoKuPWk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTO1by/btqBIIw0gai/qa2UBk4vNwF5CaKoKuPWk1/img.png&quot; data-alt=&quot;Fig 42&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTO1by/btqBIIw0gai/qa2UBk4vNwF5CaKoKuPWk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTO1by%2FbtqBIIw0gai%2Fqa2UBk4vNwF5CaKoKuPWk1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;506&quot; height=&quot;773&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 42&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;앞에서 본 query parameter 방식은 제공하지 않을 수도 있기 때문에 매뉴얼을 확인하여야 하며, 이 Authorization Bearer 에 의한 방법은 어디서나 제공하는 표준화된 방식이고 좀 더 안전하고 선호되는 방식이다. &lt;/span&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;chapt7&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;7. Refresh token&lt;/h1&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/9eKIYjcPXp4&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Access token은 수명이 있습니다. Access token의 수명이 다했을 때 새로운 access token을 발급 받는 방법이 refresh token이다. access token은 일반적으로 1~2시간 정도의 수명이 있고, 수명이 긴 경우에는 60일, 90일 이나 되는 경우도 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Access token의 수명이 다했을 때 api로 접근하면 더 이상 데이터를 주지 않는다. 그러면 access token을 다시 발급받아야 하고 이때 또다시 사용자와 확인&amp;bull;동의 과정을 거치는 것은 번거로운 일이고, 이것을 필수로 하게 하는 시스템도 있긴 하지만, 이러한 경우에 새로 access token을 쉽게 발급받을 수 있는 방법이 바로 refresh token이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;검색어: oauth 2.0 rfc&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * RFC: 인터넷과 관련된 여러 가지 표준들. Request For Comments 컴퓨터 네트워크 공학 등에서 인터넷 기술에 적용 가능한 새로운 연구, 혁신, 기법 등을 아우르는 메모&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;695&quot; height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KcuUM/btqBHxJtpR0/gB6sr8f5jkOUZltICSHAf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KcuUM/btqBHxJtpR0/gB6sr8f5jkOUZltICSHAf0/img.png&quot; data-alt=&quot;Fig 43. 검색하면 RFC 6749 문서가 보인다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KcuUM/btqBHxJtpR0/gB6sr8f5jkOUZltICSHAf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKcuUM%2FbtqBHxJtpR0%2FgB6sr8f5jkOUZltICSHAf0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;695&quot; height=&quot;388&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 43. 검색하면 RFC 6749 문서가 보인다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;이 RFC 6749는 OAuth 2.0 Authorization Framework 를 설명하는 문서이다. 여기서 목차 Table of Contents/1.5 Refresh Token 을 보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;860&quot; height=&quot;469&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FaL1N/btqBIHq3KYL/TWvRSV7oMohC1OO2nv3Mck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FaL1N/btqBIHq3KYL/TWvRSV7oMohC1OO2nv3Mck/img.png&quot; data-alt=&quot;Fig 44. Resource Server와 Authorization Server가 서로 다르다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FaL1N/btqBIHq3KYL/TWvRSV7oMohC1OO2nv3Mck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFaL1N%2FbtqBIHq3KYL%2FTWvRSV7oMohC1OO2nv3Mck%2Fimg.png&quot; width=&quot;860&quot; height=&quot;469&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 44. Resource Server와 Authorization Server가 서로 다르다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;A : 권한을 획득한다.&amp;nbsp;&lt;/span&gt;&lt;span&gt;access token을 발급받는것&lt;br /&gt;&lt;/span&gt;&lt;span&gt;B:&amp;nbsp;&lt;/span&gt;&lt;span&gt;access token과 함께&amp;nbsp;&lt;/span&gt;&lt;span&gt;Refresh token도 발급하고 저장해둠. Refresh token을 동시에 발급해주는 경우가 많지만 아닌 경우도 있다.&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;C,D: API를 호출할때&amp;nbsp;&lt;/span&gt;&lt;span&gt;access token을 제출해 보호된 자원들을 가져옴&lt;br /&gt;&lt;/span&gt;&lt;span&gt;E,F: 계속해서 자원을 가져오다가&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt; &lt;/span&gt;&lt;span&gt;access token의 수명이 끝나 유효하지 않게 된다.&lt;br /&gt;&lt;/span&gt;&lt;span&gt;G: 이때 인증 서버에게 &lt;/span&gt;&lt;span&gt;Refresh token을 전달하면서&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;H: 다시&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span&gt;acc&lt;/span&gt;&lt;span&gt;ess token을 발급 받는다. 이때 refresh token을 새로 발급받는 경우도 있고 그냥 access token만 계속해서 발급받기도 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Fig 35의 페이지에서 refresh token에 대한 매뉴얼을 확인할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;826&quot; height=&quot;489&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFNBPn/btqBL89b2Ud/Rlk4PY28KCUtUg31B7kkEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFNBPn/btqBL89b2Ud/Rlk4PY28KCUtUg31B7kkEk/img.png&quot; data-alt=&quot;Fig 45&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFNBPn/btqBL89b2Ud/Rlk4PY28KCUtUg31B7kkEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFNBPn%2FbtqBL89b2Ud%2FRlk4PY28KCUtUg31B7kkEk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;826&quot; height=&quot;489&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 45&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;사용하는 Resource Server마다 refreshing하는 방법이 모두 다르기 때문에 매뉴얼을 확인하는 과정이 필요한 것이다. 이 매뉴얼을 조금 더 자세히 들여다보면,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;816&quot; height=&quot;1038&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JGWXj/btqBIHSwlX1/KtTaQfNaBVRBNEHgRPmCR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JGWXj/btqBIHSwlX1/KtTaQfNaBVRBNEHgRPmCR1/img.png&quot; data-alt=&quot;Fig 46&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JGWXj/btqBIHSwlX1/KtTaQfNaBVRBNEHgRPmCR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJGWXj%2FbtqBIHSwlX1%2FKtTaQfNaBVRBNEHgRPmCR1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;816&quot; height=&quot;1038&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 46&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;[Host]&lt;/span&gt; &lt;b&gt;oauth2.googleapis.com&lt;/b&gt;의 &lt;span style=&quot;color: #9d9d9d;&quot;&gt;[POST]&lt;/span&gt; &lt;b&gt;/token &lt;/b&gt;이라는 path로, [Content-Type: application/x-form-urlencoded는 Form에서 POST 방식으로 전송한다는 뜻], client_id와 client_secret, 보관하고 있었던 refresh_token 값과 grant_type은 &lt;b&gt;refresh_token&lt;/b&gt;으로 하여 전송하면 구글에서는 C 부분과 같은 JSON포맷으로 데이터를 리턴해주는데, 새롭게 발급된 access_token, 유효시간 expires_in 과 같은 정보들을 보내주게 되는 것이다. 그리고 B 부분의 항목들을 보면 OAuth의 스펙을 보면 표준화된 항목들이다. 많은 시스템들에서 이와 비슷하게 동작한다고 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;전체 인증 과정 요약도&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;779&quot; height=&quot;650&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZzbrV/btqBGY75l9n/btHz4frfXDrAnY6dZDZTzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZzbrV/btqBGY75l9n/btHz4frfXDrAnY6dZDZTzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZzbrV/btqBGY75l9n/btHz4frfXDrAnY6dZDZTzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZzbrV%2FbtqBGY75l9n%2FbtHz4frfXDrAnY6dZDZTzk%2Fimg.png&quot; width=&quot;779&quot; height=&quot;650&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://meetup.toast.com/posts/105&quot;&gt;https://meetup.toast.com/posts/105&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/32964774/oauth-or-jwt-which-one-to-use-and-why&quot;&gt;https://stackoverflow.com/questions/32964774/oauth-or-jwt-which-one-to-use-and-why&lt;/a&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;chapt8&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;8. 마무리&lt;/h1&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/XpBf7ZiT_do&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;단체 메신저가 없던 시절에는 문자메세지를 주고받을 때 단 둘이서만 메신저를 사용할 수 있었다. 이때 3자가 서로 약속을 정하려고 하면 소통의 어려움이 엄청 컸다. 단체 채팅이 가능한 메신저가 등장하면서 약속에 대한 혁명이 시작되었다.&lt;/p&gt;
&lt;p&gt;OAuth 가 복잡한 것도 비슷하다. OAuth는 인증과정에 참여하고 있는 3자, 즉 Client, Resource Owver, Resource Server가 한자리에 모일 수 없는 상황에서 어떻게 하면 서로를 신뢰할 수 있을 까라는 고민에서 출발한 기술이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;OAuth를 몰라도 이를 대신해줄 라이브러리들도 많이 있다. 관심가져 볼 만한 주제 몇 가지에 대해 얘기해보자.&lt;/p&gt;
&lt;p&gt;OAuth의 가장 매력적인 부분은 Client 입장에서 제3자인 Resource 서버를 통해 Resource Owner의 신원을 인증할 수 있다는 점이다. 누군가가 구글이나 페이스북처럼 신뢰할 수 있는 Resource Server를 통해 우리에게 access token을 전달한다면 이를 통해 우리는 Resource Server 상에서 Resource Owner의 고유한 식별자를 획득할 수 있을 것이다. 바로 이 식별자가 일반적인 서비스에서 id와 비밀번호가 하는 역할을 할 수 있게 되는 것이다. 이렇게 다른 서비스와의 연합을 통해 사용자를 식별하는 인증체계를 federated identity라고 부른다. Login with Facebook, Login with Google과 같은 기능들이 바로 이러한 기술을 이용한 것이다. 주요한 서비스들은 이를 쉽게 구현할 수 있는 방법을 제공하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;한편 OAuth를 이용하는 궁극의 목적은 API를 제어하는 것이다.&amp;nbsp; 오늘날 많은 API가 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Restful&lt;/b&gt; &lt;/span&gt;스타일로 설계되고 있다. 또 API를 통해 주고 받는 데이터는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;JSON&lt;/b&gt;&lt;/span&gt;, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;XML&lt;/b&gt; &lt;/span&gt;과 같은 정보형태, 데이터 포맷을 이용하는 경우가 많다. 이런 키워드들을 활용하기 바란다.&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <category>WEB DEVELOPMENT/Web Dev</category>
      <category>access token</category>
      <category>API</category>
      <category>authorization code</category>
      <category>client id</category>
      <category>client secret</category>
      <category>oAuth</category>
      <category>refresh token</category>
      <category>Resource Owner</category>
      <category>Resource Sevrer</category>
      <category>scope</category>
      <author>SALTFUN</author>
      <guid isPermaLink="true">https://saltfun.tistory.com/20</guid>
      <comments>https://saltfun.tistory.com/20#entry20comment</comments>
      <pubDate>Wed, 5 Feb 2020 10:58:55 +0900</pubDate>
    </item>
    <item>
      <title>GitHub</title>
      <link>https://saltfun.tistory.com/19</link>
      <description>&lt;p&gt;&lt;a name=&quot;처음&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;https://www.opentutorials.org/course/307/2475&quot;&gt;https://www.opentutorials.org/course/307/2475&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;#intro&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;1.&amp;nbsp;INTRO &lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#home&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;2.&amp;nbsp;서비스&amp;nbsp;구성(홈페이지) &lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#repository&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;3.&amp;nbsp;서비스&amp;nbsp;구성(저장소) &lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#signIn&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;4.&amp;nbsp;가입과&amp;nbsp;저장소&amp;nbsp;생성 &lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#local&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;5.&amp;nbsp;로컬&amp;nbsp;저장소 &lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#issue&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;6.&amp;nbsp;이슈 &lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#githubPage&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;7.&amp;nbsp;GitHub&amp;nbsp;Page&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;intro&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.&amp;nbsp;INTRO&lt;/h2&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/2PrYdDzZ314&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;여기서 소개하는 내용들을 2012년에 만들어진 컨텐츠에 대한 것이다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;버전관리 시스템이란?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;문서나 코드의 변경사항을 저장해서 과거의 상태를 열람, 복원 할 수 있도록 한다. 또 협업시에 협업자들의 변경사항을 자동으로 붙여주고, 충돌을 방지한다. 버전관리시스템은 처음에는 조금 까다로울 수 있지만 나중에는 버전관리시스템이 없이는 프로젝트를 불안해서 할 수가 없을 정도가 될 정도로 유용하게 쓰인다.&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;생활코딩 버전관리 시스템 수업 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://opentutorials.org/course/302&quot;&gt;http://opentutorials.org/course/302&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;버전관리시스템에는 GIT, Subversion, Mercurial 과 같은 제품들이 있는데 GIT은 분산형 버전관리시스템으로서 가장 성공적인 버전관리시스템이고 가장 많이 사용되고 있다. 그 전까지는 Subversion 이 많이 쓰였으나 GIT이나 Mercurial과 같은 분산형버전관리시스템으로 대세가 이동하였다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Git이란?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;버전관리 시스템의 제품 중의 하나로, 분산형 버전관리 시스템으로 분류된다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;생활코딩 Git 수업 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://opentutorials.org/course/303&quot;&gt;http://opentutorials.org/course/303&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;GitHub란?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;GitHub에 대해 알기 위해 Git에 대한 지식이 꼭 필수인 것은 아니다. GitHub은 버전관리를 위한 솔루션이기도 하지만 여러 가지 프로젝트들을 배포하는 역할도 하기 때문에 버전관리시스템에 참여하지 않는다 하더라도 GitHub사이트의 사용법에 대해 알면 도움이 되기 때문에 버전관리와 상관없이 GitHub에 대해 알아 볼 수 있다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com&quot;&gt;http://github.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;버전관리 시스템인 Git을 이용하는 프로젝트들을 위한 원격저장소를 제공하는 서비스&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;p&gt;버전들의 변경점들이 저장소에 쌓이게 된다.&amp;nbsp; 자신의 컴퓨터 안에도 기본적으로 저장소가 있지만 컴퓨터 안에 있는 것을 github이라는 서비스로 업로드하면 원격저장소가 된다. 이게 좋은 점은 내 컴퓨터의 데이터가 날아가도 원격저장소에는 파일이나 문서들이 남았기 때문에 안전하다는 거다. 또 여러 사람이 작업하는 경우에는 여러 사람이 공통으로 접근할 수 있는 중간 지점에 원격저장소를 마련해놓고 협업을 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;저장소 크기의 제한이 없고 1개 파일은 1G까지 인데 최신정책은 확인해야 할 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;참고&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.looah.com/article/view/866&quot;&gt;github와 프로그래밍의 민주화&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://d3js.org/&quot;&gt;https://d3js.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;TOP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;home&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;2.&amp;nbsp;서비스&amp;nbsp;구성(홈페이지)&lt;/h2&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/XnGffpOAiFk&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;News Feed: 구독하고 있는 저장소[프로젝트] 의 변경점들을 보여준다.&lt;/p&gt;
&lt;p&gt;Your actions: GitHub 안에서 했던 행위들&lt;/p&gt;
&lt;p&gt;Pull Requests: 다른 사람의 내 코드를 가져다 수정한 후 다시 되돌려줄 때의 요청&lt;/p&gt;
&lt;p&gt;Issues: 각각의 저장소는 여러 가지 issue가 있을 수 있다. 버그가 생겼거나 개선사항이 나타났을 경우 올라오게 되는 각각의 리포트들을 issue라고 한다. 또한 저장소마다 issue를 달 수 있는데 홈페이지의 issue라고 하는 것은 여러 가지 구분되어 있는 issue들을 한 곳에 모아 보여주는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;개인계정과 단체계정도 있다. 단체에 소속되어 있으면 단체의 이름으로 저장소를 만든다거나 등의 작업이 가능하다. 아마도 카페와 같은 개념으로 이해하면 될 것 같다. 내가 만든 카페 정도? New organization을 클릭하면 각기 다른 가격정책이 나온다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;265&quot; height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPzFGg/btqBCUELm1e/rxQp7s7qWKTojFESfTYAI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPzFGg/btqBCUELm1e/rxQp7s7qWKTojFESfTYAI1/img.png&quot; data-alt=&quot;Fig 1. 단체는 오른쪽상단 + 를 클릭하여 만듦&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPzFGg/btqBCUELm1e/rxQp7s7qWKTojFESfTYAI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPzFGg%2FbtqBCUELm1e%2FrxQp7s7qWKTojFESfTYAI1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;265&quot; height=&quot;232&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 1. 단체는 오른쪽상단 + 를 클릭하여 만듦&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Explore : GitHub에서 서비스되고 있는 저장소[프로젝트]들을 찾을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Trending: GitHub에서 인기있는 프로젝트들을 찾을 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;796&quot; height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHYIlc/btqBGqhgTdN/th2PhZeW9zQ7wzyX7WlYs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHYIlc/btqBGqhgTdN/th2PhZeW9zQ7wzyX7WlYs1/img.png&quot; data-alt=&quot;Fig 2. 언어별 컨텐츠&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHYIlc/btqBGqhgTdN/th2PhZeW9zQ7wzyX7WlYs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHYIlc%2FbtqBGqhgTdN%2Fth2PhZeW9zQ7wzyX7WlYs1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;796&quot; height=&quot;337&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 2. 언어별 컨텐츠&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;gist: 간단한 스크립트나 몇 개 안되는 파일의 경우 매 번 저장소를 만드는 것은 귀찮은 일이다. 이때 gist에 그냥 설명적고, script 입력하고 저장하면 web 상에서 바로 저장관리가 되면서 그 코드 or 문서를 다른 사람과 공유할 수 있게 된다. 이렇게 공유한 파일들은 github 내부적으로는 git에 저장소로 저장되기 때문에 정식으로 이것을 로컬컴퓨터에 클로닝하여 작업을 한 후 등록할 수도 있다.&lt;/p&gt;
&lt;p&gt;저장소를 커밋하기 위해서는 인증을 해야 하는데 인증과 관련된 정보는 자신의 프로파일 편집에서 SSH and GPG keys 를 얻을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;TOP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;repository&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.&amp;nbsp;서비스&amp;nbsp;구성(저장소)&lt;/h2&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/-g54hbQWMK0&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;프로젝트가 저장소에 보관되기 때문에 프로젝트나 저장소는 같은 의미로 볼 수도 있겠다. 저장소는 파일들의 변경점들이 실제로 저장되는 공간이다. 이 저장소를 git에서 web을 통해 제어하는 방법을 살펴보자.&lt;/p&gt;
&lt;p&gt;github.com 의 검색창에 githe-hell 이라고 검색해보자. gith-hell은 egoing의 저장소 이름이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCECpQ/btqBFL7pbfY/o2XKijHofa3jyoAgkO4Zk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCECpQ/btqBFL7pbfY/o2XKijHofa3jyoAgkO4Zk1/img.png&quot; data-alt=&quot;Fig 3. 홈의 검색창에서 프로젝트 검색&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCECpQ/btqBFL7pbfY/o2XKijHofa3jyoAgkO4Zk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCECpQ%2FbtqBFL7pbfY%2Fo2XKijHofa3jyoAgkO4Zk1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 3. 홈의 검색창에서 프로젝트 검색&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOEQO1/btqBD1pT7tp/LO5mRaHy1uPuj7pzGrkqxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOEQO1/btqBD1pT7tp/LO5mRaHy1uPuj7pzGrkqxk/img.png&quot; data-alt=&quot;Fig 4. egoing/githe-hell 외에도 여러 개가 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOEQO1/btqBD1pT7tp/LO5mRaHy1uPuj7pzGrkqxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOEQO1%2FbtqBD1pT7tp%2FLO5mRaHy1uPuj7pzGrkqxk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 4. egoing/githe-hell 외에도 여러 개가 있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이제 위 그림의 egoing/GIthe-Hell을 클릭하면 해당 저장소로 이동한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cg9tmx/btqBDW970ob/C1RBmPBtmifkTIKMeOnSWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cg9tmx/btqBDW970ob/C1RBmPBtmifkTIKMeOnSWK/img.png&quot; data-alt=&quot;Fig 5. 프로젝트명이 github.com 뒤에 바로 오는 것이 아니라 /egoing 뒤에 온다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cg9tmx/btqBDW970ob/C1RBmPBtmifkTIKMeOnSWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcg9tmx%2FbtqBDW970ob%2FC1RBmPBtmifkTIKMeOnSWK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 5. 프로젝트명이 github.com 뒤에 바로 오는 것이 아니라 /egoing 뒤에 온다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;url을 보면 github은 사람 중심이기 때문에 사용자id 뒤에 프로젝트명이 온다. git에서 사용하는 여러 가지 프로젝트들이 모두 forking을 통해 복제될 수 있기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qlXb5/btqBGe2xIKd/1XJArwW8bKV9RGo9Q6gQck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qlXb5/btqBGe2xIKd/1XJArwW8bKV9RGo9Q6gQck/img.png&quot; data-alt=&quot;Fig 6. 복제나 다운로드가 가능하며 git프로그램이 없이도 다운로드하여 파일들을 그대로 볼 수 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qlXb5/btqBGe2xIKd/1XJArwW8bKV9RGo9Q6gQck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqlXb5%2FbtqBGe2xIKd%2F1XJArwW8bKV9RGo9Q6gQck%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 6. 복제나 다운로드가 가능하며 git프로그램이 없이도 다운로드하여 파일들을 그대로 볼 수 있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/co6cVd/btqBGYStV1X/hyrluozDFR5cpTSL9fOV11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/co6cVd/btqBGYStV1X/hyrluozDFR5cpTSL9fOV11/img.png&quot; data-alt=&quot;Fig 6-1. github의 url&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/co6cVd/btqBGYStV1X/hyrluozDFR5cpTSL9fOV11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fco6cVd%2FbtqBGYStV1X%2FhyrluozDFR5cpTSL9fOV11%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 6-1. github의 url&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;git 클라이언트를 이용하여 파일을 다운로드 받아 로컬에서 작업하거나 동기화하려고 할 때 사용할 수 있는 URL의 종류가 &lt;b&gt;HTTPS&lt;/b&gt;, &lt;b&gt;SSH&lt;/b&gt;의 2 가지가 있으며 약간 차이가 있는 것을 알 수 있다. 또한 권한에 따라 프로젝트를 수정할 수도 있고 그냥 다운받아 사용만 할 수도 있다.&lt;/p&gt;
&lt;p&gt;branch: 버전관리시스템에서 필요한 경우 저장소를 분기하는 것.&lt;/p&gt;
&lt;p&gt;가지 Branch가 여러 개인 경우 Branch master를 이용하여 다른 Branch와 Tag를 탐색할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;저장소파일 중 README.md 는 저장소를 설명하는 내용을 담은 파일이다. github에서 저장소를 만들 때 처음부터 README.md를 만들 수 있게 하는 옵션이 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAc3xC/btqBDXupt32/wC5018hLz56NelokCkRcV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAc3xC/btqBDXupt32/wC5018hLz56NelokCkRcV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAc3xC/btqBDXupt32/wC5018hLz56NelokCkRcV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAc3xC%2FbtqBDXupt32%2FwC5018hLz56NelokCkRcV1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;최초 시작부터 어떤 변경들이 일어났는지 볼 수 있다. 매 변경 점들에서 어떤 내용이 변경[내용의 추가 삭제 수정, 파일의 추가 삭제 수정 등] 되었는 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;commit이 2020.2.1 현재 19,291회가 되는 twbs/bootstrap 저장소를 한 번 보자.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8S3cm/btqBFwCD5C1/UzwxmbquNr8WncQSPiRGmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8S3cm/btqBFwCD5C1/UzwxmbquNr8WncQSPiRGmK/img.png&quot; data-alt=&quot;Fork 는 그대로 자신의 저장소로 복제한다. 단 몇 초밖에 안 걸린다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8S3cm/btqBFwCD5C1/UzwxmbquNr8WncQSPiRGmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8S3cm%2FbtqBFwCD5C1%2FUzwxmbquNr8WncQSPiRGmK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fork 는 그대로 자신의 저장소로 복제한다. 단 몇 초밖에 안 걸린다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;다른 저장소를 Fork 를 사용하여 그대로 자기 것으로 만들 수 있다. 원래 프로젝트의 내용은 권한을 부여받아야 수정이 가능하지만 자신에게 복제해온 후 어떻게 변경시켜 사용하든 상관없다.&lt;/p&gt;
&lt;p&gt;Pull Requests 는 복제 후 수정을 하고 그것을 원 프로젝트에 반영할지 고려해달라는 요청으로 볼 수 있다. 원 프로젝트의 소유자는 해당 변경내용을 검토확인하고 반영 또는 무시할 수가 있다. 좀 중요하기 때문에 이 부분은 다시 살펴보는 시간을 가질 것이다.&lt;/p&gt;
&lt;p&gt;Issuses : 프로젝트를 하다보면 여러 가지 이슈가 발생한다. 버그가 생긴다든지, 개선사항이 있다든지, 요건이 바뀐다든지 등, 이때 사람들과 커뮤니케이션을 할 채널 [게시판 등] 이 필요한데 그런 역할을 하는 것이 issues 이다. New Issue를 클릭하여 새로운 issue를 발행할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMgBHa/btqBGf1u0gw/crFTkw3UmzuOextyibhddk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMgBHa/btqBGf1u0gw/crFTkw3UmzuOextyibhddk/img.png&quot; data-alt=&quot;Insights/Fork. 이 저장소를 복제 Fork 한 사람들의 리스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMgBHa/btqBGf1u0gw/crFTkw3UmzuOextyibhddk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMgBHa%2FbtqBGf1u0gw%2FcrFTkw3UmzuOextyibhddk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Insights/Fork. 이 저장소를 복제 Fork 한 사람들의 리스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;security-advisories-twbs-bootstrap-google-chrome-2020-02-01-15-18-51-sofzopi2mp4_9xnh.gif&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cElViw/btqBDcrUEkI/4a9aP8QyOaTHNRxNiO29D1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cElViw/btqBDcrUEkI/4a9aP8QyOaTHNRxNiO29D1/img.gif&quot; data-alt=&quot;Insights/Network&amp;amp;amp;nbsp; 프로젝트에 참여하는 사람들의 리스트와 그들의 활동 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cElViw/btqBDcrUEkI/4a9aP8QyOaTHNRxNiO29D1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cElViw/btqBDcrUEkI/4a9aP8QyOaTHNRxNiO29D1/img.gif&quot; data-filename=&quot;security-advisories-twbs-bootstrap-google-chrome-2020-02-01-15-18-51-sofzopi2mp4_9xnh.gif&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;1080&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Insights/Network&amp;nbsp; 프로젝트에 참여하는 사람들의 리스트와 그들의 활동 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oRwdC/btqBDbNkFJ4/LMzkhZsSrkIP549fsZ4hK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oRwdC/btqBDbNkFJ4/LMzkhZsSrkIP549fsZ4hK0/img.png&quot; data-alt=&quot;Insights/Contributors&amp;amp;amp;nbsp; 참여자들의 활동 상황&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oRwdC/btqBDbNkFJ4/LMzkhZsSrkIP549fsZ4hK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoRwdC%2FbtqBDbNkFJ4%2FLMzkhZsSrkIP549fsZ4hK0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Insights/Contributors&amp;nbsp; 참여자들의 활동 상황&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EFHWR/btqBFNKWFHx/yyFofXiEVKkkbihJTNHSX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EFHWR/btqBFNKWFHx/yyFofXiEVKkkbihJTNHSX0/img.png&quot; data-alt=&quot;Insights/Commits&amp;amp;amp;nbsp; &amp;amp;amp;nbsp;얼마나 자주 commit 이 발생하는지를 보여줌&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EFHWR/btqBFNKWFHx/yyFofXiEVKkkbihJTNHSX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEFHWR%2FbtqBFNKWFHx%2FyyFofXiEVKkkbihJTNHSX0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Insights/Commits&amp;nbsp; &amp;nbsp;얼마나 자주 commit 이 발생하는지를 보여줌&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RNQCD/btqBFNEaTiH/IPWuh8NtWI2hedWzIIoh5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RNQCD/btqBFNEaTiH/IPWuh8NtWI2hedWzIIoh5k/img.png&quot; data-alt=&quot;Insights/Code frequency&amp;amp;amp;nbsp; &amp;amp;amp;nbsp;코드의 수정&amp;amp;amp;bull;삭제 빈도에 관한 내용&amp;amp;amp;nbsp;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RNQCD/btqBFNEaTiH/IPWuh8NtWI2hedWzIIoh5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRNQCD%2FbtqBFNEaTiH%2FIPWuh8NtWI2hedWzIIoh5k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Insights/Code frequency&amp;nbsp; &amp;nbsp;코드의 수정&amp;bull;삭제 빈도에 관한 내용&amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMl534/btqBGfArX7o/S0gyFnaQrUCLvylzINdtg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMl534/btqBGfArX7o/S0gyFnaQrUCLvylzINdtg1/img.png&quot; data-alt=&quot;Watch&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMl534/btqBGfArX7o/S0gyFnaQrUCLvylzINdtg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMl534%2FbtqBGfArX7o%2FS0gyFnaQrUCLvylzINdtg1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Watch&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;475&quot; height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSOAUn/btqBDbTWQNl/gJch2pc4l9nZdZROyhHjUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSOAUn/btqBDbTWQNl/gJch2pc4l9nZdZROyhHjUK/img.png&quot; data-alt=&quot;Watching 을 체크하면 Watch -&amp;amp;amp;gt; Unwatch로 됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSOAUn/btqBDbTWQNl/gJch2pc4l9nZdZROyhHjUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSOAUn%2FbtqBDbTWQNl%2FgJch2pc4l9nZdZROyhHjUK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;475&quot; height=&quot;285&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Watching 을 체크하면 Watch -&amp;gt; Unwatch로 됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;관심있는 저장소에 Watching을 체크해놓으면 Watching 체크된 저장소들을 쉽게 찾을 수 있고 여기서 일어나는 변화들에 대해 통보받을 수 있다.&amp;nbsp; 팔로우/언팔로우 기능과 비슷하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3tRrx/btqBGf8hxre/qCy1fkkEbntwXbV7Mxu9s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3tRrx/btqBGf8hxre/qCy1fkkEbntwXbV7Mxu9s0/img.png&quot; data-alt=&quot;Fork 는 해당 프로젝트를 자신의 저장소로 복제한다. 그 과정에 어떤 동의나 허가도 필요없다.&amp;amp;amp;nbsp;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3tRrx/btqBGf8hxre/qCy1fkkEbntwXbV7Mxu9s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3tRrx%2FbtqBGf8hxre%2FqCy1fkkEbntwXbV7Mxu9s0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fork 는 해당 프로젝트를 자신의 저장소로 복제한다. 그 과정에 어떤 동의나 허가도 필요없다.&amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;github은 오픈소스를 전제로 하기 때문에 어떤 프로젝트를 복제할 때 그 어떤 동의나 허가도 필요없다. 물론 본인이 github을 이용하여 진행하는 프로젝트도 완전 오픈인 것은 당연하다.&lt;/p&gt;
&lt;p&gt;github은 해당 프로젝트를 얼마나 많은 사람들이 watching [관심을 갖고 있나] 하고 있는지, 얼마나 많은 사람들이 Fork [복제] 를 해갔는지에 따라 프로젝트의 성공과 평판이 결정된다고 볼 수 있다.&amp;nbsp; 일반적인 세계에서는 누군가가 자신의 컨텐츠를 베껴가면 매우 큰 저항과 반감이 따르지만 여기 오픈프로젝트에서는 내 것을 더 많이 베껴갈수록 성공한 프로젝트가 되는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Wiki&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;699&quot; height=&quot;805&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x0dPE/btqBQoqxgO3/qrwlkwkrfxBOd1k3XGI77k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x0dPE/btqBQoqxgO3/qrwlkwkrfxBOd1k3XGI77k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x0dPE/btqBQoqxgO3/qrwlkwkrfxBOd1k3XGI77k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx0dPE%2FbtqBQoqxgO3%2FqrwlkwkrfxBOd1k3XGI77k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;699&quot; height=&quot;805&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Wiki는 일반적인 프로젝트 관리 도구에는 항상 따라다니는 기능인데,&amp;nbsp; 프로젝트를 하기 위해 필요한 지식이나 프로젝트를 하는 과정에서 발생하는 지식들, 예를 들어 매뉴얼 같은 것들을 저장하는 체계로 제공되는 기능이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;TOP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;signIn&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.&amp;nbsp;가입과&amp;nbsp;저장소&amp;nbsp;생성&lt;/h2&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/voeG7EKVKaI&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKgxjE/btqBGftIjCG/SyBZigokyRm5eTIK5myCVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKgxjE/btqBGftIjCG/SyBZigokyRm5eTIK5myCVK/img.png&quot; data-alt=&quot;github.com/pricing&amp;amp;amp;nbsp; or&amp;amp;amp;nbsp; github.com/plans&amp;amp;amp;nbsp; &amp;amp;amp;nbsp;github의 가격정책&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKgxjE/btqBGftIjCG/SyBZigokyRm5eTIK5myCVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKgxjE%2FbtqBGftIjCG%2FSyBZigokyRm5eTIK5myCVK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;github.com/pricing&amp;nbsp; or&amp;nbsp; github.com/plans&amp;nbsp; &amp;nbsp;github의 가격정책&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;TOP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;local&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5.&amp;nbsp;로컬&amp;nbsp;저장소&lt;/h2&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/5mW-SRc09xQ&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;github은 원격저장소, 작업을 진행하는 자신의 컴퓨터는 로컬 저장소&lt;/p&gt;
&lt;p&gt;자신의 컴퓨터에서 코딩, 문서작업을 하고 버전관리를 하다가 원격저장소로 업로드를 하게 되면 원격저장소는 누구나 접속할 수 있는 github 등의 웹상에 존재하는 것이기 때문에 다른 동료들과 협업하거나 해당 프로젝트를 불특정 다수에게 유통시킬 수 있게 되는 것이다. 이것이 원격 저장소와 로컬 저장소의 차이이고 관계이다.&lt;/p&gt;
&lt;p&gt;자신의 컴퓨터에 git 클라이언트를 설치한다. (&lt;a href=&quot;https://git-scm.com/&quot;&gt;https://git-scm.com&lt;/a&gt;)&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;설치는 &lt;a href=&quot;https://coding-factory.tistory.com/245&quot;&gt;https://coding-factory.tistory.com/245&lt;/a&gt; 을 참조할 것.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1vBxj/btqBGZYhntC/gFQn540qC3ujd1Ri0Ic3pK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1vBxj/btqBGZYhntC/gFQn540qC3ujd1Ri0Ic3pK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1vBxj/btqBGZYhntC/gFQn540qC3ujd1Ri0Ic3pK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1vBxj%2FbtqBGZYhntC%2FgFQn540qC3ujd1Ri0Ic3pK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://file:///C:/Program%20Files/Git/ReleaseNotes.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;file:///C:/Program%20Files/Git/ReleaseNotes.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciPmNc/btqBGeuPQ8A/WbyVKwB6FEbCiBDE4K7WV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciPmNc/btqBGeuPQ8A/WbyVKwB6FEbCiBDE4K7WV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciPmNc/btqBGeuPQ8A/WbyVKwB6FEbCiBDE4K7WV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciPmNc%2FbtqBGeuPQ8A%2FWbyVKwB6FEbCiBDE4K7WV1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LpERc/btqBFv4UqPM/9k5aVzXklQColVuHaaphd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LpERc/btqBFv4UqPM/9k5aVzXklQColVuHaaphd1/img.png&quot; data-alt=&quot;원하는 폴더/우클릭/Git Bash Here&amp;amp;amp;nbsp; 로 git Client 열기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LpERc/btqBFv4UqPM/9k5aVzXklQColVuHaaphd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLpERc%2FbtqBFv4UqPM%2F9k5aVzXklQColVuHaaphd1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;원하는 폴더/우클릭/Git Bash Here&amp;nbsp; 로 git Client 열기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;766&quot; height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkGsPa/btqBD0YTjpW/yTLpbNHbIebXdPe5L1ubwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkGsPa/btqBD0YTjpW/yTLpbNHbIebXdPe5L1ubwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkGsPa/btqBD0YTjpW/yTLpbNHbIebXdPe5L1ubwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkGsPa%2FbtqBD0YTjpW%2FyTLpbNHbIebXdPe5L1ubwk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;766&quot; height=&quot;399&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이렇게 설치가 끝나면 &lt;span style=&quot;color: #333333;&quot;&gt;버전관리를 할 수 있는 준비가 끝난다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;그리고 자신의 github 저장소의 url을 복사한 후 git bash를 실행하고 &lt;b&gt;git clone&lt;/b&gt; &lt;i&gt;gitURL&lt;/i&gt; 명령을 실행한다.&lt;/p&gt;
&lt;p&gt;이렇게 하여 원격저장소의 내용을 로컬저장소에 동기화&amp;bull;복제한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boTCFT/btqBGff77mA/tNVzIzuzYC3ekmsGmQiMK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boTCFT/btqBGff77mA/tNVzIzuzYC3ekmsGmQiMK0/img.png&quot; data-alt=&quot;smallMP4 프로젝트 시작화면. Win+Alt+R 에 의한 Game Bar 화면영상저장 기능으로 저장한 화면은 용량이 매우 큰 mp4 파일인데 상당비율로 사이즈가 작은 같은 mp4 파일을 만들어 낼 수 있도록 하는 것이 목적&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boTCFT/btqBGff77mA/tNVzIzuzYC3ekmsGmQiMK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboTCFT%2FbtqBGff77mA%2FtNVzIzuzYC3ekmsGmQiMK0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;smallMP4 프로젝트 시작화면. Win+Alt+R 에 의한 Game Bar 화면영상저장 기능으로 저장한 화면은 용량이 매우 큰 mp4 파일인데 상당비율로 사이즈가 작은 같은 mp4 파일을 만들어 낼 수 있도록 하는 것이 목적&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그러면 내 컴퓨터 안에 동기화된 디렉토리가 생성된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KzIUU/btqBGf1BQpq/73FXMQvIepBqu4HVoLLQ7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KzIUU/btqBGf1BQpq/73FXMQvIepBqu4HVoLLQ7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KzIUU/btqBGf1BQpq/73FXMQvIepBqu4HVoLLQ7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKzIUU%2FbtqBGf1BQpq%2F73FXMQvIepBqu4HVoLLQ7K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그리고 여기에 index.html을 만들고 &lt;b&gt;git commit -am&lt;/b&gt; &quot;&lt;i&gt;버전설명&lt;/i&gt;&quot; 을 실행하면 수정된 내용이 새로운 버전으로 저장되게 된다. 최초 commit을 하게 되면 반드시 해야 할 작업이 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;git config --global user.name &quot;Your name&quot;&lt;br /&gt;git config --global user.email &quot;you@example.com&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crkiKy/btqBGZRwgA8/TkjsGphTQim72hvDma0uoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crkiKy/btqBGZRwgA8/TkjsGphTQim72hvDma0uoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crkiKy/btqBGZRwgA8/TkjsGphTQim72hvDma0uoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrkiKy%2FbtqBGZRwgA8%2FTkjsGphTQim72hvDma0uoK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pmqkg/btqBGqBPzfb/hfxpq8x65tsdOGaC34jkZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pmqkg/btqBGqBPzfb/hfxpq8x65tsdOGaC34jkZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pmqkg/btqBGqBPzfb/hfxpq8x65tsdOGaC34jkZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpmqkg%2FbtqBGqBPzfb%2Fhfxpq8x65tsdOGaC34jkZ0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이제 변경된 내용을 원격저장소로 보내보자. &lt;b&gt;git push origin master&lt;/b&gt; 를 실행시킨다. origin은 원격저장소를 의미한다.&lt;/p&gt;
&lt;p&gt;그런면 github.com 의 Username 과 password 를 입력한다.&lt;/p&gt;
&lt;p&gt;여기서 &lt;b&gt;git commit -am&lt;/b&gt; &quot;&lt;i&gt;버전설명&lt;/i&gt;&quot;&amp;nbsp; 이 명령은 -am 옵션을 쓰고 있지만 index.html 파일을 처음으로 만들었기 때문에 index.html 생성내용이 새로운 버전에 반영되지 않는다. 한 번은 반드시 git add를 하여 Staging Area 에 추가해줘야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PkRKR/btqBDbfxkBx/JFaOqkSn936Q5D68jb1T8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PkRKR/btqBDbfxkBx/JFaOqkSn936Q5D68jb1T8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PkRKR/btqBDbfxkBx/JFaOqkSn936Q5D68jb1T8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPkRKR%2FbtqBDbfxkBx%2FJFaOqkSn936Q5D68jb1T8k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pcu0I/btqBGqaKe4g/W0AA3QDenOpnYwXLuNQ080/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pcu0I/btqBGqaKe4g/W0AA3QDenOpnYwXLuNQ080/img.png&quot; data-alt=&quot;버전 변경이 commit 된 결과 github 저장소에 작업한 파일 올라가 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pcu0I/btqBGqaKe4g/W0AA3QDenOpnYwXLuNQ080/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPcu0I%2FbtqBGqaKe4g%2FW0AA3QDenOpnYwXLuNQ080%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;버전 변경이 commit 된 결과 github 저장소에 작업한 파일 올라가 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;TOP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;issue&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6.&amp;nbsp;이슈&lt;/h2&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;github issues 소개&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/uc9OKCfb57c&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;Issue는 보통 issue tracker라고 부르는데 게시판이라고 볼 수 있다. 다른 점이라면 업무를 위한 또는 협업을 위한 게시판이라는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;게시판으로 업무 협업을 진행해보았다면 여러 가지 난장판 같은 상황들을 겪게 될 수 있는데 issue를 이용하면 그런 상황들을 아주 세련되게 효율적으로 처리할 수 있게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;게시판에서 글을 새로 추가 하는 것과 같은 기능이 New issue 버튼이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDz4Os/btqBGqBP3pS/9zEe33KzV0MZRdlYqQsYa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDz4Os/btqBGqBP3pS/9zEe33KzV0MZRdlYqQsYa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDz4Os/btqBGqBP3pS/9zEe33KzV0MZRdlYqQsYa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDz4Os%2FbtqBGqBP3pS%2F9zEe33KzV0MZRdlYqQsYa0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이 버튼을 클릭하여 새로운 issue를 발행할 수 있다. 예를 들어 이런 식이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;646&quot; height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JQPU2/btqBE1XjO3A/6dZ8pF7BOjVetRWlANM6D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JQPU2/btqBE1XjO3A/6dZ8pF7BOjVetRWlANM6D1/img.png&quot; data-alt=&quot;Submit 하면 작성한 issue가 발행된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JQPU2/btqBE1XjO3A/6dZ8pF7BOjVetRWlANM6D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJQPU2%2FbtqBE1XjO3A%2F6dZ8pF7BOjVetRWlANM6D1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;646&quot; height=&quot;458&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Submit 하면 작성한 issue가 발행된다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;622&quot; height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jqcnk/btqBE0jNS4w/op55k5vyhwC4takKamnxiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jqcnk/btqBE0jNS4w/op55k5vyhwC4takKamnxiK/img.png&quot; data-alt=&quot;관련자들이 issue를 볼 수 있게 되었다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jqcnk/btqBE0jNS4w/op55k5vyhwC4takKamnxiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJqcnk%2FbtqBE0jNS4w%2Fop55k5vyhwC4takKamnxiK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;622&quot; height=&quot;379&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;관련자들이 issue를 볼 수 있게 되었다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1HoYn/btqBD2bk409/8Lo7aiTHksMklderv10jO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1HoYn/btqBD2bk409/8Lo7aiTHksMklderv10jO1/img.png&quot; data-alt=&quot;issue를 해결한 다음에 클릭해 들어가 Close issue를 하면 issue가 해결된 것으로 된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1HoYn/btqBD2bk409/8Lo7aiTHksMklderv10jO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1HoYn%2FbtqBD2bk409%2F8Lo7aiTHksMklderv10jO1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;issue를 해결한 다음에 클릭해 들어가 Close issue를 하면 issue가 해결된 것으로 된다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;issue를 해결한 후에 Close issue를 하고 나면 Closing 된 issue는 사라지게 된다. 물론 설정에 따라 그냥 보이게 할 수도 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;github issues 담당자 지정과 이슈의 상태 지정&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/aLkdDDuwhJw&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;이미 닫긴 issue를 다시 열어야 할 상황이 발생한다면? 그런 경우에는 닫긴 issue를 선택하여 Reopen issue를 실행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKeFiu/btqBE135ALY/O8fKfZGBoYKKgRYSkYRvK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKeFiu/btqBE135ALY/O8fKfZGBoYKKgRYSkYRvK0/img.png&quot; data-alt=&quot;issue가 Open을 보여줄 때와 Closed를 보여 줄 때 Filters의 내용이 다르다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKeFiu/btqBE135ALY/O8fKfZGBoYKKgRYSkYRvK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKeFiu%2FbtqBE135ALY%2FO8fKfZGBoYKKgRYSkYRvK0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;issue가 Open을 보여줄 때와 Closed를 보여 줄 때 Filters의 내용이 다르다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blQmhi/btqBDbT2zj6/NMK7FLLoAAkrRP2SVfKaC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blQmhi/btqBDbT2zj6/NMK7FLLoAAkrRP2SVfKaC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blQmhi/btqBDbT2zj6/NMK7FLLoAAkrRP2SVfKaC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblQmhi%2FbtqBDbT2zj6%2FNMK7FLLoAAkrRP2SVfKaC1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Assignee에 대한 내용도 꽤 중요하다. 협업 프로젝트를 할 때 발생한 이슈에 대한 작업을 누군가에게 요청해야 할 수 있는데 게시판에서는 그런 기능이 없기 때문에 매우 까다롭다. Assignee를 클릭하면 현재 프로젝트에 참여하고 있는 협업자의 목록이 뜬다. 그리고 작업을 할당(assign)할 대상을 찾아 열린 이슈를 부여하면 된다. 그러면 작업을 할당받은 협업자는 발생한 issue가 자신에게 할당이 되었다는 통보를 받게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgMAuk/btqBGeIoO3h/ejZ33U1QYbpkQv6Mlslb4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgMAuk/btqBGeIoO3h/ejZ33U1QYbpkQv6Mlslb4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgMAuk/btqBGeIoO3h/ejZ33U1QYbpkQv6Mlslb4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgMAuk%2FbtqBGeIoO3h%2FejZ33U1QYbpkQv6Mlslb4K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;어떤 업무가 있을 때 그 업무는 몇 가지의 타이틀을 가지고 있다. bug 라든지, enhancement 기능개선이라든지, 또는 issue가 뭔지 재현이 되지 않는 invalid 라든지 [유효하지 않은 issue], 이슈를 처리하고 싶지 않다든지 [wontfix], 이슈가 중복되고 있다든지 [duplicate], 등등 적절한 라벨을 적용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;637&quot; height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Szfg/btqBGYLRX0X/5QonLN5ffKJuINAfcomrH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Szfg/btqBGYLRX0X/5QonLN5ffKJuINAfcomrH0/img.png&quot; data-alt=&quot;프로젝트가 복잡해지면 Label 기능을 아주 유용하게 쓸 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Szfg/btqBGYLRX0X/5QonLN5ffKJuINAfcomrH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Szfg%2FbtqBGYLRX0X%2F5QonLN5ffKJuINAfcomrH0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;637&quot; height=&quot;354&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로젝트가 복잡해지면 Label 기능을 아주 유용하게 쓸 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;github issues 필터와 상태&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/oEKLbQkYyuk&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;필터기능과 상태를 결합하면 매우 큰 효용을 발휘한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;687&quot; height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NxqWK/btqBD23tffb/jAz1i7lvhikUm3MX2KCJFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NxqWK/btqBD23tffb/jAz1i7lvhikUm3MX2KCJFk/img.png&quot; data-alt=&quot;Filters의 내용에 따라 여러 가지 상태를 확인할 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NxqWK/btqBD23tffb/jAz1i7lvhikUm3MX2KCJFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNxqWK%2FbtqBD23tffb%2FjAz1i7lvhikUm3MX2KCJFk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;687&quot; height=&quot;291&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Filters의 내용에 따라 여러 가지 상태를 확인할 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;github issues 참조 reference 기능&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/V323gsHCsgs&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;이슈들을 아주 손쉽게 관련된 다른 것들과 링크를 걸 수 있다. 이슈를 발행하면서 내용을 쓸 때, &lt;b&gt;@&lt;/b&gt;하면 프로젝트 참여자들이 뜬다. @egoing은 user name이 egoing 인 프로젝트 참여자 이다. 그러면 @egoing에는 링크가 생성되면서 클릭하면 해당 사용자에게로 넘어간다. 이렇게 어떤 참여자가 언급되어 있는 이슈는 다음과 같은 방법으로 Filters가 적용된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;365&quot; height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwhc80/btqBFM6rb8g/56JFlNf6AlD3oSWa8YtnlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwhc80/btqBFM6rb8g/56JFlNf6AlD3oSWa8YtnlK/img.png&quot; data-alt=&quot;mentions:egoing2&amp;amp;amp;nbsp; 자신이 언급되어 있는 이슈&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwhc80/btqBFM6rb8g/56JFlNf6AlD3oSWa8YtnlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwhc80%2FbtqBFM6rb8g%2F56JFlNf6AlD3oSWa8YtnlK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;365&quot; height=&quot;360&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;mentions:egoing2&amp;nbsp; 자신이 언급되어 있는 이슈&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;또한 내용을 쓸 때 &lt;b&gt;#&lt;/b&gt;을 누르면 다른 이슈들의 목록이 뜬다. 선택하면 해당 이슈의 번호가 입력되어 #5 와 같이 되고 역시 해당 이슈와 연결해주는 링크도 생성된다.&lt;/p&gt;
&lt;p&gt;또한 이슈를 발행할 때 commit HASHcode를 복사해서 입력하면 역시 해당 commit에로의 링크가 생성되면서 그 코드로 쉽게 이동할 수 있게 해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;genehs_smallMP4-Google-Chrome-2020-02-01-23-14-05.gif&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IASyf/btqBGpXfEyB/Stkfc2O2tG1P8NGF9WNjfk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IASyf/btqBGpXfEyB/Stkfc2O2tG1P8NGF9WNjfk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IASyf/btqBGpXfEyB/Stkfc2O2tG1P8NGF9WNjfk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/IASyf/btqBGpXfEyB/Stkfc2O2tG1P8NGF9WNjfk/img.gif&quot; data-filename=&quot;genehs_smallMP4-Google-Chrome-2020-02-01-23-14-05.gif&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;844&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;github issues 템플릿 기능&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/_Eq2u_pac7U&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;이슈를 발행할 때 그 형식을 지정할 수 있다. New issue 버튼을 누르면 내용을 적는 곳에 빈 편집창이 아니라 기본적으로 있어야 할 내용들이 미리 들어가 있도록 하는 것이다. Markdown 문법을 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;참여자들이 이슈를 발행할 때 어떤 형식을 사용하도록 유도하고 싶다면 템플릿 기능을 사용하면 된다.&lt;/p&gt;
&lt;p&gt;검색어: github issues template&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;710&quot; height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xwRZv/btqBE1JOxFT/L7BxgvhhbyCe5WD6hSI0w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xwRZv/btqBE1JOxFT/L7BxgvhhbyCe5WD6hSI0w0/img.png&quot; data-alt=&quot;구글링&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xwRZv/btqBE1JOxFT/L7BxgvhhbyCe5WD6hSI0w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxwRZv%2FbtqBE1JOxFT%2FL7BxgvhhbyCe5WD6hSI0w0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;710&quot; height=&quot;241&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;구글링&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;640&quot; height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9Dgxs/btqBGgsHwoW/pDfsLhy0ajXQr682hUH5c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9Dgxs/btqBGgsHwoW/pDfsLhy0ajXQr682hUH5c0/img.png&quot; data-alt=&quot;이 방법으로 issue template을 만들어 사용할 수 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9Dgxs/btqBGgsHwoW/pDfsLhy0ajXQr682hUH5c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9Dgxs%2FbtqBGgsHwoW%2FpDfsLhy0ajXQr682hUH5c0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;640&quot; height=&quot;892&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;이 방법으로 issue template을 만들어 사용할 수 있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이렇게 issue template 을 만들거나 설정하고 나면 새로운 디렉토리가 생성된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;512&quot; height=&quot;435&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDytgM/btqBFMyCmnq/a6QKvQzdsq6hf5sLEB9Kk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDytgM/btqBFMyCmnq/a6QKvQzdsq6hf5sLEB9Kk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDytgM/btqBFMyCmnq/a6QKvQzdsq6hf5sLEB9Kk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDytgM%2FbtqBFMyCmnq%2Fa6QKvQzdsq6hf5sLEB9Kk1%2Fimg.png&quot; width=&quot;512&quot; height=&quot;435&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;563&quot; height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpvuPu/btqBFwpgzkJ/Tkowalml5Ta96Ans3e4vjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpvuPu/btqBFwpgzkJ/Tkowalml5Ta96Ans3e4vjk/img.png&quot; data-alt=&quot;템플릿 파일의 확장자는 .md 즉 Markdown 파일이다.&amp;amp;amp;nbsp; 한글명은 나타나지 않으니 가급적 영어로 템플릿의 이름을 달도록 하자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpvuPu/btqBFwpgzkJ/Tkowalml5Ta96Ans3e4vjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpvuPu%2FbtqBFwpgzkJ%2FTkowalml5Ta96Ans3e4vjk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;563&quot; height=&quot;475&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;템플릿 파일의 확장자는 .md 즉 Markdown 파일이다.&amp;nbsp; 한글명은 나타나지 않으니 가급적 영어로 템플릿의 이름을 달도록 하자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;템플릿의 이름을 한글로 하였더니 ----.md 라고 한글을 인식하지 못한다.&lt;br /&gt;검색어: repository change file name&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;499&quot; height=&quot;431&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csNMJQ/btqBD2CqCwQ/am9gfCjbOUHmQ3SQ8Sfxm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csNMJQ/btqBD2CqCwQ/am9gfCjbOUHmQ3SQ8Sfxm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csNMJQ/btqBD2CqCwQ/am9gfCjbOUHmQ3SQ8Sfxm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsNMJQ%2FbtqBD2CqCwQ%2Fam9gfCjbOUHmQ3SQ8Sfxm1%2Fimg.png&quot; width=&quot;499&quot; height=&quot;431&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;768&quot; height=&quot;813&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m1inn/btqBFM6sBEx/XrOjp8jgq1tcw1XvhAH4Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m1inn/btqBFM6sBEx/XrOjp8jgq1tcw1XvhAH4Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m1inn/btqBFM6sBEx/XrOjp8jgq1tcw1XvhAH4Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm1inn%2FbtqBFM6sBEx%2FXrOjp8jgq1tcw1XvhAH4Xk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;768&quot; height=&quot;813&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이름을 needs.md로 고쳐주기 위해서는 오른쪽 상단에 뜨는 연필 아이콘을 클릭해 편집상태로 들어가고 이때 이름을 변경한 후 commit 하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/maLrR/btqBFNdeATx/zBxKu5nq0tQHksqa8Rj1F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/maLrR/btqBFNdeATx/zBxKu5nq0tQHksqa8Rj1F1/img.png&quot; data-alt=&quot;파일명 변경.&amp;amp;amp;nbsp; 파일을 선택한 후 우측 상단의 연필아이콘을 클릭해 편집상태로 들어간다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/maLrR/btqBFNdeATx/zBxKu5nq0tQHksqa8Rj1F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmaLrR%2FbtqBFNdeATx%2FzBxKu5nq0tQHksqa8Rj1F1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일명 변경.&amp;nbsp; 파일을 선택한 후 우측 상단의 연필아이콘을 클릭해 편집상태로 들어간다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;703&quot; height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v6Lkz/btqBE137QY1/vVrqVEKAy2ttlIie5M7wL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v6Lkz/btqBE137QY1/vVrqVEKAy2ttlIie5M7wL0/img.png&quot; data-alt=&quot;이름을 편집하고 commit 하면 파일명 변경 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v6Lkz/btqBE137QY1/vVrqVEKAy2ttlIie5M7wL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv6Lkz%2FbtqBE137QY1%2FvVrqVEKAy2ttlIie5M7wL0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;703&quot; height=&quot;349&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;이름을 편집하고 commit 하면 파일명 변경 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;github repository에서 생성한 파일을 로컬저장소에 가져오기 위해 &lt;b&gt;git pull&lt;/b&gt; 명령을 쓴다.&lt;br /&gt;검색어: github&amp;nbsp;원격저장소&amp;nbsp;변경내용&amp;nbsp;로컬에&amp;nbsp;반영&lt;br /&gt;&lt;a href=&quot;https://fsd-jinss.tistory.com/41&quot;&gt;https://fsd-jinss.tistory.com/41&lt;/a&gt; 참고&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;TOP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;githubPage&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7.&amp;nbsp;GitHub&amp;nbsp;Page&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://opentutorials.org/module/2398/16117&quot;&gt;https://opentutorials.org/module/2398/16117&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;github 서비스를 이용하면 html, css, javascript등을 이용해서 웹사이트를 운영할 수 있습니다. 또 도메인을 붙일수도 있습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;사용기술&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://opentutorials.org/module/1892&quot;&gt;html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opentutorials.org/module/2367&quot;&gt;css&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opentutorials.org/module/904&quot;&gt;javascript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;git (&lt;a href=&quot;https://opentutorials.org/module/2676&quot;&gt;명령어를 이용해서 다루기&lt;/a&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://opentutorials.org/module/1215&quot;&gt;GUI 방식으로 다루기&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opentutorials.org/module/155&quot;&gt;github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opentutorials.org/module/1514/9483&quot;&gt;domain&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;주요개념&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;여기서는 git을 이용한 간단한 버전관리부터, github를 이용한 소스코드 공유, github를 이용해서 웹사이트를 운영하는 방법, freenom을 이용해서 도메인을 구입하는 방법, 도메인을 github에 붙여서 나만의 도메인으로 웹사이트를 운영하는 방법을 알아봅니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/DPHQ9vGz7VQ&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;GitHub 서비스(github.com) 를 이용하여 HTML, CSS, JavaScript 로 만들어진 웹사이트를 인터넷에 올려서 서비스 하는 방법을 살펴보자.&lt;br /&gt;github 에 저장한 소스코드는 웹사이트처럼 운영할 수도 있다. 인터넷에, 웹에 publishing 할 수 있다는 얘기다.&lt;/p&gt;
&lt;p&gt;자신의 개성을 나타내기 위해 탐내는 것 중 하나가 Domain인데, github에서 만든 사이트를 제공할 때 사이트주소에는 github이 붙어있다. domain은 1년에 몇 만원씩 지불하고 구매하여야 하는데 freenom 이라는 사이트를 이용하면 무료로 구매할 수 있는 도메인도 있기는 하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;737&quot; height=&quot;1028&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAVgRD/btqBFL7CeV3/t8x5GAT4JU1e3SunKOXXrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAVgRD/btqBFL7CeV3/t8x5GAT4JU1e3SunKOXXrK/img.png&quot; data-alt=&quot;주로 사용하는 .com, .org 등은 유료이지만 .tk, .ga, .cf 등은 1년간 무료사용이 가능하다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAVgRD/btqBFL7CeV3/t8x5GAT4JU1e3SunKOXXrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAVgRD%2FbtqBFL7CeV3%2Ft8x5GAT4JU1e3SunKOXXrK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;737&quot; height=&quot;1028&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;주로 사용하는 .com, .org 등은 유료이지만 .tk, .ga, .cf 등은 1년간 무료사용이 가능하다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이렇게 도메인을 구입한 후 그 도메인을 github에 붙이면 사람들은 그 도메인을 통해 github에 만들어진 웹사이트에 접속할 수 있게 된다. 자신이 디자이너이거나 자신의 만든 정보를 웹상에서 사람들에게 보여주고 싶다면 이러한 방법을 통해서도 할 수 있다. 버전관리, 웹사이트 운영, 도메인을 붙이는 작업 등 적지 않은 내용을 다룰 것이다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;git을 이용한 버전관리&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/qZ1yOXa0Csc&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;github Desktop 을 설치하여 git 클라이언트로 사용해보자.&lt;/p&gt;
&lt;p&gt;github Desktop 을 검색하여 Download &amp;amp; Install 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJT02Z/btqBGrgt2kl/hmrbT3HCW7t70hEknYu9Ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJT02Z/btqBGrgt2kl/hmrbT3HCW7t70hEknYu9Ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJT02Z/btqBGrgt2kl/hmrbT3HCW7t70hEknYu9Ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJT02Z%2FbtqBGrgt2kl%2FhmrbT3HCW7t70hEknYu9Ck%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ypw7J/btqBFOcaaKT/6lOu5BbQ2R0TlVmhZxOzg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ypw7J/btqBFOcaaKT/6lOu5BbQ2R0TlVmhZxOzg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ypw7J/btqBFOcaaKT/6lOu5BbQ2R0TlVmhZxOzg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fypw7J%2FbtqBFOcaaKT%2F6lOu5BbQ2R0TlVmhZxOzg1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;github의 저장소 repository 하나하나는 웹사이트라고 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Create: 새로운 프로젝트[혹은 저장소, repository] 시작 [추가]&lt;br /&gt;Add: 이미 진행 중인 프로젝트를 현 시점부터 버전관리를 한다.&lt;/p&gt;
&lt;p&gt;아래의 언어&amp;bull;환경 들에 대해서는 Git Inore를 자동으로 생성해준다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Actionscript &lt;br /&gt;Ada &lt;br /&gt;Agda &lt;br /&gt;Android &lt;br /&gt;AppEngine &lt;br /&gt;AppceleratorTitanium &lt;br /&gt;ArchLinuxPackages &lt;br /&gt;Autotools &lt;br /&gt;C++ &lt;br /&gt;C &lt;br /&gt;CFWheels &lt;br /&gt;CMake &lt;br /&gt;CUDA &lt;br /&gt;CakePHP &lt;br /&gt;ChefCookbook &lt;br /&gt;Clojure &lt;br /&gt;CodeIgniter &lt;br /&gt;CommonLisp &lt;br /&gt;Composer &lt;br /&gt;Concrete5 &lt;br /&gt;Coq &lt;br /&gt;CraftCMS &lt;br /&gt;D &lt;br /&gt;DM &lt;br /&gt;Dart &lt;br /&gt;Delphi &lt;br /&gt;Drupal &lt;br /&gt;EpiServer &lt;br /&gt;Eagle &lt;br /&gt;Elisp &lt;br /&gt;Elixir &lt;br /&gt;Elm &lt;br /&gt;Erlang &lt;br /&gt;ExpressionEngine &lt;br /&gt;ExtJs &lt;br /&gt;Fancy &lt;br /&gt;Finale &lt;br /&gt;ForceDotCom &lt;br /&gt;Fortran &lt;br /&gt;FuelPHP &lt;br /&gt;GWT &lt;br /&gt;Gcov &lt;br /&gt;GitBook &lt;br /&gt;Go &lt;br /&gt;Godot &lt;br /&gt;Gradle &lt;br /&gt;Grails &lt;br /&gt;Haskell &lt;br /&gt;IGORPro &lt;br /&gt;Idris &lt;br /&gt;JBoss &lt;br /&gt;JENKINS_HOME &lt;br /&gt;Java &lt;br /&gt;Jekyll &lt;br /&gt;Joomla &lt;br /&gt;Julia &lt;br /&gt;KiCad &lt;br /&gt;Kohana &lt;br /&gt;Kotlin &lt;br /&gt;LabVIEW &lt;br /&gt;Laravel &lt;br /&gt;Leiningen &lt;br /&gt;LemonStand &lt;br /&gt;Lilypond &lt;br /&gt;Lithium &lt;br /&gt;Lua &lt;br /&gt;Magento &lt;br /&gt;Maven &lt;br /&gt;Mercury &lt;br /&gt;MetaProgrammingSystem &lt;br /&gt;Nanoc &lt;br /&gt;Nim &lt;br /&gt;Node &lt;br /&gt;OCaml &lt;br /&gt;Objective-C &lt;br /&gt;Opa &lt;br /&gt;OpenCart &lt;br /&gt;OracleForms &lt;br /&gt;Packer &lt;br /&gt;Perl &lt;br /&gt;Perl6 &lt;br /&gt;Phalcon &lt;br /&gt;PlayFramework &lt;br /&gt;Plone &lt;br /&gt;Prestashop &lt;br /&gt;Precessing &lt;br /&gt;PureScript &lt;br /&gt;Python &lt;br /&gt;Qooxdoo &lt;br /&gt;Qt &lt;br /&gt;R &lt;br /&gt;ROS &lt;br /&gt;Rails &lt;br /&gt;RhodesRhomobile &lt;br /&gt;Ruby &lt;br /&gt;Rust &lt;br /&gt;RCons &lt;br /&gt;Sass &lt;br /&gt;Scala &lt;br /&gt;Scheme &lt;br /&gt;Scrivener &lt;br /&gt;Sdcc &lt;br /&gt;SeamGen &lt;br /&gt;SketchUP &lt;br /&gt;Smalltalk &lt;br /&gt;Stella &lt;br /&gt;SugarCRM &lt;br /&gt;Swift &lt;br /&gt;Symfony &lt;br /&gt;SymphonyCMS &lt;br /&gt;TeX &lt;br /&gt;Terraform &lt;br /&gt;Textpattern &lt;br /&gt;TurboGears2 &lt;br /&gt;Typo3 &lt;br /&gt;Umbraco &lt;br /&gt;Unity &lt;br /&gt;UnrealEngine &lt;br /&gt;VVVV &lt;br /&gt;VisualStudio &lt;br /&gt;Waf &lt;br /&gt;WordPress &lt;br /&gt;Xojo &lt;br /&gt;Yeoman &lt;br /&gt;Yii &lt;br /&gt;ZendFramework &lt;br /&gt;Zephir&lt;/p&gt;
&lt;p&gt;또한 라이센스는 다음의 라이센스를 적용할 수 있다.&lt;/p&gt;
&lt;p&gt;MIT License&lt;br /&gt;GNU GPLv3&lt;br /&gt;Apache License 2.0&lt;/p&gt;
&lt;p&gt;BSD 2-Clause &quot;Simplified&quot; License&lt;br /&gt;BSD 3-Clause &quot;New&quot; or &quot;Revised&quot; License&lt;br /&gt;Eclipse Public License 2.0&lt;br /&gt;GNU AGPLv3&lt;br /&gt;GNU GPLv2&lt;br /&gt;GNU LGPLv2.1&lt;br /&gt;GNU LGPLv3&lt;br /&gt;Mozilla Public License 2.0&lt;br /&gt;The Unlicense&lt;/p&gt;
&lt;p&gt;어떤 디렉토리를 프로젝트 [repository 저장소] 로 지정하게 되면 이 디렉토리 안에 .git 이라는 hidden 폴더가 생성되고 여기에 버전관리 내용 즉 변경사항들이 저장된다. 따라서 삭제되지 않도록 신중히 관리하도록.&lt;/p&gt;
&lt;p&gt;첫 파일 index.html을 만들고 버전을 생성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPQOQn/btqBD2bptlP/YFL4aqdsXemd9klulK56tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPQOQn/btqBD2bptlP/YFL4aqdsXemd9klulK56tK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPQOQn/btqBD2bptlP/YFL4aqdsXemd9klulK56tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPQOQn%2FbtqBD2bptlP%2FYFL4aqdsXemd9klulK56tK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;655&quot; height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HGzY2/btqBFwCPAvs/zkdKjsZckUonhEXgx3s3fK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HGzY2/btqBFwCPAvs/zkdKjsZckUonhEXgx3s3fK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HGzY2/btqBFwCPAvs/zkdKjsZckUonhEXgx3s3fK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHGzY2%2FbtqBFwCPAvs%2FzkdKjsZckUonhEXgx3s3fK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;655&quot; height=&quot;367&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;b&gt;github.com으로 소스 공유&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/e4SyG46jEo4&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;github의 저장소에 업로드하면 만일의 경우 로컬저장소의 내용이 유실되더라도 안전하게 관리할 수 있다. 또한 다른 사람과 공유할 수도 있고, 여러 사람이 함께 수정하고 합치고 하는 작업을 할 수도 있다.&lt;/p&gt;
&lt;p&gt;먼저 github 계정에 repository를 하나 생성하고, 그 원격저장소에 로컬저장소에서 작업한 파일들을 업로드한다.&amp;nbsp; 그렇게 되면 여러 가지 효과를 얻게 되는데, 백업, 공유, 협업 등이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAa95b/btqBD1XPVVP/2zkGkRIJ0J5aXZgr2KNKV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAa95b/btqBD1XPVVP/2zkGkRIJ0J5aXZgr2KNKV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAa95b/btqBD1XPVVP/2zkGkRIJ0J5aXZgr2KNKV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAa95b%2FbtqBD1XPVVP%2F2zkGkRIJ0J5aXZgr2KNKV0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;생성한 원격저장소를 로컬저장소와 연결하기 위해 HTTPS url을 복사한다. 사실 현재의 버전에서는 불필요하다. 메뉴에서 Repository/rRepository Setting/Publish 하면 원격저장소가 자동으로 생성되고, 생성된 후에는 Repository/Repository Setting에서 수정이 가능하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;github &amp;nbsp;page 기능을 이용한 웹사이트 운영&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PjeVAQAS2_s&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rSO4e/btqBGqIFOB2/zPGNolborfqr27jvSmbOh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rSO4e/btqBGqIFOB2/zPGNolborfqr27jvSmbOh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rSO4e/btqBGqIFOB2/zPGNolborfqr27jvSmbOh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrSO4e%2FbtqBGqIFOB2%2FzPGNolborfqr27jvSmbOh1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Settings 탭을 열고 현재 repository의 상태가 private이면 유료인데, 무료를 원한다면 public으로 상태를 전환해야 한다.&lt;br /&gt;페이지의 하단에 Danger Zone 이있고 repository를 삭제하거나 public으로 바꾸는 등의 작업을 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2wQxm/btqBDXBswC3/EYaSQLlCTWBDbt9XqKopa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2wQxm/btqBDXBswC3/EYaSQLlCTWBDbt9XqKopa1/img.png&quot; data-alt=&quot;프로젝트가 private 이면 GitHub Pages 에서 Pro 계정[유료]전환 혹은 public 으로 상태 전환을 요구한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2wQxm/btqBDXBswC3/EYaSQLlCTWBDbt9XqKopa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2wQxm%2FbtqBDXBswC3%2FEYaSQLlCTWBDbt9XqKopa1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로젝트가 private 이면 GitHub Pages 에서 Pro 계정[유료]전환 혹은 public 으로 상태 전환을 요구한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;365&quot; height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWOiLM/btqBGZjLVI7/WZRhMJafvmy4W9WbkoKEd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWOiLM/btqBGZjLVI7/WZRhMJafvmy4W9WbkoKEd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWOiLM/btqBGZjLVI7/WZRhMJafvmy4W9WbkoKEd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWOiLM%2FbtqBGZjLVI7%2FWZRhMJafvmy4W9WbkoKEd1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;365&quot; height=&quot;455&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;master branch를 선택하면 링크가 생긴 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byRa5Z/btqBEBYWKjW/jiacu49lHScTik5GwprL7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byRa5Z/btqBEBYWKjW/jiacu49lHScTik5GwprL7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byRa5Z/btqBEBYWKjW/jiacu49lHScTik5GwprL7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyRa5Z%2FbtqBEBYWKjW%2Fjiacu49lHScTik5GwprL7K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;같은 폴더에 style.css 파일을 작성하고, index.html 에서 style.css와 연결하는 부분을 수정한 후에 업로드 하면 [push 함] 사이트에 반영이 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rAPnd/btqBEBSallT/9HL297I6qQIVl4LUzmE161/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rAPnd/btqBEBSallT/9HL297I6qQIVl4LUzmE161/img.png&quot; data-alt=&quot;style.css의 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rAPnd/btqBEBSallT/9HL297I6qQIVl4LUzmE161/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrAPnd%2FbtqBEBSallT%2F9HL297I6qQIVl4LUzmE161%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;style.css의 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4rlNg/btqBGeV0yIU/mwmYU9kCv8ar9OclFMOiK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4rlNg/btqBGeV0yIU/mwmYU9kCv8ar9OclFMOiK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4rlNg/btqBGeV0yIU/mwmYU9kCv8ar9OclFMOiK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4rlNg%2FbtqBGeV0yIU%2FmwmYU9kCv8ar9OclFMOiK0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJJ6H/btqBFvxabWf/KWKuDRW09oQswKzMCDNe41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJJ6H/btqBFvxabWf/KWKuDRW09oQswKzMCDNe41/img.png&quot; data-alt=&quot;반영되기까지 시간이 좀 걸린다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJJ6H/btqBFvxabWf/KWKuDRW09oQswKzMCDNe41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJJ6H%2FbtqBFvxabWf%2FKWKuDRW09oQswKzMCDNe41%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;반영되기까지 시간이 좀 걸린다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;매우 편리하고 강력한 방법이다. 웹사이트를 만들려는 목적에서 쓸 수도 있겠지만, 만일 오픈소스 프로젝트를 하고 있고, 이 프로젝트에 대한 사용설명서 페이지를 보여주고 싶다고 하면 한 번 Bootstrap 페이지를 보라. &lt;a href=&quot;https://getbootstrap.com/&quot;&gt;https://getbootstrap.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4ar4s/btqBD1csZ3G/7nkvBDwHSJjgXpRWkqFvk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4ar4s/btqBD1csZ3G/7nkvBDwHSJjgXpRWkqFvk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4ar4s/btqBD1csZ3G/7nkvBDwHSJjgXpRWkqFvk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4ar4s%2FbtqBD1csZ3G%2F7nkvBDwHSJjgXpRWkqFvk1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;굉장히 유명한 오픈소스 사이트인 Bootstrap 은 github을 통해 서비스되고 있는 동시에, 해당 저장소에 이 프로젝트의 소스코드도 있고, 이 프로젝트에 대한 설명까지도 함께 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;도메인 적용하기 (freenom.com)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/DqKGoixwI74&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;원래 도메인은 1년에 몇 만원 하는데 freenom에서 1년간 무료로 쓸 수 있다.&lt;/p&gt;
&lt;p&gt;또한 도메인은 사용기간이 있기 때문에 캘린더에 체크해두고 관리하는 것이 좋다. 큰 회사들도 만료기한을 잊어버려 고초를 겪는 경우가 있으니 말이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TQObX/btqBEBLsgEz/MTfVrMKQKiQEyTKJn61AjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TQObX/btqBEBLsgEz/MTfVrMKQKiQEyTKJn61AjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TQObX/btqBEBLsgEz/MTfVrMKQKiQEyTKJn61AjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTQObX%2FbtqBEBLsgEz%2FMTfVrMKQKiQEyTKJn61AjK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 그림에서와 같이 구매한 도메인을 설정하고 저장을 하게 되면 github.com에서 저 도메인에 대한 요청에 대해 이 프로젝트를 연결시켜주도록 설정을 하였다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 설정과 함께, 인터넷사용자가 저 주소를 입력하면 github.com을 찾아오도록 하는 설정도 해주어야 한다.&amp;nbsp; 그 설정을 위해 Learn more 를 클릭하여 정보를 더 봐야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;참고&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;github을 이용해서 자신의 포트폴리오를 운영중인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.facebook.com/groups/codingeverybody/permalink/1642985545741975/?comment_id=1643290225711507&amp;amp;comment_tracking=%7B%22tn%22%3A%22R2%22%7D&quot;&gt;신동주&lt;/a&gt;님의 멋진 사이트입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mopsyshin.github.io/&quot;&gt;Mopsy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;TOP&lt;/a&gt;&lt;/p&gt;</description>
      <category>DEVELOPMENT/Git&amp;amp;GitHub</category>
      <category>gitignore</category>
      <category>라이센스</category>
      <author>SALTFUN</author>
      <guid isPermaLink="true">https://saltfun.tistory.com/19</guid>
      <comments>https://saltfun.tistory.com/19#entry19comment</comments>
      <pubDate>Sat, 1 Feb 2020 03:56:22 +0900</pubDate>
    </item>
    <item>
      <title>Git CLI - 버전관리</title>
      <link>https://saltfun.tistory.com/18</link>
      <description>&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;0.&amp;nbsp;INTRO &lt;/b&gt;&lt;br /&gt;&lt;b&gt;1.&amp;nbsp;설치 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;2.&amp;nbsp;버전관리의&amp;nbsp;시작 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;3.&amp;nbsp;버전의&amp;nbsp;생성 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;4.&amp;nbsp;버전간의&amp;nbsp;차이점&amp;nbsp;비교 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;5.&amp;nbsp;checkout과&amp;nbsp;시간여행 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;6.&amp;nbsp;보충수업 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;7.&amp;nbsp;버전&amp;nbsp;삭제&amp;nbsp;-&amp;nbsp;git&amp;nbsp;reset &lt;/b&gt;&lt;br /&gt;&lt;b&gt;8.&amp;nbsp;버전&amp;nbsp;되돌리기&amp;nbsp;-&amp;nbsp;git&amp;nbsp;revert &lt;/b&gt;&lt;br /&gt;&lt;b&gt;9.&amp;nbsp;마무리&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;0.&amp;nbsp;INTRO&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/85f6tpKM5D4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/85f6tpKM5D4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;git CLI [&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Command Line Interface&lt;/b&gt;&lt;/span&gt;] 명령어의 특성상 처리해야 할 일을 한 번에 명령하여 자동화를 할 수 있다. GUI 를 사용할 수 없는 서버환경에서도 쓸 수 있기 때문에 많은 개발자들이 사용하고 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.&amp;nbsp;설치&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;Mac 에서의 설치&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/mxUL0uMhc6c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/mxUL0uMhc6c&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Windows에서 설치&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/o4bvYcaTR-M&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/o4bvYcaTR-M&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://git-scm.com&quot;&gt;https://git-scm.com&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0an8H/btqBFMZjsxd/LmXp20ZObkPM3IepIw7HA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0an8H/btqBFMZjsxd/LmXp20ZObkPM3IepIw7HA0/img.png&quot; data-alt=&quot;Fig 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0an8H/btqBFMZjsxd/LmXp20ZObkPM3IepIw7HA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0an8H%2FbtqBFMZjsxd%2FLmXp20ZObkPM3IepIw7HA0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 버전관리의 시작&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/avP7QLMNSXo&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/avP7QLMNSXo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;pwd, ls -al, cd, mkdir 등 리눅스 명령들을 사용[Mac 환경].&lt;/p&gt;
&lt;p&gt;&lt;b&gt;git init &lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;버전관리할디렉토리&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;git init&lt;/b&gt; &lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&amp;nbsp; 현재 디렉토리 버전관리 시작. .git이라는 디렉토리가 생김. 이 안에는 현재 버전관리가 시작된 현재 디렉토리에서 일어나는 여러 가지 변화들을 기록함. 따라서 .git 이라는 디렉토리를 절대 지우면 안됨.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;576&quot; height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BzMSe/btqBFvcrsGf/8Og9FVDf8evD7kBSjUHBf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BzMSe/btqBFvcrsGf/8Og9FVDf8evD7kBSjUHBf0/img.png&quot; data-alt=&quot;Fig 2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BzMSe/btqBFvcrsGf/8Og9FVDf8evD7kBSjUHBf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBzMSe%2FbtqBFvcrsGf%2F8Og9FVDf8evD7kBSjUHBf0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;576&quot; height=&quot;504&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.&amp;nbsp;버전의&amp;nbsp;생성&lt;/h2&gt;
&lt;p&gt;버전생성&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/tP_Q_o8KOUA&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/tP_Q_o8KOUA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;git은 파일의 변경사항들을 버전으로 만들어 관리한다.&lt;/p&gt;
&lt;p&gt;버전이 저장되는 곳이 저장소 Repository이다. .git이라는 디렉토리이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQnpHJ/btqBGftoKgY/LDuprchRNUw0TIqIKwKIgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQnpHJ/btqBGftoKgY/LDuprchRNUw0TIqIKwKIgk/img.png&quot; data-alt=&quot;Fig 3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQnpHJ/btqBGftoKgY/LDuprchRNUw0TIqIKwKIgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQnpHJ%2FbtqBGftoKgY%2FLDuprchRNUw0TIqIKwKIgk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Working tree: 아직 버전으로 만들어지기 전 단계&lt;/p&gt;
&lt;p&gt;Staging Area: Working tree 에 있는 파일 중에서 이 Staging Area에 있는 파일만 버전으로 되어 Repository에 기록된다.&lt;br /&gt;즉 버전으로 만들려고 하는 파일들이다.&lt;/p&gt;
&lt;p&gt;버전으로 관리하려고 하면 명령어를 써서 한 번 알려줘야 한다. 버전관리가 되지 않는 상황일 때에는 &lt;b&gt;git status&lt;/b&gt; 명령으로 확인할 경우 &lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;Untracked files&lt;/b&gt;&lt;/span&gt;에 나타난다. 즉 아직 Working tree 에 있다는 뜻이 되겠다.&lt;/p&gt;
&lt;p&gt;이것을 Staging Area에 올리는 명령어는 &lt;b&gt;git add 파일명&lt;/b&gt; 이다. 파일을 Staging Area에 올린 후 git status 명령으로 다시 확인해보면 &lt;b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;Changes to be commited: new file: 파일명&lt;/span&gt;&lt;/b&gt;&amp;nbsp; 으로 나타난다.&lt;/p&gt;
&lt;p&gt;Staging Area에 있는 파일을 Repository에 넘기는 명령은 git commit 인데 옵션과 &quot;버전이름&quot;이름을 주어 한 번에 실행시킬 수 있다.&amp;nbsp; git commit -m &quot;Message1&quot; 명령어에 의해 Repository에 만들어지고 git status로 확인하면 버전대기가 없이 깨끗하다는 메세지가 뜬다. Working tree의 내용이 모두 버전으로 만들어지면 working tree 도 비어있다고 메세지가 뜬다.&lt;/p&gt;
&lt;p&gt;git log:&amp;nbsp; 버전이 만들어진 log확인. 확인을 마칠 때에는 Q 입력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;404&quot; height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tPETC/btqBGq9kaRq/cPvknt4178tO4d79AMm2R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tPETC/btqBGq9kaRq/cPvknt4178tO4d79AMm2R0/img.png&quot; data-alt=&quot;Fig 4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tPETC/btqBGq9kaRq/cPvknt4178tO4d79AMm2R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtPETC%2FbtqBGq9kaRq%2FcPvknt4178tO4d79AMm2R0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;404&quot; height=&quot;231&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;여러 개의 파일을 하나의 버전으로 만들기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/MXz7Z-Heipc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/MXz7Z-Heipc&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이미 버전 관리가 되는 파일이든 추가로 버전관리를 하려는 파일이든 각각 모두 git add로 Staging Area에 올려놓고 git commit을 실행한다.&lt;/p&gt;
&lt;p&gt;각각의 버전별로 어떤 파일들이 들어있는지 알기 위해 &quot;git log files list&quot;&amp;nbsp; 로 구글링하니 이런 결과를 얻었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;669&quot; height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pgyY0/btqBCUxXSv8/CTK62BRDt1Wb4lnUk6vMZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pgyY0/btqBCUxXSv8/CTK62BRDt1Wb4lnUk6vMZK/img.png&quot; data-alt=&quot;Fig 5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pgyY0/btqBCUxXSv8/CTK62BRDt1Wb4lnUk6vMZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpgyY0%2FbtqBCUxXSv8%2FCTK62BRDt1Wb4lnUk6vMZK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;669&quot; height=&quot;336&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 5&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위의 검색결과에 딸 git log --stat 이라고 입력하면 버전별로 변화를 알 수 있으며 이런 작업을 파일명을 바꾸면서 관리하려면 매우 복잡하지만 git 은 이 복잡한 작업을 쉽게 관리할 수 있도록 해준다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.&amp;nbsp;버전간의&amp;nbsp;차이점&amp;nbsp;비교&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/CysL6y8GPV4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/CysL6y8GPV4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;버전관리를 하면 버전과 버전 사이의 비교를 할 수 있다. 이를 통해 의사 결정을 하는데 큰 도움을 받을 수 있다.&lt;/p&gt;
&lt;p&gt;git diff&amp;nbsp; 이전 버전과이 차이를 상세히 보여주기 때문에 의사결정을 심사숙고 하는데 매우 큰 도움이 된다.&lt;/p&gt;
&lt;p&gt;git reset --hard&amp;nbsp; 새로 한 작업을 무시해버리고 이전 버전으로 되돌린다.&lt;/p&gt;
&lt;p&gt;git log -p&amp;nbsp; &amp;nbsp;p는 패치. 로그 내용을 보여주는데 변경된 부분까지 상세하게 보여준다.&lt;/p&gt;
&lt;p&gt;이런 기능은 코드등을 작성하다가 문제가 발생했을 때 어디에서 문제가 발생했는지 찾아내는데 큰 도움이 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz7NPP/btqBEA6lVxD/Idpy7G6cRrY6FmFVg6JOqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz7NPP/btqBEA6lVxD/Idpy7G6cRrY6FmFVg6JOqK/img.png&quot; data-alt=&quot;Fig 6&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz7NPP/btqBEA6lVxD/Idpy7G6cRrY6FmFVg6JOqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz7NPP%2FbtqBEA6lVxD%2FIdpy7G6cRrY6FmFVg6JOqK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;351&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 6&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5.&amp;nbsp;checkout과&amp;nbsp;시간여행&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/9agkT0HAFho&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/9agkT0HAFho&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;checkout은 특정 버전으로 working tree를 변경시킨다. 이를 통해 버전과 버전을 넘나드는 방법을 살펴본다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CB5wg/btqBE1QdMLu/7RhgTISGZW4oNDoEBLJHnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CB5wg/btqBE1QdMLu/7RhgTISGZW4oNDoEBLJHnK/img.png&quot; data-alt=&quot;Fig 7. git log 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CB5wg/btqBE1QdMLu/7RhgTISGZW4oNDoEBLJHnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCB5wg%2FbtqBE1QdMLu%2F7RhgTISGZW4oNDoEBLJHnK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 7. git log 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;git log 명령을 실행 시키면 HEAD 현재 master를 가리키는 것을 볼 수 있다. master 최신 상태를 뜻하는 주소쯤으로 이해할 수 있겠다. 이제 HEAD 값은 다른 버전의 commit 해시코드를 설정하는 것에 의해 이전 버전으로 혹은 버전 사이를 왔다갔다 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbbJxr/btqBGq2Adm7/HfWLdz2TdmSEP1YcyULzQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbbJxr/btqBGq2Adm7/HfWLdz2TdmSEP1YcyULzQ1/img.png&quot; data-alt=&quot;Fig 8. git checkout commitHashcode20byte 를 실행하여 HEAD를 바꿔 버전이동&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbbJxr/btqBGq2Adm7/HfWLdz2TdmSEP1YcyULzQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbbJxr%2FbtqBGq2Adm7%2FHfWLdz2TdmSEP1YcyULzQ1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;714&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 8. git checkout commitHashcode20byte 를 실행하여 HEAD를 바꿔 버전이동&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;git checkout e706e06...&amp;nbsp; 명령에 의해 HEAD 가 변하고 해당 버전의 상태로 바뀌었다.&lt;/p&gt;
&lt;p&gt;최신 버전으로 다시 돌아가려면 HEAD 값을 다시 master 로 설정하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;git checkout master&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;382&quot; height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJMIbX/btqBEBYxKmT/d5kNUYK8PCt70L1BqsyN81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJMIbX/btqBEBYxKmT/d5kNUYK8PCt70L1BqsyN81/img.png&quot; data-alt=&quot;Fig 9&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJMIbX/btqBEBYxKmT/d5kNUYK8PCt70L1BqsyN81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJMIbX%2FbtqBEBYxKmT%2Fd5kNUYK8PCt70L1BqsyN81%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;382&quot; height=&quot;370&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 9&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6.&amp;nbsp;보충수업&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/qMW_HhXDjfQ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/qMW_HhXDjfQ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;git add 파일명 : 지정한 파일을 Staging Area에 넘기라는 뜻. 각각의 파일마다 다 하기가 번거로울 때에는&lt;/p&gt;
&lt;p&gt;git add .&amp;nbsp; &amp;nbsp;: 현재 디렉토리 모든 파일을 Staging Area에 보내라는 뜻. 당연히 디렉토리명을 지정할 수도 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;git commit -am&amp;nbsp; &quot;버전명&quot; :a 옵션은 add 와 commit을 동시에 실행한다는 뜻. 이때 Untracked 파일 즉 한 번도 Staging Area 에 올라 commit 된 적이 없는 파일은 역시 commit 되지 않는다.&lt;/p&gt;
&lt;p&gt;git commit : m 옵션을 쓰면 &quot;버전명&quot;을 바로 지정할 수 있지만, 아무 옵션도 없으면 기본에디터가 실행되면서 해당 버전에 대한 상세한 내용을 작성하는 것이 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;또한 이때 열리는 편집기를 바꿀 수도 있는데&amp;nbsp; &quot;change git default text editor&quot;로 구글링하여 방법을 찾을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;git config&amp;nbsp; .... 하는 식으로 환경을 바꾸는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7.&amp;nbsp;버전&amp;nbsp;삭제&amp;nbsp;-&amp;nbsp;git&amp;nbsp;reset&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/BttPJ8yj038&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/BttPJ8yj038&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;git reset --hard&lt;/b&gt; &lt;i&gt;commitHashcode20byte&lt;/i&gt; : 버전을 reset하면 지정한 버전으로 되어버린다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x1Oiu/btqBDaN6Tfi/WCOUctFlWo5uWB0Hc2InHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x1Oiu/btqBDaN6Tfi/WCOUctFlWo5uWB0Hc2InHk/img.png&quot; data-alt=&quot;Fig 10&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x1Oiu/btqBDaN6Tfi/WCOUctFlWo5uWB0Hc2InHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx1Oiu%2FbtqBDaN6Tfi%2FWCOUctFlWo5uWB0Hc2InHk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;799&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 10&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NX24w/btqBFNYfQsx/bCc59Xsr3UubLV0B7dJR7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NX24w/btqBFNYfQsx/bCc59Xsr3UubLV0B7dJR7k/img.png&quot; data-alt=&quot;Fig 11. git reset -hard 에 의해 master 가 완전히 바뀐 것을 알 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NX24w/btqBFNYfQsx/bCc59Xsr3UubLV0B7dJR7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNX24w%2FbtqBFNYfQsx%2FbCc59Xsr3UubLV0B7dJR7k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 11. git reset -hard 에 의해 master 가 완전히 바뀐 것을 알 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Fig 8에서처럼 버전 간 이동이 아니라 버전이 아예 바뀌어 벼렸다. master가 바뀐 것이다.&lt;/p&gt;
&lt;p&gt;명령어의 도움말이 필요하면 git reset --help 와 같이 하면 된다. 이 도움말을 보면 reset에는 --hard 외에도 다른 옵션들이 여럿 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/52KJr/btqBEASRCBL/6N3Zlp17qCqvBXcN4WaJ21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/52KJr/btqBEASRCBL/6N3Zlp17qCqvBXcN4WaJ21/img.png&quot; data-alt=&quot;Fig 12. git xxxx --help 에 의한 매뉴얼 열기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/52KJr/btqBEASRCBL/6N3Zlp17qCqvBXcN4WaJ21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F52KJr%2FbtqBEASRCBL%2F6N3Zlp17qCqvBXcN4WaJ21%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 12. git xxxx --help 에 의한 매뉴얼 열기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8.&amp;nbsp;버전&amp;nbsp;되돌리기&amp;nbsp;-&amp;nbsp;git&amp;nbsp;revert&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/Yjdh6TZAYBw&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/Yjdh6TZAYBw&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;git reset은 버전을 아예 지워버리지만 revert은 삭제와 보존의 목적을 동시에 달성할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;한 단계이전의 버전으로만 되돌리는 것으로 보인다. 즉 버전이 1, 2, v3, v4 가 있고 master 가 v4라고 하면,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;git revert&lt;/b&gt; &lt;i&gt;commitHashcode20byte&lt;/i&gt; 와 같이 바로 이전 버전 즉 v3 버전의 commit 코드를 지정하여 v3 버전으로 바뀌는데 이때 v3 버전으로 되돌아간다기 보다는 v4 버전에서 v3 버전으로 변한다는 것이다. 이게 무슨 말이냐면, 버전이 1, 2, v3 이 되는 것이 아니라, 버전은 1, 2, v3, v4, v3 으로 된다는 뜻이다. v3이 master 이고.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;따라서 버전을 건너뛰어 revert를 적용하면 conflict 오류가 발생하며 만일 1 버전으로 되돌리려고 한다면 이런 식으로 가야 한다는 것이다. 현재 버전이 1, 2, v3, v4라면 1, 2, v3, v4, v3, 2 이런 식으로 말이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;참고 :&amp;nbsp;&lt;a href=&quot;http://www.devpools.kr/2017/01/31/개발바보들-1화-git-back-to-the-future/&quot;&gt;http://www.devpools.kr/2017/01/31/개발바보들-1화-git-back-to-the-future/&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9.&amp;nbsp;마무리&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/bRIjJMvA7pE&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/bRIjJMvA7pE&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;버전관리의 핵심은 비교이다. 비교를 통해 과거를 되돌아 볼 수 있다는 것이 버전관리의 핵심적인 효용이다. &quot;diff tool&quot;을 검색해보면 좋은 도구들이 많은데 이 도구들을 이용해 차이점을 보다 정교하게 비교할 수 있다. 정확한 의사결정을 내리고 현재의 상황을 신속하게 파악하는데 큰 도움이 될 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;버전관리를 하지 말아야 할 파일이 있을 수도 있다. 그런 경우 .gitignore라는 파일을 만들고 거기에 파일의 이름을 적으면 된다. 예를 들어 파일을 편집하다 보면&amp;nbsp; 그 프로그램이 필요에 따라 임시파일을 만드는 경우가 있다. 혹은 나혼자 보기 위해 비밀번호 같은 것을 특정 파일에 메모를 하고 있기는 하지만 그에 대해 버전관리를 원하지 않을 수 있는 것이다. 이때 .gitignore라는 파일을 만들고 거기에 무시하려는 파일들을 적어두는 것이다. 검색을 통해 방법을 찾을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;또한 git에는 정말 중요한 특징이면서 혁신적인 면 중의 하나인 branch라는 환상적인 도구가 있다. branch는 우리의 저장소를 여러 가지 상태로 공존할 수 있게 해준다. 예를 들어 보고서를 하나 작성해다 치자. 그런데 여러 고객사들에게 해당 보고서의 내용을 고객사 별로 조금씩 수정해서 보내야 한다면 어떻게 해야 할까? 아마도 이때 쓸 수 있는 방법은 저장소 전체를 복사해서 디렉토리를 만든 후 각각에 대해 작업하는 것일 수 있다. 이때 branch를 이용하면 저장소 이름에 영향을 주지 않고 하나의 저장소에서 다양한 작업을 진행할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;복잡한 commitHashcode대신에 tag를 이용할 수도 있다. 버전에 이해하기 쉬운 이름을 붙여 보다 쉽게 중요한 버전을 찾아갈 수 있다는 장점이 생긴다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;버전관리에서 정말 중요한 것 중의 하나는 backup이다. backup을 하지 않는다는 것은 자신의 정보를 언젠가는 유실하겠다고 선언하는 것이나 다름없는 것이다. git은 자체적으로 매우 안전하고 편리한 backup 장치를 가지고 있다. 클릭 한 번으로 지금까지 작업한 것을 인터넷에 업로드 할 수 있다. 필요할 때 바로 다운로드 받아 작업할 수도 있다.&amp;nbsp; git의 백업에 대해 잘 모른다 할지라도 dropbox, google drive, one drive등을 이용하여 자료를 백업해두는 것이 하지 않는 것보다 100만배는 더 낫다. 백업을 하면 백업너머에 자연스럽게 협업이라는 기능이 보인다. &amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DEVELOPMENT/Git&amp;amp;GitHub</category>
      <author>SALTFUN</author>
      <guid isPermaLink="true">https://saltfun.tistory.com/18</guid>
      <comments>https://saltfun.tistory.com/18#entry18comment</comments>
      <pubDate>Fri, 31 Jan 2020 23:35:21 +0900</pubDate>
    </item>
    <item>
      <title>GIT</title>
      <link>https://saltfun.tistory.com/16</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://www.opentutorials.org/course/3837&quot;&gt;https://www.opentutorials.org/course/3837&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. INTRO&lt;br /&gt;2. git을 구경합시다&lt;br /&gt;3. git의 목적 1 - 버전관리&lt;br /&gt;4. git의 목적 2 - BACKUP&lt;br /&gt;5. git의 목적 3 - 협업&lt;br /&gt;6. git의 종류&lt;br /&gt;7. 수업을 마치며&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. INTRO&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/uKtBJ65UWoM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/uKtBJ65UWoM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;THE INFORMATION MANAGER FROM HELL 지옥에서 온 정보 관리자: 2005년 리눅스 운영체제 개발자인 리누스 토르발스 (&lt;span&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/리누스_토르발스&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Linus Benedict Torvalds&lt;/a&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://namu.wiki/w/1969%EB%85%84&quot;&gt;1969년&lt;/a&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://namu.wiki/w/12%EC%9B%94%2028%EC%9D%BC&quot;&gt;12월 28일&lt;/a&gt; 스웨덴계 핀란드인) 가 git을 세상에 처음 소개하면서 한 말. 26년 동안 1만명이 넘는 소프트웨어 엔지니어들이 오픈소스방식으로 2000만줄이 넘는 소스코드를 작성한 것을 지옥에 비유한 것이리라.&lt;/p&gt;
&lt;p&gt;이 수업은 아래와 같은 상황에 있는 분들을 위한 수업입니다. 아래에서 문서란 일반적인 텍스트 문서에서부터 이미지, 소스코드를 망라한 모든 파일이라고 생각하시면 됩니다.&lt;/p&gt;
&lt;ul&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;li&gt;문서를 안전하게 백업해야 하는 분&amp;nbsp;&lt;/li&gt;
&lt;li&gt;문서를 다른 사람과 공유해서 공동으로 작업하는 분&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;git 이 소프트웨어 엔지지너만을 위한 것은 아니다. 여기서는 코드보다는 텍스트, 이미지 파일 등을 이용하여 git에 대해 살펴보고자 한다. 수많은 문서의 지옥에서 허덕이는 사람이 git을 사용한다면 project의 복잡성을 획기적으로 낮출 수 있을 것이다. 반대로 혼자서 1~2 개의 문서를 한 번에 작성하여 혼자 보기 위해 git을 사용한다면 오히려 git이 지옥처럼 느껴질지도 모르겠다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. git을 구경합시다&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/R6UOOTrUUmQ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/R6UOOTrUUmQ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;git의 목적을 대략 3가지 정도로 말할 수 있는데 version 관리, backup, 협업 collaborate 이다. 이 3가지는 순서가 있으며 앞의 것을 이해하지 못한다면 뒤의 것을 이해하기 어렵다. 앞의 것은 그것만으로도 할 수 있는 일이 많다. 하지만 뒤의 것은 앞의 것에 의존하고 있는 기능이다. 앞의 것은 쉽고 뒤로 갈수록 기하급수적으로 어려워진다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. git의 목적 1 - 버전관리&lt;/h2&gt;
&lt;p&gt;git을 사용하지않고 버전관리&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/9btOcOLjb30&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/9btOcOLjb30&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;git을 이용한 버전관리&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/9fSEVG5D6vk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/9fSEVG5D6vk&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. git의 목적 2 - BACKUP&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/hr-T5mdIigg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/hr-T5mdIigg&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. git의 목적 3 - 협업&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/ZgCsQpnWl14&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/ZgCsQpnWl14&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. git의 종류&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;a href=&quot;https://youtu.be/TZhy1HcYTgg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/TZhy1HcYTgg&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;git은 여러가지 종류의 프로그램을 이용해서 사용할 수 있습니다. 이런 프로그램들을 git client라고 합니다. git client가 무엇인지, 어떤 종류가 있는지 살펴봅니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;github Desktop 배우기 쉽고 기능이 심플. 고급사용자에게는 답답할 수도. &lt;a href=&quot;https://desktop.github.com/&quot;&gt;https://desktop.github.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cE3fIK/btqBGeOJEAk/QWJkI1gXVOLhbwZxWg8om1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cE3fIK/btqBGeOJEAk/QWJkI1gXVOLhbwZxWg8om1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cE3fIK/btqBGeOJEAk/QWJkI1gXVOLhbwZxWg8om1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcE3fIK%2FbtqBGeOJEAk%2FQWJkI1gXVOLhbwZxWg8om1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tortoisegit.org/&quot;&gt;https://tortoisegit.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G7Raf/btqBFNqiSsd/oSYdSR2JElVcjdlLZOk4u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G7Raf/btqBFNqiSsd/oSYdSR2JElVcjdlLZOk4u1/img.png&quot; data-alt=&quot;윈도우 탐색기에 기생해서 사용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G7Raf/btqBFNqiSsd/oSYdSR2JElVcjdlLZOk4u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG7Raf%2FbtqBFNqiSsd%2FoSYdSR2JElVcjdlLZOk4u1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;윈도우 탐색기에 기생해서 사용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아주 강력한 툴, 복잡하지만 자유롭다.&amp;nbsp; &lt;a href=&quot;https://www.sourcetreeapp.com&quot;&gt;https://www.sourcetreeapp.com&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0m0JL/btqBE0wTcQp/9X4xT0DpufpoDeK7iQB3mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0m0JL/btqBE0wTcQp/9X4xT0DpufpoDeK7iQB3mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0m0JL/btqBE0wTcQp/9X4xT0DpufpoDeK7iQB3mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0m0JL%2FbtqBE0wTcQp%2F9X4xT0DpufpoDeK7iQB3mk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;오리지널 프로그램도 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mFDiW/btqBFvDqOpf/JF1zKe3xcZPYWZb6Q9tu0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mFDiW/btqBFvDqOpf/JF1zKe3xcZPYWZb6Q9tu0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mFDiW/btqBFvDqOpf/JF1zKe3xcZPYWZb6Q9tu0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmFDiW%2FbtqBFvDqOpf%2FJF1zKe3xcZPYWZb6Q9tu0K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/017cL/btqBD222mTG/yFYYGXswVTE7CbYysXGYl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/017cL/btqBD222mTG/yFYYGXswVTE7CbYysXGYl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/017cL/btqBD222mTG/yFYYGXswVTE7CbYysXGYl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F017cL%2FbtqBD222mTG%2FyFYYGXswVTE7CbYysXGYl1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;명령어를 통해 대화하듯이 제어하는 독특한 프로그램. cmd, console 창과 비슷.&amp;nbsp; 명령어 예시 &lt;b&gt;git log&lt;/b&gt;,&lt;b&gt;&amp;nbsp; git status&lt;/b&gt;,&lt;b&gt; git commit -am &quot;Message 2&quot;&lt;/b&gt;,&lt;b&gt; git push&amp;nbsp; &lt;/b&gt;등.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;git Desktop, Tortois, sourcetree 등 기타 프로그램들도 이 오리지널을 기반으로 만들어진 것으로 볼 수 있음.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 마무리&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/-RTMkCq2fjY&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/-RTMkCq2fjY&lt;/a&gt;&lt;/p&gt;</description>
      <category>DEVELOPMENT/Git&amp;amp;GitHub</category>
      <author>SALTFUN</author>
      <guid isPermaLink="true">https://saltfun.tistory.com/16</guid>
      <comments>https://saltfun.tistory.com/16#entry16comment</comments>
      <pubDate>Fri, 31 Jan 2020 10:15:22 +0900</pubDate>
    </item>
    <item>
      <title>인포그래픽</title>
      <link>https://saltfun.tistory.com/15</link>
      <description>&lt;p&gt;&lt;a name=&quot;처음&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;https://opentutorials.org/module/390&quot;&gt;https://opentutorials.org/module/390&lt;/a&gt;&lt;/p&gt;
&lt;!-- 목차 부분 --&gt;
&lt;ul style=&quot;list-style-type: none;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#intro0&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;0. INTRO&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chapt1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;1. The WebGL Globe&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chapt2&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;2. TimelineJS&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chapt3&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;3. REVEAL.JS&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chapt4&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;4. bartoszopka&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chapt5&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;5. google chart Tools&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chapt6&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;6. 구글지도 API&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chapt7&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;7. Lostalgia&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#chapt8&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 1.25em; color: #666971;&quot;&gt;8. intro.js&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- 내용 부분 --&gt;
&lt;p&gt;&lt;a name=&quot;intro0&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;0. INTRO&lt;/h1&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;인포그래픽이란?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;인포그래픽(infographic)이란 정보나 지식을 시각적인 효과를 이용해 효율적으로 전달하는 방식을 의미한다. Infographic 모듈에서는 인포그래픽 그 중에도 프로그래밍적 지식이 필요한 인포그래픽을 쉽게 사용할 수 있도록 하는데 초점을 맞춘다.&lt;/p&gt;
&lt;p&gt;참고: &lt;a href=&quot;http://selection.datavisualization.ch/&quot;&gt;datavisualization.ch&lt;/a&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;chapt1&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;1. The WebGL Globe&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/2OXmp48B0O0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/2OXmp48B0O0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/2OXmp48B0O0&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;The WebGL Globe란?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;지구상의 지역을 기준으로 데이터를 시각화해서 보여주는 솔루션으로 구글의 Data Arts 팀에서 제작한 무료, 공개 소프트웨어다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;미리보기&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://workshop.chromeexperiments.com/globe/&quot;&gt;http://workshop.chromeexperiments.com/globe/&lt;/a&gt;&lt;span style=&quot;font-size: 1.25em; letter-spacing: 0px;&quot;&gt;&amp;nbsp;특징&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;위도(latitude), 경도(logngitude)를 기준으로 수치를 시각화해서 보여준다.&lt;/li&gt;
&lt;li&gt;data와 type에 따라서 컬러를 시각적으로 보여준다.&lt;/li&gt;
&lt;li&gt;마우스와 휠을 통해서 제어 할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;WebGL을 지원하는 브라우저에서만 사용 가능하다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;웹에서 3D를 구현할 수 있는 기술을 기반으로 만들기 때문에 브라우저가 WebGL을 지원해야 구동할 수 있다. Chrome, Firefox, Safari에서는 동작하지만 낮은 버전의 IE에서는 동작하지 않을 수도 있다.&lt;/p&gt;
&lt;p&gt;두 가지가 있는 데 하나는 홈페이지, 하나는 개발 홈페이지이다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;웹&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;홈페이지: &lt;a href=&quot;http://www.chromeexperiments.com/globe&quot;&gt;http://www.chromeexperiments.com/globe&lt;/a&gt;&amp;nbsp;&lt;br /&gt;WebGL에 대한 소개, 관련 샘플, Globe 소스를 받을 수 있는 링크, Globe를 이용해 만든 예제들에 대한 링크 들이 있으니 참조해보라.&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;개발 홈페이지: &lt;a href=&quot;http://code.google.com/p/webgl-globe/&quot;&gt;http://code.google.com/p/webgl-globe/&lt;/a&gt;&lt;br /&gt;동영상에서는 개발자홈페이지와 접속하는 것으로 되어 있으나 현재 시점[2020.2.5]에서는 github 페이지와 연결된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;사용기술&lt;/p&gt;
&lt;p&gt;이 WebGL을 사용하기 위해서는 html, css, javascript에 대한 약간의 지식들이 있어야 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;html&lt;/li&gt;
&lt;li&gt;css&lt;/li&gt;
&lt;li&gt;javascript&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;필요기술&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;웹서버 - 웹페이지를 서비스 할 수 있는 웹서버가 필요하다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;생활코딩 웹서비스 만들기 편을 완주하면 이 기술을 사용 할 수 있다. (&lt;a href=&quot;http://opentutorials.org/course/488&quot;&gt;바로가기&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;다운로드&lt;/p&gt;
&lt;p&gt;아래 링크에서 최신 버전을 다운로드 받는다.&amp;nbsp; 현재는 역시 github 으로 이동한다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://code.google.com/p/webgl-globe/downloads/list&quot;&gt;http://code.google.com/p/webgl-globe/downloads/list&lt;/a&gt;/&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;사용법&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/ajUmb8E8MBA&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;WebGL의 github에 따르면 WebGL의 데이터형식 Data Format은 이렇다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;687&quot; height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bu39Jg/btqBNjvtmNo/zSvPznsvQSheCP5szuuRVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bu39Jg/btqBNjvtmNo/zSvPznsvQSheCP5szuuRVk/img.png&quot; data-alt=&quot;Fig 1. WebGL 의 Data Format&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bu39Jg/btqBNjvtmNo/zSvPznsvQSheCP5szuuRVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbu39Jg%2FbtqBNjvtmNo%2FzSvPznsvQSheCP5szuuRVk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;687&quot; height=&quot;290&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 1. WebGL 의 Data Format&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;또한 사용에 관한 JavaScript 코드도 소개되어 있다.&lt;br /&gt;이제 서버에 이 WebGL을 다운 받아보자. 리눅스[우분투] 서버에서 다운 받는 내용이 동영상에 들어있음.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;wget&lt;/b&gt; &lt;i&gt;다운로드링크&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;압축파일이기 때문에 압축을 풀어야 한다. unzip 압축해제 프로그램이다. 설치는 다음과 같다.&lt;br /&gt;&lt;b&gt;sudo apt-get install unzip&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;압축해제: &lt;b&gt;unzip webgl-globe.zip&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;주요폴더내용&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;globe: 주요파일&lt;br /&gt;globe-search : 예제파일&lt;/p&gt;
&lt;p&gt;cd globe&lt;/p&gt;
&lt;p&gt;index.html 이 있음. 여기에 globe를 구동하고 있는 모든 내용이 다 들어있는 샘플이 있다. population909500.json 파일안에, [현재 index.html 이 전세계 인구를 연도별로 보여주는 샘플이 들어있는데,] 예제에 대한 실제 데이터가 들어가 있다. 즉 index.html 이 이 jason파일의 내용을 읽어 시각화를 해 화면에 보여주게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제 이 index.html에 접속해보고 제대로 작동하지 않으면 개발자도구/Network를 열어보자. Network 탭은 현재 접속한 웹페이지와 웹브라우저 사이에 일어나는 Network 상의 데이터 흐름을 보여준다. 그리고 여기서 붉은 색표시가 된 곳을 찾아 문제를 해결한다.&lt;/p&gt;
&lt;p&gt;실제로 다운로드 받아 서버에 설치하고 접속해본 결과 지구본이 나타나지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;New-Tab-Google-Chrome-2020-02-05-17-38-47.gif&quot; data-origin-width=&quot;1344&quot; data-origin-height=&quot;1080&quot; width=&quot;727&quot; height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MrwoW/btqBMNX9FJ0/jf0yoK0ADyNy6rtQzrKGbK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MrwoW/btqBMNX9FJ0/jf0yoK0ADyNy6rtQzrKGbK/img.gif&quot; data-alt=&quot;Fig 2. 제대로 동작하지 않는 globe&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MrwoW/btqBMNX9FJ0/jf0yoK0ADyNy6rtQzrKGbK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/MrwoW/btqBMNX9FJ0/jf0yoK0ADyNy6rtQzrKGbK/img.gif&quot; data-filename=&quot;New-Tab-Google-Chrome-2020-02-05-17-38-47.gif&quot; data-origin-width=&quot;1344&quot; data-origin-height=&quot;1080&quot; width=&quot;727&quot; height=&quot;584&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 2. 제대로 동작하지 않는 globe&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btXITg/btqBLjcoysI/IfEqQH5QiHBbC8MtMUdf41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btXITg/btqBLjcoysI/IfEqQH5QiHBbC8MtMUdf41/img.png&quot; data-alt=&quot;Fig 3. 빨간 색으로 문제가 있는 부분들을 나타냄&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btXITg/btqBLjcoysI/IfEqQH5QiHBbC8MtMUdf41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtXITg%2FbtqBLjcoysI%2FIfEqQH5QiHBbC8MtMUdf41%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 3. 빨간 색으로 문제가 있는 부분들을 나타냄&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이 문제는 path에 문제가 있기 때문에 발생하게 되는데, 압축해제한 폴더와 파일들을 어떤 다른 폴더를 만들어 저장하면 path가 달라져 저렇게 오류가 발생하게 되는 것이다. 따라서 그냥 홈페이지 폴더 안에 그냥 놓이도록 하면 바로 해결된다.&lt;/p&gt;
&lt;p&gt;동영상에서는 index.html의 /globe/로 되어있는 경로를 모두 ./으로 수정하고 있다.&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/DQQpDwWhkYM&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;구동&lt;/p&gt;
&lt;p&gt;ajax를 이용해서 데이터를 가져온 후에 이것을 globe 객체에 입력한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1580886967878&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Where to put the globe?
var container = document.getElementById( 'container' );
// Make the globe
var globe = new DAT.Globe( container );
// We're going to ask a file for the JSON data.
xhr = new XMLHttpRequest();
// Where do we get the data?
xhr.open( 'GET', 'myjson.json', true );
// What do we do when we have it?
xhr.onreadystatechange = function() {
  // If we've received the data
  if ( xhr.readyState === 4 &amp;amp;&amp;amp; xhr.status === 200 ) {
      // Parse the JSON
      var data = JSON.parse( xhr.responseText );
      // Tell the globe about your JSON data
      for ( i = 0; i &amp;lt; data.length; i++ ) {
        globe.addData( data[i][1], 'magnitude', data[i][0] );
      }
      // Create the geometry
      globe.createPoints();
      // Begin animation
      globe.animate();
    }
  }
};
// Begin request
xhr.send( null );&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;데이터 포맷&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;데이터 포멧은 json으로 아래와 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;series : 지리에 대한 데이터가 여러개의 셋트로 되어 있을 경우 사용한다. 예를 들어 년도별 자료가 있다면 년도 별로 셋트가 구성되는 것이다.&lt;/li&gt;
&lt;li&gt;latitude : 위도&lt;/li&gt;
&lt;li&gt;longitude : 경도&amp;nbsp;&lt;/li&gt;
&lt;li&gt;magnitude : 데이터로 최대 1.2를 넘으면 검은색으로 표시된다. 여기가 실제 데이터이다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1580887003664&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var data = [
  [
    'seriesA', [ latitude, longitude, magnitude, latitude, longitude, magnitude, ... ]
  ],
  [
    'seriesB', [ latitude, longitude, magnitude, latitude, longitude, magnitude, ... ]
  ]
];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이제 index.html을 text.html로 하나 복사하고, 데이터를 새로 만들어 테스트를 한 번 진행해볼 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;브라우저에서 열면 열리지 않는데 Fig 4와 같이 개발자도구/Network 탭에서 파일들을 확인 한 후 경로를 변경해준다.&lt;/p&gt;
&lt;p&gt;여기서 모든 경로들은 text.html 에서 수정이 가능한데, world.jpg는 text.html에 없다. 이것을 읽지 못하면 실행은 확인할 수 있으나 지도가 표시되지 않고 밋밋한 구에 막대기만 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LFMsu/btqBIHkYvi0/7qEsjTwu5dwu8BrsTFzKy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LFMsu/btqBIHkYvi0/7qEsjTwu5dwu8BrsTFzKy0/img.png&quot; data-alt=&quot;Fig 4. 지도가 없는 그냥 구모양이다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LFMsu/btqBIHkYvi0/7qEsjTwu5dwu8BrsTFzKy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLFMsu%2FbtqBIHkYvi0%2F7qEsjTwu5dwu8BrsTFzKy0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 4. 지도가 없는 그냥 구모양이다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGU84G/btqBNkVDHFY/ArvhR9BALhGODI5F8LV88K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGU84G/btqBNkVDHFY/ArvhR9BALhGODI5F8LV88K/img.png&quot; data-alt=&quot;Fig 5. world.jpg를 읽지 못했고 Initiator를 보면 three.min.js 259행에서 문제가 보인다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGU84G/btqBNkVDHFY/ArvhR9BALhGODI5F8LV88K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGU84G%2FbtqBNkVDHFY%2FArvhR9BALhGODI5F8LV88K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 5. world.jpg를 읽지 못했고 Initiator를 보면 three.min.js 259행에서 문제가 보인다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;여기서 보여주는 행번호는 윈도우에서는 cr과 crlf 의 차이로 인해 행번호가 맞지 않는 것 같다. 그리하여 Console에서 추적해보겠다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr36gW/btqBMNjKfN2/tikKIOK4KRoK98yJxX7PRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr36gW/btqBMNjKfN2/tikKIOK4KRoK98yJxX7PRK/img.png&quot; data-alt=&quot;Fig 6. 우클릭하면 world.jpg를 읽어들이는 부분들이 보인다. 하나씩 쫓아가 본다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cr36gW/btqBMNjKfN2/tikKIOK4KRoK98yJxX7PRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr36gW%2FbtqBMNjKfN2%2FtikKIOK4KRoK98yJxX7PRK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 6. 우클릭하면 world.jpg를 읽어들이는 부분들이 보인다. 하나씩 쫓아가 본다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;three.min.js:259 의 내용이 이렇게나 긴데, 아무리 찾아봐도 world.jpg는 안보인다.&lt;/p&gt;
&lt;p&gt;THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(a,b,c,d){var&amp;nbsp;e=this,f=e.cache.get(a);if(void&amp;nbsp;0!==f)b(f);else&amp;nbsp;return&amp;nbsp;f=document.createElement(&quot;img&quot;),void&amp;nbsp;0!==b&amp;amp;&amp;amp;f.addEventListener(&quot;load&quot;,function(c){e.cache.add(a,this);b(this);e.manager.itemEnd(a)},!1),void&amp;nbsp;0!==c&amp;amp;&amp;amp;f.addEventListener(&quot;progress&quot;,function(a){c(a)},!1),void&amp;nbsp;0!==d&amp;amp;&amp;amp;f.addEventListener(&quot;error&quot;,function(a){d(a)},!1),void&amp;nbsp;0!==this.crossOrigin&amp;amp;&amp;amp;(f.crossOrigin=this.crossOrigin),f.src=a,e.manager.itemStart(a),f},setCrossOrigin:function(a){this.crossOrigin=&lt;/p&gt;
&lt;p&gt;짱 긴 놈인데 prototype 프로퍼티에 { } 객체를 대입하고 있다. world.jpg를 찾을 길은 묘연하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/831YR/btqBNkOUEnP/KIe5ulapRY7la3sQVF6nVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/831YR/btqBNkOUEnP/KIe5ulapRY7la3sQVF6nVK/img.png&quot; data-alt=&quot;Fig 7. three.min.js:259 의 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/831YR/btqBNkOUEnP/KIe5ulapRY7la3sQVF6nVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F831YR%2FbtqBNkOUEnP%2FKIe5ulapRY7la3sQVF6nVK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 7. three.min.js:259 의 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;이건 three.min.js:616 의 내용이다.&amp;nbsp;&lt;br /&gt;THREE.ImageUtils={crossOrigin:void&amp;nbsp;0,loadTexture:function(a,b,c,d){var&amp;nbsp;e=new&amp;nbsp;THREE.ImageLoader;e.crossOrigin=this.crossOrigin;var&amp;nbsp;f=new&amp;nbsp;THREE.Texture(void&amp;nbsp;0,b);e.load(a,function(a){f.image=a;f.needsUpdate=!0;c&amp;amp;&amp;amp;c(f)},void&amp;nbsp;0,function(a){d&amp;amp;&amp;amp;d(a)});f.sourceFile=a;return&amp;nbsp;f},loadTextureCube:function(a,b,c,d){var&amp;nbsp;e=new&amp;nbsp;THREE.ImageLoader;e.crossOrigin=this.crossOrigin;var&amp;nbsp;f=new&amp;nbsp;THREE.CubeTexture([],b);f.flipY=!1;var&amp;nbsp;g=0;b=function(b){e.load(a[b],function(a){f.images[b]=a;g+=1;6===g&amp;amp;&amp;amp;(f.needsUpdate=!0,c&amp;amp;&amp;amp; &lt;br /&gt;이것을 indent 정리하면 대략 이렇다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZQMkA/btqBIHL3faZ/PdyIU1KwJkAmkFd3I52nM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZQMkA/btqBIHL3faZ/PdyIU1KwJkAmkFd3I52nM0/img.png&quot; data-alt=&quot;Fig 8. three.min.js:616 의 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZQMkA/btqBIHL3faZ/PdyIU1KwJkAmkFd3I52nM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZQMkA%2FbtqBIHL3faZ%2FPdyIU1KwJkAmkFd3I52nM0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;701&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 8. three.min.js:616 의 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이번엔 globe.js 의 내용인데 여기에 world.jpg 가 보인다. 앞에 imgDir 변수를 붙이는 걸로 미루어 path 인듯.&lt;br /&gt;uniforms['texture'].value&amp;nbsp;=&amp;nbsp;THREE.ImageUtils.loadTexture(&lt;span style=&quot;background-color: #f6e199;&quot;&gt;imgDir&lt;/span&gt;+'&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;world.jpg&lt;/b&gt;&lt;/span&gt;');&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;imageblock&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PoQAO/btqBNNJ5k58/VtMVQkdpC66xNw0YXQZ82K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PoQAO/btqBNNJ5k58/VtMVQkdpC66xNw0YXQZ82K/img.png&quot; data-alt=&quot;data-origin-width=&amp;amp;quot;0&amp;amp;quot; data-origin-height=&amp;amp;quot;0&amp;amp;quot; width=&amp;amp;quot;606&amp;amp;quot; height=&amp;amp;quot;582&amp;amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PoQAO/btqBNNJ5k58/VtMVQkdpC66xNw0YXQZ82K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPoQAO%2FbtqBNNJ5k58%2FVtMVQkdpC66xNw0YXQZ82K%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;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;경로를 수정한 후 reload 해보면 지도가 나타난다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btUioK/btqBJ7Q3XzE/toyX3EMzRsyUQc2Z35KvG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btUioK/btqBJ7Q3XzE/toyX3EMzRsyUQc2Z35KvG1/img.png&quot; data-alt=&quot;Fig 10. 지도가 보인다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btUioK/btqBJ7Q3XzE/toyX3EMzRsyUQc2Z35KvG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtUioK%2FbtqBJ7Q3XzE%2FtoyX3EMzRsyUQc2Z35KvG1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 10. 지도가 보인다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;world.jpg&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQLyUU/btqBLi5OcID/Q7yJFIkklzbksZO6YjDVH0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQLyUU/btqBLi5OcID/Q7yJFIkklzbksZO6YjDVH0/img.jpg&quot; data-alt=&quot;Fig 11. 이것이 구에 씌워지다니-o-&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQLyUU/btqBLi5OcID/Q7yJFIkklzbksZO6YjDVH0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQLyUU%2FbtqBLi5OcID%2FQ7yJFIkklzbksZO6YjDVH0%2Fimg.jpg&quot; data-filename=&quot;world.jpg&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1024&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 11. 이것이 구에 씌워지다니-o-&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이번에 data 포맷에 따라 .json 파일도 바꿔볼 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;687&quot; height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ERDwj/btqBJf9BLrn/vZBuVFjngXOUKsAU0bkN9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ERDwj/btqBJf9BLrn/vZBuVFjngXOUKsAU0bkN9k/img.png&quot; data-alt=&quot;Fig 12. 저 파일을 새로운 데이터가 있는 다른 파일로 대체한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ERDwj/btqBJf9BLrn/vZBuVFjngXOUKsAU0bkN9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FERDwj%2FbtqBJf9BLrn%2FvZBuVFjngXOUKsAU0bkN9k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;687&quot; height=&quot;300&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 12. 저 파일을 새로운 데이터가 있는 다른 파일로 대체한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;400&quot; height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJdNVA/btqBIIxrU9o/jGa0lNbhOufsWBuHkRIrS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJdNVA/btqBIIxrU9o/jGa0lNbhOufsWBuHkRIrS1/img.png&quot; data-alt=&quot;Fig 13. test.json 파일을 만들어 대체, 쌍따옴표를 써야 함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJdNVA/btqBIIxrU9o/jGa0lNbhOufsWBuHkRIrS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJdNVA%2FbtqBIIxrU9o%2FjGa0lNbhOufsWBuHkRIrS1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;400&quot; height=&quot;316&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 13. test.json 파일을 만들어 대체, 쌍따옴표를 써야 함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;WebGL-Globe-Google-Chrome-2020-02-05-23-13-08.gif&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5WYpP/btqBLHjZkYH/uHrRKDNBM1A7IcIyFmyDZ0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5WYpP/btqBLHjZkYH/uHrRKDNBM1A7IcIyFmyDZ0/img.gif&quot; data-alt=&quot;Fig 14&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5WYpP/btqBLHjZkYH/uHrRKDNBM1A7IcIyFmyDZ0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/5WYpP/btqBLHjZkYH/uHrRKDNBM1A7IcIyFmyDZ0/img.gif&quot; data-filename=&quot;WebGL-Globe-Google-Chrome-2020-02-05-23-13-08.gif&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;1080&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 14&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;series 쓰는 것을 원치 않는다면 globe-search 폴더에 있는 index.html 을 사용해도 되며 코드를 보고 수정해서 사용할 수도 있다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;참고&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;구글은 WebGL이라는 새로운 기술에 대한 관심을 환기하기 위해서 이 프로젝트를 시작했다. 아래 URL을 방문하면 WebGL과 관련한 다양한 프로젝트를 열람 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.chromeexperiments.com/tag/webgl/&quot;&gt;http://www.chromeexperiments.com/tag/webgl/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;chapt2&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;2. TimeLineJS&lt;/h1&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;TimelineJS란?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/4AHkZZc0czU&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;시간의 흐름에 따른 사건들을 네비게이션 할 수 있게 도와주는 도구&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;홈페이지&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://timeline.verite.co/&quot;&gt;http://timeline.verite.co/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;현재는 사이트가 바뀐 듯 하다. &lt;a href=&quot;http://timeline.knightlab.com/&quot;&gt;timeline.knightlab.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;미리보기도 제대로 작동하지 않는다. 홈페이지에는 구글 스프레드 시트 접근에서 예상치 못한 오류가 발생해 작동이 멈췄다는 메시지가 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uSLH0/btqBM73lVLK/SNKZNg8F9ZLQ5gP5MimNq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uSLH0/btqBM73lVLK/SNKZNg8F9ZLQ5gP5MimNq1/img.png&quot; data-alt=&quot;Fig 15&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uSLH0/btqBM73lVLK/SNKZNg8F9ZLQ5gP5MimNq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuSLH0%2FbtqBM73lVLK%2FSNKZNg8F9ZLQ5gP5MimNq1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 15&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;미리보기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://embed.verite.co/timeline/?source=0AvxBIrgQdgK5dEJ6R1FtbEtTc2JnQjczQjA0VkN1LWc&amp;amp;font=Bevan-PotanoSans&amp;amp;maptype=toner&amp;amp;lang=kr&amp;amp;width=640&amp;amp;height=600&quot;&gt;타임라인 보기&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;google spreadsheet에서 작성된 데이터를 이용해서 타임라인을 만든다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;json을 이용해서 타임라인을 만들수도 있다. json은 프로그래밍이 필요하다. javascript를 어느 정도 알고 있어야 한다. json을 이용하여 좀 더 자유롭게 데이터를 가공할 수 있는 솔루션이 있으면 timelineJS 와 통합할 수 있다.&lt;/li&gt;
&lt;li&gt;무료, 오픈소스&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;데이터 소스&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Timeline JS을 이용해서 타임라인을 만들기 위해서는 Timeline JS에 데이터를 입력해야 하는데 현재는 두가지 방법을 제공하고 있다. 아래를 참조하자.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Google Spreadsheet&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;TimelineJS를 그냥 가볍게, 자신의 블로그나 SNS 등에 붙여서 사용하고 싶다면 구글스프레드시트를 이용하여 데이터형식을 맞춰주면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;구글 스프래드쉬트로 문서를 만들고 약속된 양식에 따라서 데이터를 입력하면 Timeline JS가 이 데이터를 분석해서 타임라인을 만들어준다. 데이터 형식은 아래와 같다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;구글 스프래드쉬트를 이용하기 위해서는 문서를 공개로 해야하고, 메뉴 상에서 파일 &amp;gt; 웹에 게시를 통해서 만들어진 문서의 URL을 사용해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.3255%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1&lt;/span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Start Date&lt;/td&gt;
&lt;td style=&quot;width: 11.9768%;&quot;&gt;필수&lt;/td&gt;
&lt;td style=&quot;width: 65.6977%;&quot;&gt;시작시간, 형식 : 월/일/년 시:분:초&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.3255%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;2&lt;/span&gt;.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;End Date&lt;/td&gt;
&lt;td style=&quot;width: 11.9768%;&quot;&gt;선택&lt;/td&gt;
&lt;td style=&quot;width: 65.6977%;&quot;&gt;종료시간, 시작시간과 형식 같음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.3255%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;3&lt;/span&gt;.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Headline&lt;/td&gt;
&lt;td style=&quot;width: 11.9768%;&quot;&gt;필수&lt;/td&gt;
&lt;td style=&quot;width: 65.6977%;&quot;&gt;제목&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.3255%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;4&lt;/span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Text&lt;/td&gt;
&lt;td style=&quot;width: 11.9768%;&quot;&gt;옵션&lt;/td&gt;
&lt;td style=&quot;width: 65.6977%;&quot;&gt;본문&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.3255%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;5&lt;/span&gt;.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Media&lt;/td&gt;
&lt;td style=&quot;width: 11.9768%;&quot;&gt;옵션&lt;/td&gt;
&lt;td style=&quot;width: 65.6977%;&quot;&gt;미디어, 아래의 서비스들을 삽입 할 수 있다.
&lt;ul&gt;
&lt;li&gt;youtube&lt;/li&gt;
&lt;li&gt;vimeo&lt;/li&gt;
&lt;li&gt;soundcloud&lt;/li&gt;
&lt;li&gt;dailymotion&lt;/li&gt;
&lt;li&gt;instagram&lt;/li&gt;
&lt;li&gt;twit pic&lt;/li&gt;
&lt;li&gt;twitter status&lt;/li&gt;
&lt;li&gt;google plus status&lt;/li&gt;
&lt;li&gt;wikipedia&lt;/li&gt;
&lt;li&gt;image&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.3255%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;6&lt;/span&gt;.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Media Credit&lt;/td&gt;
&lt;td style=&quot;width: 11.9768%;&quot;&gt;옵션&lt;/td&gt;
&lt;td style=&quot;width: 65.6977%;&quot;&gt;미디어에 대한 출처표시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.3255%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;7&lt;/span&gt;.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Media Caption&lt;/td&gt;
&lt;td style=&quot;width: 11.9768%;&quot;&gt;옵션&lt;/td&gt;
&lt;td style=&quot;width: 65.6977%;&quot;&gt;미디어에 대한 자막표시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.3255%;&quot;&gt;Media Thumbnail&lt;/td&gt;
&lt;td style=&quot;width: 11.9768%;&quot;&gt;옵션&lt;/td&gt;
&lt;td style=&quot;width: 65.6977%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.3255%;&quot;&gt;Type&lt;/td&gt;
&lt;td style=&quot;width: 11.9768%;&quot;&gt;옵션&lt;/td&gt;
&lt;td style=&quot;width: 65.6977%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.3255%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;8&lt;/span&gt;.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Tag&lt;/td&gt;
&lt;td style=&quot;width: 11.9768%;&quot;&gt;옵션&lt;/td&gt;
&lt;td style=&quot;width: 65.6977%;&quot;&gt;항목에 대한 분류로 총 6개까지 표시된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;위&lt;/span&gt;의 표에서 붉은색 숫자는 아래 이미지에 해당한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D50lj/btqBLkP7akN/MaJWAPXsfOcc3Rzd8iVeKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D50lj/btqBLkP7akN/MaJWAPXsfOcc3Rzd8iVeKK/img.png&quot; data-alt=&quot;Fig 16. TimeLine의 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D50lj/btqBLkP7akN/MaJWAPXsfOcc3Rzd8iVeKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD50lj%2FbtqBLkP7akN%2FMaJWAPXsfOcc3Rzd8iVeKK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 16. TimeLine의 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a href=&quot;http://timeline.knightlab.com/&quot;&gt;timeline.knightlab.com/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;142&quot; height=&quot;161&quot;&gt;&lt;a href=&quot;http://timeline.knightlab.com/&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddIfPd/btqBNjJPYdP/1hg0OcHt4QoY0nSmRowVB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddIfPd%2FbtqBNjJPYdP%2F1hg0OcHt4QoY0nSmRowVB0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;142&quot; height=&quot;161&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;/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;홈페이지를 아래로 내리면 구글스프레드시트를 이용한 방법이 순서대로 소개되어 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ttQKg/btqBJeCShtN/wC1zJ2MunnGFs2kK8KiW81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ttQKg/btqBJeCShtN/wC1zJ2MunnGFs2kK8KiW81/img.png&quot; data-alt=&quot;Fig 17. 홈페이지에 타임라인을 만드는 방법 help section 이 자세히 나와 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ttQKg/btqBJeCShtN/wC1zJ2MunnGFs2kK8KiW81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FttQKg%2FbtqBJeCShtN%2FwC1zJ2MunnGFs2kK8KiW81%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 17. 홈페이지에 타임라인을 만드는 방법 help section 이 자세히 나와 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;먼저 Spreadsheet Template를 복사하여 구글드라이브에서 스프레드시트에 원하는 내용을 작성한 후, File/Publish to Web 하여 웹발행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p7tcY/btqBM64r5NE/kKizUU1TMQkP56v94X2q51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p7tcY/btqBM64r5NE/kKizUU1TMQkP56v94X2q51/img.png&quot; data-alt=&quot;Fig 18 템플릿에 따라 내용을 작성한 후 File/Publish to th Web 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p7tcY/btqBM64r5NE/kKizUU1TMQkP56v94X2q51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp7tcY%2FbtqBM64r5NE%2FkKizUU1TMQkP56v94X2q51%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 18 템플릿에 따라 내용을 작성한 후 File/Publish to th Web 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;666&quot; height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/STpQd/btqBLHSkS35/hgKS6n5bQcTSmkEuT4sQK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/STpQd/btqBLHSkS35/hgKS6n5bQcTSmkEuT4sQK0/img.png&quot; data-alt=&quot;Fig 19. Publish를 한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/STpQd/btqBLHSkS35/hgKS6n5bQcTSmkEuT4sQK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSTpQd%2FbtqBLHSkS35%2FhgKS6n5bQcTSmkEuT4sQK0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;666&quot; height=&quot;490&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 19. Publish를 한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;666&quot; height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbsyte/btqBM7v4B5S/W7QVK9G9wEDvM29ruKDdaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbsyte/btqBM7v4B5S/W7QVK9G9wEDvM29ruKDdaK/img.png&quot; data-alt=&quot;Fig 20. 이 주소를 복사하는 것이 아니라&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbsyte/btqBM7v4B5S/W7QVK9G9wEDvM29ruKDdaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbsyte%2FbtqBM7v4B5S%2FW7QVK9G9wEDvM29ruKDdaK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;666&quot; height=&quot;646&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 20. 이 주소를 복사하는 것이 아니라&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MwOf9/btqBNLF07Aj/aziDRmXBnhuIQpS9pM6nt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MwOf9/btqBNLF07Aj/aziDRmXBnhuIQpS9pM6nt0/img.png&quot; data-alt=&quot;Fig 21. 이 주소를 복사한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MwOf9/btqBNLF07Aj/aziDRmXBnhuIQpS9pM6nt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMwOf9%2FbtqBNLF07Aj%2FaziDRmXBnhuIQpS9pM6nt0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 21. 이 주소를 복사한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;831&quot; height=&quot;777&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pGAFP/btqBLkC5sn8/FTyHze3CyjuFRKoUkXgJc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pGAFP/btqBLkC5sn8/FTyHze3CyjuFRKoUkXgJc1/img.png&quot; data-alt=&quot;Fig 22. 구글스프레드시트의 주소를 3에 입력하면 4와 5의 주소가 생성된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pGAFP/btqBLkC5sn8/FTyHze3CyjuFRKoUkXgJc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpGAFP%2FbtqBLkC5sn8%2FFTyHze3CyjuFRKoUkXgJc1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;831&quot; height=&quot;777&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 22. 구글스프레드시트의 주소를 3에 입력하면 4와 5의 주소가 생성된다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;iframe src=&quot;https://cdn.knightlab.com/libs/timeline3/latest/embed/index.html?source=1DtYPZxcCccckQyb3L-CPg1SLn7tEz13-AZaOhTjtwJA&amp;amp;font=Default&amp;amp;lang=en&amp;amp;initial_zoom=2&amp;amp;height=650&quot; width=&quot;100%&quot; height=&quot;650&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://timeline.knightlab.com/docs/options.html&quot;&gt;https://timeline.knightlab.com/docs/options.html&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이곳을 방문하면 구글스프레드시트로 하는 경우 타임라인의 각종 옵션들을 선택하는 방법이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;JSON&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;자신이 진행하고 있는 프로젝트, 웹애플리케이션과 TimeLineJS를 통합하고자 한다면 이를 우선 다운 받아 자신의 사이트에 삽입해야 한다. TimeLineJS의 github 에서 다운 받아 자신의 홈페이지 폴더에 위치하도록 한다.&lt;/p&gt;
&lt;p&gt;Timeline JS는 프로그래밍적으로 제어하기 위해서는 소스코드를 다운받아서 이것을 프로그래밍적으로 제어해야 한다. 이것을 위해서는 Timeline JS의 소스코드를 다운로드 받아야 한다. 아래 링크를 방문해보자. 하지만 현재 이 프로젝트는 더 이상 개발되지 않고 있으며,&amp;nbsp; KnightLab은 구버전의 TimeLineJS에 대해서는 일체의 개발을 멈추고 새로운 TimeLineJS3 를 제작하였다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/VeriteCo/TimelineJS&quot;&gt;https://github.com/VeriteCo/TimelineJS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;프로그래밍적으로 Timeline JS를 제어하기 위해서는 HTML, CSS, JavaScript에 대한 기본적인 지식과 JSON이라는 데이터 형식을 알아야 한다. 이에 대한 지식은 생활코딩 웹서비스 만들기 편을 통해서 얻을 수 있다. 이것을 참고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://opentutorials.org/course/488&quot;&gt;http://opentutorials.org/course/488&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkFQoT/btqBJ7xiRo9/HrlYZ08GH064MKkAa3GPMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkFQoT/btqBJ7xiRo9/HrlYZ08GH064MKkAa3GPMk/img.png&quot; data-alt=&quot;Fig 23. KnightLab은 TimelineJS3 라는 새버전을 만들었다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkFQoT/btqBJ7xiRo9/HrlYZ08GH064MKkAa3GPMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkFQoT%2FbtqBJ7xiRo9%2FHrlYZ08GH064MKkAa3GPMk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 23. KnightLab은 TimelineJS3 라는 새버전을 만들었다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;동영상에서의 설명과는 달리 &lt;a href=&quot;https://github.com/NUKnightLab/TimelineJS3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Fig 23의 github 주소&lt;/a&gt;에서 다운로드 받아 설치하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tYd35/btqBL8WzdIN/Foj8p80klsaJPXvyEkQK31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tYd35/btqBL8WzdIN/Foj8p80klsaJPXvyEkQK31/img.png&quot; data-alt=&quot;Fig 24 TimelineJS3 의 폴더 구조 timeline.html 이 기본파일이다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tYd35/btqBL8WzdIN/Foj8p80klsaJPXvyEkQK31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtYd35%2FbtqBL8WzdIN%2FFoj8p80klsaJPXvyEkQK31%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 24 TimelineJS3 의 폴더 구조 timeline.html 이 기본파일이다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이런 구조를 가지고 설치되며 complied/timeline.html 을 브라우저에서 열면 타임라인을 볼 수 있다. &lt;a href=&quot;https://github.com/NUKnightLab/TimelineJS3&quot;&gt;https://github.com/NUKnightLab/TimelineJS3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;756&quot; height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B2IYo/btqBLkJ3TPs/Lj8CKAamQ6or4tqMOa29f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B2IYo/btqBLkJ3TPs/Lj8CKAamQ6or4tqMOa29f1/img.png&quot; data-alt=&quot;Fig 25. compiled/timeline.html 의 38행은 TL.Timeline 을 이용하여 타임라인을 넣는 부분이다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B2IYo/btqBLkJ3TPs/Lj8CKAamQ6or4tqMOa29f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB2IYo%2FbtqBLkJ3TPs%2FLj8CKAamQ6or4tqMOa29f1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;756&quot; height=&quot;277&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 25. compiled/timeline.html 의 38행은 TL.Timeline 을 이용하여 타임라인을 넣는 부분이다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;examples 폴더 안에 welcome.json, science.json을 비롯한 적지 않은 예제 json 파일들이 있다. welcome.json 파일은 제대로 작동하지만 science.json은 제대로 작동하지 않았다. 확인 결과 &quot;start_date&quot;가 없어서인데 [모든 컬럼 중 start_date 는 반드시 채워져야 하는 field 임], &quot;start_date&quot;를 넣어주면 타임라인을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;삽입할 수 있는 Media Type에 관한 정보는 &lt;a href=&quot;https://timeline.knightlab.com/docs/media-types.html&quot;&gt;https://timeline.knightlab.com/docs/media-types.html&lt;/a&gt; 에 있다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Image&lt;/b&gt;[&lt;span style=&quot;background-color: #ffc9af; color: #ee2323;&quot;&gt;.jpg&lt;/span&gt;, &lt;span style=&quot;color: #ee2323; background-color: #ffc1c8;&quot;&gt;.gif&lt;/span&gt;, &lt;span style=&quot;color: #ee2323; background-color: #ffc1c8;&quot;&gt;.png&lt;/span&gt;, &lt;span style=&quot;color: #ee2323; background-color: #ffc1c8;&quot;&gt;.jpeg&lt;/span&gt;], &lt;b&gt;Online Videos&lt;/b&gt;[Vimeo, DailyMotion, YouTube], &lt;b&gt;Video&lt;/b&gt;[&lt;span style=&quot;color: #ee2323; background-color: #ffc1c8;&quot;&gt;.mp4&lt;/span&gt;], Audio[&lt;span style=&quot;color: #ee2323; background-color: #ffc1c8;&quot;&gt;.mp3&lt;/span&gt;, &lt;span style=&quot;color: #ee2323; background-color: #ffc1c8;&quot;&gt;.m4a&lt;/span&gt;, &lt;span style=&quot;color: #ee2323; background-color: #ffc1c8;&quot;&gt;.wav&lt;/span&gt;], &lt;b&gt;SoundCloud&lt;/b&gt;, &lt;b&gt;Spotify&lt;/b&gt;, &lt;b&gt;Twitter&lt;/b&gt;, &lt;b&gt;Google Maps&lt;/b&gt;, &lt;b&gt;Instagram&lt;/b&gt;, &lt;b&gt;Flickr&lt;/b&gt;, &lt;b&gt;Imgur&lt;/b&gt;, &lt;b&gt;DocumentCloud&lt;/b&gt;, &lt;b&gt;Wikipedia&lt;/b&gt;, &lt;b&gt;Storify&lt;/b&gt;, &lt;b&gt;iframe&lt;/b&gt;, &lt;b&gt;Blockquote&lt;/b&gt;, &lt;b&gt;Wistia&lt;/b&gt;, &lt;b&gt;Embedly&lt;/b&gt; 등을 삽입할 수 있다.&lt;/p&gt;
&lt;p&gt;또한 TimeLine의 속성을 지정할 수 있는데, Fig 25 의 38행의 TL.Timeline 의 세번째 인자 값을 이용한다.&lt;/p&gt;
&lt;p&gt;TL.Timeline의 두 번째 인자는 json 데이터 파일이고, 세번째 인자가 속성을 지정하는 { }로 된 객체이다.&lt;/p&gt;
&lt;p&gt;이곳에 key 값과 value를 지정하여 속성을 주는데 &lt;a href=&quot;https://timeline.knightlab.com/docs/options.html&quot;&gt;https://timeline.knightlab.com/docs/options.html&lt;/a&gt; 에 소개된 내용을 참고하면 된다. 구글스프레드시트를 이용하는 경우 URL에서 속성을 어떻게 주는지에 대해서 설명하고 있는데 json 형식의 데이터에도 같은 속성을 지정할 수 있다. 예를 들어 Fig 25 의 40행에 이런 내용을 삽입하면 0부터 시작되는 시작 슬라이드의 번호를 정할 수 있는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEbIIy/btqBODAYMjU/nFWSgIWmo18iaBpN5EQxH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEbIIy/btqBODAYMjU/nFWSgIWmo18iaBpN5EQxH1/img.png&quot; data-alt=&quot;Fig 26. 40행에서 시작슬라이드 번호를 1번으로 함. 즉 2번째 슬라이드가 표시된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEbIIy/btqBODAYMjU/nFWSgIWmo18iaBpN5EQxH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEbIIy%2FbtqBODAYMjU%2FnFWSgIWmo18iaBpN5EQxH1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 26. 40행에서 시작슬라이드 번호를 1번으로 함. 즉 2번째 슬라이드가 표시된다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이외에도 여러 가지 속성을 지정할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdi2VP/btqBODAYQ9p/7kYvCvlCNQQAjHvpCptAoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdi2VP/btqBODAYQ9p/7kYvCvlCNQQAjHvpCptAoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdi2VP/btqBODAYQ9p/7kYvCvlCNQQAjHvpCptAoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdi2VP%2FbtqBODAYQ9p%2F7kYvCvlCNQQAjHvpCptAoK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rknFy/btqBLHZnmZe/7RmQQXgJCTDwcqxPjKfCe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rknFy/btqBLHZnmZe/7RmQQXgJCTDwcqxPjKfCe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rknFy/btqBLHZnmZe/7RmQQXgJCTDwcqxPjKfCe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrknFy%2FbtqBLHZnmZe%2F7RmQQXgJCTDwcqxPjKfCe0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLSO5t/btqBLkDkLq1/OyTvRfC1clPONZ92d9Iosk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLSO5t/btqBLkDkLq1/OyTvRfC1clPONZ92d9Iosk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLSO5t/btqBLkDkLq1/OyTvRfC1clPONZ92d9Iosk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLSO5t%2FbtqBLkDkLq1%2FOyTvRfC1clPONZ92d9Iosk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;초기 데이터로 사용된 examples/welcome.json의 내용을 잠깐 살펴보면서 데이터가 어떤 모양으로 이루어졌는지를 스스로 생각해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sVxGr/btqBL9anzMv/InDfEku8KFBJgbDviJLNOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sVxGr/btqBL9anzMv/InDfEku8KFBJgbDviJLNOk/img.png&quot; data-alt=&quot;Fig 27&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sVxGr/btqBL9anzMv/InDfEku8KFBJgbDviJLNOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsVxGr%2FbtqBL9anzMv%2FInDfEku8KFBJgbDviJLNOk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 27&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;json 파일 포맷에 관한 내용은 여기 &lt;a href=&quot;https://timeline.knightlab.com/docs/json-format.html&quot;&gt;https://timeline.knightlab.com/docs/json-format.html&lt;/a&gt;&amp;nbsp;에 자세히 소개되어 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cA6ych/btqBMODHg54/2zhQBMESXGoJwgrhw1yrIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cA6ych/btqBMODHg54/2zhQBMESXGoJwgrhw1yrIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cA6ych/btqBMODHg54/2zhQBMESXGoJwgrhw1yrIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcA6ych%2FbtqBMODHg54%2F2zhQBMESXGoJwgrhw1yrIK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf8THq/btqBOrANxVp/KbKduWM2T9TnZowDnTQWQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf8THq/btqBOrANxVp/KbKduWM2T9TnZowDnTQWQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf8THq/btqBOrANxVp/KbKduWM2T9TnZowDnTQWQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf8THq%2FbtqBOrANxVp%2FKbKduWM2T9TnZowDnTQWQk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mviG0/btqBO631rgu/2EDO8ZNjzvJ8gjSgiDVVVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mviG0/btqBO631rgu/2EDO8ZNjzvJ8gjSgiDVVVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mviG0/btqBO631rgu/2EDO8ZNjzvJ8gjSgiDVVVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmviG0%2FbtqBO631rgu%2F2EDO8ZNjzvJ8gjSgiDVVVK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLT65k/btqBM6D7TWp/5naQvaEMLnFhlzYrtidSRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLT65k/btqBM6D7TWp/5naQvaEMLnFhlzYrtidSRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLT65k/btqBM6D7TWp/5naQvaEMLnFhlzYrtidSRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLT65k%2FbtqBM6D7TWp%2F5naQvaEMLnFhlzYrtidSRk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;기타 관련파일에 관한 내용들은 여기 &lt;a href=&quot;https://timeline.knightlab.com/docs/index.html&quot;&gt;https://timeline.knightlab.com/docs/index.html&lt;/a&gt; 를 본다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;779&quot; height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTsTfP/btqBNNjNIZA/m4TKPcDDNjWCAtZJ5Sc3s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTsTfP/btqBNNjNIZA/m4TKPcDDNjWCAtZJ5Sc3s1/img.png&quot; data-alt=&quot;Fig 28. 참조 문서&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTsTfP/btqBNNjNIZA/m4TKPcDDNjWCAtZJ5Sc3s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTsTfP%2FbtqBNNjNIZA%2Fm4TKPcDDNjWCAtZJ5Sc3s1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;779&quot; height=&quot;720&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 28. 참조 문서&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;Technical documentation&lt;/h2&gt;
&lt;p&gt;Go further with Timeline:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://timeline.knightlab.com/docs/media-types.html&quot;&gt;Supported Media Types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://timeline.knightlab.com/docs/json-format.html&quot;&gt;JSON data format reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://timeline.knightlab.com/docs/overriding-styles.html&quot;&gt;Using the TimelineJS CSS selectors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://timeline.knightlab.com/docs/options.html&quot;&gt;Timeline Configuration Options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://timeline.knightlab.com/docs/instantiate-a-timeline.html&quot;&gt;Using TimelineJS in Javascript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;knightlab에서 제공하는 다른 흥미있는 프로젝트들도 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZeA6D/btqBMOqb3Hy/A1RHPFjjI7DSIPqpfYl0g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZeA6D/btqBMOqb3Hy/A1RHPFjjI7DSIPqpfYl0g0/img.png&quot; data-alt=&quot;Fig 29. 프로젝트들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZeA6D/btqBMOqb3Hy/A1RHPFjjI7DSIPqpfYl0g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZeA6D%2FbtqBMOqb3Hy%2FA1RHPFjjI7DSIPqpfYl0g0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 29. 프로젝트들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;JSON에 대한 기본지식은 생활코딩 자바스크립트 수업 중 JSON편에서 얻을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://opentutorials.org/course/49/3473&quot;&gt;http://opentutorials.org/course/49/3473&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;참고&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://timeglider.com/widget/index.php&quot;&gt;http://timeglider.com/widget/index.php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tympanus.net/codrops/2011/12/05/lateral-on-scroll-sliding-with-jquery/&quot;&gt;http://tympanus.net/codrops/2011/12/05/lateral-on-scroll-sliding-with-jquery/&lt;/a&gt;s&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://knightlab.northwestern.edu/projects/&quot;&gt;https://knightlab.northwestern.edu/projects/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;chapt3&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;3. REVEAL.JS&lt;/h1&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/spPypp8OZ2w&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;REVEAL.JS&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hakim.se/&quot;&gt;https://hakim.se/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hakimel?tab=repositories&quot;&gt;https://github.com/hakimel?tab=repositories&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwoVSM/btqBNk93tZu/9ecS2ACfdy4VG81rFd1dWK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwoVSM/btqBNk93tZu/9ecS2ACfdy4VG81rFd1dWK/img.jpg&quot; data-alt=&quot;hakimel 이 친구가 만든 프로젝트가 꽤 된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwoVSM/btqBNk93tZu/9ecS2ACfdy4VG81rFd1dWK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwoVSM%2FbtqBNk93tZu%2F9ecS2ACfdy4VG81rFd1dWK%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;hakimel 이 친구가 만든 프로젝트가 꽤 된다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;순수 웹기술인 HTML, CSS, JavaScript만으로 만들어진 프리젠테이션 도구로 간단한 HTML 코딩만으로 시각적으로 뛰어난 프리젠테이션 [PowerPoint나 Keynote와 같은] 을 만들 수 있고, 발표자 도구와 리모트 제어와 같은 고급 기능도 제공한다. Desktop 화면으로 프리젠테이션을 하고, 프리젠터로 아이폰, 안드로이드 같은 스마트폰을 이용하여 원격으로 제어가 가능하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;홈페이지&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;메뉴얼과 다운로드 받는 주소는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hakimel/reveal.js&quot;&gt;https://github.com/hakimel/reveal.js&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;기본사용법&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;샘플은 index.html은 간단한 slide 2개로만 이루어졌고 동영상에서 소개하는 프리젠테이션은 demo.html이다. 상하좌우 방향키로 제어 가능. 상하는 sub 주제를 다룰 때 사용. ESC는 전체 구조 on/off.&lt;/p&gt;
&lt;p&gt;또한 온라인에서 슬라이드를 만드는 사이트도 &lt;a href=&quot;https://slides.com/&quot;&gt;https://slides.com/&lt;/a&gt; 으로 바뀌었다. &lt;a href=&quot;https://revealjs.com/&quot;&gt;https://revealjs.com/&lt;/a&gt;&amp;nbsp;이 사이트에서는 자신의 서버를 운영할 필요가 없이 다른 사람에게 공유할 수 있는 서비스를 제공함. 로그인 필요.&lt;/p&gt;
&lt;p&gt;다양한 형태의 장면전환 효과 제공.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh52NR/btqBL7jcrSY/iMbHw7x4V3AYwwizeJMkV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh52NR/btqBL7jcrSY/iMbHw7x4V3AYwwizeJMkV1/img.png&quot; data-alt=&quot;Fig 30. 다양한 장면전환 효과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh52NR/btqBL7jcrSY/iMbHw7x4V3AYwwizeJMkV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh52NR%2FbtqBL7jcrSY%2FiMbHw7x4V3AYwwizeJMkV1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 30. 다양한 장면전환 효과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;샘플 페이지인 index.html에서 body 하위의 내용을 제거하고 아래와 같은 구조로 코딩한다. 하나의 화면에 표시된 내용을 section에 기록한다. section 하위에는 또 다른 section이 올 수 있는데 하위 section은 수직으로 장면전환된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNaOQB/btqBNkvoOaZ/XT4toUMKUU2gFpmVGJkhyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNaOQB/btqBNkvoOaZ/XT4toUMKUU2gFpmVGJkhyk/img.png&quot; data-alt=&quot;Fig 31. 제공되는 각종 테마&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNaOQB/btqBNkvoOaZ/XT4toUMKUU2gFpmVGJkhyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNaOQB%2FbtqBNkvoOaZ%2FXT4toUMKUU2gFpmVGJkhyk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 31. 제공되는 각종 테마&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/ROr9UaciW14&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;demo.html을 들여다보면 좀 알 수 있을 듯. 꽤 복잡해보인다. 기본적인 약속은 이렇다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1580999329847&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;reveal&quot;&amp;gt;
    &amp;lt;div class=&quot;slides&quot;&amp;gt;
        &amp;lt;section&amp;gt;   각각의 한장 한장은 section 엘리먼트에 들어간다
        	실제 프리젠테이션들은 여기 위치한다
        &amp;lt;section&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;슬라이드의 제목은 &amp;lt;h1&amp;gt;태그로 되어있으며 &amp;lt;head&amp;gt;태그사이에 css 코드를 삽입해 스타일을 변경할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;544&quot; height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AjDCz/btqBNNqD3hf/MlZ8TqPof2rd82V9SBRa81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AjDCz/btqBNNqD3hf/MlZ8TqPof2rd82V9SBRa81/img.png&quot; data-alt=&quot;Fig 32. h1 태그 style 을 변경할 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AjDCz/btqBNNqD3hf/MlZ8TqPof2rd82V9SBRa81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAjDCz%2FbtqBNNqD3hf%2FMlZ8TqPof2rd82V9SBRa81%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;544&quot; height=&quot;177&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 32. h1 태그 style 을 변경할 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;!important를 지정하면 reveal이 가지고 있는 것보다 우선 순위가 높다. &amp;lt;aside&amp;gt; 태그를 이용하여 화면에 나타나지 않는 메모를 작성하는 것도 가능.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;발표자 도구&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;프리젠테이션 도구들은 발표시간과 현재 발표 내용과 다음 발표 내용을 발표자만 볼 수 있는 기능을 제공한다. 단축키 s를 누르면 이 기능을 웹에서 사용할 수 있다. 이 기능을 사용하면 aside 태그로 작성한 메모도 볼 수 있음.&lt;/p&gt;
&lt;p&gt;수직으로 된 sub 주제는 &amp;lt;section&amp;gt;태그 안에 하위 &amp;lt;section&amp;gt;을 넣어 만들어준다. 자세한 것은 demo.html 참고.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hakimel/reveal.js#full-setup&quot;&gt;https://github.com/hakimel/reveal.js#full-setup&lt;/a&gt; 에서 상세히 소개 하고 있다.&lt;/p&gt;
&lt;p&gt;테마를 바꾸려면 아래와 같이 하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r3yzQ/btqBOs0P1kd/1Ib9j9EtrkkutqbZWGt4vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r3yzQ/btqBOs0P1kd/1Ib9j9EtrkkutqbZWGt4vk/img.png&quot; data-alt=&quot;Fig 33. 테마나 전환방식을 바꿀 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r3yzQ/btqBOs0P1kd/1Ib9j9EtrkkutqbZWGt4vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr3yzQ%2FbtqBOs0P1kd%2F1Ib9j9EtrkkutqbZWGt4vk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 33. 테마나 전환방식을 바꿀 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;각각의 슬라이드마다 다른 장면전환효과를 줄 수도 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ro9TF/btqBL8PZTWL/Wz3siscvP0PQW7I4dDkNaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ro9TF/btqBL8PZTWL/Wz3siscvP0PQW7I4dDkNaK/img.png&quot; data-alt=&quot;Fig 34. 각각의 슬라이드별로 설정을 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ro9TF/btqBL8PZTWL/Wz3siscvP0PQW7I4dDkNaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRo9TF%2FbtqBL8PZTWL%2FWz3siscvP0PQW7I4dDkNaK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 34. 각각의 슬라이드별로 설정을 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hakimel/reveal.js&quot;&gt;https://github.com/hakimel/reveal.js&lt;/a&gt; 에 reveal을 프로그램적으로 제어하기 위한 API를 소개하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;665&quot; height=&quot;936&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dp2ZwD/btqBO634RpV/4JJ2FLpebpwlgDpOZwjaX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dp2ZwD/btqBO634RpV/4JJ2FLpebpwlgDpOZwjaX0/img.png&quot; data-alt=&quot;Fig 35. reveal 의 API&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dp2ZwD/btqBO634RpV/4JJ2FLpebpwlgDpOZwjaX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdp2ZwD%2FbtqBO634RpV%2F4JJ2FLpebpwlgDpOZwjaX0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;665&quot; height=&quot;936&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 35. reveal 의 API&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;demo.html 을 열고 브라우저의 개발자도구의 콘솔에서 위 그림의 함수들을 실행시키면 슬라이드가 작동하는 것을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Multiplexing (원격제어)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;원격으로 프리젠테이션을 제어할 수 있다. 구체적으로는 청중에게 보여줄 화면을 데스크탑에 띄어놓고 발표자는 스마트폰의 화면을 보면서 데스크탑의 프리젠테이션을 제어 할 수 있다. 다음 주소를 방문해서 secret와 socketId를 획득한 후에 이 값을 소스코드에 입력한다. Reveal.initialize의 인자로 전달되는 객체에 아래 내용을 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1580999364026&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;multiplex: {
    id: '3d86709e1c6d671d',
    secret: '13654708940992018697',
    url: 'revealjs.jit.su:80'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;dependencies 배열에 아래와 같이 객체를 추가한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1580999388486&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{ src: '//cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.10/socket.io.min.js', async: true },
{ src: 'plugin/multiplex/client.js', async: true },
{ src: 'plugin/multiplex/master.js', async: true },&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이해를 돕기 위해서 그림을 첨부했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GZrmS/btqBM6qC9FB/79MWYEhkkVJcjuZ0pfB4mk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GZrmS/btqBM6qC9FB/79MWYEhkkVJcjuZ0pfB4mk/img.gif&quot; data-alt=&quot;Fig 36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GZrmS/btqBM6qC9FB/79MWYEhkkVJcjuZ0pfB4mk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/GZrmS/btqBM6qC9FB/79MWYEhkkVJcjuZ0pfB4mk/img.gif&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 36&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;참고&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://opentutorials.org/module/406/3987&quot;&gt;Sublime Text emmet 수업&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://opentutorials.org/course/11&quot;&gt;HTML 수업&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://opentutorials.org/course/11&quot;&gt;CSS 수업&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://opentutorials.org/module/445/3816&quot;&gt;apache 수업&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;chapt4&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;4. bartoszopka&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/bartaz/bartaz.github.com&quot;&gt;https://github.com/bartaz/bartaz.github.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;뭐가 있는지 알 수 없음&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;chapt5&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;5. google chart Tools&lt;/h1&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Google Chart Tools란?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;구글에서 제공하는 차트 서비스다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;홈페이지&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.google.com/chart&quot;&gt;https://developers.google.com/chart&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;제공되는 차트 타입&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/areachart&quot;&gt;Area Chart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/barchart&quot;&gt;Bar Chart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/bubblechart&quot;&gt;Bubble Chart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/calendar&quot;&gt;Calendar Chart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/candlestickchart&quot;&gt;Candlestic Chart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/columnchart&quot;&gt;Column Chart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/combochart&quot;&gt;Combo Chart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/diffchart&quot;&gt;Diff Charts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/piechart#donut&quot;&gt;Donut Charts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/ganttchart&quot;&gt;Gantt Charts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/gauge&quot;&gt;Gauge Charts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/histogram&quot;&gt;Histograms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/intervals&quot;&gt;Intervals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/linechart&quot;&gt;Line Chart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/map&quot;&gt;Maps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/orgchart&quot;&gt;Org Charts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/piechart&quot;&gt;Pie Charts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/sankey&quot;&gt;Sankey Diagrams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/scatterchart&quot;&gt;Scatter Charts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/steppedareachart&quot;&gt;Stepped Area Charts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/table&quot;&gt;Table Charts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/timeline&quot;&gt;Timelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/treemap&quot;&gt;Tree Map Charts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/trendlines&quot;&gt;Tredilines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/gallery/candlestickchart#Waterfall&quot;&gt;Waterfall Charts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;무료로 사용할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;웹 기반의 차트로 HTML,CSS,JavaScript 기반으로 만들어졌다.&lt;/li&gt;
&lt;li&gt;다양한 형식의 차트를 지원한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Hello Chart&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;구글 차트 서비스를 구체적으로 살펴보기 전에 손맛을 익혀보자. 아래의 순서로 따라한다.&amp;nbsp;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;메모장을 연다.&lt;/li&gt;
&lt;li&gt;아래 URL을 방문한 후에 코드를 복사하고 메모장에 붙여넣기 한다.&lt;br /&gt;&lt;a href=&quot;https://developers.google.com/chart/interactive/docs/quick_start&quot;&gt;https://developers.google.com/chart/interactive/docs/quick_start&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;위의 내용을 저장한다. 파일명은 hellochart.html&lt;/li&gt;
&lt;li&gt;파일을 더블클릭하면 기본 브라우저에 의해서 파일이 열리면서 차트가 완성될 것이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;내용을 바꿔가면서 감상하자.&lt;br /&gt;(어디를 바꿔야 하는지는 동영상 수업을 통해서 알려줄 것이다)&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;라이브러리 로딩&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;라이브러리란 구글 차트 도구를 이용하기 위해서 구글에서 제공하는 자바스크립트 파일이다. 이 파일을 웹페이지에 로드해야 구글 차트 도구를 사용 할 수 있다. 이에 대한 보다 전문적인 내용을 알고 싶다면 생활코딩 자바스크립트 수업을 보자. (&lt;a href=&quot;http://opentutorials.org/course/49&quot;&gt;생활코딩 자바스크립트 수업 바로가기&lt;/a&gt;)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위의 Hello Chart에서 사용한 코드 중에 아래의 부분이 라이브러리를 불러오는 방법이다. 이 부분은 이해가 필요 없다. 그냥 이렇게 사용하면 된다고 알면 된다. (하지만 동영상 수업에서는 이유를 설명한다)&lt;/p&gt;
&lt;pre id=&quot;code_1581013260814&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;https://www.google.com/jsapi&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
 
    // Load the Visualization API and the piechart package.
    google.load('visualization', '1.0', {'packages':['corechart']});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;위의 코드 중 아래의 부분이 중요하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1581013285180&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;google.load('visualization', '1.0', {'packages':['corechart']});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;corechart라고 되어 있는 부분을 사용하고자 하는 차트의 이름으로 바꾸면 된다. corechart는 기본적인 차트(&lt;/span&gt;&lt;a href=&quot;https://google-developers.appspot.com/chart/interactive/docs/gallery/piechart&quot;&gt;pie&lt;/a&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://google-developers.appspot.com/chart/interactive/docs/gallery/barchart&quot;&gt;bar&lt;/a&gt;&lt;span style=&quot;color: #333333;&quot;&gt;, &amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://google-developers.appspot.com/chart/interactive/docs/gallery/columnchart&quot;&gt;column&lt;/a&gt;&lt;span style=&quot;color: #666666;&quot;&gt;)을 사용하기 위한 이름이다.&amp;nbsp;&amp;nbsp;예를들어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://google-developers.appspot.com/chart/interactive/docs/gallery/table&quot;&gt;테이블 차트&lt;/a&gt;&lt;span style=&quot;color: #666666;&quot;&gt;도 함께&amp;nbsp;사용하고 싶다면 코드를 아래와 같이 변경하면 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1581013320616&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;google.load('visualization', '1', {packages:['corechart', 'table']});
&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1581017564569&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot; src=&quot;https://www.gstatic.com/charts/loader.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
      google.charts.load('current', {'packages':['bar']});
      google.charts.setOnLoadCallback(drawChart);

      function drawChart() {
        var data = google.visualization.arrayToDataTable([
          ['Year', 'Sales', 'Expenses', 'Profit'],
          ['2014', 1000, 400, 200],
          ['2015', 1170, 460, 250],
          ['2016', 660, 1120, 300],
          ['2017', 1030, 540, 350]
        ]);

        var options = {
          chart: {
            title: 'Company Performance',
            subtitle: 'Sales, Expenses, and Profit: 2014-2017',
          },
          bars: 'horizontal' // Required for Material Bar Charts.
        };

        var chart = new google.charts.Bar(document.getElementById('barchart_material'));

        chart.draw(data, google.charts.Bar.convertOptions(options));
      }
    &amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;barchart_material&quot; style=&quot;width: 900px; height: 500px;&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;현 시점에서는 이 코드를 쓰고 있다.&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;chapt6&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;6. 구글지도 API&lt;/h1&gt;
&lt;p&gt;여기는 내용&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;chapt7&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;7. Logstalgia&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://logstalgia.io/&quot;&gt;https://logstalgia.io/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/HeWfkPeDQbY&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Access log란 웹서비스에 접속한 내역을 기록한 데이터인데, 이 데이터의 내용을 분석해서 게임적으로 분석해서 보여주는 솔루션이다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Log visualizatoin tool.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;a href=&quot;https://github.com/acaudwell/Logstalgia&quot;&gt;https://github.com/acaudwell/Logstalgia&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;a href=&quot;https://github.com/obsproject/obs-studio/tree/24.0.5&quot;&gt;https://github.com/obsproject/obs-studio/tree/24.0.5&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;chapt8&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;8. intro.js&lt;/h1&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;a href=&quot;http://usablica.github.io/intro.js&quot;&gt;http://usablica.github.io/intro.js&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;웹페이지에 대한 내용을 step by step 으로 알려주고 싶을 때 매우 유용하게 사용할 수 있는 프로젝트이다.&lt;/p&gt;
&lt;p&gt;설치 후에 example/index.html 을 열면 여러 가지 예제들을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;542&quot; height=&quot;871&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lnyWy/btqBO6JWdBm/qRf5gIJi1cmGtt210HmbH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lnyWy/btqBO6JWdBm/qRf5gIJi1cmGtt210HmbH0/img.png&quot; data-alt=&quot;Fig 37. 샘플페이지. 예제가 많다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lnyWy/btqBO6JWdBm/qRf5gIJi1cmGtt210HmbH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlnyWy%2FbtqBO6JWdBm%2FqRf5gIJi1cmGtt210HmbH0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;542&quot; height=&quot;871&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 37. 샘플페이지. 예제가 많다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jb5c9/btqBNkbjSzk/bPgKe6mEa27JVXTSig3rE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jb5c9/btqBNkbjSzk/bPgKe6mEa27JVXTSig3rE1/img.png&quot; data-alt=&quot;Fig 38. 이렇게 step by step으로 페이지 내용을 설명할 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jb5c9/btqBNkbjSzk/bPgKe6mEa27JVXTSig3rE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJb5c9%2FbtqBNkbjSzk%2FbPgKe6mEa27JVXTSig3rE1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 38. 이렇게 step by step으로 페이지 내용을 설명할 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;기타내용&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wkt7J/btqBOCCP46D/4gHSYu04yopGZWh0Wpknd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wkt7J/btqBOCCP46D/4gHSYu04yopGZWh0Wpknd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wkt7J/btqBOCCP46D/4gHSYu04yopGZWh0Wpknd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwkt7J%2FbtqBOCCP46D%2F4gHSYu04yopGZWh0Wpknd0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;536&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;796&quot; height=&quot;761&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Snyvm/btqBMOxFAJc/1utBwcbtbgqJEBSiZeElEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Snyvm/btqBMOxFAJc/1utBwcbtbgqJEBSiZeElEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Snyvm/btqBMOxFAJc/1utBwcbtbgqJEBSiZeElEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSnyvm%2FbtqBMOxFAJc%2F1utBwcbtbgqJEBSiZeElEK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;796&quot; height=&quot;761&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;right&quot;&gt;&lt;a href=&quot;https://js.cytoscape.org/&quot;&gt;https://js.cytoscape.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGfuUY/btqBNNLAec6/NPIA8FwVuEurOqQd2GSek0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGfuUY/btqBNNLAec6/NPIA8FwVuEurOqQd2GSek0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGfuUY/btqBNNLAec6/NPIA8FwVuEurOqQd2GSek0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGfuUY%2FbtqBNNLAec6%2FNPIA8FwVuEurOqQd2GSek0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;right&quot;&gt;&lt;a href=&quot;https://github.com/cytoscape/cytoscape&quot;&gt;https://github.com/cytoscape/cytoscape&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;right&quot;&gt;&lt;a href=&quot;https://cytoscape.org/documentation_developers.html&quot;&gt;https://cytoscape.org/documentation_developers.html&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;right&quot;&gt;&lt;a href=&quot;https://github.com/cytoscape&quot;&gt;https://github.com/cytoscape&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;right&quot;&gt;&lt;a href=&quot;https://js.cytoscape.org/&quot;&gt;https://js.cytoscape.org/&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;right&quot;&gt;&lt;a href=&quot;https://github.com/cytoscape/cytoscape.js&quot;&gt;https://github.com/cytoscape/cytoscape.js&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;right&quot;&gt;오픈튜토리얼 사이트를 처음 방문했을 때 가장 눈에 띈 것이 바로 저 seomal.org 였는데, 당시의 짧은 머리로는 찾기 어려웠다. 그래서 두루 좀 수업을 듣고 조금은 알겠다 싶어 찾아보았다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;right&quot;&gt;일단 이런 json 데이터를 쓴다. &lt;a href=&quot;https://seomal.org/data/data.json&quot;&gt;https://seomal.org/data/data.json&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;seomalData.png&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;2801&quot; width=&quot;516&quot; height=&quot;2576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6CAcT/btqBNjRGOiB/q32cHgfrpKjw8Pe6ihsCqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6CAcT/btqBNjRGOiB/q32cHgfrpKjw8Pe6ihsCqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6CAcT/btqBNjRGOiB/q32cHgfrpKjw8Pe6ihsCqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6CAcT%2FbtqBNjRGOiB%2Fq32cHgfrpKjw8Pe6ihsCqK%2Fimg.png&quot; data-filename=&quot;seomalData.png&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;2801&quot; width=&quot;516&quot; height=&quot;2576&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;right&quot;&gt;polyfill.min.js, cytoscape.mim.js, tinycolor.js, jquery.min.js 등 4개의 패키지를 사용하는데 이 그래프와 관련되는 것은 cytoscape다. cytoscatpe는 그래프를 그리는 꽤나 많은 방법들에 대해 javascript라이브러리를 지원하는데 여기 쓰인 것은 cytoscape-cose-bilkent.js 이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;right&quot;&gt;&lt;a href=&quot;https://genehs.github.io/linkgraph_by_cytoscape/&quot;&gt;https://genehs.github.io/linkgraph_by_cytoscape/&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;right&quot;&gt;data.json의 구조는 이렇다. 한 개의 노드는&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buOr5b/btqBODaUQRx/B7RcikwXUtLYYlNSmSLSHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buOr5b/btqBODaUQRx/B7RcikwXUtLYYlNSmSLSHk/img.png&quot; data-alt=&quot;data.json의 노드 데이터. id, url, label [표시내용] 으로 되어있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buOr5b/btqBODaUQRx/B7RcikwXUtLYYlNSmSLSHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuOr5b%2FbtqBODaUQRx%2FB7RcikwXUtLYYlNSmSLSHk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;data.json의 노드 데이터. id, url, label [표시내용] 으로 되어있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;right&quot;&gt;와 같이 되었고, 노드와 노드를 연결하는 화살표 역시 한 셋트의 데이터를 이룬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;637&quot; height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A9edj/btqBOrPknul/eYu0JCIiy8gvZPXI146fik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A9edj/btqBOrPknul/eYu0JCIiy8gvZPXI146fik/img.png&quot; data-alt=&quot;어느 노드에서 어디로 가는지를 source id와 target id 로 지정해준다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A9edj/btqBOrPknul/eYu0JCIiy8gvZPXI146fik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA9edj%2FbtqBOrPknul%2FeYu0JCIiy8gvZPXI146fik%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;637&quot; height=&quot;186&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;어느 노드에서 어디로 가는지를 source id와 target id 로 지정해준다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;right&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;right&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DATA SCIENCE/Data Visualization</category>
      <category>Globe</category>
      <category>introjs</category>
      <category>revealjs</category>
      <category>timeline</category>
      <category>WebGL</category>
      <category>구글차트</category>
      <category>온라인프리젠테이션</category>
      <category>인트로</category>
      <category>타임라인</category>
      <author>SALTFUN</author>
      <guid isPermaLink="true">https://saltfun.tistory.com/15</guid>
      <comments>https://saltfun.tistory.com/15#entry15comment</comments>
      <pubDate>Fri, 31 Jan 2020 02:43:40 +0900</pubDate>
    </item>
    <item>
      <title>화면움직임 캡쳐 GIF까지</title>
      <link>https://saltfun.tistory.com/13</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;게임바&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Window에서 화면움직임을 캡쳐할 수 있는 내장 소프트웨어를 사용하면 된다. 커서의 움직임도 녹화가 되며 마이크와 연결하면 오디오 녹음도 동시에 진행할 수 있다.&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;Window key + G 를 누르면 Game bar가 나타나며 이때 Captures 창도 나타나고 이것으로 화면도 캡쳐할 수 있다.&lt;/p&gt;
&lt;p&gt;Settings 설정 창에서 Gaming에 들어가면 Win + G 와 Captures에 관한 내용을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;533&quot; height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqBkdo/btqBuaf5wPY/za1avNYH2DUaPN3Sx2IFg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqBkdo/btqBuaf5wPY/za1avNYH2DUaPN3Sx2IFg1/img.png&quot; data-alt=&quot;Fig 1. Gaming 설정화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqBkdo/btqBuaf5wPY/za1avNYH2DUaPN3Sx2IFg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqBkdo%2FbtqBuaf5wPY%2Fza1avNYH2DUaPN3Sx2IFg1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;533&quot; height=&quot;508&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 1. Gaming 설정화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;녹화시작은 Fig 1에서 보는 것처럼 Win+Alt+R 이며 정지도 마찬가지이다.&lt;/p&gt;
&lt;p&gt;녹화는 mp4 파일로 저장되며 아래에서 소개하는 사이트에서 online으로 GIF 로 변환할 수도 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Settings-2020-01-26-20-02-44.gif&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6lECA/btqBtMtccZC/bCHvyHSMK7fwzUzv3xkimK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6lECA/btqBtMtccZC/bCHvyHSMK7fwzUzv3xkimK/img.gif&quot; data-alt=&quot;Fig 2. 24.9M mp4 파일을 3.31M GIF 로 변환한 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6lECA/btqBtMtccZC/bCHvyHSMK7fwzUzv3xkimK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/c6lECA/btqBtMtccZC/bCHvyHSMK7fwzUzv3xkimK/img.gif&quot; data-filename=&quot;Settings-2020-01-26-20-02-44.gif&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;1080&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 2. 24.9M mp4 파일을 3.31M GIF 로 변환한 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;온라인상에서 무료로 mp4파일을 GIF 로 변환해주는 사이트&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://convertio.co/kr/&quot;&gt;https://convertio.co/kr/&lt;/a&gt; &lt;span style=&quot;color: #456771;&quot;&gt;&lt;b&gt;softo&lt;/b&gt;&lt;/span&gt; 판권소유&lt;/h3&gt;
&lt;p&gt;참 편리하다. 그냥 업로드하고 기다리고 다운받으면 끝&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w15Nj/btqBuQnCTtx/tKbkmDvsUFIlbm6L0uP1j0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w15Nj/btqBuQnCTtx/tKbkmDvsUFIlbm6L0uP1j0/img.png&quot; data-alt=&quot;Fig 3. 개발자용 API&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w15Nj/btqBuQnCTtx/tKbkmDvsUFIlbm6L0uP1j0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw15Nj%2FbtqBuQnCTtx%2FtKbkmDvsUFIlbm6L0uP1j0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 3. 개발자용 API&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이외에도 여러 가지 변환기들을 사용할 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yq4Ga/btqBxzTc0pF/zxMOkadrFl7mSstc3bfCm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yq4Ga/btqBxzTc0pF/zxMOkadrFl7mSstc3bfCm0/img.png&quot; data-alt=&quot;Fig 4. 여러 가지 변환기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yq4Ga/btqBxzTc0pF/zxMOkadrFl7mSstc3bfCm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYq4Ga%2FbtqBxzTc0pF%2FzxMOkadrFl7mSstc3bfCm0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 4. 여러 가지 변환기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;softo는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Clideo&lt;/b&gt;&lt;/span&gt; 라는 사이트도 소유하고 있으며 각종 비티오, 오디오 편집이 가능한 online video tool이다.&amp;nbsp; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;slideshow maker&lt;/b&gt;&lt;/span&gt;도 있다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://clideo.com/&quot;&gt;https://clideo.com/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://clideo.com/meme-maker&quot;&gt;Meme maker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://clideo.com/cut-video&quot;&gt;Cut video&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://clideo.com/video-maker&quot;&gt;&lt;span&gt;&lt;/span&gt;Video maker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://clideo.com/slideshow-maker&quot;&gt;&lt;span&gt;&lt;/span&gt;Slideshow maker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://clideo.com/compress-video&quot;&gt;&lt;span&gt;&lt;/span&gt;Compress video&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://clideo.com/crop-video&quot;&gt;&lt;span&gt;&lt;/span&gt;Crop video&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://clideo.com/rotate-video&quot;&gt;&lt;span&gt;&lt;/span&gt;Rotate video&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://clideo.com/merge-video&quot;&gt;Merge video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://clideo.com/loop-video&quot;&gt;Loop video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://clideo.com/resize-video&quot;&gt;Resize video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://clideo.com/flip-video&quot;&gt;Flip video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://clideo.com/reverse-video&quot;&gt;Reverse video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://clideo.com/mute-video&quot;&gt;Mute video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://clideo.com/change-video-speed&quot;&gt;Speed video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://clideo.com/stop-motion&quot;&gt;Stop motion&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://clideo.com/filter-video&quot;&gt;Filter video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://clideo.com/adjust-video&quot;&gt;Adjust video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://clideo.com/dpi-converter&quot;&gt;DPI Converter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://clideo.com/cut-audio&quot;&gt;Cut audio&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://clideo.com/merge-audio&quot;&gt;Merge audio&lt;/a&gt;&lt;/p&gt;</description>
      <category>VIDEO EDIT</category>
      <category>captures</category>
      <category>Gamebar</category>
      <category>GIF변환</category>
      <category>mp4GIF변환</category>
      <category>마우스캡쳐</category>
      <category>화면동영상캡쳐</category>
      <category>화면캡쳐</category>
      <author>SALTFUN</author>
      <guid isPermaLink="true">https://saltfun.tistory.com/13</guid>
      <comments>https://saltfun.tistory.com/13#entry13comment</comments>
      <pubDate>Sun, 26 Jan 2020 20:01:04 +0900</pubDate>
    </item>
    <item>
      <title>Javascript 언어</title>
      <link>https://saltfun.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;처음&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://opentutorials.org/course/743&quot;&gt;https://opentutorials.org/course/743&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;#intro&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;0. INTRO&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#intro1&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;1. 언어소개&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#mainCnt&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;2. 자바스크립트 기본&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody align=&quot;left&quot; valign=&quot;top&quot;&gt;
&lt;tr&gt;
&lt;td width=&quot;33%&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#env&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 실행방법과 실습환경&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#notes&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 주석&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#cond&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 조건문&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#array&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 배열&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#uiNapi&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- UI와 API 그리고 문서보는 법&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;33%&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#numNstring&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 숫자와 문자&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#crNspace&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 줄바꿈과 여백&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#repeat&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 반복문&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#object&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 객체&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#regexp&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 정규표현식&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;33%&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#variables&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 변수&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#comp&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 비교&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#func&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 함수&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#module&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 모듈&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;#func_ori&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;3. 함수지향&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody align=&quot;left&quot; valign=&quot;top&quot;&gt;
&lt;tr&gt;
&lt;td width=&quot;33%&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#scope&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 유효범위&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#argments&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- arguments&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;33%&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#fnNcallback&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 값으로서의 함수와 콜백&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#callFn&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 함수의 호출&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;33%&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#closure&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 클로저&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;#objectOri&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;4. 객체지향&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody align=&quot;left&quot; valign=&quot;top&quot;&gt;
&lt;tr&gt;
&lt;td width=&quot;33%&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#objOri&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 객체지향 프로그래밍&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#thisObj&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- this&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#standardBuilt&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 표준 내장 객체의 확장&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#refrence&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 참조&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;33%&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#constructorNnew&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 생성자와 new [constructor]&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#extends&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 상속&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#objObj&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- Object&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;33%&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#globalObj&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 전역객체&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#proto&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- prototype&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;#datatype&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 데이터 타입&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;#pattern&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;5. 패턴&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.1em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#recursive&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 재귀함수&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;#end&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;6. 마무리&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;TOP&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;intro&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;0. INTRO&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Youtube 재생목록&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/videoseries?list=PLuHgQVnccGMA4uSig3hCjl7wTDeyIeZVU&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 Javascript 언어 자체에 대한 내용을 다루고 있다. 문법적인 부분에 대해 보다 많은 내용을 다룬다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Javascript 관련 기타 다른 강의&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;&lt;b&gt;WEB2- JavaScript&lt;/b&gt; &lt;a href=&quot;https://opentutorials.org/course/3085&quot;&gt;https://opentutorials.org/course/3085&lt;/a&gt;&amp;nbsp;&lt;br /&gt;웹페이지를 사용자와 상호작용하게 만들고자 하는 이들을 위한 내용. 게임이나 애플리케이션처럼 웹페이지를 동적으로 만들 수 있는 방법도 들어 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;웹브라우저 자바스크립트&lt;/b&gt; &lt;a href=&quot;https://opentutorials.org/course/1375&quot;&gt;https://opentutorials.org/course/1375&lt;/a&gt;&lt;br /&gt;웹브라우저를 자바스크립트로 제어하는 방법.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;WEB2 - Node.js&lt;/b&gt; &lt;a href=&quot;https://opentutorials.org/course/3332&quot;&gt;https://opentutorials.org/course/3332&lt;/a&gt;&lt;br /&gt;JavaScript를 이용하여 Node.js를 제어해 동적으로 HTML 코드를 생성하는 웹애플리케이션을 만드는 방법&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JavaScript (nodejs)&lt;/b&gt; - 폐지 예정 &lt;a href=&quot;https://opentutorials.org/course/2136&quot;&gt;https://opentutorials.org/course/2136&lt;/a&gt; 상단의 course/3332로 공부할 것을 권고&lt;br /&gt;JavaScript와 Nodejs를 이용하여 웹애플리케이션을 만드는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;TOP&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;intro1&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;1.&amp;nbsp;언어소개&lt;/h1&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PZIPsKgWJiw&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;참고&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://ejohn.org/apps/learn/&quot;&gt;http://ejohn.org/apps/learn/&lt;/a&gt;&amp;nbsp;&lt;br /&gt;jQuery를 만든&amp;nbsp;John Resig의 JavaScript 고급 강의&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/JavaScript/Guide&quot;&gt;https://developer.mozilla.org/ko/docs/JavaScript/Guide&lt;/a&gt;&lt;br /&gt;Firefox의 모질라 재단에서 운영중인 자바스크립트 튜토리얼&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://opentutorials.org/course/50&quot;&gt;http://opentutorials.org/course/50&lt;/a&gt;&lt;br /&gt;JavaScript 사전&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.html5rocks.com/ko/&quot;&gt;http://www.html5rocks.com/ko/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;TOP&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;mainCnt&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;2.&amp;nbsp;자바스크립트&amp;nbsp;기본&lt;/h1&gt;
&lt;p style=&quot;font-size: 1.1em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#env&quot;&gt; &lt;span style=&quot;color: #666666;&quot;&gt;- 실행방법과 실습환경&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#numNstring&quot;&gt; &lt;span style=&quot;color: #666666;&quot;&gt;- 숫자와 문자&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#variables&quot;&gt; &lt;span style=&quot;color: #666666;&quot;&gt;- 변수&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#notes&quot;&gt; &lt;span style=&quot;color: #666666;&quot;&gt;- 주석&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#crNspace&quot;&gt; &lt;span style=&quot;color: #666666;&quot;&gt;- 줄바꿈과 여백&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#comp&quot;&gt; &lt;span style=&quot;color: #666666;&quot;&gt;- 비교&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#cond&quot;&gt; &lt;span style=&quot;color: #666666;&quot;&gt;- 조건문&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#repeat&quot;&gt; &lt;span style=&quot;color: #666666;&quot;&gt;- 반복문&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#func&quot;&gt; &lt;span style=&quot;color: #666666;&quot;&gt;- 함수&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#array&quot;&gt; &lt;span style=&quot;color: #666666;&quot;&gt;- 배열&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#object&quot;&gt; &lt;span style=&quot;color: #666666;&quot;&gt;- 객체&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#module&quot;&gt; &lt;span style=&quot;color: #666666;&quot;&gt;- 모듈&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#uiNapi&quot;&gt; &lt;span style=&quot;color: #666666;&quot;&gt;- UI와 API 그리고 문서보는 법&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#regexp&quot;&gt; &lt;span style=&quot;color: #666666;&quot;&gt;- 정규표현식&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;env&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;실행방법과&amp;nbsp;실습환경&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;설치&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/1kYjb7L8YW4&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;실행&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGAoe6/btqBsZTGxwo/kxnDjl9PrXYQ8lY1TVxsVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGAoe6/btqBsZTGxwo/kxnDjl9PrXYQ8lY1TVxsVK/img.png&quot; data-alt=&quot;Fig 1. &amp;amp;lt;script&amp;amp;gt; 태그 내용이 javascript&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGAoe6/btqBsZTGxwo/kxnDjl9PrXYQ8lY1TVxsVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGAoe6%2FbtqBsZTGxwo%2FkxnDjl9PrXYQ8lY1TVxsVK%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;671&quot; height=&quot;340&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;588&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 1. &amp;lt;script&amp;gt; 태그 내용이 javascript&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;script&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; javascript 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모장 등으로도 편집이 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;a. 웹페이지에서 자바스크립트 작성&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;b. 크롬 개발자 도구 사용&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;a href=&quot;https://opentutorials.org/course/580&quot;&gt;https://opentutorials.org/course/580&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/uWbCJGSeqlY&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크롬/F12/Console&amp;nbsp; &amp;nbsp;콘솔창에서 javascript를 직접 실행시킬 수 있다. HTML코드가 전혀 필요없고 순수하게 javascript코드만 작성하면 된다. 명령어를 입력하고 &amp;lt;Enter&amp;gt; 하면 바로 결과를 볼 수 있음. 긴 코드는 파일로 작성하여 작업하는 것이 더 편리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 1의 11 행 대신에 console.log('Hello world'); 를 해주면 alert 와 달리 메세지가 콘솔에 나타난다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYRK3s/btqBtNFaplm/qk23g3DFV0QeJsqKEGsfA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYRK3s/btqBtNFaplm/qk23g3DFV0QeJsqKEGsfA0/img.png&quot; data-alt=&quot;Fig 2. console.log()&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYRK3s/btqBtNFaplm/qk23g3DFV0QeJsqKEGsfA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYRK3s%2FbtqBtNFaplm%2Fqk23g3DFV0QeJsqKEGsfA0%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;1172&quot; height=&quot;576&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 2. console.log()&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;도구의 선택&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/QhTNltrkl2U&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sublime Text :&amp;nbsp; Editor&amp;nbsp; 유료. 가볍고 여러가지 확장기능이 많다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 &lt;a href=&quot;https://opentutorials.org/module/406/3595&quot;&gt;https://opentutorials.org/module/406/3595&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 좋은 도구를 찾는데 신경을 써야 한다. 인지의 한계를 넘어설 수 있다.&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#mainCnt&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;numNstring&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;숫자와&amp;nbsp;문자&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;수의 표현&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/lfNMuwGHbL0&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alert(1);&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alert(2*8);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alert(6/2);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;console.log(3*5);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10*2&amp;nbsp; &amp;nbsp;콘솔에서는 바로 계산됨&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;수의 연산&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/vmjHeYSneOg&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Math.pow(3, 2);&amp;nbsp; -&amp;gt; 3^2&amp;nbsp; &amp;nbsp; &amp;nbsp;수학과 관련된 클래스 Math&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Math.round(10.6); -&amp;gt; 11&amp;nbsp; &amp;nbsp;반올림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Math.ceil(10.2);&amp;nbsp; -&amp;gt; 11&amp;nbsp; &amp;nbsp;가장 가까운 높은 정수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Math.floor(10.2); -&amp;gt;10 가장 가까운 낮은 정수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Math.sqrt(9);&amp;nbsp; &amp;nbsp;-&amp;gt; 3&amp;nbsp; 제곱근&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Math.random();&amp;nbsp; &amp;nbsp;1보다 작은 랜덤 수&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문자의 표현&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/2Qc3BBRZSnA&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alert('coding everybody');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alert(&quot;coding everybody&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alert('egoing's coding everybody');&amp;nbsp; 오류 -&amp;gt; &lt;span style=&quot;color: #333333;&quot;&gt;alert('egoing\'s coding everybody');&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;' -&amp;gt; \'&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\n&amp;nbsp; 줄바꿈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;typeof 수식 -&amp;gt;&amp;nbsp; 수식의 자료형을 되돌림&amp;nbsp; &amp;nbsp; &amp;nbsp;alert(typeof &quot;1&quot;);&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문자에 대한 명령들&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/WJeDrf_tNz0&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;coding&quot; + &quot;everybody&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열.length&amp;nbsp; 문자열의 길이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 사전 참고 &lt;a href=&quot;https://opentutorials.org/course/50&quot;&gt;https://opentutorials.org/course/50&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://js.studio-kingdom.com/javascript/&quot;&gt;http://js.studio-kingdom.com/javascript/&lt;/a&gt;&amp;nbsp;일본어페이지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열.indexof(&quot;문자열1&quot;)&amp;nbsp; &amp;nbsp; &amp;nbsp;문자열에서 문자열1의 위치를 0부터 계산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;code&quot;.indexof(&quot;d&quot;)&amp;nbsp; -&amp;gt; 2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2진수, 이진수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;parseInt(&quot;2345234&quot;).toStriing(2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;decodeURI()&amp;nbsp; &amp;nbsp; 코드화된 URI를 보기 쉽게 바꾸는 함수.&amp;nbsp; endoceURI()&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;965&quot; data-origin-height=&quot;603&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Kuf9/btqB2uKM9VP/AE31WYlKE3axLqONxktW50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Kuf9/btqB2uKM9VP/AE31WYlKE3axLqONxktW50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Kuf9/btqB2uKM9VP/AE31WYlKE3axLqONxktW50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Kuf9%2FbtqB2uKM9VP%2FAE31WYlKE3axLqONxktW50%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;965&quot; height=&quot;603&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;603&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 style=&quot;text-align: left;&quot; align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;base64&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#mainCnt&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;variables&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;변수&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용법&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/wZTcQlnDWQo&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var a=1;&amp;nbsp; &amp;nbsp; 변수는 var로 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var a = 'coding', b = 'everybody' ;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;변수의 효용&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/knIpYEODO3Y&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;주석&lt;/h2&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/xUZku_V1Prs&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#mainCnt&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;notes&quot;&gt;&lt;/a&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;/*&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 줄 짜리 주석&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*/&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#mainCnt&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;crNspace&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;줄바꿈과&amp;nbsp;여백&lt;/h2&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/dJsKY2v0FBg&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;javascript는 줄이 바뀌면 명령이 끝난 것으로 간주.&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 align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#mainCnt&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;comp&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;비교&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비교연산자&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Vzrl1lsQ1Ok&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;a = 1&amp;nbsp; 대입연산자, 2항 연산자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비트연산자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연산자사용방법설명&lt;/p&gt;
&lt;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: 6.8605%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_AND&quot;&gt;비트 AND&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 1.16279%;&quot;&gt;a &amp;amp; b&lt;/td&gt;
&lt;td style=&quot;width: 92.093%;&quot;&gt;피연산자를 비트로 바꿨을 때 각각 대응하는 비트가 모두 1이면 그 비트값에 1을 반환.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.8605%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_OR&quot;&gt;비트 OR&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 1.16279%;&quot;&gt;a | b&lt;/td&gt;
&lt;td style=&quot;width: 92.093%;&quot;&gt;피연산자를 비트로 바꿨을 때 각각 대응하는 비트가 모두 1이거나 한 쪽이 1이면 1을 반환.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.8605%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_XOR&quot;&gt;비트 XOR&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 1.16279%;&quot;&gt;a ^ b&lt;/td&gt;
&lt;td style=&quot;width: 92.093%;&quot;&gt;피연산자를 비트로 바꿨을 때 대응하는 비트가 서로 다르면 1을 반환.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.8605%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_NOT&quot;&gt;비트 NOT&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 1.16279%;&quot;&gt;~ a&lt;/td&gt;
&lt;td style=&quot;width: 92.093%;&quot;&gt;피연산자의 반전된 값을 반환.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.8605%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Left_shift&quot;&gt;왼쪽 시프트&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 1.16279%;&quot;&gt;a &amp;lt;&amp;lt; b&lt;/td&gt;
&lt;td style=&quot;width: 92.093%;&quot;&gt;Shifts&lt;span&gt;&amp;nbsp;&lt;/span&gt;a&lt;span&gt;&amp;nbsp;&lt;/span&gt;in binary representation&lt;span&gt;&amp;nbsp;&lt;/span&gt;b&lt;span&gt;&amp;nbsp;&lt;/span&gt;(&amp;lt; 32) bits to the left, shifting in zeros from the right.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.8605%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Right_shift&quot;&gt;부호 유지 오른쪽 시프트&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 1.16279%;&quot;&gt;a &amp;gt;&amp;gt; b&lt;/td&gt;
&lt;td style=&quot;width: 92.093%;&quot;&gt;Shifts&lt;span&gt;&amp;nbsp;&lt;/span&gt;a&lt;span&gt;&amp;nbsp;&lt;/span&gt;in binary representation&lt;span&gt;&amp;nbsp;&lt;/span&gt;b&lt;span&gt;&amp;nbsp;&lt;/span&gt;(&amp;lt; 32) bits to the right, discarding bits shifted off.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.8605%;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Unsigned_right_shift&quot;&gt;부호 버림 오른쪽 시프트&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 1.16279%;&quot;&gt;a &amp;gt;&amp;gt;&amp;gt; b&lt;/td&gt;
&lt;td style=&quot;width: 92.093%;&quot;&gt;Shifts&lt;span&gt;&amp;nbsp;&lt;/span&gt;a&lt;span&gt;&amp;nbsp;&lt;/span&gt;in binary representation&lt;span&gt;&amp;nbsp;&lt;/span&gt;b&lt;span&gt;&amp;nbsp;&lt;/span&gt;(&amp;lt; 32) bits to the right, discarding bits shifted off, and shifting in zeros from the left.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;==과 ===&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/jl_NfQv9Zr8&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동등연산자 equal operator&amp;nbsp; ==&amp;nbsp; &amp;nbsp; 좌항과 우항이 같으면 true, 다르면 false&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일치연산자 strict equal operator 엄격한 동등 연산자 ===&amp;nbsp; &amp;nbsp; &amp;nbsp;좌항과 우항이 엄격하게 같은가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 === &quot;1&quot;&amp;nbsp; &amp;nbsp; &amp;nbsp; false&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 == &quot;1&quot;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;true&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;h3 data-ke-size=&quot;size23&quot;&gt;===를 사용하자!&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/rN0045zf-y4&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alert(null == undefined);&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;true&amp;nbsp; &amp;nbsp; &amp;nbsp; null: 값이 없다. 프로그래머가 의도한 상황. undefined: 값이 정의되지 않음. 프로그래머가 의도하지 않은 상황&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alert(null === undefined);&amp;nbsp; &amp;nbsp; &amp;nbsp;false&amp;nbsp; 엄격하게 보면 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Boolean[true, false], Number[-1, 0.23, 2, 34, 4], String[&quot;a&quot;, &quot;do&quot;, &quot;go&quot;] 과 같이 undefined, null 역시 각각의 데이터 타입이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alert(true == 1);&amp;nbsp; &amp;nbsp; &amp;nbsp;true&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alert(true === 1);&amp;nbsp; &amp;nbsp; &amp;nbsp;false&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alert(true == &quot;1&quot;);&amp;nbsp; &amp;nbsp; &amp;nbsp;true&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alert(true === &quot;1&quot;);&amp;nbsp; &amp;nbsp; &amp;nbsp;false&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alert(0 === -0);&amp;nbsp; &amp;nbsp; true&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alert(NaN === NaN);&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;false&amp;nbsp; &amp;nbsp; NaN: 0을 0으로 나누었을 때. 성립하지 않는 수다&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;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://dorey.github.io/JavaScript-Equality-Table/&quot;&gt;http://dorey.github.io/JavaScript-Equality-Table/&lt;/a&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;(==과 ===의 차이점)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;부정과 부등호&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/eVrqPPq8bZg&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alert(1!=2);&amp;nbsp; &amp;nbsp; /true&amp;nbsp; &amp;nbsp;!: 부정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;!==는 !=과 ==의 관계와 같다. 정확하게 같지 않다는 의미. ===의 true/false 결과가 반대로 나옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#mainCnt&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;cond&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;조건문&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;조건문이란&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/iLLYfP06Dy4&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if(true/false) {&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;h3 data-ke-size=&quot;size23&quot;&gt;else, else if&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/OkDg03heWi8&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if(true/false){&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}else{&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;if(true/false){&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}else if(true/false){&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}else{&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;조건문의 응용&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/eVQctnRC0vA&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prompt('당신의 나이는?');&amp;nbsp; &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;1468&quot; data-origin-height=&quot;728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB2MAQ/btqBtXU6FFk/gV8o4tAZnzyZZ8g6yMXu1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB2MAQ/btqBtXU6FFk/gV8o4tAZnzyZZ8g6yMXu1k/img.png&quot; data-alt=&quot;Fig 3 변수 앞에 var가 없어도 실행은 된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB2MAQ/btqBtXU6FFk/gV8o4tAZnzyZZ8g6yMXu1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB2MAQ%2FbtqBtXU6FFk%2FgV8o4tAZnzyZZ8g6yMXu1k%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;305&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;728&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 3 변수 앞에 var가 없어도 실행은 된다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;996&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KUSAt/btqBt98PyDb/uDCNcie08kt0OYbJgLbH80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KUSAt/btqBt98PyDb/uDCNcie08kt0OYbJgLbH80/img.png&quot; data-alt=&quot;Fig 4. 변수 앞에 var를 써주는 것이 좋다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KUSAt/btqBt98PyDb/uDCNcie08kt0OYbJgLbH80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKUSAt%2FbtqBt98PyDb%2FuDCNcie08kt0OYbJgLbH80%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;683&quot; height=&quot;405&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;996&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 4. 변수 앞에 var를 써주는 것이 좋다&lt;/figcaption&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;h3 data-ke-size=&quot;size23&quot;&gt;논리연산자&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/ZO5YPoIIKYU&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;amp;&amp;amp;&amp;nbsp; AND&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;||&amp;nbsp; &amp;nbsp; &amp;nbsp;OR&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;!&amp;nbsp; &amp;nbsp;NOT&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;1616&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXhnuC/btqBtX1RJWa/9YJ7xqTk34jRyt3XCMuvTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXhnuC/btqBtX1RJWa/9YJ7xqTk34jRyt3XCMuvTk/img.png&quot; data-alt=&quot;Fig 5. 논리연산자를 이용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXhnuC/btqBtX1RJWa/9YJ7xqTk34jRyt3XCMuvTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXhnuC%2FbtqBtX1RJWa%2F9YJ7xqTk34jRyt3XCMuvTk%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;714&quot; height=&quot;324&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;734&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 5. 논리연산자를 이용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;boolean의 대체제&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/ACql-bVh_MY&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if(0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if(1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수자 1은 true로 간주&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;''&amp;nbsp; 빈자열은 false&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'문자열'은 true&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;undefined, null, NaN 은 false&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;1120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yeUOY/btqBt9HOtpv/Mm3JWksKzPBcF6oN7s9dj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yeUOY/btqBt9HOtpv/Mm3JWksKzPBcF6oN7s9dj1/img.png&quot; data-alt=&quot;Fig 6. if() 에 들어가 녹색이면 true, 흰색이면 false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yeUOY/btqBt9HOtpv/Mm3JWksKzPBcF6oN7s9dj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyeUOY%2FbtqBt9HOtpv%2FMm3JWksKzPBcF6oN7s9dj1%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;1100&quot; height=&quot;1120&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;1120&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 6. if() 에 들어가 녹색이면 true, 흰색이면 false&lt;/figcaption&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 align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#mainCnt&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;repeat&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull; 반복문&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본문법&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/po7I5Hy54as&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;loop, iterate라고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while(조건){&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 반복해서 실행할 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sKDCk/btqBtMsKr5o/m47aLmO53K9sbpFhwbRkL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sKDCk/btqBtMsKr5o/m47aLmO53K9sbpFhwbRkL1/img.png&quot; data-alt=&quot;Fig 7. document.write&amp;amp;nbsp; 그대로 html 코드안에 삽입됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sKDCk/btqBtMsKr5o/m47aLmO53K9sbpFhwbRkL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsKDCk%2FbtqBtMsKr5o%2Fm47aLmO53K9sbpFhwbRkL1%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;1178&quot; height=&quot;578&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 7. document.write&amp;nbsp; 그대로 html 코드안에 삽입됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while(true){&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; document.write(&quot;Coding everybody &amp;lt;br /&amp;gt;&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&amp;nbsp; &amp;nbsp; &amp;nbsp;무한루프에 빠짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;반복조건&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/g1-JAbbEiqM&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXfzah/btqBtGGh7kr/1u9M1B4XZc5RXKeKQSs6T0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXfzah/btqBtGGh7kr/1u9M1B4XZc5RXKeKQSs6T0/img.png&quot; data-alt=&quot;Fig 8. while 에 조건을 넣어줌&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXfzah/btqBtGGh7kr/1u9M1B4XZc5RXKeKQSs6T0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXfzah%2FbtqBtGGh7kr%2F1u9M1B4XZc5RXKeKQSs6T0%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;594&quot; height=&quot;284&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 8. while 에 조건을 넣어줌&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;for문&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/0J2ylZFJ85Q&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for(초기화; 반복조건; 반복이 될 때마다 실행되는 코드) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;반복해서 실행될 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2078&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AoKg3/btqBubyO4ox/RVxwRyGVgKte8Fta5sBQtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AoKg3/btqBubyO4ox/RVxwRyGVgKte8Fta5sBQtK/img.png&quot; data-alt=&quot;Fig 9. for 문&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AoKg3/btqBubyO4ox/RVxwRyGVgKte8Fta5sBQtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAoKg3%2FbtqBubyO4ox%2FRVxwRyGVgKte8Fta5sBQtK%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;664&quot; height=&quot;88&quot; data-origin-width=&quot;2078&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 9. for 문&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i = i+1;&amp;nbsp; &amp;nbsp;-&amp;gt;&amp;nbsp; i++;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;++i;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alert(i++);&amp;nbsp; &amp;nbsp;먼저 i를 출력하고 i값을 증가. ++i는 먼저 증가하고 i 값을 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i는 iterator의 약자로 보면 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;반복문의 효용&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/14AZHiNlOJA&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;반복문의 제어(break, continue)&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/M3k79-n1g-E&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxIf0t/btqBukhZaKc/pwpJgXGipPngdkxPRfL6NK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxIf0t/btqBukhZaKc/pwpJgXGipPngdkxPRfL6NK/img.png&quot; data-alt=&quot;Fig 10. i 값이 5에 이르면 for문을 탈출. break&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxIf0t/btqBukhZaKc/pwpJgXGipPngdkxPRfL6NK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxIf0t%2FbtqBukhZaKc%2FpwpJgXGipPngdkxPRfL6NK%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;665&quot; height=&quot;244&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 10. i 값이 5에 이르면 for문을 탈출. break&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btDNqT/btqBtFUUgRN/cMc9211JKRx5oKpZvpKB9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btDNqT/btqBtFUUgRN/cMc9211JKRx5oKpZvpKB9k/img.png&quot; data-alt=&quot;Fig 11. i 값이 5가 되면 continue 가 실행되어 다음 번 반복과정 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btDNqT/btqBtFUUgRN/cMc9211JKRx5oKpZvpKB9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtDNqT%2FbtqBtFUUgRN%2FcMc9211JKRx5oKpZvpKB9k%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;657&quot; height=&quot;243&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 11. i 값이 5가 되면 continue 가 실행되어 다음 번 반복과정 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;반복문의 중첩&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/tS_kELn3m9U&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOlYBs/btqBtLHrm4m/2GdKpx4APH5PKzkQ6qf2qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOlYBs/btqBtLHrm4m/2GdKpx4APH5PKzkQ6qf2qk/img.png&quot; data-alt=&quot;Fig 12. 반복문 안에 반복문이 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOlYBs/btqBtLHrm4m/2GdKpx4APH5PKzkQ6qf2qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOlYBs%2FbtqBtLHrm4m%2F2GdKpx4APH5PKzkQ6qf2qk%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;790&quot; height=&quot;158&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 12. 반복문 안에 반복문이 있음&lt;/figcaption&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 align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#mainCnt&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;func&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;함수&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수란&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Y7qiAqqovT4&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WzX3A/btqBvtrKTQu/fECBjM3gX4YLP1g3S5rhi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WzX3A/btqBvtrKTQu/fECBjM3gX4YLP1g3S5rhi1/img.png&quot; data-alt=&quot;Fig 13. 함수의 형식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WzX3A/btqBvtrKTQu/fECBjM3gX4YLP1g3S5rhi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWzX3A%2FbtqBvtrKTQu%2FfECBjM3gX4YLP1g3S5rhi1%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;478&quot; height=&quot;165&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;209&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 13. 함수의 형식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqC1wH/btqBsHZYKIi/5KeMly2NKLjE7o4Smgst5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqC1wH/btqBsHZYKIi/5KeMly2NKLjE7o4Smgst5K/img.png&quot; data-alt=&quot;Fig 14. 함수의 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqC1wH/btqBsHZYKIi/5KeMly2NKLjE7o4Smgst5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqC1wH%2FbtqBsHZYKIi%2F5KeMly2NKLjE7o4Smgst5K%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;470&quot; height=&quot;142&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 14. 함수의 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수의 효용&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/zfh4p79DTO0&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;입력&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/lYrWnEqRHBY&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;출력&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/ceDiP4e6VhI&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다양한 정의 방법&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/NudagtcdERs&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biaR5x/btqBvsGm7oT/cG25QnKAcsBlkWNRemrw1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biaR5x/btqBvsGm7oT/cG25QnKAcsBlkWNRemrw1K/img.png&quot; data-alt=&quot;Fig 15. 함수를 정의하는 방법 중의 하나&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biaR5x/btqBvsGm7oT/cG25QnKAcsBlkWNRemrw1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiaR5x%2FbtqBvsGm7oT%2FcG25QnKAcsBlkWNRemrw1K%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;510&quot; height=&quot;298&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 15. 함수를 정의하는 방법 중의 하나&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xiq7j/btqBvs0GETF/2za3d2vtDtNIkoIq0RCrY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xiq7j/btqBvs0GETF/2za3d2vtDtNIkoIq0RCrY0/img.png&quot; data-alt=&quot;Fig 16. 일반적인 함수 정의&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xiq7j/btqBvs0GETF/2za3d2vtDtNIkoIq0RCrY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxiq7j%2FbtqBvs0GETF%2F2za3d2vtDtNIkoIq0RCrY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;246&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 16. 일반적인 함수 정의&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 15와 Fig 16은 numbering이라는 함수를 서로 다른 방법으로 정의하고 있지만 기능은 똑같다. 호출 할때에는 numbering(); 과 같은 방법으로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 17은 Fig 15를 설명하기 위해 노랑선으로 표시를 하였는데, 함수의 정의 부분이 numbering이라는 변수에 대입된 것으로 보면 된다. 그리하여 numbering이라는 변수가 함수를 가지게 된 것이다. 그리하여 변수이름뒤에 괄호를 붙여 함수를 호출할 수 있는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1822&quot; data-origin-height=&quot;1070&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pkblu/btqBua7LGD0/MmHt7Tj3dfp3kXYd2sFKvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pkblu/btqBua7LGD0/MmHt7Tj3dfp3kXYd2sFKvK/img.png&quot; data-alt=&quot;Fig 18. 익명함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pkblu/btqBua7LGD0/MmHt7Tj3dfp3kXYd2sFKvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPkblu%2FbtqBua7LGD0%2FMmHt7Tj3dfp3kXYd2sFKvK%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;451&quot; height=&quot;265&quot; data-origin-width=&quot;1822&quot; data-origin-height=&quot;1070&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 18. 익명함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 이름도 없고 정의한 후에 함수를 괄호로 둘러싸고 뒤에 또다시 함수를 호출하듯이 닫혀있는 괄호쌍을 덧붙이면 함수의 정의와 동시에 바로 호출도 진행되게 되는데 이런 함수를 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;익명함수&lt;/b&gt;&lt;/span&gt;라고 한다. 1회성을 호출하는 경우에 이런 테크닉을 쓰는데 이름이 필요없고 바로 써야 하는 경우에 사용하는 방법이다.&amp;nbsp; 이것은 Java의 내부 inner 클래스 중 한 종류인 익명 Anonymous 클래스와 매우 비슷해보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;javaScript는 함수의 언어라 불릴 정도로 함수가 언어에서 차지하는 위상이 매우 높다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#mainCnt&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;array&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;배열&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배열의 문법&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/12KRzsKwtTo&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blKL9V/btqBsZF6vPC/36zTbtD40SN82WkzVCj8Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blKL9V/btqBsZF6vPC/36zTbtD40SN82WkzVCj8Q0/img.png&quot; data-alt=&quot;Fig 19.. 배열을 담을 때는 [ ]안에 넣고 ,으로 구분한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blKL9V/btqBsZF6vPC/36zTbtD40SN82WkzVCj8Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblKL9V%2FbtqBsZF6vPC%2F36zTbtD40SN82WkzVCj8Q0%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;555&quot; height=&quot;153&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 19.. 배열을 담을 때는 [ ]안에 넣고 ,으로 구분한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열 안에 있는 하나 하나의 값을 element 원소라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원소의 번호를 가리키는 것을 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;h3 data-ke-size=&quot;size23&quot;&gt;배열의 효용&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/V_mZgoOJCz0&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배열과 반복문의 조우&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/6O15Cv1vEm8&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터의 추가&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/YkO_2WKBYrI&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUe5s0/btqBuko2clT/tumAdQCKIMona2RnGsnksK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUe5s0/btqBuko2clT/tumAdQCKIMona2RnGsnksK/img.png&quot; data-alt=&quot;Fig 19. 배열의 데이터를 수정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUe5s0/btqBuko2clT/tumAdQCKIMona2RnGsnksK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUe5s0%2FbtqBuko2clT%2FtumAdQCKIMona2RnGsnksK%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;599&quot; height=&quot;558&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 19. 배열의 데이터를 수정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열.push(p)&amp;nbsp; &amp;nbsp;p를 마지막에 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열.concat(p1, p2, ..., pn)&amp;nbsp; &amp;nbsp;여러 개의 데이터를 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열.unshift(p)&amp;nbsp; &amp;nbsp; p를 앞에 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열.splice(p1, p2, p3,...)&amp;nbsp; p1 번째부터 p2 개 만큼 삭제하고 p3... 을 삽입한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;concat 연결한다는 뜻 concatenate&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.opentutorials.org/course/50&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;javascript 사전&lt;/a&gt;을 이용하여 더 자세한 내용에 대해 알아 볼 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제거와 정렬&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Kp02VwkUuSc&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bL1So4/btqBua73i19/K9I17fM2Gowtndg0Ef3PA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bL1So4/btqBua73i19/K9I17fM2Gowtndg0Ef3PA0/img.png&quot; data-alt=&quot;Fig 20. 배열 데이터의 제거와 정렬&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bL1So4/btqBua73i19/K9I17fM2Gowtndg0Ef3PA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbL1So4%2FbtqBua73i19%2FK9I17fM2Gowtndg0Ef3PA0%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;400&quot; height=&quot;383&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 20. 배열 데이터의 제거와 정렬&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열.shift()&amp;nbsp; 첫 번째 원소를 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열.pop();&amp;nbsp; &amp;nbsp;마지막 원소를 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열.sort()&amp;nbsp; 정렬&amp;nbsp; &amp;nbsp; &amp;nbsp;javascript 사전 참조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열.reverse()&amp;nbsp; 역순정렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#mainCnt&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;object&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;객체&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;객체의 문법&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/MiLELE_yskc&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;만약 인덱스로 문자를 사용하고 싶다면 객체(dictionary)를 사용해야 한다. 다른 언어에서는 연관배열(associative array) 또는 맵( map), 딕셔너리(Dictionary)라는 데이터 타입이 객체에 해당한다.&lt;/span&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;배열은 [ ] 을 사용하지만 객체는 { }를 사용한다. 객체의 key는 문자열이며, value는 상관없다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FRRWh/btqBvtr1Wdk/B15GhE0D8ZnubY3Qe34rKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FRRWh/btqBvtr1Wdk/B15GhE0D8ZnubY3Qe34rKK/img.png&quot; data-alt=&quot;Fig 21. 객체는 여러 가지 방법으로 정의할 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FRRWh/btqBvtr1Wdk/B15GhE0D8ZnubY3Qe34rKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFRRWh%2FbtqBvtr1Wdk%2FB15GhE0D8ZnubY3Qe34rKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;490&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 21. 객체는 여러 가지 방법으로 정의할 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 21은 객체를 만드는 3가지 방법을 보여준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 직접 값을 넣어주는 것이다. grades라는 객체의 값을 넣어주는데 'saltfun', 'mirgiana', 'toga' 는 key 이며 [배열의 index 개념], 12, 6, 30 은 value 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;points는 먼저 빈 객체를 정의하고 다음 key 별로 값을 주고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;birds는 new Object() 로 먼저 객체를 생성한 후 값을 주고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값을 가져올 때에는 객체명[key] 혹은 객체명.key&amp;nbsp; 라고 해주면 되는데 [ ] 안에 key 를 쓸 때에는 문자열 식이어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;birds['parrot'] 과 birds.parrot, 그리고 birds['par' + 'rot'] 는 모두 같은 뜻이다.&lt;/p&gt;
&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;객체와 반복문의 조우&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/0MmKE1A2pB4&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvhMx4/btqBtXHRLXG/M84rKp7UckXe43waRmDJoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvhMx4/btqBtXHRLXG/M84rKp7UckXe43waRmDJoK/img.png&quot; data-alt=&quot;Fig 22. for 문에서 iterator in 객체 의 형식을 사용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvhMx4/btqBtXHRLXG/M84rKp7UckXe43waRmDJoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvhMx4%2FbtqBtXHRLXG%2FM84rKp7UckXe43waRmDJoK%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;548&quot; height=&quot;192&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 22. for 문에서 iterator in 객체 의 형식을 사용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EWj8n/btqBtMGy2vs/MvjJ8M47OEkzuR6BPR1pt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EWj8n/btqBtMGy2vs/MvjJ8M47OEkzuR6BPR1pt0/img.png&quot; data-alt=&quot;Fig 23.(key in wear) 를 (var key in wear) 즉 iterator 앞에 var를 선언해주는데 여기서는 생략했음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EWj8n/btqBtMGy2vs/MvjJ8M47OEkzuR6BPR1pt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEWj8n%2FbtqBtMGy2vs%2FMvjJ8M47OEkzuR6BPR1pt0%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;703&quot; height=&quot;355&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 23.(key in wear) 를 (var key in wear) 즉 iterator 앞에 var를 선언해주는데 여기서는 생략했음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체가 아닌 배열에서도 객체와 마찬가지로 index 대신 in을 사용하여 for 문을 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k2BNp/btqBuQnyvB1/tiJk0T7jbyQbCGQXzoxgKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k2BNp/btqBuQnyvB1/tiJk0T7jbyQbCGQXzoxgKk/img.png&quot; data-alt=&quot;Fig 24. 브라우저에서 우클릭/Inspect[요소검사]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k2BNp/btqBuQnyvB1/tiJk0T7jbyQbCGQXzoxgKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk2BNp%2FbtqBuQnyvB1%2FtiJk0T7jbyQbCGQXzoxgKk%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;328&quot; height=&quot;309&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 24. 브라우저에서 우클릭/Inspect[요소검사]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저에서 우클릭/Inspect[요소검사] 를 하여 HTML 코드를 볼 수 있다. 개발자도구의 Elements 탭과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6lw9V/btqByGR1CfZ/WGIvLjdmMAggSRo62pNqmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6lw9V/btqByGR1CfZ/WGIvLjdmMAggSRo62pNqmk/img.png&quot; data-alt=&quot;Fig 25. Fig 23 하단에 의해 생성된 HTML 태그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6lw9V/btqByGR1CfZ/WGIvLjdmMAggSRo62pNqmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6lw9V%2FbtqByGR1CfZ%2FWGIvLjdmMAggSRo62pNqmk%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;344&quot; height=&quot;84&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 25. Fig 23 하단에 의해 생성된 HTML 태그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 25 의 HTML 태그는 Fig 23 하단의 document.write에 의해 만들어진 태그이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for in 문은 객체 뿐 아니라 배열에서도 사용 가능하다.&lt;/p&gt;
&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;객체지향 프로그래밍&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Mi33-EcMn48&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7Zllq/btqBuix4npu/wNOROrVtEOVLL0LLZGw37k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7Zllq/btqBuix4npu/wNOROrVtEOVLL0LLZGw37k/img.png&quot; data-alt=&quot;Fig 26. 객체의 value 역시 객체일 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7Zllq/btqBuix4npu/wNOROrVtEOVLL0LLZGw37k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7Zllq%2FbtqBuix4npu%2FwNOROrVtEOVLL0LLZGw37k%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;564&quot; height=&quot;248&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 26. 객체의 value 역시 객체일 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체를 정의할 때 { } 의 내용을 행바꾸기하여 쓸 수 있다. 객체의 value는 객체일 수도 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grades.list , grades['list']&amp;nbsp; 는 모두 {'saltfun': 30, 'mirgiana':45, 'toga':52} 를 가리킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 30, 45, 52 등 객체 value 안의 value를 가리키려면 다음의 방법들을 쓸 수 있으며 의미는 모두 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grades.list.toga&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grades.list['toga']&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grades['list'].toga&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grades['list']['toga']&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grades 객체 안에는 위에서 본 것과 같이 'list' key 에 해당하는 value 외에도 또 다른 값을 담을 수 있는데 함수[함수 역시 객체]도 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NZxIm/btqBuwv5lYu/9VLdtI4KKmXxFTKERVEPB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NZxIm/btqBuwv5lYu/9VLdtI4KKmXxFTKERVEPB0/img.png&quot; data-alt=&quot;Fig 27. 객체의 value 는 함수도 가능하다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NZxIm/btqBuwv5lYu/9VLdtI4KKmXxFTKERVEPB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNZxIm%2FbtqBuwv5lYu%2F9VLdtI4KKmXxFTKERVEPB0%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;684&quot; height=&quot;470&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 27. 객체의 value 는 함수도 가능하다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 함수를 호출하기 위해 key로 지정한 후 grades['show'](); 와 같이 뒤에 ( ) 를 덧붙인다. Fig 27에서는 ( )를 붙이면 함수가 호출되어 실행되어 웹브라우저에 결과가 나타나지만 [document.write에 의해 grades['show']의 내용을 나타낸다], ( )가 없으면 그냥 콘솔에 value 만을 보여주고 웹브라우저에는 영향을 주지 못한다는 것을 보여주고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마치도 grades라는 클래스안의 'show'라는 메서드 처럼. 놀랍다.&amp;nbsp; 함수도 값이고 함수도 변수에 저장될 수 있고 값으로서의 함수는 객체 안에 저장될 수 있는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 안에서 this를 사용하면 함수가 속해있는 객체를 가리키는 변수를 뜻한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;864&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZGtD9/btqBxzyQVYP/bNFrrk1Tg689TvuMLeAKk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZGtD9/btqBxzyQVYP/bNFrrk1Tg689TvuMLeAKk1/img.png&quot; data-alt=&quot;Fig 28. 함수 안의 this는 함수가 속한 객체 grades를 뜻함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZGtD9/btqBxzyQVYP/bNFrrk1Tg689TvuMLeAKk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZGtD9%2FbtqBxzyQVYP%2FbNFrrk1Tg689TvuMLeAKk1%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;536&quot; height=&quot;781&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;864&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 28. 함수 안의 this는 함수가 속한 객체 grades를 뜻함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfWNF7/btqBtFVhl9q/OOi67vLfe46tt4EO5JdFuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfWNF7/btqBtFVhl9q/OOi67vLfe46tt4EO5JdFuk/img.png&quot; data-alt=&quot;Fig 29. 웹브라우저에서는 객체의 value가 객체일 때 값을 보여주지 않고 그냥 object라는 내용만 보여준다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfWNF7/btqBtFVhl9q/OOi67vLfe46tt4EO5JdFuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfWNF7%2FbtqBtFVhl9q%2FOOi67vLfe46tt4EO5JdFuk%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;530&quot; height=&quot;485&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 29. 웹브라우저에서는 객체의 value가 객체일 때 값을 보여주지 않고 그냥 object라는 내용만 보여준다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT6yqT/btqBvs03wlw/Y9QwokOok9BKDIJtm3VUR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT6yqT/btqBvs03wlw/Y9QwokOok9BKDIJtm3VUR1/img.png&quot; data-alt=&quot;Fig 30. console.log 를 이용하면 console에서 객체 안 value 가 객체여도 내용을 볼 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT6yqT/btqBvs03wlw/Y9QwokOok9BKDIJtm3VUR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT6yqT%2FbtqBvs03wlw%2FY9QwokOok9BKDIJtm3VUR1%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;533&quot; height=&quot;426&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 30. console.log 를 이용하면 console에서 객체 안 value 가 객체여도 내용을 볼 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBMaw0/btqBuvRugxp/tsDPcMpmlxJSwWA0vIHat0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBMaw0/btqBuvRugxp/tsDPcMpmlxJSwWA0vIHat0/img.png&quot; data-alt=&quot;Fig 31. console.log의 인자는 컴마로 구분하여 여러 개를 줄 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBMaw0/btqBuvRugxp/tsDPcMpmlxJSwWA0vIHat0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBMaw0%2FbtqBuvRugxp%2FtsDPcMpmlxJSwWA0vIHat0%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;600&quot; height=&quot;324&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;324&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 31. console.log의 인자는 컴마로 구분하여 여러 개를 줄 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grades['show']();&amp;nbsp; &amp;nbsp;를 grades.show(); 로 쓸 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grades는 'list'라는 데이터와 'show'라는 함수를 그룹핑한 그릇이라고 볼 수 있다. 'list' 데이터와 'show' 함수는 아무런 관련성이 없는 건 아니고 어느 정도 연관성을 갖고 있으며 이러한 것들을 가리켜 객체지향 프로그래밍이라고 한다.&amp;nbsp; &amp;nbsp;서로 연관되어 있는 데이터와 연관되어 있는 처리를 하나의 그릇 안에 모아 그루핑해놓은 프로그래밍 스타일 기법이 객체지향 프로그래밍이다. 자세한 내용은 뒤에서 다룬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#mainCnt&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;module&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;모듈&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모듈이란&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/bRC9RT9JP18&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램은 작고 단순한 것에서 크고 복잡한 것으로 진화한다. 그 과정에서 코드의 재활용성을 높이고, 유지보수를 쉽게 할 수 있는 다양한 기법들이 사용된다. 그 중의 하나가 코드를 여러개의 파일로 분리하는 것이다. 이를 통해서 얻을 수 있는 효과는 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&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;li&gt;한번 다운로드된 모듈은 웹브라우저에 의해서 저장되기 때문에 동일한 로직을 로드 할 때 시간과 네트워크 트래픽을 절약 할 수 있다. (브라우저에서만 해당)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;모듈이란&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순수한 자바스크립트에서는 모듈(module)이라는 개념이 분명하게 존재하지는 않는다. 하지만 자바스크립트가 구동되는 호스트 환경에 따라서 서로 다른 모듈화 방법이 제공되고 있다. 이 수업에서는 자바스크립트의 대표적인 호스트 환경인 웹브라우저에서 로직을 모듈화하는 방법에 대해서 알아볼 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호스트 환경이란?&lt;br /&gt;&lt;br /&gt;호스트 환경이란 자바스크립트가 구동되는 환경을 의미한다. 자바스크립트는 브라우저를 위한 언어로 시작했지만, 더 이상 브라우저만을 위한 언어가 아니다. 예를들어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://nodejs.org/about/&quot;&gt;node.js&lt;/a&gt;는 서버 측에서 실행되는 자바스크립트다. 이 언어는 자바스크립트의 문법을 따르지만 이 언어가 구동되는 환경은 브라우저가 아니라 서버측 환경이다. 또 구글의 제품 위에서 돌아가는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://developers.google.com/apps-script/&quot;&gt;Google Apps Script&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;역시 자바스크립트이지만 google apps script가 동작하는 환경은 구글 스프레드쉬트와 같은 구글의 제품 위이다. 여러분은 자바스크립트의 문법을 이용해서 PHP와 같은 서버 시스템을 제어(node.js)하거나 구글의 제품(Google Apps Script)을 제어 할 수 있다. 지금 당장은 어렵겠지만, 언어와 그 언어가 구동되는 환경에 대해서 구분해서 사고 할 수 있어야 한다. 이를 위해서는 다양한 언어를 접해봐야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호스트 환경에 따라 모듈을 사용하는 방법이 다르기 때문에 각각의 환경별로 모듈화 방법을 별도로 학습해야 한다. 여기서는 기본적으로 웹브라우저에서 파일을 include 하는, 즉 모듈화 하는 방법에 대해 중점적으로 다룬다. 다른 호스트 환경에서의 모듈화 방법은 각자의 매뉴얼을 참고하여햐 한다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;모듈화&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/ljohLVTdWLU&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;615&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kQnz8/btqBtGUdLd8/Wjk0v2vsnKDYbLr0MSyVvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kQnz8/btqBtGUdLd8/Wjk0v2vsnKDYbLr0MSyVvk/img.png&quot; data-alt=&quot;Fig 32. HTML안에 javascript 코드가 들어있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kQnz8/btqBtGUdLd8/Wjk0v2vsnKDYbLr0MSyVvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkQnz8%2FbtqBtGUdLd8%2FWjk0v2vsnKDYbLr0MSyVvk%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;404&quot; height=&quot;441&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;615&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 32. HTML안에 javascript 코드가 들어있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Fig 32안의 javascript 함수를 따로 파일로 분리하여 모듈화를 해본다. 8행의 type=&quot;text/javascript&quot; 최신 javascript 스펙에서는 생략이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 33과 같이 5행에 외부의 javascript 파일을 불러오는 &amp;lt;script&amp;gt; 태그를 넣어주면 src 속성에 지정한 .js 로 된 javascript 파일을 &amp;lt;script&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;647&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJnE3/btqBxAdtnuR/dzq7BU9lT7hgpXjJxvA0t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJnE3/btqBxAdtnuR/dzq7BU9lT7hgpXjJxvA0t0/img.png&quot; data-alt=&quot;Fig 33. javascript 코드를 분리하여 5행에서 외부파일로 읽어옴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJnE3/btqBxAdtnuR/dzq7BU9lT7hgpXjJxvA0t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJnE3%2FbtqBxAdtnuR%2Fdzq7BU9lT7hgpXjJxvA0t0%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;427&quot; height=&quot;354&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 33. javascript 코드를 분리하여 5행에서 외부파일로 읽어옴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxSQT2/btqBuaNR6GK/gVZF897Jc5TVZixkMlvCu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxSQT2/btqBuaNR6GK/gVZF897Jc5TVZixkMlvCu1/img.png&quot; data-alt=&quot;Fig 34. greeting.js 파일에 welcome( ) 함수를 따로 정의하여 모듈화를 함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxSQT2/btqBuaNR6GK/gVZF897Jc5TVZixkMlvCu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxSQT2%2FbtqBuaNR6GK%2FgVZF897Jc5TVZixkMlvCu1%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;271&quot; height=&quot;106&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 34. greeting.js 파일에 welcome( ) 함수를 따로 정의하여 모듈화를 함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Node.js 의 모듈화&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/tIAuSqpIlfs&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nodejs 는 서버쪽 javascript, 웹브라우저에서 동작하는 javascript는 클라이언트쪽 javascript 이다. nodejs에서 어떻게 모듈을 로드하는 가를 통해 모듈을 로드하는 기능 자체는 javascript 자체가 가지고 있는 기능이 아니고 각각의 호스트환경 [nodejs, 웹브라우저, 구글스프레드시트 등] 에 따라 javascript를 분할하여 읽어들이는 메카니즘이 다르다는 것을 다소 파악할 수 있을 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nodejs는 모듈화된 javascript파일을 읽어 올 때 require 함수를 호출하는데, 가져오려고 하는 javascript 파일을 함수의 인자값으로 준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuGkNY/btqBvtyUWKg/uw1HANKLs75sCqr8zVKkH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuGkNY/btqBvtyUWKg/uw1HANKLs75sCqr8zVKkH1/img.png&quot; data-alt=&quot;Fig 35. nodejs 에서 외부 javascript 파일을 불러오는 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuGkNY/btqBvtyUWKg/uw1HANKLs75sCqr8zVKkH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuGkNY%2FbtqBvtyUWKg%2Fuw1HANKLs75sCqr8zVKkH1%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;643&quot; height=&quot;159&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 35. nodejs 에서 외부 javascript 파일을 불러오는 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0t7jz/btqBuvYfhO7/UpHjyiKLXuN0jKa9kiz21k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0t7jz/btqBuvYfhO7/UpHjyiKLXuN0jKa9kiz21k/img.png&quot; data-alt=&quot;Fig 36. 모듈로 존재하는 파일의 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0t7jz/btqBuvYfhO7/UpHjyiKLXuN0jKa9kiz21k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0t7jz%2FbtqBuvYfhO7%2FUpHjyiKLXuN0jKa9kiz21k%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;474&quot; height=&quot;360&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 36. 모듈로 존재하는 파일의 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 36에서와 같이 모듈로 존재하는 파일에서 외부에서 호출될 함수를 정의할 때 앞에 exports. 가 있는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node.demo.js 를 실행시키면 결과는 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGzYSc/btqBxAdtC4O/WK1DMCHwRMpb4EdTeCyYXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGzYSc/btqBxAdtC4O/WK1DMCHwRMpb4EdTeCyYXK/img.png&quot; data-alt=&quot;Fig 37. node.demo.js 의 실행결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGzYSc/btqBxAdtC4O/WK1DMCHwRMpb4EdTeCyYXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGzYSc%2FbtqBxAdtC4O%2FWK1DMCHwRMpb4EdTeCyYXK%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;676&quot; height=&quot;96&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 37. node.demo.js 의 실행결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFhNAA/btqByG5AKf0/YA5B2AkX8knhJCbskW1Tlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFhNAA/btqByG5AKf0/YA5B2AkX8knhJCbskW1Tlk/img.png&quot; data-alt=&quot;Fig 38. cmd 창에서 실행방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFhNAA/btqByG5AKf0/YA5B2AkX8knhJCbskW1Tlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFhNAA%2FbtqByG5AKf0%2FYA5B2AkX8knhJCbskW1Tlk%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;1375&quot; height=&quot;780&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 38. cmd 창에서 실행방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&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;라이브러리란&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/3mBUrrsGpPU&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;라이브러리는 모듈과 비슷한 개념이다. 모듈이 프로그램을 구성하는 작은 부품으로서의 로직을 의미한다면 라이브러리는 자주 사용되는 로직을 재사용하기 편리하도록 잘 정리한 일련의 코드들의 집합을 의미한다고 할 수 있다. 프로그래밍의 세계에는 휼룡한 라이브러리가 많다. 좋은 라이브러리를 선택하고 잘 사용하는 것은 프로그래밍의 핵심이라고 할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;프로그래밍의 세계에는 아주 많은 라이브러리가 존재한다. 프로그래머들의 독특한 문화인 오픈 소스를 통해 만들어진 수많은 라이브러리가 있기 때문에 뭔가를 직접 만드는 것도 좋겠지만 누군가가 이미 만들어 놓았는지 당연히 먼저 검색, 질문 등을 통하여 찾아보는 것이 순서이다. 공개된 라이브러리는 만들 때 목적이 그 자체였고 여러 사람이 모여서 만들었기 때문에 혼자 힘으로 그보다 더 나은 결과물을 얻어내는 것은 거의 불가능에 가깝다. 따라서 프로그래밍을 할 때에는 좋은 라이브러리가 있는지를 먼저 잘 찾아내는 것이 매우 중요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;javascript로 웹브라우저를 제어하는 방법으로는 기본적으로 웹브라우저와 javascript가 제공하는 하는 것들을 사용하는 것인데, 다른 어떤 좋은 라이브러리라고 하여도 모두 이것들이 허용하는 범위의 기술을 이용하여 만들어진 것이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;하지만 라이브러리는 웹브라우저나 javascript가 받아들일 수 있는 범위의 기술을 특정목적에 맞게 잘 짜 놓은 코드들의 집합이기 때문에, 좋은 라이브러리 한 줄의 기능을 직접적으로 구현하려고 하면 1달, 1년이 걸릴 수도 있고 길이가 10000행에 이를 수도 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;javascript의 라이브러리에서 사람들에게 널리 알려지고 많이 쓰이는 라이브러리 중의 하나는 현 시점에서 jQuery라고 할 수 있다. 하지만 라이브러리도 그 시대의 유행이나 흐름에 따라 달라지기 때문에 접하는 시점에 따라 사람들이 많이 사용하는 라이브러리도 변할 수 있다는 점을 항상 념두에 두어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;a href=&quot;https://jquery.com/&quot;&gt;https://jquery.com/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;1478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pHyCf/btqBxBcoWMV/UieM9qraFENLfLkDkhBkF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pHyCf/btqBxBcoWMV/UieM9qraFENLfLkDkhBkF0/img.png&quot; data-alt=&quot;Fig 39. jQuery 홈페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pHyCf/btqBxBcoWMV/UieM9qraFENLfLkDkhBkF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpHyCf%2FbtqBxBcoWMV%2FUieM9qraFENLfLkDkhBkF0%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;1263&quot; height=&quot;1478&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;1478&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 39. jQuery 홈페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jQuery를 사용하기 위해 중요한 두 가지가 있다. 우선 jQuery의 javascript 파일을 자신의 웹페이지에 가져와야 한다. 다운로드를 받으면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 하나는 API Documentation인데, API 는 jQuery가 사용자들에게 제공하는 명령어 리스트이다. 즉 jQuery 명령어들의 사용설명서가 API Documentation 이다.&amp;nbsp; &lt;a href=&quot;http://api.jquery.com&quot;&gt;http://api.jquery.com&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jQuery 파일을 다운 받는 것과 어떤 기능이 있는지를 파악하는 것이 핵심이다.&lt;/p&gt;
&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;라이브러리의 사용&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/8Ib3qbWrD-4&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 내용은&lt;a href=&quot;https://www.opentutorials.org/course/53&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; jQuery 수업&lt;/a&gt;을 참고하고 여기서는 라이브러리가 무엇인가를 체험하기 위한 예시 정도로 다룬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P9QFO/btqBtW3lCCu/5L1QigfJB0XK9nZSdkWZgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P9QFO/btqBtW3lCCu/5L1QigfJB0XK9nZSdkWZgk/img.png&quot; data-alt=&quot;Fig 40. 다운로드. uncompressed, developmet jQuery x.x.x&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P9QFO/btqBtW3lCCu/5L1QigfJB0XK9nZSdkWZgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP9QFO%2FbtqBtW3lCCu%2F5L1QigfJB0XK9nZSdkWZgk%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;1080&quot; height=&quot;752&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 40. 다운로드. uncompressed, developmet jQuery x.x.x&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;1489&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CI6k1/btqBtMzWlWn/gJvNVLs9pFhQDwft59l8J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CI6k1/btqBtMzWlWn/gJvNVLs9pFhQDwft59l8J0/img.png&quot; data-alt=&quot;Fig 41. jQuery-3.4.1.js 의 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CI6k1/btqBtMzWlWn/gJvNVLs9pFhQDwft59l8J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCI6k1%2FbtqBtMzWlWn%2FgJvNVLs9pFhQDwft59l8J0%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;1029&quot; height=&quot;1489&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;1489&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 41. jQuery-3.4.1.js 의 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jQuery-3.4.1.js는 10598행에 이른다. jQuery를 이용하는 방법을 살펴보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ti1Yu/btqByGYQlEQ/vGmXamv7EFGiaBZ6JB3o01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ti1Yu/btqByGYQlEQ/vGmXamv7EFGiaBZ6JB3o01/img.png&quot; data-alt=&quot;Fig 42.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ti1Yu/btqByGYQlEQ/vGmXamv7EFGiaBZ6JB3o01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fti1Yu%2FbtqByGYQlEQ%2FvGmXamv7EFGiaBZ6JB3o01%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;336&quot; height=&quot;437&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 42.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;142&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOWma4/btqBxAkguYA/6PXKua4VLbKvFCDnZ0j2s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOWma4/btqBxAkguYA/6PXKua4VLbKvFCDnZ0j2s1/img.png&quot; data-alt=&quot;Fig 43. Fig 42의 웹브라우저 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOWma4/btqBxAkguYA/6PXKua4VLbKvFCDnZ0j2s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOWma4%2FbtqBxAkguYA%2F6PXKua4VLbKvFCDnZ0j2s1%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;142&quot; height=&quot;141&quot; data-origin-width=&quot;142&quot; data-origin-height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 43. Fig 42의 웹브라우저 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Fig 42 의 HTML 파일에 jQuery.js 파일을 삽입하고 브라우저에서 잘 읽어 들였는지 확인해보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/njp0o/btqBtW98lIG/moklcICCvdWcGMUCMmxgfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/njp0o/btqBtW98lIG/moklcICCvdWcGMUCMmxgfK/img.png&quot; data-alt=&quot;Fig 44. jquery-3.4.1.js 읽어들이기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/njp0o/btqBtW98lIG/moklcICCvdWcGMUCMmxgfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnjp0o%2FbtqBtW98lIG%2FmoklcICCvdWcGMUCMmxgfK%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;538&quot; height=&quot;493&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 44. jquery-3.4.1.js 읽어들이기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/msrZM/btqBvtFHbyG/NOLCoPWNFNg4GSMGMvknoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/msrZM/btqBvtFHbyG/NOLCoPWNFNg4GSMGMvknoK/img.png&quot; data-alt=&quot;Fig 45. 웹페이지/우클릭/Inspect [요소검사]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/msrZM/btqBvtFHbyG/NOLCoPWNFNg4GSMGMvknoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmsrZM%2FbtqBvtFHbyG%2FNOLCoPWNFNg4GSMGMvknoK%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;400&quot; height=&quot;437&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 45. 웹페이지/우클릭/Inspect [요소검사]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tJuud/btqBujX5B7x/aBHc94CFM5DjZk3hkHYdv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tJuud/btqBujX5B7x/aBHc94CFM5DjZk3hkHYdv1/img.png&quot; data-alt=&quot;Fig 46. 개발자도구/Network 탭을 Reload 하면 jquery.js 가 확인됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tJuud/btqBujX5B7x/aBHc94CFM5DjZk3hkHYdv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtJuud%2FbtqBujX5B7x%2FaBHc94CFM5DjZk3hkHYdv1%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;653&quot; height=&quot;369&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 46. 개발자도구/Network 탭을 Reload 하면 jquery.js 가 확인됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 44의 10~13 행을 제어할 것인데, 14행 뒤에 &amp;lt;script&amp;gt; 태그를 써보자. jQuery에서 약속되어있는 예약어 $로 시작해야한다. jQuery는 모든 경우 $로 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'#list': id 값이 list인 태그를 가리킴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'#list li': id 값이 list 인 태그의 하위태그가 li 인 태그를 말함. Fig 44의 10~13 행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mIWyT/btqByFr6A6F/bthkV45Fi6QqBYOMQIghx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mIWyT/btqByFr6A6F/bthkV45Fi6QqBYOMQIghx0/img.png&quot; data-alt=&quot;Fig 47. jQuery 사용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mIWyT/btqByFr6A6F/bthkV45Fi6QqBYOMQIghx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmIWyT%2FbtqByFr6A6F%2FbthkV45Fi6QqBYOMQIghx0%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;531&quot; height=&quot;516&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 47. jQuery 사용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;215&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czB5hh/btqBuwJGwZl/ZuIvb4FF6d3zQqmsiu7NB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czB5hh/btqBuwJGwZl/ZuIvb4FF6d3zQqmsiu7NB0/img.png&quot; data-alt=&quot;Fig 48. Fig 47의 웹브라우저 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czB5hh/btqBuwJGwZl/ZuIvb4FF6d3zQqmsiu7NB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczB5hh%2FbtqBuwJGwZl%2FZuIvb4FF6d3zQqmsiu7NB0%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;215&quot; height=&quot;130&quot; data-origin-width=&quot;215&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 48. Fig 47의 웹브라우저 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 특정한 버튼을 눌렀을 때 위에서 본 것과 같은 'good'이 'You and I Forever!!!' 로 바뀌게 해보자. 버튼 추가 방법은 이렇다. 14행 뒤에 &amp;lt;input&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;959&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUiu53/btqByHcnDF0/jk2YfzoBtRHngnVnkUMJs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUiu53/btqByHcnDF0/jk2YfzoBtRHngnVnkUMJs0/img.png&quot; data-alt=&quot;Fig 49. 버튼 삽입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUiu53/btqByHcnDF0/jk2YfzoBtRHngnVnkUMJs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUiu53%2FbtqByHcnDF0%2Fjk2YfzoBtRHngnVnkUMJs0%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;684&quot; height=&quot;39&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;54&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 49. 버튼 삽입&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;243&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nfwZ3/btqBuRfJyYS/YS3oOCU580PJUhO489K621/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nfwZ3/btqBuRfJyYS/YS3oOCU580PJUhO489K621/img.png&quot; data-alt=&quot;Fig 50. execute 버튼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nfwZ3/btqBuRfJyYS/YS3oOCU580PJUhO489K621/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnfwZ3%2FbtqBuRfJyYS%2FYS3oOCU580PJUhO489K621%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;219&quot; height=&quot;158&quot; data-origin-width=&quot;243&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 50. execute 버튼&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 execute버튼을 클릭했을 때 good에서 You and I Forever!!! 로 바뀌게 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;903&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KYsQe/btqBuRfJFla/oc3iYjjQ07i1JlGmUQID21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KYsQe/btqBuRfJFla/oc3iYjjQ07i1JlGmUQID21/img.png&quot; data-alt=&quot;Fig 51. id가 execute-btn 인 태그에서 click이 발생하면 ( ) 안의 function 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KYsQe/btqBuRfJFla/oc3iYjjQ07i1JlGmUQID21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKYsQe%2FbtqBuRfJFla%2Foc3iYjjQ07i1JlGmUQID21%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;662&quot; height=&quot;620&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;903&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 51. id가 execute-btn 인 태그에서 click이 발생하면 ( ) 안의 function 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Document-Google-Chrome-2020-01-26-18-57-27.gif&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3mSZv/btqBtLHSsnR/7GihPUzA9GkmKsUaOyyATk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3mSZv/btqBtLHSsnR/7GihPUzA9GkmKsUaOyyATk/img.gif&quot; data-alt=&quot;Fig 52 버튼을 누를 때 내용이 변한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3mSZv/btqBtLHSsnR/7GihPUzA9GkmKsUaOyyATk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/3mSZv/btqBtLHSsnR/7GihPUzA9GkmKsUaOyyATk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;253&quot; data-filename=&quot;Document-Google-Chrome-2020-01-26-18-57-27.gif&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 52 버튼을 누를 때 내용이 변한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 52와 같은 동작을 구현하기 위해 jQuery를 사용하면 17, 18행의 단 2 줄의 코드만 사용하였지만 jQuery를 사용하지 않고 javascript와 웹브라우저의 기본기능만으로 구현하려면 코드길이가 꽤 만만치 않다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;891&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ArgYM/btqBxALnSE2/ILx5aV3nnigWSbtQK2ylqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ArgYM/btqBxALnSE2/ILx5aV3nnigWSbtQK2ylqk/img.png&quot; data-alt=&quot;Fig 53. Fig 51과 같은 기능을 구현. jQuery를 쓰지 않음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ArgYM/btqBxALnSE2/ILx5aV3nnigWSbtQK2ylqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FArgYM%2FbtqBxALnSE2%2FILx5aV3nnigWSbtQK2ylqk%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;723&quot; height=&quot;781&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;891&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 53. Fig 51과 같은 기능을 구현. jQuery를 쓰지 않음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 53의 코드가 Fig 51과 같은 기능을 수행한다고는 하지만 여러 가지 문제점을 가지고 있는 완벽치 않은 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#mainCnt&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;uiNapi&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;UI와&amp;nbsp;API&amp;nbsp;그리고&amp;nbsp;문서보는&amp;nbsp;법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;UI와 API&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Z4kH0IZVT-8&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;User Interface&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Application Programming Interface의 약자로 프로그램이 동작하는 환경을 제어하기 위해서 환경에서 제공되는 조작 장치이다. 이 조작 장치는 프로그래밍 언어를 통해서 조작할 수 있다. 아래 영상은 UI와 API의 차이점을 설명하기 위한 자료이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3UhG1/btqBuQOI381/tkrlTFGIFpXP0hZ6iNOC5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3UhG1/btqBuQOI381/tkrlTFGIFpXP0hZ6iNOC5k/img.png&quot; data-alt=&quot;Fig 54. 브라우저에 상관없이 javascript 코드를 주소창에 입력하면 실행이 된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3UhG1/btqBuQOI381/tkrlTFGIFpXP0hZ6iNOC5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3UhG1%2FbtqBuQOI381%2FtkrlTFGIFpXP0hZ6iNOC5k%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;785&quot; height=&quot;373&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 54. 브라우저에 상관없이 javascript 코드를 주소창에 입력하면 실행이 된다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxAkV9/btqBtMz0C0L/fOiXdNTn0D7iwAdrhdjTxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxAkV9/btqBtMz0C0L/fOiXdNTn0D7iwAdrhdjTxk/img.png&quot; data-alt=&quot;Fig 55.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxAkV9/btqBtMz0C0L/fOiXdNTn0D7iwAdrhdjTxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxAkV9%2FbtqBtMz0C0L%2FfOiXdNTn0D7iwAdrhdjTxk%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;341&quot; height=&quot;288&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 55.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문서 보는 법&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/iH_6iP2zKnc&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;레퍼런스와 튜토리얼&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래밍을 공부하기 위한 자료는 크게 레퍼런스(reference)와 tutorial(안내서)가 있다. 통상 튜토리얼은 언어의 문법을 설명하고, 레퍼런스는 명령어의 사전을 의미하다. 본 수업은 자바스크립트에 대한 일종의 안내서라고 할 수 있고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://opentutorials.org/course/50&quot;&gt;자바스크립트 사전&lt;/a&gt;은&amp;nbsp;레퍼런스라고 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;자바스크립트의 API&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트의 API는 크게 자바스크립트 자체의 API와 자바스크립트가 동작하는 호스트 환경의 API로 구분된다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;자바스크립트 API 문서&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ecma-international.org/publications/standards/Ecma-262.htm&quot;&gt;ECMAScript (표준문서)&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
ECMAScript는 javascript와 같은 의미이다. javascript의 원래 이름은 LiveScript 였고, Java랑 합쳐지면서 JavaScript가 되고 표준화의 길을 걷게 되면서 ECMA에 표준화를 위임. ECMA에서 javascript라는 이름을 사용할 수 없었기 때문에 ECMAScript라는 이름을 사용하여 표준안이 만들어지게 되었다.&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;972&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CEVnR/btqBxBjgeOc/VB6kSWI0kyjdhMosaUxamK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CEVnR/btqBxBjgeOc/VB6kSWI0kyjdhMosaUxamK/img.png&quot; data-alt=&quot;Fig 56. ECMA Script&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CEVnR/btqBxBjgeOc/VB6kSWI0kyjdhMosaUxamK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCEVnR%2FbtqBxBjgeOc%2FVB6kSWI0kyjdhMosaUxamK%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;953&quot; height=&quot;972&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;972&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 56. ECMA Script&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;javascript의 기능을 추가하거나 없애거나 하는 일을 ECMA International 이라는 기구에서 진행하는데 그 기구에서 표준안에 대한 문서가 ECMA-262.pdf 이다. 764페이지에 달할 정도로 방대하고 어렵다. 일반적인 javascript 프로그래머들을 위한 매뉴얼이 아닌 javascript가 동작하는 환경을 만드는 개발자들을 위한 문서라고 볼 수 있다. 따라서 이 문서를 보고 공부를 할 수 있다면 가장 좋겠으나 쉬운 일은 아니다. 어렵긴 하지만 가장 표준이기 때문에 야심찬 분들은 도전해봐도 좋을 것이다.&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;MDN: Mozilla Development Network 즉 Firefox에서 제공하는 레퍼런스이며, 생활코딩의 자바스크립트 사전은 MDN의 자바스크립트 레퍼런스를 아주 많이 참고한 한글화된 레퍼런스라고 볼 수 있다.&amp;nbsp; MDN에는 javascript뿐 아니라 HTML과 CSS에 대해서도 자세한 내용을 다루고 있다.&amp;nbsp; 한글화는 제한적이지만 생활코딩의 자바스크립트사전보다는 훨씬 풍부한 내용을 담고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;1396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biMytv/btqBvsNCDrj/XpBEkpKVj6q5CuM8DBZPCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biMytv/btqBvsNCDrj/XpBEkpKVj6q5CuM8DBZPCk/img.png&quot; data-alt=&quot;Fig 57. MDN 의 JavaScript references&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biMytv/btqBvsNCDrj/XpBEkpKVj6q5CuM8DBZPCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiMytv%2FbtqBvsNCDrj%2FXpBEkpKVj6q5CuM8DBZPCk%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;1350&quot; height=&quot;1396&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;1396&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 57. MDN 의 JavaScript references&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSDN: 마이크로소프트에서도 JScript에 대한 내용을 제공하고 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&amp;nbsp; &amp;nbsp;
&lt;li&gt;&lt;a href=&quot;http://opentutorials.org/course/50&quot;&gt;자바스크립트 사전 (생활코딩)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference&quot;&gt;자바스크립트 레퍼런스 (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/ko-kr/library/vstudio/z688wt03(v=vs.100).aspx&quot;&gt;jscript 레퍼런스 (MSDN)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기 까지는 JavaScript라는 언어자체에 대한 API이고 JavaScript가 기본적으로 제공하는 API이기 때문에 호스트환경에 상관없이 공통적으로 사용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;호스트 환경의 API 문서&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API&quot;&gt;웹브라우저 API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://nodejs.org/api/&quot;&gt;Node.js API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/apps-script/&quot;&gt;Google Apps Script API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 호스트 환경마다 다른 API가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;웹브라우저API&lt;/b&gt; 는 역시 모질라의 MDN Web APIs 에 대한 링크로 가면 엄청난 량의 자료가 있다.&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;1073&quot; data-origin-height=&quot;1375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm6JWi/btqBtM04Mcg/oFfnUkWugXSMgWbbykYVKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm6JWi/btqBtM04Mcg/oFfnUkWugXSMgWbbykYVKK/img.png&quot; data-alt=&quot;Fig 58. MDN의 Web APIs&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm6JWi/btqBtM04Mcg/oFfnUkWugXSMgWbbykYVKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm6JWi%2FbtqBtM04Mcg%2FoFfnUkWugXSMgWbbykYVKK%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;1073&quot; height=&quot;1375&quot; data-origin-width=&quot;1073&quot; data-origin-height=&quot;1375&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 58. MDN의 Web APIs&lt;/figcaption&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;Node.js : nodejs 환경에서 제어하고 사용해야 하는 API들에 대한 내용을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google Apps Script API: 구글의 제품들을 javascript를 써서 프로그래밍적으로 제어하기 위한 여러 가지 호스트 환경의 API들이 나열 되어있다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gmail, Map, Site, 등 구글의 제품들을 제어할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#mainCnt&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;regexp&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;정규표현식&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;오리엔테이션&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/5pN3_yGmbrA&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정규표현식: regular expression&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정규표현식(regular expression)은 문자열에서 특정한 문자를 찾아내는 도구다. 이 도구를 이용하면 수십줄이 필요한 작업을 한줄로 끝낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정규표현식은 하나의 언어라고 할 수 있다. 그러므로 본 수업에서 정규표현식의 모든 것을 다루는 것은 불가능하다. 본 수업은 아래와 같은 전략을 취하고 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;입문자에게 정규표현식이 무엇인가에 대한 개념을 알려준다. 초심자에게는 사용법까지 공부하는 것은 무리다. 나중에 문자를 처리해야하는 상황이 생겼을 때 이곳을 찾아오거나 본 수업을 완주했을 때 마지막 단계로 본 수업을 공부한다.&lt;/li&gt;
&lt;li&gt;정규표현식을 이미 알고 있는 개발자에게는 정규표현식을 자바스크립트에서는 어떻게 사용하는가를 알려준다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;정규표현식 자체에 대한 학습이 필요하다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://opentutorials.org/course/909&quot;&gt;정규표현식 수업&lt;/a&gt;을 공부하자.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정규표현식은 JavaScript 뿐만아니라, JAVA에서도, Perl에서도 기타 수많은 언어들에서 사용되며 정규표현식 전반에 대해 여기서 다루는 것은 무리이고 단지 javascript에서 어떻게 사용하는 지에 대해서만 다룬다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정규표현식은 아주 강력한 도구이고 특히 javascript와 같이 web과 관련된 즉 어떤 정보와 관련된 일을 처리하는 언어에서는 정규표현식이 매우 중요하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정규표현식은 예를 들어 이런 거다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;생활코딩: htttp://opentutorials.org/course/1 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;네이버: http://naver.com&amp;nbsp;입니다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이런 내용이 있다 치자. 이제 문장 안에 있는 주소를 링크를 걸어주기 위해 &amp;lt;a&amp;gt;태그를 써야 한다면 이렇게 될 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHAkbc/btqBujcOaUq/sfDtboSgWSQUWRamNva4mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHAkbc/btqBujcOaUq/sfDtboSgWSQUWRamNva4mk/img.png&quot; data-alt=&quot;Fig 60&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHAkbc/btqBujcOaUq/sfDtboSgWSQUWRamNva4mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHAkbc%2FbtqBujcOaUq%2FsfDtboSgWSQUWRamNva4mk%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;1156&quot; height=&quot;104&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 60&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 이렇게 처리해야 할 내용이 아주 많다면 사람이 하기에는 매우 어려울 것이다. 이런 것들을 프로그래밍적으로 아주 짧은 코드로 처리할 수 있도록 해주는 것이 바로 정규표현식이다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; 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;h3 data-ke-size=&quot;size23&quot;&gt;패턴 만들기&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/yZ0gW_VslE8&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성: 정규표현식은 두가지 단계로 이루어진다. 하나는 컴파일(compile) 다른 하나는 실행(execution)이다. 우선 컴파일부터 알아보자.&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;우선 컴파일 단계부터 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정규표현식에서 패턴을 만드는 방법에는 크게 2가지가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째는 &lt;b&gt;정규표현식 리터럴&lt;/b&gt;이라는 방법이다.&amp;nbsp; &amp;nbsp;var str = &quot;a&quot;; 와 비슷한데 &quot; &quot;가 아닌 / /안에 찾고자 하는 대상을 넣는다. 아래 그림에서 /a/ 의 a가 찾고자 하는 대상이다라는 것을 pattern이라는 변수에 담아 pattern이라는 변수를 통해 찾고자 하는 것을 사용할 수 있게 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 하나의 방법은 &lt;b&gt;정규표현식 객체 생성자&lt;/b&gt;라는 방법이다. 똑같이 변수 이름을 pattern으로 하고 new RegExp('a') 로 정규표현식 객체를 만든다. 찾고자 하는 패턴이 'a'라는 것을 의미한다.&amp;nbsp; 이것은 /a/와 같은 의미를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘다 정규표현식 객체를 pattern 이라는 변수에 저장하고 있다. 이 두 가지 방법은 각기 장단점을 가지고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DIHbc/btqBujjAJq4/WQhq9bFaEzPWwixRKxcQFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DIHbc/btqBujjAJq4/WQhq9bFaEzPWwixRKxcQFk/img.png&quot; data-alt=&quot;Fig 61. 패턴을 만드는 두 가지 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DIHbc/btqBujjAJq4/WQhq9bFaEzPWwixRKxcQFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDIHbc%2FbtqBujjAJq4%2FWQhq9bFaEzPWwixRKxcQFk%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;353&quot; height=&quot;122&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 61. 패턴을 만드는 두 가지 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 찾고자 하는 정보를 pattern이라는 변수에 저장하였다. 뒤에서 pattern이라는 변수가 출현하는 것은 찾고자 하는 것이 a라는 것을 뜻한다.&amp;nbsp;&lt;/p&gt;
&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;RegExp 객체의 정규 표현식&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/siP__-Xb-jc&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;정규표현식을 통해서 할 수 있는 작업은 크게 &lt;u&gt;3 가지 정도&lt;/u&gt;로 얘기할 수 있다. 어떤 패턴을 만들면 패턴에 해당되는 정보를 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;추출&lt;/b&gt;&lt;/span&gt;하려는 경우, 이를테면 어떤 문자열이 길게 있을 때, 그 안에서 url에 해당한 정보만 추출해서 뽑아내고 싶다, 또는 email 주소에 해당되는 정보만을 추출해서 빼내고 싶다라고 하는 경우에 정규표현식을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 그러한 정보가 문자열안에 있는지 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;테스트&lt;/b&gt;&lt;/span&gt;하는 것, 다른 정보로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;치환&lt;/b&gt;&lt;/span&gt;하는 것, 등이 정규표현식을 통해서 하는 중요한 작업이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;RegExp.exec()&amp;nbsp; &amp;nbsp;RegExp 는 정규표현식 객체를 의미한다. 지금 예시에서는 pattern에 들어있는 것이 정규표현식 객체이다. pattern. 이라고 하면 pattern 객체가 사용할 수 있는 함수[메소드] 추천어가 뜨는데 exec 함수를 사용하면 인자로 주어진 문자열 안에서 pattern을 찾는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mSKGB/btqByFyYrDz/6kZg47J4q7axiek034tv0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mSKGB/btqByFyYrDz/6kZg47J4q7axiek034tv0k/img.png&quot; data-alt=&quot;Fig 62.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mSKGB/btqByFyYrDz/6kZg47J4q7axiek034tv0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmSKGB%2FbtqByFyYrDz%2F6kZg47J4q7axiek034tv0k%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;349&quot; height=&quot;649&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;724&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 62.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcjSad/btqByGxSEM7/HrAE3xy0D3Eq8SXk3I784k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcjSad/btqByGxSEM7/HrAE3xy0D3Eq8SXk3I784k/img.png&quot; data-alt=&quot;Fig 63.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcjSad/btqByGxSEM7/HrAE3xy0D3Eq8SXk3I784k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcjSad%2FbtqByGxSEM7%2FHrAE3xy0D3Eq8SXk3I784k%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;582&quot; height=&quot;182&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 63.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k20lz/btqBzjWKwLf/jBQKK8TeXkPK3KoPVLAskK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k20lz/btqBzjWKwLf/jBQKK8TeXkPK3KoPVLAskK/img.png&quot; data-alt=&quot;Fig 64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k20lz/btqBzjWKwLf/jBQKK8TeXkPK3KoPVLAskK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk20lz%2FbtqBzjWKwLf%2FjBQKK8TeXkPK3KoPVLAskK%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;776&quot; height=&quot;74&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 64&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/simIO/btqByFZ2Q1I/mzmodmqAwD94D4hi4f2So0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/simIO/btqByFZ2Q1I/mzmodmqAwD94D4hi4f2So0/img.png&quot; data-alt=&quot;Fig 65. pattern에 /a./을 넣었을 때 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/simIO/btqByFZ2Q1I/mzmodmqAwD94D4hi4f2So0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsimIO%2FbtqByFZ2Q1I%2FmzmodmqAwD94D4hi4f2So0%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;551&quot; height=&quot;140&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 65. pattern에 /a./을 넣었을 때 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 65에서는 /a./ 이라고 패턴을 지정하였다. 여기서 점 . 은 특수한 기호이다. 점은 1개의 문자를 의미한다. 즉 a뒤에 오는 임의의 문자를 뜻한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwYYXX/btqBzjvGiVR/947hdOKEd6QWK9iAXYLSK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwYYXX/btqBzjvGiVR/947hdOKEd6QWK9iAXYLSK0/img.png&quot; data-alt=&quot;Fig 66. test 함수의 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwYYXX/btqBzjvGiVR/947hdOKEd6QWK9iAXYLSK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwYYXX%2FbtqBzjvGiVR%2F947hdOKEd6QWK9iAXYLSK0%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;347&quot; height=&quot;167&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 66. test 함수의 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test는 패턴을 찾으면 true, 찾지 못하면 false 를 반환한다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.exec 함수는 추출, .test 함수는 존재유무를 테스트하는 것이다.&amp;nbsp;&lt;/p&gt;
&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;String 객체의 정규 표현식&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/XjrdeiHWUJs&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 RegExp가 아닌 문자열에 대해 정규표현식을 사용하는 방법을 살펴본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String.match()&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nCODk/btqBuamT8LK/isryJJOWdnzGFlg72PhWM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nCODk/btqBuamT8LK/isryJJOWdnzGFlg72PhWM1/img.png&quot; data-alt=&quot;Fig 67. 패턴을 인자로 주고 문자열에 대해 함수를 적용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nCODk/btqBuamT8LK/isryJJOWdnzGFlg72PhWM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnCODk%2FbtqBuamT8LK%2FisryJJOWdnzGFlg72PhWM1%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;346&quot; height=&quot;175&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 67. 패턴을 인자로 주고 문자열에 대해 함수를 적용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;69&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d7a2rx/btqBuamUao0/ckd1FpeJmDir2LwnWWkU9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d7a2rx/btqBuamUao0/ckd1FpeJmDir2LwnWWkU9K/img.png&quot; data-alt=&quot;Fig 68. replace는 치환을 진행한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d7a2rx/btqBuamUao0/ckd1FpeJmDir2LwnWWkU9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd7a2rx%2FbtqBuamUao0%2Fckd1FpeJmDir2LwnWWkU9K%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;385&quot; height=&quot;64&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;69&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 68. replace는 치환을 진행한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;옵션&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/ODgFmQY38AE&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정규표현식에는 옵션이 있는데 옵션을 통해 정규표현식이 동작하는 방법을 좀 다르게 설정할 수 있다. 옵션 중에서 i와 g에 대해 살펴 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i 옵션은 대소문자를 구분하지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdYj1H/btqBuaUKZwt/k8td2ppRmSLJ7yesYrWby0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdYj1H/btqBuaUKZwt/k8td2ppRmSLJ7yesYrWby0/img.png&quot; data-alt=&quot;Fig 69. i옵션을 사용하면 대소문자 구분없이 찾는다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdYj1H/btqBuaUKZwt/k8td2ppRmSLJ7yesYrWby0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdYj1H%2FbtqBuaUKZwt%2Fk8td2ppRmSLJ7yesYrWby0%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;315&quot; height=&quot;142&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 69. i옵션을 사용하면 대소문자 구분없이 찾는다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;g 옵션은 global의 약자이다.&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;640&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdg28v/btqBuaApJpj/Py5ZTr4KnPOHlVKrh4GWhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdg28v/btqBuaApJpj/Py5ZTr4KnPOHlVKrh4GWhK/img.png&quot; data-alt=&quot;Fig 70. g옵션은 전체 문자열에 대해 패턴을 모두 찾아준다. 옵션은 함께 사용할 수도 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdg28v/btqBuaApJpj/Py5ZTr4KnPOHlVKrh4GWhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdg28v%2FbtqBuaApJpj%2FPy5ZTr4KnPOHlVKrh4GWhK%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;640&quot; height=&quot;259&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 70. g옵션은 전체 문자열에 대해 패턴을 모두 찾아준다. 옵션은 함께 사용할 수도 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;캡쳐&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/uMN3-U9lpCI&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정규표현식과 관련한 여러 가지 도구들&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://opentutorials.org/course/909&quot;&gt;생활코딩 정규표현식 수업&lt;/a&gt; https://opentutorials.org/course/909/5142&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.regexper.com/&quot;&gt;정규표현식을 시각화&lt;/a&gt; &amp;nbsp;https://regexper.com&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.regexr.com/&quot;&gt;정규표현식 빌더&lt;/a&gt; &amp;nbsp; https://regexr.com&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 다음의 정규표현식이 어떤 의미를 가지는지 위의 정규표현식 관련 도구들을 사용하여 살펴보도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(\w+)\s(\w+)&amp;nbsp; &amp;nbsp; &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;\w:&amp;nbsp; 대소영문자 수자 즉, a~z, A~Z, 0~9 를 의미한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+: 하나이상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(\w+): 영대소문자숫자 가 하나 이상인 것. 한 개 단어라고 생각하면 이해하기 쉽다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\s: white space 즉 하나의 공백&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론은 띄어쓰기로 갈라진 2개의 단어를 뜻한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://regexper.com&quot;&gt;https://regexper.com&lt;/a&gt; 에 위의 정규식을 입력하면 도식화해서 보여준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;1068&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSef1d/btqBzjWLdlG/Up3d0dgIahVRtPUGhO1j0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSef1d/btqBzjWLdlG/Up3d0dgIahVRtPUGhO1j0K/img.png&quot; data-alt=&quot;Fig 71. regexper에서 보여주는 정규표현식의 그래프&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSef1d/btqBzjWLdlG/Up3d0dgIahVRtPUGhO1j0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSef1d%2FbtqBzjWLdlG%2FUp3d0dgIahVRtPUGhO1j0K%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;652&quot; height=&quot;547&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;1068&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 71. regexper에서 보여주는 정규표현식의 그래프&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1397&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9HQjD/btqByGxTsIj/8TSInUqtQRZvp7zHfurakk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9HQjD/btqByGxTsIj/8TSInUqtQRZvp7zHfurakk/img.png&quot; data-alt=&quot;Fig 72. 정규표현식을 입력하면 밑의 예시에서 식에 부합하는 것들을 하이라이트로 표시해준다. 공백으로 구분된 2 개의 단어들이 표시됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9HQjD/btqByGxTsIj/8TSInUqtQRZvp7zHfurakk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9HQjD%2FbtqByGxTsIj%2F8TSInUqtQRZvp7zHfurakk%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;1397&quot; height=&quot;618&quot; data-origin-width=&quot;1397&quot; data-origin-height=&quot;618&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 72. 정규표현식을 입력하면 밑의 예시에서 식에 부합하는 것들을 하이라이트로 표시해준다. 공백으로 구분된 2 개의 단어들이 표시됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buwYXu/btqBuiSyhtn/6hkV2bue6mw5VpZ6KxX9Tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buwYXu/btqBuiSyhtn/6hkV2bue6mw5VpZ6KxX9Tk/img.png&quot; data-alt=&quot;Fig 73&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buwYXu/btqBuiSyhtn/6hkV2bue6mw5VpZ6KxX9Tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuwYXu%2FbtqBuiSyhtn%2F6hkV2bue6mw5VpZ6KxX9Tk%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;429&quot; height=&quot;417&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 73&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 73 과 같이 ( )를 사용하여 그룹을 지정하고 지정된 그룹을 가져와 사용하는 기능, 사용할 수 있는 개념을 캡쳐라고 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;치환&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/a9Hg9ed5utg&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJGOaV/btqBvtlwZRl/BmyUuLJOUKgkJR37tHe4bK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJGOaV/btqBvtlwZRl/BmyUuLJOUKgkJR37tHe4bK/img.png&quot; data-alt=&quot;Fig 74. url 있는 곳을 찾아 &amp;amp;lt;a&amp;amp;gt;태그를 생성하여 링크 만들어주기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJGOaV/btqBvtlwZRl/BmyUuLJOUKgkJR37tHe4bK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJGOaV%2FbtqBvtlwZRl%2FBmyUuLJOUKgkJR37tHe4bK%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;721&quot; height=&quot;306&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 74. url 있는 곳을 찾아 &amp;lt;a&amp;gt;태그를 생성하여 링크 만들어주기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;51&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnsvNU/btqBvsUsOIE/lVilbkLauIF6KULaYt2dj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnsvNU/btqBvsUsOIE/lVilbkLauIF6KULaYt2dj1/img.png&quot; data-alt=&quot;Fig 75. url를 찾아내기 위한 정규표현식 패턴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnsvNU/btqBvsUsOIE/lVilbkLauIF6KULaYt2dj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnsvNU%2FbtqBvsUsOIE%2FlVilbkLauIF6KULaYt2dj1%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;824&quot; height=&quot;51&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;51&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 75. url를 찾아내기 위한 정규표현식 패턴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\b 에 대한 내용 참조: boundary &lt;a href=&quot;https://ohgyun.com/392&quot;&gt;https://ohgyun.com/392&lt;/a&gt;&lt;br /&gt;&lt;span&gt;Matches a word boundary position between a word character and non-word character or position (start / end of string)&amp;nbsp; 단어와 단어가 아닌 문자 사이의 경계를 말함. 문자열의 시작 혹은 끝을 뜻한다. 단어는 (\w+) 인데 [a-zA-Z0-9_] 와 완벽히 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;(?:https?):&amp;nbsp; &amp;nbsp;우선 뒤의 물음표는 앞의 문자가 있어도 되고 없어도 됨을 뜻한다. 즉 http 혹은 https를 뜻한다. (?:ABC)를 사용하면 그룹으로 묶어는 주지만 캡쳐는 하지 않은 비 캡쳐링 그룹이 된다. 이는 특정한 수량 한정자 등을 적용은 하려 하지만 최종 결과에서 따로 구분하여 사용할 필요가 없는 경우에 작용한다. &lt;span&gt;Groups multiple tokens together without creating a capture group.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;\/:&amp;nbsp; /에 대한 메타문자 \/\/ 은 결국 // 임.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;[ ] 안의 내용은 캐릭터 셋&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;* : 앞의 문자 가 0개 이상&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;0-9, a-z: 영문자 수자, 맨 뒤에 i 옵션이 있기 때문에 대소문자 모두 포함.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;기타 나열된 특수기호는 그 자체&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;m 옵션: Multiline&amp;nbsp; 여러 줄 모드 사용. 여기서 ^ 및 $는 각 줄의 시작 부분 및 끝 부분과 일치합니다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;replace하는 부분의 코드를 자세히 살펴보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;987&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFMi9n/btqBuPoP5KG/WyIKhaYyR3ihQI3VLjPTT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFMi9n/btqBuPoP5KG/WyIKhaYyR3ihQI3VLjPTT1/img.png&quot; data-alt=&quot;Fig 76. replace 메소드의 인자로서 함수를 사용하고 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFMi9n/btqBuPoP5KG/WyIKhaYyR3ihQI3VLjPTT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFMi9n%2FbtqBuPoP5KG%2FWyIKhaYyR3ihQI3VLjPTT1%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;987&quot; height=&quot;142&quot; data-origin-width=&quot;987&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 76. replace 메소드의 인자로서 함수를 사용하고 있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;content라는 String 문자열에 대해 replace 함수[메소드]를 적용하는데 그 첫 번째 인자 urlPattern은 패턴이고, 두 번째 인자로는 어떤 텍스트가 아닌 function 함수를 전달하고 있다. replace 메소드가 실행될 때 urlPattern에 해당되는 패턴을 content 안에서 찾을 때마다 replace의 두 번째 인자로 정의된 function이 호출된다. 그리고 호출된 시점에서 검색된 결과 문자열[이 예시에서는 어떤 url일 것이다. &lt;a href=&quot;http://opentutorials.org&quot;&gt;http://opentutorials.org&lt;/a&gt;/course/1 또는 &lt;a href=&quot;http://naver.com&quot;&gt;http://naver.com&lt;/a&gt;] 을 호출되는 function의 인자로 전달한다. 그리고 그것을 가공하여 return 해준다. 그러면 찾은 문자열과 return 하는 문자열이 치환된다. 다 찾고 최종적으로 변경된 내용을 result 에 저장한다.&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;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;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;온늘 니니랴나. 티 니아. 너라, 나.&quot;&lt;/span&gt; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;aa&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; &lt;span&gt;a&lt;/span&gt;.&lt;span&gt;replace&lt;/span&gt;(&lt;span&gt;/[ .,]/g&lt;/span&gt;,&lt;span&gt;&quot;&quot;&lt;/span&gt;) &lt;br /&gt;&lt;span&gt;console&lt;/span&gt;.&lt;span&gt;log&lt;/span&gt;(&lt;span&gt;aa&lt;/span&gt;, &lt;span&gt;aa&lt;/span&gt;.&lt;span&gt;length&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOd0qI/btqB8nZF7Sw/WIPmsT59ijiWq6CPeD7smk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOd0qI/btqB8nZF7Sw/WIPmsT59ijiWq6CPeD7smk/img.png&quot; data-alt=&quot;공백, 컴마, 점을 제거하고 총 문자 수 세기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOd0qI/btqB8nZF7Sw/WIPmsT59ijiWq6CPeD7smk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOd0qI%2FbtqB8nZF7Sw%2FWIPmsT59ijiWq6CPeD7smk%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;569&quot; height=&quot;386&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공백, 컴마, 점을 제거하고 총 문자 수 세기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;TOP&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;func_ori&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;3.&amp;nbsp;함수지향&lt;/h1&gt;
&lt;p style=&quot;font-size: 1.1em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#scope&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 유효범위&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#fnNcallback&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 값으로서의 함수와 콜백&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#closure&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 클로저&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#argments&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- arguments&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#callFn&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 함수의 호출&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;함수지향 카테고리의 하위 수업들은 함수형 언어로서 자바스크립트의 면모를 다룬다. 자바스크립트의 핵심적인 도구는 함수다. 자바스크립트의 함수는 매우 강력하다. 함수에 대한 이해 없이는 자바스크립트를 잘 다루기 어렵다. 또한 자바스크립트에서 함수는 객체를 이해하는 데 가장 중요한 기초를 이룬다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;scope&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;유효범위&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전역변수와 지역변수&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/ud7DL6W32FI&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;javascript와 같은 언어를 일컬어서 함수형 언어라고도 부르는데 javascript에서 함수는 모듈화의 근간이라고 할 수 있다. 코드를 재사용하게 하고 정보의 구성이나 정보를 감추고 어떤 객체의 행위를 지정하는 등에 함수를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유효범위 scope 는 변수의 수명을 의미한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1580059019786&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var vscope = 'global';
        function fscope(){
        	alert(vscope);
        }
        fscope();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fscope 함수는 자기 안에 정의되지 않고 바깥쪽에 있는 vscope이라는 변수에 접근하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1580059164884&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var vscope = 'global';
        function fscope(){
        	var vscope = 'local';
        	alert(vscope);
        }
        fscope();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 경고창에 뜨는 것은 'global'이 아닌 'local'이다. 함수 안 즉 함수 측에서 봤을 때 더 가까운 쪽의 변수의 값을 가리키기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지역변수: local variables&amp;nbsp; &amp;nbsp;함수 fscope 안에서 정의된 vscope 은 지역변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전역변수: global variables&amp;nbsp; 함수 fscope 밖에서 정의된 vscope은 전역변수이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지역변수는 function의 { } 안에서만 접근할 수 있지만 전역변수는 javascript 애플리케이션 전역에서 접근할 수 있는 변수가 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1580059718740&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var vscope = 'global';
        function fscope(){
        	alert(vscope);
        }
        function fscope2(){
        	alert(vscope);
        }
        fscope();
        fscope2();
        &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fscope와 fscope2는 모두 global을 출력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1580059987275&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var vscope = 'global';
        function fscope(){
        	var vscope = 'local';
            var lv = 'local variables';
            alert(lv);
        }
        fscope();
        alert(lv);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 안에서 alert(lv); 에 의해 'local variables'가 경고창에 뜨지만 함수 밖의 alert(lv); 에서는 함수 내부의 함수로 접근이 불가하기 때문에 undefined 가 발생한다.&lt;/p&gt;
&lt;pre id=&quot;code_1580060373973&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var vscope = 'global';
        function fscope(){
          var vscope = 'local';
        }
        fscope();
        alert(vscope);
        &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위 코드가 실행되면 global 이 경고창에 뜬다.&lt;/p&gt;
&lt;pre id=&quot;code_1580060484696&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var vscope = 'global';
        function fscope(){
          vscope = 'local';
        }
        fscope();
        alert(vscope);
        &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 안에서 vscope 앞에 있던 var를 없앴을 때의 실행결과는 local이다.&lt;/p&gt;
&lt;pre id=&quot;code_1580060714599&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var vscope = 'global';
        function fscope(){
        	var vscope = 'local';
        	vscope = 'local';
        }
        fscope();
        alert(vscope);
        &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우에도 경고창에는 global이 나타난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전역변수를 써야 할 확실한 이유를 모른다면 지역변수를 쓰는 것좋다. 어떤 언어이든 전역변수의 사용은 신중을 기해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;유효범위의 효용&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/ZtvwONvLbOg&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjdTMZ/btqBuvxrwyv/ZsrrQSRwY8duRZSDRN1XT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjdTMZ/btqBuvxrwyv/ZsrrQSRwY8duRZSDRN1XT0/img.png&quot; data-alt=&quot;Fig 77. 함수 a( ) 에서 i 를 지역변수로 정의&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjdTMZ/btqBuvxrwyv/ZsrrQSRwY8duRZSDRN1XT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjdTMZ%2FbtqBuvxrwyv%2FZsrrQSRwY8duRZSDRN1XT0%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;346&quot; height=&quot;336&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 77. 함수 a( ) 에서 i 를 지역변수로 정의&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 a( ) 에서 i를 지역변수로 정의하기 때문에 for 문의 i [전역변수] 에 영향을 주지 못한다. 하지만 a( ) 안에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var i = 0; 대신에 var 를 없앤 i=0; 으로 하면 전역변수 i 에 접근하는 것으로 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfDhQW/btqBxAdHtBw/q6WhA56d9nXGSeckSpYsfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfDhQW/btqBxAdHtBw/q6WhA56d9nXGSeckSpYsfk/img.png&quot; data-alt=&quot;Fig 78. 함수 a( )의 i는 전역변수 즉 for 문의 i 를 가리킴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfDhQW/btqBxAdHtBw/q6WhA56d9nXGSeckSpYsfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfDhQW%2FbtqBxAdHtBw%2Fq6WhA56d9nXGSeckSpYsfk%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;462&quot; height=&quot;311&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;311&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 78. 함수 a( )의 i는 전역변수 즉 for 문의 i 를 가리킴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&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;전역변수를 사용하는 법&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/rAoFz4O1dls&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책소개: 더글라스 크락포드의 &quot;자바스크립트 핵심 가이드&quot;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://one-shore.com/aaron/books/&quot;&gt;http://one-shore.com/aaron/books/&lt;/a&gt; 이외에도 여러 가지 책이 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://k.kakaocdn.net/dn/b5RYnG/btqByGreCpZ/KKLriYipw0ixajjNWCFi91/JavaScriptTheGoodParts.pdf?attach=0&amp;amp;knm=tfile.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;i&gt;JavaScript: The Good Parts&lt;/i&gt; by &lt;b&gt;Douglas Crockford&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;249&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWpneA/btqBtM7YiNe/oN3PsIdRpw8k1RgJLYZRt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWpneA/btqBtM7YiNe/oN3PsIdRpw8k1RgJLYZRt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWpneA/btqBtM7YiNe/oN3PsIdRpw8k1RgJLYZRt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWpneA%2FbtqBtM7YiNe%2FoN3PsIdRpw8k1RgJLYZRt1%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;249&quot; height=&quot;351&quot; data-origin-width=&quot;249&quot; data-origin-height=&quot;351&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3LH0h/btqBzQAsx1m/Jw1KPxK51LXbYlkKM7Sz2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3LH0h/btqBzQAsx1m/Jw1KPxK51LXbYlkKM7Sz2K/img.png&quot; data-alt=&quot;Fig 79. 객체로 된 하는 전역변수를 만들고 그 안에 원하는 다른 변수를 속성으로 하여 사용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3LH0h/btqBzQAsx1m/Jw1KPxK51LXbYlkKM7Sz2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3LH0h%2FbtqBzQAsx1m%2FJw1KPxK51LXbYlkKM7Sz2K%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;1019&quot; height=&quot;707&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 79. 객체로 된 하는 전역변수를 만들고 그 안에 원하는 다른 변수를 속성으로 하여 사용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 위 그림에서와 같이 MYAPP이라고 하는 전역변수 하나 조차도 사용하고 싶지 않다면 다음의 방법을 쓸 수도 있다. 자기가 만든 로직 전체를 함수로 감싸준다. function(){ &lt;span style=&quot;color: #9d9d9d;&quot;&gt;전체 코드&lt;/span&gt; }&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kPgrh/btqBzjpmMuz/vGsLKfkcQxrIdGDgVddqb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kPgrh/btqBzjpmMuz/vGsLKfkcQxrIdGDgVddqb0/img.png&quot; data-alt=&quot;Fig 80. 로직 전체를 function(){ }로 감싸준다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kPgrh/btqBzjpmMuz/vGsLKfkcQxrIdGDgVddqb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkPgrh%2FbtqBzjpmMuz%2FvGsLKfkcQxrIdGDgVddqb0%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;1047&quot; height=&quot;781&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 80. 로직 전체를 function(){ }로 감싸준다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이렇게만 하면 오류가 발생한다. 이렇게 정의된 함수는 바로 어떤 변수에 넣어 주든지, 아니면 바로 호출해 사용해야 한다. 바로 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;변수에 넣어주&lt;/b&gt;&lt;/span&gt;는 것은 이렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fVar = function(){ .....}&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 사용할 때에는 fVar();&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;687&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsl0v6/btqByGSGU2O/xoUSmkjDGN27QjKvul1bnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsl0v6/btqByGSGU2O/xoUSmkjDGN27QjKvul1bnk/img.png&quot; data-alt=&quot;Fig 80-1. 변수에 함수를 정의하고 호출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsl0v6/btqByGSGU2O/xoUSmkjDGN27QjKvul1bnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsl0v6%2FbtqByGSGU2O%2FxoUSmkjDGN27QjKvul1bnk%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;506&quot; height=&quot;489&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 80-1. 변수에 함수를 정의하고 호출&lt;/figcaption&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: #006dd7;&quot;&gt;&lt;b&gt;바로 호출&lt;/b&gt;&lt;/span&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;1049&quot; data-origin-height=&quot;774&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kD7rG/btqBzPBz5Pm/rjecQ4aYl9JKAM0TGlrwG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kD7rG/btqBzPBz5Pm/rjecQ4aYl9JKAM0TGlrwG1/img.png&quot; data-alt=&quot;Fig 81. Fig 80에서 정의한 함수를 바로 사용할 때에는 뒤에 ( )를 붙인 후 이 전체를 괄호 ( ) 로 감싸줌&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kD7rG/btqBzPBz5Pm/rjecQ4aYl9JKAM0TGlrwG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkD7rG%2FbtqBzPBz5Pm%2FrjecQ4aYl9JKAM0TGlrwG1%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;1049&quot; height=&quot;774&quot; data-origin-width=&quot;1049&quot; data-origin-height=&quot;774&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 81. Fig 80에서 정의한 함수를 바로 사용할 때에는 뒤에 ( )를 붙인 후 이 전체를 괄호 ( ) 로 감싸줌&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MYAPP은 앞에 var 이 있기 때문에 [2행] 함수 안에서 선언된 변수가 된다. 즉 더 이상 전역변수가 아니라 이 함수의 지역변수가 된다는 얘기다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w8fEI/btqBxAd7UTy/rv07VCQV27rWSFwxBlwED0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w8fEI/btqBxAd7UTy/rv07VCQV27rWSFwxBlwED0/img.png&quot; data-alt=&quot;Fig 81-1.&amp;amp;nbsp; 익명함수로 만들고 바로 호출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w8fEI/btqBxAd7UTy/rv07VCQV27rWSFwxBlwED0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw8fEI%2FbtqBxAd7UTy%2Frv07VCQV27rWSFwxBlwED0%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;547&quot; height=&quot;509&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 81-1.&amp;nbsp; 익명함수로 만들고 바로 호출&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 이렇게 함수이름을 사용할 수도 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1063&quot; data-origin-height=&quot;816&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caPjRD/btqBubmcWJz/gD3rh6YLaBWKwK06LNIeD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caPjRD/btqBubmcWJz/gD3rh6YLaBWKwK06LNIeD0/img.png&quot; data-alt=&quot;Fig 83. 이것은 사실 myappfn 이라는 변수 안에 함수가 들어있는 것. 즉 myappfn 은 전역변수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caPjRD/btqBubmcWJz/gD3rh6YLaBWKwK06LNIeD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaPjRD%2FbtqBubmcWJz%2FgD3rh6YLaBWKwK06LNIeD0%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;756&quot; height=&quot;580&quot; data-origin-width=&quot;1063&quot; data-origin-height=&quot;816&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 83. 이것은 사실 myappfn 이라는 변수 안에 함수가 들어있는 것. 즉 myappfn 은 전역변수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 myappfn 이라는 함수의 이름도 변수 안에 함수가 들어있는 것이고, 그러면 결국 myappfn 이 전역변수가 된다. 단 하나의 전역변수도 허용하고 싶지 않다고 하면 Fig 82와 같이 함수를 정의하고 바로 호출하는 [이런 함수를 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;익명함수&lt;/b&gt;&lt;/span&gt;, 즉 이름이 없는 함수라고 한다] 기법을 사용한다.&amp;nbsp; 이런 기법으로 전역변수가 전혀 존재하지 않는 애플리케이션을 구축할 수 있게 되는 것이다. 이런 방법은 jQuery 에서도 사용할 수 있는 방법이고, javascript로 만들어진 많은 라이브러리들에서 모듈화라는 기법으로 많이 사용하는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;유효범위의 대상&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/g_BJhzI7rdc&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지역변수를 선언할 수 있는 곳은 함수로 제한된다. 다른 언어와 비교하며 약간 헷갈릴 수 있는 부분인데, 다른 언어들에서는 블록(대체로 { }) 안에서 유효범위를 제공한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1580178720761&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(int i = 0; i &amp;lt; 10; i++){
        	String name = &quot;saltfun&quot;;
        }
        System.out.println(name);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 자바에서는 위의 코드가 허용되지 않는다. 자바에서 지역변수를 선언할 때에는 변수 이름 앞에 데이터 형식을 지정해주는데, 즉 String name 은 javascript의 var name 과 같이 변수를 선언하는 것과 같은 의미를 가진다. System.out.println은 javascript의 console.log처럼 이해하면 될 것이다. 위의 자바 코드가 에러를 발생시키는 이유는 { }에서 선언된 즉 for 문의 지역변수가 되기 때문이다. { } 밖에서 호출하면 자바 입장에서는 존재하지 않는 변수를 호출한 것이다. 하지만 다음의 javascript는 좀 다르다.&lt;/p&gt;
&lt;pre id=&quot;code_1580179078747&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(var i = 0; i &amp;lt; 0; i++){
        	var name = 'You and I Forever';
        }
        alert(name);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 for 문 안에서 선언한&amp;nbsp; var name 은 for 문의 { } 안에서만 유효한 변수가 아니고, 바깥쪽에서도 유효한 변수가 아니라 for문 밖에서도 유효한 변수가 된다. javascript에서는 함수의 { } 안에서 선언된 변수만이 함수 안에서의 지역변수가 되는 것이고 for문 if 문 등의 { } 안에서 선언된 변수는 지역변수로서의 의미를 갖지 않는다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;정적 유효 범위&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/kfIlysJAkBA&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;자바스크립트는 함수가 선언된 시점에서의 유효범위를 갖는다. 이러한 유효범위의 방식을 정적 유효범위(static scoping), 혹은 렉시컬(lexical scoping)이라고 한다.&amp;nbsp; &amp;nbsp;lexical: 어휘의&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;정적 유효범위 혹은 lexical scoping은 뒤에서 다루게 될 클로져 와 연결되어 있는 개념이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxfKK1/btqBuQaCxNf/vPkqUQxWMJ5KGuooxjtgaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxfKK1/btqBuQaCxNf/vPkqUQxWMJ5KGuooxjtgaK/img.png&quot; data-alt=&quot;Fig 84. 함수 안에서 지역변수를 선언하고 다른 함수 호출 후 호출된 함수안에서 변수에 접근하고 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxfKK1/btqBuQaCxNf/vPkqUQxWMJ5KGuooxjtgaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxfKK1%2FbtqBuQaCxNf%2FvPkqUQxWMJ5KGuooxjtgaK%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;502&quot; height=&quot;291&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 84. 함수 안에서 지역변수를 선언하고 다른 함수 호출 후 호출된 함수안에서 변수에 접근하고 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Fig 84에서 함수 b 안에서 사용하는 변수 i는 자신을 호출한 함수 a 에서 선언한 지역 변수 i [3번째 행] 가 아닌 첫 행에서 선언된 전역 변수 i 이다. 즉 이때 브라우저에 나타나는 값은 5이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mQmcz/btqBzQUNKFV/R8RyLTMPPVkrTtrn4DFVKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mQmcz/btqBzQUNKFV/R8RyLTMPPVkrTtrn4DFVKK/img.png&quot; data-alt=&quot;Fig 85. 브라우저/개발자도구[F12]/Console 에서 바로 확인 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mQmcz/btqBzQUNKFV/R8RyLTMPPVkrTtrn4DFVKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmQmcz%2FbtqBzQUNKFV%2FR8RyLTMPPVkrTtrn4DFVKK%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;478&quot; height=&quot;328&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 85. 브라우저/개발자도구[F12]/Console 에서 바로 확인 가능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금만 생각해도 이게 말이 된다. b라는 함수는 어디서든지 호출이 될 것이고 b를 호출하는 곳이 함수라면 거기에 i 가 꼭 있어야 한다는 것은 좀 말이 안되는 것 같다. b 는 자신을 호출한 함수와 상관없이 자신이 선언된 시점에서 전역변수를 찾는 것이다. 즉 사용될 때가 아닌 정의될 때의 전역변수가 사용되게 된다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 정적 유효범위, lexical scoping 의 개념이다.&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;922&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daUmzG/btqBt9IRENp/7iSCYhuyBCOKfYDs3lKJSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daUmzG/btqBt9IRENp/7iSCYhuyBCOKfYDs3lKJSk/img.png&quot; data-alt=&quot;Fig 86. 참고&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daUmzG/btqBt9IRENp/7iSCYhuyBCOKfYDs3lKJSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaUmzG%2FbtqBt9IRENp%2F7iSCYhuyBCOKfYDs3lKJSk%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;699&quot; height=&quot;347&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 86. 참고&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E4Y8z/btqBujxHY9d/qfiTyxOdQCh3bSuLNkfylk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E4Y8z/btqBujxHY9d/qfiTyxOdQCh3bSuLNkfylk/img.png&quot; data-alt=&quot;Fig 86-1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E4Y8z/btqBujxHY9d/qfiTyxOdQCh3bSuLNkfylk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE4Y8z%2FbtqBujxHY9d%2FqfiTyxOdQCh3bSuLNkfylk%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;497&quot; height=&quot;95&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 86-1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hacks.mozilla.org/2015/07/es6-in-depth-let-and-const/&quot;&gt;https://hacks.mozilla.org/2015/07/es6-in-depth-let-and-const/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://blog.nekoromancer.kr/2016/01/26/es6-var-let-그리고-const/&quot;&gt;http://blog.nekoromancer.kr/2016/01/26/es6-var-let-그리고-const/&lt;/a&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 align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#func_ori&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;fnNcallback&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;값으로서의&amp;nbsp;함수와&amp;nbsp;콜백&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;함수의 용도 1&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/zGBkPTwydeg&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;JavaScript에서는 함수도 객체다. 다시 말해서 일종의 값이다. 거의 모든 언어가 함수를 가지고 있다. JavaScript의 함수가 다른 언어의 함수와 다른 점은 함수가 값이 될 수 있다는 점이다. 다음 예제를 통해서 그 의미를 알아보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;값은 변수에 담을 수 있고 javascript에서는 객체인 함수도 역시 변수에 담을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1580197584737&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function a() { }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서는 a라는 함수를 정의하고 있다.&amp;nbsp; 하지만 이것은 단순한 정의가 아닌 a 라는 변수에 함수를 담는다는 의미를 갖고 있다. 좀 더 분명한 방법을 보면 이해가 될 터인데 실제로는 다음의 의미인 것이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1580197715797&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var a = function() { }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 함수는 값으로서의 의미를 가지고 a라는 변수에 담기고 있다. 자바스크립트기본/객체/객체지향프로그래밍 에서도 이미 언급된바 있지만, 객체안 key의 value로서도 저장될 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4H9Bx/btqBvs8PvOF/Mt1TtenFkErEQN43tOa0HK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4H9Bx/btqBvs8PvOF/Mt1TtenFkErEQN43tOa0HK/img.png&quot; data-alt=&quot;Fig 87. b는 객체의 key, 함수는 객체의 value&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4H9Bx/btqBvs8PvOF/Mt1TtenFkErEQN43tOa0HK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4H9Bx%2FbtqBvs8PvOF%2FMt1TtenFkErEQN43tOa0HK%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;317&quot; height=&quot;214&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 87. b는 객체의 key, 함수는 객체의 value&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 객체 안에서의 key는 어떤 변수라고 볼 수 있다. 즉 b라는 변수 에 함수값을 저장한 것이다. 이것을 속성 property라고 한다. property에 저장되어 있는 값이 함수이면 이 함수를 메소드라고 한다. 여기서는 a라는 변수 안에 담겨있는 객체 [{ }안에 key:value 로 정의됨] 안에는 b라는 속성이 들어있고, 그 속성의 값은 함수이고 이 함수를 메소드, 또는 메소드 b라고 부른다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수는 값이기 때문에 다른 함수의 인자로도 전달될 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RzfPE/btqBAENLwlS/UGkJbrvXOLerzyPkbJMSy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RzfPE/btqBAENLwlS/UGkJbrvXOLerzyPkbJMSy0/img.png&quot; data-alt=&quot;Fig 88.&amp;amp;nbsp; &amp;amp;nbsp;cal 함수를 호출할 때 첫 인자가 함수이름으로도 쓰일 수 있다니(-o-)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RzfPE/btqBAENLwlS/UGkJbrvXOLerzyPkbJMSy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRzfPE%2FbtqBAENLwlS%2FUGkJbrvXOLerzyPkbJMSy0%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;410&quot; height=&quot;427&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 88.&amp;nbsp; &amp;nbsp;cal 함수를 호출할 때 첫 인자가 함수이름으로도 쓰일 수 있다니(-o-)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 cal의 반환값은 func(num) 이며 func는 인자로 전달받는 다. 즉 increase를 전달 받으면 increase(1)이 되어 increase 함수를 호출하게 되는 것이다. 함수이름을 인자로 받아 그것으로 함수를 호출할 수 있다니, 놀랍다. 정말로 쓰고 싶었던 기능이다.&lt;/p&gt;
&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;함수의 용도 2&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/1pqJphcounU&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수는 인자로도 사용될 수 있고 리턴값으로도 사용될 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nzn6e/btqBxAlla02/aN8DSCK9Fddby9XNI9OQgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nzn6e/btqBxAlla02/aN8DSCK9Fddby9XNI9OQgK/img.png&quot; data-alt=&quot;Fig 89.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nzn6e/btqBxAlla02/aN8DSCK9Fddby9XNI9OQgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnzn6e%2FbtqBxAlla02%2FaN8DSCK9Fddby9XNI9OQgK%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;926&quot; height=&quot;422&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 89.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cal('plus')는 return funcs[mode] 에 의해 funcs 라는 객체의 'plus' key에 들어 있는 함수를 뜻하며 (2,1)는 이 함수를 호출하면서 전달하는 2개의 인자가 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 함수를 배열의 값으로도 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1tOEF/btqBBgsaJtP/HIK1j9BgwwkliDQcWsKtBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1tOEF/btqBBgsaJtP/HIK1j9BgwwkliDQcWsKtBK/img.png&quot; data-alt=&quot;Fig 90. 여러 개의 함수를 배열의 값으로 저장함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1tOEF/btqBBgsaJtP/HIK1j9BgwwkliDQcWsKtBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1tOEF%2FbtqBBgsaJtP%2FHIK1j9BgwwkliDQcWsKtBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;528&quot; height=&quot;285&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 90. 여러 개의 함수를 배열의 값으로 저장함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&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;콜백&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/R2AcG_SoCMk&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&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;어떤 함수가 수신하는 인자 역시 함수인 경우를 콜백이라고 한다. 함수가 &lt;span style=&quot;color: #666666;&quot;&gt;값으로 사용될 수 있는 특성을 이용하면 함수의 인자가 함수로 전달될 수 있다. 값으로 전달된 함수는 호출될 수 있기 때문에 이를 이용하면 함수의 동작을 완전히 바꿀 수 있다. 인자로 전달된 함수 sortNumber[compareFn]의 구현에 따라서 sort의 동작방법이 완전히 바뀌게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열을 정리하는 방법에 대하여 설명을 하면서 간단하게 보았던 예제가 바로 콜백의 사례인데, 값으로서의 함수라고 하는 자바스크립트 함수의 특성을 활용한 사례라고 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx46uI/btqBzjpQWKi/CPG0fQKIzRspmXqPwKSLLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx46uI/btqBzjpQWKi/CPG0fQKIzRspmXqPwKSLLK/img.png&quot; data-alt=&quot;Fig 91. 배열의 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx46uI/btqBzjpQWKi/CPG0fQKIzRspmXqPwKSLLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx46uI%2FbtqBzjpQWKi%2FCPG0fQKIzRspmXqPwKSLLK%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;679&quot; height=&quot;70&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 91. 배열의 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 91에서 sort()는 함수를 호출하는 것인데, 이렇게 함수 앞에 numbers. 처럼 뭔가가 있다면 그 뭔가는 객체이다. 즉 numbers는 배열 객체이다. 첫 행의 코드는 배열 객체를 만들어 numbers라고 하는 변수에 담아둔다는 뜻이다. 배열 객체에는 sort라고 하는 함수가 정의되어 있기 때문에 &lt;b&gt;배열객체.sort()&lt;/b&gt; 를 통해 배열이 가지고 있는 함수 sort를 호출할 수 있게 되는데, 이때 sort는 객체에 속해 있기 때문에 함수라기보다는 &lt;b&gt;메소드&lt;/b&gt;라고 부른다. 또한 sort 와 같이 javascript가 기본적으로 가지고 있으면서 사용자에게 제공하는 기능의 경우 내장객체, &lt;b&gt;내장메소드&lt;/b&gt;, built-in 객체, &lt;b&gt;built-in method&lt;/b&gt; 라고 부른다. 사용자가 만드는 객체, 메소드, 함수 들은 &lt;b&gt;사용자 정의 객체&lt;/b&gt;, &lt;b&gt;사용자 정의 함수&lt;/b&gt;라고 한다.&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;numbers.sort() 하면 numbers를 정렬한 결과가 numbers에 다시 저장된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1zSrb/btqBADnUs3c/wmmYpuKJ1F6iqgjpvT86Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1zSrb/btqBADnUs3c/wmmYpuKJ1F6iqgjpvT86Nk/img.png&quot; data-alt=&quot;Fig 92. sort 메소드가 numbers 의 내용에 영향을 준다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1zSrb/btqBADnUs3c/wmmYpuKJ1F6iqgjpvT86Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1zSrb%2FbtqBADnUs3c%2FwmmYpuKJ1F6iqgjpvT86Nk%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;588&quot; height=&quot;191&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 92. sort 메소드가 numbers 의 내용에 영향을 준다&lt;/figcaption&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;a href=&quot;https://www.opentutorials.org/course/50/109&quot;&gt;https://www.opentutorials.org/course/50/10&lt;/a&gt; 생활코딩/클라이언트/JavaScript사전/Array(배열)/sort 를 보면 sort 내장메소드의 문법과 설명에 대해 알 수 있는데, sort의 인자로는 옵션으로 &lt;b&gt;compareFn&lt;/b&gt; [설명에서는 sortfunc 라고 함]라는 비교함수를 줄 수 있다. 옵션이라는 말은 줄 수 도 있고, 주지 않아도 default로 하는 동작이 있다는 뜻이다.&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;945&quot; data-origin-height=&quot;931&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bABPJK/btqBzRfB4cp/K3vKhtrESHAlSElBIyFRQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bABPJK/btqBzRfB4cp/K3vKhtrESHAlSElBIyFRQK/img.png&quot; data-alt=&quot;Fig 93. 생활코딩/클라이언트/JavaScript사전/Array(배열)/sort 의 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bABPJK/btqBzRfB4cp/K3vKhtrESHAlSElBIyFRQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbABPJK%2FbtqBzRfB4cp%2FK3vKhtrESHAlSElBIyFRQK%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;722&quot; height=&quot;711&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;931&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 93. 생활코딩/클라이언트/JavaScript사전/Array(배열)/sort 의 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oW8kX/btqBzQAZSCx/gA2kWSD2g5ZL36DK8dB4Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oW8kX/btqBzQAZSCx/gA2kWSD2g5ZL36DK8dB4Nk/img.png&quot; data-alt=&quot;Fig 94. sort의 인자 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oW8kX/btqBzQAZSCx/gA2kWSD2g5ZL36DK8dB4Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoW8kX%2FbtqBzQAZSCx%2FgA2kWSD2g5ZL36DK8dB4Nk%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;742&quot; height=&quot;545&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 94. sort의 인자 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sort는 주어진 배열 객체의 값들을 정렬할 때 compareFn 변수가 가리키는 함수의 내용을 실행하는 것을 통하여 각각의 값들이 어떤 것이 우선순위가 높은가를 판별한다. compareFn 변수의 이름은 임의로 정할 수 있으며, 이 변수에는 함수가 담기게 되며, 이 함수는 자기의 포맷을 가지고 있고 그 포맷을 지켜야 하는데, 그 포맷은 바로 정의하는 함수의 인자를 2개로 하는 것이다.&amp;nbsp; 이 인자 두 개를 x, y 라고 한다면 x, y는 객체의 원소들을 비교할 때 사용할 기준&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;652&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lLdYH/btqBAWtZayH/qjnzQIR7sCzUuvkXUdZfmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lLdYH/btqBAWtZayH/qjnzQIR7sCzUuvkXUdZfmK/img.png&quot; data-alt=&quot;Fig 95. Edge/개발자모드[F12]/Console 탭에서 실행해봄(크롬과 유사)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lLdYH/btqBAWtZayH/qjnzQIR7sCzUuvkXUdZfmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlLdYH%2FbtqBAWtZayH%2FqjnzQIR7sCzUuvkXUdZfmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;528&quot; height=&quot;546&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;675&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 95. Edge/개발자모드[F12]/Console 탭에서 실행해봄(크롬과 유사)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수는 한 번 호출하였는데 배열 객체의 값이 두 개씩 순차적으로 출력되는 것을 확인할 수 있다. return 값이 없기 때문에 numbers 배열 객체가 변하지 않고 그대로 출력되었다. 즉 배열의 값을 순차적으로 2 개씩 compareFn의 인자롤 받는 다는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 좀 추가해 return 값을 x, y 비교에 따라 서로 다르게 해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;1292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/72X4m/btqBADVLQJt/Bw0dK32AOffXSzb6qAog3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/72X4m/btqBADVLQJt/Bw0dK32AOffXSzb6qAog3k/img.png&quot; data-alt=&quot;Fig 96. compareFn의 두 인자를 비교해 더 클때, 작을 때, 같을 때 return값을 다르게 하였다. 결과 크기 순서대로 정렬됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/72X4m/btqBADVLQJt/Bw0dK32AOffXSzb6qAog3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F72X4m%2FbtqBADVLQJt%2FBw0dK32AOffXSzb6qAog3k%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;456&quot; height=&quot;1292&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;1292&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 96. compareFn의 두 인자를 비교해 더 클때, 작을 때, 같을 때 return값을 다르게 하였다. 결과 크기 순서대로 정렬됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;console.log의 결과에서 맨 처음에 동그라미2는 그러한 결과과 2 번 반복되었음을 나타낸다. x 와 y를 비교하여 더 크면 2 (정수 값이면 아무 값이든 상관 없다), 같으면 0, 작으면 -1을 return 하도록 하였으며 x, y값이 많이 출력되는 것으로 미루어 sort가 실행되는 과정에 compareFn이 여러 번 호출 되는 것을 알 수 있다. 어떤 로직인지는 많이 생각해봐야 할 것 같다. 결론적으로 sort 내장메소드는 옵션인자를 주고 그 옵션인자는 함수로 정의되어야 하며&amp;nbsp; 그 함수는 배열 객체의 요소들을 2 개씩 받는다는 것이다. 그리고 return 값을 어떻게 주느냐에 따라 sort 되는 결과가 달라지는데, sort에 대한 더 자세한 내용은 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;를 클릭해보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 96을 간단히 다음과 같이 해도 결과는 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqlnSO/btqBAVomH11/qGD6aLR9AA16OymOrtmKZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqlnSO/btqBAVomH11/qGD6aLR9AA16OymOrtmKZ0/img.png&quot; data-alt=&quot;Fig 97. return x-y 가 두 변수의 크기에 따라 정수, 0, 부수를 반환한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqlnSO/btqBAVomH11/qGD6aLR9AA16OymOrtmKZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqlnSO%2FbtqBAVomH11%2FqGD6aLR9AA16OymOrtmKZ0%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;485&quot; height=&quot;163&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 97. return x-y 가 두 변수의 크기에 따라 정수, 0, 부수를 반환한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwcrLB/btqBuvE9190/Ac8WQ7XQ9mW1CsQKO7W9G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwcrLB/btqBuvE9190/Ac8WQ7XQ9mW1CsQKO7W9G0/img.png&quot; data-alt=&quot;Fig 98. return y - x 를 사용하여 정렬의 순서를 역순으로 함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwcrLB/btqBuvE9190/Ac8WQ7XQ9mW1CsQKO7W9G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwcrLB%2FbtqBuvE9190%2FAc8WQ7XQ9mW1CsQKO7W9G0%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;511&quot; height=&quot;169&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 98. return y - x 를 사용하여 정렬의 순서를 역순으로 함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 compareFn 함수, 즉 위의 그림에서 comparefunctn 콜백함수이며, 내부적으로 인자를 통해 호출된 후, 이 콜백함수의 반환값을 다시 전달받은 sort는 그 반환값에 따라 동작결과가 달라진다. 즉 값으로서 함수[여기서는 compareFn]를 사용할 수 있기 때문에 원래 함수 [즉 여기서는 sort]의 동작방법을 값을 전달하는 것을 통해 제어할 수 있게 되는 것이다. 콜백이 가능한 것은 javascript의 함수가 값이기 때문에 가능한 것이다.&lt;/p&gt;
&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;비동기 콜백&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/NDFjwybbong&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;콜백은 비동기처리에서도 유용하게 사용된다. 시간이 오래걸리는 작업이 있을 때 이 작업이 완료된 후에 처리해야 할 일을 콜백으로 지정하면 해당 작업이 끝났을 때 미리 등록한 작업을 실행하도록 할 수 있다. 다음 코드는 일반적인 환경에서는 작동하지 않고 서버 환경에서만 동작한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;비동기 콜백이 무엇인지 예를 들어 보자.&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;구독자가 약 1만명 정도 되는 홈페이지를 운영한다 치자. 이 홈페이지는 글을 작성하면 구독자 만명에게 이메일을 발송한다. 서버쪽에서 이런 시스템을 만든다는 것은 그렇게 쉬운 일은 아니다. 글을 작성한 사람이 글을 작성하고 만명의 사용자들에게 이메일을 보낼 때 1명 1s 가 소요된다고 해도 10,000s 걸린다. 거의 3시간이나 말이다. 글작성 -&amp;gt; 이메일발송 [3시간 소요] -&amp;gt; 작성완료.&amp;nbsp; &amp;nbsp;이런 서비스를 사용하려는 사람은 아마 없을 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이렇게 글작성 -&amp;gt; 이메일발송 -&amp;gt; 작성완료 [모두 3시간]&amp;nbsp; 이렇게 순서대로 쭉 진행하는 것을 동기적 처리라고 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한편 글작성 -&amp;gt; 이메일발송&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;예약&lt;/b&gt;&lt;/span&gt; -&amp;gt; 작성완료 라고 하면 3시간이 아닌 매우 짧은 시간에 끝나게 된다. 그리고 내부적으로 사용자에게 노출되지 않는 어떤 프로그램이 반복적으로 동작하면서 이메일 발송예약이 들어왔는지를 확인하여 발송예약이 들어와 있다면 이메일 발송작업을 백그라운드에서 3시간동안 진행하면 되는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 마치 todo 같은 거다. 어떤 일을 하다가 처리해야 하는데 아직 처리해야 하는 일들을 머리속에서 계속 생각하고 있으면 지금 하는 일이 진행되지 않을 것이다. 그런 경우에는 해야 할 일들을 어디에 적어놓고 나중에 처리하려고 하는 것이 todo 인데, 이렇게 처리하는 방식을 비동기적인 처리라고 한다. 동기적처리와 비동기적처리는 정보공학에서 중요한 개념이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비동기처리는 javascript에서는 어떤 경우에 쓸 수 있을까? 바로 Ajax 라는 것이 있는데 Asynchronous Javascript and XML 의 약자이고 이 말자체는 별로 의미가 없다. XML은 별로 쓰지 않기 때문이고 쓰지 않는 경우가 더 많다. 중요한 것은&amp;nbsp; 이 기법인데 자세한 내용은 &lt;a href=&quot;https://www.opentutorials.org/course/3281&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;생활코딩의 Ajax&lt;/a&gt; 수업을 찾아보면 도움을 받을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.opentutorials.org/course/3281&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;생활코딩/WEB/WEB2 - JavaScript/ Ajax&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.opentutorials.org/course/3281&quot;&gt;https://www.opentutorials.org/course/3281&lt;/a&gt;&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;값으로서의-함수와-콜백-생활코딩-Google-Chrome-2020-01-28-22-19-53.gif&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHBuKj/btqBBe2kjN2/WG1vsRnfGYi2ppBQS0QH3k/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHBuKj/btqBBe2kjN2/WG1vsRnfGYi2ppBQS0QH3k/img.gif&quot; data-alt=&quot;Fig 100. 사이트에서 일어난 여러가지 사건들이 99개 이상이 일어나면 아이콘이 나타나며 클릭하면 로딩바가 뜨고 리스트가 출력된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHBuKj/btqBBe2kjN2/WG1vsRnfGYi2ppBQS0QH3k/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cHBuKj/btqBBe2kjN2/WG1vsRnfGYi2ppBQS0QH3k/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1728&quot; height=&quot;1080&quot; data-filename=&quot;값으로서의-함수와-콜백-생활코딩-Google-Chrome-2020-01-28-22-19-53.gif&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 100. 사이트에서 일어난 여러가지 사건들이 99개 이상이 일어나면 아이콘이 나타나며 클릭하면 로딩바가 뜨고 리스트가 출력된다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Fig 99와 Fig 100과 같이 웹페이지 없는 내용을 서버에 요청하여 그 결과를 표시해주는 것도 가능한데 그것은 Ajax 를 썼기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자도구/Network 탭:&amp;nbsp; 웹브라우저가 웹서버랑 통신하는 내역을 보여준다. 우측 상단의 내컨텐츠를 클릭하는 순간 produce_ajax라는 목록이 나오는데, 클릭하는 순간 javascript를 통해 웹브라우저에게 서버랑 통신을 하여 그 결과를 가져오라고 시켰기 때문에 그렇게 되는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;값으로서의-함수와-콜백-생활코딩-Google-Chrome-2020-01-28-22-39-50_1.gif&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPXOF0/btqBBfUrXQo/Qfkz6gQacEFknf7vcjTAS1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPXOF0/btqBBfUrXQo/Qfkz6gQacEFknf7vcjTAS1/img.gif&quot; data-alt=&quot;Fig 101. 내 컨텐츠를 클릭하는 순간 Network 탭에 produce_ajax라는 항목이 보인다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPXOF0/btqBBfUrXQo/Qfkz6gQacEFknf7vcjTAS1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dPXOF0/btqBBfUrXQo/Qfkz6gQacEFknf7vcjTAS1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1728&quot; height=&quot;1080&quot; data-filename=&quot;값으로서의-함수와-콜백-생활코딩-Google-Chrome-2020-01-28-22-39-50_1.gif&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 101. 내 컨텐츠를 클릭하는 순간 Network 탭에 produce_ajax라는 항목이 보인다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 저 항목을 클릭하면 아주 복잡한 내용을 볼 수 있는데, 웹서버가 보내준 정보들이며, 이 정보를 받아 해석한 다음에 javascript를 이용하여 프로그래밍적으로 HTML코드를 생성하여 Fig 99와 같은 내용을 출력하게 되는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;값으로서의-함수와-콜백-생활코딩-Google-Chrome-2020-01-28-22-43-05.gif&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eGWsaI/btqBuwD5jUz/1jRl0deNo7KhA0anbs0e6k/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eGWsaI/btqBuwD5jUz/1jRl0deNo7KhA0anbs0e6k/img.gif&quot; data-alt=&quot;Fig 102. 항목을 클릭하여 그 내용을 본다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eGWsaI/btqBuwD5jUz/1jRl0deNo7KhA0anbs0e6k/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/eGWsaI/btqBuwD5jUz/1jRl0deNo7KhA0anbs0e6k/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1728&quot; height=&quot;1080&quot; data-filename=&quot;값으로서의-함수와-콜백-생활코딩-Google-Chrome-2020-01-28-22-43-05.gif&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 102. 항목을 클릭하여 그 내용을 본다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서 클릭했을 때 웹페이지가 변경되지 않고 서버와 웹브라우저가 내부적으로 조용히 통신하는 이러한 기법을 Ajax라고 부르는 것이다. 웹이라는 것이 단순히 문서에서 벗어나 위의 동작들[Fig 99~100 등의]을 수행할 수 있도록 결정적인 역할을 한 것이 이러한 Ajax 기술인 것이다. Ajax를 제어할 때 비동기적인 제어를 하게 되는데, 만일 동기적인 제어라고 하면 내컨텐츠를 클릭하였을 때, 서버가 멀리 예를 들어 해외에 있으면 그 서버에서 Fig 102와 같은 정보를 전송해줄 때까지 javascript는 마냥 기다리고 있어야 한다. 그렇게 되면 컨텐츠를 클릭한 순간 웹페이지는 freezing 되어버리고 아무것도 할 수 없는 상태가 되는 것이다. 하지만 비동기 통신을 하기 때문에 내컨텐츠를 클릭한 순간에 서버와 웹브라우저는 내부적으로 통신을 진행하고 그동안 다른 웹페이지를 보거나 내용을 아래로 내리거나 하는 일련의 다른 작업들을 할 수 있게 되는 것이다. 그것이 바로 비동기적인 처리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 작업을 하는 기본적인 방법은 javascript를 이용하여 하는 것인데 브라우저마다 사용방법이 다르며 좀 불편하다. jQuery를 이용하면&amp;nbsp; &amp;nbsp;다소 복잡한 작업을 한 줄의 코드로 작성할 수 있고 그 과정에서 콜백이 사용된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한가지 예를 살펴보도록 하자. 아래의 datasourco.json.js 라는 파일은 JSON이라는 형태의 파일인데, JSON은 javascript의 객체를 만드는 방법으로서, 다음 파일은 &quot;title&quot;은 &quot;JavaScript&quot;의 값을 가지고 &quot;author&quot;라는 key는 &quot;egoing&quot;이라는 값을 가진다. 그리고 웹서버에서 이 내용을 출력해보면 Fig 103-1 과 같다.&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;668&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HEjhK/btqBxAMu8VD/VqGUIcxmQIKvnK64ahh2k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HEjhK/btqBxAMu8VD/VqGUIcxmQIKvnK64ahh2k1/img.png&quot; data-alt=&quot;Fig 103. datasource.json.js 의 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HEjhK/btqBxAMu8VD/VqGUIcxmQIKvnK64ahh2k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHEjhK%2FbtqBxAMu8VD%2FVqGUIcxmQIKvnK64ahh2k1%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;567&quot; height=&quot;44&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 103. datasource.json.js 의 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 내용을 출력하기 위해 Bitnami WAMP 웹서버를 돌리고 홈페이지폴더안에 똑같이 하위폴더를 구성한 후 위의 datasource.json.js를 저장하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;149&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oN6DQ/btqBBeBgez8/WglUjLlsY24TxyeEh5CGZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oN6DQ/btqBBeBgez8/WglUjLlsY24TxyeEh5CGZK/img.png&quot; data-alt=&quot;Fig 103-1. 브라우저로 접속해봄&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oN6DQ/btqBBeBgez8/WglUjLlsY24TxyeEh5CGZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoN6DQ%2FbtqBBeBgez8%2FWglUjLlsY24TxyeEh5CGZK%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;690&quot; height=&quot;149&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;149&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 103-1. 브라우저로 접속해봄&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다음 HTML코드를 살펴보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1133&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjsSlW/btqBuPKdRVH/rKHDFaZvgkTpEY4CRXaBG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjsSlW/btqBuPKdRVH/rKHDFaZvgkTpEY4CRXaBG1/img.png&quot; data-alt=&quot;Fig 104. demo1.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjsSlW/btqBuPKdRVH/rKHDFaZvgkTpEY4CRXaBG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjsSlW%2FbtqBuPKdRVH%2FrKHDFaZvgkTpEY4CRXaBG1%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;774&quot; height=&quot;398&quot; data-origin-width=&quot;1133&quot; data-origin-height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 104. demo1.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;521&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bjzz5/btqBAVvb8RN/Rr1UB4AKrDTrLHqtFoK4E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bjzz5/btqBAVvb8RN/Rr1UB4AKrDTrLHqtFoK4E0/img.png&quot; data-alt=&quot;Fig 104-1. demo1.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bjzz5/btqBAVvb8RN/Rr1UB4AKrDTrLHqtFoK4E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBjzz5%2FbtqBAVvb8RN%2FRr1UB4AKrDTrLHqtFoK4E0%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;769&quot; height=&quot;341&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;521&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 104-1. demo1.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4행에서 jquery를 삽입하고 있다. jQuery가 가지고 있는 기능 중에 ajax 통신을 하도록 하는 기능이 있는데 그것이 바로 8행의 $.get() 이다. $는 jQuery가 사용자들에게 제공하는 특수한 객체로서 그 객체가 가지고 있는 메소드 중 get이라는 메소드를 호출하였다. 첫 인자는 json 타입 데이터의 url이고[Fig 103-1 주소창의 &lt;a href=&quot;http://localhost/javascript/function_value_6508/datasource.json.js&quot;&gt;http://localhost/javascript/function_value_6508/datasource.json.js&lt;/a&gt; 을 그대로 써도 됨], 두번째 인자로는 함수를 전달하도록 약속이 되어있는데, 서버랑 통신이 끝났을 때 호출되도록 약속된[호출되도록 기대하는] 함수이다. $.get함수는 첫 인자의 url에 해당하는 정보를 가져온 다음에 두번째 인자에 지정한 함수를 호출하도록 약속되어있다. 그리고 그 함수에는 인자를 전달해야 하는데, 그 인자 값은 바로 서버에서 가져온[즉 $.get의 첫 인자인 url 의] 내용 [즉 Fig 103-1의 내용] 이다. 4행의 내용에서 jquery 버전을 바꿔도 동작에는 문제가 없으며 jquery-3.4.1.min.js를 jquery-3.4.1.js 로 바꿔도 동작에는 문제가 없다. 아마도 code.jquery.com에 버전별로 min.js와 .js 를 모두 가지고 있는 듯 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과를 보기 위해 demo1.html을 datasource.json.js 가 있는 폴더에 저장한 후 브라우저에서 개발자모드/Console을 확인한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/91ITO/btqBADVP2hN/l8CLF3jrk6hLKKgV9CnvI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/91ITO/btqBADVP2hN/l8CLF3jrk6hLKKgV9CnvI0/img.png&quot; data-alt=&quot;Fig 105. demo1.html 의 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/91ITO/btqBADVP2hN/l8CLF3jrk6hLKKgV9CnvI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F91ITO%2FbtqBADVP2hN%2Fl8CLF3jrk6hLKKgV9CnvI0%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;713&quot; height=&quot;208&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 105. demo1.html 의 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9~11행에 정의된 함수의 내용에 따라 원하는 결과를 만들어 낼 수 있다는 뜻이다.&amp;nbsp; 콜백이라는 기법을 통하여 사용자에게 일련의 처리를 위임하고 있는 것이다. 누가 Ajax를 콜하든 간에 서버에서 정보를 가져오는 행위자체는 다 똑같다. 그 똑같은 부분은 바로 $.get이 알아서 처리하는 것이고 정보를 가져온 후 그 정보에 대해 어떤 처리를 할 것인가에 대해서는 서로 다르기 때문에 [그런 것을 비즈니스 로직이라고 함], 그것을 사용자에게 위임을 해야 하는데 그 위임을 하는 기법이 바로 콜백 함수를 통해서 인자를 전달받는 것이다. 그러면 우리는 함수를 인자로, 즉 매개변수의 값으로 전달하는 것을 통하여 $.get이 동작하는 방법을 완전히 바꿔놓을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 특징은 javascript를 이용하여 고난이도의 테크닉, 또는 유지보수하기 쉬운 코드를 작성하는데 있어서 아주 중요한 열쇠와 같은 역할을 하는 문법적인 특성이다.&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#func_ori&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;closure&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;클로저&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;외부함수와 내부함수&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/L8OvfMfIWa0&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;클로저(closure)는 내부함수가 외부함수의 맥락(context)에 접근할 수 있는 것을 가르킨다. 클로저는 자바스크립트를 이용한 고난이도의 테크닉을 구사하는데 필수적인 개념으로 활용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;규모가 큰 코드를 작성하거나 다른 사람과 협업을 해야 하는데 다른 사람이 쓴 코드가 closure로 작성된 경우가 있을 수 있는데 그런 경우에는 클로저라는 개념이 중요하게 사용된다.&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;JavaScript는 함수 안에서 또 다른 함수를 선언할 수 있다. &lt;span style=&quot;color: #666666;&quot;&gt;다음 예제의 결과는 경고창에 coding everybody가 출력된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPCODn/btqBzQ2bQ79/9lx3CTpwpXzpLaGnVkzdYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPCODn/btqBzQ2bQ79/9lx3CTpwpXzpLaGnVkzdYk/img.png&quot; data-alt=&quot;Fig 106. 함수 안에서 정의된 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPCODn/btqBzQ2bQ79/9lx3CTpwpXzpLaGnVkzdYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPCODn%2FbtqBzQ2bQ79%2F9lx3CTpwpXzpLaGnVkzdYk%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;583&quot; height=&quot;395&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;614&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 106. 함수 안에서 정의된 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 행의 함수는 사실 inner라는 변수에 함수를 값으로 넣은 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var inner = function{ ... }&amp;nbsp; 이렇게 outter라는 변수 안에서 inner라는 변수를 만들고 이 변수에 함수를 할당하고 있는 것. 이런 테크닉을 쓰는 경우는 여러 가지가 있겠지만 그 중에서 가시적으로 지적할 수 있는 것은 어떤 함수가 있는데 그 함수 안에서만 사용되는 함수가 있을 수 있을 때 안에서 사용되는 함수를 그 함수의 바깥쪽에 선언하게 되면 응집성이 떨어지게 되어 함수 안에 선언하여 보기도 편하고 그 안에 무언가 끼어들 가능성도 줄어들 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 예시는 &lt;span style=&quot;color: #333333;&quot;&gt;앞의 예시에서 &lt;/span&gt;var title의 위치를 변경한 것인데 inner 는 내부함수, outter는 외부함수이고, title은 외부함수에 정의된 지역변수이다.&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;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oBvFB/btqBvtfRv68/69ol0YNEGGKcEJLVCd8MP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oBvFB/btqBvtfRv68/69ol0YNEGGKcEJLVCd8MP0/img.png&quot; data-alt=&quot;Fig 107. title은 inner 를 포함한 outter 안에 정의된 지역변수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oBvFB/btqBvtfRv68/69ol0YNEGGKcEJLVCd8MP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoBvFB%2FbtqBvtfRv68%2F69ol0YNEGGKcEJLVCd8MP0%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;426&quot; height=&quot;291&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 107. title은 inner 를 포함한 outter 안에 정의된 지역변수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inner 함수에서 title이라는 변수를 사용할 때 Fig 107처럼 inner 내부에 title이 정의되지 않았다면 자신을 포함하고 있는 외부함수에서 정의되었는지를 먼저 확인하고 있다면 그 변수를 가리키게 되는 것이다. 즉 내부함수에서 외부함수의 지역변수에 접근할 수 있다. 이런 것을 클러저라고 한다.&lt;/p&gt;
&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;클로저란&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/bNqOHnsJm-w&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;클로저(closure)는 내부함수와 밀접한 관계를 가지고 있는 주제다. 내부함수는 외부함수의 지역변수에 접근 할 수 있는데 외부함수의 실행이 끝나서 외부함수가 소멸된 이후에도 내부함수가 외부함수의 변수에 접근 할 수 있다. 이러한 메커니즘을 클로저라고 한다.&lt;span&gt; 아래의 코드는 경고창으로 coding everybody를 출력한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZPABd/btqBzjQ4sCL/MVhjNPgkb5dhKLGw5CwVz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZPABd/btqBzjQ4sCL/MVhjNPgkb5dhKLGw5CwVz1/img.png&quot; data-alt=&quot;Fig 108.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZPABd/btqBzjQ4sCL/MVhjNPgkb5dhKLGw5CwVz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZPABd%2FbtqBzjQ4sCL%2FMVhjNPgkb5dhKLGw5CwVz1%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;568&quot; height=&quot;373&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 108.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 function outter(){&amp;nbsp; ...&amp;nbsp; } 로 외부함수를 정의하고, 그 안에서 반환값으로 function(){ ... } 과 같이 내부함수를 정의하고 있다.&amp;nbsp; &amp;nbsp;inner = outter(); 에 의해 변수 inner의 결과는 outter()의 반환값인 내부함수 function(){ ... } 이 된다. inner()를 사용하여 inner라는 변수에 담겨 있는 함수를 호출하면 function(){ ... }이 실행되면서 title 값이 경고창에 뜨게 되는 것이다. 여기서 이상한 것은 inner = outter(); 에 의해 outter()는 return 하여 반환값을 돌려주었고 그 의미는 생을 마감했다는 뜻이다. 종료되었다는 뜻이다. outter가 종료되었음에도 불구, inner()를 사용해 inner에 담겨진 함수를 호출한 순간에는 function(){&amp;nbsp; ...&amp;nbsp; }의 내용이 실행되는데 여기서는 title이라는 변수를 사용하고&amp;nbsp; 이 변수는 내부함수 즉 그 함수가 아닌 외부함수에 존재한다. 외부함수는 이미 생을 마감했는데 그 외부함수에서 파생된 내부함수에서, 이미 사라진 외부함수에 접근을 시도하였으며 그 접근이 성공적으로 이루어지고 있는 것이다. 마치 무슨 영혼처럼 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 closure의 아주 독특함이라고 할 수 있는 부분이다. 내부함수를 포함하고 있는 외부함수에 접근할 수 있을 뿐만 아니라 외부함수가 종료된 이후에도 내부함수를 통해서 접근할 수 있다는 것이 closure의 중요한 특징이다.&lt;/p&gt;
&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;private variable&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/J0Qb2wjm-ik&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;privage variable은 소프트웨어가 커지는 과정에서 어떤 정보가 있을 때 그 정보를 아무나 수정하지 못하도록 방지하는 것을 말한다. 코드를 통해 살펴볼 건데, 아래 예제는 closure를 이용하여 영화의 제목을 저장하고 있는 객체를 정의하고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3j4tg/btqBuQWEXcu/8yknNa5tzS5y1e0YfBwowK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3j4tg/btqBuQWEXcu/8yknNa5tzS5y1e0YfBwowK/img.png&quot; data-alt=&quot;Fig 109.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3j4tg/btqBuQWEXcu/8yknNa5tzS5y1e0YfBwowK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3j4tg%2FbtqBuQWEXcu%2F8yknNa5tzS5y1e0YfBwowK%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;619&quot; height=&quot;608&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 109.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;factory_movie 함수는 반환값으로 객체를 return하고 있는데 이 객체는 get_title, set_title 이라는 key의 value로 각각 모두 함수가 정의되어 있다.&amp;nbsp; 객체를 반환하는데 객체의 값들은 함수란 얘기다. get_title, set_title 이라는 속성에 함수가 정의되어있기 때문에 이 속성들은 메소드인 것이다. 2개의 메소드가 정의되어 있는 객체이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 클로저에서도 보았듯이 return 값으로 함수를 반환하는 것은 그것을 포함하고 있는 함수의 내부함수라고 했고, 여기서는 return 값이 객체이고 그 객체안의 속성값이 함수라는 점이 차이가 있지만 이것은 엄연하게 내부함수이고 이를 포함하고 있는 fatory_movie(title)은 외부함수다. 이 맥락에서 메소드들 function()과 function(_title)은 factory_movie의 내부함수이다. 다만 그것이 객체 안에 들어있다는 점만 다를 뿐이다. 이것들이 내부함수란 얘기는 클로저에서 보았듯이 이 내부함수를 포함하고 있는 외부함수의 지역변수에 접근할 수 있으며 이 외부함수가 생을 마감한 후에도 접근할 수 있다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;get_title 의 함수는 title을 return 하는데 이 title 값은 내부함수가 외부함수의 지역변수에 접근이 가능하기 때문에 factory_movie(title)의 title 값이다. get_title의 함수를 호출하면 factory_movie(title)로 전달된 title 값을 리턴한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set_title 은 _title을 전달받아 title 다시말해 factory_movie(title)의 title 값을 변경하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11, 12행에서 ghost와 matrix는 factory_movie 함수를 호출했고 이 함수의 return 값은 두개의 함수를 속성값으로 하는 객체이다. 얼마나 신기한가? 이때 title의 값은 factory_movie를 호출하면서 전달된다. ghost와 matrix는 모두 2 개의 함수를 속성 값으로 하는 객체를 가지고 있지만 그 두 객체는 당연히 서로 다른 객체이며 그것들이 접근할 수 있는 title의 값 역시 서로 다르다. 이름은 title로서 같지만 서로 다른 변수란 얘기다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13, 14행은 ghost와 matrix의 속성 뒤에 괄호( )를 붙임으로서 객체안 get_title속성의 함수를 호출하였다. 4행의 코드&amp;nbsp; 즉 title 값이 return 된다. 이때 두 변수 ghost와 matrix 모두 title값을 리턴하지만 이 title은 factory_movie(title)의 title 값인데 전달받을 때 값이 다르기 때문에 return title의 값 역시 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15행에 의해 '공각기동대'가 ghost 가 가지고 있는 객체의 set_title 속성의 함수를 통해 전달되고 결국 title의 값을 변화시키지만 이때 변화되는 title은 ghost에만 해당되는 것이지 같은 객체구조를 가지고 있는 다른 변수 즉 matrix의 title에는 영향을 주지 못한다. 실행결과는 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;https___news.chosun.com_site_data_html_dir_2020_01_28_2020012800361.gif&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbCilA/btqBxz1ckH8/huErFzKqny1X2lkjaCF7Xk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbCilA/btqBxz1ckH8/huErFzKqny1X2lkjaCF7Xk/img.gif&quot; data-alt=&quot;Fig 109. private variables 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbCilA/btqBxz1ckH8/huErFzKqny1X2lkjaCF7Xk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dbCilA/btqBxz1ckH8/huErFzKqny1X2lkjaCF7Xk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;646&quot; height=&quot;681&quot; data-filename=&quot;https___news.chosun.com_site_data_html_dir_2020_01_28_2020012800361.gif&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 109. private variables 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;factory_movie를 통해 11,12행에서 2 개의 객체를 만들었고, 이 2 개의 객체는 각각 자신들이 실행된 그 시점에서의 맥락, 외부함수의 지역변수에 접근할 수 있고, 그 지역변수의 값은 유지가 되기 때문에 set_title을 통해 title값을 바꾼다는 것은 그 객체가 접근할 수 있는 title 값만을 바꿀 뿐, 다른 객체가 접근할 수 있는 title 값에는 아무런 영향을 주지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 살펴본 코드의 진짜 효용은 무엇일까? 그것은 바로 private variable 이다. 비밀변수가 가능하다는 것이다. ghost와 matrix에는 객체가 담겨 있고, get_title과 set_title은 언제든지 접근할 수 있는 메소드이다.&amp;nbsp; 오픈되어 있고, 누구나 접근할 수 있는 public이다. 그런데 get_title과 set_title이 내부적으로 사용하고 있는 변수는 외부함수의 지역변수인 title이다. 그런데 외부함수 factory_movie의 지역변수인 title은, 외부함수 factory_movie가 호출되어 return 하고 생을 마감했기 때문에, factory_movie의 내부함수[메소드]인 get_title과 set_title을 통해서만 접근할 수 있는 변수가 되어버리는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 프라이빗 변수는 규모가 큰 프로그램을 만들 때라야만 그 쓸모를 체감할 수 있는데, 소프트웨어가 커지다 보면 많은 사람이 참여하게 되고 코드를 만들게 된다. 그 안에는 미래의 자기자신, 과거의 자기자신도 포함되어 있다. 과거에 내가 만든 코드가 있지만 시간이 지나면 기억이 가물가물하게 되고 오늘 내가 만든 코드도 시간이 흐르면 한 순간에 이해하기 어려운 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 경우에 많은 코드가 소프트웨어 안에 존재하게 되는데, 그 데이터가 누구나 수정할 수 있는 어떠한 방식으로든 고칠 수 있는 형태의 데이터가 된다는 것은 결국에 가서 그 소프트웨어가 망가질 가능성이 크다는 얘기다. 전역변수, 지역변수도 그런 맥락에서 필요한 개념인 것이다. 이 private variable 역시 마찬가지이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 title이라는 정보에 접근하기 위해 get_title, set_title이라는 메소드를 통해야만 한다면 일단 title이라는 변수를 아무나 수정할 수 없기 때문에 같은 이름의 어떤 변수를 어떤 의미로 사용하든 이 title의 맥락에는 영향을 줄 수 없다. 훨씬 안전하다라는 얘기이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 set_title 메소드를 이용하여 title의 값을 바꾸는 부분의 코드를 문자열이 아니면 경고창을 보내는 식으로 아래와 같이 코드를 바꿔보고 실행시켜보자. 19행에서 인자 값을 수값으로 주었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwogp7/btqBziq6lqH/7VhLnUjW0t0QvesjtuSOh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwogp7/btqBziq6lqH/7VhLnUjW0t0QvesjtuSOh1/img.png&quot; data-alt=&quot;Fig 110. set_title 의 조건을 넣어줄 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwogp7/btqBziq6lqH/7VhLnUjW0t0QvesjtuSOh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwogp7%2FbtqBziq6lqH%2F7VhLnUjW0t0QvesjtuSOh1%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;606&quot; height=&quot;604&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;778&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 110. set_title 의 조건을 넣어줄 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;https___news.chosun.com_site_data_html_dir_2020_01_28_2020012800361.gif&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV6nfo/btqBzkoVvd7/KsL06yi8KwLH3tMWv25hO0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV6nfo/btqBzkoVvd7/KsL06yi8KwLH3tMWv25hO0/img.gif&quot; data-alt=&quot;Fig 110-1.&amp;amp;nbsp; Fig 110의 결과. 문자열이 아니라는 경고창이 뜬다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV6nfo/btqBzkoVvd7/KsL06yi8KwLH3tMWv25hO0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bV6nfo/btqBzkoVvd7/KsL06yi8KwLH3tMWv25hO0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;637&quot; height=&quot;641&quot; data-filename=&quot;https___news.chosun.com_site_data_html_dir_2020_01_28_2020012800361.gif&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 110-1.&amp;nbsp; Fig 110의 결과. 문자열이 아니라는 경고창이 뜬다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 우리가 title이라는 변수의 값을 private하게 비밀변수로 꽁꽁 묶어놓고, 아주 깊은 곳에 숨겨 놓고 그 변수의 값을 수정할 때에는 set_title을 통해서만 가능하고 그 값을 가져올 때에는 get_title을 통해서만 가져오도록 하면 데이터가 훨씬 더 안전하게 저장되고 안전하게 수정될 수 있다는 것이다. 클로저는 javascript가 private한 변수를 사용할 수 있도록 하는 아주 좋은 메커니즘이라고 할 수 있다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;참고 Private 속성은 객체의 외부에서는 접근 할 수 없는 외부에 감춰진 속성이나 메소드를 의미한다. 이를 통해서 객체의 내부에서만 사용해야 하는 값이 노출됨으로서 생길 수 있는 오류를 줄일 수 있다. 자바와 같은 언어에서는 이러한 특성을 언어 문법 차원에서 지원하고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;클로저의 응용&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/9A0pMrS6Bh0&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&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;이 예제는 자주 일어나는 실수이기 때문에 많이 언급된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lSSzl/btqBBfAdsLp/bG5aPyqYEkmWtobct6E1IK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lSSzl/btqBBfAdsLp/bG5aPyqYEkmWtobct6E1IK/img.png&quot; data-alt=&quot;Fig 111&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lSSzl/btqBBfAdsLp/bG5aPyqYEkmWtobct6E1IK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlSSzl%2FbtqBBfAdsLp%2FbG5aPyqYEkmWtobct6E1IK%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;409&quot; height=&quot;288&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 111&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arr[i] 에는 함수가 들어간다. 즉 arr[0] ~ arr [4] 에는 function(){return 0} ~ &lt;span style=&quot;color: #333333;&quot;&gt;function(){return 4} 가 아닌 &lt;span style=&quot;color: #333333;&quot;&gt;function(){return i} 가 저장된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그리고 for 문을 지나게 되면 i 는 5가 되어있고 arr[0]( )~arr[4]( ) 함수를 호출하면 이때 i 값이 5 이기 때문에 return i에 의해 5가 출력되는 것이다. 그래서 5가 다섯번 출력된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Closures&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Closures&lt;/a&gt; mdn 문서를 참조하면 이해하기가 훨씬 쉬워진다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이제 arr[i]에 대입되는 function()을 내부함수로 하는 외부함수를 정의하고 그 외부함수의 지역변수의 값을 내부함수가 참조하도록 해보자.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;615&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvrF7q/btqBAVaTUn2/WH60fkb1hqPZw3jkCji0B1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvrF7q/btqBAVaTUn2/WH60fkb1hqPZw3jkCji0B1/img.png&quot; data-alt=&quot;Fig 112.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvrF7q/btqBAVaTUn2/WH60fkb1hqPZw3jkCji0B1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvrF7q%2FbtqBAVaTUn2%2FWH60fkb1hqPZw3jkCji0B1%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;415&quot; height=&quot;459&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;615&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 112.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이렇게 정의해줌과 동시에 인자 i를 넣고 바로 호출하면 매번 i 값이 id 를 통해 내부함수의 return id 로 전달되어 arr[i] 에는 함수가 아니라 function(id){&amp;nbsp; }(i) 의 실행결과가 들어가게 된다. 그 실행결과는 결국 내부 함수에 의해 retrun id 가 되며 이때 id 값은 매번 for 순환의 i 값을 전달받게 되는 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;클로저 참고&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/JavaScript/Guide/Closures&quot;&gt;https://developer.mozilla.org/ko/docs/JavaScript/Guide/Closures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ejohn.org/apps/learn/#48&quot;&gt;http://ejohn.org/apps/learn/#48&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.javarouka.me/2012/01/javascripts-closure.html&quot;&gt;http://blog.javarouka.me/2012/01/javascripts-closure.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#func_ori&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;argments&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;arguments&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;arguments란?&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/i2tPgVFLGcA&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arguments 라고 하는 객체에 대해 알아본다. arguments 객체는 함수 안에서 함수의 여러 가지 정보들을 담고 있는, 특히 인자와 관련된 정보들을 담고 있는 객체인데 배열과 사용방법이 아주 유사하기 때문에 유사 배열이라고도 함. 배열과 비슷하지만 배열은 아니다.&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;1118&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XLkT6/btqBzQn39mw/3iM50Q9ASKfVSsVLzjyJdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XLkT6/btqBzQn39mw/3iM50Q9ASKfVSsVLzjyJdK/img.png&quot; data-alt=&quot;Fig 113. sum( ) 함수는 인자이 없지만 호출 시에 인자가 있으면 arguments[]로 전달 받는다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XLkT6/btqBzQn39mw/3iM50Q9ASKfVSsVLzjyJdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXLkT6%2FbtqBzQn39mw%2F3iM50Q9ASKfVSsVLzjyJdK%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;784&quot; height=&quot;328&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 113. sum( ) 함수는 인자이 없지만 호출 시에 인자가 있으면 arguments[]로 전달 받는다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&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;function length&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/7gBTjOWm6cU&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;매개변수와 관련된 두가지 수가 있다. 하나는 함수.length, 다른 하나는 arguments.length이다. arguments.length는 함수로 전달된 실제 인자의 수를 의미하고, 함수.length는 함수에 정의된 인자의 수를 의미한다. 아래의 코드를 보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;835&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IzHca/btqBziZvH4q/zLuKpsJ5u9wkKko6NVnS3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IzHca/btqBziZvH4q/zLuKpsJ5u9wkKko6NVnS3k/img.png&quot; data-alt=&quot;Fig 114. 함수에 정의된 인자의 수와 실제로 전달된 인자의 수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IzHca/btqBziZvH4q/zLuKpsJ5u9wkKko6NVnS3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIzHca%2FbtqBziZvH4q%2FzLuKpsJ5u9wkKko6NVnS3k%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;624&quot; height=&quot;690&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;835&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 114. 함수에 정의된 인자의 수와 실제로 전달된 인자의 수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#func_ori&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;callFn&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;함수의&amp;nbsp;호출&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;apply 소개&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/jA9Mp0VJoQc&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&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;bull;호출 방법: Fig 115 1~2행은 정의 3행은 호출&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;306&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3JO9q/btqBAEA6BPk/NsxLKrxNo9qdSmb9rR8P7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3JO9q/btqBAEA6BPk/NsxLKrxNo9qdSmb9rR8P7K/img.png&quot; data-alt=&quot;Fig 115&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3JO9q/btqBAEA6BPk/NsxLKrxNo9qdSmb9rR8P7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3JO9q%2FbtqBAEA6BPk%2FNsxLKrxNo9qdSmb9rR8P7K%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;306&quot; height=&quot;131&quot; data-origin-width=&quot;306&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 115&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에서 함수는 일종의 객체이다. &lt;span style=&quot;color: #666666;&quot;&gt;객체는 속성을 가지고 있고 그 속성에 값이 저장되어 있으면 그냥 속성 property 이라고 부르지만 그 속성에 함수가 들어있다면, 그것을 메소드라고 부른다.&amp;nbsp; Fig 115의 함수 func는 객체이며 메소드를 가지고 있는데 이 메소드는 javascript가 기본적으로 제공하는 내장된 메소드, 내장된 객체이다.&amp;nbsp; &lt;/span&gt;func는 Function이라는 객체의 인스턴스다. 따라서 func는 객체 Function이 가지고 있는 메소드들을 상속하고 있다. func 라는 함수를 정의하면 우리는 func.apply, func.call 이라는 메소드에 접근할 수 있다. 이것들이 하는 역할은 정의된 func를 호출하는 역할이다. 지금 이야기하려는 메소드는 Function.apply과 Function.call이다. 아래와 같이 sum이라는 함수를 정의하면 기본적으로 sum 을 호출하는 방법은 sum(2, 3);&amp;nbsp; 처럼 하면 되는데, 아래 그림의 마지막 행처럼 sum.apply 를 써서 호출할 수도 있다.&amp;nbsp; 결과는 3이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cg2wAE/btqByGM5se2/hczaY8jvpBVggwZLZ2Zc2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cg2wAE/btqByGM5se2/hczaY8jvpBVggwZLZ2Zc2K/img.png&quot; data-alt=&quot;Fig 116&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cg2wAE/btqByGM5se2/hczaY8jvpBVggwZLZ2Zc2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcg2wAE%2FbtqByGM5se2%2FhczaY8jvpBVggwZLZ2Zc2K%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;460&quot; height=&quot;253&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 116&lt;/figcaption&gt;
&lt;/figure&gt;
&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;470&quot; data-origin-height=&quot;863&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eLxdRt/btqBAVWW2Rp/MnzDqTGkdoKf59r7YUIlkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eLxdRt/btqBAVWW2Rp/MnzDqTGkdoKf59r7YUIlkk/img.png&quot; data-alt=&quot;Fig 117. 함수뒤에 점을 찍으면 추천어가 뜨는데 함수에서 쓸 수 있는 속성과 메소드들이다. apply와 call도 보인다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eLxdRt/btqBAVWW2Rp/MnzDqTGkdoKf59r7YUIlkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeLxdRt%2FbtqBAVWW2Rp%2FMnzDqTGkdoKf59r7YUIlkk%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;367&quot; height=&quot;675&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;863&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 117. 함수뒤에 점을 찍으면 추천어가 뜨는데 함수에서 쓸 수 있는 속성과 메소드들이다. apply와 call도 보인다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo1pZs/btqBxzOd78X/CGEYxonD2dWcVY0MwzK140/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo1pZs/btqBxzOd78X/CGEYxonD2dWcVY0MwzK140/img.png&quot; data-alt=&quot;Fig 118&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo1pZs/btqBxzOd78X/CGEYxonD2dWcVY0MwzK140/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo1pZs%2FbtqBxzOd78X%2FCGEYxonD2dWcVY0MwzK140%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;354&quot; height=&quot;271&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 118&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 118에서 와 같이 Console을 통해 함수가 쓸 수 있는 내장메소드들을 볼 수 있는데 [native code] 는 브라우저가 가지고 있는 내장코드를 의미하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;함수 sum은 Function 객체의 인스턴스다. 그렇기 때문에 객체 Function 의 메소드 apply를 호출 할 수 있다. apply 메소드는 두개의 인자를 가질 수 있는데, 첫번째 인자는 함수(sum)가 실행될 맥락이다. 맥락의 의미는 다음 예제를 통해서 살펴보자. 두번째 인자는 배열인데, 이 배열의 담겨있는 원소가 함수(sum)의 인자로 순차적으로 대입된다. Function.call은 사용법이 거의 비슷하다 여기서는 언급하지 않는다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;sum(1, 2);&amp;nbsp; 를 sum.apply(null, [1, 2]); 라고 해주어도 결과는 같다. 이때 인자의 위치를 잘 확인해보면, 기본호출방법과는 달리 sum.apply에서는 배열 안에 인자를 넣어주고 있다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&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;apply 의 사용&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Ubs30Xxe-Ps&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;New-Tab-Google-Chrome-2020-01-29-18-30-42.gif&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyvbDe/btqBAE2cz94/WpHSGd0JuPiPAp3tZOXTu0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyvbDe/btqBAE2cz94/WpHSGd0JuPiPAp3tZOXTu0/img.gif&quot; data-alt=&quot;Fig 119&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyvbDe/btqBAE2cz94/WpHSGd0JuPiPAp3tZOXTu0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cyvbDe/btqBAE2cz94/WpHSGd0JuPiPAp3tZOXTu0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;708&quot; height=&quot;470&quot; data-filename=&quot;New-Tab-Google-Chrome-2020-01-29-18-30-42.gif&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 119&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 함수 sum 안의 this는 정의되는 시점에서는 어느 객체인지 정해져 있지 않다.&amp;nbsp; sum 함수를 호출할 때 sum( ) 을 사용하지 않고 sum.apply( ) 를 사용하고 있는데 Fig 116과 달리 첫 인자를 null로 하지 않고 객체를 지정하고 있다. 그러면 이때 인자로 전달하는 객체 o1 혹은 o2이 바로 sum 함수 안에서 this 가 되는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 마치도 sum.apply(o1) 이 o1.sum처럼 작동한다는 것이다. 즉 o1에 대해 sum을 적용하는 것처럼 동작한다. 이해를 돕기 위해 코드를 좀 바꿔보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AeMDN/btqBCU3OCQn/RjXZ8HF9gKcvR3Twowuog0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AeMDN/btqBCU3OCQn/RjXZ8HF9gKcvR3Twowuog0/img.png&quot; data-alt=&quot;Fig 120&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AeMDN/btqBCU3OCQn/RjXZ8HF9gKcvR3Twowuog0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAeMDN%2FbtqBCU3OCQn%2FRjXZ8HF9gKcvR3Twowuog0%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;563&quot; height=&quot;295&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 120&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 o1 객체의 sum 속성 뒤에 ( )를 붙여 함수를 호출하고 있으며, 이 함수는 자신의 모든 요소들을 더하고 있는데 3개 요소를 더한 후 마지막 sum 속성의 값도 더한다. 즉 함수 정의문을 하나의 문자열로 하여 연결한 결과를 보여주는 것이다.&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mnvy5/btqBAVbxr61/JHX7KNNKp5BSIwx8dJeHDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mnvy5/btqBAVbxr61/JHX7KNNKp5BSIwx8dJeHDk/img.png&quot; data-alt=&quot;Fig 121. 객체의 요소 유형 type이 함수가 아닐 때만 더한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mnvy5/btqBAVbxr61/JHX7KNNKp5BSIwx8dJeHDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMnvy5%2FbtqBAVbxr61%2FJHX7KNNKp5BSIwx8dJeHDk%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;523&quot; height=&quot;305&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 121. 객체의 요소 유형 type이 함수가 아닐 때만 더한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 121과 같이 객체의 타입을 비교하는 코드를 삽입하면 결과는 Fig 119와 같아진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 복잡한 코드를 보다 보기 좋고 단순하게 할 수 있는 방법이 바로 Fig 119인 것이다. 그러면 sum이라는 함수가 마치도 o1이나 o2의 메소드인 것처럼 사용할 수 있는 것이다. 이것이 apply 를 써서 해결할 수 있는 방법 중 하나다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#func_ori&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;TOP&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;objectOri&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;4.&amp;nbsp;객체지향&lt;/h1&gt;
&lt;p style=&quot;font-size: 1.1em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#objOri&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 객체지향 프로그래밍&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#constructorNnew&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 생성자와 new [constructor]&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#globalObj&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 전역객체&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#thisObj&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- this&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#extends&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 상속&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#proto&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- prototype&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#standardBuilt&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 표준 내장 객체의 확장&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#objObj&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- Object&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#datatype&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 데이터 타입&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;#refrence&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- 참조&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;객체지향 프로그래밍은 크고 견고한 프로그램을 만들기 위한 노력의 산물이다. 객체지향이라는 큰 흐름은 현대적 프로그래밍 언어들을 지배하고 있는 가장 중요한 맥락이라고 할 수 있다. 하지만 자바스크립트의 객체지향은 다른 언어들의 객체지향과 사뭇 다르다. 특히 Java나 C++과 같은 주류 객체지향 언어에 익숙한 독자라면 극심한 혼란을 경험할 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;최소한 주류가 된 언어라면 그 언어가 추구한 나름대로의 지향점이 있을 것이다. 그 지향점에 대해서 이해하고 언어를 대한다면 훨씬 더 즐겁게 언어를 음미할 수 있을 것이다. 특히 모든 처리의 중심에 함수를 두는 자바스크립트를 공부하다 보면 객체지향을 이렇게도 추구 할수도 있다는 것을 알게 될 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;objOri&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;객체지향&amp;nbsp;프로그래밍&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;오리엔테이션&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/9BVi9ygdWs0&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향 프로그래밍(Object-Oriented Programming : OOP)은 좀 더 나은 프로그램을 만들기 위한 프로그래밍 패러다임으로 로직을 상태(state)와 행위(behave)로 이루어진 객체로 만드는 것이다. 이 객체들을 마치 레고 블럭처럼 조립해서 하나의 프로그램을 만드는 것이 객체지향 프로그래밍이라고 할 수 있다. 다시 말해서 객체지향 프로그래밍은 객체를 만드는 것이다. 따라서 객체지향 프로그래밍의 시작은 객체란 무엇인가를 이해하는 것이라고 할 수 있다. 말이 어렵게 느껴지지 않는가? 그것은 아직 객체 지향에 대한 체험이 없기 때문이다. 본 수업에서는 객체 지향에 대해서 코드 없이 이야기 할 수 있는 것들에 대해서만 이야기 할 생각이다. 객체 지향에 대한 오리엔테이션이라고 생각하고 가벼운 마음으로 나머지 내용을 읽어보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향 프로그래밍을 학습하는데 장애 중의 하나는 번역이다. Object를 번역한 객체는 현실에서는 거의 쓰지 않는 말이고, 머랄까 철학적인 느낌을 자아낸다. 그래서 객체지향 프로그래밍을 처음 접하는 입문자들은 객체지향 프로그래밍을 철학적인 탐구의 대상으로 파악하는 경향을 보이는데, 필자의 생각에 이것은 공부를 어렵게 할 뿐 도움이 되지 않는다. 쉽게 생각하자. 객체는 변수와 메소드를 그룹핑한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈튜토리얼의 구성은 대체로 이렇다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb68lN/btqBzQ2SuGJ/dtRiPt02rkX64vLZrDNijK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb68lN/btqBzQ2SuGJ/dtRiPt02rkX64vLZrDNijK/img.png&quot; data-alt=&quot;Fig 122&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb68lN/btqBzQ2SuGJ/dtRiPt02rkX64vLZrDNijK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb68lN%2FbtqBzQ2SuGJ%2FdtRiPt02rkX64vLZrDNijK%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;608&quot; height=&quot;756&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;756&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 122&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 사이트의 경우 일반적으로 알고 있는 소프트웨어와는 좀 다르지만 이런 웹서비스들도 애플리케이션이라고 부르고 이것도 분명히 소프트웨어이다. 아주 많은 경우에 이런 사이트를 구축하기 위해 JAVA를 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사이트에는 글목록을 출력하는 로직, 본문을 출력하는 로직, 댓글을 출력&lt;span style=&quot;color: #333333;&quot;&gt;&amp;bull;&lt;/span&gt;수정&lt;span style=&quot;color: #333333;&quot;&gt;&amp;bull;&lt;/span&gt;추가&lt;span style=&quot;color: #333333;&quot;&gt;&amp;bull;삭제&lt;/span&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;그럼 어떻게 할까? 이 사이트를 구성하고 있는 글목록, 본문, 댓글과 같은 기능적으로 로직들을 구분하여 글목록 관련 로직이라고 하면 변수이름 앞에 list_xxx, 본문 관련 변수&amp;bull;메소드라면 article_xxx 와 같이 명명한다거나, 글목록 관련 변수나 메소드 또는 본문 관련 변수 메소드 들을 각각의 기능별로 쪼개서 코드상으로 서로 연관되어 있는 코드끼리 모아놓는 다거나 하는 여러 가지 조치들을 취하게 되는데 그것이 일종의 그루핑, 분류화, categorizing 등이다. 이렇게 소프트웨어가 커지면서 발생하는 여러가지 문제들[소위 막장], 이런 막장으로 해 절망감 속에서 허덕이다 보면 자연스럽게 그것을 해소할 수 있는 방법들에 대해 모색하게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러한 모색으로부터 나온 결과 중 하나가 객체지향이라고 볼 수 있다. 계속해서 Fig 122를 예를 들어 얘기를 하는 것이지만, 본문, 댓글, 글목록 과 관련되어 있는 로직들[변수, 메소드]을 서로 연관되어 있는 기능 별로 그루핑하는 기능을 프로그래밍차원에서, 언어차원에서 제공하게 되는 것이다. 그렇게 하여 그루핑된 하나하나의 단위들을 객체라고 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본문이 있으면 이 객체 안에는 그와 관련된 변수와 메소드들이 응집되어 있고, 또 댓글과 관련되어 있는 변수와 메소드들[추가&amp;bull;삭제&amp;bull;변경&amp;bull;수정 등]이 아래 그림과 같이 객체 단위로 응집되어 있는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfXUpQ/btqBAWO5QoY/7fyJftTx6uKDPImxyKoQo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfXUpQ/btqBAWO5QoY/7fyJftTx6uKDPImxyKoQo1/img.png&quot; data-alt=&quot;Fig 123. 기능에 따른 로직 별로 객체를 이루고 관련된 변수와 메소드들을 가지고 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfXUpQ/btqBAWO5QoY/7fyJftTx6uKDPImxyKoQo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfXUpQ%2FbtqBAWO5QoY%2F7fyJftTx6uKDPImxyKoQo1%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;817&quot; height=&quot;544&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 123. 기능에 따른 로직 별로 객체를 이루고 관련된 변수와 메소드들을 가지고 있다&lt;/figcaption&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;이렇게 객체를 분류하여 소프트웨어를 좀 더 명확하게 이해하고 쉽게 관리할 수 있도록 기능 별로 로직들을 구획화시키고 분류하고 categorizing 하면 자연스럽게 객체라고 하는 문법적인 기능이 나타나게 되는 것이고 그러한 기능은 어디에 알맞고 또는 다른 사이트를 구축할 때도 쓸 수 있다라는 생각을 하게 되는 것이다. 그러면 이 댓글이라는 객체를 다른 사이트 혹은 다른 애플리케이션에서도&amp;nbsp; 가져다 쓸 수 있게 되는 것이다. 이러한 것이 프로그래밍에서 가장 중요한 부분의 하나인 재활용성에 객체가 기여하는 부분이다. 이미 사용하고 있는 것들을 다른 곳에서도 사용하려고 하게 되고 실제로 그렇게 하려면 또 다른 문제들을 발생시키게 되는데, 그러한 문제들을 완화시키기 위해 로직을 제한하고 컨트롤하는 여러 가지 기능들이 추가되게 되는데 이제 마주하게 될 객체지향의 여러 가지 기능들이 그러한 맥락에서 나타나게 되었을 것이다. 객체지향프로그래밍을 객체를 만드는 것이고 객체는 추상적으로 생각할 대상이 아니며 언어차원에서 매우 구체적인 문법적인 기능이 제공된다. 하나의 객체 안에는 그 객체가 가지고 있는 취지 [예를 들어 본문인지 댓글인지] 와 연관되어 있는 변수와 메소드들이 들어 있고 그리고 연관성이 없는 다른 로직과 구분해주는 역할을 하는 것이 객체라고 보면 된다.&amp;nbsp;&lt;/p&gt;
&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;추상화&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/5NmyjJdoLZM&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문법과 설계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향 프로그래밍 교육은 크게 두 가지로 구분된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나는 객체지향을 편하게 할 수 있도록 언어가 제공하는 기능을 익히는 것이다. 이러한 기능들은 if, for문처럼 문법적인 구성을 가지고 있다. 이 문법을 이해하고, 숙지해야 객체를 만들 수 있다. 객체를 만드는 법에 대한 학습이라고 할 수 있다. 우리 수업은 여기에 초점이 맞춰져 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;설계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;두 번째는 좋은 객체를 만드는 법이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향을 배우고자 한다면 일단은 문법을 먼저 정복하는 수밖에 없다. 객체지향프로그래밍을 하기 위해서는 어떤 코드를 어떻게 작성해야 하고 그것이 어떤 기능을 가지고 있는가 하는 것들을 익히는 것이 기본적인 것이고 어떤 측면에서 가장 쉬운 일이라고 할 수 있다. 정말로 어려운 것은 객체지향을 이용하여 현실을 잘 담아낼 수 있는 소프트웨어를 개발하는 것이다. &lt;span style=&quot;color: #666666;&quot;&gt;이것을 다른 말로는 설계를 잘하는 법이라고 할 수 있다. 설계는 현실에서 우리가 관심이 있는 어떤 특성 혹은 관점을 소프트웨어화 시켜서 문제를 해결하는 것을 프로그래밍, 프로그램이라고 할 수 있다. 문제는 이 현실이 아주 복잡하다는 것이다. 소프트웨어는 현실보다 훨씬 단순하다. 소프트웨어도 현실 안에 포함되기 때문에 당연히 현실이 훨씬 더 복잡한 것이다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;좋은 설계는 현실을 잘 반영해야 한다. 현실은 복잡하다. 하지만 그 복잡함 전체가 필요한 것은 아니다. 아래의 그림을 보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1uOgE/btqBzQaO6MM/8ASuBqL6LVbOpi9MbkBA4K/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1uOgE/btqBzQaO6MM/8ASuBqL6LVbOpi9MbkBA4K/img.gif&quot; data-alt=&quot;Fig 124 런던의 위성사진 지도, 전철 노선&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1uOgE/btqBzQaO6MM/8ASuBqL6LVbOpi9MbkBA4K/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/c1uOgE/btqBzQaO6MM/8ASuBqL6LVbOpi9MbkBA4K/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;637&quot; height=&quot;654&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 124 런던의 위성사진 지도, 전철 노선&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림은 런던의 지도다. 여러분이 지하철을 이용한다면 어떤 지도를 선호할까? 오른쪽 하단의 지도를 선호할 것이다. 왼쪽 상단의 지도는 현실의 복잡함을 나타낸다. 오른쪽 하단의 지도는 지하철 탑승자의 관심사만을 반영하고 있다. 역 간의 거리나 실제 위치와 같은 요소들은 모두 배제하고 있다. 복잡함 속에서 필요한 관점만을 추출하는 행위를 추상화라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지하철 노선도가 디자인의 추상화라고 한다면 프로그램을 만든다는 것은 소프트웨어의 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;추상화 abstract&lt;/b&gt; &lt;/span&gt;라고 할 수 있다. 객체 지향 프로그래밍은 좀 더 현실을 잘 반영하기 위한 노력의 산물이다. 이것은 단순히 객체 지향의 문법을 이용해서 객체를 만든다고 달성되는 것이 아니다. 고도의 추상화 능력이 필요하다. 좋은 설계는 문법을 배우는 것보다 훨씬 어려운 일이다. 심지어 이것은 지식을 넘어서 지혜의 영역이다. 좋은 설계를 위한 조언들은 많지만 이러한 조언들은 조언자의 입을 떠나는 순간 생명력을 잃어버린다. 지식은 전수되지만 지혜는 전수되지 않기 때문이다. 스스로 경험하고 깨우쳐서 자기화시켜야 한다. 필자도 그 긴 여정을 따라가고 있는 견습생에 불과하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향의 설계 원칙이나 객체 지향의 철학적인 의미는 대단히 중요하다. 하지만 이러한 것들을 지금 언급한다면 여러분은 미궁 속에 빠지게 될 것이다. 그래서 필자가 제안하는 것은 일단은 지식부터 익히자는 것이다. 언어가 지원하는 객체지향 문법을 배우고, 이것들이 어떻게 동작하는지를 충분히 이해한 다음에 비로소 설계 원칙도 이야기할 수 있고, 객체와 사물의 비유도 시도해 볼 수 있을 것이다. 여기서는 몇 가지 객체지향이 추구하는 지향점을 가볍게 이야기하고 다음 토픽부터 구체적인 문법을 알아볼 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;부품화&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/y7Z_Wpgmz-Q&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래밍은 정신적인 활동이다. 정신적인 것은 실체가 없고, 무한하고, 유연하다. 이러한 특성은 정신이 가진 장점이면서&amp;nbsp; 소프트웨어의 극치다. 하지만 정신의 이러한 특성은 때로 오해나 모순 같은 문제점을 유발한다. 소프트웨어도 이러한 문제점을 그대로 상속받는다. 이러한 문제점을 극복하기 위한 노력 중의 하나가 부품화라고 할 수 있다. 객체 지향과 부품화를 동일시 할 수는 없지만 부품화라고 하는 소프트웨어의 큰 흐름은 객체 지향이 만들어지는데 지대한 공헌을 했다고 할 수 있다. 하드웨어에서 이루어지는 부품화의 예를 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 컴퓨터는 초창기의 컴퓨터다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DbeL4/btqBCnL1IS6/2KYxS2A61iXjAQhysC7j0k/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DbeL4/btqBCnL1IS6/2KYxS2A61iXjAQhysC7j0k/img.gif&quot; data-alt=&quot;Fig 126. 초창기 컴퓨터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DbeL4/btqBCnL1IS6/2KYxS2A61iXjAQhysC7j0k/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/DbeL4/btqBCnL1IS6/2KYxS2A61iXjAQhysC7j0k/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;187&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 126. 초창기 컴퓨터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본체와 모니터와 키보드가 하나로 단일화되어 있다. 이것의 문제점은 분명하다. 모니터가 고장 나면 컴퓨터를 바꿔야 한다. 키보드가 고장 나도 컴퓨터를 교체해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3oY5J/btqBBfuazhB/FfFExsux7CjI1EnvThlaGK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3oY5J/btqBBfuazhB/FfFExsux7CjI1EnvThlaGK/img.gif&quot; data-alt=&quot;Fig 127. 부품화된 컴퓨터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3oY5J/btqBBfuazhB/FfFExsux7CjI1EnvThlaGK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/c3oY5J/btqBBfuazhB/FfFExsux7CjI1EnvThlaGK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;187&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 127. 부품화된 컴퓨터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 위와 같이 모니터와 본체와 컴퓨터를 분리했다. 다시 말해서 부품화 시킨 것이다. 기능들을 부품화 시킨 덕분에 소비자들은 더 좋은 키보드나 저렴한 모니터를 선택할 수 있게 되었다. 또 문제가 생겼을 때 그 문제가 어디에서 발생한 것인지 파악하고 해결하기가 훨씬 쉬워진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림에서 모니터와 키보드 그리고 본체를 분리하는 기준은 무엇일까? 그 기준을 세우는 것이 추상화일 것이다. 위 제품의 기획자는 컴퓨터를 입력과 출력 그리고 연산 &amp;amp; 저장으로 분류하고 있다. 이 분류에 따라서 부품들을 모으고 분리해서 모니터, 키보드, 본체와 마우스라는 개별적인 완제품을 만들고 있다. 이 완제품들을 부품으로 조합하면 컴퓨터라는 하나의 완제품이 만들어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 정해진 답이 있는 것은 아니다. 아래 컴퓨터는 저장 장치를 부품화시키고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZZiRR/btqBADPP1mx/JBPJxn15zFrHcVTEMqxY61/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZZiRR/btqBADPP1mx/JBPJxn15zFrHcVTEMqxY61/img.gif&quot; data-alt=&quot;Fig 128. 저장장치가 부품화된 컴퓨터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZZiRR/btqBADPP1mx/JBPJxn15zFrHcVTEMqxY61/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cZZiRR/btqBADPP1mx/JBPJxn15zFrHcVTEMqxY61/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;187&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 128. 저장장치가 부품화된 컴퓨터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 아래 장치는 현시점에서 최신 데스크탑이다. 그런데 부품화를 제거하고 있다. 기술이 경량화되면서 컴퓨터는 더욱 작아지게 되었고, 그 결과 컴퓨터를 부품화하는 것의 매력이 반감되고 있기 때문이 아닐까? 부품화가 중요한 것임에는 분명하지만 그 보다 중요한 것은 적절함이다. 그래서 설계가 어려운 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L7OCX/btqBBfAU8pq/3wMkfk9dCqScBoFrMIwprK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L7OCX/btqBBfAU8pq/3wMkfk9dCqScBoFrMIwprK/img.gif&quot; data-alt=&quot;Fig 129. 최신 일체화된 데스크탑 컴퓨터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L7OCX/btqBBfAU8pq/3wMkfk9dCqScBoFrMIwprK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/L7OCX/btqBBfAU8pq/3wMkfk9dCqScBoFrMIwprK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;187&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 129. 최신 일체화된 데스크탑 컴퓨터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 지향은 부품화의 정점이라고 할 수 있다. 하지만 우리는 아직 객체 지향을 배우지 않았다. 그래서 우리가 배운 것 중에서 부품화의 특성을 보여줄 수 있는 기능을 생각해보면 좋을 것 같다. 메소드는 부품화의 예라고 할 수 있다. 메소드를 사용하는 기본 취지는 연관되어 있는 로직들을 결합해서 메소드라는 완제품을 만드는 것이다. 그리고 이 메소드들을 부품으로 해서 하나의 완제품인 독립된 프로그램을 만드는 것이다. 메소드를 사용하면 코드의 양을 극적으로 줄일 수 있고, 메소드 별로 기능이 분류되어 있기 때문에 필요한 코드를 찾기도 쉽고 문제의 진단도 빨라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 프로그램이 커지면 엄청나게 많은 메소드들이 생겨나게 된다. 메소드와 변수를 관리하는 것은 점점 어려운 일이 되기 시작한다. 급기야는 메소드가 없을 때와 같은 상황에 봉착하게 된다. 메소드는 프로그래밍의 역사에서 중요한 도약이었지만, 이 도약이 성숙하면서 새로운 도약지점이 보이기 시작한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 도약 중의 하나가 객체 지향 프로그래밍이다. 이것의 핵심은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;연관된 메소드와 그 메소드가 사용하는 변수들을 분류하고 그룹핑하는 것이다.&lt;/u&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;바로 그렇게 그룹핑 한 대상이 객체(Object)다. 비유하자면 파일과 디렉토리가 있을 때 메소드나 변수가 파일이라면 이 파일을 그룹핑하는 디렉토리가 객체라고 할 수 있다. 이를 통해서 더 큰 단위의 부품을 만들 수 있게 되었다. 객체를 만드는 법에 대해서 호기심이 생기지 않는가? 이런 호기심을 유발시키는 것이 이번 토픽의 목적이다. 객체를 만드는 법은 다음 토픽에서 알아보고 지금은 부품화에 대해서 조금 더 생각해보자.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;은닉화, 캡슐화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 부품화라고 하는 목표는 단순히 동일한 기능을 하는 메소드와 변수를 그룹핑한다고 달성되는 것은 아니다. 제대로된 부품이라면 그것이 어떻게 만들어졌는지 모르는 사람도 그 부품을 사용하는 방법만 알면 쓸 수 있어야 한다. 이를테면 모니터가 어떻게 동작하는지 몰라도 컴퓨터와 모니터를 연결하는 방법만 알면 화면을 표시 할 수 있는 것과 같은 이치다. 즉 내부의 동작 방법을 단단한 케이스 안으로 숨기고 사용자에게는 그 부품의 사용방법만을 노출하고 있는 것이다. 이러한 컨셉을 정보의 은닉화(Information Hiding), 또는 캡슐화(Encapsulation)라고 부른다. 자연스럽게 사용자에게는 그 부품을 사용하는 방법이 중요한 것이 된다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;인터페이스&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 만들어진 부품이라면 부품과 부품을 서로 교환 할 수 있어야 한다. 예를들어보자. 집에 있는 컴퓨터에 A사의 모니터를 연결하다가 B사의 모니터를 연결 할 수 있다. 또 집에 있던 모니터에 A사의 컴퓨터를 연결해서 사용하다가 새로운 컴퓨터를 구입하면서 B사의 컴퓨터를 연결 할 수 있다. 모니터와 컴퓨터는 서로가 교환관계에 있는 것이다. 이것은 모니터와 컴퓨터를 연결하는 케이블의 규격이 표준화 되어 있기 때문에 가능한 일이다. 아래의 그림을 보자. 모니터와 컴퓨터를 연결하는 케이블인 HDMI를 보여준다.&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;400&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mvpzn/btqBAE2mTri/J5Fy5AhDSSpAVxA7znkQNk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mvpzn/btqBAE2mTri/J5Fy5AhDSSpAVxA7znkQNk/img.gif&quot; data-alt=&quot;Fig 130. HDMI Connector Pins&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mvpzn/btqBAE2mTri/J5Fy5AhDSSpAVxA7znkQNk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/mvpzn/btqBAE2mTri/J5Fy5AhDSSpAVxA7znkQNk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;424&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 130. HDMI Connector Pins&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터와 모니터를 만드는 업체들은 위와 같은 케이블의 규격을 공유한다. 모니터 입장에서는 컴퓨터가, 컴퓨터 입장에서는 모니터가 어떤 식으로 만들어졌는지는 신경쓰지 않는다. 각각의 부품은 미리 정해진 약속에 따라서 신호를 입, 출력하고, 연결점의 모양을 표준에 맞게 만들면 된다. 이러한 연결점을 인터페이스(interface)라고 한다. 위의 그림을 보면 HDMI 케이블의 연결점은 특유의 생김새가 있다. 만약 HDMI 케이블을 랜선을 연결하는 구멍에 연결하려고 한다면 어떻게 될까? 동작하지 않을 뿐 아니라 연결 자체가 되지 않는다. 인터페이스란 이질적인 것들이 결합하는 것을 막아주는 역할도 하는 것이다. 즉 인터페이스는 부품들 간의 약속이다. 이러한 약속을 프로그래밍적으로는 어떻게 구현하는가도 살펴본다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cC9Du3/btqBAWIpFgB/LG2tLOajKeJzvLZMBWSFkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cC9Du3/btqBAWIpFgB/LG2tLOajKeJzvLZMBWSFkK/img.png&quot; data-alt=&quot;Designed by &amp;amp;nbsp; Mourad Mokrane&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cC9Du3/btqBAWIpFgB/LG2tLOajKeJzvLZMBWSFkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcC9Du3%2FbtqBAWIpFgB%2FLG2tLOajKeJzvLZMBWSFkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;253&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;253&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Designed by &amp;nbsp; Mourad Mokrane&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Designed by&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://thenounproject.com/molumen&quot;&gt;Mourad Mokrane&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#objectOri&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;constructorNnew&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;생성자와&amp;nbsp;new&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;소개&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/qnOX3M7VpQ8&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향에 대해 위에서 언급한 부분은 java, php 등 모든 언어에 있어 공통적인 부분이라고 할 수 있다. 여기서부터는 javascript가 어떻게 객체지향이라는 프로그래밍 패러다임에 접근하고 있는지를 살펴본다. javascript는 다른 객체지향언어와는 차이가 있다. 자기만의 아주 독특한 성격을 가지고 있고 이런 계열의 언어를 prototype-based programming 이라고 한다. 프로토타입기반 프로그래밍이라는 카테고리에 속해있다. 전통적인 함수형 언어의 특성을 그대로 가지고 있는 것이 아니고 객체지향언어가 가지고 있는 문법을 비슷하게 사용하면서 사실은 함수형 언어의 특성을 가지고 있기 때문에 매우 혼란스러울수 있다. 그래서 javascript는 알면 알수록 미궁에 빠지는 느낌이 드는 언어이기도 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;javascript가 추구하는 객체지향 프로그래밍 스타일은 대단히 자유롭고 유연하다. java나 c++과 같은 언어들이 추구하는 객체지향이 규제를 통해 버그의 가능성을 최소화시키고 거대한 소프트웨어를 만들기 위한 다양한 매니지먼트 도구들을 엄격하고 깐깐하게 도입한 언어들이라고 한다면, javascript는 마치 예술과 같은 느낌이지만 거기에 익숙해지기 전까지는 대단히 혼란스럽고 뭔가 엉성한 느낌이 들 수도 있다. 하지만 javascript는 그것이 추구하는 것이 있고 그로 인해 오늘날 가장 많은 사람들이 사용하는 언어가 될 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향프로그램을 간단히 말하면 서로 연관되어있는 변수와 메소드를 하나의 객체라고 하는 그릇에 넣는 것이다. 그리고 서로 연관되어 있지 않은 것들은 별도의 객체에 담아 분리를 시키는 것이 [Fig 123] 객체지향프로그램의 기본적인 형태라고 할 수 있다. 연관되어 있는 것들을 그룹핑, categorizing 하는 것이 마치도 연관된 파일들을 그룹핑하는 것과 같은데, 그러한 것들을 제공해주는 문법적인 체계가 객체란 것이고 그 객체를 이용하여 여러 가지 연관되어 있는 로직들을 객체화시키게 되면 각각의 로직들은 하나하나가 일종의 독립된 프로그램처럼 독립성을 갖게 된다. 즉 여러 완제품의 부품으로 사용할 수 있다는 것이다. 객체지향을 통해 도달코자 하는 목적은 바로 좋은 부품의 로직을 만드는 것이며 쉬운 일은 아니다.&lt;/p&gt;
&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;객체생성&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/VLhA3haEfIk&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;932&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buGYAn/btqByF1V17V/92PeMxTALTcjO07uVJpaN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buGYAn/btqByF1V17V/92PeMxTALTcjO07uVJpaN1/img.png&quot; data-alt=&quot;Fig 131. Object 를 만들고 점을 찍으면 그 안의 속성들을 볼 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buGYAn/btqByF1V17V/92PeMxTALTcjO07uVJpaN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuGYAn%2FbtqByF1V17V%2F92PeMxTALTcjO07uVJpaN1%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;447&quot; height=&quot;758&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;932&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 131. Object 를 만들고 점을 찍으면 그 안의 속성들을 볼 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 131의 1행에서 { } 은 Object 라는 이름의 비어있는 객체를 만든다. 이 Object는 데이터를 담을 수 있는 비어있는 상자라고 보면 된다.&amp;nbsp; 객체를 가리키는 변수뒤에 점을 찍고 속성을 써주면 그 속성값을 변경 또는 꺼낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;person.name 처럼 말이다. person은 비어있는 Object 를 가리키고 name은 Obect의 속성 property 중 하나다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3행에서 person의 introduce 속성에는 함수를 넣었으며 이 함수를 메소드라고 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6행: introduce 뒤에 ( ) 를 붙여 정의한 함수를 호출하는데 함수 안의 this 는 이 함수가 속해있는 Object 즉 person 이라는 변수가 담고 있는 객체를 가리키는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 객체를 만들고 있는데 [3행], 객체 안에 들어가는&amp;nbsp; property [2행] 와 method [3행] 가 객체를 정의하는 3행과 분리가 되어 있다. 때문에 중간에 다른 코드가 끼어드는 것과 같은 일련의 행위들에 의해 객체를 정의함에 있어서 집중도가 떨어질 수 있다. 즉 객체를 만드는 과정이 분산되어 있다. 아래의 코드는 그런 문제를 해결할 수 있다.&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;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG8nV4/btqBCmzCzxK/W4miFgtDqPCL8v8NyPbZkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG8nV4/btqBCmzCzxK/W4miFgtDqPCL8v8NyPbZkK/img.png&quot; data-alt=&quot;Fig 132&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG8nV4/btqBCmzCzxK/W4miFgtDqPCL8v8NyPbZkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG8nV4%2FbtqBCmzCzxK%2FW4miFgtDqPCL8v8NyPbZkK%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;472&quot; height=&quot;251&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 132&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서처럼 객체를 만드는 2가지 방법 중 어느 것이 좋다 나쁘다는 건 아니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oVXMR/btqBAE2sqrE/WTKzkpu7uJark5OzjDbGbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oVXMR/btqBAE2sqrE/WTKzkpu7uJark5OzjDbGbk/img.png&quot; data-alt=&quot;Fig 133. 같은 구조를 가지는 객체를 이용해 여러 객체를 만든다고 하자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oVXMR/btqBAE2sqrE/WTKzkpu7uJark5OzjDbGbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoVXMR%2FbtqBAE2sqrE%2FWTKzkpu7uJark5OzjDbGbk%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;465&quot; height=&quot;293&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 133. 같은 구조를 가지는 객체를 이용해 여러 객체를 만든다고 하자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 133 과 같이 같은 구조의 Object를 서로 다른 변수를 써서 여러 개 만든다고 하면 introduce 메소드는 완전히 중복되는 것을 알 수 있으며 만일 이 메소드의 내용을 수정해야 한다면 객체의 수가 많을 경우 엄청난 문제가 될 수 있다. 이러한 중복은 코드의 가독성, 코드의 량, 유지보수의 측면에서 매우 부정적인 현상이다.&amp;nbsp; 이것을 해결하는 방법이 생성자와 new이다.&lt;/p&gt;
&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;생성자와 new&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/VnqC_EmnU9g&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;javascript는 함수형 언어이고 javascript를 이해하는 가장 중요한 키워드는 객체이기 전에 함수이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;생성자(constructor)는 객체를 만드는 역할을 하는 함수다. 자바스크립트에서 함수는 단순히 재사용 가능한 로직의 묶음이 아니라 객체를 만드는 창조자라고도 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kApxE/btqBBVvxSlU/nNbAYMyP9PDkWVzKt3GWZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kApxE/btqBBVvxSlU/nNbAYMyP9PDkWVzKt3GWZ1/img.png&quot; data-alt=&quot;Fig 134. new&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kApxE/btqBBVvxSlU/nNbAYMyP9PDkWVzKt3GWZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkApxE%2FbtqBBVvxSlU%2FnNbAYMyP9PDkWVzKt3GWZ1%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;266&quot; height=&quot;356&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 134. new&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 134 에서 Person이라는 함수를 정의하고 p0에 넣은 후 p0의 값을 보면 &lt;span style=&quot;color: #9d9d9d;&quot;&gt;undefined&lt;/span&gt; 이지만 new Person() 을 p에 넣고 p의 값을 보면 &lt;b&gt;&lt;i&gt;Person{ }&lt;/i&gt;&lt;/b&gt; 인 것을 볼 수 있다. { } 은 비어 있는 객체라는 뜻이다. Person( ) 앞에 new 가 붙어있으면 Person( )는 함수라고 부르는 것이 아니라 생성자라고 부른다. 객체의 생성자인 것이다. p에는 비어있는 Person{ } 객체가 만들어지는 것이다. 함수가 객체의 창조자로서의 역할을 하는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바의 경우는 클래스 안에 생성자가 존재하고 [즉 생성자는 클래스에 소속되어 있다] 생성자를 호출하는 것을 통해 클래스의 인스턴스, 즉 클래스의 객체를 만들어 낸다. javascript는 생성자가 어디에 소속되어 있지 않다. 생성자는 그냥 함수일 뿐이다. 함수 앞에 new를 붙여 실행하면 객체를 만들어 내는 것이다. javascript에는 클래스라는 존재가 없다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S6H7t/btqBBgtbwO6/JlCWb8tPbNnmEIeTHHHIvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S6H7t/btqBBgtbwO6/JlCWb8tPbNnmEIeTHHHIvk/img.png&quot; data-alt=&quot;Fig 135&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S6H7t/btqBBgtbwO6/JlCWb8tPbNnmEIeTHHHIvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS6H7t%2FbtqBBgtbwO6%2FJlCWb8tPbNnmEIeTHHHIvk%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;437&quot; height=&quot;304&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 135&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;함수를 호출할 때 new을 붙이면 새로운 객체를 만든 후에 이를 리턴한다. 위의 코드는 새로운 객체를 변수 p에 담았다. 여러사람을 위한 객체를 만든다면 아래와 같이 코드를 작성해야 할 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ErQef/btqBBT5zCY1/dfGh7oxJwweU27yu93zKI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ErQef/btqBBT5zCY1/dfGh7oxJwweU27yu93zKI1/img.png&quot; data-alt=&quot;Fig 135-1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ErQef/btqBBT5zCY1/dfGh7oxJwweU27yu93zKI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FErQef%2FbtqBBT5zCY1%2FdfGh7oxJwweU27yu93zKI1%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;472&quot; height=&quot;501&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;605&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 135-1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;별로 개선된 것이 없다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDRLBv/btqBCUQsZxn/F1G5XAKQUal6Kkm02PxiR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDRLBv/btqBCUQsZxn/F1G5XAKQUal6Kkm02PxiR1/img.png&quot; data-alt=&quot;Fig 135-2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDRLBv/btqBCUQsZxn/F1G5XAKQUal6Kkm02PxiR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDRLBv%2FbtqBCUQsZxn%2FF1G5XAKQUal6Kkm02PxiR1%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;450&quot; height=&quot;362&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 135-2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자 내에서 이 객체의 프로퍼티를 정의하고 있다. 이러한 작업을 초기화 init, initialize 라고 한다. 이를 통해서 코드의 재사용성이 대폭 높아졌다. 7,10행의 Person은 함수가 아닌 생성자이다.&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 align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#objectOri&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;globalObj&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;전역객체&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;전역객체(Global object)는 특수한 객체다. 모든 객체는 이 전역객체의 프로퍼티다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deTpwq/btqBDccgce0/vUHENq05S1pPcKNAyBtN5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deTpwq/btqBDccgce0/vUHENq05S1pPcKNAyBtN5K/img.png&quot; data-alt=&quot;Fig 136&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deTpwq/btqBDccgce0/vUHENq05S1pPcKNAyBtN5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeTpwq%2FbtqBDccgce0%2FvUHENq05S1pPcKNAyBtN5K%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;340&quot; height=&quot;215&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 136&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;func();와 window.func();는 모두 실행이 된다. 모든 전역변수와 함수는 사실 window 객체의 프로퍼티다. 객체를 명시하지 않으면 암시적으로 window의 프로퍼티로 간주된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SdKl7/btqBAWn8AiT/CTB0DfkhnzRxuwO7saN3ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SdKl7/btqBAWn8AiT/CTB0DfkhnzRxuwO7saN3ek/img.png&quot; data-alt=&quot;Fig 136-1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SdKl7/btqBAWn8AiT/CTB0DfkhnzRxuwO7saN3ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSdKl7%2FbtqBAWn8AiT%2FCTB0DfkhnzRxuwO7saN3ek%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;367&quot; height=&quot;192&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 136-1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에서 모든 객체는 기본적으로 전역객체의 프로퍼티임을 알 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전역객체 API&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;생활코딩의&lt;/span&gt;&lt;a href=&quot;https://www.opentutorials.org/course/50&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;자바스크립트사전&lt;/a&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;을 보면 Global 이라는 객체가 있으며 Global 안에 정의되어 있는 API 들이 전역객체가 가지고 있는 API 이고 전역변수 또는 전역 함수를 정의하게 되면 그 함수와 변수는 사실상 Global 객체의 property로 직접 추가한다는 의미를 가진다. 이 사전에 보여주는 메소드들은 javascript에서 기본적으로 제공하고 있는 표준화된 메소드들이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ECMAScript에서는 전역객체의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://opentutorials.org/course/50/44&quot;&gt;API&lt;/a&gt;를 정의해두었다. 그 외의 API는 호스트 환경에서 필요에 따라서 추가로 정의하고 있다. 이를테면 웹브라우저 자바스크립트에서는 alert()이라는 전역객체의 메소드가 존재하지만 node.js에는 존재하지 않는다.&amp;nbsp;&lt;span&gt;또한 전역객체의 이름도 호스트환경에 따라서 다른데, 웹브라우저에서 전역객체는 window이지만 node.js에서는 global이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1325&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHWqkC/btqBDbj7rDK/sHHz5qZQ20MlO2jio3rW8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHWqkC/btqBDbj7rDK/sHHz5qZQ20MlO2jio3rW8k/img.png&quot; data-alt=&quot;Fig 137. nodejs 실행 후 global 명령어 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHWqkC/btqBDbj7rDK/sHHz5qZQ20MlO2jio3rW8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHWqkC%2FbtqBDbj7rDK%2FsHHz5qZQ20MlO2jio3rW8k%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;1325&quot; height=&quot;177&quot; data-origin-width=&quot;1325&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 137. nodejs 실행 후 global 명령어 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;1177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqQNUM/btqBAVQlkST/TaewMfFK70CrfKFVlHoFK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqQNUM/btqBAVQlkST/TaewMfFK70CrfKFVlHoFK1/img.png&quot; data-alt=&quot;Fig 137-1. nodejs에서 global 명령어 실행결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqQNUM/btqBAVQlkST/TaewMfFK70CrfKFVlHoFK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqQNUM%2FbtqBAVQlkST%2FTaewMfFK70CrfKFVlHoFK1%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;664&quot; height=&quot;926&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;1177&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 137-1. nodejs에서 global 명령어 실행결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvMlHu/btqBDcpNBow/3qhGZ0QjIDhKo30psrUkFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvMlHu/btqBDcpNBow/3qhGZ0QjIDhKo30psrUkFK/img.png&quot; data-alt=&quot;Fig 137-2. nodejs에서 전역객체는 global&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvMlHu/btqBDcpNBow/3qhGZ0QjIDhKo30psrUkFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvMlHu%2FbtqBDcpNBow%2F3qhGZ0QjIDhKo30psrUkFK%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;314&quot; height=&quot;213&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;251&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 137-2. nodejs에서 전역객체는 global&lt;/figcaption&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 align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#objectOri&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;thisObj&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;this&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수와 this&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/4ACSJlzJjJs&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;this는 함수 내에서 함수 호출 맥락(context)를 의미한다. 맥락이라는 것은 상황에 따라서 달라진다는 의미인데 즉 함수를 어떻게 호출하느냐에 따라서 this가 가리키는 대상이 달라진다는 뜻이다. 함수와 객체의 관계가 느슨한 자바스크립트에서 this는 이 둘을 연결시켜주는 실질적인 연결점의 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;함수호출&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수를 호출했을 때 this는 무엇을 가르키는지 살펴보자.&amp;nbsp;this는 전역객체인 window와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5ougZ/btqBBfHMUGp/RMqvUpDBknCKVbA0juC2h1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5ougZ/btqBBfHMUGp/RMqvUpDBknCKVbA0juC2h1/img.png&quot; data-alt=&quot;Fig 138. func( ) 를 호출하면 이때 this는 window이다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5ougZ/btqBBfHMUGp/RMqvUpDBknCKVbA0juC2h1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5ougZ%2FbtqBBfHMUGp%2FRMqvUpDBknCKVbA0juC2h1%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;787&quot; height=&quot;281&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 138. func( ) 를 호출하면 이때 this는 window이다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;this는 함수 안에서 사용할 수 있는 약속되어 있는 변수이다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메소드의 호출&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/DERfOojAp4g&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rRz6B/btqBCnyx4vF/xBileqbXAfr0dV5vk1Hs9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rRz6B/btqBCnyx4vF/xBileqbXAfr0dV5vk1Hs9k/img.png&quot; data-alt=&quot;Fig 139. 객체의 소속인 메소드의 this는 그 객체를 가르킨다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rRz6B/btqBCnyx4vF/xBileqbXAfr0dV5vk1Hs9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrRz6B%2FbtqBCnyx4vF%2FxBileqbXAfr0dV5vk1Hs9k%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;755&quot; height=&quot;346&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 139. 객체의 소속인 메소드의 this는 그 객체를 가르킨다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;객체의 소속인 메소드의 this는 그 객체를 가리킨다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;gutter&quot;&gt;
&lt;div class=&quot;line number1 index0 alt2&quot;&gt;1&lt;/div&gt;
&lt;div class=&quot;line number2 index1 alt1&quot;&gt;2&lt;/div&gt;
&lt;div class=&quot;line number3 index2 alt2&quot;&gt;3&lt;/div&gt;
&lt;div class=&quot;line number4 index3 alt1&quot;&gt;4&lt;/div&gt;
&lt;div class=&quot;line number5 index4 alt2&quot;&gt;5&lt;/div&gt;
&lt;div class=&quot;line number6 index5 alt1&quot;&gt;6&lt;/div&gt;
&lt;div class=&quot;line number7 index6 alt2&quot;&gt;7&lt;/div&gt;
&lt;div class=&quot;line number8 index7 alt1&quot;&gt;8&lt;/div&gt;
&lt;/td&gt;
&lt;td class=&quot;code&quot;&gt;
&lt;div class=&quot;container&quot;&gt;
&lt;div class=&quot;line number1 index0 alt2&quot;&gt;&lt;b&gt;&lt;code class=&quot;javascript keyword&quot;&gt;var&lt;/code&gt;&lt;/b&gt; &lt;code class=&quot;javascript plain&quot;&gt;o = {&lt;/code&gt;&lt;/div&gt;
&lt;div class=&quot;line number2 index1 alt1&quot;&gt;&lt;code class=&quot;javascript spaces&quot;&gt;    &lt;/code&gt;&lt;code class=&quot;javascript plain&quot;&gt;&amp;nbsp; &amp;nbsp; func : &lt;/code&gt;&lt;b&gt;&lt;code class=&quot;javascript keyword&quot;&gt;function&lt;/code&gt;&lt;/b&gt;&lt;code class=&quot;javascript plain&quot;&gt;(){&lt;/code&gt;&lt;/div&gt;
&lt;div class=&quot;line number3 index2 alt2&quot;&gt;&lt;code class=&quot;javascript spaces&quot;&gt;        &lt;/code&gt;&lt;code class=&quot;javascript keyword&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if&lt;/code&gt;&lt;code class=&quot;javascript plain&quot;&gt;(o === &lt;/code&gt;&lt;code class=&quot;javascript keyword&quot;&gt;this&lt;/code&gt;&lt;code class=&quot;javascript plain&quot;&gt;){&lt;/code&gt;&lt;/div&gt;
&lt;div class=&quot;line number4 index3 alt1&quot;&gt;&lt;code class=&quot;javascript spaces&quot;&gt;            &lt;/code&gt;&lt;code class=&quot;javascript plain&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; document.write(&lt;/code&gt;&lt;code class=&quot;javascript string&quot;&gt;&quot;o === this&quot;&lt;/code&gt;&lt;code class=&quot;javascript plain&quot;&gt;);&lt;/code&gt;&lt;/div&gt;
&lt;div class=&quot;line number5 index4 alt2&quot;&gt;&lt;code class=&quot;javascript spaces&quot;&gt;        &lt;/code&gt;&lt;code class=&quot;javascript plain&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/code&gt;&lt;/div&gt;
&lt;div class=&quot;line number6 index5 alt1&quot;&gt;&lt;code class=&quot;javascript spaces&quot;&gt;    &lt;/code&gt;&lt;code class=&quot;javascript plain&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/code&gt;&lt;/div&gt;
&lt;div class=&quot;line number7 index6 alt2&quot;&gt;&lt;code class=&quot;javascript plain&quot;&gt;}&lt;/code&gt;&lt;/div&gt;
&lt;div class=&quot;line number8 index7 alt1&quot;&gt;&lt;code class=&quot;javascript plain&quot;&gt;o.func();   &lt;/code&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;생성자의 호출&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/TdkYLonYuDw&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;아래 코드는 함수를 호출했을 때와 new를 이용해서 생성자를 호출했을 때의 차이를 보여준다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1580321654174&quot; class=&quot;html xml&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var funcThis = null; 
         
        function Func(){
            funcThis = this;
        }
        var o1 = Func();
        if(funcThis === window){
            document.write('window &amp;lt;br /&amp;gt;');
        }
         
        var o2 = new Func();
        if(funcThis === o2){
            document.write('o2 &amp;lt;br /&amp;gt;');
        }&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;764&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cdmtg/btqBzjYIjmS/AHgq9An5oNZD5mTJvrdIn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cdmtg/btqBzjYIjmS/AHgq9An5oNZD5mTJvrdIn1/img.png&quot; data-alt=&quot;Fig 140&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cdmtg/btqBzjYIjmS/AHgq9An5oNZD5mTJvrdIn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCdmtg%2FbtqBzjYIjmS%2FAHgq9An5oNZD5mTJvrdIn1%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;511&quot; height=&quot;382&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 140&lt;/figcaption&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&gt;Func( )는 같은 함수이지만 o2 에 넣을 때처럼 생성자로 사용될 때에는 this의 값이 생성될 객체를 가리킨다. 하지만 Func( )를 o1에 넣듯이 함수로 호출하게 되면 이 함수 안에서 this의 값은 전역객체인 window를 가리킨다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;생성자는 빈 객체를 만든다. 그리고 이 객체내에서 this는 만들어진 객체를 가르킨다. 이것은 매우 중요한 사실이다. 생성자가 실행되기 전까지는 객체는 변수에도 할당될 수 없기 때문에 this가 아니면 객체에 대한 어떠한 작업을 할 수 없다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOMnxV/btqBBe3c3X5/MnIy3cQqmPKCGM91fZOIoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOMnxV/btqBBe3c3X5/MnIy3cQqmPKCGM91fZOIoK/img.png&quot; data-alt=&quot;Fig 141. o에는 Func( ) 생성자에 의해 만들어진 객체가 할당되는데 함수가 실행되는 시점에서는 아직 o가 생성되지 않았기 때문에 undefined가 나옴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOMnxV/btqBBe3c3X5/MnIy3cQqmPKCGM91fZOIoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOMnxV%2FbtqBBe3c3X5%2FMnIy3cQqmPKCGM91fZOIoK%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;418&quot; height=&quot;201&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 141. o에는 Func( ) 생성자에 의해 만들어진 객체가 할당되는데 함수가 실행되는 시점에서는 아직 o가 생성되지 않았기 때문에 undefined가 나옴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;apply, call/ 객체로서 함수&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/6I421TLN9vg&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;javascript가 얼마나 유연한 언어인가를 극명하게 보여주는 예제이다. apply와 call에 대해서는 앞에서도 한 번 언급하였는데 다시 한 번 자세히 알아본다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baRqux/btqBCTquC3L/Nd0FU6RkpGj8K57h6nuWK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baRqux/btqBCTquC3L/Nd0FU6RkpGj8K57h6nuWK1/img.png&quot; data-alt=&quot;Fig 142&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baRqux/btqBCTquC3L/Nd0FU6RkpGj8K57h6nuWK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaRqux%2FbtqBCTquC3L%2FNd0FU6RkpGj8K57h6nuWK1%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;489&quot; height=&quot;165&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 142&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 142와 같은 함수를 다음과 같이 Function( ) 생성자를 사용하여 sum2에 할당할 수 도 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gcmjb/btqBzQPukGV/Jmc6eU9NcMxc1HOQpKk86K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gcmjb/btqBzQPukGV/Jmc6eU9NcMxc1HOQpKk86K/img.png&quot; data-alt=&quot;Fig 143. new Function( ) 생성자를 사용하여 객체를 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gcmjb/btqBzQPukGV/Jmc6eU9NcMxc1HOQpKk86K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGcmjb%2FbtqBzQPukGV%2FJmc6eU9NcMxc1HOQpKk86K%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;641&quot; height=&quot;147&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 143. new Function( ) 생성자를 사용하여 객체를 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Function( )은 생성자 함수인데, 앞의 두 개의 인자는 일반적으로 함수를 정의할 때의 매개변수와 같으며 그리고 마지막에 등장하는 인자가 바로 그 함수의 본문에 해당되는 것이다. Fig 142에서 function sum(x,y)는 sum 이라고 하는 함수 객체를 만드는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 Fig 143에서와 같이 함수 객체를 생성하는 것은 대단히 불편하다.&amp;nbsp; 만약에 함수의 세번째 인자에 해당하는 함수의 본문내용이 길다면 저런 식으로 생성할 수는 없을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Fig 142에서처럼 함수를 정의하면 javascript는 함수 객체를 만들어주는 것이다. 이것을 함수 리터럴 Literal 이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 우리가 객체를 만들 때 var = o{&amp;nbsp; } 와 같은 식으로 만드는데 이것은 객체 리터럴이 new Object 라고 할 수도 있는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열 변수를 만들 때 var a = [1, 2, 3]; 과 같이 만드는데 이것은 배열 리터럴이다. new Array(1, 2, 3) 이라고 할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;new .... 과 같이 객체를 명시적으로 만들 수도 있지만 그것보다 훨씬 더 편리하게 값을 만들 수 있게 해주는 문법적인 체계를 리터럴이라고 부르는 것이다. 이렇게 객체를 생성하면 그 객체는 property를 가지게 된다. 함수가 가지고 있는 property 중에 ECMAScript에서 정의하고 있는 메소드 중 하나가 apply와 call이다.&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;400&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wPINL/btqBCnk3KLh/8JiAgRJhXspvTd5wzLkVn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wPINL/btqBCnk3KLh/8JiAgRJhXspvTd5wzLkVn0/img.png&quot; data-alt=&quot;Fig 144. 생성자로 생성한 sum2에는 익명의 함수가 들어있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wPINL/btqBCnk3KLh/8JiAgRJhXspvTd5wzLkVn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwPINL%2FbtqBCnk3KLh%2F8JiAgRJhXspvTd5wzLkVn0%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;196&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 144. 생성자로 생성한 sum2에는 익명의 함수가 들어있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&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;&lt;span&gt;apply 와 this&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/j0TPsYspzbI&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;763&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9u6b5/btqBAEOPGS3/iR4tQb1SlWEg7OT7THKGEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9u6b5/btqBAEOPGS3/iR4tQb1SlWEg7OT7THKGEK/img.png&quot; data-alt=&quot;Fig 145&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9u6b5/btqBAEOPGS3/iR4tQb1SlWEg7OT7THKGEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9u6b5%2FbtqBAEOPGS3%2FiR4tQb1SlWEg7OT7THKGEK%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;535&quot; height=&quot;661&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;763&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 145&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;186&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxXmbr/btqBBT5AUhF/Xfn5PVzSWVCZfbNmmwcx0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxXmbr/btqBBT5AUhF/Xfn5PVzSWVCZfbNmmwcx0k/img.png&quot; data-alt=&quot;Fig 146&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxXmbr/btqBBT5AUhF/Xfn5PVzSWVCZfbNmmwcx0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxXmbr%2FbtqBBT5AUhF%2FXfn5PVzSWVCZfbNmmwcx0k%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;146&quot; height=&quot;151&quot; data-origin-width=&quot;186&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 146&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;func.apply(o); 라고 하게 되면 함수 호출 컨텍스트를 대입하게 된 것이다. 이렇게 되면 함수 안에서 this 는 첫 번째 인자로 지정한 o가 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전통적인 객체지향에서 메소드라는 것은 객체에 강하게 소속되어 있다. 객체에 포함되어 있는 것이다. 그래서 그 메소드는 다른 곳에 가지 못한다. 객체에 고정되어 있는 것이다. 마치 객체가 주인이고 메소드는 그 주인에게 종속되어 있는 노예와 같은 상태라고 할 수 있다. 실제로 프로그램에서 많이 쓰는 표현이다. Master, Slave . 이것은 일반적인 객체지향의 개념인데 javascript는 유연하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 window, o, p, 라는 객체와 함수가 있는데, func( ); 라고 호출하면 func가 마치도 window의 메소드처럼 호출이 되었고, func.apply(o); 라고 호출하면 func는 o의 메소드처럼, func.apply(p); 라고 호출하면 func는 마치 p의 메소드처럼 되는 것이다. 함수도 심지어 객체이기 때문에 window, o, p와 대등한 것인데, 어떤 방식으로 호출하느냐 에 따라 여러 객체의 소속이 된다는 것이다. 주인-노예 관점에서 바라본다면 마치 옛날에는 slave였던 메소드가 현대사회의 개인이 된 것처럼 되어 버렸다. 어느 한 주인에게 종속되지 않는 개인이 된 것이다. 그런데 이 개인도 어떤 맥락에서 호출하느냐에 따라 누군가의 노예가 되는 것이다. 마치 돈을 주는 사람이 갑이 되고 돈을 받는 사람이 을이 되는 것처럼.&amp;nbsp; javascript에서 함수는 일반적인 객체지향 언어에서 메소드보다 훨씬 더 위상이 높으며 어떻게 호출하느냐에 따라 맥락적으로 어떤 존재에 종속되기도 하는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;this는 그것이 소속된 객체를 가리킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#objectOri&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;extends&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull; 상속 inheritance&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상속이란&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/xuKaajNIkuQ&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;객체는 연관된 로직들로 이루어진 작은 프로그램이라고 할 수 있다. 상속은 객체의 로직을 그대로 물려 받는 또 다른 객체를 만들 수 있는 기능을 의미한다. 단순히 물려받는 것이라면 의미가 없을 것이다. 기존의 로직을 수정하고 변경해서 파생된 새로운 객체를 만들 수 있게 해준다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;객체는 하나의 컨테이너이고 그 안에는 어떤 로직, 어떤 작업과 관련되어 있는 변수, 메소드가 모아져 있다. 그러한 객체의 특성으로 인해 이 객체를 그대로 물려받아 새로운 객체를 만들 수 있다. 이 새로운 객체는 부모가 되는, 즉 오리지널이라고 할 수 있는 객체가 가지고 있는 변수와 메소드에 접근할 수 있게 되는데, 결국 원본객체[부모객체]와 동일한 기능을 가지고 있다는 뜻이다. 그런데 오리지널과 상속받은 객체가 똑같은 기능성을 가지고 있다면 그냥 오리지널을 쓰면 되지 상속을 쓸 필요가 없을 것이다. 중요한 것은 상속받은 객체가 부모객체의 기능들을 추가&lt;/span&gt;&amp;bull;제거 하여 자신의 맥락에 맞게 부모객체의 로직을 재활용 할 수 있다는 것이다. 그것이 상속의 기본적인 동작 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오리지널 객체의 기능을 상속받는 객체가 동일하게 가질 수 있다는 것이 상속의 개념이다.&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;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpl154/btqBBfVL5Ty/pcmfskmOTKa6cdhz2sZZa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpl154/btqBBfVL5Ty/pcmfskmOTKa6cdhz2sZZa1/img.png&quot; data-alt=&quot;Fig 147. Fig 135-2와 같은 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpl154/btqBBfVL5Ty/pcmfskmOTKa6cdhz2sZZa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpl154%2FbtqBBfVL5Ty%2FpcmfskmOTKa6cdhz2sZZa1%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;469&quot; height=&quot;364&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 147. Fig 135-2와 같은 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드를 아래와 같이 변경시켜보자. 그러면 결과는 똑같다. 그런데 이것은 상속을 하기 위한 준비작업이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBZC0Y/btqBDbES9ki/CKYF0qnU0iRxDCOViuro61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBZC0Y/btqBDbES9ki/CKYF0qnU0iRxDCOViuro61/img.png&quot; data-alt=&quot;Fig 148. 상속을 위한 준비작업&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBZC0Y/btqBDbES9ki/CKYF0qnU0iRxDCOViuro61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBZC0Y%2FbtqBDbES9ki%2FCKYF0qnU0iRxDCOViuro61%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;510&quot; height=&quot;332&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 148. 상속을 위한 준비작업&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 우리는 어떤 객체를 생성할 때 그 객체가 기본적으로 가지고 있어야 할 속성 property 를 세팅하기 위한 방법으로 생성자를 사용한다는 것에 대해 보았는데 생성자말고도 다른 방법으로 할 수도 있다. Fig 148에서 1행에서 Person이라는 생성자를 만들고, 그 생성자 바깥쪽에서 [4행] Person이라는 객체의 prototype이라는 약속된 프로퍼티에 name이라는 프로퍼티를 준 것이다. Person이라는 생성자에는 prototype이라는 property가 있는데 그 안에는 어떤 객체가 들어가 있다. .name을 하여 값을 줄 수 있고, .introduce 에 함수를 할당하게 되면 [5행] 메소드를 정의하게 된다. 이렇게 상속을 위한 준비를 마쳤다.&lt;/p&gt;
&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;상속의 사용법&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/mM-4t2J0lYM&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 javascript에서 상속을 어떻게 구현하는가를 살펴보자. javascript에서 상속의 개념과 상속을 어떻게 사용하는가 하는데 초점을 맞춘다.&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;593&quot; data-origin-height=&quot;641&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfX4t6/btqBD1aJ6ge/rDrzCNJFVs7LuldfWjb4bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfX4t6/btqBD1aJ6ge/rDrzCNJFVs7LuldfWjb4bk/img.png&quot; data-alt=&quot;Fig 149&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfX4t6/btqBD1aJ6ge/rDrzCNJFVs7LuldfWjb4bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfX4t6%2FbtqBD1aJ6ge%2FrDrzCNJFVs7LuldfWjb4bk%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;538&quot; height=&quot;581&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;641&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 149&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Programmer이라는 생성자를 만들었다. 그리고 이 생성자의 prototype과 Person의 객체를 연결했더니 Programmer 객체도 메소드 introduce를 사용할 수 있게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Programmer가 Person의 기능을 상속하고 있는 것이다. 단순히 똑같은 기능을 갖게 되는 것이라면 상속의 의의는 사라질 것이다. 부모의 기능을 계승 발전할 수 있는 것이 상속의 가치다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15행에서 p1은 introduce메소드를 사용하고, 14행에서 p1은 new Programmer( ) 생성자에 의해 Programmer 라는 객체를 담게 되는데, 9행의 Programmer 객체가 정의되는 곳을 보면 introduce 라는 메소드가 존재하지 않는다. Programmer 객체인 p1이 introduce 메소드를 사용할 수 있는 이유는 12행에 의해 Programmer 가 Person 객체를 상속받기 때문에 가능한 것이다. Person 객체는 introduce 메소드를 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12행을 보면 알 수 있듯이 Programmer.prototype 속성에 new Person() 생성자를 넣어 Person 객체를 넣은 것이다. Programmer.prototype 에 new Person 하게 되면 Person의 prototype 과 똑같은 객체를 만들어 Programmer.prototype에 넣어준다. 그리하여 Programmer.prototype은 .name이라는 변수와 .introduce라는 메소드를 가지게 되는 것이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;기능의 추가&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/vEzvWIJDLCA&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;971&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdKWLg/btqBCnTmg9y/uCrlBUbj17sucUYGnMQshK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdKWLg/btqBCnTmg9y/uCrlBUbj17sucUYGnMQshK/img.png&quot; data-alt=&quot;Fig 150. 앞의 코드에 약간의 내용을 추가하여 수정함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdKWLg/btqBCnTmg9y/uCrlBUbj17sucUYGnMQshK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdKWLg%2FbtqBCnTmg9y%2FuCrlBUbj17sucUYGnMQshK%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;520&quot; height=&quot;803&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;971&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 150. 앞의 코드에 약간의 내용을 추가하여 수정함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에 따르면 Person 객체는 introduce라는 메소드를 가지고 있고 Programmer는 Person을 상속받아 introduce라는 메소드를 가지고 있는데다 추가로 coding이라는 메소드도 가지고 있다. 즉 introduce는 중복되는 부분이기 때문에 따로 가지고 있는 것이 아니라 상속으로 가져오고 자기만 가지고 있는 coding만 정의하여 따로 가지고 있게 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 기능을 이용하여 코드를 조금 더 추가해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;995&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GTtOM/btqBDWOjxpv/turwiebQDW10xnqYe9ImOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GTtOM/btqBDWOjxpv/turwiebQDW10xnqYe9ImOk/img.png&quot; data-alt=&quot;Fig 151.&amp;amp;nbsp; Person을 상속받는 Designer 라는 객체를 새로 만들고 designing이라는 메소드 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GTtOM/btqBDWOjxpv/turwiebQDW10xnqYe9ImOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGTtOM%2FbtqBDWOjxpv%2FturwiebQDW10xnqYe9ImOk%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;771&quot; height=&quot;842&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;995&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 151.&amp;nbsp; Person을 상속받는 Designer 라는 객체를 새로 만들고 designing이라는 메소드 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Person이라는 부모객체가 있고 Programmer와 Designer는 Person을 상속받는 자식객체로서 introduce라는 메소드를 공통으로 가지고 있으며 만일 6행의 내용을 변경하여 My name 을 My nickname으로 변경하면 일일히 메소드마다 변경해야 하는 뻘짓은 생기지 않을 것이며 한 번에 모든 객체에게 반영이 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 핵심적인 내용은 바로 prototype 이라는 것이다. 앞에서도 잠깐 언급했지만 javascript를 prototype-based language라고 부르는 이유가 여기에 있다. prototype은 javascript에서 아주 중요하고 객체, 함수 이런 관계에서 상당한 비중을 차지하기 때문에 뒤에서 좀 더 자세히 다룰 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#objectOri&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;proto&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;prototype&lt;/h2&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/yXnbvyl04V4&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prototype은 상속의 구체적인 수단이라고 말할 수 있다. prototype은 javascript의 객체지향을 지탱하고 있는 핵심적인 기능이고 javascript를 일반적인 객체지향언어와 구분하는 아주 중요한 개념이다. prototype을 통해서 javascript는 상속의 개념을 제공하고 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;prototype&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 prototype이란 무엇인가? 한국어로는 원형정도로 번역되는 prototype은 말 그대로 객체의 원형이라고 할 수 있다. 함수는 객체다. 그러므로 생성자로 사용될 함수도 객체다. 객체는 프로퍼티를 가질 수 있는데 prototype이라는 프로퍼티는 그 용도가 약속되어 있는 특수한 프로퍼티다. prototype에 저장된 속성들은 생성자를 통해서 객체가 만들어질 때 그 객체에 연결된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eOwufq/btqBDXTZvJO/hURldCCKf7LtKgcVuPC471/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eOwufq/btqBDXTZvJO/hURldCCKf7LtKgcVuPC471/img.png&quot; data-alt=&quot;Fig 152&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eOwufq/btqBDXTZvJO/hURldCCKf7LtKgcVuPC471/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeOwufq%2FbtqBDXTZvJO%2FhURldCCKf7LtKgcVuPC471%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;426&quot; height=&quot;430&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 152&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드에 의하면 맨 상위에 Ultra라고 하는 객체가 있고, 하위에 Super 가 Ultra를 상속받고, Sub가 Super 밑에서 Super를 상속받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;o.ultraProp 라고 하면 먼저 o가 sub객체로 생성되었기 때문에 sub에 ultraProp라는 property가 있는지 확인하고, 없으면 그것의 부모인 Super에서 확인하고, 거기도 없으면 Super의 부모인 Ultra에서 ultraProp 라는 property가 있는지 확인하는 식으로 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 이러한 것을 가능하게 하는 prototype이라고 하는 것이 도대체 무엇인지를 살펴보자. 생성자는 기본적으로 함수이다. 10행처럼 함수를 호출할 때 new를 앞에 붙여서 호출하면 이때 함수는 단순한 함수가 아니라 생성자라는 함수가 되는 것이고 그것의 실행결과는 새로운 객체를 만들어 그 객체를 리턴하기 때문에 o라고 하는 변수 안에는 생성자를 통해 만들어진 객체가 들어가게 된다. 이것이 생성자의 역할이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 비어있는 객체를 생성하는 것이 생성자의 역할이라고 한다면 별로 가치가 없을 터인데 [ var o = { } 라고 해도 되니까 말이다], new 를 통해 o라는 변수는 단순한 객체가 아닌, 정의된 변수, 메소드 [즉 특정 로직과 데이터]등을 가지고 있는 객체를 담게 되는 것이다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그러면 우리가 얻고자 하는 어떤 객체의 원형 [즉 변수들과 메소드들을 가진 원형이 되는 객체] 은 어딘 가에 저장이 되어있는데 그곳이 바로 prototype 이라고 하는 property 이다. 즉 Sub 라는 함수는 객체이기 때문에 property를 가질 수 있고, 그중 prototype이라는 특수한 property 가 있는데 그 안에는 어떤 객체가 정의되어 있다. 그래서 나중에 new를 써서 호출하면 바로 이 prototype에 정의되어 있는 객체를 리턴하여 꺼내주게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buZOYb/btqBDaMYiHl/Kzf14SWA3mk2sEkrmQLfTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buZOYb/btqBDaMYiHl/Kzf14SWA3mk2sEkrmQLfTk/img.png&quot; data-alt=&quot;Fig 153&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buZOYb/btqBDaMYiHl/Kzf14SWA3mk2sEkrmQLfTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuZOYb%2FbtqBDaMYiHl%2FKzf14SWA3mk2sEkrmQLfTk%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;418&quot; height=&quot;441&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 153&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 152의 10행에서 o에는 Sub 생성자에 의해 Sub 객체가 들어가고, Sub.prototype에는 Super 생성자에 의해 Super 객체가 들어가고 Super.prototype에는 Ultra 생성자에 의해 Ultra 객체가 들어가며 Ultra.prototype.ultraProp에 true값이 정의 되어 있다. 이렇게 prototype에 의해 연결되어 있는 것을 prototype chain 이라고 한다.&amp;nbsp; &amp;nbsp; Sub.prototype 이 Super라는 객체를 가리키고, new Super() 라는 객체는 Super.prototype을 가리키고, 또 new Ultra() 는 Ultra.prototype을 가리키고...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자 Sub를 통해서 만들어진 객체 o가 Ultra의 프로퍼티 ultraProp에 접근 가능한 것은 prototype 체인으로 Sub와 Ultra가 연결되어 있기 때문이다. 내부적으로는 아래와 같은 일이 일어난다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;객체 o에서 ultraProp를 찾는다.&lt;/li&gt;
&lt;li&gt;없다면 Sub.prototype.ultraProp를 찾는다.&lt;/li&gt;
&lt;li&gt;없다면 Super.prototype.ultraProp를 찾는다.&lt;/li&gt;
&lt;li&gt;없다면 Ultra.prototype.ultraProp를 찾는다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prototype는 객체와 객체를 연결하는 체인의 역할을 하는 것이다. 이러한 관계를 prototype chain이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Super.prototype = Ultra.prototype 으로하면 안된다. 이렇게하면 Super.prototype의 값을 변경하면 그것이 Ultra.prototype도 변경하기 때문이다. Super.prototype = new Ultra();는 Ultra.prototype의 원형으로 하는 객체가 생성되기 때문에 new Ultra()를 통해서 만들어진 객체에 변화가 생겨도 Ultra.prototype의 객체에는 영향을 주지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qHOEo/btqBCnTxVR8/I3vOIWrnWJdlGfcxEVxk3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qHOEo/btqBCnTxVR8/I3vOIWrnWJdlGfcxEVxk3k/img.png&quot; data-alt=&quot;Fig 154&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qHOEo/btqBCnTxVR8/I3vOIWrnWJdlGfcxEVxk3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqHOEo%2FbtqBCnTxVR8%2FI3vOIWrnWJdlGfcxEVxk3k%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;430&quot; height=&quot;576&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;759&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 154&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참 재미있는 일이다. o2.ultraProp의 값이 정해지지 않으면 부모객체의 ultraProp값을 가져오지만 값을 지정해주면 값을 따로따로 가진다는 것을 알 수 있다. 즉 자식객체에서 속성의 값이 정해지지 않으면 부모 또는 부모의 부모쪽에서 속성값을 가져오지만 따로따로 값을 가지고 있을 수도 있다는 얘기다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 Super.prototype = Ultra.prototype 으로 하면 얘기는 달라진다. 이렇게하면 Super.prototype의 값을 변경하면 그것이 Ultra.prototype도 변경하기 때문이다. Super.prototype = new Ultra();는 Ultra.prototype의 원형으로 하는 객체가 생성되기 때문에 new Ultra()를 통해서 만들어진 객체에 변화가 생겨도 Ultra.prototype의 객체에는 영향을 주지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#objectOri&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;standardBuilt&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;표준&amp;nbsp;내장&amp;nbsp;객체의&amp;nbsp;확장&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;표준 내장 객체란&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/H_mei0W4gAw&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표준 내장 객체(Standard Built-in Object)는 자바스크립트가 기본적으로 가지고 있는 객체들을 의미한다. 내장 객체가 중요한 이유는 프로그래밍을 하는데 기본적으로 필요한 도구들이기 때문에다. 결국 프로그래밍이라는 것은 언어와 호스트 환경에 제공하는 기능들을 통해서 새로운 소프트웨어를 만들어내는 것이기 때문에 내장 객체에 대한 이해는 프로그래밍의 기본이라고 할 수 있다.&lt;/p&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;Object&lt;/li&gt;
&lt;li&gt;Function&lt;/li&gt;
&lt;li&gt;Array&lt;/li&gt;
&lt;li&gt;String&lt;/li&gt;
&lt;li&gt;Boolean&lt;/li&gt;
&lt;li&gt;Number&lt;/li&gt;
&lt;li&gt;Math&lt;/li&gt;
&lt;li&gt;Date&lt;/li&gt;
&lt;li&gt;RegExp&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 우리는 내장객체라는 하늘에서 뚝떨어진 이것들이 무엇인지를 보다 잘 이해할 수 있게 되었다. new가 무엇인지, 함수가 객체를 어떻게 만드는지도 알았다. 또 원한다면 자바스크립트의 내장 객체와 같은 것을 우리도 만들 수 있다는 것 [사용자 정의 객체] 도 알았다. 이러한 지식을 바탕으로 좀 더 멋진 일을 해보자.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배열을 확장&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/QIXwLsUAKjY&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;배열을 확장해보자. 아래 코드는 배열에서 특정한 값을 랜덤하게 추출하는 코드다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAjmqI/btqBDaM1o3m/R07t1S2Yz0NJEGbpN6ueHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAjmqI/btqBDaM1o3m/R07t1S2Yz0NJEGbpN6ueHk/img.png&quot; data-alt=&quot;Fig 155. floor는 소수점을 떼어버리고 가장 낮은 정수를 돌려줌&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAjmqI/btqBDaM1o3m/R07t1S2Yz0NJEGbpN6ueHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAjmqI%2FbtqBDaM1o3m%2FR07t1S2Yz0NJEGbpN6ueHk%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;1025&quot; height=&quot;231&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 155. floor는 소수점을 떼어버리고 가장 낮은 정수를 돌려줌&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이렇게 작성해도 된다! 잘못한 것이 아니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;하지만 조금 더 세련된 방법은 이 함수를 배열 객체에 포함시키는 것이다. 그렇게하면 마치 배열에 내장된 메소드인 것처럼 위의 기능을 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/8oaq_l22Wsc&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열이 가지고 있는 어떤 특정한 값을 랜덤하게 획득할 수 있는 기능을 모든 배열의 객체가 가질 수 있도록 코드를 변경해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cv5t3Z/btqBD2AY5LV/17QoXWUsIplve6aP9zEf5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cv5t3Z/btqBD2AY5LV/17QoXWUsIplve6aP9zEf5K/img.png&quot; data-alt=&quot;Fig 156. prototype 으로 정의함으로써 arr처럼 Array를 상속받으면 거기에 정의된 함수를 적용할 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cv5t3Z/btqBD2AY5LV/17QoXWUsIplve6aP9zEf5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcv5t3Z%2FbtqBD2AY5LV%2F17QoXWUsIplve6aP9zEf5K%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;1013&quot; height=&quot;228&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 156. prototype 으로 정의함으로써 arr처럼 Array를 상속받으면 거기에 정의된 함수를 적용할 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#objectOri&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;objObj&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;Object&lt;/h2&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/5hvmR6bEa-o&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Object 객체는 객체의 가장 기본적인 형태를 가지고 있는 객체이다. 다시 말해서 아무것도 상속받지 않는 순수한 객체다. 자바스크립트에서는 값을 저장하는 기본적인 단위로 Object를 사용한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pa1il/btqBADQDfFL/ZREJIXJyIpdNVhtVJl1up0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pa1il/btqBADQDfFL/ZREJIXJyIpdNVhtVJl1up0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pa1il/btqBADQDfFL/ZREJIXJyIpdNVhtVJl1up0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPa1il%2FbtqBADQDfFL%2FZREJIXJyIpdNVhtVJl1up0%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;622&quot; height=&quot;47&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;47&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;동시에 자바스크립트의 모든 객체는 Object 객체를 상속 받는데, 그런 이유로 모든 객체는 Object 객체의 프로퍼티를 가지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object 객체는 모든 객체의 부모객체이기 때문에 Object.prototype은 모든 객체들의 prototype 원형이 된다. 즉 Object 객체의 prototype은 모든 객체가 사용할 수 있는 기능이다. 즉 모든 객체가 공통적으로 가지고 있어야 할 기능이 있다면 Object의 prototype으로 지정했을 것이다. 모든 객체가 가지고 있었으면 하는 기능이 있다면 Object의 prototype에 여러 가지 기능을 추가하는 것을 통해 모든 객체가 사용할 수 있는 기능을 추가할 수 있다는 거다.&amp;nbsp;&lt;/p&gt;
&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;Object API 사용법&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/5OFbsj-UuIc&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object의 매뉴얼을 어떻게 읽는지 살펴보고 Object 가 가지고 있는 2 가지 형태의 메소드를 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mozilla Developer 홈페이지:&lt;a href=&quot;https://developer.mozilla.org/en-US/&quot;&gt;https://developer.mozilla.org/en-US/&lt;/a&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;1295&quot; data-origin-height=&quot;1321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvt9yD/btqBCUwTPfX/PcXP9ItYxIoMnLLwq8Klnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvt9yD/btqBCUwTPfX/PcXP9ItYxIoMnLLwq8Klnk/img.png&quot; data-alt=&quot;Fig 157&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvt9yD/btqBCUwTPfX/PcXP9ItYxIoMnLLwq8Klnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbvt9yD%2FbtqBCUwTPfX%2FPcXP9ItYxIoMnLLwq8Klnk%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;1295&quot; height=&quot;1321&quot; data-origin-width=&quot;1295&quot; data-origin-height=&quot;1321&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 157&lt;/figcaption&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;이 홈페이지에서 Javascript Reference에서 Object 뿐만 아니라 다른 객체들의 사용법에 대한 내용도 확인할 수 있다.&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;694&quot; data-origin-height=&quot;1190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bERayI/btqBBT6ni5W/HcC5OkPLRkCiiAKMgbFS4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bERayI/btqBBT6ni5W/HcC5OkPLRkCiiAKMgbFS4k/img.png&quot; data-alt=&quot;Fig 158. 메소드 아래부분 .prototype. 이 끼어있는 메소드들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bERayI/btqBBT6ni5W/HcC5OkPLRkCiiAKMgbFS4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbERayI%2FbtqBBT6ni5W%2FHcC5OkPLRkCiiAKMgbFS4k%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;694&quot; height=&quot;1190&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;1190&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 158. 메소드 아래부분 .prototype. 이 끼어있는 메소드들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위쪽에 있는 그룹은 prototype 없이 바로 점을 통해 이어진다. 그러면 prototype 이 있는 그룹과 없는 그룹의 차이점은 무엇일까? 보면 Object.key 메소드가 있는데 값을 수정하면서 직접 실행해보는 것도 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;1286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d23MH9/btqBD1a0Uif/lQ6F6DxDMl6Sl5esLyLW6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d23MH9/btqBD1a0Uif/lQ6F6DxDMl6Sl5esLyLW6k/img.png&quot; data-alt=&quot;Fig 159. Object.keys( )&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d23MH9/btqBD1a0Uif/lQ6F6DxDMl6Sl5esLyLW6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd23MH9%2FbtqBD1a0Uif%2FlQ6F6DxDMl6Sl5esLyLW6k%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;907&quot; height=&quot;1286&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;1286&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 159. Object.keys( )&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object.prototype.toString 도 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;1259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxPVpX/btqBAWCo02K/8C0WrSqRrUN2cd5FxUMQ9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxPVpX/btqBAWCo02K/8C0WrSqRrUN2cd5FxUMQ9K/img.png&quot; data-alt=&quot;Fig 160. Object.prototype.toString( )&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxPVpX/btqBAWCo02K/8C0WrSqRrUN2cd5FxUMQ9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxPVpX%2FbtqBAWCo02K%2F8C0WrSqRrUN2cd5FxUMQ9K%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;1066&quot; height=&quot;1259&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;1259&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 160. Object.prototype.toString( )&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 두 가지 메소드 즉 Object.prototype.toString()과 Object.keys() 를 사용하는 방법을 통해 prototype이 있는 것과 없는 것의 차이를 비교해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;891&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zmDlg/btqBD2Vk0yC/baB0T7NY2wXCP86ANXWtU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zmDlg/btqBD2Vk0yC/baB0T7NY2wXCP86ANXWtU0/img.png&quot; data-alt=&quot;Fig 161&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zmDlg/btqBD2Vk0yC/baB0T7NY2wXCP86ANXWtU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzmDlg%2FbtqBD2Vk0yC%2FbaB0T7NY2wXCP86ANXWtU0%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;1114&quot; height=&quot;891&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;891&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 161&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IuWUJ/btqBBfaPCEb/2bKjHJVKECQFkKLJ9kHKXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IuWUJ/btqBBfaPCEb/2bKjHJVKECQFkKLJ9kHKXk/img.png&quot; data-alt=&quot;Fig 162. 위 코드의 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IuWUJ/btqBBfaPCEb/2bKjHJVKECQFkKLJ9kHKXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIuWUJ%2FbtqBBfaPCEb%2F2bKjHJVKECQFkKLJ9kHKXk%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;460&quot; height=&quot;195&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 162. 위 코드의 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 보면 prototype이 있는 것과 없는 것은 호출방법이 다르다. prototype이 있는 것은 16, 19행과 같이 먼저 객체를 만들고&amp;nbsp; a.toString() 과 같이 메소드가 마치 자신의 메소드인 것처럼 호출하지만, prototype이 없는 것은 Object.keys(arr) 와 같이 인자로서 전달하는 방식으로 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마도 Object.key는 내부에서 이런 식으로 정의되었을 것이다. Object.keys = function() { ... }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Object.prototype.toString은 내부에서 이렇게 정의되었을 것이다. Object.prototype.toString = function(){&amp;nbsp; ...&amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 메소드가 prototype의 소속이라는 것은 new Object(); 라고 생성자함수를 실행시키는 순간, 객체를 만드는데 그 생성자의 prototype이라고 하는 특수한 property에 저장되어 있는 객체를 원형으로 하는 객체가 생성되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 그렇게 생성된 객체는 당연히 toString이라는 메소드를 사용할 수 있게 되기 때문에 사용할 때에는 그 객체가 가지고 있는 메소드처럼 사용하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object는 모든 객체의 공통적인 부모이기 때문에 19행에서처럼 Array 라는 객체를 생성할 때에도 Array는 내부적으로 부모인 Object를 상속받는다. 따라서 Array를 통해서 만들어진 객체는 a.toString()과 같이 Object에 정의 되어 있는 prototype.toString 메소드를 사용할 수 있게 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object는 javascript의 모든 객체들에게 상속되는 공통적인 부모객체이기 때문에 Object.prototype. 으로 정의된 함수들은 javascript의 모든 객체들이 공통적으로 갖게 되는 메소드들이다. 바꿔말하면 자신이 프로그램을 만들 때 만일에 프로그램 안의 모든 객체들이 공통으로 가져야 할 메소드가 필요하다면 Object 객체의 prototype을 정의하고 수정하는 것을 통해 그러한 기능을 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 MDN [Mozilla Developer Network] 의 Javascript Reference 에서 Object 등의 항목을 참조하면 Specifications 가 있는데 그것은 ECMAScript 의 어떤 버전에서 정의되었는가를 보여준다. 현재 [2014] 모든 브라우저에서 쓸 수 있는 기능은 ECMAScript 3버전에서 정의된 기능이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ccvgv/btqBEARO9Md/wD6itZEzAMTcwTqjSKBLq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ccvgv/btqBEARO9Md/wD6itZEzAMTcwTqjSKBLq0/img.png&quot; data-alt=&quot;Fig 163&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ccvgv/btqBEARO9Md/wD6itZEzAMTcwTqjSKBLq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCcvgv%2FbtqBEARO9Md%2FwD6itZEzAMTcwTqjSKBLq0%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;685&quot; height=&quot;193&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 163&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&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;Object 확장&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PdPb8pmnwWU&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object 객체를 확장하여 우리가 만들고 있는 애플리케이션에서 어느 객체에서나 사용할 수 있는 메소드를 만드는 방법을 살펴본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구체적인 구현을 하기 전에 무엇을 구현할 것인가, 구현한 것을 어떻게 사용하게 될 것인가를 먼저 살펴보자. 특정 객체가 아닌 배열을 포함하여 javascript의 모든 객체에서 아래 코드와 같은 기능을 사용하도록 하기 위해 Object.prototype으로 메소드를 정의한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv6VYV/btqBEBiUqtc/9JskhnkXzxc3eBIp9gZSCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv6VYV/btqBEBiUqtc/9JskhnkXzxc3eBIp9gZSCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv6VYV/btqBEBiUqtc/9JskhnkXzxc3eBIp9gZSCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv6VYV%2FbtqBEBiUqtc%2F9JskhnkXzxc3eBIp9gZSCk%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;481&quot; height=&quot;508&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하여 Object를 확장하여 모든 객체가 사용할 수 있는 메소드를 애플리케이션에 추가하는 방법을 보았는데 사실 한가지 문제를 안고 있고 따라서 별로 권장되는 방법은 아니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Object 확장의 위험&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/WN1xywt7GdQ&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&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;593&quot; data-origin-height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PzSZI/btqBCmtHWF2/9XgmlEwYDgamQWvHYZraeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PzSZI/btqBCmtHWF2/9XgmlEwYDgamQWvHYZraeK/img.png&quot; data-alt=&quot;Fig 164&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PzSZI/btqBCmtHWF2/9XgmlEwYDgamQWvHYZraeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPzSZI%2FbtqBCmtHWF2%2F9XgmlEwYDgamQWvHYZraeK%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;490&quot; height=&quot;499&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;605&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 164&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7N9rU/btqBBTZBTiy/dZbUS472svEyS5lU3kWpq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7N9rU/btqBBTZBTiy/dZbUS472svEyS5lU3kWpq0/img.png&quot; data-alt=&quot;Fig 165&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7N9rU/btqBBTZBTiy/dZbUS472svEyS5lU3kWpq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7N9rU%2FbtqBBTZBTiy%2FdZbUS472svEyS5lU3kWpq0%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;434&quot; height=&quot;356&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 165&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fig 164 실행 후 바로 Fig 165를 실행하면 객체 o의 값들이 출력되는데 정의한 함수도 나오는 것을 볼 수 있다. Object에만 정의한 줄 알았던 contain이라는 메소드도 포함되어 있는 것, 즉 프로그램 안의 모든 객체에 영향을 주는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qDBKv/btqBCnlRQbV/GeBH7cbzs34TH2gr8BCARK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qDBKv/btqBCnlRQbV/GeBH7cbzs34TH2gr8BCARK/img.png&quot; data-alt=&quot;Fig 166&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qDBKv/btqBCnlRQbV/GeBH7cbzs34TH2gr8BCARK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqDBKv%2FbtqBCnlRQbV%2FGeBH7cbzs34TH2gr8BCARK%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;403&quot; height=&quot;349&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 166&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 배열인 a에 대해서도 마찬가지다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애초 o, a 를 사용하려고 했을 때에는 for문을 돌려 모든 원소들을 꺼낼 때 contain 이 나올 것은 전혀 원치 않았던 부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 모든 객체에 영향을 주는 이런 행위는 편리한 것 같으면서도 그만큼 위험이 따른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴 때 사용할 수 있는 방법이 하나 있긴 하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfc0uN/btqBCnTE2bb/69lyzD6ACSnJbJwCHhiYmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfc0uN/btqBCnTE2bb/69lyzD6ACSnJbJwCHhiYmK/img.png&quot; data-alt=&quot;Fig 167&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfc0uN/btqBCnTE2bb/69lyzD6ACSnJbJwCHhiYmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcfc0uN%2FbtqBCnTE2bb%2F69lyzD6ACSnJbJwCHhiYmK%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;460&quot; height=&quot;439&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 167&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 hasOwnProperty() 메소드를 사용하는 것이다. &lt;span style=&quot;color: #666666;&quot;&gt;프로퍼티의 해당 객체의 소속인지를 체크해볼 수 있는 hasOwnProperty를 사용하면 된다. &lt;span style=&quot;color: #666666;&quot;&gt;hasOwnProperty는 인자로 전달된 속성의 이름이 객체의 속성인지 여부를 판단한다. 만약 prototype으로 상속 받은 객체라면 false가 된다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#objectOri&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;datatype&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;데이터&amp;nbsp;타입&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;원시 데이터 타입&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/YUL3Ol9vkhY&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 데이터 타입에 대해서 조금 더 심도 있는 이야기를 할 수 있게 되었다. 데이터 타입이란 데이터의 형태를 의미한다. 데이터 타입은 크게 두가지로 구분할 수 있다. 객체와 객체가 아닌 것. 그럼 객체가 아닌 것 [원시 데이터 타입, 기본데이터타입]은 무엇일까?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;숫자&lt;/li&gt;
&lt;li&gt;문자열&lt;/li&gt;
&lt;li&gt;불리언(true/false)&lt;/li&gt;
&lt;li&gt;null&lt;/li&gt;
&lt;li&gt;undefined&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체가 아닌 데이터 타입을 원시 데이터 타입(&lt;b&gt;primitive type&lt;/b&gt;)이라고 한다. 그 외의 모든 데이터 타입들은 객체다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 데이터 타입은 참조 데이터 타입이다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;래퍼 객체 wrapper object&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/xW1GYSGrNNw&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 분류가 중요한 것은 아니고, javascript 개발자 입장에서 이러한 것들은 원시 데이터 타입과 객체가 서로 다르게 동작할 때에 효용이 있는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/40JYY/btqBBVwndRW/FtDb4kPiEWUfbDAcMixpBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/40JYY/btqBBVwndRW/FtDb4kPiEWUfbDAcMixpBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/40JYY/btqBBVwndRW/FtDb4kPiEWUfbDAcMixpBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F40JYY%2FbtqBBVwndRW%2FFtDb4kPiEWUfbDAcMixpBk%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;473&quot; height=&quot;133&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;133&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;앞에서 설명할 때에는 문자열이 원시 데이터타입이라고 해놓고서는 위의 코드를 보면 문자열은 분명히 프로퍼티와 메소드가 있다. str과 length사이에 있는 점은 Object access Operator 객체 접근 연산자이다. 즉 점을 썼을 때 점 앞에 있는 것은 객체라는 뜻이다. 그렇다면 객체다. 그런데 왜 문자열이 객체가 아니라고 할까? 그것은 내부적으로 문자열이 원시 데이터 타입이고 문자열과 관련된 어떤 작업을 하려고 할 때 자바스크립트는 임시로 문자열 객체를 만들고 사용이 끝나면 제거하기 때문이다. 이러한 처리는 내부적으로 일어난다. 그렇기 때문에 몰라도 된다. &lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;하지만 원시 데이터 타입과 객체는 좀 다른 동작 방법을 가지고 있기 때문에 이들을 분별할 필요가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;내부적으로 볼 때에는 1행과 2행 사이에 str = new String('coding'); 이라는 코드가 있다고 생각하면 이해하기 쉽다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열이 객체가 아니라는 것을 보여주는 코드가 아래에 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ya1C7/btqBCmHgcWB/kAkmLxxK3Pd4mVYF9AG2C1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ya1C7/btqBCmHgcWB/kAkmLxxK3Pd4mVYF9AG2C1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ya1C7/btqBCmHgcWB/kAkmLxxK3Pd4mVYF9AG2C1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYa1C7%2FbtqBCmHgcWB%2FkAkmLxxK3Pd4mVYF9AG2C1%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;502&quot; height=&quot;107&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;str.prop를 하는 순간에 자바스크립트 내부적으로 String 객체가 만들어진다. prop 프로퍼티는 이 객체에 저장되고 이 객체는 곧 제거 된다. 그렇기 때문에 prop라는 속성이 저장된 객체는 존재하지 않게된다. 이러한 특징은 일반적인 객체의 동작 방법과는 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 문자열과 관련해서 필요한 기능성을 객체지향적으로 제공해야 하는 필요 또한 있기 때문에 원시 데이터 형을 객체처럼 다룰 수 있도록 하기 위한 객체를 자바스크립트는 제공하고 있는데 그것이 래퍼객체(wrapper object)다. javascript는 이러한 작업을 자동으로 처리해준다. 어떤 언어들은 이러한 작업을 자동으로 처리하지 않기 때문에 개발자가 명시적으로 wrapper object를 만들어서 사용하기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;래퍼객체로는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://opentutorials.org/course/50/37&quot;&gt;String&lt;/a&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://opentutorials.org/course/50/40&quot;&gt;Number&lt;/a&gt;, Boolean이 있다. null과 undefined는 래퍼 객체가 존재하지 않는다. 따라서 null.prop 이런 식으로 쓰면 타입에러가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#objectOri&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;refrence&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;참조&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;복제&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/GkKRHGjlbnQ&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;참조와 함께 살펴볼 개념은 복제라는 개념이다. 이 복제와 참조의 차이를 통해 두 가지의 개념을 좀 더 분명하게 드러내도록 해보자. 전자화된 시스템의 가장 중요한 특징은 복제다. 현실의 사물과 다르게 전자화된 시스템 위의 데이터를 복제 하는데는 비용이 거의 들지 않는다. 바로 이러한 특징이 소프트웨어를 기존의 산업과 구분하는 가장 큰 특징일 것이다. 프로그래밍에서 복제가 무엇인가를 살펴보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drdL9G/btqBBgnhJtR/mRRBBC2Hrgb17wDdyXTY3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drdL9G/btqBBgnhJtR/mRRBBC2Hrgb17wDdyXTY3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drdL9G/btqBBgnhJtR/mRRBBC2Hrgb17wDdyXTY3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrdL9G%2FbtqBBgnhJtR%2FmRRBBC2Hrgb17wDdyXTY3k%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;295&quot; height=&quot;151&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;결과는 당연하다. 값을 변경한 것은 변수 b이기 때문에 변수 a에 담겨있는 값은 그대로이다. 변수 b의 값에 변수 a의 값이 복제된 것이다. &lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참조&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/dOTpbvvOV0M&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;그런데 자연의 산물이 아니라 거대한 약속의 집합인 소프트웨어의 세계에서 당연한 것은 없다. 이것이 당연하지 않은 이유는 다음 예제를 통해서 좀 더 분명하게 드러난다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;398&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOeLTn/btqBBVXqBOV/0yDQLwwP92M6l262h3PNJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOeLTn/btqBBVXqBOV/0yDQLwwP92M6l262h3PNJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOeLTn/btqBBVXqBOV/0yDQLwwP92M6l262h3PNJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOeLTn%2FbtqBBVXqBOV%2F0yDQLwwP92M6l262h3PNJ0%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;309&quot; height=&quot;229&quot; data-origin-width=&quot;398&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이 코드의 주인공은 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4XPJc/btqBCUcCuhP/3NX8j5vBd2qG3Q135tCpx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4XPJc/btqBCUcCuhP/3NX8j5vBd2qG3Q135tCpx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4XPJc/btqBCUcCuhP/3NX8j5vBd2qG3Q135tCpx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4XPJc%2FbtqBCUcCuhP%2F3NX8j5vBd2qG3Q135tCpx1%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;298&quot; height=&quot;68&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;놀라운 차이점이 있다. 변수 b에 담긴 객체의 id 값을 2로 변경했을 뿐인데 a.id의 값도 2가 된 것이다. 이것은 변수 b와 변수 a에 담긴 객체가 서로 같다는 것을 의미한다. 참조(reference)의 세계에 온 것을 환영한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 필자는 전자화된 세계에서 가장 중요한 특징으로 복제를 들었다. 그런데 복제만으로 전자화된 시스템을 설명하는 것은 조금 부족하다. 비유하자면 복제는 파일을 복사하는 것이고 참조는 심볼릭 링크(symbolic link) 혹은 바로가기(윈도우)를 만드는 것과 비슷하다. 원본 파일에 대해서 심볼릭 링크를 만들면 원본이 수정되면 심볼릭 링크에도 그 내용이 실시간으로 반영되는 것과 같은 효과다.&amp;nbsp;심볼릭 링크를 통해서 만든 파일은 원본 파일에 대한 주소 값이 담겨 있다. 누군가 심볼릭 링크에 접근하면 컴퓨터는 심볼릭 링크에 저장된 원본의 주소를 참조해서 원본의 위치를 알아내고 원본에 대한 작업을 하게 된다. 다시 말해서 원본을 복제한 것이 아니라 원본 파일을 참조(reference)하고 있는 것이다. 덕분에 저장 장치의 용량을 절약할 수 있고, 원본 파일을 사용하고 있는 모든 복제본이 동일한 내용을 유지할 수 있게 된다. 참조는 전자화된 세계의 극치라고 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래밍에서 광범위하게 사용하는 라이브러리라는 개념도 일종의 참조라고 할 수 있다. 공용 라이브러리를 사용하게 되면 하나의 라이브러리를 여러 애플리케이션에서 공유해서 사용하게 된다. 라이브러리의 내용이 변경되면 이를 참조하고 있는 애플리케이션에도 내용이 반영되게 된다. 또 우리가 변수를 사용하는 이유도 말하자면 참조를 위해서라고 할 수 있을 것이다. 본질을 파악하면 이해력도 높아지고 암기할 것도 줄어든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 두 개의 구문의 차이점을 생각해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;257&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6dNLL/btqBCTY8xtv/b9qz7m3i5kguKiudZErx6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6dNLL/btqBCTY8xtv/b9qz7m3i5kguKiudZErx6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6dNLL/btqBCTY8xtv/b9qz7m3i5kguKiudZErx6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6dNLL%2FbtqBCTY8xtv%2Fb9qz7m3i5kguKiudZErx6k%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;213&quot; height=&quot;91&quot; data-origin-width=&quot;257&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;무엇일까? 전자는 데이터형이 숫자이고 후자는 객체다. 숫자는 원시 데이터형(기본 데이터형,&amp;nbsp;Primitive Data Types)이다. 자바스크립트에서는 원시 데이터형을 제외한 모든 데이터 타입은 객체이다. 객체를 다른 말로는 참조 데이터 형(참조 자료형)이라고도 부른다. 기본 데이터형은 위와 같이 복제 되지만 참조 데이터형은 참조된다. 모든 객체는 참조 데이터형이다. 이를 그림으로 나타내면 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf295m/btqBBUddlMZ/3HIQjK1Eqk2Wbc0Q8jjVgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf295m/btqBBUddlMZ/3HIQjK1Eqk2Wbc0Q8jjVgK/img.png&quot; data-alt=&quot;Fig 168&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf295m/btqBBUddlMZ/3HIQjK1Eqk2Wbc0Q8jjVgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf295m%2FbtqBBUddlMZ%2F3HIQjK1Eqk2Wbc0Q8jjVgK%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;347&quot; height=&quot;555&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 168&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;정리하면 변수에 담겨있는 데이터가 원시형이면 그 안에는 실제 데이터가 들어있고, 객체면 변수 안에는 데이터에 대한 참조 방법이 들어있다고 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Yjak/btqBBewcDhO/MmlSsLN0QIOFdXhBUtkkjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Yjak/btqBBewcDhO/MmlSsLN0QIOFdXhBUtkkjK/img.png&quot; data-alt=&quot;Fig 169&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Yjak/btqBBewcDhO/MmlSsLN0QIOFdXhBUtkkjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Yjak%2FbtqBBewcDhO%2FMmlSsLN0QIOFdXhBUtkkjK%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;229&quot; height=&quot;296&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 169&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Fig 169의 코드를 설명하면 다음과 같다. 3번 째 행에서는 b에 {'id':2}라는 새로운 객체를 할당하면서 a, b가 참조하는 객체가 달라진다. 그리하여 a.id 의 값은 1이 출력되는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수&lt;/h3&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/oXIhaqIQWUo&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&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;다음은 원시 데이터 타입을 인자로 넘겼을 때의 동작 모습이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;321&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ltLti/btqBD2uiRvY/ZekLbV5E1fje2XT0PXFMdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ltLti/btqBD2uiRvY/ZekLbV5E1fje2XT0PXFMdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ltLti/btqBD2uiRvY/ZekLbV5E1fje2XT0PXFMdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FltLti%2FbtqBD2uiRvY%2FZekLbV5E1fje2XT0PXFMdK%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;312&quot; data-origin-width=&quot;321&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;&lt;span style=&quot;color: #666666;&quot;&gt;다음은 참조 데이터 타입을 인자로 넘겼을 때 동작하는 장면이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWY639/btqBBf2T5Qt/KQAveUTjl7dOpGca4BKVQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWY639/btqBBf2T5Qt/KQAveUTjl7dOpGca4BKVQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWY639/btqBBf2T5Qt/KQAveUTjl7dOpGca4BKVQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWY639%2FbtqBBf2T5Qt%2FKQAveUTjl7dOpGca4BKVQk%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;336&quot; height=&quot;326&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 func의 파라미터 b로 전달된 값은 객체 a이다 (b = a).&amp;nbsp; 그리고 3행에서는 b를 새로운 객체로 대체하고 있으며 그것은 b가 가리키는 객체를 변경하는 것이기 때문에 객체 a에 영향을 주지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 아래는 다르다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyH4Au/btqBD1a5Kfu/4PzAXEaW881q8khUPrieKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyH4Au/btqBD1a5Kfu/4PzAXEaW881q8khUPrieKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyH4Au/btqBD1a5Kfu/4PzAXEaW881q8khUPrieKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyH4Au%2FbtqBD1a5Kfu%2F4PzAXEaW881q8khUPrieKk%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;323&quot; height=&quot;207&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;파라미터 b는 객체 a의 레퍼런스다. 이 값의 속성을 바꾸면 그 속성이 소속된 객체를 대상으로 수정작업을 한 것이 되기 때문에 b의 변경은 a에도 영향을 미치게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://opentutorials.org/course/1189/6340&quot;&gt;코드와 오픈소스&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgJQlM/btqBBUEbTzs/PRkVK8ggCAQkCFY5XdeKrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgJQlM/btqBBUEbTzs/PRkVK8ggCAQkCFY5XdeKrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgJQlM/btqBBUEbTzs/PRkVK8ggCAQkCFY5XdeKrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgJQlM%2FbtqBBUEbTzs%2FPRkVK8ggCAQkCFY5XdeKrk%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;2560&quot; height=&quot;1600&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1600&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;1787&quot; data-origin-height=&quot;1267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6WEOD/btqBBeQqs7l/m1tMUKMYU2SQVGZuIUTab1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6WEOD/btqBBeQqs7l/m1tMUKMYU2SQVGZuIUTab1/img.png&quot; data-alt=&quot;Fig 169. twitter에서 만든 bootstrap. 아주 잘 나가는 오픈 소스의 프로젝트 페이지. Fork 기능. github에 로그인하여 Fork를 눌러 이 세계적인 프로젝트를 내것으로 만들 수 있다. 수정, 새로운 제품 제작, 판매도 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6WEOD/btqBBeQqs7l/m1tMUKMYU2SQVGZuIUTab1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6WEOD%2FbtqBBeQqs7l%2Fm1tMUKMYU2SQVGZuIUTab1%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;1787&quot; height=&quot;1267&quot; data-origin-width=&quot;1787&quot; data-origin-height=&quot;1267&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 169. twitter에서 만든 bootstrap. 아주 잘 나가는 오픈 소스의 프로젝트 페이지. Fork 기능. github에 로그인하여 Fork를 눌러 이 세계적인 프로젝트를 내것으로 만들 수 있다. 수정, 새로운 제품 제작, 판매도 가능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1077&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vqBYy/btqBAWo0wf6/9l1whk2DZmCXfSC528Tknk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vqBYy/btqBAWo0wf6/9l1whk2DZmCXfSC528Tknk/img.png&quot; data-alt=&quot;Fig 170. 레고 디지털 디자이너&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vqBYy/btqBAWo0wf6/9l1whk2DZmCXfSC528Tknk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvqBYy%2FbtqBAWo0wf6%2F9l1whk2DZmCXfSC528Tknk%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;1919&quot; height=&quot;1077&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1077&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fig 170. 레고 디지털 디자이너&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.lego.com/en-us/ldd&quot;&gt;https://www.lego.com/en-us/ldd&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;1082&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dw4t6L/btqBDaGmbYH/BO6FFSkr7wSKkVVzBWkXBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dw4t6L/btqBDaGmbYH/BO6FFSkr7wSKkVVzBWkXBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dw4t6L/btqBDaGmbYH/BO6FFSkr7wSKkVVzBWkXBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdw4t6L%2FbtqBDaGmbYH%2FBO6FFSkr7wSKkVVzBWkXBK%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;1474&quot; height=&quot;1082&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;1082&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 align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#objectOri&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;TOP&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;pattern&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;5.&amp;nbsp;패턴&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;패턴은 자주 사용하는 로직들의 구현방법과 그것에 대한 이름을 의미한다. 이를 통해서 문제를 해결하는 탁월한 방법들을 빠르게 익힐 수 있다. 또한, 문제를 해결하기 위한 방법을 논의할 때 패턴의 이름을 사용함으로써 의사소통을 효율적으로 할 수 있다. 본 토픽의 하위 토픽을 통해서 다양한 패턴들을 알아본다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;recursive&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;bull;&amp;nbsp;재귀함수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;재귀함수는 함수 자신을 호출하는 프로그래밍 기법이다. 재귀 함수에 대해서는 웹브라우저 자바스크립트 모듈에서 언급하고 있기 때문에 이 수업을 참고하자.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;a href=&quot;http://opentutorials.org/module/904/6700&quot;&gt;http://opentutorials.org/module/904/6700&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#pattern&quot;&gt;ChapterHead&lt;/a&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;TOP&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a name=&quot;end&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;6.&amp;nbsp;마무리&lt;/h1&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/TxuOW3GsviY&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;엄격하고 격조를 중시하는 자바와 대비되는 자유분방하고 개성이 확실한 자바스크립트.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;최소한으로 배워 최대한으로 써먹어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;자바스크립트 완벽 가이드 6판&lt;/b&gt;&lt;br /&gt;(Javascript: The Definitive Guide 6/E &lt;a href=&quot;https://k.kakaocdn.net/dn/cuDMzG/btqBEAyiBQX/kKPSSydpSfuUqb7Uf69j5k/Javascript-the-definitive-guide-6th-edition-1-549.pdf?knm=tfile.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Part 1.&lt;/a&gt;&amp;nbsp;&amp;nbsp; &lt;a href=&quot;https://k.kakaocdn.net/dn/PG5Ry/btqBCTyR5HU/36fIqCyuMzqfMPaPCsqTZ0/Javascript-the-definitive-guide-6th-edition-550-1098.pdf?knm=tfile.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Part 2.&lt;/a&gt; ) &lt;/span&gt;&lt;br /&gt;데이비드 플래너건 저 | 구경택, 박경욱, 변치훈, 이의훈 역&lt;br /&gt;&lt;span&gt;이 책은 자바스크립트의 거의 모든 것을 담고 있습니다. 두께 만큼이나 많은 내용을 담고 있기 때문에 자바스크립트 개발자라면 한권쯤은 소장하고 계시면 좋을 것 같습니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;자바스크립트 핵심가이드&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://k.kakaocdn.net/dn/b5RYnG/btqByGreCpZ/KKLriYipw0ixajjNWCFi91/JavaScriptTheGoodParts.pdf?knm=tfile.pdf
      &quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;(JavaScript: The Good Parts)&lt;/a&gt; &lt;br /&gt;더글라스 크락포드 저 | 김명식 역&lt;br /&gt;이 책은 자바스크립트 구루 중의 한명인 더글라스 크락포드님이 쓰신 책입니다. 자바스크립트에서 좋은 점과 나쁜 점을 구분해서 좋은 점만 사용하도록 유도하고 있는 책입니다. 대가의 책답게 간결하면서 힘이 넘치는 책입니다. 다만 초보자에게는 몹시 난해한 책일 수 있습니다. 하지만 보면 볼수록 씹는 맛이 나는 그런 책입니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;자바스크립트 닌자 비급&lt;/b&gt;&lt;br /&gt;(Secrets of the JavaScript Ninja)&lt;br /&gt;존레식, 베어 바이볼트 저 | 강대명, 김광훈, 이의호 역&amp;nbsp;&lt;br /&gt;이 책은 jQuery의 창시자인 존레식님이 쓰신 책입니다. 자바스크립트의 모든 내용을 다루는 책이 아닙니다. 쉬운 책도 아닙니다. 따라서 초심자에게는 권하고 싶은 책은 아닙니다만, 자바스크립트에 대해서 메너리즘을 느끼기 시작하는 중급자에게는 정체감을 뛰어넘게 하는 다양한 기법과 좋은 사례들이 소개되어 있습니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자바스크립트를 깨우치다&lt;/b&gt;&lt;br /&gt;(JavaScript Enlightenment)&lt;br /&gt;코디 린들리 저 | 김태곤 역&lt;br /&gt;저는 이 책을 소장하고 있지는 않습니다. 서점에서 이 책을 봤는데 자바스크립트의 고급 개념들을 비교적 쉬운 예제를 통해서 소개하고 있었습니다. 제 기억으로는 각각의 단계에 대해서 상세하게 설명하고 있기 때문에 애매함에 관대하지 않은 분들은 그 원리를 파악하는데 도움이 될 것 같습니다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;자바스크랩트 재진입하기&lt;br /&gt;파이어폭스를 만든 모질라 재단에서 제공하는 자바스크립트 학습자료입니다. 원 페이지에 거의 모든 것을 담았네요. 이미 프로그래밍을 해본 분에게 적당할 것 같습니다.&amp;nbsp;&lt;br /&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/A_re-introduction_to_JavaScript&quot;&gt;https://developer.mozilla.org/ko/docs/A_re-introduction_to_JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align=&quot;right&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#처음&quot;&gt;TOP&lt;/a&gt;&lt;/p&gt;</description>
      <category>MOBILE APP/Javascript</category>
      <category>constructor</category>
      <category>Prototype</category>
      <category>regexp</category>
      <category>상속</category>
      <category>생성자</category>
      <category>익명함수</category>
      <category>정규식</category>
      <category>콜백</category>
      <category>클로저</category>
      <category>함수</category>
      <author>SALTFUN</author>
      <guid isPermaLink="true">https://saltfun.tistory.com/12</guid>
      <comments>https://saltfun.tistory.com/12#entry12comment</comments>
      <pubDate>Sun, 26 Jan 2020 19:02:27 +0900</pubDate>
    </item>
  </channel>
</rss>