<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Nuke Olaf - Log Store</title>
    <link>https://salix97.tistory.com/</link>
    <description>늘 유쾌하게 웃고 있는 올라프처럼, 개발할때도 유쾌하게 웃을 수 있는 실력을 갖기 위해 노력하는 개발자입니다.
개발 업계의 핵과 같은 강력한 성능의 개발자를 지망합니다.</description>
    <language>ko</language>
    <pubDate>Tue, 7 Jul 2026 14:34:12 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>NukeOlaf</managingEditor>
    <image>
      <title>Nuke Olaf - Log Store</title>
      <url>https://tistory1.daumcdn.net/tistory/3441229/attach/c7b7ac15c495462b81340024a2842b98</url>
      <link>https://salix97.tistory.com</link>
    </image>
    <item>
      <title>뱅크샐러드 안드로이드 개발자 채용 지원 및 면접 후기</title>
      <link>https://salix97.tistory.com/289</link>
      <description>&lt;h2&gt;1. 초심자의 행운, 우연스러운 채용팀의 서류합격 연락&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;중간고사 기간, 스승님이 프로그래머스 윈터코딩에 있는 뱅크샐러드 인턴을 넣어보라고 연락이 왔었다. 근데 그게 졸업 예정자만 지원이 가능한거였다. 그것도 모르고 나는 포폴을 30분동안 만들었다. 그래서 만든 포폴이 아까워서 거의 장난반으로 뱅크샐러드 개발자 지원에 포트폴리오를 넣었다. 나는 설마 이게 되겠어..? 라는 안일한 생각으로 그냥 넣어봤던거였는데...&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;일주일 뒤 뱅크샐러드 채용팀에서 연락이 왔다. 내가 경력직 개발자 채용지원에 잘못 지원한 것 같다고, 신입 개발자 채용지원으로 전환하겠냐고 물어봤다. 오 개꿀? 아직 안드로이드를 공부한지 일년정도 밖에 되지 않았고, 나같은 쪼렙이 30분동안 만든 지원서가 합격이라니. &lt;br&gt;&lt;br&gt;사실 조금 놀랐다. 그리고 오히려 뱅크샐러드의 수준을 의심했다. 나보다 훨씬 능력있는 취준생 개발자들이 신입으로 지원을 많이 할텐데 내 보잘것 없는 포폴에 합격을 주다니. 그리고 또 한편으로는 정말 편견없이 사람을 뽑는구나라는 생각도 들었다.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;2. 자신만만했던 사전과제와 합격&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;그렇게 나는 서류합격 통보를 받고 사전과제를 안내 받았다. 사전과제할 때가 중간고사 시험기간이어서 시간을 많이 쓰지 못했다. 그래서 다른 휘황찬란한 기능 같은 건 못하더라도 내가 잘 할 수 있는 것에만 집중하자는 마인드로 밤마다 5~6시간씩 투자해서 3일동안 과제를 완성했다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;여름방학 때 넥스터즈에서 아재트 개발을 마친 뒤로 학교 일이 바빠 안드로이드 개발은 커녕 안드로이드 공부도 전혀 못했다. 거의 두 달만에 코딩을 하니까 갑자기 어색했다. 아, 역시 어떤 공부던지 오랫동안 하지 않으면 실력이 현저하게 떨어지는구나. 그래도 예전에 코딩해놓은 것들도 참고하고 검색도 해가면서 과제를 만들었다. &lt;br&gt;&lt;br&gt;마음에 안드는 부분들도 있었지만, 그래도 꽤 보기 괜찮은 코드가 나온 것 같다. 사전과제는 합격할 것 같다는 근거없는 자신감이 뿜어져나왔다. 사전과제 결과는 역시나 합격이었다. 뱅크샐러드 채용팀과 전화로 대면 인터뷰 일정을 잡았다.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;3. 개발자로서의 진로와 미래 고민&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;사실 이 때, 나는 많은 고민을 안고 있었다.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&quot;안드로이드 개발자로서 계속 성장하고 공부해나가야할 것인가?&quot;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&quot;대학 학위를 위해 학교에서 계속해서 개발과 상관없는 수업을 들어야 할까?&quot;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&quot;만약 붙는다면 학교를 그만두고 뱅크샐러드를 다녀야 할까?&quot;&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;안드로이드 개발을 시작한지는 1년 밖에 안되었지만, 앞으로 내가 계속해서 안드로이드 개발자로 남아있어야할지에 대한 의문이 있었다. 웹프론트나 백엔드 같은 다른 분야 개발의 세계를 전혀 모르기 때문에 그 세계에 대한 궁금함도 남아있었고, 그 분야들을 공부해보고 싶은 욕심도 있었다. 그래서 올 겨울 다양한 사람들과 다양한 경험을 해보려고 준비하고 있었다. 그러던 중 덜컥 뱅크샐러드 채용 프로세스를 진행하게 된 것이다. &lt;br&gt;&lt;br&gt;그래서 김칫국이긴 하지만, 뱅크샐러드에 붙는다면 계속 안드로이드 개발자로서 나의 커리어를 쌓아나가야할지, 떨어지더라도 계속해서 안드로이드를 공부해야할지 많은 고민이 있었다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;그리고 학교, 학교가 문제였다. 개발 관련 네임드 대외활동만해도 4년제 대학교 학위, 또는 &lt;span style=&quot;color: rgb(51, 51, 51);&quot;&gt;어느정도&amp;nbsp;&lt;/span&gt;그에 준하는 자격이 필요한 경우가 많았다. 내가 학교를 그만두고 고졸의 신분으로 취업시장에 뛰어드는 것은 여러모로 리스크가 큰 도전이다. 그리고 나는 체계적인 개발 교육을 제대로 받아본 적이 없었기 때문에 그런 교육 프로그램에 대한 갈증이 있었다. 학교를 그만두기에는 학교에서 복수전공으로 배울 수 있는 컴퓨터 관련 지식마저 절실했다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;그런데 그런 공부를 할 수 있는 물리적인 시간이 너무 부족했다. 현재의 본 전공이 문제였다. 전공에서 하는 수업과 과제들은 내가 정말 하고 싶은것들과 상관없는 것들이다. 내가 정말 하고 싶은 일이 무엇인지 찾았는데, 내 전공은 나의 발목을 잡았다. 전공 과제와 수업들은 시간이 너무 오래 걸리고 그 결과물들은 들인 노력과 시간에 비해 나에게 무의미하게 다가왔다. &lt;br&gt;&lt;br&gt;이렇게 시간낭비하며 내 20대의 2년을 더 보내야한다는 사실이 너무 힘들었다. 학교를 그만두고 싶은 생각도 많이 들었다. 그래서 만약 뱅크샐러드에 합격한다면, 도피성으로 학교를 그만두고 뱅크샐러드로 가서 안드로이드 개발자로서라도 커리어를 시작하고 싶은 마음까지 생기기 시작했다. 정말 안좋은 생각이지만.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;4. 최종 면접, 그리고 내가 애송이라는 것을 깨닫게 됨&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;결론적으로 그런 마음가짐의 나는 면접에서 떨어졌다.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;사실 준비도 일절 하지 않았다. &lt;span style=&quot;color: rgb(51, 51, 51);&quot;&gt;결국 마음 속으로 이런 저런 고민만 잔뜩 하다가 &lt;/span&gt;안드로이드 관련 지식조차 하나도 찾아보지 않고 거의 면접에 놀러가듯이 갔다. 그런데도 면접관들이 내가 면접 준비를 안 한 사실을 모르고 나를 뽑았다면 그것도 그것대로 뱅크샐러드의 미래가 심각하게 어두운거다. 나는 내가 잘 떨어졌다고 생각한다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;면접장에 막 도착했을 땐 머릿속이 정말 하얬다. 별로 기대를 하지 않고 면접 경험을 쌓겠다는 마음으로 간건데, 그래도 긴장되는 건 어쩔 수 없나보다. 그리고 기술질문이 정말 많이 들어왔는데, 어쩜 그리&lt;span style=&quot;color: rgb(51, 51, 51);&quot;&gt; 잘 모르겠는 것들만&amp;nbsp;&lt;/span&gt;쏙쏙 뽑아서 질문하시는지. 하하. 나름 안드로이드 개발에 대한 자신감이 있긴 했지만, 질문 중에 제대로 대답한 건 한 개도 없는 것 같다. 그&lt;span style=&quot;color: rgb(51, 51, 51);&quot;&gt;동안 내가 공부했던 안드로이드 관련 지식을 총 동원했지만 &lt;/span&gt;거의 유체이탈 화법을 사용한 두루뭉술하고 피상적인 대답밖에 하지 못했다. 갑자기 생각하니 조금 부끄럽기도 한데, 면접관분들이 내 보잘것 없는 말주변을 참고 들어주시고 이해하려고 노력해주셔서 조금 감사했다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;붙으려고 면접을 갔다기보다는, 뱅크샐러드가 어떤 회사인지, 실제 회사에서는 어떤 면접을 진행하는지 궁금해서 면접을 가본다는 느낌이긴 했다. 또, 내가 지금까지 공부한 안드로이드 지식에 대해 어느 정도 수준인지 검증하고 싶은 욕구도 있었다. 그래서 불합격했지만 크게 후회는 되지 않는다. 오히려 &lt;span style=&quot;color: rgb(51, 51, 51);&quot;&gt;내 좁은 시야와 낮은 실력을 객관적으로 파악하게 되자 현실이 보이기 시작했다.&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;나는 아직 준비되지 않은 애송이 개발자다. 내가 공부한 1년은 실무에서 실제로 일하기에는 너무나도 짧고 부족했다. 내가 지금까지 개발을 공부한 방법도 문제가 있다는 생각이 들었다. 코드를 효율적으로 잘 쓰는 것도 중요하지만, 안드로이드 개발에 대한 제대로 된 공부와 이해가 부족했다. 요근래 코더와 개발자의 차이에 대한 고민을 많이 하고 있는데, 그동안 내가 한 공부는 개발자가 아니라 &quot;코더&quot;가 되기 위한 공부였다는 생각이 들었다. 지금까지 내 공부의 근본적인 방법부터가 잘못되었다고 느꼈다.&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;5. 앞으로 나는 어떻게 살아야 할 것인가?&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;처음부터 다시 시작할 것이다. 그런 의미에서 먼저, &lt;span style=&quot;color: rgb(51, 51, 51);&quot;&gt;그동안의 실패한 개발 공부와 1년 남짓한 내 인생이 담긴 이 티스토리 블로그를 접으려고 한다. 안드로이드 개발자, &quot;nuke olaf&quot; 라는 다소 중2병스럽고 유치한 이름을 버리고 새로 시작할 것이다. 지금까지 쌓아온 것들이 아깝다는 생각이 들기도 한다. 하지만 뱅크샐러드에서 최종 면접을 진행하면서 뼈저리게 느꼈다. 지금까지 내가 코드 몽키의 길을 착실히 걸어왔다는 사실을. 그렇다고 블로그를 아예 없애진 않을거다. 가끔씩 생각날 때마다 들어와서 잘못된 공부를 하고 있던 과거의 나를 반면교사 삼으며 같은 실수를 반복하지 않으려 노력해야지.&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 51);&quot;&gt;앞으로 내가 안드로이드 개발자가 될지, 뭐가 될지 잘 모르겠다. 하지만 중요한 것은 뱅크샐러드 채용 면접은 나에게 큰 충격을 안겨주었고, 앞으로 내 인생에 있어서 커다란 전환점이 되었다는 사실이다. 한 달정도 생각을 조금 정리하고, 앞으로의 새로운 커리어를 쌓아나갈 것이다. 개발 공부를 처음부터 다시 시작하면서 지금과 같은 실수를 다시 반복하지 않을 것이다.&lt;/span&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 51);&quot;&gt;이제 두 달만 있으면 곧 연말이다. 2020년의 나와는 작별을 준비하고, 새로운 마음으로 다시 시작해야지. 더 높이, 더 크게 성장하기 위해서.&lt;/span&gt;&lt;/p&gt;</description>
      <category>회고록</category>
      <author>NukeOlaf</author>
      <guid isPermaLink="true">https://salix97.tistory.com/289</guid>
      <comments>https://salix97.tistory.com/289#entry289comment</comments>
      <pubDate>Fri, 6 Nov 2020 22:02:54 +0900</pubDate>
    </item>
    <item>
      <title>연쇄율과 음함수 미분</title>
      <link>https://salix97.tistory.com/288</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 연쇄율&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;연쇄율 = 합성함수 의 미분&lt;/p&gt;
&lt;p&gt;① $(\sin ax)^{\prime}=a\cos ax$&lt;/p&gt;
&lt;p&gt;$(\cos ax)^{\prime}=-a\sin ax$&lt;/p&gt;
&lt;p&gt;$(\tan ax)^{\prime}=a\sec^{2} ax$&lt;/p&gt;
&lt;p&gt;$(\sec ax)^{\prime}=a\sec ax\tan ax$&lt;/p&gt;
&lt;p&gt;② $(e^{ax})^{\prime}=ae^{ax}$&lt;/p&gt;
&lt;p&gt;$(\cosh ax)^{\prime}=a\sinh ax$&lt;/p&gt;
&lt;p&gt;$(\sinh ax)^{\prime}=a\cosh ax$&lt;/p&gt;
&lt;p&gt;③ $(e^{f(x)})^{\prime}=-f^{\prime}(x)e^{f(x)}$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 음함수 미분&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;$y=f(x)$ 이외의 $x$와 $y$가 혼재된 형태의 함수가 있을 수 있다.&lt;/p&gt;
&lt;p&gt;방정식 $g(x,y)$에서 $x$의 변역 $X$와 $y$의 변역 $Y$가 존재해서 방정식 $g(x,y)=0$을 대응으로 하는 함수 $f:X \rightarrow Y$가 정의&lt;/p&gt;
&lt;p&gt;$\Leftrightarrow$ 방정식 $g(x,y)=0$ 은 함수 $f$를 음적으로 정의한다.&lt;/p&gt;
&lt;p&gt;$\Leftrightarrow$ $y=f(x):x$ 의 음함수(implicit function)&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/CHGDh/btqKNoiROIB/ulKKzmkgZvTQMgDt0K14h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CHGDh/btqKNoiROIB/ulKKzmkgZvTQMgDt0K14h0/img.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;500&quot; style=&quot;width: 44.5085%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CHGDh/btqKNoiROIB/ulKKzmkgZvTQMgDt0K14h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCHGDh%2FbtqKNoiROIB%2FulKKzmkgZvTQMgDt0K14h0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ILPNc/btqKOBa84Mw/YnQ7tJZLhPRYbiFwk0Ype0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ILPNc/btqKOBa84Mw/YnQ7tJZLhPRYbiFwk0Ype0/img.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;500&quot; style=&quot;width: 54.3287%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ILPNc/btqKOBa84Mw/YnQ7tJZLhPRYbiFwk0Ype0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FILPNc%2FbtqKOBa84Mw%2FYnQ7tJZLhPRYbiFwk0Ype0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;$y=\ln x$ 의 도함수&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;$$y=\ln x\\ \Rightarrow e^{y}=e^{\ln x}=x\\ \Rightarrow 양변\ 음함수\ 미분\\ \Rightarrow e^{y}y^{\prime}=1\\ \Rightarrow y^{\prime}=\frac{1}{e^{y}}=\frac{1}{x},\ x&amp;gt;0$$&lt;/p&gt;
&lt;p&gt;④ $y=\ln (f(x))$, $(f(x))&amp;gt;0)$ 의 도함수&lt;/p&gt;
&lt;p&gt;$\\Rightarrow$ $(\\ln (f(x)))^{\\prime}=\\frac{f^{\\prime}(x)}{f(x)}$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;일반적인 지수함수 $y=f(x)^{g( x)}$ 의 미분&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSSLgr/btqKTGB65Bg/OMmMFgUUEv1EFriDfKVxF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSSLgr/btqKTGB65Bg/OMmMFgUUEv1EFriDfKVxF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSSLgr/btqKTGB65Bg/OMmMFgUUEv1EFriDfKVxF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSSLgr%2FbtqKTGB65Bg%2FOMmMFgUUEv1EFriDfKVxF1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Mathematics</category>
      <author>NukeOlaf</author>
      <guid isPermaLink="true">https://salix97.tistory.com/288</guid>
      <comments>https://salix97.tistory.com/288#entry288comment</comments>
      <pubDate>Wed, 14 Oct 2020 02:32:42 +0900</pubDate>
    </item>
    <item>
      <title>도함수와 미분법 - 미분 공식 정리</title>
      <link>https://salix97.tistory.com/287</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 접선과 도함수&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIO1kl/btqKLE0MTwW/HzClqAfl4N0T1lWJjMZIz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIO1kl/btqKLE0MTwW/HzClqAfl4N0T1lWJjMZIz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIO1kl/btqKLE0MTwW/HzClqAfl4N0T1lWJjMZIz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIO1kl%2FbtqKLE0MTwW%2FHzClqAfl4N0T1lWJjMZIz0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;① $f^{\prime}(a)$ : $x=a$ 에서의 미분 계수&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : $x=a$ 에서의 순간 변화율 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : $(a,f(a))$ 에서의 접선의 기울기&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;② 우변의 극한이 존재 $\Leftrightarrow$ $f(x)$ : $x=a$ 에서 미분 가능&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;미분 가능성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;$f(x)$ : $x=a$ 에서 미분 가능 $\Rightarrow$ $f(x)$ : $x=a$ 에서 연속&lt;/p&gt;
&lt;p&gt;그러나, 역은 성립하지 않는다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;도함수를 구한다 = 미분한다&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;$$f^{\prime}(x)=\lim_{h\to0}\frac{f(a+h)-f(a)}{h}\Rightarrow f^{\prime}(x)=\lim_{h\to0}\frac{f(x+h)-f(x)}{h}$$&lt;/p&gt;
&lt;p&gt;-&amp;gt;&amp;nbsp;&amp;nbsp;$y=f(x)$ 의 도함수&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 미분법&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DDlye/btqKSV0Cg1W/2zfDi40wHUP0WJkvDDkonK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DDlye/btqKSV0Cg1W/2zfDi40wHUP0WJkvDDkonK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DDlye/btqKSV0Cg1W/2zfDi40wHUP0WJkvDDkonK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDDlye%2FbtqKSV0Cg1W%2F2zfDi40wHUP0WJkvDDkonK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;삼각함수의 도함수&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;① $(\sin x)^{\prime}=\cos x$&lt;/p&gt;
&lt;p&gt;② $(\cos x)^{\prime}=-\sin x$&lt;/p&gt;
&lt;p&gt;③ $(\tan x)^{\prime}=\sec^{2} x$&lt;/p&gt;
&lt;p&gt;④ $(\sec x)^{\prime}=\sec x\tan x$&lt;/p&gt;
&lt;p&gt;⑤ $(\cot x)^{\prime}=-\csc^{2}x$&lt;/p&gt;
&lt;p&gt;⑥ $(\csc x)^{\prime}=-\csc x\cot x$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;지수함수의 도함수&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;$$(e^{x})^{\prime} =\lim_{h \to 0}\frac{f(x+h)-f(x)}{h}\\ =\lim_{h \to 0}\frac{e^{x+h}-e^{x}}{h}\\ =\lim_{h \to 0}\frac{e^{x}(e^{h}-1)}{h}=e^{x}$$&lt;/p&gt;
&lt;p&gt;지수함수의 도함수는 자기 자신이다 = 지수함수의 미분은 자기 자신이다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;쌍곡선함수의 도함수&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;$(\cosh x)^{\prime}=\sinh x$&lt;/p&gt;
&lt;p&gt;$(\sinh x)^{\prime}=\cosh x$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;고계 도함수&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bODYaW/btqKTGhNHGO/JP76CmqOkO1wFL0ENN7br1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bODYaW/btqKTGhNHGO/JP76CmqOkO1wFL0ENN7br1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bODYaW/btqKTGhNHGO/JP76CmqOkO1wFL0ENN7br1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbODYaW%2FbtqKTGhNHGO%2FJP76CmqOkO1wFL0ENN7br1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;3계 도함수까지는 프라임 기호(&lt;span data-reactroot=&quot;&quot;&gt;\prime&lt;/span&gt;)를 붙이지만, &lt;br /&gt;4계부터는 지수 자리의 괄호 안에 미분의 횟수를 적는다.&lt;/p&gt;
&lt;p&gt;$$y^{(n)}=f^{(n)}(x)$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;*** $\dfrac{\mathrm{d}y}{\mathrm{d}x}$&amp;nbsp; 연산자 사용하여 고계도함수 표현하기 ***&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;$$f^{\prime \prime}(x)=f^{(2)}(x)=\dfrac{\mathrm{d}(y)^{\prime}}{\mathrm{d}x}=\dfrac{\mathrm{d}}{\mathrm{d}x}(\dfrac{\mathrm{d}y}{\mathrm{d}x})=\dfrac{\mathrm{d}^{2}y}{\mathrm{d}x^{2}}$$&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Mathematics</category>
      <author>NukeOlaf</author>
      <guid isPermaLink="true">https://salix97.tistory.com/287</guid>
      <comments>https://salix97.tistory.com/287#entry287comment</comments>
      <pubDate>Wed, 14 Oct 2020 02:15:23 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 클래스와 객체란 무엇인가?</title>
      <link>https://salix97.tistory.com/286</link>
      <description>&lt;p&gt;기말고사 대비 겸 수업에서 배운 클래스와 객체에 대해 정리해보았다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;0. 객체지향 프로그래밍&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;클래스와 객체에 대해 이야기 하기 전에, 먼저 객체 지향에 대해 간단하게 생각해 보자.&lt;/p&gt;
&lt;p&gt;C++ 는 객체지향 언어이다. 그래서 C++ 언어를 사용하면 객체지향 프로그래밍을 할 수 있다. 물론, 객체지향 언어를 이용해 절차지향 프로그램을 만들거나 다른 프로그래밍 패러다임을 사용한 프로그램을 만들 수 있다. C++ 언어 자체는 객체를 만들 수 있는, 객체지향 프로그래밍에 적합하게 설계된 언어라는 것이 중요하다.&lt;/p&gt;
&lt;p&gt;객체지향 프로그래밍&lt;span style=&quot;color: #333333;&quot;&gt;(Object-Oriented Programming)&lt;/span&gt;에서는 클래스와 객체가 핵심이며, 매우 중요한 개념이다. 객체지향 프로그래밍은 클래스를 통해 객체를 만들고, 만들어진 객체를 사용하는 프로그램을 만드는 것이기 때문이다. 그렇기 때문에 객체지향 프로그래밍을 하기 위해서는 클래스와 객체가 무엇이며, 왜 사용하는지, 어떻게 사용하는지 알고 있어야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 클래스(class)란?&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;클래스는 &lt;b&gt;추상 자료형(ADT, Abstract Data Type)을 표현하기 위해 사용되는 표현 방법&lt;/b&gt;이다. 지금까지 우리가 공부했던 자료형(Data Type)인&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;int, char, boolean 과 같은 것들은 원시 자료형(Primitive Data Type) 또는 기본 자료형이라고 한다. 그런데, 만약 &lt;u&gt;원시 자료형보다 더 복잡한 개념을 가진 변수가 필요하다면 어떻게 해야할까?&lt;/u&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;내가 멋진 게임 개발자가 되어 카트라이더라는 레이싱 게임을 만드는 상황을 예로 들어보겠다. 카트라이더에는 플레이어가 탑승하여 경주하는 자동차인 &quot;카트&quot;가 있다. 카트마다 이름도 다르고, 속도도, 색상도 모두 제각각이다. 하지만, 모든 카트에는 &quot;이름&quot;과 &quot;속도&quot;와 &quot;색상&quot;이라는 속성이 존재한다. 매번 카트를 만들 때마다 이름과 속도와 속성을 작성하는 것보다, 이 공통된 속성을 하나로 모아 하나의 자료형으로 만들면 편하지 않을까?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRXKT6/btqKxk2lJNg/uapArrk3D62Vno38y953n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRXKT6/btqKxk2lJNg/uapArrk3D62Vno38y953n1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRXKT6/btqKxk2lJNg/uapArrk3D62Vno38y953n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRXKT6%2FbtqKxk2lJNg%2FuapArrk3D62Vno38y953n1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이런 생각을 코드로 구현해보면 다음과 같다. 나는 Cart 라는 내가 정의한 자료형을 사용하여 cart1, cart2, cart3 라는 변수들을 만들어냈다. 여기서 &lt;b&gt;Cart 라는 이름의 자료형&lt;/b&gt;이 바로 &lt;span style=&quot;background-color: #f3c000; color: #000000;&quot;&gt;&lt;b&gt;클래스&lt;/b&gt;&lt;/span&gt;이고, &lt;b&gt;cart1, cart2, cart3 이라는 이름으로 초기화된 변수들&lt;/b&gt;이 바로 &lt;span style=&quot;background-color: #f3c000; color: #000000;&quot;&gt;&lt;b&gt;객체&lt;/b&gt;&lt;/span&gt;이다.&lt;/p&gt;
&lt;p&gt;클래스는 이렇게 사용자가 정의한 자료형이기 때문에 기본 타입과 구별하기 위해 &lt;b&gt;사용자 정의형(user defined type)&lt;/b&gt;이라고도 부른다. 사실 클래스 뿐만 아니라 C언어에서 공부한 구조체, 공용체, typedef 도 모두 새로운 타입을 만드는 것이므로 이것들도 모두 사용자 정의형이다. 사용자 정의형은 int, char, boolean 과 같은 기본 타입과 마찬가지로 &lt;u&gt;새로운 타입일 뿐, 메모리에 저장된 변수가 아니다.&lt;/u&gt; 그렇기 때문에 int a; 로 타입을 통해 변수를 선언하는 것처럼 클래스를 통해 객체를 선언하고 초기화해주어야만 객체를 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;600&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpOfbF/btqKBQeSjtZ/SALq0KCAwIhyEqXyk9FEQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpOfbF/btqKBQeSjtZ/SALq0KCAwIhyEqXyk9FEQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpOfbF/btqKBQeSjtZ/SALq0KCAwIhyEqXyk9FEQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpOfbF%2FbtqKBQeSjtZ%2FSALq0KCAwIhyEqXyk9FEQ0%2Fimg.png&quot; width=&quot;600&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 클래스를 사용하는 방법&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;클래스는 속성(attribute)과 메서드(method)로 이루어져 있다. 위의 카트라이더 예시에서 Cart 클래스를 만드는 경우를 아래와 같이 생각해볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FDza8/btqKC9ZzoNK/Eiufo9pkrNKHSeEKoYkkp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FDza8/btqKC9ZzoNK/Eiufo9pkrNKHSeEKoYkkp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FDza8/btqKC9ZzoNK/Eiufo9pkrNKHSeEKoYkkp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFDza8%2FbtqKC9ZzoNK%2FEiufo9pkrNKHSeEKoYkkp1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;클래스의 속성은 name, color, speed 이고, 클래스의 메서드는 start, stop, drift 이다. 위와 같이 클래스의 속성과 메서드는 변수와 함수로 표현된다. 속성은 어떤 값을 저장하는 역할을 하기 때문에 변수로 표현되고, 메서드는 기능적인 측면을 표현하는 것이므로 함수로 표현되는 것이다. 클래스 내의 변수와 함수들은 멤버 변수, 멤버 함수라고 부른다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(1) 클래스의 객체를 생성했을 때의 메모리 구조&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;클래스의 객체를 생성하면, 객체의 멤버 변수들은 개별적으로 메모리에 생성된다. 그러나, &lt;u&gt;클래스의 멤버 함수는 객체의 개수에 관계 없이 단 하나만 생성된다.&lt;/u&gt; 멤버 함수를 호출할 때마다 내부적으로 멤버 함수를 호출하는 객체의 주소값을 넘겨 사용하기 때문에 멤버 함수는 어떤 객체의 멤버 변수를 변경해야할 지 알 수 있다. 그래서 클래스의 멤버 함수는 객체의 개수에 상관 없이 단 하나만 생성된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(2) public 과 private&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;객체지향 프로그래밍은 데이터 캡슐화(encapsulation) 라는 특징을 지닌다. 캡슐화는 객체의 속성과 행위를 하나로 묶고, 객체가 가진 데이터를 외부로부터 감춰 은닉하는 것이다. 데이터를 안전하게 보호하는, 정보 은닉(information hiding)을 위해 클래스 내의 멤버를 외부로부터 감추는 것은 캡슐화의 중요한 특징이다.&lt;/p&gt;
&lt;p&gt;하지만 객체가 어떤 기능을 수행하기 위해서 특정한 데이터를 외부에 노출시켜야 하는 경우가 있다. 그래서 클래스는 자신의 멤버들을 보호할 대상과 외부로 공개할 대상으로 나누어 설정할 수 있어야 한다. C++ 에서는 외부에 공개할 멤버는 public 으로, 외부로부터 접근을 차단할 멤버는 private 으로 구분한다.&lt;/p&gt;
&lt;p&gt;만약 클래스 내의 멤버들에 대해 private 과 public 을 명시하지 않는다면, 모두 private 으로 간주된다.&lt;/p&gt;
&lt;pre id=&quot;code_1602428554332&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Person {
    private :
        string name;
        int height;
        int weight;
    
    public : 
        void Print() { 
        	cout &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &quot; is &quot; &amp;lt;&amp;lt; height &amp;lt;&amp;lt; &quot;cm tall and weighs &quot; 
            	&amp;lt;&amp;lt; weight &amp;lt;&amp;lt; &quot;kg.&quot; &amp;lt;&amp;lt; endl; 
        }
        void Change(int a, int b) { height = a; weight = b; }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 예제의 Person 클래스는 멤버 변수들이 모두 private 으로 설정되어있고, 멤버 함수들은 모두 public 으로 설정되어 있다. 이제 외부에서는 Person 클래스의 객체의 멤버변수에 접근할 수 없지만, Print() 함수나 Change() 함수에는 접근할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(3) 구조체(struct)와 클래스(class)&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;구조체는 클래스와 같은 사용자 정의형(user defined type)이다. C에서의 구조체는 private 이나 &lt;span style=&quot;color: #333333;&quot;&gt;public&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;과 같은 개념이 없이 무조건 외부 접근을 허용한다. 그러나, C++에서의 구조체는 C에서의 구조체의 개념이 확장되어 구조체에서도 private과 public을 지정하고, 구조체를 클래스의 개념과 거의 동일하게 사용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다만, 클래스와 달리 구조체에서는 &lt;span style=&quot;color: #333333;&quot;&gt;private 과 public 을 명시하지 않는다면 구조체 내의 멤버들이 private 으로 간주된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602429322478&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Person {
	string name;   
    private :
        int height;
        int weight;
    
    public : 
        void Print() { 
        	cout &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &quot; is &quot; &amp;lt;&amp;lt; height &amp;lt;&amp;lt; &quot;cm tall and weighs &quot; 
            	&amp;lt;&amp;lt; weight &amp;lt;&amp;lt; &quot;kg.&quot; &amp;lt;&amp;lt; endl; 
        }
        void Change(int a, int b) { height = a; weight = b; }
};

struct Person {
 	string name;
    private :
        int height;
        int weight;
    
    public : 
        void Print() { 
        	cout &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &quot; is &quot; &amp;lt;&amp;lt; height &amp;lt;&amp;lt; &quot;cm tall and weighs &quot; 
            	&amp;lt;&amp;lt; weight &amp;lt;&amp;lt; &quot;kg.&quot; &amp;lt;&amp;lt; endl; 
        }
        void Change(int a, int b) { height = a; weight = b; }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 예제에서 클래스 Person 과 구조체 Person 은 동일하게 사용될 수 있다. 다만, 클래스의 name 변수의 경우 private 으로 간주되어 외부에서 접근할 수 없으며, 구조체의 name 변수의 경우 public 으로 간주되어 외부에서 접근하여 값을 수정할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(4) 객체의 생성과 생성자(constructor),&amp;nbsp;&lt;/b&gt;&lt;b&gt;객체의 소멸과 소멸자(destructor)&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;생성자(constructor) 란, 클래스 객체를 생성할 때, 객체의 멤버 변수를 초기화하는 함수이다. 생성자는 객체 생성시 반드시 한 번만 호출된다. 생성자는 일종의 멤버 함수이다. 그래서 함수와 비슷한 특징을 가지며, 생성자 오버로딩을 통해 다양한 생성자를 만들 수 있다. 생성자의 이름은 클래스의 이름과 같다.&lt;/p&gt;
&lt;p&gt;소멸자(destructor) 란, 객체가 소멸될 때 호출되는 함수이다. 생성자와 마찬가지로 객체가 사라질 때 반드시 한 번만 호출된다. 객체가 소멸되는 시점은 일반 변수의 생명주기에서의 변수 소멸시점과 동일하다. 객체가 지역변수일 경우에는 해당 지역(함수 또는 블록)의 수행이 완료되고 반환될때 소멸된다. 객체가 전역변수일 경우에는 프로그램이 종료될 때 소멸된다. 소멸자의 이름은 클래스의 이름과 동일하나, 생성자와의 구별을 위해 이름 앞에 '~' 문자가 붙는 것이 특징이다.&lt;/p&gt;
&lt;p&gt;소멸자는 동적할당 메모리를 해제하거나, 임시 메모리를 지우기 위해 주로 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1602429642886&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class CPoint {
    private :
        int x;
        int y;
    
    public :
        CPoint(int a, int b) { x = a; y = b; cout &amp;lt;&amp;lt; &quot;constructor1:&quot;; Print(); }
        CPoint(int a) { x = a; y = 0; cout &amp;lt;&amp;lt; &quot;constructor2:&quot;; Print(); }
        ~CPoint() { cout &amp;lt;&amp;lt; &quot;destructor:&quot;; Print(); }
        void Print() { cout &amp;lt;&amp;lt; &quot;(&quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &quot;, &quot; &amp;lt;&amp;lt; y &amp;lt;&amp;lt; &quot;)&quot; &amp;lt;&amp;lt; endl; }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(5) 생성자와 소멸자의 호출 순서&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;생성자의 경우 &lt;b&gt;전역 객체 생성자 -&amp;gt; 지역 객체 생성자&amp;nbsp;&lt;/b&gt;순으로 호출된다.&lt;/p&gt;
&lt;p&gt;소멸자의 경우 생성자의 호출 순서의 역순으로 수행된다. 객체가 스택(LIFO)에 쌓이는 방식으로 동작하기 때문이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 클래스 사용 예시&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1602430453666&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

class Person {
    private :
        string name;
        int height;
        int weight;
    
    public : 
        Person(string a, int b, int c) { name = a; height = b; weight = c; }
        ~Person() { cout &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &quot; died.&quot; &amp;lt;&amp;lt; endl; }
        void Print() {  
        	cout &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &quot; is &quot; &amp;lt;&amp;lt; height &amp;lt;&amp;lt; &quot;cm tall and weighs &quot; 
        	&amp;lt;&amp;lt; weight &amp;lt;&amp;lt; &quot;kg.&quot; &amp;lt;&amp;lt; endl; 
        }
        void Change(int a, int b) { height = a; weight = b; }
};

int main(void) {
    Person P1(&quot;Kim Byung-Gi&quot;, 180, 70);
    Person P2(&quot;Park Hye-Young&quot;, 160, 50);

    P1.Print();
    P2.Print();
    P1.Change(185, 75);
    P1.Print();
    
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;출력 결과&lt;/p&gt;
&lt;pre id=&quot;code_1602430538716&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Kim Byung-Gi is 180cm tall and weighs 70kg.
Park Hye-Young is 160cm tall and weighs 50kg.
Kim Byung-Gi is 185cm tall and weighs 75kg.
Park Hye-Young died.
Kim Byung-Gi died.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt;참고 : 기초를 탄탄하게 세워주는 C++ 프로그래밍 입문 (황준하, 김성영 지음)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/[C++]</category>
      <author>NukeOlaf</author>
      <guid isPermaLink="true">https://salix97.tistory.com/286</guid>
      <comments>https://salix97.tistory.com/286#entry286comment</comments>
      <pubDate>Mon, 12 Oct 2020 00:29:59 +0900</pubDate>
    </item>
    <item>
      <title>[Arduino] 아두이노 LED 제어</title>
      <link>https://salix97.tistory.com/285</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;LedControl.gif&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UygIW/btqKwQUCF13/H7sFuTkTCyRd5V5YkfZTa0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UygIW/btqKwQUCF13/H7sFuTkTCyRd5V5YkfZTa0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UygIW/btqKwQUCF13/H7sFuTkTCyRd5V5YkfZTa0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/UygIW/btqKwQUCF13/H7sFuTkTCyRd5V5YkfZTa0/img.gif&quot; data-filename=&quot;LedControl.gif&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1602411995813&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setup() {
  pinMode(8, OUTPUT);
}

void loop() {
  digitalWrite(8, HIGH);
  delay(1000);
  digitalWrite(8, LOW);
  delay(1000);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;아두이노의 Hello World! 인 LED 제어를 해보았다.&lt;/p&gt;
&lt;p&gt;8번 핀을 출력모드로 설정하고, 1초 주기로 HIGH 신호와 LOW 신호를 번갈아가며 출력한다. 전원은 5V 핀으로 출력하고 220&lt;span&gt;&amp;Omega;&lt;/span&gt; 저항을 사용하여 전압을 2V로 다운시켰다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;저항 값 = (입력전압(5)V - 구동전압(2)V / 구동전류(0.020)A = 150&amp;Omega;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;* Arduino Uno R3 보드 사용&lt;/p&gt;</description>
      <category>Arduino</category>
      <author>NukeOlaf</author>
      <guid isPermaLink="true">https://salix97.tistory.com/285</guid>
      <comments>https://salix97.tistory.com/285#entry285comment</comments>
      <pubDate>Sun, 11 Oct 2020 19:33:27 +0900</pubDate>
    </item>
    <item>
      <title>[Arduino] 아두이노 포트 인식 안될 때 해결방법 (윈도우)</title>
      <link>https://salix97.tistory.com/284</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 문제상황&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;b&gt; 아두이노 스케치를 다운받아 실행했는데, 아래와 같이 포트가 정상적으로 연결되지 않고, 회색으로 비활성화 됨.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lbAKV/btqKDaX0skD/J3plShRxoKKFgcB4tyW8Ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lbAKV/btqKDaX0skD/J3plShRxoKKFgcB4tyW8Ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lbAKV/btqKDaX0skD/J3plShRxoKKFgcB4tyW8Ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlbAKV%2FbtqKDaX0skD%2FJ3plShRxoKKFgcB4tyW8Ck%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 해결방법&lt;/b&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;(1) 아래의 사이트에 접속하여 OS 에 맞는 드라이버를 설치한다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.ftdichip.com/Drivers/VCP.htm&quot;&gt;http://www.ftdichip.com/Drivers/VCP.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;700&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cddThy/btqKBOnmT9x/XYFK1phgbl8zKK3h2GSv8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cddThy/btqKBOnmT9x/XYFK1phgbl8zKK3h2GSv8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cddThy/btqKBOnmT9x/XYFK1phgbl8zKK3h2GSv8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcddThy%2FbtqKBOnmT9x%2FXYFK1phgbl8zKK3h2GSv8k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;700&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(2) 설치한 드라이버의 압축을 해제한 뒤, &lt;span&gt;C:\Program Files (x86)\Arduino\drivers 폴더로 옮긴다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdNRHM/btqKwrNV4GQ/DBbpRjzFczfhzX4xEKr8A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdNRHM/btqKwrNV4GQ/DBbpRjzFczfhzX4xEKr8A0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdNRHM/btqKwrNV4GQ/DBbpRjzFczfhzX4xEKr8A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdNRHM%2FbtqKwrNV4GQ%2FDBbpRjzFczfhzX4xEKr8A0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(3) 제어판 &amp;gt; 하드웨어 및 소리 &amp;gt; 장치 관리자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;700&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/twOI3/btqKv8HQWtN/hswksLteoWq5VLVj4P1kb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/twOI3/btqKv8HQWtN/hswksLteoWq5VLVj4P1kb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/twOI3/btqKv8HQWtN/hswksLteoWq5VLVj4P1kb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtwOI3%2FbtqKv8HQWtN%2FhswksLteoWq5VLVj4P1kb1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;700&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;(4) 장치 관리자에서 USB Composite Device 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;700&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqBdel/btqKDaX0vpD/zuwiY6wlQ25x8VwI2bR7o0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqBdel/btqKDaX0vpD/zuwiY6wlQ25x8VwI2bR7o0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqBdel/btqKDaX0vpD/zuwiY6wlQ25x8VwI2bR7o0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqBdel%2FbtqKDaX0vpD%2FzuwiY6wlQ25x8VwI2bR7o0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;700&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(5) 드라이버 업데이트 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6rNKb/btqKBP7FBjC/Eoe1qHdfcjZ74PmHXMFjxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6rNKb/btqKBP7FBjC/Eoe1qHdfcjZ74PmHXMFjxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6rNKb/btqKBP7FBjC/Eoe1qHdfcjZ74PmHXMFjxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6rNKb%2FbtqKBP7FBjC%2FEoe1qHdfcjZ74PmHXMFjxk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(6) 컴퓨터에서 드라이버 소프트웨어 검색 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQ7yDP/btqKABV5tEY/r0Ia8RXMev4SPuui5HSRX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQ7yDP/btqKABV5tEY/r0Ia8RXMev4SPuui5HSRX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQ7yDP/btqKABV5tEY/r0Ia8RXMev4SPuui5HSRX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQ7yDP%2FbtqKABV5tEY%2Fr0Ia8RXMev4SPuui5HSRX0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(7) 컴퓨터의 사용 가능한 드라이버 목록에서 직접선택 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0OeDU/btqKxlzHSKb/H6oAIpuyXuusPLkBTLDqFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0OeDU/btqKxlzHSKb/H6oAIpuyXuusPLkBTLDqFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0OeDU/btqKxlzHSKb/H6oAIpuyXuusPLkBTLDqFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0OeDU%2FbtqKxlzHSKb%2FH6oAIpuyXuusPLkBTLDqFK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(8) 디스크 있음 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3qqFc/btqKBPNkstF/eS7YJe9CkKiXoljVVKgh80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3qqFc/btqKBPNkstF/eS7YJe9CkKiXoljVVKgh80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3qqFc/btqKBPNkstF/eS7YJe9CkKiXoljVVKgh80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3qqFc%2FbtqKBPNkstF%2FeS7YJe9CkKiXoljVVKgh80%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;(9) 찾아보기 클릭한 다음, ftdiport 선택하고 열기 버튼 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbvh78/btqKxQGeB7M/Rxc4TFitURXB3amoH7k7r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbvh78/btqKxQGeB7M/Rxc4TFitURXB3amoH7k7r0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbvh78/btqKxQGeB7M/Rxc4TFitURXB3amoH7k7r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcbvh78%2FbtqKxQGeB7M%2FRxc4TFitURXB3amoH7k7r0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkkKGn/btqKxl7vTGB/1mBj2fy7FsOmAvXir9xIv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkkKGn/btqKxl7vTGB/1mBj2fy7FsOmAvXir9xIv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkkKGn/btqKxl7vTGB/1mBj2fy7FsOmAvXir9xIv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkkKGn%2FbtqKxl7vTGB%2F1mBj2fy7FsOmAvXir9xIv1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;(10) 아두이노를 분리한뒤 다시 연결&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;출처 : &lt;a href=&quot;http://southbrilliance.blogspot.com/2017/10/blog-post.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;southbrilliance.blogspot.com/2017/10/blog-post.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>Arduino</category>
      <author>NukeOlaf</author>
      <guid isPermaLink="true">https://salix97.tistory.com/284</guid>
      <comments>https://salix97.tistory.com/284#entry284comment</comments>
      <pubDate>Sun, 11 Oct 2020 06:21:16 +0900</pubDate>
    </item>
    <item>
      <title>[C언어] 연결리스트(링크드 리스트) 구현하기</title>
      <link>https://salix97.tistory.com/283</link>
      <description>&lt;p&gt;연결리스트(링크드 리스트)는 프로그래밍에서 쓰이는 자료구조 중 하나이다. &lt;span style=&quot;color: #333333;&quot;&gt;메모리 공간인 &lt;/span&gt;노드(Node)에 데이터와 포인터를 저장한다. 노드들이 한 줄로 연결되어있는 방식으로 데이터를 저장한다. 연결 리스트는 자료의 추가 삭제가 단 시간에 가능하다는 장점이 있다. 대신, 배열이나 트리에 비해 데이터를 검색하는데 시간이 오래 걸린다는 단점이 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. addrear() 함수를 이용한 단일 연결 리스트 구현&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbtIK9/btqJizlAI4x/o2MVTMZYPyZKJDuxhIaBGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbtIK9/btqJizlAI4x/o2MVTMZYPyZKJDuxhIaBGk/img.png&quot; data-alt=&quot;단일 연결 리스트의 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbtIK9/btqJizlAI4x/o2MVTMZYPyZKJDuxhIaBGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbtIK9%2FbtqJizlAI4x%2Fo2MVTMZYPyZKJDuxhIaBGk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;단일 연결 리스트의 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;리스트의 마지막에 노드를 추가하는 addrear() 함수를 만들어보자.&lt;/p&gt;
&lt;pre id=&quot;code_1600791472575&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

// 연결 리스트를 구성할 Node 구조체
struct Node {
	int data;			// 노드에 저장할 데이터
	struct Node *next;	// 현재 노드의 다음 노드 포인터
};

struct Node *pStart = NULL;	// 리스트의 첫 노드의 포인터
struct Node *pEnd = NULL;	// 리스트의 마지막 노드의 포인터

void addrear(int val)
{
	struct Node *Current;	// 리스트에 추가할 새 노드 생성
	Current = (struct Node *) malloc(sizeof(struct Node));
	Current-&amp;gt;data = val;	// 새 Node data 필드에 val 을 저장
	Current-&amp;gt;next = NULL;	// 리스트 마지막에 추가할 노드이므로 다음 노드 없음

	if(pStart == NULL)		// 첫 번째 노드일 경우
		pStart = pEnd = Current;
	else {
		pEnd-&amp;gt;next = Current;	// 마지막 노스트 다음에 새로 만든 노드 추가
		pEnd = Current;		// 리스트 마지막에 추가하는 것이므로 pEnd 를 바꿔줌
	}
}

void printlist(struct Node *Current)
{
	// Current 가 가리키는 리스트를 출력한다.
	Current = pStart;
	while (Current != NULL) {
		printf(&quot;%d\n&quot;, Current-&amp;gt;data);
		Current = Current-&amp;gt;next;
	}
}

int main(void)
{
	int i;
	for (i = 1; i &amp;lt;= 5; i++) 
		addrear(i);	// 새 노드를 만들어 리스트 뒤에 i를 추가
	printlist(pStart);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;실행시켜보면, 다음과 같이 출력된다.&lt;/p&gt;
&lt;pre id=&quot;code_1600791851040&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1
2
3
4
5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. addfront() 함수를 이용한 연결 리스트 구현&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;리스트의 맨 앞에 노드를 추가하는 addfront() 함수를 만들어보자.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1600792064991&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

// 연결 리스트를 구성할 Node 구조체
struct Node {
	int data;			// 노드에 저장할 데이터
	struct Node *next;	// 현재 노드의 다음 노드 포인터
};

struct Node *pStart = NULL;	// 리스트의 첫 노드의 포인터
struct Node *pEnd = NULL;	// 리스트의 마지막 노드의 포인터

void addfront(int val)
{
	struct Node *Current;	// 리스트에 추가할 새 노드 생성
	Current = (struct Node *) malloc(sizeof(struct Node));
	Current-&amp;gt;data = val;	// data 필드에 val 을 저장

	if(pStart == NULL) {		// 첫 번째 노드일 경우
		Current-&amp;gt;next = NULL;	// 다음 노드가 아직 없으므로 NULL 이다.
		pStart = pEnd = Current;
	}		
	else {
		Current-&amp;gt;next = pStart;	// 새로 추가한 노드의 다음 노드가 기존의 첫번째 노드
		pStart = Current;	// 첫 번째 노드를 이번에 새로 만든 노드로 바꿔줌
	}
}

void printlist(struct Node *Current)
{
	// Current 가 가리키는 리스트를 출력한다.
	Current = pStart;
	while (Current != NULL) {
		printf(&quot;%d\n&quot;, Current-&amp;gt;data);
		Current = Current-&amp;gt;next;
	}
}

int main(void)
{
	int i;
	for (i = 1; i &amp;lt;= 5; i++) 
		addfront(i);	// 새 노드를 만들어 리스트 앞에 추가
	printlist(pStart);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 특정한 data 를 가진 노드 1개만 지우는 delete() 함수 구현&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1600792469867&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void delete(int val) 
{
	// data 필드값이 val 인 Node 를 1 개 찾아 지운다.
	if (pStart == NULL) 
		return;
    
	if (pStart-&amp;gt;data == val) {
		struct Node *Current = pStart;
		free(Current);
		pStart = pStart-&amp;gt;next;
        return;
	}
    
	struct Node *p = pStart;
	struct Node *q = p-&amp;gt;next;
	while(q != NULL) {
		if (q-&amp;gt;data == val) {
			p-&amp;gt;next = q-&amp;gt;next;
			free(q);
			break;
		}
		p = q;
		q = p-&amp;gt;next;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/[C]</category>
      <author>NukeOlaf</author>
      <guid isPermaLink="true">https://salix97.tistory.com/283</guid>
      <comments>https://salix97.tistory.com/283#entry283comment</comments>
      <pubDate>Wed, 23 Sep 2020 01:35:00 +0900</pubDate>
    </item>
    <item>
      <title>[Unix] vi 사용법 간략 정리</title>
      <link>https://salix97.tistory.com/281</link>
      <description>&lt;p&gt;유닉스 계열의 운영체제에서는 텍스트 파일을 편집하기 위해서 vi 라는 문서 편집기를 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;prog1.cpp 를 편집하는 상황을 예로 들어보자.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;(1) vi prog1.cpp 를 입력한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;prog1.cpp 가 이미 존재하는 경우, 그 file 을 읽어온다.&lt;/p&gt;
&lt;p&gt;만약, prog1.cpp 가 존재하지 않으면 새 file 이 만들어지고, 빈 초기화면이 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;(2) a 또는 i 를 입력하여 edit 모드로 바꿔준다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;vi 는 command 모드와 edit 모드 두 상태 중 한 상태로 존재한다.&lt;/p&gt;
&lt;p&gt;처음 vi 초기화면은 command 모드인데, file 을 수정하기 위해서는 a 또는 i 를 입력해서 edit 모드로 바꿔주어야 한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;(3) 원하는 내용을 입력하고 수정한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;입력모드에서는 방향키를 이용하여 커서를 이동한다. 자주 쓰는 command 모드 명령어에는 i, a, o, x, dd, :wq 등이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;i (insert) &lt;/b&gt;: 현재 커서 전 위치부터 입력&lt;/li&gt;
&lt;li&gt;&lt;b&gt;a (add)&lt;/b&gt; : 현재 커서 다음 위치부터 입력&lt;/li&gt;
&lt;li&gt;&lt;b&gt;o (open)&lt;/b&gt; : 현재 커서 위치의 다음 줄에 입력&lt;/li&gt;
&lt;li&gt;&lt;b&gt;x&lt;/b&gt; : 한 문자 삭제&lt;/li&gt;
&lt;li&gt;&lt;b&gt;dd (line delete)&lt;/b&gt; : 현재 줄 삭제&lt;/li&gt;
&lt;li&gt;&lt;b&gt;:wq (write and quite)&lt;/b&gt; : file 저장 후 vi 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;(4) 입력이 끝나면 Esc 를 눌러 command 모드로 바꿔준다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;(5) ZZ (또는 :wq!) 를 입력하여 저장하고 vi 를 종료한다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>ComputerScience/[운영체제]</category>
      <author>NukeOlaf</author>
      <guid isPermaLink="true">https://salix97.tistory.com/281</guid>
      <comments>https://salix97.tistory.com/281#entry281comment</comments>
      <pubDate>Fri, 11 Sep 2020 01:06:49 +0900</pubDate>
    </item>
    <item>
      <title>[PuTTY] 푸티를 사용하여 원격 리눅스 서버에 접속하기</title>
      <link>https://salix97.tistory.com/280</link>
      <description>&lt;p&gt;과제를 학교 실습 서버(리눅스)에 접속하여 제출해야 한다.&lt;/p&gt;
&lt;p&gt;학교 실습 서버는 나와 물리적으로 떨어져 있다. 이런 서버를 원격 서버라고 한다. PuTTY 는 이러한 원격 서버에 접속하기 위해 사용하는 대표적인 프로그램이다. 사실 PuTTY 보다 MobaXterm 이 더 쉽고 사용하기 편리하다고는 하는데, 나는 PuTTY 를 사용할것이다. &lt;s&gt;이유는 교수님이 PuTTY 를 쓰라고 해서...&lt;/s&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;0. PuTTY 란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;SSH&lt;/b&gt;란 Secure SHell의 약자로 &lt;b&gt;네트워크 상의 다른 컴퓨터에 로그인하거나 원격으로 명령을 실행할 수 있는 프로그램 또는 프로토콜&lt;/b&gt;을 의미한다. 포트번호는 22번을 사용한다. 이러한 SSH를 이용해 &lt;b&gt;서버에 접속하여 명령어를 전송하는 원격 서버 접속 프로그램&lt;/b&gt;이 &lt;b&gt;PuTTY&lt;/b&gt; 이다. 사실 PuTTY 는 &lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;SSH 뿐만 아니라 Telnet, Rlogin 등 다양한 방법을 제공하고 있지만, Talnet 은 보안상의 문제로 잘 사용하지 않고, 보통 SSH 를 이용하여 원격 서버에 접속하기 위해 사용한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. PuTTY 사용하기&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(1) PuTTY 설치&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우선, putty.exe 를 다운로드 한 뒤 설치한다. 패키지 파일을 설치해도 괜찮다. 나는 원격 리눅스 서버에 SSH 를 이용해 접속할 것이므로, SSH 용 putty.exe 를 다운로드했다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;다운로드 링크 : &lt;a href=&quot;https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.chiark.greenend.org.uk/~sgtatham/putty/latest.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Uupp0/btqItae5IVw/3gRl3BTV509KUPmdUT1MU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Uupp0/btqItae5IVw/3gRl3BTV509KUPmdUT1MU0/img.png&quot; data-alt=&quot;나는 64 비트용 putty.exe 를 다운받았다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Uupp0/btqItae5IVw/3gRl3BTV509KUPmdUT1MU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUupp0%2FbtqItae5IVw%2F3gRl3BTV509KUPmdUT1MU0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;나는 64 비트용 putty.exe 를 다운받았다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;(2) Connection type 을 SSH 로 선택한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWhvnm/btqIvEAeaX0/cOzROZKF4xRYRSdOn6nyNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWhvnm/btqIvEAeaX0/cOzROZKF4xRYRSdOn6nyNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWhvnm/btqIvEAeaX0/cOzROZKF4xRYRSdOn6nyNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWhvnm%2FbtqIvEAeaX0%2FcOzROZKF4xRYRSdOn6nyNK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;(3) HostName (or IP address) 에 서버 도메인 또는 IP 주소를 입력한다&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/peKnD/btqIxYkEDGR/QMlea4YKneBgU8YUSYiFkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/peKnD/btqIxYkEDGR/QMlea4YKneBgU8YUSYiFkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/peKnD/btqIxYkEDGR/QMlea4YKneBgU8YUSYiFkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpeKnD%2FbtqIxYkEDGR%2FQMlea4YKneBgU8YUSYiFkK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;(4) Open 버튼을 누르면 원격 서버에 접속된다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pplmJ/btqIktUAIdg/10kSe3h96F7uiH2rcnY2j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pplmJ/btqIktUAIdg/10kSe3h96F7uiH2rcnY2j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pplmJ/btqIktUAIdg/10kSe3h96F7uiH2rcnY2j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpplmJ%2FbtqIktUAIdg%2F10kSe3h96F7uiH2rcnY2j1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;내 사용자 계정의 아이디와 비밀번호를 입력하고 접속한다.&lt;/p&gt;
&lt;p&gt;&lt;s&gt;계정 아이디가 내 학번이라서 가렸다...&lt;/s&gt;&lt;/p&gt;</description>
      <category>ComputerScience/[운영체제]</category>
      <author>NukeOlaf</author>
      <guid isPermaLink="true">https://salix97.tistory.com/280</guid>
      <comments>https://salix97.tistory.com/280#entry280comment</comments>
      <pubDate>Fri, 11 Sep 2020 00:28:14 +0900</pubDate>
    </item>
    <item>
      <title>[Unix] 유닉스 - 기본적인 쉘 명령어 사용법</title>
      <link>https://salix97.tistory.com/279</link>
      <description>&lt;p&gt;학교에서 객체지향 프로그래밍 수업을 듣고있다. 그런데 실습과제를 학교 리눅스 서버에 접속해서 제출하라고 한다... 예전에 aws 로 내 웹사이트 서버 배포할때 리눅스 명령어를 조금 사용해 보았는데, 다시 리눅스 터미널 창을 보니까 기억이 가물가물하다. 그래서 교수님이 주신 유닉스 쉘 명령어 사용법 유인물을 공부하면서 정리해보았다.&lt;/p&gt;
&lt;p&gt;리눅스 운영체제는 유닉스 운영체제로부터 파생되어 만들어졌다. 그래서 리눅스 명령어는 유닉스 명령어와 거의 비슷하다. 유닉스의 기본적인 쉘 명령어를 알아두면, 이를 리눅스에서도 사용할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;0. 쉘(Shell) 이란? - &lt;b&gt;유닉스 또는 리눅스에서 &lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;운영 체제&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;상에서 다양한 운영 체제 기능과 서비스를 구현하는 인터페이스를 제공하는 프로그램&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;유닉스 운영체제(리눅스와 같은 유닉스 계열 운영체제도 포함)에서 시스템을 위한 &lt;b&gt;사용자 인터페이스&lt;/b&gt;를 제공하는 프로그램 이라고 할 수 있다. 명령 줄 인터페이스(CLI, Commend Line Interface) 라고도 불리며, 컴퓨터 키보드를 통해 문자열로 작업 명령을 입력한다. 컴퓨터로부터의 출력 역시 문자열의 형태로 주어진다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;쉘은 운영체제의 커널과 사용자 사이를 연결해준다. 커널은 운영체제의 일부로서, 컴퓨터 메모리에 항상 올라와 있는 프로그램이다. 쉘은 상용자의 명령어를 해석하고 운영체제가 알아들을 수 있게 지시해준다. 다시 운영체제는 쉘에게 받은 명령를 해석하여 하드웨어를 위한 지시어로 바꾸어준다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;즉, 쉘을 사용하여 운영체제에서 제공하는 명령을 실행할 수 있다. 쉘은 &lt;span style=&quot;color: #333333;&quot;&gt;운영체제의 관리하에 있는 파일, 프린팅, 하드웨어 장치, 애플리케이션과의 인터페이스를 제공한다. &lt;span style=&quot;color: #333333;&quot;&gt;쉘 스크립트는 인터프리터로서 리눅스 시스템에서 지원하는 명령어들의 집합을 묶어서 프로그램화한 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. directory 관련 명령어&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(1) 새 directory 만들기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;mkdir (&lt;/span&gt;&lt;/b&gt;make directory)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599731442545&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir dir1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;새로운 디렉토리 dir1을 만듬&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(2) working diretory 에 있는 file 보기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ls -l (list long)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599731506566&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ls -l&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;long option으로 자세히 볼 수 있음, long option 을 주지 않으면 리스트가 간략하게 나옴.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;참고&lt;/b&gt; : working directory = current directory(현 디렉토리)&lt;/p&gt;
&lt;p&gt;login 직후에는 사용자의 login directory가 working directory가 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(3) working directory 이동하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;cd (change directory)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599731888175&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd dir1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;현 디렉토리 밑의 디렉토리 dir1 으로 이동&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;*참고: dot dot(..)은 상위 디렉토리, dot(.)은 현 디렉토리를 의미&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599732030708&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd ..&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;현 디렉토리 바로 위의 디렉토리로 이동&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. password 바꾸기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1599754427245&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;passwd&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;passwd를 치고 return하면(엔터를 치면) 현재 암호를 새 암호로 바꿀 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. word processor 사용하기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;vi (visual editor)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599734871311&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi f1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;f1이라는 이름의 file 을 편집한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;* 참고 : &lt;span style=&quot;color: #333333;&quot;&gt;vi 는 유닉스 환경에서 사용하는 문서 편집기이다. vi 를 이용해서 텍스트 파일을 수정할 수 있다.&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. 컴파일러&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(1) c++ 컴파일러 사용&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599735680005&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;g++ -o hw1 hw1.cpp&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;hw1.cpp 를 컴파일하여 동작 가능한 프로그램 hw1 을 제작한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(2) c 컴파일러 사용&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599735739860&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cc -o hw1 hw1.c&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;hw1.c 를 컴파일하여 동작 가능한 프로그램 hw1 을 제작한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;* 참고 : cc 의 option 들 : &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;-lm (math library), -ll (lex library), -lpthread (pthread)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;ex) -lm 옵션 사용 시, 원시 파일에 #include &amp;lt;math.h&amp;gt; 를 포함해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5. file 관련 명령어&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(1) file 복사&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;cp (copy)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599735956920&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cp f1 f2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;file f1 을 복사하여 f2 를 만든다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(2) file 제거&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;rm (remove)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599736047166&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rm f1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;file f1 을 제거한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;* (wildcard)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599736072198&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rm fi*&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이름이 fi 로 시작된되는 모든 file 들을 제거한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;rf (refursive force) 옵션&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599736122713&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rm -rf f1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;file f1 을 묻지 않고 제거한다. (refursive force)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(3) file 이름 바꾸기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;mv (move)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599736431960&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mv f1 f2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;file f1 의 이름을 f2 로 바꾼다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(4) file 내용 보기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;cat (concatenate)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599736515778&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat f1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;file f1 의 내용이 화면에 출력된다. concatenate 는 &quot;사슬 같이 잇다&quot; 라는 뜻으로, 파일 이름을 인자로 받아 그 내용을 쭉 이어주는 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&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;(5) file 의 앞 부분 출력하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;head&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599740033778&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;head file&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;file 의 앞 부분 10줄을 출력한다. (특별히 옵션을 부과하지 않으면 10줄 출력)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;* 참고 : 숫자를 입력하여 몇 출을 출력할지 지정할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599740124577&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;head -n file&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;file 의 앞 부분 n 줄을 출력한다 (n 은 숫자)&lt;/p&gt;
&lt;p&gt;ex) head -5 file (앞의 5줄을 출력한다.)&lt;/p&gt;
&lt;p&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;(6) file 의 뒷 부분 출력하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;tail&lt;/p&gt;
&lt;pre id=&quot;code_1599740211380&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tail file&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;file 의 뒷 부분 10줄을 출력한다. &lt;span style=&quot;color: #333333;&quot;&gt;(특별히 옵션을 부과하지 않으면 10줄 출력)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;* 참고 : 숫자를 입력하여 몇 출을 출력할지 지정할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599740348094&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tail -n file&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;file 의 뒷 부분 n 줄을 출력한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;6. redirection (재지향)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgLlJs/btqIvDusvfZ/BcpRjkSRwi7tI9HI88lGl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgLlJs/btqIvDusvfZ/BcpRjkSRwi7tI9HI88lGl0/img.png&quot; data-alt=&quot;입출력 및 오류에 대한 표준 스트림&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgLlJs/btqIvDusvfZ/BcpRjkSRwi7tI9HI88lGl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgLlJs%2FbtqIvDusvfZ%2FBcpRjkSRwi7tI9HI88lGl0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;입출력 및 오류에 대한 표준 스트림&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;redirection 은 표준 스트림의 흐름을 바꿔주는 것이다. 기본적으로 프로그램은 연산 결과를 출력 장치(파일, 모니터, 프린터 등)로 내보낸다. 이 출력되는 데이터를 임의로 다른 장치로 보내는 것을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;재지향(redirection)&lt;/b&gt; 이라 한다. &lt;span style=&quot;color: #333333;&quot;&gt;즉, 파일이나 프로그램, 명령어 등의 출력을 낚아채어 다른 파일이나 프로그램, 명령어의 표준 입력으로 보내는 것을 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt; (redirect input)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599741063987&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;prog &amp;lt; f1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;표준 입력을 키보드 대신 f1 이라는 file 에서 받는다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;gt; (redirect output)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599741153720&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;prog &amp;gt; f2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;표준 출력을 화면 대신 f2 라는 file 로 내보낸다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;7. pipe (파이프)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;앞 process 의 표준 출력을 뒤 process 가 입력받아 동작하도록 한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;| (pipe)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599741415506&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ls -l | more&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ls -l 의 표준 출력이 more 의 표준 입력이 된다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;* 참고 : more 은 space 를 누를 때마다 다음 page 를 출력하는 명령어이다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;8. makefile&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;(1) aa.cpp 와 bb.cpp 두 개의 file 이 있다. main 함수는 bb.cpp 에 들어있다. 이 때, 동작 가능한 프로그램 bm 만들기&lt;/p&gt;
&lt;p&gt;(2) main 함수를 가지고 있는 cm.cpp 를 컴파일/링크하여 동작 가능한 프로그램 cm 만들기&lt;/p&gt;
&lt;p&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;makefile 을 사용하지 않는 방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1599741751095&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;g++ -o bm bb.cpp aa.cpp
g++ -o cm cm.cpp&lt;/code&gt;&lt;/pre&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;makefile 을 사용하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;(a) makefile 이라는 이름의 file 을 만든다.&lt;/p&gt;
&lt;pre id=&quot;code_1599743810071&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi makefile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(b) makefile 에 다음과 같이 작성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1599743867883&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bm: bb.o aa.o
	g++ -o bm bb.o aa.o
cm: cm.o
	g++ -o cm cm.o&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(c) make 명령을 입력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1599743994692&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;make
make bm
make cm&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;* 참고 : makefile 내의 의존성은 분리컴파일 된 .o 파일을 이용하면 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;위에서 makefile 이라는 이름의 아스키 파일을 만든 후 , 쉘 프롬프트에서 'make' 또는 'make bm' 하면 bm 이 제작된다.&lt;/p&gt;
&lt;p&gt;'make cm' 하면 cm 이 제작된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;참고 사이트 &amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%89%EC%8A%A4_%EC%85%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%89%EC%8A%A4_%EC%85%B8&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://jhnyang.tistory.com/57&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;jhnyang.tistory.com/57&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zzsza.github.io/development/2017/12/04/linux-1/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;zzsza.github.io/development/2017/12/04/linux-1/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.tuwlab.com/ece/27193&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.tuwlab.com/ece/27193&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ComputerScience/[운영체제]</category>
      <author>NukeOlaf</author>
      <guid isPermaLink="true">https://salix97.tistory.com/279</guid>
      <comments>https://salix97.tistory.com/279#entry279comment</comments>
      <pubDate>Thu, 10 Sep 2020 22:22:45 +0900</pubDate>
    </item>
  </channel>
</rss>