<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>코딩아트</title>
    <link>https://artsung410.tistory.com/</link>
    <description>프로그래밍, C++</description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 23:06:29 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>아트성</managingEditor>
    <image>
      <title>코딩아트</title>
      <url>https://tistory1.daumcdn.net/tistory/3215971/attach/2f9463c32822457a8bba2bd6ec557d49</url>
      <link>https://artsung410.tistory.com</link>
    </image>
    <item>
      <title>[Python] OpenCV 메서드 정리</title>
      <link>https://artsung410.tistory.com/103</link>
      <description>&lt;h1&gt;이미지&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cv2.imread (이미지 읽기)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.65116%;&quot;&gt;filename&lt;/td&gt;
&lt;td style=&quot;width: 7.20931%;&quot;&gt;string&lt;/td&gt;
&lt;td style=&quot;width: 83.0233%;&quot;&gt;읽고자 하는 이미지 파일의 이름을 나타냅니다. 이 때 이미지 파일의 절대 경로 또는 상대 경로를 사용할 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.65116%;&quot;&gt;flags&lt;/td&gt;
&lt;td style=&quot;width: 7.20931%;&quot;&gt;int&lt;/td&gt;
&lt;td style=&quot;width: 83.0233%;&quot;&gt;이미지 파일을 읽는 방식을 지정하는 플래그입니다. cv2.IMREAD_COLOR (기본값, 컬러 이미지로 읽음), cv2.IMREAD_GRAYSCALE (흑백 이미지로 읽음), cv2.IMREAD_UNCHANGED (알파 채널 포함하여 읽음) 등의 값을 지정할 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cv2.cvtColor (이미지 전환)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.76744%;&quot;&gt;src&lt;/td&gt;
&lt;td style=&quot;width: 12.093%;&quot;&gt;numpy array&lt;/td&gt;
&lt;td style=&quot;width: 78.2557%;&quot;&gt;컬러스페이스를 변환하고자 하는 원본 이미지를 나타냅니다. 이 파라미터는 보통 cv2.imread 함수 등으로 이미지 파일을 읽어들여 만든 numpy 배열을 사용합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.76744%;&quot;&gt;code&lt;/td&gt;
&lt;td style=&quot;width: 12.093%;&quot;&gt;int&lt;/td&gt;
&lt;td style=&quot;width: 78.2557%;&quot;&gt;컬러스페이스 변환 방식을 지정하는 플래그입니다. 이 플래그에 따라 원본 이미지의 컬러스페이스를 다른 컬러스페이스로 변환할 수 있습니다. 예를 들어, cv2.COLOR_BGR2GRAY는 BGR 컬러스페이스를 흑백으로, cv2.COLOR_BGR2HSV는 BGR 컬러스페이스를 HSV로 변환합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cv2.imshow (이미지 전환)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.4186%;&quot;&gt;winname&lt;/td&gt;
&lt;td style=&quot;width: 11.8605%;&quot;&gt;string&lt;/td&gt;
&lt;td style=&quot;width: 78.7209%;&quot;&gt;이미지를 표시할 윈도우의 이름을 나타냅니다. 같은 이름의 윈도우가 이미 존재하면 그 윈도우에 이미지를 표시하고, 존재하지 않으면 새로운 윈도우를 만들어 이미지를 표시합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.4186%;&quot;&gt;mat&lt;/td&gt;
&lt;td style=&quot;width: 11.8605%;&quot;&gt;numpy array&lt;/td&gt;
&lt;td style=&quot;width: 78.7209%;&quot;&gt;표시할 이미지를 나타냅니다. 이 파라미터는 보통 cv2.imread 함수 등으로 이미지 파일을 읽어들여 만든 numpy 배열을 사용합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cv2.mwrite&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.06978%;&quot;&gt;filename&lt;/td&gt;
&lt;td style=&quot;width: 12.7908%;&quot;&gt;string&lt;/td&gt;
&lt;td style=&quot;width: 78.0232%;&quot;&gt;이미지를 저장할 파일의 이름을 나타냅니다. 파일 이름에는 확장자까지 포함해야 합니다 (예: &quot;image.jpg&quot;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.06978%;&quot;&gt;img&lt;/td&gt;
&lt;td style=&quot;width: 12.7908%;&quot;&gt;numpy array&lt;/td&gt;
&lt;td style=&quot;width: 78.0232%;&quot;&gt;저장할 이미지를 나타냅니다. 이 파라미터는 보통 cv2.imread 함수 등으로 이미지 파일을 읽어들여 만든 numpy 배열을 사용합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cv2.waitKey (키보드 입력)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 50px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px; width: 7.55814%;&quot;&gt;delay&lt;/td&gt;
&lt;td style=&quot;height: 40px; width: 4.65115%;&quot;&gt;int&lt;/td&gt;
&lt;td style=&quot;height: 40px; width: 88.4884%;&quot;&gt;키보드 입력을 대기할 시간을 밀리초 단위로 나타냅니다. delay가 0이면 키보드 입력이 있을 때까지 무한히 대기하고, 그 외의 경우는 지정한 시간 동안 대기한 후에 반환합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cv2.destroyAllWindows (윈도우 종료)&lt;/b&gt;&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;도형&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cv2.line (직선 그리기)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;img&lt;/td&gt;
&lt;td&gt;numpy.ndarray&lt;/td&gt;
&lt;td&gt;이미지를 표현하는 2차원 또는 3차원 numpy 배열.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pt1&lt;/td&gt;
&lt;td&gt;tuple&lt;/td&gt;
&lt;td&gt;선의 시작점 좌표. (x, y) 형태의 튜플.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pt2&lt;/td&gt;
&lt;td&gt;tuple&lt;/td&gt;
&lt;td&gt;선의 종료점 좌표. (x, y) 형태의 튜플.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;color&lt;/td&gt;
&lt;td&gt;tuple&lt;/td&gt;
&lt;td&gt;선의 색상. RGB 모드일 경우 (R, G, B) 형태의 튜플, 회색조 모드일 경우 스칼라 값.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;thickness&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;선의 두께. 픽셀 단위의 양의 정수. 디폴트 값은 1.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lineType&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;선의 타입. 디폴트는 cv2.LINE_8. 다른 선택 가능한 값으로 cv2.LINE_4, cv2.LINE_AA 등이 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;shift&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;좌표에 대한 소수점 비트의 수. 디폴트 값은 0.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cv2.rectangle (사각형 그리기)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;img&lt;/td&gt;
&lt;td&gt;numpy.ndarray&lt;/td&gt;
&lt;td&gt;사각형을 그릴 대상 이미지. 이미지는 2차원 또는 3차원 numpy 배열로 표현됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pt1&lt;/td&gt;
&lt;td&gt;tuple&lt;/td&gt;
&lt;td&gt;사각형의 시작점 좌표. (x, y) 형태의 튜플.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pt2&lt;/td&gt;
&lt;td&gt;tuple&lt;/td&gt;
&lt;td&gt;사각형의 종료점 좌표. (x, y) 형태의 튜플. 시작점에서 대각선 방향으로 봤을 때 위치합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;color&lt;/td&gt;
&lt;td&gt;tuple&lt;/td&gt;
&lt;td&gt;사각형의 색상. RGB 모드일 경우 (R, G, B) 형태의 튜플, 회색조 모드일 경우 스칼라 값.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;thickness&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;선의 두께. 픽셀 단위의 양의 정수. 디폴트 값은 1. thickness가 -1이면 사각형 내부를 채웁니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lineType&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;선의 타입. 디폴트는 cv2.LINE_8. 다른 선택 가능한 값으로 cv2.LINE_4, cv2.LINE_AA 등이 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;shift&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;좌표에 대한 소수점 비트의 수. 디폴트 값은 0.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cv2.circle (원 그리기)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;img&lt;/td&gt;
&lt;td&gt;numpy.ndarray&lt;/td&gt;
&lt;td&gt;원을 그릴 대상 이미지. 이미지는 2차원 또는 3차원 numpy 배열로 표현됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;center&lt;/td&gt;
&lt;td&gt;tuple&lt;/td&gt;
&lt;td&gt;원의 중심 좌표. (x, y) 형태의 튜플.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;radius&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;원의 반지름. 픽셀 단위의 양의 정수.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;color&lt;/td&gt;
&lt;td&gt;tuple&lt;/td&gt;
&lt;td&gt;원의 색상. RGB 모드일 경우 (R, G, B) 형태의 튜플, 회색조 모드일 경우 스칼라 값.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;thickness&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;선의 두께. 픽셀 단위의 양의 정수. 디폴트 값은 1. thickness가 -1이면 원 내부를 채웁니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lineType&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;선의 타입. 디폴트는 cv2.LINE_8. 다른 선택 가능한 값으로 cv2.LINE_4, cv2.LINE_AA 등이 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;shift&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;좌표에 대한 소수점 비트의 수. 디폴트 값은 0.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cv2.putText (텍스트 그리기)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.9302%;&quot;&gt;img&lt;/td&gt;
&lt;td style=&quot;width: 14.9999%;&quot;&gt;numpy.ndarray&lt;/td&gt;
&lt;td style=&quot;width: 68.9536%;&quot;&gt;텍스트를 그릴 대상 이미지. 이미지는 2차원 또는 3차원 numpy 배열로 표현됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.9302%;&quot;&gt;text&lt;/td&gt;
&lt;td style=&quot;width: 14.9999%;&quot;&gt;str&lt;/td&gt;
&lt;td style=&quot;width: 68.9536%;&quot;&gt;이미지에 그릴 텍스트 문자열.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.9302%;&quot;&gt;org&lt;/td&gt;
&lt;td style=&quot;width: 14.9999%;&quot;&gt;tuple&lt;/td&gt;
&lt;td style=&quot;width: 68.9536%;&quot;&gt;텍스트가 시작될 좌표. 좌표는 (x, y) 형태의 튜플로, 왼쪽 하단을 기준으로 합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.9302%;&quot;&gt;fontFace&lt;/td&gt;
&lt;td style=&quot;width: 14.9999%;&quot;&gt;int&lt;/td&gt;
&lt;td style=&quot;width: 68.9536%;&quot;&gt;글꼴 타입. cv2.FONT_HERSHEY_SIMPLEX, cv2.FONT_HERSHEY_PLAIN 등이 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.9302%;&quot;&gt;fontScale&lt;/td&gt;
&lt;td style=&quot;width: 14.9999%;&quot;&gt;float&lt;/td&gt;
&lt;td style=&quot;width: 68.9536%;&quot;&gt;글꼴 크기. 텍스트의 크기를 결정합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.9302%;&quot;&gt;color&lt;/td&gt;
&lt;td style=&quot;width: 14.9999%;&quot;&gt;tuple&lt;/td&gt;
&lt;td style=&quot;width: 68.9536%;&quot;&gt;텍스트의 색상. RGB 모드일 경우 (R, G, B) 형태의 튜플, 회색조 모드일 경우 스칼라 값.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.9302%;&quot;&gt;thickness&lt;/td&gt;
&lt;td style=&quot;width: 14.9999%;&quot;&gt;int&lt;/td&gt;
&lt;td style=&quot;width: 68.9536%;&quot;&gt;선의 두께. 픽셀 단위의 양의 정수. 디폴트 값은 1입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.9302%;&quot;&gt;lineType&lt;/td&gt;
&lt;td style=&quot;width: 14.9999%;&quot;&gt;int&lt;/td&gt;
&lt;td style=&quot;width: 68.9536%;&quot;&gt;선의 타입. 디폴트는 cv2.LINE_8. 다른 선택 가능한 값으로 cv2.LINE_4, cv2.LINE_AA 등이 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.9302%;&quot;&gt;bottomLeftOrigin&lt;/td&gt;
&lt;td style=&quot;width: 14.9999%;&quot;&gt;bool&lt;/td&gt;
&lt;td style=&quot;width: 68.9536%;&quot;&gt;True일 경우, 이미지의 왼쪽 하단을 원점으로 삼습니다. False일 경우, 왼쪽 상단이 원점이 됩니다. 디폴트는 False입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FONT_HERSHEY_SIMPLEX 0&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&gt;FONT_HERSHEY_PLAIN&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FONT_HERSHEY_DUPLEX&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FONT_HERSHEY_COMPLEX&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FONT_HERSHEY_TRIPLEX&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FONT_HERSHEY_COMPLEX_SMALL&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FONT_HERSHEY_SCRIPT_SIMPLEX&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FONT_HERSHEY_SCRIPT_COMPLEX&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FONT_ITALIC&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 예제는 0번째 텍스트의, 두께를 2로 설정한것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Python</category>
      <category>OpenCV</category>
      <category>Python</category>
      <author>아트성</author>
      <guid isPermaLink="true">https://artsung410.tistory.com/103</guid>
      <comments>https://artsung410.tistory.com/103#entry103comment</comments>
      <pubDate>Sat, 24 Jun 2023 14:07:04 +0900</pubDate>
    </item>
    <item>
      <title>[자율주행] 자율주행의 현주소와 기술들</title>
      <link>https://artsung410.tistory.com/102</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자율주행&lt;/b&gt;은 운전자 없이 자동으로 운행하는 기술로, 이는 &lt;b&gt;교통사고 감소&lt;/b&gt;, 효율적인 &lt;b&gt;교통체계 구축&lt;/b&gt;, 이동의 &lt;b&gt;접근성 향상&lt;/b&gt;, &lt;b&gt;시간 절약&lt;/b&gt; 등의 이점을 현대 사회에 제공한다. 자율주행은 현재 2단계까지 도달했으며 3단계수준에 밀접하게 접근하고있는 회사들도 생겨나고 있는중이다.&amp;nbsp;&amp;nbsp;이는 차량이 일부 또는 &lt;b&gt;특정 상황&lt;/b&gt;에서의 운행을 담당할 수 있다는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pwnqS/btskK1j3IKH/RRnG0nYB1eAziojjKPEqMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pwnqS/btskK1j3IKH/RRnG0nYB1eAziojjKPEqMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pwnqS/btskK1j3IKH/RRnG0nYB1eAziojjKPEqMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpwnqS%2FbtskK1j3IKH%2FRRnG0nYB1eAziojjKPEqMk%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;655&quot; height=&quot;407&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예를 들어&lt;/b&gt;, 일부 차량은 고속도로 운행 중에 차량 간 거리를 유지하거나 차선을 유지하는 등의 작업을 자동으로 수행할 수 있는 기능을 갖추고 있다.이는 차량이 자동으로 속도를 조절하거나 핸들을 조작하는 능력을 가지고 있다는 것을 의미한다. 그러나 이 기능들은 대부분 운전자가 주의를 기울이고 필요한 경우 개입할 수 있어야 하는 상황에 제한되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나&lt;b&gt; 4단계&lt;/b&gt;&amp;nbsp;또는&amp;nbsp;&lt;b&gt;5단계&lt;/b&gt;의&amp;nbsp;자율주행&amp;nbsp;기술은&amp;nbsp;아직&amp;nbsp;대중화되지&amp;nbsp;않았다. &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;단계에서의&amp;nbsp;자율주행&amp;nbsp;차량은&amp;nbsp;운전자&amp;nbsp;개입&amp;nbsp;없이도&amp;nbsp;안전하게&amp;nbsp;운행이&amp;nbsp;가능해야&amp;nbsp;하지만,&amp;nbsp;이러한&amp;nbsp;기능은&amp;nbsp;아직&amp;nbsp;연구&amp;nbsp;및&amp;nbsp;개발&amp;nbsp;단계에&amp;nbsp;있거나&amp;nbsp;제한된&amp;nbsp;환경에서만&amp;nbsp;실험&amp;nbsp;중인&amp;nbsp;실정이다. 물론,&amp;nbsp;일부&amp;nbsp;회사들은&amp;nbsp;이미&amp;nbsp;고도의&amp;nbsp;자율주행&amp;nbsp;기술을&amp;nbsp;가진&amp;nbsp;차량을&amp;nbsp;테스트하고&amp;nbsp;있지만,&amp;nbsp;이러한&amp;nbsp;차량이&amp;nbsp;보편화되기까지는&amp;nbsp;아직&amp;nbsp;시간이&amp;nbsp;필요할&amp;nbsp;것으로&amp;nbsp;예상된다. &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;기술의&amp;nbsp;발전은&amp;nbsp;기술적인&amp;nbsp;진보&amp;nbsp;뿐만&amp;nbsp;아니라&amp;nbsp;&lt;b&gt;법률&lt;/b&gt;,&amp;nbsp;&lt;b&gt;보험&lt;/b&gt;, 사회적 여건 등 여러 복잡한 요인에 의해 결정되며, 이러한 이유로 인해 완전한 자율주행 기술의 보편화는 아직도 몇 년 또는 수십 년이 소요될 것으로 보인다는게 필자의 전망이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자율주행 기술에서 빠질수 없는게 알고리즘인데&lt;span style=&quot;color: #ef6f53;&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;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kWG9U/btskK1RUbj6/qCiUxG8BTlmozQBoQVgqD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kWG9U/btskK1RUbj6/qCiUxG8BTlmozQBoQVgqD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kWG9U/btskK1RUbj6/qCiUxG8BTlmozQBoQVgqD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkWG9U%2FbtskK1RUbj6%2FqCiUxG8BTlmozQBoQVgqD0%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;680&quot; height=&quot;588&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;588&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;table style=&quot;background-color: #f7f7f8; color: #374151; text-align: left; 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: 28.4884%;&quot;&gt;주행 경로 계획 (Path Planning)&lt;/td&gt;
&lt;td style=&quot;width: 71.3953%;&quot;&gt;주행 경로를 결정하기 위해 환경 정보와 목표를 고려하여 경로를 계획합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.4884%;&quot;&gt;장애물 감지 및 추적&lt;/td&gt;
&lt;td style=&quot;width: 71.3953%;&quot;&gt;센서를 사용하여 주변의 장애물을 감지하고, 이를 기반으로 주행 경로를 조정합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.4884%;&quot;&gt;차선 인식 (Lane Detection)&lt;/td&gt;
&lt;td style=&quot;width: 71.3953%;&quot;&gt;영상처리 기술을 사용하여 도로의 차선을 인식하고, 주행 경로를 유지합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.4884%;&quot;&gt;신호등 및 표지판 인식&lt;/td&gt;
&lt;td style=&quot;width: 71.3953%;&quot;&gt;컴퓨터 비전 기술을 사용하여 신호등과 도로 표지판을 인식하고, 적절히 대응합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.4884%;&quot;&gt;차량 간 통신&lt;/td&gt;
&lt;td style=&quot;width: 71.3953%;&quot;&gt;V2V (Vehicle-to-Vehicle) 및 V2I (Vehicle-to-Infrastructure) 통신을 통해 차량 간 정보를 공유합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.4884%;&quot;&gt;속도 및 거리 제어&lt;/td&gt;
&lt;td style=&quot;width: 71.3953%;&quot;&gt;주행 조건과 규칙을 고려하여 차량의 속도와 앞 차와의 거리를 제어합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.4884%;&quot;&gt;자세 제어&lt;/td&gt;
&lt;td style=&quot;width: 71.3953%;&quot;&gt;차량의 방향, 기울기, 가속도 등을 조절하여 안정적인 주행을 유지합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.4884%;&quot;&gt;실시간 위치 추정&lt;/td&gt;
&lt;td style=&quot;width: 71.3953%;&quot;&gt;GPS와 센서 데이터를 결합하여 차량의 정확한 위치를 추정합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.4884%;&quot;&gt;객체 추적&lt;/td&gt;
&lt;td style=&quot;width: 71.3953%;&quot;&gt;센서 및 비전 기술을 사용하여 다른 차량, 보행자 등 주변 객체를 식별하고 추적합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.4884%;&quot;&gt;긴급 상황 대응&lt;/td&gt;
&lt;td style=&quot;width: 71.3953%;&quot;&gt;예상치 못한 상황에 대비하여 적절한 대응을 취하고, 충돌을 피하기 위한 조치를 취합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;자율주행 센서&lt;/b&gt;&lt;/span&gt;도 알고리즘 못지않게 중요한 요소다. 자율주행 센서는 차량이 주변 환경을 인식하도록 돕는 기기로, 레이더, 리다, 카메라 등이 있다. 레이더는 물체와의 거리와 속도를 측정하며, 라이다는 레이저를 사용해 상세한 3D 맵(PointClouds)을 그린다. 카메라는(Visual Sensor) 차선, 표지판, 신호등 등의 시각적 정보를 인식한다. 이런 센서 정보를 분석하고 이해함으로써 자율주행 차량은 안전하게 운전하고, 장애물을 피하며, 적절한 속도와 방향으로 이동하는데 필요한 결정을 내리게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k4k4X/btskEp1exB1/tKwSIfEB7MpBGXgGDQNw9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k4k4X/btskEp1exB1/tKwSIfEB7MpBGXgGDQNw9k/img.png&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;641&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.2466%; margin-right: 10px;&quot; data-widthpercent=&quot;48.81&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k4k4X/btskEp1exB1/tKwSIfEB7MpBGXgGDQNw9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk4k4X%2FbtskEp1exB1%2FtKwSIfEB7MpBGXgGDQNw9k%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;666&quot; height=&quot;641&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2xncs/btskIbO6UaA/ndzwpX0JGfxwj1aIqatGSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2xncs/btskIbO6UaA/ndzwpX0JGfxwj1aIqatGSK/img.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;637&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;51.19&quot; style=&quot;width: 50.5906%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2xncs/btskIbO6UaA/ndzwpX0JGfxwj1aIqatGSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2xncs%2FbtskIbO6UaA%2FndzwpX0JGfxwj1aIqatGSK%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;637&quot;/&gt;&lt;/span&gt;&lt;/div&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;table style=&quot;background-color: #f7f7f8; color: #374151; text-align: left; 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&gt;카메라 (Camera)&lt;/td&gt;
&lt;td&gt;도로 상의 객체를 인식하고, 차선 인식, 신호등 및 표지판 인식에 사용됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;라이다 (Lidar)&lt;/td&gt;
&lt;td&gt;주변 환경의 거리와 형상을 측정하여 3D 지도를 작성하고 장애물 감지에 사용됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;레이더 (Radar)&lt;/td&gt;
&lt;td&gt;주변 객체의 거리, 속도 및 방향을 감지하여 장애물 감지와 차량 간 거리 제어에 사용됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;초음파 센서 (Ultrasonic Sensor)&lt;/td&gt;
&lt;td&gt;차량 주변의 근거리 장애물을 감지하고 주차 보조 및 접근 제어에 사용됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPS (Global Positioning System)&lt;/td&gt;
&lt;td&gt;차량의 위치 정보를 제공하여 차량 위치 추정에 사용됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IMU (Inertial Measurement Unit)&lt;/td&gt;
&lt;td&gt;차량의 가속도, 각속도, 자세 등을 측정하여 차량 제어와 위치 추정에 사용됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;밝기 센서 (Light Sensor)&lt;/td&gt;
&lt;td&gt;주변 조도를 측정하여 주행 조명 및 비젼 시스템에 사용됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;엔코더 (Encoder)&lt;/td&gt;
&lt;td&gt;차량의 바퀴 회전 수를 측정하여 주행 거리 및 속도 추정에 사용됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;고도계 (Altimeter)&lt;/td&gt;
&lt;td&gt;차량의 고도를 측정하여 주행 환경에 대한 정보를 제공합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;대기 센서 (Gas Sensor)&lt;/td&gt;
&lt;td&gt;대기 중의 가스 농도를 측정하여 대기 질 모니터링에 사용됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 자율주행기술을 적절하게 사용하고 있는 회사들도 있을까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cv2ARi/btskIZATsTS/ZkSwS1wqydn5yf8vbeT35k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cv2ARi/btskIZATsTS/ZkSwS1wqydn5yf8vbeT35k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cv2ARi/btskIZATsTS/ZkSwS1wqydn5yf8vbeT35k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcv2ARi%2FbtskIZATsTS%2FZkSwS1wqydn5yf8vbeT35k%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;534&quot; height=&quot;529&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;529&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는&amp;nbsp;현재&amp;nbsp;자율주행&amp;nbsp;알고리즘을&amp;nbsp;사용하고&amp;nbsp;있는&amp;nbsp;몇&amp;nbsp;가지&amp;nbsp;주요&amp;nbsp;자동차&amp;nbsp;회사를&amp;nbsp;아래의&amp;nbsp;표로&amp;nbsp;정리해보았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;background-color: #f7f7f8; color: #374151; text-align: left; 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&gt;테슬라 (Tesla)&lt;/td&gt;
&lt;td&gt;자체 개발한 &quot;Tesla Autopilot&quot; 시스템을 사용하며, 신경망 기반의 딥러닝 알고리즘을 활용합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;웨이모 (Waymo)&lt;/td&gt;
&lt;td&gt;&quot;Waymo Driver&quot;라는 자체 개발한 자율주행 시스템을 사용하며, 머신러닝과 센서 기술을 적용합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;아우디 (Audi)&lt;/td&gt;
&lt;td&gt;&quot;Audi AI&quot; 시스템을 사용하며, 주행 경로 계획, 차선 인식, 객체 감지 및 추적에 다양한 알고리즘을 사용합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BMW&lt;/td&gt;
&lt;td&gt;&quot;BMW Personal CoPilot&quot; 시스템을 사용하며, 센서 데이터와 딥러닝 알고리즘을 결합하여 자율주행을 구현합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메르세데스-벤츠 (Mercedes-Benz)&lt;/td&gt;
&lt;td&gt;&quot;Mercedes-Benz Intelligent Drive&quot; 시스템을 사용하며, 센서 기술과 실시간 데이터 처리를 통해 자율주행을 구현합니다.&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;자율주행 기술을 개발하는 주요 기업들은 각자의 방식으로 연구를 진행하고 있습니다. Tesla는 기계 학습 기반의 &quot;Autopilot&quot; 시스템 개발에 주력하고, Waymo는 LIDAR와 카메라를 활용한 레벨 4 자율주행 기술 개발에 초점을 두었다. Uber와 GM 자회사인 Cruise는 도심 환경에서의 완전 자율주행 택시 개발을 목표로 하고있다. 이들의 연구는 도로 안전성 향상과 교통 체증 해소에 기여하고 있다.&lt;/p&gt;</description>
      <category>Programming/Python</category>
      <category>벤츠</category>
      <category>센서</category>
      <category>알고리즘</category>
      <category>자율주행</category>
      <category>자율주행 센서</category>
      <category>테슬라</category>
      <author>아트성</author>
      <guid isPermaLink="true">https://artsung410.tistory.com/102</guid>
      <comments>https://artsung410.tistory.com/102#entry102comment</comments>
      <pubDate>Tue, 20 Jun 2023 18:45:14 +0900</pubDate>
    </item>
    <item>
      <title>[Python] OpenCV 예제로 무작정 따라하기</title>
      <link>https://artsung410.tistory.com/101</link>
      <description>&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;OpenCV&lt;/i&gt;는 이미지 및 동영상 분석을 위한 오픈 소스 라이브러리로, 기본적인 이미지 처리부터 고급 컴퓨터 비전, 기계 학습 기법까지 활용 가능하며, 얼굴 및 객체 인식, OCR, 태그 분석 등의 다양한 기능을 제공한다.&lt;br /&gt;&lt;br /&gt;이는 필터링, 기하학적 변환, 색상 공간 변환, 히스토그램, 특징 검출 및 설명등이 있지만 이중에서 가장 많이 쓰이는 부분은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;영상처리&lt;/b&gt;다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;입력된 이미지를 개선하여 목적에 맞게 변형하는 과정으로, 잡음 제거, 대비 개선, 관심&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;영역 강조&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;영역 분할&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;압축&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;저장&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;등을 포함한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;i&gt;OpenCV&lt;/i&gt;의 영상처리 기술은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;의료분야(CT, MRI), 자율주행(Visual Sensor), 보안(얼굴인식),&amp;nbsp; 항공우주산업 등 다양한 분야에 쓰인다. 예제를 통해서 어떤방식으로 기능구현되는지 알아보도록한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;이미지&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenCV는 이미지와 비디오를 분석하고 처리하는 데 다양한 기능을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 변환, 객체검출 &amp;amp; 인식, 객체 인식, 히스토그램등 다양하게 응용해서 사용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;이미지 읽기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1686879461151&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cv2.imread(file_name, flag)

# file_name : 읽고자 하는 이미지 파일
# flag : 이미지를 읽는 방법 설정
	# IMREAD_COLOR : 이미지를 Color로 읽고, 투명한 부분은 무시
	# IMREAD_GRAYSCALE : 이미지를 Grayscale로 읽기
	# IMREAD_UNCHANGED : 이미지를 Color로 읽고, 투명한 부분도 읽기 (Alpha)

#Return값 : Numpy 객체 (행, 열, 색상 BGR)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;이미지 전환&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1686883127421&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;img_converted = cv2.cvtColor(img, flag)

# img : 이미지를 표현하는 2차원 또는 3차원 numpy 배열
# flag : 이미지를 읽는 방법 설정
    # COLOR_BGR2GRAY : BGR 색상 공간에서 그레이스케일로 변환
    # COLOR_GRAY2BGR : 그레이스케일에서 BGR 색상 공간으로 변환
    # COLOR_BGR2HSV : BGR 색상 공간에서 HSV로 변환
    # COLOR_HSV2BGR : HSV에서 BGR 색상 공간으로 변환
    # COLOR_BGR2RGB : BGR 색상 공간에서 RGB로 변환
    # COLOR_RGB2BGR : RGB에서 BGR 색상 공간으로 변환
    # COLOR_BGR2YCrCb : BGR 색상 공간에서 YCrCb로 변환&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;이미지 출력&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1686879834531&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cv2.imshow(title, image) 

# title : 윈도우 창의 제목
# image : 출력할 이미지 객체&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;이미지 저장&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1686880050389&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cv2.mwrite(file_name, image)

# file_name : 저장할 이미지 파일 이름
# image : 저장할 이미지 객체&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;키보드 입력&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1686880361225&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cv2.waitKey(time)

# time : 입력 대기시간 (무한대기 : 0)
# 반환 값 : 사용자가 입력한 Ascii Code (ESC : 27)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;윈도우 종료&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1686880477289&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cv2.destroyAllWindows()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;예제1 )&amp;nbsp; &lt;span style=&quot;text-align: start;&quot;&gt;이미지 실행 &amp;amp; 저장&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1686880861924&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import cv2

img_rgb = cv2.imread('summer.png', cv2.IMREAD_COLOR)
cv2.imshow('Image', img_rgb)
cv2.waitKey(0)
cv2.imwrite('result.png', img_rgb)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/dYvrKB/btsj6B1QjPr/O3699yNZEky58vkykzhe1k/summer.png?attach=1&amp;amp;knm=img.png&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;summer.png&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.46MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&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-filename=&quot;edited_blob&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V4M9X/btsj5REbexZ/qIAiAqd06mSLFVoxlytAW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V4M9X/btsj5REbexZ/qIAiAqd06mSLFVoxlytAW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V4M9X/btsj5REbexZ/qIAiAqd06mSLFVoxlytAW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV4M9X%2Fbtsj5REbexZ%2FqIAiAqd06mSLFVoxlytAW1%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;576&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;576&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;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP4TQp/btsj5Tu1IC3/JFO44F5WpqfAW5X58J05s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP4TQp/btsj5Tu1IC3/JFO44F5WpqfAW5X58J05s0/img.png&quot; data-origin-width=&quot;236&quot; data-origin-height=&quot;149&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;53.64&quot; style=&quot;width: 53.0195%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP4TQp/btsj5Tu1IC3/JFO44F5WpqfAW5X58J05s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP4TQp%2Fbtsj5Tu1IC3%2FJFO44F5WpqfAW5X58J05s0%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;236&quot; height=&quot;149&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czLNpy/btsj5TaNThn/Ma1s5FfZW67QVEf5Wwu90K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czLNpy/btsj5TaNThn/Ma1s5FfZW67QVEf5Wwu90K/img.png&quot; data-origin-width=&quot;219&quot; data-origin-height=&quot;160&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.8177%;&quot; data-widthpercent=&quot;46.36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czLNpy/btsj5TaNThn/Ma1s5FfZW67QVEf5Wwu90K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczLNpy%2Fbtsj5TaNThn%2FMa1s5FfZW67QVEf5Wwu90K%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;160&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;도형&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenCV는 다양한 도형을 이미지 위에 그릴 수 있는 기능을 제공한다.&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;직선 그리기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1686894840532&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cv2.line(img, startLinePos, endLinePos, color, thickness)

# img (numpy.ndarray) : 이미지를 표현하는 2차원 또는 3차원 numpy 배열.
# startLinePos (tuple) : 선의 시작점 좌표. (x, y) 형태의 튜플.
# endLinePos (tuple) : 선의 종료점 좌표. (x, y) 형태의 튜플.
# color (tuple) : 선의 색상. RGB 모드일 경우 (B, G, R) 형태의 튜플, 회색조 모드일 경우 스칼라 값.
# thickness (int) : 선의 두께. 픽셀 단위의 양의 정수. 디폴트 값은 1.&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사각형 그리기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1686897248948&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cv2.rectangle(img, startRectanglePos, endRectanglePos, color, thickness)

# img (numpy.ndarray) : 이미지를 표현하는 2차원 또는 3차원 numpy 배열.
# startLinePos (tuple) : 사각형의 시작점 좌표. (x, y) 형태의 튜플.
# endLinePos (tuple) : 	사각형의 종료점 좌표. (x, y) 형태의 튜플. 시작점에서 대각선 방향으로 봤을 때 위치.
# color (tuple) : 선의 색상. RGB 모드일 경우 (B, G, R) 형태의 튜플, 회색조 모드일 경우 스칼라 값.
# thickness (int) : 선의 두께. 픽셀 단위의 양의 정수. 디폴트 값은 1. 채우기는 -1&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;원 그리기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1686897264068&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cv2.circle(img, center, radius, color, thickness)

# img (numpy.ndarray) : 이미지를 표현하는 2차원 또는 3차원 numpy 배열.
# center (tuple) : 원의 중심 좌표. (x, y) 형태의 튜플.
# radois (int) : 원의 반지름. 픽셀 단위의 양의 정수.
# color (tuple) : 원의 색상. RGB 모드일 경우 (B, G, R) 형태의 튜플, 회색조 모드일 경우 스칼라 값.
# thickness (int) : 선의 두께. 픽셀 단위의 양의 정수. 디폴트 값은 1. 채우기는 -1&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;예제2 ) &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;도형 그리기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1686895323542&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import cv2
import numpy as np
from matplotlib import pyplot as plt

img = np.zeros((512, 512, 3), np.uint8)
img = cv2.line(img, (0, 512), (512, 0), (255, 0, 0), 5)
img = cv2.rectangle(img, (150, 150), (350, 350), (0, 255, 0), 3)
img = cv2.circle(img, (400, 100), 50, (0, 0, 255), 4)
cv2.imshow('Image', img)
cv2.waitKey(0)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bR6kQ0/btskeelawkb/AOA8pb8VDRtPxtbFsSnNZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bR6kQ0/btskeelawkb/AOA8pb8VDRtPxtbFsSnNZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bR6kQ0/btskeelawkb/AOA8pb8VDRtPxtbFsSnNZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR6kQ0%2Fbtskeelawkb%2FAOA8pb8VDRtPxtbFsSnNZK%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;509&quot; height=&quot;537&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;537&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: center;&quot; data-ke-size=&quot;size16&quot;&gt;도형을 채우고 싶으면, 5번째 파라미터인 thickness를 -1로 바꿔주면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sXXbT/btskdXD1GAZ/QLVYcGxJy9W3vrGZS3YKD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sXXbT/btskdXD1GAZ/QLVYcGxJy9W3vrGZS3YKD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sXXbT/btskdXD1GAZ/QLVYcGxJy9W3vrGZS3YKD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsXXbT%2FbtskdXD1GAZ%2FQLVYcGxJy9W3vrGZS3YKD0%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;509&quot; height=&quot;531&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;텍스트&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;텍스트 그리기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686896167909&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin)

# img (numpy.ndarray) : 텍스트를 그릴 대상 이미지. 이미지는 2차원 또는 3차원 numpy 배열
# text (str) : 이미지에 그릴 텍스트 문자열.
# org (tuple) : 텍스트가 시작될 좌표. 좌표는 (x, y) 형태의 튜플, 왼쪽 하단을 기준

# fontFace (int) : 글꼴 타입.
    # FONT_HERSHEY_SIMPLEX (0) : 기본 글꼴
    # FONT_HERSHEY_PLAIN (1) : 얇은 기본 글꼴
    # FONT_HERSHEY_DUPLEX (2) : 두꺼운 기본 글꼴
    # FONT_HERSHEY_COMPLEX (3) : 복잡한 글꼴
    # FONT_HERSHEY_TRIPLEX (4) :  복잡한 두꺼운 글꼴
    # FONT_HERSHEY_COMPLEX_SMALL (5) : 복잡한 작은 글꼴
    # FONT_HERSHEY_SCRIPT_SIMPLEX (6) : 필기체 스타일 글꼴
    # FONT_HERSHEY_SCRIPT_COMPLEX (7) : 복잡한 필기체 스타일 글꼴
    # FONT_ITALIC (16) : 이탤릭 스타일 글꼴
    
# fontScale (float) : 글꼴 크기, 텍스트의 크기를 결정
# color (tuple) : 텍스트의 색상. RGB 모드일 경우 (B, G, R) 형태의 튜플, 회색조 모드일 경우 스칼라 값.
# thickness (int) : 텍스트의 두께. 픽셀 단위의 양의 정수. 디폴트 값은 1.
# lineType (int) : 선의 타입. 디폴트는 cv2.LINE_8. 다른 선택 가능한 값으로 cv2.LINE_4, cv2.LINE_AA.
# bottomLeftOrigin (bool) : True일 경우 왼쪽하단, False일 경우 왼쪽상단이 원점.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;예제3 )&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;텍스트 그리기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1686896168201&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import cv2
import numpy as np
from matplotlib import pyplot as plt

img = np.zeros((512, 512, 3), np.uint8)
img = cv2.putText(img, 'Python', (10, 250), 0, 4, (0, 255, 255), 3)
cv2.imshow('Image', img)
cv2.waitKey(0)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUvgDe/btskfutDFtd/XmN0NVQsLiHxsLuPSPsa20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUvgDe/btskfutDFtd/XmN0NVQsLiHxsLuPSPsa20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUvgDe/btskfutDFtd/XmN0NVQsLiHxsLuPSPsa20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUvgDe%2FbtskfutDFtd%2FXmN0NVQsLiHxsLuPSPsa20%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;504&quot; height=&quot;537&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Python</category>
      <category>OpenCV</category>
      <category>Python</category>
      <author>아트성</author>
      <guid isPermaLink="true">https://artsung410.tistory.com/101</guid>
      <comments>https://artsung410.tistory.com/101#entry101comment</comments>
      <pubDate>Fri, 16 Jun 2023 17:04:14 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] Socket을 이용한 python과 통신</title>
      <link>https://artsung410.tistory.com/100</link>
      <description>&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;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCJNKd/btsi11BaVzx/KrbgmSIvLnS8fTbrEal8x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCJNKd/btsi11BaVzx/KrbgmSIvLnS8fTbrEal8x1/img.png&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;376&quot; data-is-animation=&quot;false&quot; style=&quot;width: 33.3502%; margin-right: 10px;&quot; data-widthpercent=&quot;33.74&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCJNKd/btsi11BaVzx/KrbgmSIvLnS8fTbrEal8x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCJNKd%2Fbtsi11BaVzx%2FKrbgmSIvLnS8fTbrEal8x1%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;376&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlQX12/btsi2QZUzom/A6M8udPUZj5wG33wqY6m3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlQX12/btsi2QZUzom/A6M8udPUZj5wG33wqY6m3K/img.png&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;244&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;66.26&quot; style=&quot;width: 65.487%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlQX12/btsi2QZUzom/A6M8udPUZj5wG33wqY6m3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlQX12%2Fbtsi2QZUzom%2FA6M8udPUZj5wG33wqY6m3K%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;604&quot; height=&quot;244&quot;/&gt;&lt;/span&gt;&lt;/div&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;&lt;span style=&quot;color: #ee2323;&quot;&gt;unity&lt;/span&gt;는 python(클라이언트)의 연결을 기다리는 서버, &lt;span style=&quot;color: #ee2323;&quot;&gt;python&lt;/span&gt;은 unity와 연결을 설정하는 클라이언트의 역할을 담당하도록 구조를 짠다. 연결이 설정되면 python은 좌표 또는 바이트스타입의 데이터를 unity로 보낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unity는 python에서 데이터를 수신하고 수신된 좌표를 기반으로 큐브의 위치를 업데이트한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686186613035&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    Thread thread;
    public int connectionPort = 25001;
    TcpListener server;  
    TcpClient client; 
    bool running;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Thread :&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;connectionPort : 클라이언트가 접속할 포트번호.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TcpListener : 네트워크 클라이언트에서 연결을 수신한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TcpClient : 네트워크를 통해 스트림 데이터를 연결, 전송, 수신등 간단한 기능들을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;running : 서버가 열려있는지 체크한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686186914787&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    private void Start()
    {
        // Receive on a separate thread so Unity doesn't freeze waiting for data
        ThreadStart ts = new ThreadStart(GetData);  
        thread = new Thread(ts);
        thread.Start();
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드를 별도의 스레드에서 실행하도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686187548395&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    void GetData()
    {
        // Create the server
        // 클라이언트 연결.
        server = new TcpListener(IPAddress.Any, connectionPort); 
        server.Start();

        // Create a Clinent to get the data stream
        client = server.AcceptTcpClient();

        // Start listening
        running = true;
        while(running)
        {
            Connection();
        }
        server.Stop();
        Debug.Log(&quot;서버 스탑&quot;);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GetData의 메서드는 서버를 생성해 클라이언트의 데이터를 수신받는 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IPAddress.Any와, 동기화할 포트를 파라미터로 전달해서 TcpListener의 인스턴스를 생성해서 서버를 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 IPAddress.Any는 모든 네트워크 &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;인터페이스&lt;/span&gt;&lt;/b&gt;에서 들어오는 연결을 수신함을 뜻한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;이더넷 인터페이스 &lt;/b&gt;: 이것은 컴퓨터와 서버에서 볼 수 있는 일반적인 유형의 네트워크 인터페이스. 이더넷 케이블을 사용하여 장치를 LAN(Local Area Network) 또는 WAN(Wide Area Network)에 연결.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;Wi-Fi 인터페이스 &lt;/b&gt;: 장치와 네트워크 간의 무선 통신.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;루프백&amp;nbsp;인터페이스 &lt;/b&gt;: 일반적으로 IP 주소 127.0.0.1로 표시되는 루프백 인터페이스는 장치가 자체적으로 통신할 수 있도록 하는 가상 네트워크 인터페이스. 테스트 및 진단 목적으로 자주 사용.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;VPN(가상&amp;nbsp;사설망)&amp;nbsp;인터페이스 &lt;/b&gt;: 장치가 VPN 연결을 설정하면 VPN 터널을 위한 가상 네트워크 인터페이스가 생성. 이 인터페이스는 장치와 VPN 서버 간에 암호화된 트래픽을 라우팅하는 데 사용.&lt;/span&gt;&lt;/i&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AcceptTcpClient()&lt;/b&gt;는 클라이언트 연결이 수신되면 TcpClient를 반환한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별도의 메서드(Connection())를 만들어서 while문을 통해 실시간으로 데이터를 주고받을수있게 세팅한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686188355756&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    Vector3 position = Vector3.zero;
    void Connection()
    {
        // Read data from the network stream
        NetworkStream nwStream = client.GetStream();
        byte[] buffer = new byte[client.ReceiveBufferSize];
        int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize);

        // Decode the bytes int a string
        string dataReceived = Encoding.UTF8.GetString(buffer, 0, bytesRead);

        // Make sure we're not getting an empty string
        // dataReceived.Trim();

        if (dataReceived != null &amp;amp;&amp;amp; dataReceived != &quot;&quot;)
        {
            // Convert the received string of data to the format we are using
            position = ParseData(dataReceived);
            nwStream.Write(buffer, 0, bytesRead);
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Connection()&lt;/b&gt;은 클라이언트와 네트워크 연결을 처리하기 위한 로직을 정의하는 메서드며, 클라이언트로부터 지속적으로 데이터를 수신하기 위해 while문에서 호출된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;NetworkStream&lt;/b&gt;은 클라이언트에서 얻은 바이트스트림타입의 데이터를 읽고 쓰는데 사용된다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;스트림은 순차적으로 읽거나 쓸 수 있는 데이터 흐름을 나타내기 때문에 &quot;스트림&quot;이라고 부른다. &quot;스트림&quot;이라는 용어는 실제 스트림 또는 흐르는 물의 개념에서 차용한 것.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;프로그래밍 맥락에서 스트림은 소스에서 데이터를 읽든(입력 스트림) 대상에 데이터를 쓰든(출력 스트림) 데이터의 연속 흐름을 처리하는 방법을 제공. 이를 통해 프로그래머는 물리적 스트림에서 데이터를 읽거나 쓰는 것과 유사하게 순차적인 방식으로 데이터와 상호 작용할 수 있다.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;스트림의 개념은 데이터의 소스 또는 대상에 관계없이 입력/출력 작업을 효율적이고 균일하게 처리하기 위해 다양한 프로그래밍 언어 및 프레임워크에서 사용된다. 스트림은 파일, 네트워크 연결, 메모리 버퍼 또는 사용자 입력 / 출력과 같은 다양한 소스에서 데이터를 읽거나 쓰는 데 사용할 수 있다.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&quot;스트림&quot;이라는 용어는 데이터가 개별 청크가 아닌 연속적인 흐름으로 액세스되거나 조작될 수 있다는 생각을 강조. 광범위한 프로그래밍 시나리오에서 데이터 전송, 처리 및 저장을 처리하는 일관되고 편리한 방법을 제공한다.&lt;/span&gt;&lt;/i&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;buffer&lt;/b&gt;는 수신된 스트림 데이터를 임시로 저장하는데 사용되는 바이트 배열이다. &lt;b&gt;cleint.ReceiveBufferSize&lt;/b&gt;를 통해서 바이트수를 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;dataReceived&lt;/b&gt;에 UTF-8인코딩을 사용하여 수신된 바이트를 문자열로 변환시켜서 할당한다. (수신된 스트링에는 파이썬에서 입력된 좌표값이 들어갈것이다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686189745543&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public static Vector3 ParseData(string dataString)
    {
        // Remove the parenthes
        if (dataString.StartsWith(&quot;(&quot;) &amp;amp;&amp;amp; dataString.EndsWith(&quot;)&quot;))
        {
            dataString = dataString.Substring(1, dataString.Length - 2);
            Debug.Log(dataString);
        }

        // Split the elements into an array
        string[] stringArray = dataString.Split(',');

        // Store as a Vector3
        Vector3 result = new Vector3(
            float.Parse(stringArray[0]),
            float.Parse(stringArray[1]),
            float.Parse(stringArray[2]));

        return result;
    }

    private void Update()
    {
        // Set this Object's position in the scene according to the position received
        transform.position = position;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌표값을 파싱처리하는 메서드다. 스트링값을 파라미터로 받고, 불필요한 괄호들을 제거해주고 실시간으로 Vector3값을 받고 위치값을 업데이트 시켜준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686189801769&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.Net;
using System.Net.Sockets;
using System.Text;
using UnityEngine;
using System.Threading;

public class MyListener : MonoBehaviour
{
    Thread thread;
    public int connectionPort = 25001;
    TcpListener server; 
    TcpClient client; 
    bool running;

    private void Start()
    {
        // Receive on a separate thread so Unity doesn't freeze waiting for data
        ThreadStart ts = new ThreadStart(GetData);  
        thread = new Thread(ts);
        thread.Start();
    }

    void GetData()
    {
        // Create the server
        server = new TcpListener(IPAddress.Any, connectionPort); 
        server.Start();

        // Create a Clinent to get the data stream
        client = server.AcceptTcpClient();

        // Start listening
        running = true;
        while(running)
        {
            Connection();
        }
        server.Stop();
        Debug.Log(&quot;서버 스탑&quot;);
    }

    // Position is the data being received in this example
    Vector3 position = Vector3.zero;
    void Connection()
    {
        // Read data from the network stream
        NetworkStream nwStream = client.GetStream();
        byte[] buffer = new byte[client.ReceiveBufferSize];
        int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize);

        // Decode the bytes int a string
        string dataReceived = Encoding.UTF8.GetString(buffer, 0, bytesRead);

        // Make sure we're not getting an empty string
        // dataReceived.Trim();

        if (dataReceived != null &amp;amp;&amp;amp; dataReceived != &quot;&quot;)
        {
            // Convert the received string of data to the format we are using
            position = ParseData(dataReceived);
            nwStream.Write(buffer, 0, bytesRead);
        }
    }

    public static Vector3 ParseData(string dataString)
    {
        // Remove the parenthes
        if (dataString.StartsWith(&quot;(&quot;) &amp;amp;&amp;amp; dataString.EndsWith(&quot;)&quot;))
        {
            dataString = dataString.Substring(1, dataString.Length - 2);
            Debug.Log(dataString);
        }

        // Split the elements into an array
        string[] stringArray = dataString.Split(',');

        // Store as a Vector3
        Vector3 result = new Vector3(
            float.Parse(stringArray[0]),
            float.Parse(stringArray[1]),
            float.Parse(stringArray[2]));

        return result;
    }

    private void Update()
    {
        // Set this Object's position in the scene according to the position received
        transform.position = position;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 유니티 전체 코드다. 이제 파이썬으로 넘어가보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 1초마다 3차원상의 z값을 1씩 증가시켜서 유니티로 전송시키는 파이썬 코드다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686189895529&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import socket
import time

host = &quot;127.0.0.1&quot;
port = 25001

x = 0
y = 0
z = 0

def join_string(x, y, z):
    return f&quot;{x},{y},{z}&quot;

try:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((host, port))

    while True:
        try:
            z += 1
            data = join_string(x, y, z)

            sock.sendall(data.encode(&quot;utf-8&quot;))

            response = sock.recv(1024).decode(&quot;utf-8&quot;)
            print(response)

        except ConnectionResetError:
            print(&quot;The server disconnected.&quot;)
            # Add any necessary handling for the server disconnection here

        except Exception as e:
            print(&quot;An error occurred:&quot;, e)

        time.sleep(1)

except ConnectionRefusedError:
    print(&quot;Connection refused. Make sure the server is running.&quot;)

except Exception as e:
    print(&quot;An error occurred:&quot;, e)

finally:
    sock.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 socket라이브러리를 pip 인스톨러를 통해서 다운받아서 불러온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루프백 인터페이스 방식으로 통신처리하기위해 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;host를 127.0.0.1로 설정하고, 서버에 접속하기 위해 포트번호를 유니티와 동일한 25001로 설정한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;join_string&lt;/b&gt; : 3차원 자표값을 int타입을 파라미터로 받아서 string타입으로 리턴시켜주는 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;sock&lt;/b&gt; : IPv4의 주소계열(AF_INET)을 지정하여 스트림 지향 통신을 위해 생성된 TCP소켓이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 서버에 연결을 하기 위해서 host,와 port넘버를 파라미터로 전달해야하는데, &lt;b&gt;sock.connect&lt;/b&gt;를 사용해서 서버에 연결을 할수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;while문 안을 살표보자.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;스트링 타입으로 반환된 data를 인코딩과정을 거쳐서 &lt;b&gt;sock.sendall&lt;/b&gt;의 파라미터로 전달한다. 아래 &lt;b&gt;sock.recv&lt;/b&gt;를 통해 데이터통신을 확인할 수 도있다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Animation.gif&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;1258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ6Rh8/btsi3WyDRJK/O9XClOuidodcQqXV1K1B50/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ6Rh8/btsi3WyDRJK/O9XClOuidodcQqXV1K1B50/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ6Rh8/btsi3WyDRJK/O9XClOuidodcQqXV1K1B50/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bQ6Rh8/btsi3WyDRJK/O9XClOuidodcQqXV1K1B50/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;1752&quot; height=&quot;1258&quot; data-filename=&quot;Animation.gif&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;1258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티와 파이썬을 순차적으로 실행시키면 큐브가 서서히 전진하는것을 확인할 수 있다.&lt;/p&gt;</description>
      <category>Programming/C# | Unity</category>
      <category>socket</category>
      <category>서버</category>
      <category>유니티</category>
      <category>통신</category>
      <category>파이썬</category>
      <author>아트성</author>
      <guid isPermaLink="true">https://artsung410.tistory.com/100</guid>
      <comments>https://artsung410.tistory.com/100#entry100comment</comments>
      <pubDate>Thu, 8 Jun 2023 11:26:56 +0900</pubDate>
    </item>
    <item>
      <title>[CS] 운영체제</title>
      <link>https://artsung410.tistory.com/99</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제(Operating System, OS)는 컴퓨터의 &lt;span style=&quot;color: #ee2323;&quot;&gt;자원 관리&lt;span style=&quot;color: #000000;&quot;&gt;를 담당&lt;/span&gt;&lt;/span&gt;하고, 프로그램이 올바르게 실행되도록 돕는 &lt;span style=&quot;color: #ee2323;&quot;&gt;특별한 프로그램&lt;/span&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/h3&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;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;커널&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제 또한 여느 프로그램과 마찬가지로 메모리에 적재되어야 한다. 항상 컴퓨터가 부팅될때 메모리 일정공간을 할당받게 되는데, 이 영역을 &lt;span style=&quot;color: #ee2323;&quot;&gt;커널영역&lt;/span&gt;이라고 부른다. (그 외에 메모리는 사용자 영역이라고 부른다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/CS</category>
      <category>cs</category>
      <category>운영체제</category>
      <author>아트성</author>
      <guid isPermaLink="true">https://artsung410.tistory.com/99</guid>
      <comments>https://artsung410.tistory.com/99#entry99comment</comments>
      <pubDate>Fri, 24 Mar 2023 23:46:44 +0900</pubDate>
    </item>
    <item>
      <title>[CS] CPU가 작동하는 방식</title>
      <link>https://artsung410.tistory.com/98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;CPU는 중앙처리장치이며 메모리에 저장된 &lt;span style=&quot;color: #ee2323;&quot;&gt;명령어&lt;span style=&quot;color: #000000;&quot;&gt;와&lt;/span&gt; 데이터&lt;span style=&quot;color: #000000;&quot;&gt;를&lt;/span&gt;&lt;/span&gt;읽고 해석하는 부품이다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그중에 CPU를 구성하는 핵심적인 장치들이 있다.&lt;/span&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;화면 캡처 2023-02-21 225619.png&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xp6gK/btr5px6Du2q/gII5e6Bihuju2ODgqLoXkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xp6gK/btr5px6Du2q/gII5e6Bihuju2ODgqLoXkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xp6gK/btr5px6Du2q/gII5e6Bihuju2ODgqLoXkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxp6gK%2Fbtr5px6Du2q%2FgII5e6Bihuju2ODgqLoXkk%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;526&quot; height=&quot;525&quot; data-filename=&quot;화면 캡처 2023-02-21 225619.png&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;ALU&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&quot;산술논리연산장치&quot;라고도&amp;nbsp;부르며&amp;nbsp;컴퓨터의&amp;nbsp;수행되는&amp;nbsp;대부분의&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;계산&lt;/span&gt;을&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;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;레지스터&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&quot;임시저장장치&quot; 라고도 부르며, 프로그램을 실행하는데 필요한 값들을 &lt;span style=&quot;color: #ee2323;&quot;&gt;임시로 저장&lt;/span&gt;하는 역할을 한다. cpu내부에 여러개의 레지스터가 존재한다.&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;용도에 따라 &lt;span style=&quot;color: #8a3db6;&quot;&gt;카운터 레지스터&lt;/span&gt;, &lt;span style=&quot;color: #8a3db6;&quot;&gt;메모리주소 레지스터&lt;/span&gt;, &lt;span style=&quot;color: #8a3db6;&quot;&gt;메모리 버퍼 레지스터&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 data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;제어장치&lt;/span&gt; &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;제어신호를 내보내는 역할을 하는데, 신호에는 메모리 &lt;span style=&quot;color: #ee2323;&quot;&gt;읽기&amp;nbsp;/&amp;nbsp;쓰기&lt;/span&gt;가&amp;nbsp;있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;연산코드와 오퍼랜드로 구성된 어셈블리어에서 기계어로 번역되면, 제어장치가 메모리 주소를 읽어들이고 ALU로 인계를 해서 연산을 거친후에 데이터를 저장하는 과정을 맡게된다.&lt;/span&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;화면 캡처 2023-03-22 223632.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKkUWG/btr5jaZkMg4/wzwAXM5kO2kwDiNHPWAZVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKkUWG/btr5jaZkMg4/wzwAXM5kO2kwDiNHPWAZVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKkUWG/btr5jaZkMg4/wzwAXM5kO2kwDiNHPWAZVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKkUWG%2Fbtr5jaZkMg4%2FwzwAXM5kO2kwDiNHPWAZVk%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;752&quot; height=&quot;492&quot; data-filename=&quot;화면 캡처 2023-03-22 223632.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #f6e199;&quot;&gt;캐시메모리&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;캐시 메모리는 컴퓨터의 빠른 처리를 위해 CPU와 주기억장치 사이에 위치한&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;고속 버퍼 메모리.&lt;/span&gt; CPU가 자주 사용하는 데이터나 명령어를 저장해두어 더 빠르게 접근할 수 있도록 도와준다. 캐시메모리는 L1~ L3까지 있으며, 레벨이 낮을수록 빠르며 용량이 작고 가격이 비싸다. &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;핵심기능으로는, 자주 사용되는 변수에 메모리 공간을 여러번 다시 접근할 수있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;span style=&quot;&quot;&gt;캐시메모리의 지역성&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;최근에 접근했던 메모리 공간에 다시 접근하려는 경향을 전문용어로 &lt;span style=&quot;color: #ee2323;&quot;&gt;시간 지역성&lt;/span&gt;이라고 부른다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실행하려는 프로그램은 관련 데이터들끼리 한데 모여있다.&amp;nbsp; 기능들이 모여있는 공간 근처를 집중적으로 접근하려는 경향을 &lt;span style=&quot;color: #ee2323;&quot;&gt;공간지역성&lt;/span&gt;이라고 부른다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Programming/CS</category>
      <category>ALU</category>
      <category>CPU</category>
      <category>레지스터</category>
      <category>제어장치</category>
      <author>아트성</author>
      <guid isPermaLink="true">https://artsung410.tistory.com/98</guid>
      <comments>https://artsung410.tistory.com/98#entry98comment</comments>
      <pubDate>Wed, 22 Mar 2023 22:07:26 +0900</pubDate>
    </item>
    <item>
      <title>[DB] MySQL CRUD 작업하기</title>
      <link>https://artsung410.tistory.com/96</link>
      <description>&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span class=&quot;artsung&quot;&gt;데이터 베이스 생성&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span class=&quot;artsung_1&quot;&gt;Create schema&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;asd.png&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ECWoO/btrMxBZWfFs/WMRBwCEZCEaYVpPTB44ne0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ECWoO/btrMxBZWfFs/WMRBwCEZCEaYVpPTB44ne0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ECWoO/btrMxBZWfFs/WMRBwCEZCEaYVpPTB44ne0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FECWoO%2FbtrMxBZWfFs%2FWMRBwCEZCEaYVpPTB44ne0%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;136&quot; data-filename=&quot;asd.png&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mySQL.png&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gnqla/btrMnKRXWp2/KjwWXex0PKmv6GPxEBO0mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gnqla/btrMnKRXWp2/KjwWXex0PKmv6GPxEBO0mK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gnqla/btrMnKRXWp2/KjwWXex0PKmv6GPxEBO0mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGnqla%2FbtrMnKRXWp2%2FKjwWXex0PKmv6GPxEBO0mK%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;458&quot; height=&quot;82&quot; data-filename=&quot;mySQL.png&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1663555924534&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;create schema `nodejs` default character set utf8;
use nodejs&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;create schema [스케마 이름] : 새로운 데이터베이스 생성 (``를 붙여야함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;use [스케마 이름] : 특정 데이터베이스 사용 (``를 붙이지 않음.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span class=&quot;artsung&quot;&gt;테이블 생성&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span class=&quot;artsung_1&quot;&gt;Create table&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ddd.png&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baCQ6w/btrMw0eCEN0/irkqgsvkvON7x5jc3PFYok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baCQ6w/btrMw0eCEN0/irkqgsvkvON7x5jc3PFYok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baCQ6w/btrMw0eCEN0/irkqgsvkvON7x5jc3PFYok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaCQ6w%2FbtrMw0eCEN0%2FirkqgsvkvON7x5jc3PFYok%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;438&quot; height=&quot;97&quot; data-filename=&quot;ddd.png&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;111.png&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMbcyD/btrMoyDJsAA/IPjBLDhkWoyDzPiwBwGuhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMbcyD/btrMoyDJsAA/IPjBLDhkWoyDzPiwBwGuhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMbcyD/btrMoyDJsAA/IPjBLDhkWoyDzPiwBwGuhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMbcyD%2FbtrMoyDJsAA%2FIPjBLDhkWoyDzPiwBwGuhk%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;227&quot; data-filename=&quot;111.png&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1663556157220&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;create table [스키마 이름].[테이블 이름](
    -&amp;gt; id INT NOT NULL AUTO_INCREMENT,
    -&amp;gt; name VARCHAR(20) NOT NULL,
    -&amp;gt; age INT UNSIGNED NOT NULL,
    -&amp;gt; married TINYINT NOT NULL,
    -&amp;gt; comment TEXT NULL,
    -&amp;gt; created_at DATETIME NOT NULL DEFAULT now(),
    -&amp;gt; PRIMARY KEY(id),
    -&amp;gt; UNIQUE INDEX name_UNIQUE(name ASC))
    -&amp;gt; COMMENT = 'artsung'
    -&amp;gt; DEFAULT CHARACTER SET = utf8
    -&amp;gt; ENGINE = InnoDB;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span class=&quot;artsung_1&quot;&gt;Options&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컬럼에 대한 설정&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_mySQL.png&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9Jl2h/btrMlVZ6kYv/JC4SYRhI2fXj75dZYhkEXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9Jl2h/btrMlVZ6kYv/JC4SYRhI2fXj75dZYhkEXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9Jl2h/btrMlVZ6kYv/JC4SYRhI2fXj75dZYhkEXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9Jl2h%2FbtrMlVZ6kYv%2FJC4SYRhI2fXj75dZYhkEXk%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;1034&quot; height=&quot;490&quot; data-filename=&quot;edited_mySQL.png&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;PRIMARY KEY &lt;span style=&quot;color: #781b33;&quot;&gt;(PK)&lt;/span&gt;&lt;/b&gt; | &lt;/span&gt;기본 키 여부를 설정하는 옵션 / 모든 자료형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;NULL / NOT NULL &lt;/b&gt;&lt;span style=&quot;color: #781b33;&quot;&gt;&lt;b&gt;(NN)&lt;/b&gt; | &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;빈칸을 허용할지 허용안할지 여부를 묻는 옵션 / &lt;span&gt;모든 자료형&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;UNIQUE INDEX &lt;span style=&quot;color: #781b33;&quot;&gt;(UQ)&lt;/span&gt;&lt;/b&gt; | 해당값이 고유해야하는지에 대한 옵션 / 정수형 &amp;amp; char형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ex)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UNIQUE INDEX name_UNIQUE(name ASC) : 오름차순으로 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UNIQUE INDEX name_UNIQUE(name AESC) : 내림차순으로 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BINARY &lt;span style=&quot;color: #781b33;&quot;&gt;(B)&lt;/span&gt;&lt;/b&gt; | 데이터를 이진 문자열로 저장함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;UNSIGNED&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #781b33;&quot;&gt;&lt;b&gt;(UN)&lt;/b&gt; |&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;양수만 허용 / 정수형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;ZEROFILL&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #781b33;&quot;&gt;&lt;b&gt;(ZF)&lt;/b&gt; |&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;숫자 자릿수가 고정되어있을때 공백에 0을 채움. / 정수형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;// ex) INT(4)인데 숫자 1을 넣었다면 0001이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AUTO_INCREMENT &lt;/b&gt;&lt;span style=&quot;color: #781b33;&quot;&gt;&lt;b&gt;(AI)&lt;/b&gt; | &lt;/span&gt;숫자를 저절로 올리는 옵션 / 정수형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GENERATED ALWAYS (수식) &lt;span style=&quot;color: #781b33;&quot;&gt;(G)&lt;/span&gt;&lt;/b&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;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span class=&quot;artsung_1&quot;&gt;테이블에 대한 설정&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;COMMENT&lt;/b&gt; | 테이블에 대한 보충 설명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DEFAULT CHARACTER SET&lt;/b&gt; | 문자열 타입 정의 (utf8로 설정하지 않으면 한글이 입력되지 않음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ENGINE&lt;/b&gt; | DB엔진을 설정해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span class=&quot;artsung&quot;&gt;자료형&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;INT&lt;/b&gt; | &lt;span&gt;정수형&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TINYINT&lt;/b&gt; | &lt;span&gt;부울&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;FLOAT / DOUBLE&lt;/b&gt; | &lt;span&gt;소수형&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VARCHAR(자릿수) / CHAR(자릿수)&lt;/b&gt; | &lt;span&gt;문자열&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;// ex) VARCHCHAR(10) 이면 길이가 0 ~ 10인 문자열을/ CHAR(10) 이면 반드시 길이가 10인 문자열만 넣어야함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TEXT&lt;/b&gt; | &lt;span&gt;긴 글&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DATETIME&lt;/b&gt; | &lt;span&gt;날짜&lt;span&gt;&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span class=&quot;artsung&quot;&gt;명령어&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DROP TABLES [테이블명]&lt;/b&gt; | 특정 테이블 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SHOW TABLES&lt;/b&gt; | 테이블 전부 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;showtables.png&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biwiyx/btrMrTOcPP4/hhEe9hArEmmTfWUp6G3gUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biwiyx/btrMrTOcPP4/hhEe9hArEmmTfWUp6G3gUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biwiyx/btrMrTOcPP4/hhEe9hArEmmTfWUp6G3gUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbiwiyx%2FbtrMrTOcPP4%2FhhEe9hArEmmTfWUp6G3gUk%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;268&quot; height=&quot;165&quot; data-filename=&quot;showtables.png&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;165&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;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span class=&quot;artsung_1&quot;&gt;생성&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;INSERT INTO [테이블명] ( [컬럼1], [컬럼2], ....) VALUES ( [값1], [값2], ....)&lt;/b&gt; | 행 삽입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span class=&quot;artsung_1&quot;&gt;조회&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SELECT * FROM [테이블명]&lt;/b&gt; | 데이터 조회 (모든 컬럼)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SELECT [컬럼1], [컬럼2], ... FROM [테이블명] &lt;/b&gt;| 데이터 조회 (특정 컬럼)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SELECT [컬럼1], [컬럼2], ... FROM [테이블명] WHERE [조건식] &lt;/b&gt;| 조건식에 맞는 데이터 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SELECT [컬럼1], [컬럼2], ... FROM [테이블명] ORDER BY [컬럼] &lt;b&gt;ASC &lt;b&gt;or &lt;/b&gt;&lt;/b&gt;DESC &lt;/b&gt;| 특정 컬럼 기준 오름 / 내림차순 정렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SELECT [컬럼1], [컬럼2], ... FROM [테이블명] ORDER BY [컬럼]&lt;span&gt; LIMIT (num)&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;| num만큼만 조회할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SELECT [컬럼1], [컬럼2], ... FROM [테이블명] ORDER BY [컬럼]&lt;span&gt;&lt;span&gt; OFFSET&lt;/span&gt; &lt;b&gt;&lt;span&gt;(num)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;| num만큼 건너뛰고 조회할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span class=&quot;artsung_1&quot;&gt;수정&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;UPDATE [테이블명] SET [컬럼1] = '바꿀내용' WHERE id = &lt;span&gt;&lt;b&gt;&lt;span&gt;&lt;b&gt;(num)&lt;/b&gt; | id가 num인 로우를 수정&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span class=&quot;artsung_1&quot;&gt;삭제&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DELETE FROM [테이블명] WHERE id = 조회할 값 | &lt;span&gt;id&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; = &lt;span&gt;&lt;b&gt;&lt;span&gt;&lt;b&gt;(num)&lt;/b&gt; | id가 num인 로우를 삭제&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>Programming/DB</category>
      <author>아트성</author>
      <guid isPermaLink="true">https://artsung410.tistory.com/96</guid>
      <comments>https://artsung410.tistory.com/96#entry96comment</comments>
      <pubDate>Mon, 19 Sep 2022 14:55:57 +0900</pubDate>
    </item>
    <item>
      <title>[CS] 메모리</title>
      <link>https://artsung410.tistory.com/94</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;메모리 계층 구조&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wefwer.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KNqZ5/btrL7ugXLih/FIe2QIVj7kqJSf4pf18Xx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KNqZ5/btrL7ugXLih/FIe2QIVj7kqJSf4pf18Xx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KNqZ5/btrL7ugXLih/FIe2QIVj7kqJSf4pf18Xx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKNqZ5%2FbtrL7ugXLih%2FFIe2QIVj7kqJSf4pf18Xx0%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;623&quot; height=&quot;334&quot; data-filename=&quot;wefwer.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;컴퓨터의 설계에 있어, 각각의 특징이 있는 서로 다른 여러 종류의 저장 장치를 함께 사용하여 최적의 효율을 낼 수 있게 하는 것. 빠른 저장 장치는 용량에 비해 가격이 비싸고, 용량이 넉넉한 저장 장치는 처리 속도가 느리다. 그러나 컴퓨터가 행하는 작업은 매우 다양하다. 빠른 속도가 필요한 상황도 있지만, 단순히 많은 내용을 천천히 읽고 쓰는 작업도 그만큼 많다. 이러한 상황에 맞게 여러 저장 장치를 각각 사용할 수 있도록 하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;싸고 성능 좋은 컴퓨터&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;를 구현하는 설계가 메모리 계층 구조이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;레지스터&lt;/b&gt; &lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;컴퓨터에서 제일 빠른 메모리.&lt;span&gt; CPU&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;계산 과정에서 작동한다. CPU마다 다르겠지만 한 CPU에 100개 들어있으면 매우 많은 편. 그러나 무작정 많다고 좋은 건 아니고, CPU 스펙에도 포함되지 않는다.&amp;nbsp;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;캐시메모리&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;레지스터 다음으로 빠른 메모리. 캐시 메모리도 CPU와의 거리에 따라 L1 캐시, L2 캐시, L3 캐시 등 여러 단계로 나뉜다. 숫자가 작을수록 CPU에 가까운 상위 레벨 캐시로 용량이 작고 빠르며, 숫자가 클수록 용량이 크고 느린 물건이다. 최하위 레벨 캐시의 경우 마지막 레벨을 의미하는 LLC(Last Level Cache)라고도 부른다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;2021년 현재 가정용 PC당 L1 캐시는 수십 KB, L2 캐시는 수백 KB~수 MB, L3 캐시는 수~수십 MB 정도로 들어있으며, 이들은 보통&lt;span&gt; SRAM&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;으로 구성된다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;보통 프로그래머가 직접 제어할 수 없으며 CPU에 의해 자동으로 통제된다. 캐시가 있든 없든 프로그래머와 외부 사용자에게 보이는 결과는 동일하다. 이러한 특성을 사용자에게 투명(Transparent)하다고 한다. 물론 캐시의 특성을 이해하고 프로그래밍하면 훨씬 효율 좋은 코드를 생성할 수 있다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;메인메모리&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;CPU나 메인보드와 분리되어 있는 메모리 중에서는 최상위 메모리이자, 프로그램을 직접 구동하는 데 사용되는 '주 기억 장치'의 최하위 메모리. CPU와 캐시에 비하면 훨씬 느리지만, HDD는 말할 것도 없고 SSD에 비해서도 차원이 다르게 빠르다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span data-v-cfe708ec=&quot;&quot;&gt;스토리지 (SSD, HDD)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;프로그램이 구동될 때에는 직접 쓰이지 않는 '보조 기억장치' 또는 '저장소'들 중에서는 컴퓨터 안에 내장되어 있는 이 메모리들이 대개 최상위에 위치하게 된다. 둘 다 있는 컴퓨터에서는 대개 SSD가 HDD보다 상위에 위치하게 된다. 세부사항은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://namu.wiki/w/SSD&quot; data-v-cfe708ec=&quot;&quot;&gt;SSD&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://namu.wiki/w/HDD&quot; data-v-cfe708ec=&quot;&quot;&gt;HDD&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;참조 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;2021년 현재 가정용으로 SSD는 100GB ~ 1TB 정도, HDD는 1TB ~ 십수TB 정도의 용량으로 구성된다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;일반적으로는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://namu.wiki/w/Advanced%20Technology%20Attachment&quot; data-v-cfe708ec=&quot;&quot;&gt;ATA&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;라는 중간 계층을 따로 두어 통신한다. 단&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://namu.wiki/w/NVMe&quot; data-v-cfe708ec=&quot;&quot;&gt;NVMe&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;SSD만큼은 CPU와 직접 통신한다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-v-cfe708ec=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-v-cfe708ec=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-v-cfe708ec=&quot;&quot;&gt;&lt;b&gt;&lt;span data-v-cfe708ec=&quot;&quot;&gt;지역참조성&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;컴퓨터 프로그램은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://namu.wiki/w/NUMA&quot; data-v-cfe708ec=&quot;&quot;&gt;메모리의 같은 지역을 자주 확인하는 경향이 있다&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;이처럼&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;프로그램이 일부분만을 자주 사용하는&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;현상을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;지역 참조성&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #373a3c;&quot;&gt;이라고 한다. 이 지역참조성은 특별한 한 프로그램에서만 일어나는 것이 아니라 거의 대다수의 프로그램에서 일어나는 것이 알려져 있다. 만약 당신이 웹브라우저에서 여러 탭을 켜 놓았다고 가정하자. 웹브라우저는 다른 탭보다 당신이 지금 보고 있는 이 탭의 정보에 보다 자주 접속할 것이다. 이처럼 거의 모든 프로그램이 자신이 가진 정보 중 일부분에 자주 접속하는 지역참조성 현상을 보인다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Process-vs-Threads-in-Linux-1.png&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQT0wO/btrL8ZACzea/vHUkcFB4V4SpQp9zR6w0bK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQT0wO/btrL8ZACzea/vHUkcFB4V4SpQp9zR6w0bK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQT0wO/btrL8ZACzea/vHUkcFB4V4SpQp9zR6w0bK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQT0wO%2FbtrL8ZACzea%2FvHUkcFB4V4SpQp9zR6w0bK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;482&quot; height=&quot;470&quot; data-filename=&quot;Process-vs-Threads-in-Linux-1.png&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;프로그램 (Program)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하드 디스크 등의 저장되어있는 실행코드와 리소스의 집합체&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;프로세스 (Process)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 이제까지 하드웨어에 대해서 살펴봤다. 이번엔 소프트웨어를 살펴보자. 프로그램을 실행하면 무슨 일이 일어날까? 프로그램을 실행하면 프로세스(Process)라는 것이 된다. 프로세스는 프로그램을 실행하기 위한 여러 가지 데이터를 관리하며 아래와 같이 4가지 영역이 존재한다. 즉 프로세스는 &lt;b&gt;자원을 할당받은 프로그램의 인스턴스, 또는 작업단위&lt;/b&gt; 라는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;assd.png&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyiiof/btrL9j0Tyjy/ew0ykodaftySRZd2iGJvyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyiiof/btrL9j0Tyjy/ew0ykodaftySRZd2iGJvyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyiiof/btrL9j0Tyjy/ew0ykodaftySRZd2iGJvyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcyiiof%2FbtrL9j0Tyjy%2Few0ykodaftySRZd2iGJvyK%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;781&quot; height=&quot;538&quot; data-filename=&quot;assd.png&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;● 코드(Code)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위쪽(낮은)주소와 가까이 위치하며, &lt;b&gt;실행하는 프로그램의 코드가 저장&lt;/b&gt;되는 영역이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실행파일을 구성하는 명령어(예약어, 제어문, 상수)들이 저장되는 영역이며 컴파일 타임에 결정된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;● 데이터(Data)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위쪽(낮은)주소와 가까이 위치하며, &lt;b&gt;전역변수와 정적Static 변수가 저장되는 영역이다.&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;초기화 된 데이터는 Data영역에 초기화 되지 않은 데이터는 BSS영역에 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;● 힙(Heap) :&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위쪽(낮은)주소부터 할당이 되며, &lt;b&gt;참조형 데이터값&lt;/b&gt;이 저장되고, 메모리 공간이 동적으로 할당되고 해제되어 메모리 영역은 런타임에 결정된다. &lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;Heap과 Stack은 같은 공간을 공유하기 때문에 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529;&quot;&gt;각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 &lt;span style=&quot;color: #781b33;&quot;&gt;Heap Overflow&lt;/span&gt;라고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;● 스택(Stack)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래쪽(높은)주소부터 할당이 되며 &lt;b&gt;함수의 호출과 관계되는 지역, 매개변수 또는 함수&lt;/b&gt;가 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;컴파일 타임에 결정되는데 함수나 지역변수를 많이 가지고 있으면 stack영역을 초과하게 되는데 힙과 비슷하게 이때 &lt;span style=&quot;color: #781b33;&quot;&gt;stackoverflow&lt;/span&gt;에러가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;스레드 (Thread)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프로세스가 할당받은 자원을 이용하는 실행단위&lt;/p&gt;</description>
      <category>Programming/CS</category>
      <author>아트성</author>
      <guid isPermaLink="true">https://artsung410.tistory.com/94</guid>
      <comments>https://artsung410.tistory.com/94#entry94comment</comments>
      <pubDate>Wed, 14 Sep 2022 17:14:51 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] HTTP 모듈의 이해</title>
      <link>https://artsung410.tistory.com/93</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;HTTP란?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하이퍼텍스트를 빠르게 교환하기 위한 &lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;프로토콜의 일종&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;으로, 서버와 클라이언트의 사이에서 어떻게 메시지를 교환할지를 정해 놓은 규칙이다. &lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;요청&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(Request)과 &lt;/span&gt;&lt;span style=&quot;color: #0070c0;&quot;&gt;응답&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(Response)으로 구성되어 있으며, 일반적으로 80번 포트를 사용한다.&amp;nbsp;&lt;/span&gt;&lt;/span&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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;HTTP 모듈&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwqIr9/btrL0UHFzDb/SMFUxGHfZs1HZdEZdT2kc1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwqIr9/btrL0UHFzDb/SMFUxGHfZs1HZdEZdT2kc1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1383&quot; data-origin-height=&quot;484&quot; data-filename=&quot;KakaoTalk_20220914_123533495.jpg&quot; width=&quot;554&quot; height=&quot;194&quot; style=&quot;width: 60.0803%; margin-right: 10px;&quot; data-widthpercent=&quot;60.79&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwqIr9/btrL0UHFzDb/SMFUxGHfZs1HZdEZdT2kc1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwqIr9%2FbtrL0UHFzDb%2FSMFUxGHfZs1HZdEZdT2kc1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1383&quot; height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHmOAV/btrL5zaMPtZ/opSsuxsKVV19ALDhcxYfLk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHmOAV/btrL5zaMPtZ/opSsuxsKVV19ALDhcxYfLk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;753&quot; data-filename=&quot;KakaoTalk_20220914_124746810.jpg&quot; data-widthpercent=&quot;39.21&quot; style=&quot;width: 38.7569%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHmOAV/btrL5zaMPtZ/opSsuxsKVV19ALDhcxYfLk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHmOAV%2FbtrL5zaMPtZ%2FopSsuxsKVV19ALDhcxYfLk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1388&quot; height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;/div&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;font-family: 'Noto Serif KR';&quot;&gt;서버는 클라이언트가 있기에 동작을 한다. 클라이언트에서 서버로 &lt;span style=&quot;color: #ee2323;&quot;&gt;요청&lt;/span&gt;(request)을 보내고, 서버에서는 그 내용을 처리하고 클라이언트에게 &lt;span style=&quot;color: #ee2323;&quot;&gt;응답&lt;/span&gt;(response)을 보낸다. 요청과 응답은 이벤트 방식인데, 클라이언트로부터 어떤 작업을 수행할지 이벤트 리스너를 미리 등록해두어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;createServer&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;요청이 들어올때마다 createServer내부에는 콜백함수가 실행된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;여기서 콜백함수는 매개변수로 &lt;span style=&quot;color: #666666;&quot;&gt;req (&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;요청에 관한 정보)와 res(응답에 관한정보)를 사용한다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한 콜백함수 내에 홈페이지 접속(요청)시 사용할 기능(HTML, Media files) 들을 넣는다.&amp;nbsp;&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 data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;listen&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #3d3d3f; font-family: 'Noto Serif KR';&quot;&gt;서버를 클라이언트 요청 대기 상태(listen)로 만든다.&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;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;http.createServer(&lt;span style=&quot;color: #781b33;&quot;&gt;콜백함수&lt;/span&gt;)&lt;span style=&quot;color: #666666;&quot;&gt;.listen(&lt;/span&gt;&lt;span style=&quot;color: #781b33;&quot;&gt;서비스할 포트번호&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;);&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1663126650585&quot; class=&quot;ebnf&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const http = require('http');&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1663126006156&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http.createServer((req, res) =&amp;gt;
{
	// 함수 내부 구현
})
.listen(8080, ()=&amp;gt;{
	//서버 연결
    console.log('8080번 포트에서 서버 대기중입니다!.');
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1663208519097&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;HTTP | Node.js v14.20.0 Documentation&quot; data-og-description=&quot;HTTP# Source Code: lib/http.js To use the HTTP server and client one must require('http'). The HTTP interfaces in Node.js are designed to support many features of the protocol which have been traditionally difficult to use. In particular, large, possibly c&quot; data-og-host=&quot;nodejs.org&quot; data-og-source-url=&quot;https://nodejs.org/dist/latest-v14.x/docs/api/http.html&quot; data-og-url=&quot;https://nodejs.org/dist/latest-v14.x/docs/api/http.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://nodejs.org/dist/latest-v14.x/docs/api/http.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nodejs.org/dist/latest-v14.x/docs/api/http.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; data-ke-size=&quot;size16&quot;&gt;HTTP | Node.js v14.20.0 Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTTP# Source Code: lib/http.js To use the HTTP server and client one must require('http'). The HTTP interfaces in Node.js are designed to support many features of the protocol which have been traditionally difficult to use. In particular, large, possibly c&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nodejs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;HTTP&amp;nbsp;요청&amp;nbsp;메서드&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220914_121012185.jpg&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CsKaS/btrL5c7N4fC/u0NoP9opAfHfykC3AyeQpk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CsKaS/btrL5c7N4fC/u0NoP9opAfHfykC3AyeQpk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CsKaS/btrL5c7N4fC/u0NoP9opAfHfykC3AyeQpk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCsKaS%2FbtrL5c7N4fC%2Fu0NoP9opAfHfykC3AyeQpk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;235&quot; data-filename=&quot;KakaoTalk_20220914_121012185.jpg&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;731&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;GET &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서버 자원을 가져올때 사용한다. (GET메서드를 사용할 때, 서버에서 가져오는 것이 아니라 캐시에서 가져올 수 있다. / 캐싱이 되면 성능이 좋아짐.)&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;POST &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서버에 자원을 새로 등록하고자 할 때 사용함. / 새로운 사용자를 등록PUT : 서버 자원 -&amp;gt; 요청에 들어있는 자원으로 치환할때 사용&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;PATCH &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서버 자원을 일부만 수정하고자 할 때 사용&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;DELETE&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서버의 자원을 삭제할때 사용&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;OPTIONS&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;요청을 하기 전에 통신옵션을 설명하기 위해 사용&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;HTTP&amp;nbsp;상태코드&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;브라우저는 서버에서 보내주는 상태코드를 보고 요청이 성공했는지 실패했는지를 판단한다. 클라이언트가 요청을 했을 때 서버는 반드시 응답을 해야한다. 요청이 성공했든 실패했든 요청이 마무리되었다는것을 전달해서 클라이언트가 전달받도록 알려주는 역할을 하기도한다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2XX&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;성공을 알리는 상태코드.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|| 200(성공) / 201(작성됨)&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3XX&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다른페이지로 이동을 알리는 상태코드&amp;nbsp; &amp;nbsp; &amp;nbsp;|| 301(영구이동) / 302(임시이동) / 304(수정되지 않음)&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4XX&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;요청 오류를 알리는 상태코드&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|| 400(잘못된 요청) / 401(권한 없음) / 403(금지됨) / 404(찾을 수 없음)&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;5XX&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서보 오류를 알리는 상태코드&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|| 500(내부 서버 오류) / 502(불량 게이트 웨이) / 503(서비스를 사용할 수 없음)&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;HTTP통신의 장점&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;클라이언트 누구든 상관없이 같은 방식으로 서버와 소통할 수 있다. / IOS, 안드로이드, 웹, 다른 서버가 모두 같은 주소로 요청을 보냄 / 즉 서버와 클라이언트가 분리되어있고, 서버를 확장할 때 클라이언트에 구애되지 않는다.&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;쿠키&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;쿠키는 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일이다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증이 유지된다는 특징있다. 쿠키는 클라이언트의 상태 정보를 &lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;로컬에 저장&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;했다가 참조한다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220915_105810984.jpg&quot; data-origin-width=&quot;1848&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJcX6/btrL90mtr42/pMI4uUZDcJtuha2p8wTDW1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJcX6/btrL90mtr42/pMI4uUZDcJtuha2p8wTDW1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJcX6/btrL90mtr42/pMI4uUZDcJtuha2p8wTDW1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJcX6%2FbtrL90mtr42%2FpMI4uUZDcJtuha2p8wTDW1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;149&quot; data-filename=&quot;KakaoTalk_20220915_105810984.jpg&quot; data-origin-width=&quot;1848&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1663208704620&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;HTTP 쿠키 - HTTP | MDN&quot; data-og-description=&quot;HTTP 쿠키(웹 쿠키, 브라우저 쿠키)는 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각입니다. 브라우저는 그 데이터 조각들을 저장해 놓았다가, 동일한 서버에 재 요청 시 저장된 데이&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;HTTP 쿠키 - HTTP | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTTP 쿠키(웹 쿠키, 브라우저 쿠키)는 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각입니다. 브라우저는 그 데이터 조각들을 저장해 놓았다가, 동일한 서버에 재 요청 시 저장된 데이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;세션&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;세션은 쿠키와 달리 세션은&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;서버 측에서 관리&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한다. 서버에서는 세션 ID라는것을 사용하며 브라우저를 종료할 때까지 인증상태를 유지한다.&amp;nbsp; 쿠키보다 보안이 좋다. 그러나 사용자가 마나지면 서버메모리를 많이 차지하게 된다는 단점이 존재한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1663217510175&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;A typical HTTP session - HTTP | MDN&quot; data-og-description=&quot;HTTP와 같은 클라이언트-서버 프로토콜에서, 세션은 다음의 세 가지 과정으로 이루어집니다:&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Session&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Session&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/btZ6OO/hyPMTDNz2d/yUnpgVCdF4quIkeNMf0dH1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Session&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Session&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/btZ6OO/hyPMTDNz2d/yUnpgVCdF4quIkeNMf0dH1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&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;A typical HTTP session - HTTP | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTTP와 같은 클라이언트-서버 프로토콜에서, 세션은 다음의 세 가지 과정으로 이루어집니다:&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Cluster&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;클러스터 모듈은 싱글 프로세스로 동작하는 노드가 CPU 코어를 모두 사용할수있게 해주는 모듈이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;포트를 공유하는 노드 프로세스를 여러개 둘 수 있으므로, 요청이 많이 들어왔을 때 병렬로 실행된 서버의 개수만큼 요청이 분산되게 할수 있다. 즉, &lt;span style=&quot;color: #ef5369;&quot;&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-filename=&quot;KakaoTalk_20220915_112004212.jpg&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;831&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V8Yr1/btrMbxDOp5D/Inz5qUk9BycN2E32Naazk1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V8Yr1/btrMbxDOp5D/Inz5qUk9BycN2E32Naazk1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V8Yr1/btrMbxDOp5D/Inz5qUk9BycN2E32Naazk1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV8Yr1%2FbtrMbxDOp5D%2FInz5qUk9BycN2E32Naazk1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;384&quot; height=&quot;249&quot; data-filename=&quot;KakaoTalk_20220915_112004212.jpg&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;831&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1663208627027&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;HTTP | Node.js v14.20.0 Documentation&quot; data-og-description=&quot;HTTP# Source Code: lib/http.js To use the HTTP server and client one must require('http'). The HTTP interfaces in Node.js are designed to support many features of the protocol which have been traditionally difficult to use. In particular, large, possibly c&quot; data-og-host=&quot;nodejs.org&quot; data-og-source-url=&quot;https://nodejs.org/dist/latest-v14.x/docs/api/http.html&quot; data-og-url=&quot;https://nodejs.org/dist/latest-v14.x/docs/api/http.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://nodejs.org/dist/latest-v14.x/docs/api/http.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nodejs.org/dist/latest-v14.x/docs/api/http.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; data-ke-size=&quot;size16&quot;&gt;HTTP | Node.js v14.20.0 Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTTP# Source Code: lib/http.js To use the HTTP server and client one must require('http'). The HTTP interfaces in Node.js are designed to support many features of the protocol which have been traditionally difficult to use. In particular, large, possibly c&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nodejs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Node.js</category>
      <author>아트성</author>
      <guid isPermaLink="true">https://artsung410.tistory.com/93</guid>
      <comments>https://artsung410.tistory.com/93#entry93comment</comments>
      <pubDate>Wed, 14 Sep 2022 14:20:51 +0900</pubDate>
    </item>
    <item>
      <title>[C#] Unity &amp;amp; Photon을 활용한 서버구축</title>
      <link>https://artsung410.tistory.com/92</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#&amp;nbsp;PUN&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt; [PhotonNetwork]&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;포톤과 관련된 여러가지 기능을 제공 (매치메이킹 / 방 생성 / 방 접속 등등)&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1663057276469&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Photon Unity Networking 2: PhotonNetwork Class Reference&quot; data-og-description=&quot;The main class to use the PhotonNetwork plugin. This class is static. More... static bool&amp;nbsp;ConnectUsingSettings () &amp;nbsp;Connect to Photon as configured in the PhotonServerSettings file. More... &amp;nbsp; static bool&amp;nbsp;ConnectUsingSettings (AppSettings appSettings, bo&quot; data-og-host=&quot;doc-api.photonengine.com&quot; data-og-source-url=&quot;https://doc-api.photonengine.com/en/PUN/v2/class_photon_1_1_pun_1_1_photon_network.html&quot; data-og-url=&quot;https://doc-api.photonengine.com/en/PUN/v2/class_photon_1_1_pun_1_1_photon_network.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://doc-api.photonengine.com/en/PUN/v2/class_photon_1_1_pun_1_1_photon_network.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://doc-api.photonengine.com/en/PUN/v2/class_photon_1_1_pun_1_1_photon_network.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; data-ke-size=&quot;size16&quot;&gt;Photon Unity Networking 2: PhotonNetwork Class Reference&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The main class to use the PhotonNetwork plugin. This class is static. More... static bool&amp;nbsp;ConnectUsingSettings () &amp;nbsp;Connect to Photon as configured in the PhotonServerSettings file. More... &amp;nbsp; static bool&amp;nbsp;ConnectUsingSettings (AppSettings appSettings, bo&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;doc-api.photonengine.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;API&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; - &lt;span style=&quot;color: #f89009;&quot;&gt;ConnectUsingSettings()&lt;/span&gt; : 매치메이킹 서버에 접속한다. (PhotonServerSettings 스크럽터블에서 여러가지 데이터 설정)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; - &lt;span style=&quot;color: #f89009;&quot;&gt;JoinRandomRoom()&lt;/span&gt; : 현재 접속 가능한 방 중 임의로 접속한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; - &lt;span style=&quot;color: #f89009;&quot;&gt;LoadLevel()&lt;/span&gt; : 방에 있는 모든 클라이언트를 특정 씬으로 이동시킨다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; - &lt;span style=&quot;color: #f89009;&quot;&gt;CreateRoom()&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;[MonoBehaviourPunCallbacks]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MonoBehaviour에 PUN과 관련된 콜백 메서드 제공한다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1663057319239&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Photon Unity Networking 2: MonoBehaviourPunCallbacks Class Reference&quot; data-og-description=&quot;This class provides a .photonView and all callbacks/events that PUN can call. Override the events/methods you want to use. More... This class provides a .photonView and all callbacks/events that PUN can call. Override the events/methods you want to use. By&quot; data-og-host=&quot;doc-api.photonengine.com&quot; data-og-source-url=&quot;https://doc-api.photonengine.com/en/PUN/v2/class_photon_1_1_pun_1_1_mono_behaviour_pun_callbacks.html&quot; data-og-url=&quot;https://doc-api.photonengine.com/en/PUN/v2/class_photon_1_1_pun_1_1_mono_behaviour_pun_callbacks.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://doc-api.photonengine.com/en/PUN/v2/class_photon_1_1_pun_1_1_mono_behaviour_pun_callbacks.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://doc-api.photonengine.com/en/PUN/v2/class_photon_1_1_pun_1_1_mono_behaviour_pun_callbacks.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; data-ke-size=&quot;size16&quot;&gt;Photon Unity Networking 2: MonoBehaviourPunCallbacks Class Reference&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This class provides a .photonView and all callbacks/events that PUN can call. Override the events/methods you want to use. More... This class provides a .photonView and all callbacks/events that PUN can call. Override the events/methods you want to use. By&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;doc-api.photonengine.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;[MonoBehaviourPun]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1663057383747&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Photon Unity Networking 2: MonoBehaviourPun Class Reference&quot; data-og-description=&quot;This class adds the property photonView, while logging a warning when your game still uses the networkView. More... Inherits MonoBehaviour. This class adds the property photonView, while logging a warning when your game still uses the networkView.&quot; data-og-host=&quot;doc-api.photonengine.com&quot; data-og-source-url=&quot;https://doc-api.photonengine.com/en/PUN/v2/class_photon_1_1_pun_1_1_mono_behaviour_pun.html&quot; data-og-url=&quot;https://doc-api.photonengine.com/en/PUN/v2/class_photon_1_1_pun_1_1_mono_behaviour_pun.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://doc-api.photonengine.com/en/PUN/v2/class_photon_1_1_pun_1_1_mono_behaviour_pun.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://doc-api.photonengine.com/en/PUN/v2/class_photon_1_1_pun_1_1_mono_behaviour_pun.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; data-ke-size=&quot;size16&quot;&gt;Photon Unity Networking 2: MonoBehaviourPun Class Reference&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This class adds the property photonView, while logging a warning when your game still uses the networkView. More... Inherits MonoBehaviour. This class adds the property photonView, while logging a warning when your game still uses the networkView.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;doc-api.photonengine.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp;- PhotonView 제공&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp;- Photonview 컴포넌트가 추가 되어 있어야함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;[PhotonView]&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&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;figure id=&quot;og_1663057707635&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Photon Unity Networking 2: PhotonView Class Reference&quot; data-og-description=&quot;A PhotonView identifies an object across the network (viewID) and configures how the controlling client updates remote instances. More... Inherits MonoBehaviour. A PhotonView identifies an object across the network (viewID) and configures how the controlli&quot; data-og-host=&quot;doc-api.photonengine.com&quot; data-og-source-url=&quot;https://doc-api.photonengine.com/en/PUN/v2/class_photon_1_1_pun_1_1_photon_view.html&quot; data-og-url=&quot;https://doc-api.photonengine.com/en/PUN/v2/class_photon_1_1_pun_1_1_photon_view.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://doc-api.photonengine.com/en/PUN/v2/class_photon_1_1_pun_1_1_photon_view.html&quot; data-source-url=&quot;https://doc-api.photonengine.com/en/PUN/v2/class_photon_1_1_pun_1_1_photon_view.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('&amp;quot;&amp;quot;');&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;Photon Unity Networking 2: PhotonView Class Reference&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A PhotonView identifies an object across the network (viewID) and configures how the controlling client updates remote instances. More... Inherits MonoBehaviour. A PhotonView identifies an object across the network (viewID) and configures how the controlli&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;doc-api.photonengine.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;- 데이터 동기화는 [IPunObservable.OnPhotonSerializeView()]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;- [IsMine] : 프로퍼티로 로커과 리모트 구분 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;- 기본 제공 컴포넌트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* &lt;span style=&quot;color: #009a87;&quot;&gt;PhotonTransformView&lt;/span&gt; : 트랜스폼 동기화 제공&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* &lt;span style=&quot;color: #009a87;&quot;&gt;PhotonAnimationView&lt;/span&gt; : Animator 동기화 제공&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* &lt;span style=&quot;color: #009a87;&quot;&gt;PhotonRigidbodyView&lt;/span&gt; : 리지드바디 동기화 제공&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/C# | Unity</category>
      <category>photon</category>
      <author>아트성</author>
      <guid isPermaLink="true">https://artsung410.tistory.com/92</guid>
      <comments>https://artsung410.tistory.com/92#entry92comment</comments>
      <pubDate>Tue, 13 Sep 2022 17:29:47 +0900</pubDate>
    </item>
  </channel>
</rss>