<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>7_06com.log</title>
        <link>https://velog.io/</link>
        <description>실패의 경험들을 채워나가기!</description>
        <lastBuildDate>Sun, 12 May 2024 17:42:56 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>7_06com.log</title>
            <url>https://velog.velcdn.com/images/7_06com/profile/c3d1d25e-43c7-4fd7-ae3d-565e7b9bd9a7/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 7_06com.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/7_06com" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[한화시스템 Beyond SW 6기] 2주차 회고]]></title>
            <link>https://velog.io/@7_06com/%ED%95%9C%ED%99%94%EC%8B%9C%EC%8A%A4%ED%85%9C-Beyond-SW-6%EA%B8%B0-2%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@7_06com/%ED%95%9C%ED%99%94%EC%8B%9C%EC%8A%A4%ED%85%9C-Beyond-SW-6%EA%B8%B0-2%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Sun, 12 May 2024 17:42:56 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/7_06com/post/90bcf76b-e972-4927-a356-ab7ca0280463/image.png" alt=""></p>
<h1 id="📌-2주차를-보내며">📌 2주차를 보내며.</h1>
<p>벌써 2주차의 회고를 쓸 시간이 왔다. (아니 이게 말이 돼?)</p>
<p>이번 주는 시간 동안, 나의 약점(?) 이기도 했던 리눅스와 데이터베이스에 대해 끊임없이 학습할 수 있었다.
듣다보면 항상 감탄스럽고 머리를 &quot;탁&quot; 치는 강사님의 양질의 강의에 항상 감사하고 있다.. </p>
<p><strong>이번주는 <code>오프라인 부트캠프의 장점</code>을 명확히 깨달았던 주 였던 것 같다.</strong></p>
<p>앞선 회고에도 간략하게 설명했듯이, <code>자유로운 커뮤니케이션</code>, <code>열정 가득한 공간에서의 학습력</code>, <code>다양한 스터디 활동</code> 의 장점을 몸소 깨달았다. 항상 카페에 눌러앉아 꽤나 외롭게 혼자 공부했었던 나에게, 너무나도 완벽한 학습공간 인 것 같다. 나날이 성장하는 것 처럼 느껴지는 나의 모습에, <code>한화 부트캠프</code>는 어쩌면 나의 개발자 <code>인생의 터닝포인트</code>가 될 수도 있을 것만 같다.</p>
<br>

<p>요즘은 부트캠프 내에서 9 to 9 or 10 의 삶을 살고 있다. 
오후 9~10시까지 캠프내에서 공부하다가, 집 가는 길에 운동하고 집 가면 딱 기절 할 시간이다 =_=
힘들 줄 알았는데 오하려 루틴으로 삼으니 생각보다 할만하다.. (다행스럽게 체력이 버텨주나부다😂)</p>
<p>물론, 아무래도 집이 정말 근처여서,, 다른 동기들에 비해 상당한 이점을 가지고 있기에 가능한 것일지도... 멀리서 오시는 분들을 보면 새삼 너무 대단하게 느껴진다.</p>
<h2 id="대용량-트래픽-처리-분산-처리-시스템을-배우다">대용량 트래픽 처리, 분산 처리 시스템을 배우다.</h2>
<p><img src="https://velog.velcdn.com/images/7_06com/post/e86b66eb-234c-4dd7-ba2f-62a8e57656dd/image.png" alt=""></p>
<p>개발자 취업을 준비해본 사람은, 신입 포함 많은 공고에서 대용량 트래픽 처리에 대한 우대사항을 많이 접했을 것 이다. </p>
<p><del>(아니 우리가 이걸 어떻게 경험하나요)</del> 라고 생각했으나, 6기 강사님과 함께라면, 경험이 가능한거였더라..😂 
물론 아직은 우리가 초심자이기 때문에 처음부터 심화적으로 하기보단, 경량형 웹 서버,DB 서버들을 구축한 후 <code>haproxy</code>, <code>Jmeter</code>, <code>프로메테우스-grafana</code>등을 활용해서 간단한 실습으로 대용량 트래픽 및 분산처리 시스템의 개념을 다잡을 수 있었다. (혼자 공부했다면 감히 시도조차 못해봤을 내용이다.)</p>
<p>역시 우리 강사님이다..</p>
<p><img src="https://velog.velcdn.com/images/7_06com/post/bb1923c9-6381-4d1d-9b7d-670ccdbc0f5f/image.png" alt=""></p>
<h2 id="✅-좋았던-점">✅ 좋았던 점</h2>
<p>이번주의 좋았던 점을 나열해보자면,</p>
<blockquote>
</blockquote>
<ul>
<li>분산처리 시스템 학습</li>
<li>체계적으로 다듬어져가는 복습 스터디. (aka.복스팸)</li>
<li>스터디 추가 가입 (코테 스터디)</li>
<li>인턴이 된 것만 같은, 출입증+이름표 배정</li>
<li>동기의 절반 가량 안면 트기</li>
<li>정처기 필기 합격</li>
</ul>
<h3 id="💪-벌써-2개의-스터디">💪 벌써, 2개의 스터디.</h3>
<p>기존에 있었던 복습 스터디에 더 나아가서,
<strong>고민조차 할 시간이 없다고 강조</strong>하시는 웃기고 열정 넘치는 동기분의 감사한 권유에, <code>코딩 테스트 스터디</code>에 추가로 가입하게 되었다! 해당 스터디에는 정말 다양한 경험과 풍부한 실력으로 가득한 분들이 많아 정말 놀랬다.. 머리를 조아리며 열심히 배워나가야겠다..</p>
<h4 id="1-점점-더-체계적으로-잡혀가는-복스팸-복습-스터디">1. 점점 더 체계적으로 잡혀가는 복스팸 (복습 스터디)</h4>
<p>해당 주차는 저번 주 보다 심도있고 어려운 주제들을 다뤘기 때문에 여러 오류들을 만나 볼 수 있었다.
복습 스터디에서는 금일 진행했던 내용을 다잡고, 만나봤던 오류들에 대해서 토론도 거치는 아주 건강한 과정을 거치고 있다,,👊</p>
<p><img src="https://velog.velcdn.com/images/7_06com/post/2d74b30e-4ae7-48b5-94ef-6fdc1f273ac8/image.png" alt=""></p>
<h4 id="2-수많은-실력자-분들과-함께-코딩-테스트-준비">2. 수많은 실력자 분들과 함께 코딩 테스트 준비.</h4>
<p>사실 처음에는 감사한 권유에 무색하게 많은 주저를 했다. 기존 스터디가 있음과 동시에, 혹여 실력과 시간이 안돼서 스터디 내에서 폐를 끼치면 어쩌나 하는 불안감이 있었던 것 같다. 그치만 <code>늘 망설임의 끝은 후회</code>로 남았던 것을 알았기에, 다음날에 다시 찾아가 참여를 신청했다! 결론부터 말하자면, 후회없는 선택으로 많이 배워갈 예정이다! </p>
<p><img src="https://velog.velcdn.com/images/7_06com/post/d6ac5344-cf03-4b16-b01c-a4af0409d92b/image.png" alt=""></p>
<br>

<h3 id="🔍-꽤나-간지나는-출입증을-제공받다">🔍 꽤나 간지나는(?) 출입증을 제공받다.</h3>
<p>대기업 연계라 그런지(?) 층층마다 출입 권한도 꽤나 확실하다! 뭔가 인턴처럼 있어보이기도 하고.. 개인적으로 마음에 드는 출입증이다 껄껄..</p>
<p><img src="https://velog.velcdn.com/images/7_06com/post/e4871604-1adc-4b45-8d15-43c576f5d111/image.png" alt=""> | <img src="https://velog.velcdn.com/images/7_06com/post/22de4206-b507-4393-9f1f-a2b255358f15/image.png" alt="">
|---|---|</p>
<br>

<h3 id="👏-정처기-필기-합격">👏 정처기 필기 합격!</h3>
<p>학부생때 프로젝트라는 핑계로 미뤄놨던, 정처기 자격증도 틈틈히 지원해서 보고왔다!
다행히 시험,면접등에 있어서는 유연하게 <strong>공가 처리</strong>를 해주셔서 공가처리 후 다녀올 수 있었다.
그래도 수업 빠지는건 너무 아쉬워서, 시험 끝나자마자 호다닥 붙캠으로 향해 큰 지장은 없었다. </p>
<p>벼락치기를 했던지라, 혹여 떨어지진 않겠지 걱정했지만 다행히 안전한 점수로 합격!</p>
<p><img src="https://velog.velcdn.com/images/7_06com/post/ec4fdbd7-3f8d-4787-a057-608b3abc1227/image.png" alt=""></p>
<hr>
<h2 id="❌-아쉬운-점">❌ 아쉬운 점</h2>
<p>이번주의 아쉬운 점 이다.</p>
<blockquote>
</blockquote>
<ul>
<li>약속이 많아 공부의 소홀함..</li>
<li>어떻게 하면 친해질 수 있을까..?</li>
</ul>
<h3 id="😥-너무-놀았다-ㅎ">😥 너무 놀았다 ㅎ..</h3>
<p>해당 주차는 가족 생일, 어버이 날, 정처기 시험, 약속등 여러 이벤트들이 몰려 있었어서 만족스러운 공부량을 가져가지 못했다ㅜ.. 다음 주에는 정신 바짝차리고 더욱 분발하도록 해야겠다,,</p>
<h3 id="💭-나서고-싶지만-나설-수-없다">💭 나서고 싶지만 나설 수 없다.</h3>
<p>나의 단기적인 욕망은, 하루라도 빨리 서로 서로가 친해져서 오프라인 장점을 200% 살리고 싶은 욕망이 있다. 나름대로 내제되어있는 친화력으로 절반가량 정도는 안면을 튼 것 같지만, 아직 이름과 얼굴조차 매치가 안되는 분들도 대다수다.</p>
<p>지정 좌석제의 장점이자 단점은 주변 사람들은 빨리 친해질 수 있어도, 연관이 없는 자리는 결코 친해질 수 없는 시스템 인 것 같다. 사실, 디코같은 환경에서 친해질 수 있는 다양한 방법들을 공유하며 실천해보고는 싶지만, 괜히 나서는 것처럼 보일까봐 계속 망설이게 되는 것 같다ㅋㅋㅋㅠㅠ 조만간 기회가 되면,, 용기내서 추진 해봐야겠다. </p>
<p>(혹여 이 글을 보는 6기 동기가 있어서, 먼저 말을 걸어준다면 무한한 감사를 ^^..)</p>
<p><br><br></p>
<hr>
<h2 id="👏앞으로">👏앞으로</h2>
<p>나의 생각 이상으로, 6기 내에서 수많은 실력자와 열정있는 사람으로 가득하다는 것을 느낀 주였다.
이와 같은 사람들과 함께 꾸준히, 열심히만 한다면 취업은 정말 문제 없을 것 같다는 근자감이 생긴다.</p>
<p>지금까지도, 앞으로도 잘해왔듯이, 무사히 취뽀할 수 있기를!</p>
<p>6기 파이팅 ! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[한화시스템 Beyond SW 6기] 1주차 회고]]></title>
            <link>https://velog.io/@7_06com/%ED%95%9C%ED%99%94%EC%8B%9C%EC%8A%A4%ED%85%9C-Beyond-SW-6%EA%B8%B0-1%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@7_06com/%ED%95%9C%ED%99%94%EC%8B%9C%EC%8A%A4%ED%85%9C-Beyond-SW-6%EA%B8%B0-1%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Sun, 05 May 2024 13:42:50 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/7_06com/post/950134a2-dc05-4f49-b4d1-3fff466a184a/image.png" alt=""></p>
<h1 id="📌-1주차를-보내며">📌 1주차를 보내며.</h1>
<p>4월 29일. 한화시스템 부트캠프 6기가 개강했다.</p>
<p>정말 거짓말 같이 1주일이 아주 빠르게 흘러갔다. 
1주일이라는 시간 동안, 나름대로 많은 동기들과 친해질 수 있었고, 벌써 스터디도 참여할 수 있었으며, 너무나도 마음에 드는 강사님께 양질의 강의를 배울 수 있었다. </p>
<p>사실 부트캠프를 합격하고, 가장 걱정했던 부분은 크게 <code>강사</code> 그리고 <code>동기</code> 라고 말할 수 있다.
이미 사전에 알아본 <code>커리큘럼</code> , <code>한화시스템과의 채용 연계 시스템</code> , <code>수료 후 취업 활동 도움</code> 등은 부트캠프 소개와 여럿 전 기수분들의 블로그들을 통해 파악할 수 있었으나, 앞선 2개의 부분은 오직 6기내에서 파악할 수 있었기에 더욱 걱정했던 것 같다.</p>
<p><strong>물론, 결론부터 말하자면 부트캠프가 너무나도 만족스럽다!</strong> 아직 동기분들은 많이 친해지지 못해 쉽게 판단할 순 없겠지만, 일단 대화를 나눠본 분들 만으로도 괜찮은 사람들이 많을 것이라 판단 되었던 것 같다.</p>
<p>사실 무엇보다, 강사님이 정말 마음에 들었다. 모두가 알만한 기업에서의 실무와 강사를 번갈아가며 활동하셔서 그런지, 지식과 최신 트렌드가 정말 풍부하다고 느껴졌으며, 무엇보다 설명을 너무 잘 해주신다. <code>잘 아는 것과, 잘 가르치는 것</code>은 엄연히 다른 영역이라 생각하는데 두 가지를 모두 충족하시는 것 같다..👍
<br></p>
<p>9 to 6의 삶이 정말 힘들 줄 알았는데, 생각보다 할만했다. 
아무래도 그동안 공부하면서 생긴 앉는 힘이 지금에서야 활약을 하는 것 같다. (엉덩이야 고맙다..~)</p>
<p>아마 나는, 뒤에 약속만 없다면 매일같이 남아 공부 할 예정이다. (함께해요.)</p>
<h2 id="network-linux-그리고-db를-배우다">Network, Linux 그리고 DB를 배우다.</h2>
<p>네트워크 , 리눅스, 데이터베이스 수업을 무서울 정도로 빠르게 진도를 뽑아냈다.
물론 내용을 때려박을테니 다 습득해! 이런 느낌이 아니라, 실무에서 쓰이는 내용들 위주로
차근차근 단계를 쌓으며 진행해 나갔기에 아직까진 큰 어려움은 없었다. </p>
<p>전공자이기도 하고, 나름대로 공부를 했다고 생각한 내용들도 많았는데.. 강의 몇 번 듣고 생각이 완전히 바뀌었다..😢 
가려운 부분을 쓱쓱 긁어주는 강의에..
역시 아무래도 입 닫고 빵이나 먹으면서 겸손하게 수업을 열심히 임해야겠다는 생각만 들었다.
<img src="https://velog.velcdn.com/images/7_06com/post/2afa393f-153b-40b8-8113-2ffe99d565e7/image.png" alt=""></p>
<h2 id="✅-좋았던-점">✅ 좋았던 점</h2>
<p>본격적으로 이번 1주일동안 좋았던 점을 나열해보자면,</p>
<blockquote>
</blockquote>
<ul>
<li>6개월간 믿고 따를만한 강사님 (탄탄한 강사진)</li>
<li>쾌적하고 깨끗한 내부 공간</li>
<li>열정 가득한 동기들</li>
<li>스터디 모집 및 참여</li>
<li>눈으로 직접 본 수료 후 취업활동 + 한화시스템과의 연관성</li>
</ul>
<h3 id="💪-스터디에-참여하다-aka-복스팸">💪 스터디에 참여하다. (aka. 복스팸)</h3>
<p>동기 분 중, 한 분이 개강 3일만에 수업이 끝난 후 매일같이 남아서 복습하자는 스터디를 개최하셨고, 나 또한 과감하게 스터디에 참여했다. </p>
<p>복습의 필요성을 느껴서 가입했다기 보다는, 3일만에 스터디를 개최해서 남아서 복습한다는 열정을 가진 이들과 함께 나아간다는 점에서 과감하게 신청했던 것 같다. (내가 생각하던 오프라인 부트캠프의 장점이다.)</p>
<p>무려 약 1시간 30분 동안 앞으로의 스터디 방향성과 구체적인 Rule을 선정했고, 모두가 만족스러운 방향성의 스터디가 될 것 같다! </p>
<h4 id="복습-하면서-헷갈렸던-부분에-대해-이런저런-토론도-나누는-中">복습 하면서 헷갈렸던 부분에 대해 이런저런 토론도 나누는 中</h4>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/7_06com/post/452ce9e9-199b-45e0-8b0e-b97a909c839c/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/7_06com/post/4a48d552-5b42-405c-a412-6ced82199abb/image.png" alt=""></th>
</tr>
</thead>
</table>
<br>

<h3 id="🔍-한화-시스템과의-연관성">🔍 한화 시스템과의 연관성</h3>
<p>아무래도 생긴지 얼마 안된 부트캠프다 보니, 아직 수료생들에 대한 데이터들은 없었던 것 같다.
근데 최근에 수업이 끝나고 복습하러 5층에 올라갔을 때, 부트캠프 매니저님과 한화시스템 실무진분들이 회의 하시는 모습을 보게됐다! 최종 프로젝트에 실무진 분들과 함께 하는 것도 그렇고 이런저런 모습을 봤을 때, 뒤에서 힘써주시는 모습들을 볼 수 있는 것 같다 </p>
<p>+최근에 수료하신 2기 분들도 붙캠에 오셔서 실무진분과 함께 1:1 모의면접도 진행하는 모습들도 보게됐다! 앞으로가 기대된다.
<br><br></p>
<hr>
<h2 id="❌-아쉬운-점">❌ 아쉬운 점</h2>
<p>좋은것만 얘기할 순 없듯이, 아쉬운점도 함께 적어보고자 한다.</p>
<blockquote>
</blockquote>
<ul>
<li>아직까지 서로 친해질 기회가 없는 내부 환경</li>
<li>전 기수 블로그에서도 많이 봐왔던 화장실 1개</li>
</ul>
<h3 id="😥-아직도-누가-누군지-모르겠다">😥 아직도 누가 누군지 모르겠다.</h3>
<p>개인적으로 기수의 분위기는 초반 분위기로 결정된다라고 생각하는 사람으로서, 최대한 초반부터 열정 넘치고 서로 친해지는 분위기를 열망하고 있다! </p>
<p>뒷자리에 위치하고 있는 나는, 이미 뒷자리 분들과는 서로 친해진 상태이나, 다른 분들은 사실 얼굴조차 모르겠다.. 고정석 + 수업의 연속 이라는 부분을 감안하여, 강사님과 매니저님이 조금만 더 신경써주며 서로 친해질 수 있도록 도와주시면 어떨까 싶다.</p>
<h3 id="❓-네-한-층에-화장실이-한-개요">❓ 네? 한 층에 화장실이 한 개요?</h3>
<p>이미 앞 기수 분들이 써놓은 내용으로 한 개의 단점은 알고 있었지만, 체감하니 확실히 불편하다..ㅜ
물론 남자 화장실 같은 경우는 좌변기와 소변기가 있기 때문에, 엄밀히 말하면(?) 2개라고 말 할 수도 있겠지만, 여자 화장실은 오죽할까 싶다,, 현재는 해당 층에 6기 밖에 없어서 아직까진 괜찮지만 1-2주 뒤에 들어오는 7기와 화장실 전쟁을 겪자니 걱정되긴 한다..ㅎ</p>
<p><br><br></p>
<hr>
<h2 id="👏앞으로">👏앞으로</h2>
<p>오프라인 부트캠프를 열망했던 이유 중 가장 큰 것은, 결국 커뮤니티 인 것 같다. 
열정 많은 서로가 모여 취업 활동까지 해 나가는 것. 그러기 위해 해당 부트캠프를 선택했다. 아직까지는 불과 1주일밖에 흐르지 않았기에 서로 서먹하고 눈치보는 중 이긴 하지만, 그 1주일만에 여럿 스터디도 열리고 블로그도 열심히 쓰는 모습들을 보며, 정말 기대해 볼만한 기수 라고 생각이 든다! </p>
<p>모두가 함께 포기하지 않고 취뽀까지 달렸으면 좋겠다!
6기 파이팅 ! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코테] 코딩 테스트 준비 방법]]></title>
            <link>https://velog.io/@7_06com/%EC%BD%94%ED%85%8C-%EC%BD%94%EB%94%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A4%80%EB%B9%84-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@7_06com/%EC%BD%94%ED%85%8C-%EC%BD%94%EB%94%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A4%80%EB%B9%84-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Mon, 15 Apr 2024 08:20:56 GMT</pubDate>
            <description><![CDATA[<h1 id="코딩-테스트를-준비하기-전에">코딩 테스트를 준비하기 전에</h1>
<h3 id="타인의-풀이를-보면-사고를-넓힐-수-있다">타인의 풀이를 보면 사고를 넓힐 수 있다.</h3>
<blockquote>
<p>다른 사람들이 작성한 코드를 보며, 다양한 문제풀이 접근 방식이나 코딩 스킬을 습득해라!</p>
</blockquote>
<h3 id="나만의-테스트-케이스를-추가해라">나만의 테스트 케이스를 추가해라.</h3>
<blockquote>
<p><code>코드로 구현하기 전</code>에 <code>예외 상황</code>을 충분히 생각하고, <code>사전에 테스트 케이스를 추가</code>하라.
즉, 문제 분석 과정에서 테스트케이스를 추가하라.</p>
</blockquote>
<h3 id="기록하라">기록하라.</h3>
<blockquote>
<ol>
<li>못 푼다고 그 자리에서 그만두고 정답보기 (X)</li>
<li><strong>(문제는 풀지 못했지만) 어디까지 생각해봤는지 일단 기록하기.</strong></li>
</ol>
<p>-&gt; 생각을 기록해두는 것 만으로도 도움이 엄청 된다.</p>
</blockquote>
<h3 id="나만의-언어로-요약하라">나만의 언어로 요약하라.</h3>
<blockquote>
<p>개념을 습득했다면, 정말 이해했는지 확인하는 방법으로는 <strong>내용을 요약하는 것</strong>이다.
글, 수식, 그림 모두 활용해도 좋다.</p>
</blockquote>
<hr>
<h1 id="코딩-테스트-효율적으로-준비하기">코딩 테스트 효율적으로 준비하기</h1>
<h3 id="언어-선택하기">언어 선택하기.</h3>
<blockquote>
<p>언어를 활용한다는 것의 기준은?</p>
</blockquote>
<ul>
<li>변수 선언하기</li>
<li>함수 정의하기</li>
<li>컬렉션 자료형 다루기</li>
<li>조건문, 반복문 사용하기<blockquote>
</blockquote>
</li>
<li><blockquote>
<p>해당 사항을 잘 할 줄 안다면 언어를 활용할 준비가 되었다는 것.</p>
</blockquote>
</li>
</ul>
<h3 id="📌문제-분석-연습하기">📌문제 분석 연습하기</h3>
<blockquote>
</blockquote>
<ol>
<li><strong>문제를 쪼개서 분석하기</strong></li>
</ol>
<p>-&gt; 문제 전체를 한번에 분석하는 것보다, 문제를 <code>동작 단위로 쪼개서 분석</code>해라.
2. <strong>제약 사항을 파악하고 테스트 케이스를 추가하기</strong>
-&gt; 제약 사항을 사전에 분리/파악하고 이를 대비해서 테스트 케이스를 미리 추가해라.
3. <strong>입력값을 분석하기</strong>
-&gt; 입력값이 100만개이면, O(N^2) 의 방법으로는 절대 통과할 수 없다. (알고리즘 뭐 쓸지 사전 파악)
4. <strong>그리디하게 접근할 때는 근거를 명확히 하기.</strong>
-&gt; 그리디 문제가 아닌데, 그리디로 접근하면 폭망한다.
5. <strong>데이터 흐름이나 구성을 파악하기.</strong>
-&gt; 삽입/삭제가 빈번하며, 최댓값/최솟값을 반복한다면 Heap 자료구조를 고려해야 하듯이, 데이터 흐름과 구성을 파악하는 것은 중요하다.</p>
<h3 id="📌문제-분석이-끝나면-의사-코드로-설계하기">📌문제 분석이 끝나면 의사 코드로 설계하기</h3>
<blockquote>
</blockquote>
<p><strong>의사코드는 프로그램의 논리를 설명하고 알고리즘을 표현하기 위해 작성한 일종의 지침서이다.</strong></p>
<blockquote>
</blockquote>
<ul>
<li>원칙1 : 프로그래밍 언어로 작성하면 안된다.</li>
<li>원칙2 : 일반인도 이해할 수 있는 자연어로 작성해야한다.</li>
<li>원칙3 : 일정한 형식없이 자유롭게 작성한다.</li>
</ul>
<h4 id="1-세부-구현이-아닌-동작-중심으로-작성">1. 세부 구현이 아닌, 동작 중심으로 작성</h4>
<blockquote>
<p>세부 구현을 고려하는 순간, 의사코드는 설계가 아닌, 구현으로 변질되어 버린다.</p>
</blockquote>
<ul>
<li>국어,영어,수학 점수를 입력받는다 ( O )</li>
<li>크기가 256 바이트인 문자열 배열 3개 선언 후, 국어,영어,수학 점수를 입력받는다 ( X ) -&gt; 프로그래밍 요소는 배제하라</li>
</ul>
<h4 id="2-문제-해결-순서로-작성">2. 문제 해결 순서로 작성</h4>
<blockquote>
<p>문제 해결 순서대로 작성해야 한다.</p>
</blockquote>
<ul>
<li><ol>
<li>영어 성적 입력</li>
</ol>
</li>
<li><ol start="2">
<li>영어 성적이 60점을 넘는지 확인(분기)</li>
</ol>
<ul>
<li>60점 이상 : 통과</li>
<li>60점 미만 : 실패</li>
</ul>
</li>
</ul>
<h4 id="3-충분한-테스트">3. 충분한 테스트</h4>
<blockquote>
<p>구현을 하고 테스트를 검증했을 때 실패한다면, 수정이 점점 어려워진다.
구현에 들어가기 전, 충분한 테스트 케이스와 테스트를 진행해봐라.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바] 김영한의 실전자바 - 중급 1편 정리(2)]]></title>
            <link>https://velog.io/@7_06com/%EC%9E%90%EB%B0%94-%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84%EC%9E%90%EB%B0%94-%EC%A4%91%EA%B8%89-1%ED%8E%B8-%EC%A0%95%EB%A6%AC2</link>
            <guid>https://velog.io/@7_06com/%EC%9E%90%EB%B0%94-%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84%EC%9E%90%EB%B0%94-%EC%A4%91%EA%B8%89-1%ED%8E%B8-%EC%A0%95%EB%A6%AC2</guid>
            <pubDate>Sun, 14 Apr 2024 16:31:00 GMT</pubDate>
            <description><![CDATA[<h1 id="ch3---string-클래스">[Ch3 - String 클래스]</h1>
<h3 id="string-클래스-내부-구조">String 클래스 내부 구조</h3>
<blockquote>
<p>String 클래스 내부로는 사실 char[] 배열로 보관하고 있다.
(📌 자바 9 이후에는 byte[]로 보관한다) </p>
</blockquote>
<p>String 클래스는 개발자가 직접 다루기 불편한 <code>char[] 을 내부에 감추고</code>, String 클래스를 사용하는 개발자가 편리하게 <code>문자열을 다룰 수 있도록 다양한 기능을 제공</code>한다.</p>
<h3 id="string-클래스는-참조형이다">String 클래스는 참조형이다</h3>
<pre><code class="language-java">
        String a = &quot;hello&quot;; //x001
        String b = &quot;java&quot;;  //x002

        String result1 = a.concat(b);
        String result2 = a + b;

        System.out.println(result1);    //hellojava
        System.out.println(result2);    //hellojava</code></pre>
<blockquote>
<p>String 클래스는 참조형이기 때문에 +연산자는 원래 불가하다. (concat() 과 같은 메서드로만 허용해야함)
하지만 자주쓰이는 문자열의 특성상, + 연산자를 허용해준다. </p>
</blockquote>
<h3 id="동일성과-동등성">동일성과 동등성</h3>
<blockquote>
</blockquote>
<ul>
<li>동일성 : 두 객체가 <code>같은 참조값(인스턴스)</code>을 가리키고 있는지 확인하는 비교법 ( == 연산자 )</li>
<li>동등성 : 두 객체가 다른 인스턴스라도, <code>논리적으로 같은 객체</code>인지 확인하는 비교법 ( equals() 메서드 )</li>
</ul>
<pre><code class="language-java">String str1 = new String(&quot;hello&quot;);
String str2 = new String(&quot;hello&quot;);

System.out.println(&quot;new String() == 비교 &quot; + (str1 == str2)); // false
System.out.println(&quot;new String() equals 비교 &quot; + (str1.equals(str2)));</code></pre>
<h3 id="문자열-리터럴과-문자열-풀">문자열 리터럴과 문자열 풀</h3>
<blockquote>
<p>String 클래스는 new로 생성할 때 마다 다른 인스턴스라는 것을 기억한다면, 아래와 같은 코드에 의문이 생길 것이다.</p>
</blockquote>
<pre><code class="language-java">String str3 = &quot;hello&quot;;
String str4 = &quot;hello&quot;;

System.out.println(&quot;리터럴 == 비교 : &quot; + (str3 == str4));    // true (네?????)
System.out.println(&quot;리터럴 equals 비교 : &quot; + (str3.equals(str4)));   //true
</code></pre>
<p>엥? str3==str3 가 true 라고?
이런 의문이 들었다면, String 클래스의 개념이 잘 잡힌 것이다. 서로 다른 인스턴스로 생성되는 것이 분명한데 왜 true가 나올까? </p>
<p>이때, 문자열 pool이라는 개념이 등장한다.</p>
<p><img src="https://velog.velcdn.com/images/7_06com/post/82077e1f-3cd3-4f28-9f07-734ca8e0cc8e/image.png" alt=""></p>
<blockquote>
<p><strong>📌리터럴로 문자열이 생성되면, 같은 문자열을 가진 객체들은 하나의 주솟값을 가리키게 된다!</strong>
아래 메모리 주솟값을 한 번 출력해보자.</p>
</blockquote>
<pre><code class="language-java">        String str1 = new String(&quot;hello&quot;);
        String str2 = new String(&quot;hello&quot;);

        System.out.println(&quot;new String() == 비교 &quot; + (str1 == str2)); // false
        System.out.println(&quot;new String() equals 비교 &quot; + (str1.equals(str2)));    //true

        String str3 = &quot;hello&quot;;
        String str4 = &quot;hello&quot;;

        System.out.println(&quot;리터럴 == 비교 : &quot; + (str3 == str4));    // true (네?????)
        System.out.println(&quot;리터럴 equals 비교 : &quot; + (str3.equals(str4)));   //true

        System.out.println(System.identityHashCode(str1));  //1989780873
        System.out.println(System.identityHashCode(str2));  //1480010240
        System.out.println(System.identityHashCode(str3));  //81628611
        System.out.println(System.identityHashCode(str4));  //81628611
</code></pre>
<p>이와같이 new로 생성했을 때에는, 다른 인스턴스로 메모리에 생성되지만, <code>리터럴로 생성했을 때에는 문자열 풀에 의해서 같은 인스턴스</code>를 가리키게 된다.</p>
<h3 id="헉-그럼-같은객체를-가리키면-값이-변경되면-어떡해요">헉 그럼 같은객체를 가리키면 값이 변경되면 어떡해요?</h3>
<blockquote>
</blockquote>
<p>노노! 그런걱정은 하지않아도 된다!
<code>왜?</code> String 클래스는 <code>불변 객체</code>이기 때문이다. 
값을 변동하고 싶으면 모두 새로운 객체로 생성해서 반환시킨다.</p>
<h1 id="ch4---래퍼-class-클래스">[Ch4 - 래퍼, Class 클래스]</h1>
<h3 id="wrapper-클래스-특징">Wrapper 클래스 특징</h3>
<blockquote>
<ul>
<li>Null을 가질 수 있다.</li>
</ul>
</blockquote>
<ul>
<li>불변이다.</li>
<li>값을 비교할 때는 equals()로 비교해야 한다.</li>
<li>AutoBoxing - AutoUnboxing 기능을 제공한다.</li>
</ul>
<blockquote>
<p><strong>📌내부 연산 10000번 줄이는 것 보다, 네트워크 호출 1번 줄이는 것이 훨씬 성능이 높아진다.</strong></p>
</blockquote>
<h3 id="class-클래스---리플렉션">Class 클래스 - 리플렉션</h3>
<blockquote>
</blockquote>
<p><code>Class 클래스를 사용</code>하면 클래스의 메타 정보를 기반으로 클래스에 정의된 메서드, 필드, 생성자 등을 조회하고 이들을 통해 객체 인스턴스를 생성하거나 메서드를 호출하는 작업을 할 수 있다. 이런 작업을 <code>리플렉션</code>이라고 한다.
-&gt; 아마 Spring, Mock?에서 많이 쓰이는 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바] 김영한의 실전자바 - 중급 1편 정리(1)]]></title>
            <link>https://velog.io/@7_06com/%EC%9E%90%EB%B0%94-%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84%EC%9E%90%EB%B0%94-%EC%A4%91%EA%B8%89-1%ED%8E%B8-%EC%A0%95%EB%A6%AC1</link>
            <guid>https://velog.io/@7_06com/%EC%9E%90%EB%B0%94-%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84%EC%9E%90%EB%B0%94-%EC%A4%91%EA%B8%89-1%ED%8E%B8-%EC%A0%95%EB%A6%AC1</guid>
            <pubDate>Thu, 11 Apr 2024 07:15:56 GMT</pubDate>
            <description><![CDATA[<h1 id="-ch1--object-클래스-">[ Ch1 : Object 클래스 ]</h1>
<h3 id="object-클래스">Object 클래스</h3>
<blockquote>
</blockquote>
<p><code>모든 객체의 최상위</code> 부모 클래스이다.</p>
<blockquote>
</blockquote>
<p>상속받는게 없으면, <code>묵시적으로 Object를 상속</code>받는다.</p>
<blockquote>
</blockquote>
<p>모든 객체가 Object 클래스의 공통된 기능을 사용할 수 있다.</p>
<blockquote>
</blockquote>
<p>모든 객체의 부모이므로, 모든 객체를 참조할 수 있다. (다형성)</p>
<h3 id="object-클래스의-공통-기능">Object 클래스의 공통 기능</h3>
<p><img src="https://velog.velcdn.com/images/7_06com/post/1c7d956e-1a9a-4b5d-8bc1-fb1bd9b8b2a8/image.png" alt=""></p>
<h3 id="동일성과-동등성">동일성과 동등성</h3>
<blockquote>
</blockquote>
<h1 id="-ch2--불변-객체-">[ Ch2 : 불변 객체 ]</h1>
<blockquote>
</blockquote>
<p>📌<strong>대전제 (강조) : 모든 변수는 값을 복사해서 대입한다.</strong>
<code>기본형</code> : 본인 값 그대로이기 때문에 하나의 값을 여러 변수에서 절대 공유하지 않는다.
<code>참조형</code> : 본인 안의 값이 참조값이기 때문에 복사해서 대입하면 여러 변수에서 공유하게 된다.</p>
<h3 id="불변객체의-반환-값">불변객체의 반환 값</h3>
<blockquote>
</blockquote>
<p><strong>📌 불변 객체에서 변경과 관련된 메서드들은 보통 객체를 새로 만들어서 반환하기 때문에 꼭! 반환 값을 받아야 한다.</strong></p>
<blockquote>
</blockquote>
<p>관례상, 불변 객체에서 값을 바꾸는 메서드는 <code>with</code>로 사용하는 경우가 많다.
ex) Coffee with Sugar : 기존 커피에 설탕좀 넣은 새로운걸 주세요</p>
<h3 id="stirng-클래스--integer-클래스-같은-클래스들은-모두-불변-객체로-이루어져-있다">Stirng 클래스 , Integer 클래스 같은 클래스들은 모두 불변 객체로 이루어져 있다!</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바] 김영한의 실전자바 - 기본편 정리(3)]]></title>
            <link>https://velog.io/@7_06com/%EC%9E%90%EB%B0%94-%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8%ED%8E%B8-%EC%A0%95%EB%A6%AC3</link>
            <guid>https://velog.io/@7_06com/%EC%9E%90%EB%B0%94-%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8%ED%8E%B8-%EC%A0%95%EB%A6%AC3</guid>
            <pubDate>Sun, 31 Mar 2024 15:02:30 GMT</pubDate>
            <description><![CDATA[<h2 id="-섹션-9--상속-"><strong>[ 섹션 9 : 상속 ]</strong></h2>
<h3 id="상속의-필요성">상속의 필요성</h3>
<blockquote>
</blockquote>
<p>다음은 <code>전기차</code>와 <code>주유차</code>  2종류의 차를 생성하여 사용하는 단적인 예시이다.</p>
<p>전기차</p>
<pre><code class="language-java">public class ElectricCar {
 public void move() {
     System.out.println(&quot;차를 이동합니다.&quot;);
 }

 public void charge() {
     System.out.println(&quot;충전합니다.&quot;);
 }
}</code></pre>
<p>주유차</p>
<pre><code class="language-java">public class GasCar {
 public void move() {
     System.out.println(&quot;차를 이동합니다.&quot;);
 }
 public void fillUp() {
     System.out.println(&quot;기름을 주유합니다.&quot;);
 }
}</code></pre>
<pre><code class="language-java">public class CarMain {
 public static void main(String[] args) {
 ElectricCar electricCar = new ElectricCar();
 electricCar.move();
 electricCar.charge();

 GasCar gasCar = new GasCar();
 gasCar.move();
 gasCar.fillUp();
 }
}</code></pre>
<blockquote>
<p>전기차와 주유차는 <code>차</code>라는 큰 개념에서 파생된 자동차들이다. 즉, <code>Car 라는 추상적인 개념</code> 에서 <code>구체화 된 2종류의 차 종류이다.</code> 해당 차들은 move() 라는 공통성을 갖게 됨으로, 공통적인 특성을 묶기 위해선 <code>상속</code>이 제격이다!</p>
</blockquote>
<h3 id="상속-예시">상속 예시</h3>
<pre><code class="language-java">//화살표 방향                -&gt;  : 화살표의 의미는 &quot;내가 너를 안다.&quot;로 생각하면 좋다.
public class ElectricCar extends Car{

    public void charge(){
        System.out.println(&quot;충전합니다.&quot;);
    }
}
</code></pre>
<pre><code class="language-java">//화살표 방향                
public class GasCar extends Car {

    public void fillUp(){
        System.out.println(&quot;기름을 주유합니다.&quot;);
    }
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/7_06com/post/0d4d997a-c87a-4c79-8668-2e42a17da992/image.png" alt=""></p>
<h3 id="📌상속-메모리-구조-아주-중요">📌상속 메모리 구조! (아주 중요)</h3>
<blockquote>
</blockquote>
<ol>
<li>상속을 받는 <code>인스턴스를 생성하면, 부모 클래스까지 한꺼번에 불러서 생성</code>한다.</li>
<li>메서드를 호출할 때, 메서드를 찾는 기준은 <code>호출한 변수의 타입명</code>을 보고 찾는다.
2-1) 만일, 호출한 타입에 해당 메서드가 없으면? -&gt; <strong>부모 메서드로 찾아간다.</strong>
2-2) 만일, 부모 메서드에도 해당 메서드가 없으면? -&gt; <strong>컴파일 오류 발생</strong></li>
</ol>
<p><strong>1. 생성과정</strong> : 상속한 부모클래스까지 생성
<img src="https://velog.velcdn.com/images/7_06com/post/d2bfd618-74e5-4808-90fb-581bed84c9f4/image.png" alt=""></p>
<p><strong>2. 메서드 호출 기준</strong> : 호출한 변수의 타입명을 본다.
<img src="https://velog.velcdn.com/images/7_06com/post/e8985e61-1d36-421f-9673-627b93322eb7/image.png" alt=""></p>
<p>2-1) 만일, 호출한 타입에 해당 메서드가 없으면? -&gt; <strong>부모 메서드로 찾아간다.</strong>
2-2) 만일, 부모 메서드에도 해당 메서드가 없으면? -&gt; <strong>컴파일 오류 발생</strong>
<img src="https://velog.velcdn.com/images/7_06com/post/c39422ef-f6d6-4171-9d7f-88b32d71caaf/image.png" alt=""></p>
<h3 id="상속과-접근-제어자--protected">상속과 접근 제어자 : protected</h3>
<blockquote>
</blockquote>
<p><code>protected</code> 의 사용이 여기서 나타난다 !</p>
<blockquote>
</blockquote>
<p><strong>private</strong> : <code>동일 클래스</code> 내 접근 허용
<strong>default</strong> : 동일 클래스 + <code>동일 패키지</code> 내 접근 허용
<strong>protected</strong> : 동일 클래스 + 동일 패키지 + <code>타 패키지-상속</code> 접근 허용
<strong>public</strong> : <code>모두 허용</code></p>
<h3 id="📌상속-중요-규칙">📌상속 중요 규칙</h3>
<blockquote>
</blockquote>
<p><strong>규칙 : 상속 관계를 사용하면, 자식 클래스의 생성자에서 부모 클래스의 생성자를 반드시 호출해야 한다.</strong></p>
<h3 id="super---부모-참조">super - 부모 참조</h3>
<blockquote>
</blockquote>
<p>동일한 필드명, 동일한 메서드가 오버라이딩 되어 있을 경우, super() 연산자를 통해서 부모 클래스에 대해 참조할 수 있다. </p>
<h3 id="생성자-호출-순서">생성자 호출 순서</h3>
<blockquote>
</blockquote>
<ol>
<li><code>B</code> extends <code>A</code></li>
<li><code>C</code> extends <code>B</code> 일 때,<blockquote>
</blockquote>
<code>A -&gt; B -&gt; C</code> 순서로 생성된다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바] 김영한의 실전자바 - 기본편 정리(2)]]></title>
            <link>https://velog.io/@7_06com/%EC%9E%90%EB%B0%94-%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8%ED%8E%B8-%EC%A0%95%EB%A6%AC2</link>
            <guid>https://velog.io/@7_06com/%EC%9E%90%EB%B0%94-%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8%ED%8E%B8-%EC%A0%95%EB%A6%AC2</guid>
            <pubDate>Tue, 19 Mar 2024 08:54:03 GMT</pubDate>
            <description><![CDATA[<h2 id="-섹션-6--접근-제어자-"><strong>[ 섹션 6 : 접근 제어자 ]</strong></h2>
<h3 id="접근-제어자의-필요성">접근 제어자의 필요성</h3>
<blockquote>
</blockquote>
<p>다음은 접근 제어자를 달지 않은 Speaker 클래스이다.
요구사항은 다음과 같다.</p>
<ul>
<li>Speaker의 볼륨은 절대로 100이 넘어가지 말게 설계해주세요.</li>
</ul>
<pre><code class="language-java">public class Speaker {
    int volume;

    Speaker(int volume){
        this.volume = volume;
    }

    void volumeUp(){
        if(volume &gt;=100){
            System.out.println(&quot;음량을 증가할 수 없습니다. 최대 음량입니다.&quot;);
        } else{
            volume += 10;
            System.out.println(&quot;음량을 10 증가합니다. &quot;);
        } 
    }
    void showVolume(){
        System.out.println(&quot;현재 음량 : &quot; + volume);
    }
}</code></pre>
<p>요구사항에 맞게 설계했기 때문에 해당 볼륨은 100 이상이 넘어가지 않는다! </p>
<pre><code class="language-java">        Speaker speaker = new Speaker(90);
        speaker.showVolume();

        speaker.volumeUp();
        speaker.showVolume();

        speaker.volumeUp();
        speaker.showVolume();
</code></pre>
<p><img src="https://velog.velcdn.com/images/7_06com/post/7b0d5b00-fdf8-41c2-ab64-dcf2f86449c2/image.png" alt=""></p>
<p>그러나 다음과 같이 다른 개발자가 해당 요구사항을 못보고 필드에 직접 접근해버린다면 어떻게 할까?</p>
<pre><code class="language-java">        //필드에 직접 접근
        System.out.println(&quot;volume 필드 직접 접근 수정&quot;);
        speaker.volume = 200;
        speaker.showVolume();</code></pre>
<p><img src="https://velog.velcdn.com/images/7_06com/post/d54d22c2-2002-41a4-be93-f91d0d204b4d/image.png" alt=""></p>
<p>요구사항이 무색하게 음량이 변해버린다.</p>
<p>다음과 같이 <code>private</code> 접근제어자를 필드에 선언함으로서 이러한 위험을 방지할 수 있다.</p>
<pre><code class="language-java">public class Speaker {
    private int volume; //private 사용 -&gt;  스피커 클래스 내에서만 접근 가능</code></pre>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/7_06com/post/90042866-c48a-462f-8598-2ad6ae660d49/image.png" alt=""></p>
<h3 id="접근제어자-종류--위치">접근제어자 종류 / 위치</h3>
<blockquote>
</blockquote>
<p><strong>종류</strong></p>
<blockquote>
</blockquote>
<p><code>private</code> : 본인 클래스를 제외한 모든 외부 접근 차단
<code>default</code> : 같은 패키지를 제외한 외부 접근 차단
<code>protected</code> : 같은 패키지 + 상속을 제외한 외부 접근 차단
<code>public</code> : 차단 X</p>
<blockquote>
</blockquote>
<p><strong>사용 위치</strong></p>
<blockquote>
</blockquote>
<p><code>클래스</code> , <code>필드</code> , <code>생성자</code> , <code>메서드</code></p>
<blockquote>
</blockquote>
<p><strong>❗ 필드와 지역변수는 다르다는 것을 명심하자! 지역변수에는 쓸 수 없다!</strong></p>
<h3 id="클래스-레벨의-접근제어자">클래스 레벨의 접근제어자</h3>
<blockquote>
</blockquote>
<p><strong>종류</strong></p>
<blockquote>
</blockquote>
<p><code>public</code> : 같은 자바파일에 public 클래스는 한 개만 만들 수 있다.
<code>default</code> : 같은 자바파일에 default 클래스는 무한개 만들 수 있다.</p>
<blockquote>
</blockquote>
<p><strong>❗ 자바규칙 : public 클래스는 반드시 .java파일명이랑 같아야한다.!</strong></p>
<h3 id="캡슐화란">캡슐화란?</h3>
<blockquote>
</blockquote>
<p>1) 캡슐화는 데이터와 기능을 한 클래스 안에 묶어서 사용하는 것이다. 
2) 더 나아가서 필요한 정보(메서드)만 외부에 노출시켜 사용하게 하는 것이다.</p>
<blockquote>
</blockquote>
<h4 id="잘-지켜진-캡슐화">잘 지켜진 캡슐화</h4>
<blockquote>
<p>1) 데이터는 모두 숨겨라
2) 메서드는 꼭 필요한 메서드만 노출시키고 나머지는 숨겨라.</p>
</blockquote>
<h2 id="-섹션-7--자바-메모리-구조와-static-"><strong>[ 섹션 7 : 자바 메모리 구조와 static ]</strong></h2>
<h3 id="자바-메모리-구조">자바 메모리 구조</h3>
<p><img src="https://velog.velcdn.com/images/7_06com/post/0b303c2b-f0a8-4421-a7fb-4d9ca35b953b/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>자바의 메모리 구조는 크게 메서드 영역, 스택 영역, 힙 영역 3개로 나눌 수 있다.
메서드 영역: 클래스 정보를 보관한다. 이 클래스 정보가 붕어빵 틀이다.
스택 영역: 실제 프로그램이 실행되는 영역이다. 메서드를 실행할 때 마다 하나씩 쌓인다.
힙 영역: 객체(인스턴스)가 생성되는 영역이다. new 명령어를 사용하면 이 영역을 사용한다. 쉽게 이야기해서 붕
어빵 틀로부터 생성된 붕어빵이 존재하는 공간이다. 참고로 배열도 이 영역에 생성된다.
방금 설명한 내용은 쉽게 비유로 한 것이고 실제는 다음과 같다</p>
<p><img src="https://velog.velcdn.com/images/7_06com/post/8208e743-0feb-4a12-96dd-efbe26481e78/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>메서드 영역(Method Area): 메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 이 영역은
프로그램의 모든 영역에서 공유한다.
클래스 정보: 클래스의 실행 코드(바이트 코드), 필드, 메서드와 생성자 코드등 모든 실행 코드가 존재한다.
static 영역: static 변수들을 보관한다. 뒤에서 자세히 설명한다.
런타임 상수 풀: 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다. 예를 들어서 프로그램에
&quot;hello&quot; 라는 리터럴 문자가 있으면 이런 문자를 공통으로 묶어서 관리한다. 이 외에도 프로그램을 효율
적으로 관리하기 위한 상수들을 관리한다.
스택 영역(Stack Area): 자바 실행 시, 하나의 실행 스택이 생성된다. 각 스택 프레임은 지역 변수, 중간 연산 결
과, 메서드 호출 정보 등을 포함한다.
스택 프레임: 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임이다. 메서드를 호출할 때 마다 하나의 스
택 프레임이 쌓이고, 메서드가 종료되면 해당 스택 프레임이 제거된다.
힙 영역(Heap Area): 객체(인스턴스)와 배열이 생성되는 영역이다. 가비지 컬렉션(GC)이 이루어지는 주요 영
역이며, 더 이상 참조되지 않는 객체는 GC에 의해 제거된다.</p>
<h3 id="메서드-코드는-메서드-영역에">메서드 코드는 메서드 영역에?</h3>
<blockquote>
</blockquote>
<pre><code class="language-java">class Bread{
    String name;
    int price;
 &gt;   
    void MethodA(){
    }
    void MethodB(){
    }
    ...C,D,E...
}</code></pre>
<p>대충이런 클래스가 있다고 하자!</p>
<blockquote>
</blockquote>
<p>Bread A = new Bread();
Bread B = new Bread();
라는 인스턴스를 생성하면, Bread 내부에 메서드도 모두 각자 생성되고 메모리를 잡아먹을까? </p>
<blockquote>
</blockquote>
<p><strong>답은 No!</strong>
메서드는 모두 같은 역할을 하고 있으므로, <code>인스턴스 변수에는 메모리가 할당</code>되지만, <code>메서드에 대한 새로운 메모리 할당은 없다</code>. <code>메서드는 메서드 영역에서 공통으로 관리</code>되고 실행된다.</p>
<h3 id="각-영역의-관리">각 영역의 관리</h3>
<blockquote>
</blockquote>
<p><strong>힙 영역</strong> : 인스턴스 관리
<strong>스택 영역</strong> : 지역변수 관리
<strong>메서드 영역</strong> : 그럼 메서드 영역은?</p>
<h3 id="static-변수">static 변수</h3>
<blockquote>
</blockquote>
<p>static 은 <code>정적 변수</code>, <code>static변수</code>, <code>클래스 변수</code> 다양하게 불리운다.</p>
<blockquote>
</blockquote>
<p><code>static</code>은 <code>메서드 영역 안에 있는 static영역에서 관리</code>된다.</p>
<blockquote>
</blockquote>
<p>변수에다가 static을 선언한 순간, 클래스 내부의 변수에 직접 접근이 가능하다.</p>
<blockquote>
</blockquote>
<pre><code class="language-java">public class Data3 {
    public String name;
    public static int count;    //static
&gt;
    public Data3(String name) {
        this.name = name;
        count++;
    }
}

&gt;
```java
public class DataCountMain3 {
    public static void main(String[] args) {
        Data3 data1 = new Data3(&quot;A&quot;);
        System.out.println(&quot;A count = &quot; + Data3.count);    //data3.count가 아닌 클래스접근
&gt;
        Data3 data2 = new Data3(&quot;B&quot;);
        System.out.println(&quot;B count = &quot; + Data3.count);
&gt;
        Data3 data3 = new Data3(&quot;C&quot;);
        System.out.println(&quot;C count = &quot;+ Data3.count);
    }
}</code></pre>
<blockquote>
</blockquote>
<h3 id="static-접근">static 접근</h3>
<blockquote>
</blockquote>
<p>static 영역 안에서는 인스턴스 변수,인스턴스 메서드 호출이 불가능하다. </p>
<blockquote>
</blockquote>
<p>반대로 인스턴스 영역 안에서는 static 변수, static 메서드 호출이 가능하다.</p>
<h2 id="-섹션-8--final-"><strong>[ 섹션 8 : final ]</strong></h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바] 김영한의 실전자바 - 기본편 정리(1)]]></title>
            <link>https://velog.io/@7_06com/%EC%9E%90%EB%B0%94-%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8%ED%8E%B8-%EC%9E%90%EC%B2%B4-%EC%A7%88%EB%AC%B8%EB%A6%AC%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@7_06com/%EC%9E%90%EB%B0%94-%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8%ED%8E%B8-%EC%9E%90%EC%B2%B4-%EC%A7%88%EB%AC%B8%EB%A6%AC%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Tue, 12 Mar 2024 08:23:34 GMT</pubDate>
            <description><![CDATA[<h2 id="-섹션-1--클래스-"><strong>[ 섹션 1 : 클래스 ]</strong></h2>
<h3 id="클래스가-왜-필요할까요"><strong>클래스가 왜 필요할까요?</strong></h3>
<blockquote>
<p><code>클래스는 설계도</code> 이다.
클래스(설계도)를 사용해서 실제 메모리에 만들어진 실체를 <code>객체,인스턴스</code>라고 한다.</p>
</blockquote>
<h3 id="클래스와-메모리할당">클래스와 메모리할당</h3>
<blockquote>
</blockquote>
<pre><code>    //선언한 순간 Student는 메모리에 올라간다(X). 메모리에 올라가지는 않고, 인스턴스가 생성되면 메모리에 올라간다.(O)
    //클래스(설계도)를 사용해서 실제 메모리에 만들어진 실체를 객체,인스턴스라고 한다.

    // Student = 설계도 : 그저, 하나의 파일이라고 생각? : (붕어빵틀)
    Student student1;   // 객체생성은 아님. car라는 참조 변수가 메모리 영역 stack이라는 영역에 만들어지는 단계
    student1 = new Student();   // 실체 : 메모리에 올라온 객체 (팥붕 하이)
                                // new 연산자를 통해 메모리 내에 공간을 할당받고, 메모리 주소값(참조값)을 반환한다. -&gt; 생성된 객체를 참조할 수 있는 참조값을 car에 담는다.
                                // 메모리를 할당 받는다는 것은 heap 영역에 저장된다는 것이다.
                                // heap영역은 생성된 객체들이 GC에 의해 자동 소멸되어지는 공간이다.</code></pre><h3 id="new-연산자">new 연산자</h3>
<blockquote>
<p>new 연산자는 객체를 Heap이라는 메모리 영역에 메모리 공간을 할당해주고 메모리주소를 반환한 후 생성자를 실행시켜준다</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/7_06com/post/efa75583-8f45-4fe8-9244-3082fb08f0f0/image.png" alt=""></p>
<p>[참고] <a href="https://yoo11052.tistory.com/52">https://yoo11052.tistory.com/52</a></p>
<h3 id="클래스-내부에-정의한-변수들을-무엇이라고-칭하나요">클래스 내부에 정의한 변수들을 무엇이라고 칭하나요?</h3>
<blockquote>
<p><code>멤버변수</code>, 혹은 <code>필드</code>라고 칭한다.
클래스에 소속된 변수를 뜻한다.</p>
</blockquote>
<h3 id="자바의--연산대입은-항상-값을-복사한다는-점을-기억하자">자바의 = 연산(대입)은 항상 값을 복사한다는 점을 기억하자!</h3>
<pre><code class="language-java">        Student student1 = new Student();   //x001
        student1.name = &quot;학생1&quot;;
        student1.age = 15;
        student1.grade = 90;

        Student student2 = new Student();   //x002
        student2.name = &quot;학생2&quot;;
        student2.age = 16;
        student2.grade = 80;

        Student[] students = new Student[2];    //x005
        // ✔ 자바에서 대입은 항상 변수에 들어 있는 값을 복사한다!
        // 각 student 변수에는 뭐가 들어있었을까? (&quot;값&quot;이 아닌 &quot;주솟값&quot;을 복사한다는 점을 생각해보자!)
        students[0] = student1;         //x005[x001][x002] 라고 생각
        students[1] = student2;

        students[0].name=&quot;해킹&quot;;
        System.out.println(student1.name); // 출력 값 : 해킹</code></pre>
<p><img src="https://velog.velcdn.com/images/7_06com/post/6911005e-20e1-4958-8ec2-d3cbdb4c7192/image.png" alt=""></p>
<h2 id="-섹션-2--기본형과-참조형-"><strong>[ 섹션 2 : 기본형과 참조형 ]</strong></h2>
<h3 id="자바의-대입은-항상-값을-복사한다는-점을-기억하자-반복">자바의 대입은 항상 값을 복사한다는 점을 기억하자! (반복)</h3>
<h3 id="기본형과-참조형의-차이는">기본형과 참조형의 차이는?</h3>
<blockquote>
</blockquote>
<ul>
<li><strong>기본형(Primitive Type)</strong>: <code>int</code> , <code>long</code> , <code>double</code> ,<code>boolean</code> 처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입을 기본형이라 한다.</li>
<li><strong>참조형(Reference Type)</strong>: <code>Student student1</code> , <code>int[] students</code> 와 같이 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입을 참조형이라 한다. <strong>참조형은 객체 또는 배열에 사용</strong>된다.</li>
</ul>
<h3 id="기본형과-참조형-대입-코드로-이해하기">기본형과 참조형 대입 코드로 이해하기</h3>
<h4 id="기본형-대입">기본형 대입</h4>
<pre><code class="language-java">int a = 10;
int b = a;</code></pre>
<p>-&gt; 리터럴 값이 복사되어 a가 변경되어도 b에는 영향이 없다. (다른 건물)</p>
<h4 id="참조형-대입">참조형 대입</h4>
<pre><code class="language-java">Student s1 = new Student();
Student s2 = s1;</code></pre>
<p>-&gt; 주소 값이 복사되어 a가 변경되면 b도 변경된다. (같은 건물)</p>
<h3 id="gcgarbage-collection-이란">GC(Garbage Collection) 이란?</h3>
<ul>
<li>JAVA는 JVM 위에서 GC의 기능을 제공한다.</li>
<li>heap 영역에서 아무것도 참조하지 않는 인스턴스는 GC(Garbage Collection) 기능으로 메모리에서 삭제된다.</li>
<li>C언어는 GC의 기능이 없어서, 직접 해제 해주어야 한다.</li>
</ul>
<blockquote>
</blockquote>
<pre><code class="language-java">        Data data = null;
        System.out.println(data);
        data = new Data();
        System.out.println(data);
        data = null;    // GC의 효과 발생 ! 앞선 Data 인스턴스를 참조하는게 아무것도 없음
        System.out.println(data);</code></pre>
<h2 id="-섹션-3--객체지향프로그래밍-"><strong>[ 섹션 3 : 객체지향프로그래밍 ]</strong></h2>
<h3 id="절차-지향-프로그래밍-vs-객체-지향-프로그래밍">절차 지향 프로그래밍 VS 객체 지향 프로그래밍</h3>
<blockquote>
</blockquote>
<p><code>절차 지향 프로그래밍</code></p>
<ul>
<li>절차. 즉 실행 순서를 지향한다. (&quot;어떻게&quot;를 중심으로 해결할 지 프로그래밍)</li>
<li>하나의 흐름대로 처리하는 방식<blockquote>
</blockquote>
<code>객체 지향 프로그래밍</code></li>
<li>객체. 즉 어떠한 사물이나 사건을 지향한다. (&quot;무엇을&quot;중심으로 해결할 지 프로그래밍)</li>
<li>객체를 중심으로 바라보다보니 서로간의 상호작용을 중요시 함.<blockquote>
</blockquote>
<code>가장 큰 차이</code></li>
<li>데이터 처리 방식 : 변수(데이터)와 기능(함수)를 분리하는지 여부이다.</li>
<li><blockquote>
<p>절차지향 : 데이터와 기능을 분리시켜 사용한다.</p>
</blockquote>
</li>
<li><blockquote>
<p>객체지향 : 객체 안에 기능을 포함해서 사용한다.</p>
</blockquote>
</li>
</ul>
<h3 id="🔍메서드는-객체를-생성해야-호출-할-수-있다">🔍메서드는 객체를 생성해야 호출 할 수 있다.</h3>
<blockquote>
<p>그러나 <code>static</code>이 붙으면 객체를 생성하지 않고도 메서드를 호출 할 수 있다.</p>
</blockquote>
<h3 id="캡슐화란">캡슐화란?</h3>
<blockquote>
<p>속성과 기능을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는 것</p>
</blockquote>
<pre><code class="language-java">        MusicPlayer player = new MusicPlayer();
        //음악 플레이어 켜기
        player.on();
        //볼륨 증가
        player.volumeUp();
        //볼륨 증가
        player.volumeUp();
        //볼륨 감소
        player.volumeDown();
        //음악 플레이어 상태
        player.showStatus();
        //음악 플레이어 끄기
        player.off();</code></pre>
<h2 id="-섹션-4--생성자-"><strong>[ 섹션 4 : 생성자 ]</strong></h2>
<h3 id="생성자의-필요성">생성자의 필요성</h3>
<blockquote>
</blockquote>
<h4 id="memberinit-클래스">MemberInit 클래스</h4>
<pre><code class="language-java">public class MemberInit {
    String name;
    int age;
    int grade;
}</code></pre>
<h4 id="절차지향-코드1-모듈화-x">절차지향 코드1 (모듈화 X)</h4>
<blockquote>
</blockquote>
<p>다음은 절차지향에서 사용했던 생성자이다. </p>
<pre><code class="language-java">public static void main(String[] args) {
        MemberInit member1 = new MemberInit();
        member1.name = &quot;user1&quot;;
        member1.age = 15;
        member1.grade = 90;
&gt;
        MemberInit member2 = new MemberInit();
        member2.name = &quot;user2&quot;;
        member2.age = 16;
        member2.grade = 80;
&gt;
        MemberInit[] members = {member1,member2};
        }
    }</code></pre>
<h4 id="절차지향-코드2-모듈화-o">절차지향 코드2 (모듈화 O)</h4>
<blockquote>
</blockquote>
<p>위 과정에서 메서드를 추출한 방법이다. 여전히 모듈화를 사용했으나, 객체지향적이지는 못하다.</p>
<pre><code class="language-java">        MemberInit member1 = new MemberInit();
        initMemeber(member1, &quot;user1&quot;, 15,90);
&gt;
        MemberInit member2 = new MemberInit();
        initMemeber(member2, &quot;user2&quot;, 16,80);
&gt;
        MemberInit[] members = {member1,member2};
        }
    }
    static void initMemeber(MemberInit member, String name, int age, int grade){
        member.name = name;
        member.age = age;
        member.grade = grade;
    }</code></pre>
<blockquote>
</blockquote>
<h4 id="클래스-내에-메서드-넣기">클래스 내에 메서드 넣기</h4>
<p>클래스 내에 메서드를 넣어줌으로서 객체지향적인 코드가 완성되었다!</p>
<pre><code class="language-java">public class MemberInit {
    String name;
    int age;
    int grade;
&gt;
    //this : 자기 자신(인스턴스)의 참조값을 가리킨다 x001.name
    //같은 변수이름이면 코드블럭의 우선순위는 매개변수가 갖게 된다.
    void initMember(String name, int age, int grade){
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}</code></pre>
<blockquote>
</blockquote>
<h4 id="객체지향-코드1">객체지향 코드1</h4>
<pre><code class="language-java">        MemberInit member1 = new MemberInit();
        member1.initMember(&quot;user1&quot;, 15,90);
&gt;
        MemberInit member2 = new MemberInit();
        member2.initMember(&quot;user2&quot;, 16,80);
&gt;
        MemberInit[] members = {member1,member2};
</code></pre>
<pre><code>


### 생성자
&gt;
프로그래밍을 하다보면 객체를 생성하고 그 즉시 초기값을 할당해야 하는 경우가 많다.
따라서 객체 지향 언어는 `객체를 생성 하자마자 즉시 필요한 &quot;기능&quot;을 수행`할 수 있도록 `생성자`라는 기능을 제공한다.
&gt;
생성자는 메서드와 비슷하지만 다음과 같은 차이가 있다.
- 생성자의 이름은 클래스 `이름과 같아야 한다`. 따라서 `첫 글자도 대문자`로 시작!
- 생성자는 `반환 타입이 없다` !
- `그 외에는 메서드와 같은 기능`을 한다.

### 생성자가 하나도 없으면?
&gt;
생성자가 `하나도 없으면` `자바 컴파일러`는 `매개변수도, 어떠한 기능도 없는 기본 생성자`를 자동으로 만들어준다.
&gt;
**but 생성자가 `하나라도 있으면` 기본 생성자를 만들지 않는다.**

### 생성자의 가장 큰 장점
&gt;
생성자를 정의했다면, `정의한 생성자를 &quot;반드시&quot; 호출 해야한다`는 `제약사항`이 생긴다.
-&gt; **생성자를 사용하면 필수값 입력을 보장할 수 있다.**
&gt;
만일 생성자를 직접 정의했는데, 호출하지 않으면 `컴파일 에러`가 발생한다.
&gt;
**📌`좋은 프로그램`은 무한한 자유도가 주어진 프로그램이 아니라 `적절한 제약사항이 주어진 프로그램`이다**

### 생성자 오버로딩 
&gt;
아래와 같이 생성자도 매개변수에 따라 오버로딩이 가능하다!
```java
public class MemberConstruct {
    String name;
    int age;
    int grade;
&gt;
    MemberConstruct(String name, int age, int grade){
        System.out.println(&quot;생성자 호출 name=&quot; + name + &quot;,age=&quot; + age + &quot;,grade=&quot; + grade);
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
&gt;
    MemberConstruct(String name, int age){
        this.name = name;
        this.age = age;
        this.grade = 50;
    }</code></pre><p>근데 여기서 this.name, this.age 와 같이 중복되는 코드를 지우고 싶으면 어떻게 해야할까?</p>
<blockquote>
</blockquote>
<h4 id="this">this()</h4>
<p>this() 기능으로 위와같은 기능을 수행할 수 있다.</p>
<ul>
<li>this() 는 <code>생성자 내부</code>에서만 사용 가능하다.</li>
<li>this() 는 생성자 블록 <code>첫 줄</code> 에서만 가능하다. (아니면 컴파일 오류)<pre><code class="language-java">  MemberConstruct(String name, int age, int grade){
      System.out.println(&quot;생성자 호출 name=&quot; + name + &quot;,age=&quot; + age + &quot;,grade=&quot; + grade);
      this.name = name;
      this.age = age;
      this.grade = grade;
  }
&gt;
  MemberConstruct(String name, int age){
      this(name,age,50);  //변경 : 중복제거
//        this.name = name;
//        this.age = age;
//        this.grade = 50;
  }</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바] 김영한의 실전자바 - 입문편 자체 질문리스트]]></title>
            <link>https://velog.io/@7_06com/%EC%9E%90%EB%B0%94-%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84%EC%9E%90%EB%B0%94-%EC%9E%85%EB%AC%B8%ED%8E%B8-%EC%9E%90%EC%B2%B4-%EC%A7%88%EB%AC%B8%EB%A6%AC%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@7_06com/%EC%9E%90%EB%B0%94-%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84%EC%9E%90%EB%B0%94-%EC%9E%85%EB%AC%B8%ED%8E%B8-%EC%9E%90%EC%B2%B4-%EC%A7%88%EB%AC%B8%EB%A6%AC%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Tue, 12 Mar 2024 08:23:11 GMT</pubDate>
            <description><![CDATA[<h2 id="-섹션-1--hello-world-"><strong>[ 섹션 1 : Hello World ]</strong></h2>
<h3 id="java의-특징을-설명해주세요"><strong>Java의 특징을 설명해주세요.</strong></h3>
<blockquote>
</blockquote>
<ol>
<li>[운영체제 독립성]
자바 프로그램은 자바가 설치된 모든 운영체제에서 실행할 수 있기에 자바 개발자는 특정 운영체제에 맞추어 개발하지 않아도 된다. (운영체제 호환성 문제 해결)</li>
<li>[객체 지향 언어]
자바는 C언어에 객체 지향적 기능을 추가하여 만든 C++과는 달리, 처음부터 객체 지향 언어로 개발된 프로그래밍 언어이다.</li>
</ol>
<h3 id="jvm의-역할에-대해-설명해주세요"><strong>JVM의 역할에 대해 설명해주세요.</strong></h3>
<h3 id="자바-응용-프로그램을-개발하고자-하는-개발자에게는-jdk와-jre-중-어떤-것이-필요할까요"><strong>자바 응용 프로그램을 개발하고자 하는 개발자에게는 JDK와 JRE 중 어떤 것이 필요할까요?</strong></h3>
<h3 id="jvm-jre-jdk에-대해-설명해주세요"><strong>JVM, JRE, JDK에 대해 설명해주세요.</strong></h3>
<blockquote>
</blockquote>
<ul>
<li><strong>JVM : Java Virtual Machine</strong>
자바로 개발한 프로그램을 운영체제에 종속받지 않고 컴파일하여 만들어지는 바이트코드를 실행시키기 위한 가상머신이다. <blockquote>
</blockquote>
</li>
<li><strong>JDK : Java Development Kit</strong>
자바 개발자에게 무료로 배포하는 소프트웨어
자바 컴파일러 등의 개발도구와 JRE로 구성되어 있어 자바 프로그램을 만들기 위해서는 설치가 꼭 필요하다. |<blockquote>
</blockquote>
</li>
<li><strong>JRE : Java Runtime Environment</strong>
자바가 실행될 수 있는 최소한의 파일들이 설치되어 있는 환경
자바 파일을 컴파일하기 위한 도구는 포함되지 않는다.  |</li>
</ul>
<blockquote>
<p><strong>Java 언어의 장단점에 대해 설명해주세요.</strong></p>
</blockquote>
<p>[장점]</p>
<ol>
<li>[운영체제 독립성]
자바 프로그램은 자바가 설치된 모든 운영체제에서 실행할 수 있기에 자바 개발자는 특정 운영체제에 맞추어 개발하지 않아도 된다. (운영체제 호환성 문제 해결)</li>
<li>[안정성]
자동 메모리 관리 등을 지원하여 다른 언어에 비해 안정성이 높다.</li>
</ol>
<p>[단점]</p>
<ol>
<li>[실행 속도]
자바는 실행을 위해 자바 가상 머신을 거쳐야 하므로, 다른 언어에 비해 실행 속도가 느리다.</li>
<li>[예외 처리]
자바는 예외 처리가 잘 되어 있지만, 개발자가 일일이 처리를 지정해 줘야 한다는 불편함이 있다.</li>
<li>[코드 길이]
다른 언어에 비해 작성해야 하는 코드의 길이가 긴 편이다.</li>
</ol>
<blockquote>
<p><strong>Java의 컴파일 과정과 실행과정에 대해 설명해주세요.</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/7_06com/post/5b6ed55e-7493-4524-852c-864f5ab4f252/image.png" alt=""></p>
<p>자바 프로그램은 컴파일과 실행 단계를 거친다. 자바가 제공하는 컴파일러인 <code>javac</code>를 사용해서 개발자가 작성한 소스 코드를 컴파일 한다. 컴파일을 진행하며 자바 소스 코드를 바이트코드로 변환하여 자바 가상 머신(JVM)에서 더 빠르게 실행될 수 있게 최적화하고 문법 오류도 검출한다. 이 과정을 거치며 자바 가상 머신이 인식할 수 있는 <code>.class</code> 파일이 생성된다. 이후, 자바가 제공하는 <code>java</code>라는 프로그램을 사용해 자바 가상 머신은 <code>.class</code> 파일을 실행시켜 프로그램을 작동시킨다.</p>
<blockquote>
<p><strong>컴파일을 왜 해야 할까요?</strong></p>
</blockquote>
<p>개발자가 작성한 소스 코드를 컴퓨터가 이해할 수 있는 언어(기계어)로 바꿔야 한다.</p>
<blockquote>
<p><strong>컴파일 된 파일은 어디에 저장이 되어있을까요?</strong></p>
</blockquote>
<p>자바 가상 머신에 저장되어 있다.</p>
<h3 id="-섹션-2--변수-"><strong>[ 섹션 2 : 변수 ]</strong></h3>
<blockquote>
<p><strong>변수를 선언하면 컴퓨터의 어디에 저장이 되는걸까요?</strong></p>
</blockquote>
<p>변수는 메모리에 저장되고, 데이터 타입에 따라 메모리 공간이 할당된다.</p>
<blockquote>
<p><strong>변수 초기화가 필요한 이유는 무엇인가요?</strong></p>
</blockquote>
<p>컴퓨터에서 메모리는 여러 시스템이 함께 사용하는 공간이기 때문에 어떠한 값들이 계속 저장된다. 변수를 선언하면 메모리상의 어떤 공간을 차지하고 사용하는데, 그 공간에 기존에 어떤 값이 있었는지는 아무도 모른다. 따라서 초기화를 하지 않으면 이상한 값(쓰레기 값)이 출력될 수 있다.</p>
<blockquote>
<p><strong>java : variable a might not have been initialized 는 어떤 오류인가요?</strong></p>
</blockquote>
<p>변수를 초기화하지 않고 사용할 경우 발생한다. (컴파일러)</p>
<blockquote>
<p><strong>자바 문법이 맞지 않았을 때 발생하는 에러는 무슨 에러인가요?</strong></p>
</blockquote>
<p>컴파일 에러가 발생한다.</p>
<blockquote>
<p><strong>리터럴(literal) 이란 무엇인가요.</strong></p>
</blockquote>
<p>개발자가 직접 입력한 고정된 값이다. 예를 들어 <code>int a = 10;</code>에서 <code>10</code>을 말한다.</p>
<blockquote>
<p><strong>int의 범위는 대략 어떻게 되나요?</strong></p>
</blockquote>
<p>대략 21억 </p>
<blockquote>
<p><strong>long 변수의 리터럴을 선언할 때 주의할 점은 무엇인가요?</strong></p>
</blockquote>
<p>숫자 뒤에 대문자 L 또는 소문자 l 모두 가능하지만, 숫자 1과 착각할 수 있어서 소문자 l은 권장되지 않는다.</p>
<blockquote>
<p><strong>변수는 어떤 표기법을 지향하나요.</strong></p>
</blockquote>
<p>Camel Case</p>
<blockquote>
<p><strong>Java에서 제공하는 원시 타입들에 무엇이 있고, 각각 몇 바이트를 차지하나요?</strong></p>
</blockquote>
<table>
<thead>
<tr>
<th>byte</th>
<th>128 ~ 127 (1byte, 2⁸)</th>
</tr>
</thead>
<tbody><tr>
<td>short</td>
<td>32,768 ~ 32,767 (2byte, 2¹⁶)</td>
</tr>
<tr>
<td>int</td>
<td>-2,147,483,648 ~ 2,147,483,647 (약 20억) (4byte, 2³²)</td>
</tr>
<tr>
<td>long</td>
<td>9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (8byte, 2⁶⁴)</td>
</tr>
<tr>
<td>float</td>
<td>대략 -3.4E38 ~ 3.4E38, 7자리 정밀도 (4byte, 2³²)</td>
</tr>
<tr>
<td>double</td>
<td>대략 -1.7E308 ~ 1.7E308, 15자리 정밀도 (8byte, 2⁶⁴)</td>
</tr>
<tr>
<td>boolean</td>
<td>true , false (1byte)</td>
</tr>
<tr>
<td>char</td>
<td>문자 하나 (2byte)</td>
</tr>
</tbody></table>
<h3 id="-섹션-3--연산자-"><strong>[ 섹션 3 : 연산자 ]</strong></h3>
<blockquote>
<p><strong>전위 연산자와 후위 연산자의 차이가 있을까요?</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/7_06com/post/9a66196d-8dd1-4213-8a86-44a50b70d3dd/image.png" alt=""></p>
<p><strong>전위</strong>(Prefix) <strong>증감 연산자</strong>는 증감 연산자를 피연산자 앞에 둘 수 있다. (<code>++a</code>) 이 경우에는 증감 연산이 먼저 수행한 후 나머지 연산이 수행한다.</p>
<p><img src="https://velog.velcdn.com/images/7_06com/post/296c2cb5-e48d-4582-876c-c8fc1acc1869/image.png" alt=""></p>
<p><strong>후위</strong>(Postfix) <strong>증감 연산자</strong>는 증감 연산자를 피연산자 뒤에 둘 수 있다. (<code>a++</code>) 이 경우에는 다른 연산이 먼저 수행된 후 증감 연산이 수행된다.</p>
<blockquote>
<p><strong>a=0, b=1 일 때, b = ++a; 와 b = a++ 의 차이점을 알려주세요. ( print(a , b)를 했을 경우)</strong></p>
</blockquote>
<p>++a의 경우, 전위 증감 연산자로 증감 연산이 먼저 수행된 후, 나머지 연산이 수행되어 a = 1, b =2를 가집니다.</p>
<p>a++의 경우, 후위 증감 연산자로 다른 연산이 먼저 수행된 후, 증감 연산이 수행되어 a = 1, b =2를 가집니다.</p>
<h3 id="-섹션-5--반복문-"><strong>[ 섹션 5 : 반복문 ]</strong></h3>
<blockquote>
<p><strong>Java에는 어떤 반복문이 있는지 말하고, 각각의 반복문의 특징에 대해 설명해주세요.</strong></p>
</blockquote>
<table>
<thead>
<tr>
<th>while</th>
<th>조건에 따라 코드를 반복해서 실행할 때 사용한다.</th>
</tr>
</thead>
<tbody><tr>
<td>do-while</td>
<td>조건에 상관없이 무조건 한 번은 코드를 실행한다. 따라서 최초 한번은 코드 블럭을 꼭 실행해야 하는 경우에 사용한다.</td>
</tr>
<tr>
<td>for</td>
<td>주로 반복 횟수가 정해져 있을 때 사용한다.</td>
</tr>
</tbody></table>
<h3 id="-섹션-6--스코프-형변환-"><strong>[ 섹션 6 : 스코프, 형변환 ]</strong></h3>
<blockquote>
<p><strong>스코프가 필요한 이유에 대해 설명해주세요.</strong></p>
</blockquote>
<p>스코프가 없다면 같은 이름을 가진 변수의 충돌이 일어날 수 있고, 또한 함수 내에서 선언한 변수들과 함수 외에서 선언한 변수들 간의 에러에 대한 고려 조건이 발생할 수 있다.</p>
<p>접근 범위, 즉 스코프라는 개념을 만듦으로써 비효율적인 메모리 사용을 막을 수 있고, 코드 복잡성을 줄이는 코드를 만들어 유지보수에 도움을 줄 수 있다.</p>
<blockquote>
<p><strong>java : cannot find symbol은 어떤 오류인가요?</strong></p>
</blockquote>
<p>변수 이름을 찾을 수 없다는 컴파일 오류이다.</p>
<blockquote>
<p><strong>묵시적 형변환이란 무엇이며, 언제 일어날 수 있을까요?</strong></p>
</blockquote>
<p>개발자가 직접 형변환을 하지 않아도 직접 형변환이 이루어진다.</p>
<p>작은 범위에서 큰 범위로 캐스팅을 할 때 이루어진다.</p>
<blockquote>
<p><strong>명시적 형변환은 언제 해주어야 하나요?</strong></p>
</blockquote>
<p>개발자가 직접 형변환을 해줘야 한다.</p>
<p>큰 범위에서 작은 범위로 캐스팅할 때 이루어진다. (오버플로우 문제 발생)</p>
<blockquote>
<p><strong>error: incompatible types 은 어떤 에러인가요?</strong></p>
</blockquote>
<p>형변환을 할 수 없을 때 발생한다.</p>
<p>→ 호환되지 않는 유형</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Open API Json Date DTO 객체 만들기 (직렬화 / 역직렬화) + JSON 데이터의 장점]]></title>
            <link>https://velog.io/@7_06com/Open-API-Json-Date-DTO-%EA%B0%9D%EC%B2%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EC%A7%81%EB%A0%AC%ED%99%94-%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94</link>
            <guid>https://velog.io/@7_06com/Open-API-Json-Date-DTO-%EA%B0%9D%EC%B2%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EC%A7%81%EB%A0%AC%ED%99%94-%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94</guid>
            <pubDate>Mon, 04 Mar 2024 14:10:00 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/7_06com/post/7df5090e-52b2-4ba3-b06b-ffb08d2d7cb2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/7_06com/post/30929b01-9a56-49f5-b436-ca58495a1012/image.png" alt=""></p>
<p>위와 같은 json 데이터 level에 따라서 클래스 단위로 DTO를 생성해주면 된다.
<a href="https://valuelog.tistory.com/43">https://valuelog.tistory.com/43</a></p>
<p>이러한 과정을 <strong>역직렬화</strong> 라고도 한다.</p>
<h3 id="json-데이터의-장점">JSON 데이터의 장점!</h3>
<p>ex) js object로 로직을 구현한 경우,  py에서 쓰고싶다면? (JSON만 있다고 가정)
바로 가져다 쓰는게 아니라 외부에서 사용할 수 있도록 직렬화 작업을 해줘야 함</p>
<ol>
<li>JSON.stringify() : 문자열로 변환 됨</li>
<li>해당 문자열을 기반으로 파이썬에서 불러와서 사용할 수 있음 → dict로 변환(파이썬)</li>
</ol>
<p>JSON의 활용
JSON은 프로그래밍 언어와 프레임워크 등에 독립적이므로, 서로 다른 시스템간에 데이터를 교환하기에 좋음</p>
<p>주로 API의 반환형태, 시스템을 구성하는 설정파일에 활용</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[공공 API 호출 및 가공]]]></title>
            <link>https://velog.io/@7_06com/%EA%B3%B5%EA%B3%B5-API-%ED%98%B8%EC%B6%9C-%EB%B0%8F-%EA%B0%80%EA%B3%B5</link>
            <guid>https://velog.io/@7_06com/%EA%B3%B5%EA%B3%B5-API-%ED%98%B8%EC%B6%9C-%EB%B0%8F-%EA%B0%80%EA%B3%B5</guid>
            <pubDate>Mon, 04 Mar 2024 10:15:03 GMT</pubDate>
            <description><![CDATA[<ol>
<li>공공 API 를 규격에 맞게 API를 호출하고 , <code>Json형식 String</code> 으로 저장한다.</li>
</ol>
<pre><code class="language-java"> // 1. URL을 만들기 위한 StringBuilder
        StringBuilder urlBuilder = new StringBuilder(&quot;http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty&quot;); /*URL*/

        // 2. 오픈 API의 요청 규격에 맞는 파라미터 생성
        urlBuilder.append(&quot;?&quot; + URLEncoder.encode(&quot;serviceKey&quot;,&quot;UTF-8&quot;) + &quot;=ebZTQ4iRgDlaQNNtqJ5A9RcdWIhNzGvnQFQxLCwXDgjX/pNKJ49cQjal7Otx6mIyZpr/GWQWvwieBTwSMcb40w==&quot;); /*Service Key*/
        urlBuilder.append(&quot;&amp;&quot; + URLEncoder.encode(&quot;returnType&quot;,&quot;UTF-8&quot;) + &quot;=&quot; + URLEncoder.encode(&quot;json&quot;, &quot;UTF-8&quot;)); /*xml 또는 json*/
        urlBuilder.append(&quot;&amp;&quot; + URLEncoder.encode(&quot;numOfRows&quot;,&quot;UTF-8&quot;) + &quot;=&quot; + URLEncoder.encode(&quot;100&quot;, &quot;UTF-8&quot;)); /*한 페이지 결과 수*/
        urlBuilder.append(&quot;&amp;&quot; + URLEncoder.encode(&quot;pageNo&quot;,&quot;UTF-8&quot;) + &quot;=&quot; + URLEncoder.encode(&quot;1&quot;, &quot;UTF-8&quot;)); /*페이지번호*/
        urlBuilder.append(&quot;&amp;&quot; + URLEncoder.encode(&quot;sidoName&quot;,&quot;UTF-8&quot;) + &quot;=&quot; + URLEncoder.encode(&quot;서울&quot;, &quot;UTF-8&quot;)); /*시도 이름(전국, 서울, 부산, 대구, 인천, 광주, 대전, 울산, 경기, 강원, 충북, 충남, 전북, 전남, 경북, 경남, 제주, 세종)*/
        urlBuilder.append(&quot;&amp;&quot; + URLEncoder.encode(&quot;ver&quot;,&quot;UTF-8&quot;) + &quot;=&quot; + URLEncoder.encode(&quot;1.0&quot;, &quot;UTF-8&quot;)); /*버전별 상세 결과 참고*/

        // 3. URL 객체 생성 (String으로 변환)
        URL url = new URL(urlBuilder.toString());

        // 4. 요청하고자 하는 URL과 통신하기 위한 Connection 객체 생성
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        // 5. 통신을 위한 메소드 세팅 (&quot;GET&quot;)
        conn.setRequestMethod(&quot;GET&quot;);

        // 6. 통신을 위한 Content-type 세팅 (&quot;JSON&quot; 으로 해야함 - reuslt의 값은 String이기 때문에)
        conn.setRequestProperty(&quot;Content-type&quot;, &quot;application/json&quot;);
        // 7. 통신 응답 코드 확인
        System.out.println(&quot;Response code: &quot; + conn.getResponseCode());

        // 8. 전달받은 데이터를 BufferedReader 객체로 저장. 오류가 날 경우 error발생
        BufferedReader rd;
        if(conn.getResponseCode() &gt;= 200 &amp;&amp; conn.getResponseCode() &lt;= 300) {
            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        } else {
            rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        }

        // 9. 저장된 데이터를 라인별로 읽어 StringBuilder 객체로 저장
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line);
        }
        // 10. 객체 해제
        rd.close();
        conn.disconnect();</code></pre>
<h3 id="우리는-그럼-이제-무엇을-해야할까">우리는 그럼 이제 무엇을 해야할까?</h3>
<p>적절한 데이터로 가공하고 사용하기 위해 DTO 로 개발! </p>
<p>즉, JSON Parsing 과정이 필요하다.</p>
<blockquote>
</blockquote>
<p>이걸 왜 파싱해?간단하죠. 저희는 이렇게 JSON형태로 온 데이터들을 파싱, 음..데이터를 뽑아낸다고 말하는게 좋을까요?저 형태로는 저 데이터들을 이용할 수 없으니까요. 우리는 저기서 데이터들을 뽑아서 아 이름이 테스트고, 나이가 25고.. 배열 또는 딕셔너리 형태로 저장해야 저 데이터들을 쓸 수 있겠죠?그래서 다들 JSON 파싱 파싱 그러는거랍니다. 
출처: <a href="https://zeddios.tistory.com/90">https://zeddios.tistory.com/90</a> [ZeddiOS:티스토리]</p>
<pre><code class="language-java">        String jsonString = sb.toString();

        // 11. 결과 출력
//        System.out.println(jsonString);
        log.warn(&quot;진입1&quot;);
        log.info(jsonString);

        // 12. 해야할 것 -&gt; 데이터 사용하려면 적절하게 가공해야함
        // 입력이 Json 형테의 String으로 들어오는 상황. -&gt; Json파싱 필요
        // JSONParser, gson, ObjectMapper등을 사용하여 변환가능.

        jsonParser2(jsonString);

    public void jsonParser2(String jsonString) throws ParseException {
        log.info(&quot;진입2&quot;);
        // 1. 문자열 형태의 JSON을 파싱하기 위한 JSONParser 객체 생성
        JSONParser parser = new JSONParser();
        // 2. 문자열을 JSON 형태로 JSONObject 객체에 저장
        JSONObject obj = (JSONObject)parser.parse(jsonString);
        // 3. 필요한 리시트 데이터 부분만 가져와 JSONArray로 저장
        JSONArray dataArr = (JSONArray)obj.get(&quot;data&quot;);
        // 4. 출력 확인
        System.out.println(dataArr.toString());
    }</code></pre>
<p>해당 과정을 했을때의 에러코드이다.</p>
<p><img src="https://velog.velcdn.com/images/7_06com/post/1bfadfe1-a73e-4b43-b38c-e0efc2a6ebef/image.png" alt=""></p>
<p>잘보면 String 으로는 잘 들어왔다.
그러나 dataArr에는 null이 들어왔단다.
이유가 뭘까?</p>
<p><a href="https://velog.io/@yeonn1006/Cannot-invoke-org.json.simple.JSONArray.size-because-array-is-null">https://velog.io/@yeonn1006/Cannot-invoke-org.json.simple.JSONArray.size-because-array-is-null</a></p>
<p>바로 제공되는 step에 따라 Mapping을 해주지 않았기때문! 
우리는 제공해주는 Data의 스텝을 지켜주면서 데이터를 받아와야만한다.</p>
<p>해당 부분을 고쳐서 해보자.</p>
<pre><code class="language-java">        try{
            // 1. 문자열 형태의 JSON을 파싱하기 위한 JSONParser 객체 생성.
            JSONParser parser = new JSONParser();
            // 2. 문자열을 JSON 형태로 JSONObject 객체에 저장.
            JSONObject obj = (JSONObject)parser.parse(jsonString);

            JSONObject responseResult = (JSONObject)obj.get(&quot;response&quot;);
            JSONObject headerResult = (JSONObject)responseResult.get(&quot;header&quot;);
            JSONObject bodyResult = (JSONObject)responseResult.get(&quot;body&quot;);
            JSONObject itemsResult = (JSONObject)bodyResult.get(&quot;items&quot;);
            JSONArray itemResult = (JSONArray) itemsResult.get(&quot;item&quot;);

            for (Object item : itemResult) {
                log.info(item.toString());
            }

        } catch (ParseException e) { System.out.println(e.getMessage()); }</code></pre>
<p>잘 될줄 알았는데 이게 웬걸.
<img src="https://velog.velcdn.com/images/7_06com/post/bf633fa2-8d86-4062-91fd-bbd9d7bcf664/image.png" alt=""></p>
<p>난데없는 아래와 같은 에러가 발생했다. 
에러를 살펴보니 JSONArray는 Object로 캐스팅 할 수 없단다!</p>
<blockquote>
</blockquote>
<p>java.lang.ClassCastException: class org.json.simple.JSONArray cannot be cast to class org.json.simple.JSONObject</p>
<p>데이터가 잘못됐나? 찾아보니,
<img src="https://velog.velcdn.com/images/7_06com/post/99bf123c-5e2a-4e13-b7f6-1ce41af8ee42/image.png" alt="">
여기서 xml 데이터로 확인했을 때, items 라는 Object 안에item배열이 있는 줄 알았다. </p>
<p><img src="https://velog.velcdn.com/images/7_06com/post/30b13ff3-5223-4c27-80b9-0ef1b09ebb13/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/7_06com/post/bd41b26e-98fe-4268-a980-50fb12f30794/image.png" alt=""></p>
<p>해당 Open API 데이터는 items 라는 배열안에 item Object들이 모여있었다!
즉, 배열 안에 오브젝트가 있다는 것. </p>
<pre><code class="language-java">        try{
            // 1. 문자열 형태의 JSON을 파싱하기 위한 JSONParser 객체 생성.
            JSONParser parser = new JSONParser();
            // 2. 문자열을 JSON 형태로 JSONObject 객체에 저장.
            JSONObject obj = (JSONObject)parser.parse(jsonString);

            JSONObject responseResult = (JSONObject)obj.get(&quot;response&quot;);
            JSONObject headerResult = (JSONObject)responseResult.get(&quot;header&quot;);
            JSONObject bodyResult = (JSONObject)responseResult.get(&quot;body&quot;);
            JSONObject itemsResult = (JSONArray)bodyResult.get(&quot;items&quot;);    //Object가 아닌, Array

            // JSONArray itemResult = (JSONArray) itemsResult.get(&quot;item&quot;); 해당부분 제거


            // Array속 Object를 꺼내오려면 이렇게 ! 
            for(int i=0; i&lt;itemsResult.size(); i++){
                JSONObject getItem = (JSONObject) itemsResult.get(i);    //Object 추출
                log.info((String)getItem.get(&quot;pm10Value&quot;));
            }

        } catch (ParseException e) { System.out.println(e.getMessage()); }</code></pre>
<p><a href="https://velog.io/@tmdgk4902/%EA%B3%B5%EA%B3%B5%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8F%AC%ED%84%B8-%EC%98%A4%ED%94%88-API-%EB%B0%9B%EC%95%84%EC%98%A4%EA%B8%B0-%ED%8C%8C%EC%8B%B1">https://velog.io/@tmdgk4902/공공데이터-포털-오픈-API-받아오기-파싱</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[도서] 아는 만큼 보이는 백엔드 개발 - Ch7. 클라우드 컴퓨팅]]></title>
            <link>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EC%95%84%EB%8A%94-%EB%A7%8C%ED%81%BC-%EB%B3%B4%EC%9D%B4%EB%8A%94-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C-Ch7.-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%BB%B4%ED%93%A8%ED%8C%85</link>
            <guid>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EC%95%84%EB%8A%94-%EB%A7%8C%ED%81%BC-%EB%B3%B4%EC%9D%B4%EB%8A%94-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C-Ch7.-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%BB%B4%ED%93%A8%ED%8C%85</guid>
            <pubDate>Thu, 29 Feb 2024 12:21:58 GMT</pubDate>
            <description><![CDATA[<h1 id="chapter7--클라우드-컴퓨팅">Chapter7 : 클라우드 컴퓨팅</h1>
<h2 id="📌목차">📌목차</h2>
<blockquote>
</blockquote>
<h4 id="7-1-클라우드-컴퓨팅의-개요">7-1) 클라우드 컴퓨팅의 개요</h4>
<h4 id="7-2-클라우드-서비스-aws">7-2) 클라우드 서비스: AWS</h4>
<h4 id="7-3-aws-서버-구축-방법">7-3) AWS 서버 구축 방법</h4>
<p><br><br></p>
<h2 id="✅-내용정리">✅ 내용정리</h2>
<h3 id="클라우드가-나오기-전에는---온프레미스-시스템on-premise-system">클라우드가 나오기 전에는 - 온프레미스 시스템(On-premise System)</h3>
<blockquote>
<p>사용자가(혹은 기업이) <code>직접 컴퓨팅 자원을 보유하고 관리</code>하는 방식이다. 
<code>자체적으로</code> 서버, 스토리지, 네트워크 장비를 <code>구입하여 서버를 관리</code>한다.
이에 따른 온프레미스 시스템의 특징은 다음과 같다.</p>
</blockquote>
<ul>
<li>사용자가 보안과 데이터 소유권을 직접적으로 통제할 수 있다.</li>
<li>외부 네트워크와 연결하지 않아도 내부 네트워크로 서버에 접근 가능하다.</li>
<li>초기 투자 비용과 유지 보수 비용이 많이 들며, 자원의 확장성과 유연성이 제한된다.</li>
</ul>
<h3 id="클라우드-시스템cloud-system">클라우드 시스템(Cloud System)</h3>
<blockquote>
<p>IT 자원을 클라우드 <code>서비스 제공 업체에 의뢰하여 관리하는 방식</code>이다.
사용자는 인터넷을 통해 <code>업체로부터</code> 서버, 스토리지, 네트워크 장비를 <code>대여받아 사용</code>한다.
이에 따른 클라우드 시스템의 특징은 다음과 같다.</p>
</blockquote>
<ul>
<li>사용한 자원에 대해서만 비용을 지불하기에, 초기 비용이 크게 줄고 복잡한 인츠라 구축과 유지 보수의 부담을 덜 수 있다.</li>
<li>클라우드 서비스 제공 업체가 인프라 관리를 담당하므로 개발자는 서비스에만 집중할 수 있다.</li>
<li>확장성과 유연성이 뛰어나, 서비스 규모에 따라 확장/축소가 간단하다.</li>
<li>인터넷이 연결된 어느 장치에나 접속이 가능하며, 클라우드 업체가 제공하는 다양한 기능과 서비스를 이용할 수 있다.</li>
</ul>
<h3 id="클라우드-서비스-제공-범위에-따른-분류--iaas--paas--saas-">클라우드 서비스 제공 범위에 따른 분류 ( IaaS / PaaS / SaaS )</h3>
<blockquote>
<p>클라우드는 서비스의 컴퓨팅 자원을 어느 범위까지 제공하는지에 따라 3가지로 구분된다.</p>
</blockquote>
<ul>
<li><strong>IaaS(Infrastructure as a Sercice)</strong> : 클라우드 서비스 제공 업체가 <code>인프라를 제공하는 모델</code>이다. (네트워크,스토리지, 서버,가상화) 개발은 로컬에서 이루어지고 <code>웹 애플리케이션 배포와 운영을 위한 자원만 서비스로부터 제공</code>받는다. 
ex) AWS / Azure / GCP 등</li>
<li><strong>PaaS(Platform as a Sercice)</strong> : 클라우드 서비스 제공 업체가 인프라 뿐만이 아니라, <code>웹 애플리케이션을 구축하고 실행할 수 있는 플랫폼까지 제공하는 모델</code>이다. PaaS 에서 개발자는 <code>소스 코드에만 집중</code>하고 서버 구성 및 관리, 스케일링, 보안 등의 작업을 고려하지 않아도 된다.
ex) Heroku / Google App Engine / Azure App Service 등</li>
<li><strong>SaaS(Software as a Sercice)</strong> : 클라우드 제공 업체가 <code>아예 웹 애플리케이션을 제공하는 모델</code>이다.
클라우드 서버에서 웹 애플리케이션을 바로 실행할 수 있어서 사용자는 실시간으로 웹이나 앱에서 필요한 작업을 수행할 수 있다.
ex) Salesforce , Google Workspace / Microsoft 365 등</li>
</ul>
<p><img src="https://velog.velcdn.com/images/7_06com/post/66b083fb-680f-42df-9388-f6819fb4b11c/image.png" alt=""></p>
<h3 id="대표-클라우드-서비스-aws">대표 클라우드 서비스: AWS</h3>
<blockquote>
<p><code>AWS(Amazon Web Service)</code>는 대표적인 <code>아마존의 공용 클라우드 서비스</code>다.
아마존은 대규모 서버와 네트워크 인프라를 보유하고 있기 때문에, 
사용자는 필요한 만큼의 서버 용량, 데이터 스토리지, 네트워크 대역폭 등을 선택하여 사용할 수 있다.
그 중, 대표적인 서비스는 <code>Amazon EC2</code> / <code>Amazon S3</code> / <code>Amazon RDS</code> / <code>Amazon IAM</code> 등이 있다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[도서] 아는 만큼 보이는 백엔드 개발 - Ch6. 버전 관리 시스템]]></title>
            <link>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EC%95%84%EB%8A%94-%EB%A7%8C%ED%81%BC-%EB%B3%B4%EC%9D%B4%EB%8A%94-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C-Ch6.-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC-%EC%8B%9C%EC%8A%A4%ED%85%9C</link>
            <guid>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EC%95%84%EB%8A%94-%EB%A7%8C%ED%81%BC-%EB%B3%B4%EC%9D%B4%EB%8A%94-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C-Ch6.-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC-%EC%8B%9C%EC%8A%A4%ED%85%9C</guid>
            <pubDate>Wed, 28 Feb 2024 06:49:53 GMT</pubDate>
            <description><![CDATA[<h1 id="chapter6--버전-관리-시스템">Chapter6 : 버전 관리 시스템</h1>
<h2 id="📌목차">📌목차</h2>
<blockquote>
</blockquote>
<h4 id="6-1-버전-관리-시스템의-개요">6-1) 버전 관리 시스템의 개요</h4>
<h4 id="6-2-분산-버전-관리-시스템-깃">6-2) 분산 버전 관리 시스템: 깃</h4>
<h4 id="6-3-웹-기반-버전-관리-저장소-깃허브">6-3) 웹 기반 버전 관리 저장소: 깃허브</h4>
<p><br><br></p>
<h2 id="✅-내용정리">✅ 내용정리</h2>
<h3 id="분산-버전-관리-시스템-탄생-배경">분산 버전 관리 시스템 탄생 배경</h3>
<blockquote>
<p>과거에는 <code>중앙 집중식(CVCS,Centralized VCS)</code> 방식으로 버전을 관리했다. 
(한 컴퓨터로만 저장소를 담당하여 모든 파일을 관리 하는 것) 
해당 방식은 여러 문제점이 존재했다. </p>
</blockquote>
<ul>
<li>모든 커뮤터가 네트워크에 연결돼 있어야만 작업이 가능하다.</li>
<li>서버에 문제가 생기면 작업이 불가하다.</li>
<li>지속적인 통신으로 네트워크가 느리면 효율이 떨어진다.<blockquote>
</blockquote>
이러한 문제점들을 보완하고자 나온 방식이 <code>분산 방식(DVCS, Distributed VCS)</code>이다.
더이상 한 컴퓨터에서만 저장소를 담당하는 것이 아닌, 모든 컴퓨터가 저장소로서 버전을 관리한다.</li>
<li>하지만 이를 오류 없이 활용하기 위해선, 반드시 양쪽 시스템 간의 <code>동기화</code>를 실시 해주어야 한다.<ul>
<li>동기화 방식은 Merge(병합) / pull(가져오기) 를 채택하여 사용한다.</li>
</ul>
</li>
</ul>
<h3 id="깃git의-동작-방식">깃(Git)의 동작 방식</h3>
<blockquote>
</blockquote>
<p>1) 깃은 폴더내에서 &quot;<code>git init</code>&quot; 명령어를 실시할 시 <code>.git 파일이 생성</code>됨과 동시에 <code>해당 폴더의 변경이력을 관리</code>한다.
2) 폴더 내에 A B C 라는 파일이 있을 때, 세 개 파일 중 어느 파일이라도 <code>변경이 감지되면, 폴더 전체를 저장</code>한다. 
 -&gt; 이는 마치 스크린샷을 찍어 저장하는 것과 같아 <code>스냅샷(Snapshot)</code> 이라고 칭한다.
3) 수많은 스냅샷을 관리하면서 변경을 감지하고, 버전을 관리한다.</p>
<h3 id="깃의-작업-영역--작업-공간--스테이징-영역--내부-저장소-">깃의 작업 영역 ( 작업 공간 / 스테이징 영역 / 내부 저장소 )</h3>
<blockquote>
<p>깃은 3개의 작업 영역을 이용하며, 스냅샷을 관리한다.</p>
</blockquote>
<ul>
<li><code>작업 공간(working directory)</code>  </li>
<li><blockquote>
<p>현재 작업하고 있는 폴더를 말한다. </p>
</blockquote>
</li>
<li><blockquote>
<p>&quot;git add&quot; 명령어를 사용시, 스테이징 영역으로 작업 파일을 올릴 수 있다.</p>
</blockquote>
</li>
<li><code>스테이징 영역(staging area)</code> : </li>
<li><blockquote>
<p>내부 저장소로 가기 전 임시로 보관해두는 공간이다.</p>
</blockquote>
</li>
<li><blockquote>
<p>&quot;git commit&quot; 명령어를 사용시 스냅샷을 찍는 명령어라고 보면된다. 스냅샷을 찍어 내부 저장소로 보낸다.</p>
</blockquote>
</li>
<li><code>내부 저장소(local repository)</code></li>
<li><blockquote>
<p>최종적으로 .git 폴더 안에 저장되는 스냅샷 저장 공간이다.</p>
</blockquote>
</li>
<li><blockquote>
<p>로컬 환경에서 버전 관리(스냅샷 관리)가 된 것이다.</p>
</blockquote>
우리는 해당 의문점을 가질 수가 있다. <strong>&#39;엥? 굳이 스테이징 영역이 왜 필요해? 그냥 작업공간에서 원할 때 바로 스냅샷 찍어서 내부저장소로 옮기면 되잖아.&#39;</strong> 이는, 변경이 너무 빈번하게 일어나기도 하고, 앞서 말했듯 &quot;폴더 전체&quot;를 관리하며 폴더 자체를 저장하는 것이기 때문에, <code>스테이징에 임시로 올려 원하는 파일만 스냅샷 관리</code> 하기 위함이라고 생각하면 될 것 같다!</li>
</ul>
<h3 id="깃허브github--웹-기반-외부-저장소">깃허브(GitHub) : 웹 기반 외부 저장소</h3>
<blockquote>
<p>내 컴퓨터에 있는 프로젝트 변경 내역을 다른 개발자에게 공유하기 위해선 어떻게 해야할까? 
메신저를 활용해서 폴더나 코드를 보낼 수도 있겠지만 이는 너무 위험하며 비효율적이다.
그래서 생긴 방식이 <code>깃허브 : 외부 저장소</code>이다. 
깃허브를 통해서 <code>서로 다른 개발자들이 모두가 최신 버전의 파일을 가지고 작업</code>할 수 있다.
-&gt; 서로 다른 개발자들끼리 스냅샷끼리 비교하며 관리하기 때문에 <code>충돌</code>을 피하기 위한 <code>동기화</code> 작업은 필수다! </p>
</blockquote>
<p>깃에 대해 좀 더 알고 싶다면,
<strong>기초)</strong> 커밋 , 브랜치와 관련된 다양한 명령어를 학습하고, 충돌에 부딪혀봐라.
<strong>심화)</strong> 브랜치 관리 전략을 학습하라. ex) git flow / github flow / gitlab flow 등</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[도서] 아는 만큼 보이는 백엔드 개발 - Ch5. API]]></title>
            <link>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EC%95%84%EB%8A%94-%EB%A7%8C%ED%81%BC-%EB%B3%B4%EC%9D%B4%EB%8A%94-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C-Ch5.-API</link>
            <guid>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EC%95%84%EB%8A%94-%EB%A7%8C%ED%81%BC-%EB%B3%B4%EC%9D%B4%EB%8A%94-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C-Ch5.-API</guid>
            <pubDate>Tue, 27 Feb 2024 09:34:31 GMT</pubDate>
            <description><![CDATA[<h1 id="chapter5--api">Chapter5 : API</h1>
<h2 id="📌목차">📌목차</h2>
<blockquote>
</blockquote>
<h4 id="5-1-api의-개요">5-1) API의 개요</h4>
<h4 id="5-2-api의-유형">5-2) API의 유형</h4>
<h4 id="5-3-api-명세서">5-3) API 명세서</h4>
<p><br><br></p>
<h2 id="✅-내용정리">✅ 내용정리</h2>
<h3 id="api란-무엇인가">API란 무엇인가?</h3>
<blockquote>
<p><code>API</code>란 Application Programming Interface의 약자로 응용 프로그램에서 사용할 수 있도록 운영체제나 프로그래밍 언어가 제공하는 기능을 제어하기 위한 <code>인터페이스</code>이다.</p>
</blockquote>
<p><code>인터페이스</code>란 말 그대로 어떤 기계간의 장치끼리 정보를 교환하기 위한 수단이나, 방법을 의미한다.</p>
<blockquote>
</blockquote>
<p>따라서, API는 어떤 특정 사이트에서 특정 데이터를 공유할 경우 어떠한 방식으로 정보를 요청해야 하는지, 그리고 어떠한 데이터를 제공 받을 수 있을지에 대한 규격들을 API 라고 볼 수 있다.</p>
<h3 id="클라이언트---서버-간-api-개발-순서">클라이언트 - 서버 간 API 개발 순서</h3>
<blockquote>
<p>클라이언트 - 서버 간에 API 개발 순서는 다음과 같다.</p>
</blockquote>
<p><strong>1) 엔드포인트 설계</strong> :  <del>/search , ~</del>user 와 같은 최종 경로
<strong>2) HTTP 메서드 지정</strong> : GET / POST / PUT,PATCH / DELETE 등 
<strong>3) 데이터 포맷 및 프로토콜 선택</strong> : JSON / XML 등 
<strong>4) 엔드포인트 구현</strong>
<strong>5) 인증 및 보안</strong>
<strong>6) 오류 및 예외 처리</strong>
<strong>7) 테스트와 디버깅</strong>
<strong>8) API 문서화</strong> : 엔드포인트 / 매개변수 / 응답 형식 / 오류 코드 등 </p>
<h3 id="rest-api란-무엇인가">REST API란 무엇인가?</h3>
<blockquote>
<p><strong><code>REST API</code></strong>란, API에서 더 나아가서 개발자마다 너무 서로 다른 형식의 API 생성을 방지하고자 
<code>REST</code>라는 형식과 규약을 넣어서 만든 API라고 볼 수 있다.
REST API를 제대로 쓰기 위해, 여러 REST의 원칙과 제약을 준수하여 설계한 API를 <code>RESTful API</code>라고 칭한다.</p>
</blockquote>
<p><strong><code>REST API의 구성요소</code></strong> 
크게 자원 / 행위 / 표현으로 구성되어 있다.</p>
<p>1) 자원 : 클라이언트와 서버 간에 주고받는 자원을 <code>URI</code>로 명시한다.
2) 행위 : HTTP 메서드를 통해 해당 자원에 대한 CRUD 연산을 수행한다.
3) 표현 : 주고받는 자원의 데이터 표현 방법을 명시한다. ( JSON / XML )</p>
<blockquote>
</blockquote>
<p><strong><code>REST API 의 장점</code></strong>
REST API 방법을 사용하면 주소와 메서드만 보고 요청의 내용을 알아볼 수 있다는 장점이 있다. 
따라서 개발자간의 소통이 좀 더 원활하다.</p>
<blockquote>
</blockquote>
<p><strong><code>REST의 특징</code></strong></p>
<p>1) Client-server architecture : 클라이언트와 서버를 명확하게 분리한다.
2) Stateless : 서버는 클라이언트에 대한 사전 정보나 클라이언트의 상태를 저장하지 않는다.
3) 캐시 처리 기능
4) 계층 구조
5) 인터페이스 일관성
6) 자체 표현 등</p>
<blockquote>
</blockquote>
<p><strong><code>REST API 설계규칙</code></strong></p>
<p>1) URI에 명사만을 사용한다, 
2) 두 명사가 붙을 경우엔 하이픈을 사용한다, 
3) 오직 소문자를 사용한다, 
4) 행위에 대한건 HTTP Method에게 맡긴다. 
5) 자원의 계층관계를 / 로 나타낸다.
6) 마지막에 / 를 넣지 않는다.
7) 적절한 HTTP 상태 코드를 응답한다. 등</p>
<h3 id="api-문서화-도구--swagger-vs-spring-rest-docs">API 문서화 도구 : (Swagger VS Spring REST docs)</h3>
<blockquote>
</blockquote>
<p>자주 사용하는 2가지 도구로는 Swagger 와 Spring REST docs가 있다. 
팀 스타일과 환경에 따라서 골라서 선택하면 된다.</p>
<blockquote>
</blockquote>
<p><code>Swagger</code></p>
<blockquote>
</blockquote>
<h4 id="장점">장점</h4>
<ul>
<li>Spring REST docs에 비해 쉽게 API 문서를 생성할 수 있다.</li>
<li>UI와 편의성 깔끔하다.<h4 id="단점">단점</h4>
</li>
<li>스웨거(swagger)는 운영코드에 침투적이다 -&gt; 어노테이션을 활용 해야 하므로 코드가 지저분해진다.<ul>
<li>&quot;Springdoc&quot;가 제공하는 기본 기능만 활용한다면 &quot;Springfox&quot;에 비해서 운영코드에 침투력이 줄어든다. (그래도 침투적이다.)<blockquote>
<hr>
<p><code>Spring REST docs</code></p>
</blockquote>
<h4 id="장점-1">장점</h4>
</li>
</ul>
</li>
<li>Spring REST Docs 는 테스트를 반드시 작성해야 한다. -&gt; 신뢰도 증가<ul>
<li>이유 : API 문서에 포함(include)되는 &quot;스니펫(snippets)&quot;을 생성하기 위해 테스트 코드를 작성해야 한다.</li>
</ul>
</li>
<li>운영코드에 침투하지 않는다.<h4 id="단점-1">단점</h4>
</li>
<li>정적인 HTML 문서기 때문에 &quot;Spring REST Docs&quot; API 문서는 뭔가 심심하다. 개발자 외에 기획자가 테스트하려고 하면 뭔가 불편하다. <ul>
<li>밋밋한게 아쉽다면, Spring REST Docs 에 Swagger 를 넣을 수 있다. (보통 이렇게 많이 사용함)</li>
</ul>
</li>
<li>준비 사항과 진입 장벽이 매우 높다. </li>
</ul>
<p>[참고] <a href="https://helloworld.kurly.com/blog/spring-rest-docs-guide">https://helloworld.kurly.com/blog/spring-rest-docs-guide</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[도서] 아는 만큼 보이는 백엔드 개발 - Ch4. DBMS]]></title>
            <link>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EC%95%84%EB%8A%94-%EB%A7%8C%ED%81%BC-%EB%B3%B4%EC%9D%B4%EB%8A%94-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C-Ch4.DBMS</link>
            <guid>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EC%95%84%EB%8A%94-%EB%A7%8C%ED%81%BC-%EB%B3%B4%EC%9D%B4%EB%8A%94-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C-Ch4.DBMS</guid>
            <pubDate>Mon, 26 Feb 2024 13:27:51 GMT</pubDate>
            <description><![CDATA[<h1 id="chapter4--dbms">Chapter4 : DBMS</h1>
<h2 id="📌목차">📌목차</h2>
<blockquote>
</blockquote>
<h4 id="4-1-dbms의-개요">4-1) DBMS의 개요</h4>
<h4 id="4-2-rdbms에서의-crud">4-2) RDBMS에서의 CRUD</h4>
<h4 id="4-3-nosql에서의-crud">4-3) NoSQL에서의 CRUD</h4>
<p><br><br></p>
<h2 id="✅-내용정리">✅ 내용정리</h2>
<h3 id="rdbms와-nosql의-사용-목적은-무엇을-초점을-두고-있나요">RDBMS와 NoSQL의 사용 목적은 무엇을 초점을 두고 있나요?</h3>
<blockquote>
</blockquote>
<p><strong>RDBMS</strong> : 데이터 간의 관계와 효율적인 관리에 특화되었다.
<strong>NoSQL</strong> : 분산된 대량의 데이털르 저장하고 조회하는데에 특화되었다.</p>
<h3 id="rdbms-sql-문법-중-ddl--dml--dcl-의-차이를-설명해주세요">RDBMS) SQL 문법 중, DDL / DML / DCL 의 차이를 설명해주세요.</h3>
<blockquote>
</blockquote>
<p><strong>DDL(Data Definition Language)</strong> : 데이터 정의어 - 테이블이나 관계의 <code>구조를 생성하고 관리</code>하기 위해 사용
-&gt; CREATE / DROP / ALTER / TRUNCATE
<strong>DML(Data Manipulation Language)</strong> : 데이터 조작어 - 테이블의 <code>데이터를 생성/조회/수정/삭제</code>하기 위해 사용
-&gt; SELECT / INSERT / UPDATE / DELETE
<strong>DCL(Data Control Language)</strong> : 데이터 제어어 - <code>데이터의 사용 권한을 관리</code>하기 위해 사용
-&gt; GRANT / REVOKE</p>
<blockquote>
</blockquote>
<p>일반적으로 개발자는 DML를 많이 쓰게된다.</p>
<h3 id="rdbms-대표적인-rdbms의-종류를-말씀해주세요">RDBMS) 대표적인 RDBMS의 종류를 말씀해주세요.</h3>
<blockquote>
<p>잘 알려진(자주 사용하는) RDBMS로는 <code>Oracle / MySQL / PostgreSQL / MariaDB</code>가 있다.</p>
</blockquote>
<h3 id="rdbms-join의-종류와-특징에-대해-간략히-설명해주세요">RDBMS) JOIN의 종류와 특징에 대해 간략히 설명해주세요.</h3>
<blockquote>
<p>먼저 <code>조인(Join)</code>은 <code>2개 이상의 테이블을 연결</code>해 관련 <code>데이터를 함께 검색하기 위해</code> 사용하는 문법이다.
테이블의 <code>공통 속성 값을 기준으로 테이블끼리 연결</code>한다. 
일반적으로 조인문은 <code>SELECT 문의 FROM 절에서 사용</code>한다.
<strong>1) INNER JOIN</strong> : 두 테이블에서 공통된 속성 값을 가지고 있는 튜플을 반환한다.
<strong>2) FULL OUTER JOIN</strong> : 왼쪽 테이블과 오른쪽 테이블의 모든 행을 반환한다. 
(공통 속성값이 일치하지 않는 경우, NULL로 채워서 반환한다.)
<strong>3) LEFT JOIN</strong> : 기준 테이블인 왼쪽 테이블의 모든 튜플을 결과에 포함하고, 오른쪽 테이블에서는 일치하는 값을 가진 튜플만 결과에 포함한다. (오른쪽 테이블에 값이 없는 경우 나머지 속성을 NULL로 채운다.)
<strong>4) RIGHT JOIN</strong> : 기준 테이블인 오른쪽 테이블의 모든 튜플를 결과에 포함한다. (이하 LEFT JOIN과 반대로 생각한다.)</p>
</blockquote>
<h3 id="nosql-대표적인-nosql의-종류를-말씀해주세요">NoSQL) 대표적인 NoSQL의 종류를 말씀해주세요.</h3>
<blockquote>
<p>잘 알려진(자주 사용하는) NoSQL로는 <code>MongoDB</code>가 있다.</p>
</blockquote>
<h3 id="nosql-nosql의-특징은-무엇인가요-rdbms와-비교하여-설명하세요">NoSQL) NoSQL의 특징은 무엇인가요? (RDBMS와 비교하여 설명하세요.)</h3>
<blockquote>
<ul>
<li>NoSQL은 이름 그대로 SQL을 사용하지 않는 DBMS다.</li>
</ul>
</blockquote>
<ul>
<li>RDBMS 처럼 일정한 데이터 형식이 아닌, <code>저장 형식이 일정하지 않은 비정형 데이터</code>를 <code>효율적으로 관리</code>하기 위해서 탄생하였다.</li>
<li>NoSQL은 RDBMS와 달리 데이터 저장 유형이 다양하며, 대표적으로는 <code>도큐먼트 데이터베이스</code> / <code>키-값 데이터베이스</code> / <code>그래프 데이터베이스</code>의 저장 유형이 존재한다.</li>
</ul>
<h3 id="nosql-그렇다면-저장-유형에-대해-좀-더-자세히-말씀해주시겠어요">NoSQL) 그렇다면 저장 유형에 대해 좀 더 자세히 말씀해주시겠어요?</h3>
<blockquote>
<ul>
<li><strong>도큐먼트 데이터베이스</strong> : JSON 또는 XML 형식의 도큐먼트로 데이터를 저장하는 데이터베이스이다.</li>
<li><blockquote>
<p>RDBMS 와 달리, 행과 열의 개념이 없다. 그냥 도큐먼트 형식만 맞추면 되며, 데이터마다의 구성또한 달라도된다.</p>
</blockquote>
</li>
<li><blockquote>
<p>대표 프로그램 : <code>MongoDB</code></p>
</blockquote>
</li>
</ul>
</blockquote>
<ul>
<li>키-값 데이터베이스 : 키와 값으로 구성된 데이터베이스이다.</li>
<li><blockquote>
<p>읽고 쓰는 속도가 매우 빠르다.</p>
</blockquote>
</li>
<li><blockquote>
<p>대표 프로그램 : <code>CassandraDB</code> / <code>DynamoDB</code></p>
</blockquote>
</li>
<li>그래프 데이터 베이스 : 노드와 간선으로 이루어진 그래프 형태의 데이터 모델을 사용하는 데이터베이스이다.</li>
<li><blockquote>
<p>4개 이상의 테이블을 이용하는 복잡한 쿼리를 수행할 때 강점을 발휘한다.</p>
</blockquote>
</li>
<li><blockquote>
<p>대표 프로그램 : <code>Neo4j</code></p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[도서] 아는 만큼 보이는 백엔드 개발 - Ch3.백엔드 개발 언어와 프레임워크]]></title>
            <link>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EC%95%84%EB%8A%94-%EB%A7%8C%ED%81%BC-%EB%B3%B4%EC%9D%B4%EB%8A%94-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C-Ch3</link>
            <guid>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EC%95%84%EB%8A%94-%EB%A7%8C%ED%81%BC-%EB%B3%B4%EC%9D%B4%EB%8A%94-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C-Ch3</guid>
            <pubDate>Fri, 23 Feb 2024 08:35:54 GMT</pubDate>
            <description><![CDATA[<h1 id="chapter3--백엔드-개발-언어와-프레임워크">Chapter3 : 백엔드 개발 언어와 프레임워크</h1>
<h2 id="📌목차">📌목차</h2>
<blockquote>
</blockquote>
<h4 id="3-1-프로그래밍-패러다임">3-1) 프로그래밍 패러다임</h4>
<h4 id="3-2-백엔드-개발-언어">3-2) 백엔드 개발 언어</h4>
<h4 id="3-3-백엔드-프레임워크">3-3) 백엔드 프레임워크</h4>
<h4 id="3-4-백엔드-개발-언어와-프레임워크-선택-방법">3-4) 백엔드 개발 언어와 프레임워크 선택 방법</h4>
<p><br><br></p>
<h2 id="✅-내용정리">✅ 내용정리</h2>
<h3 id="프로그래밍-패러다임의-종류에-대해-설명해주세요">프로그래밍 패러다임의 종류에 대해 설명해주세요.</h3>
<blockquote>
<p>먼저 프로그래밍 패러다임이란, 프로그래밍에 있어서 문제를 해결하는 데 사용하는 기본적인 <code>철학</code>이나 <code>접근방식</code>을 말한다. 
다양한 방법론들이 나온 가운데, 대표적으로는 아래 4가지가 있다.</p>
</blockquote>
<ul>
<li><code>명령형 프로그래밍</code></li>
<li><code>절차지향 프로그래밍</code> : 위에서 아래로 흐르는 것 처럼 모든 코드가 정해진 순서대로 실행된다.<ul>
<li>장점 : 실행속도가 빠르다.</li>
<li>단점 : 유지보수 , 디버깅이 어렵다. (10만 줄짜리 코드에 새로운 기능을 추가하려면 하나씩 추적해야함..!)</li>
<li>언어 : C</li>
</ul>
</li>
<li><code>객체지향 프로그래밍</code> : 실세계를 모델링하여 프로그램을 개발하는 방법론. 사물의 본질을 <strong>속성</strong>과 <strong>기능</strong>으로 정의한다. <ul>
<li>장점 : 재사용성 / 생산성 향상 / 유지보수 쉬움 / 자연적 모델링</li>
<li>단점 : 개발속도 더딤 / 실행속도 느림 / 코딩난이도 상승</li>
<li>언어 : JAVA / Python / C++ / C# 등</li>
</ul>
</li>
<li><code>함수형 프로그래밍</code> : 요즘 하드웨어의 발전에 따라, 떠오르는 방법론이다. </li>
</ul>
<h3 id="객체지향-프로그래밍의-주요-특징을-설명해주세요">객체지향 프로그래밍의 주요 특징을 설명해주세요.</h3>
<blockquote>
<p>주요 특징은 크게 아래 4가지다.</p>
</blockquote>
<ul>
<li><code>추상화</code> : 공통적인 <strong>속성</strong>과 <strong>기능</strong>을 추출하여 이름을 붙이는 과정이다.</li>
<li><code>캡슐화</code> : <strong>속성</strong>과 <strong>기능</strong>을 하나의 <strong>캡슐로 묶는 것</strong>을 의미하며, 외부로의 노출을 제어하기 위함이다.
즉 필요한 인터페이스만 노출시키는 것을 의미한다.(정보 은닉)</li>
<li><code>상속</code> : 기존 상위 클래스의 속성과 기능을 가져다가 하위 클래스에서 <strong>재사용</strong>하는 것을 의미한다.</li>
<li><code>다형성</code> : 상속과 연관이 있는 개념으로 한 객체가 다른 여러형태(객체)로 재구성 되는 것을 말한다.</li>
</ul>
<h3 id="인터프리터-방식와-컴파일-방식의-차이점은-무엇인가요">인터프리터 방식와 컴파일 방식의 차이점은 무엇인가요?</h3>
<blockquote>
<p>소스 코드를 기계어로 변환하여 실행하는 방식에는 인터프리터, 컴파일 2가지 방식이 존재한다.
<code>인터프리터 방식</code>은 소스코드를 한 줄씩 읽고 그 즉시 기계어로 변환하여 실행하고,
<code>컴파일 방식</code>은 소스 코드를 한꺼번에 읽고 한번에 변환시켜 실행파일을 따로 저장해서 실행한다.</p>
</blockquote>
<h3 id="자바의-특징을-설명해주세요">자바의 특징을 설명해주세요.</h3>
<blockquote>
<p>크게 4가지가 특징이 될 수 있다.</p>
</blockquote>
<ol>
<li>자바 가상 머신인 JVM을 통해서 실행된다. -&gt; 다양한 운영체제 환경에서 실행가능하다.</li>
<li>대부분의 데이터를 객체로 구성한다.</li>
<li>모든 메모리의 접근을 자바 시스템이 관리하고 제한한다. -&gt; 가바지컬렉션</li>
<li>멀티스레드를 쉽게 구현 가능하다.</li>
</ol>
<h3 id="라이브러리와-프레임워크의-차이점은-무엇인거요">라이브러리와 프레임워크의 차이점은 무엇인거요?</h3>
<blockquote>
<p>먼저 라이브러리는 개발하는데 필요한 기능을 미리 구현해놓은 코드의 모음이라 볼 수 있으며,
프레임워크는 이름그대로 뼈대를 의미하며, 개발에 필요한 뼈대와 같은 일정한 형태와 기능을 제공하는 틀을 의미한다.
둘이 비슷해보이지만 프로그래밍 작성 방식에 차이를 두고있다.</p>
</blockquote>
<ul>
<li>라이브러리 : 개발자가 코드의 흐름을 직접 제어 가능하다. (개발자가 직접 틀을 구성하고 필요한 기능 호출)</li>
<li>프레임워크 : 개발자가 주어진 코드의 흐름속에서 프로그래밍 가능하다. (이미 짜여진 틀 안에서 활동)</li>
</ul>
<h3 id="각-프레임워크의-기반-언어를-설명해주세요">각 프레임워크의 기반 언어를 설명해주세요.</h3>
<blockquote>
</blockquote>
<ul>
<li><code>Express.js</code> : JavaScript+node.js</li>
<li><code>NestJS</code> : TypeScript</li>
<li><code>Spring / Spring Boot</code> : JAVA</li>
<li><code>Django / Flask / FastAPI</code> : Python</li>
</ul>
<h3 id="ide와-소스-코드-편집기를-비교해주세요">IDE와 소스 코드 편집기를 비교해주세요.</h3>
<blockquote>
<p>IDE(Integrated Development Environment)는 통합 개발 환경을 뜻하며 IDE는 소스 코드 편집기를 내포하고 있다. 즉 IDE에는 <code>소스 코드 편집기</code> / <code>빌드 자동화 도구</code> / <code>디버거</code>등이 포함되어있다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[도서] 아는 만큼 보이는 백엔드 개발 - Ch2.CS 기초 지식]]></title>
            <link>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EC%95%84%EB%8A%94-%EB%A7%8C%ED%81%BC-%EB%B3%B4%EC%9D%B4%EB%8A%94-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C-Ch2</link>
            <guid>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EC%95%84%EB%8A%94-%EB%A7%8C%ED%81%BC-%EB%B3%B4%EC%9D%B4%EB%8A%94-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C-Ch2</guid>
            <pubDate>Fri, 23 Feb 2024 08:09:20 GMT</pubDate>
            <description><![CDATA[<h1 id="chapter2--cs-기초-지식">Chapter2 : CS 기초 지식</h1>
<h2 id="📌목차">📌목차</h2>
<blockquote>
</blockquote>
<h4 id="2-1-네트워크">2-1) 네트워크</h4>
<h4 id="2-2-운영체제">2-2) 운영체제</h4>
<h4 id="2-3-데이터베이스">2-3) 데이터베이스</h4>
<h4 id="2-4-자료구조">2-4) 자료구조</h4>
<p><br><br></p>
<h2 id="✅-내용정리">✅ 내용정리</h2>
<h3 id="네트워크-ip-주소에-대해-설명해주세요">네트워크) IP 주소에 대해 설명해주세요.</h3>
<blockquote>
<p><code>IP주소</code>란 네트워크에 연겱된 각 컴퓨터를 구분하는 고유한 주소를 뜻한다.
<code>4바이트</code>로 이루어져 있으며, 사람이 알아보기 쉽게 1바이트씩 10진수로 나타낸 총 10진수 4개의 숫자로 구성되어 있다.
컴퓨터가 증가됨에 따라 현재는 <code>IPv6</code>로 <code>16바이트</code>로 확장한 주소체계까지 생겼다.</p>
</blockquote>
<h3 id="네트워크-domain-name-과-dns에-대해-간략히-설명해주세요">네트워크) Domain Name 과 DNS에 대해 간략히 설명해주세요.</h3>
<blockquote>
<p>먼저, <code>Domain Name</code>은 <code>IP주소를 문자열로 변환</code>한 것이다. 
-&gt; 전화번호부에 010-xxxx-xxxx를 외우기 힘드니 &quot;홍길동&quot;으로 저장한 것과 같은 과정이다.</p>
</blockquote>
<p><code>DNS</code>는 Domain Name Service로 <code>도메인과 IP주소의 매핑 정보를 가지고 있는 시스템</code>이다.</p>
<blockquote>
</blockquote>
<p><code>DNS의 동작 방식</code>은 아래와 같다.</p>
<blockquote>
<blockquote>
</blockquote>
</blockquote>
<p>1) 사용자가 웹 브라우저 url입력창에 도메인을 입력한다.
2) 웹 브라우저는 입력받은 도메인에 해당되는 IP주소를 DNS 서버에 물어본다.
3) DNS 서버는 도메인에 해당하는 IP주소를 반환한다.
4) 웹 브라우저는 IP주소를 받아서 해당 IP주소의 컴퓨터에 접속한다.</p>
<h3 id="네트워크-googlecom을-치면-어떤일이-발생하나요">네트워크) &quot;Google.com&quot;을 치면 어떤일이 발생하나요?</h3>
<blockquote>
</blockquote>
<h3 id="네트워크-well-known-포트번호에-대해-알고계시나요">네트워크) well-known 포트번호에 대해 알고계시나요?</h3>
<p><img src="https://velog.velcdn.com/images/7_06com/post/e7cbfffa-b7e6-4c1e-b725-c74c192ed297/image.png" alt=""></p>
<h3 id="네트워크-프로토콜에-대해-설명해주세요-백엔드와-관련된-프로토콜은-어떤게-있을까요">네트워크) 프로토콜에 대해 설명해주세요. 백엔드와 관련된 프로토콜은 어떤게 있을까요?</h3>
<blockquote>
<p><code>프로토콜</code>은 컴퓨터 네트워크 사이에서 컴퓨터 간에 쉽게 통신할 수 있도록 정해놓은 규칙과 절차를 말한다.
백엔드와 크게 연관된 프로토콜은 <code>HTTP, HTTPS, TCP, IP</code> 등이 있다.</p>
</blockquote>
<h3 id="네트워크-tcpip에-대해서-설명해주세요">네트워크) TCP/IP에 대해서 설명해주세요.</h3>
<blockquote>
</blockquote>
<h3 id="네트워크-http-구성요소에-대해-알고계시나요">네트워크) HTTP 구성요소에 대해 알고계시나요?</h3>
<blockquote>
<p>HTTP는 클라이언트와 서버 사이에서 데이터를 주고받기 위해 사용하는 프로토콜이다.
구성요소로는 <code>시작 행 / 헤더 / 빈 행 / 본문</code>으로 이루어져있다.</p>
</blockquote>
<ul>
<li><code>시작 행</code> : 요청 혹은 응답과 관련된 주요정보</li>
<li><blockquote>
<p>요청 시작 행 : HTTP 메서드 / 요청 URI / HTTP 버전 정보</p>
</blockquote>
</li>
<li><blockquote>
<p>응답 시작 행 : HTTP 버전 정보 / 상태 코드 / 상태 메세지</p>
</blockquote>
</li>
<li><code>헤더</code> : 요청 혹은 응답과 관련된 부가정보</li>
<li><code>빈 행</code> : 헤더의 끝을 표시하기 위해 사용하는 빈 행</li>
<li><code>본문</code> : 통신을 통해 실제로 주고받는 데이터 (생략가능)</li>
<li><blockquote>
<p>요청 본문 : 요청 시 전달한 데이터 </p>
</blockquote>
</li>
<li><blockquote>
<p>응답 본문 : 응답으로 보내는 데이터</p>
</blockquote>
</li>
</ul>
<h3 id="네트워크-https-와-http의-차이점은-무엇인가요">네트워크) HTTPS 와 HTTP의 차이점은 무엇인가요?</h3>
<blockquote>
<p><code>HTTPS</code>은 HTTP에서 <code>SSL</code> 또는 <code>TLS</code> 와 같은 암호화 프로토콜을 사용하여 <code>보안 요소가 강화된 HTTP 프로토콜</code> 이다. 
HTTPS를 사용함으로서, <code>데이터의 무결성</code>과 <code>인증</code>이 보장된다.</p>
</blockquote>
<h3 id="os-운영체제란-무엇이며-주요기능은-무엇인지-설명해주세요">OS) 운영체제란 무엇이며 주요기능은 무엇인지 설명해주세요.</h3>
<blockquote>
<p>운영체제는 사용자가 컴퓨터를 쉽게 다룰 수 있도록 사용자와 컴퓨터 사이에서 인터페이스를 제공하고,
컴퓨터의 시스템 자원을 효율적으로 관리 및 분배하는 역할을 담당한다. 
<code>대표 운영체제</code> : Window / MacOS / Linux 등</p>
</blockquote>
<p><code>주요 기능</code> : 프로세스 관리 / 메모라 관리 / 파일 시스템 관리 / 네트워크 관리 이다.</p>
<h3 id="os-프로그램과-프로세스의-차이는-무엇인가요">OS) 프로그램과 프로세스의 차이는 무엇인가요?</h3>
<blockquote>
<p>보조 기억장치인 <code>디스크에 적재</code>되어 있는 일련의 코드덩어리을 <code>프로그램</code>이라고 표현하며, 
해당 프로그램을 실행시켜 <code>메모리에 올라와, cpu를 점유하고 있는 프로그램</code>을 <code>프로세스</code>라고 표현한다.</p>
</blockquote>
<p>즉, 평소에는 프로그램 상태로 있다가 메모리에 올리는 순간 프로세스라고 표현한다.</p>
<h3 id="os-프로세스의-메모리-구조와-스레드의-메모리-구조-차이점을-말씀해주세요">OS) 프로세스의 메모리 구조와 스레드의 메모리 구조 차이점을 말씀해주세요.</h3>
<blockquote>
</blockquote>
<p><code>프로세스의 메모리 구조</code>는 크게 4가지 영역으로 <code>코드 영역</code> / <code>데이터 영역</code> / <code>힙 영역</code> / <code>스택 영역</code> 으로 구성되어 있다.
프로세스는 어떠한 영역도, 다른 프로세스와 <code>공유하지 않는다</code>.</p>
<blockquote>
</blockquote>
<p><code>스레드</code>는 프로세스 내에서 작업하는 <code>여러개의 실행 단위</code> 라고 할 수 있다.
따라서 <code>스레드의 메모리 구조</code>는 <code>스택 영역</code>을 제외한 <code>모든 영역을 함께 공유</code>한다.</p>
<h3 id="os-스레드의-특징과-이에-따라-발생하는-문제를-말씀해주세요-어떤-문제가-발생하며-문제에-대한-해결방법은-어떻게-되나요">OS) 스레드의 특징과 이에 따라 발생하는 문제를 말씀해주세요. 어떤 문제가 발생하며 문제에 대한 해결방법은 어떻게 되나요?</h3>
<blockquote>
</blockquote>
<p>스레드는 앞서 말했듯 프로세스 내에서 작업하는 여러개의 단위이다. 
따라서 스레드는 <code>스택 영역</code>을 제외한 <code>모든 영역을 함께 공유</code>한다.</p>
<blockquote>
</blockquote>
<p>이러한 여러개의 스레드가 동시에 활동하는 방식을 <code>멀티 스레드</code>라고 표현하며, 
자원을 공유하기 때문에 <code>동기화</code> 처리 문제는 반드시 해결해야한다.</p>
<h3 id="db-데이터베이스의-이상-현상에-대해-설명해주세요">DB) 데이터베이스의 이상 현상에 대해 설명해주세요.</h3>
<blockquote>
<p>데이터베이스를 설계하면서 중 여러 엔티티와 관계를 추출하는 과정에서 여러 이상 현상이 발생할 수 있다.
<strong>삽입 이상</strong> : 새로운 데이터를 삽입할 때 불필요한 데이터가 함께 삽입되는 현상.
ex) 한 테이블에 담겨있는 회원정보 , 주문정보 -&gt; 신규 회원이 가입되었을 때 하지도 않은 주문 정보까지 삽입됨
<strong>갱신 이상</strong> : 중복된 데이터 값 중 일부 값만 변경함으로써 데이터가 불일치 되는 현상.
ex) 논현역의 행정 명칭이 신논현역으로 바뀌었는데, 테이블의 일부 주소만 신논현으로 바뀜
<strong>삭제 이상</strong> : 특정 데이터를 삭제할 때 다른 데이터까지 삭제되는 현상.
ex) 한 테이블에 담겨있는 회원정보, 주문정보 -&gt; 회원이 주문 내역만 취소(삭제)했는데 회원 정보까지 삭제됨</p>
</blockquote>
<h3 id="db-정규화에-대해-간단히-설명해주세요">DB) 정규화에 대해 간단히 설명해주세요.</h3>
<blockquote>
<p>위와 같은 이상 현상들을 막기 위해선 다양한 정규화를 수행해야된다.
<code>제 1정규화</code> / <code>제 2정규화</code> / <code>제 3정규화</code> / <code>BCNF</code> / <code>제 4정규화</code> / <code>제 5정규화</code> 순으로 이루어진다. </p>
</blockquote>
<h3 id="db-트랜잭션이란-무엇인가요">DB) 트랜잭션이란 무엇인가요?</h3>
<blockquote>
<p><code>트랜잭션</code>이란 하나의 기능을 수행하기 위해서 순차적으로 진행되는 <code>하나의 단위 혹은 연산</code>을 의미한다.
일반적으로, 데이터베이스의 데이터를 조작할 때 트랜잭션 단위로 묶어 수행한다.</p>
</blockquote>
<p>트랜잭션에서는 크게 <code>커밋</code>과 <code>롤백</code> 이라는 2가지 키워드가 존재한다.
일련의 단위가 성공하면 순차적으로 커밋을 수행하여 작업을 완료시키고
만일, 수행중 오류가 발생하면 롤백시켜 커밋 내역을 초기화시킨다.</p>
<h3 id="자료구조-자료구조와-알고리즘의-차이는-무엇일까요">자료구조) 자료구조와 알고리즘의 차이는 무엇일까요?</h3>
<blockquote>
</blockquote>
<p><code>자료구조</code> : 데이터를 어떠한 단위, 형식으로 저장하는가? -&gt; 다양한 저장 방식
<code>알고리즘</code> : 다양한 자료구조를 활용하여 어떻게 문제를 해결 할 것인가? -&gt; 문제를 해결하는 과정</p>
<blockquote>
</blockquote>
<p>프로그램은 어떠한 자료구조를 쓰는가에 따라 성능이 크게 좌지우지 된다. 
어떤 자료구조를 쓰는지 결정하는 것과 문제를 해결해나가는 과정을 알고리즘 이라고 할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[도서] 아는 만큼 보이는 백엔드 개발 - Ch1. 백엔드 시작하기]]></title>
            <link>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EC%95%84%EB%8A%94-%EB%A7%8C%ED%81%BC-%EB%B3%B4%EC%9D%B4%EB%8A%94-%EB%B0%B1%EC%97%94%EB%93%9C-Ch1</link>
            <guid>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EC%95%84%EB%8A%94-%EB%A7%8C%ED%81%BC-%EB%B3%B4%EC%9D%B4%EB%8A%94-%EB%B0%B1%EC%97%94%EB%93%9C-Ch1</guid>
            <pubDate>Fri, 23 Feb 2024 07:54:54 GMT</pubDate>
            <description><![CDATA[<h1 id="chapter1--백엔드-시작하기">Chapter1 : 백엔드 시작하기</h1>
<h2 id="📌목차">📌목차</h2>
<blockquote>
</blockquote>
<h4 id="1-1-웹-개발의-구조">1-1) 웹 개발의 구조</h4>
<h4 id="1-2-서버의-동작-원리">1-2) 서버의 동작 원리</h4>
<h4 id="1-3-백엔드-개발자가-하는-일">1-3) 백엔드 개발자가 하는 일</h4>
<h4 id="1-4-백엔드-로드맵-소개">1-4) 백엔드 로드맵 소개</h4>
<p><br><br></p>
<h2 id="✅-내용정리">✅ 내용정리</h2>
<h3 id="웹web이란-무엇인가요">웹(Web)이란 무엇인가요?</h3>
<blockquote>
<p>웹이란 간단히 말하자면 인터넷이라는 네트워크 공간 안에서 HTTP 프로토콜을 사용하여 데이터를 공유하는 방식을 말한다.</p>
</blockquote>
<h3 id="웹-개발을-한다는-것은-무엇을-의미하나요">웹 개발을 한다는 것은 무엇을 의미하나요?</h3>
<blockquote>
<p>웹이란 HTTP 프로토콜을 사용하여 데이터를 공유하는 방식을 말하기 때문에 웹 개발은 해당 데이터를 공유 및 처리하기 위한 개발을 한다는 것이라고 볼 수 있다. 
예전에는 한 사람이 모든 개발을 했었지만, 
점차 웹의 규모가 커짐으로서 현대에서는 클라이언트와 백엔드 라는 2가지 영역으로 세분화 되었다.</p>
</blockquote>
<h3 id="프론트엔드가-하는일은-간략하게-무엇인가요">프론트엔드가 하는일은 간략하게 무엇인가요?</h3>
<blockquote>
<p>프론트엔드 개발자가 하는일은 크게 2가지다.
<strong>1) 사용자 인터페이스 부분을 개발하는 것.</strong>
<strong>2) 네트워크 통신망을 통해 데이터를 송수신하는 것.</strong></p>
</blockquote>
<h3 id="그렇다면-백엔드가-하는일은-간략하게-무엇인가요">그렇다면 백엔드가 하는일은 간략하게 무엇인가요?</h3>
<blockquote>
<p>백엔드 개발은 웹 애플리케이션에서 사용자가 보지 못하는 영역, 즉 서버와 DB를 관리하는 일을 한다.
좀 더 구체적으로는 아래와 같은 일을 맡는다고 볼 수 있다.
<strong>1) 클라이언트에 요청을 처리할 수 있는 기능(API)을 개발하는 것.</strong>
<strong>2) 요청에 필요한 데이터를 제공하기 위한 데이터베이스와 상호작용 하는것.</strong></p>
</blockquote>
<h3 id="백엔드-개발자가-하는-일은-구체적으로-무엇인가요">백엔드 개발자가 하는 일은 구체적으로 무엇인가요?</h3>
<blockquote>
<p>백엔드 개발자가 하는일은 구체적으로 5가지로 나눌 수 있다.</p>
</blockquote>
<ol>
<li><code>서버 개발</code> : 클라이언트에게 들어오는 요청을 접수하고 처리 후 적절한 응답 제공</li>
<li><code>데이터베이스 설계 및 관리</code> : 웹 애플리케이션의 데이터를 효율적으로 저장 및 관리하기 위한 데이터베이스를 설계 및 관리</li>
<li><code>API 개발</code> : 프론트엔드와 백엔드가 데이터를 효율적으로 주고받을 수 있도록 하는 인터페이스 개발</li>
<li><code>보안 및 인프라 관리</code> : 외부 공격으로부터 서버와 데이터 보호 + 안정적인 서비스를 제공</li>
<li><code>네트워크 설정</code> : 서버와 클라이언트 간의 효율적인 통신을 보장 (로드밸런싱, 캐싱)
클라이언트의 요청을 원활하게 처리하기 위해선 해당 5가지의 과정을 다룰 줄 알아야하기에 많은 시간과 노력이 필요된다.</li>
</ol>
<h3 id="서버의-동작-원리를-말씀해주세요">서버의 동작 원리를 말씀해주세요.</h3>
<blockquote>
<p>현대에서 웹에서는 주로 클라이언트-백엔드 모델을 채택하여 사용하고 있다.
이에 따른 통신과정은 아래와 같다.</p>
</blockquote>
<p>1) <strong><code>클라이언트 -&gt; 웹 서버</code></strong>에 무언가 요청
2) <strong><code>웹 서버 -&gt; 웹 애플리케이션 서버</code></strong>에 데이터 처리 요청
2-알파) (필요에 따라서) <strong><code>웹 애플리케이션 서버 -&gt; 데이터베이스</code></strong> 접근
3) <strong><code>웹 애플리케이션 -&gt; 웹 서버</code></strong>에 데이터 처리 값 반환
4) <strong><code>웹 서버 -&gt; 클라이언트</code></strong> 요청 응답 및 데이터 반환</p>
<h3 id="웹-서버와-웹-애플리케이션-서버의-차이가-무엇인가요">웹 서버와 웹 애플리케이션 서버의 차이가 무엇인가요?</h3>
<blockquote>
<p><strong>웹 서버</strong> : 클라이언트와 웹 애플리케이션 서버 사이에 위치해 있으며, 정적인 콘텐츠 요청은(뷰 템플릿과 같은) 그대로 클라이언트에게 전달하고, 그 외의 동적인 요청은 웹 애풀리케이션에 요청한다.
ex) Apache / Nginx  / IIS 등</p>
</blockquote>
<p><strong>웹 애플리케이션 서버</strong> : 웹 서버로부터 들어온 요청에 맞게 데이터를 추출 및 가공하여 웹 서버에 다시 반환시키는 역할을 담당한다. 필요에 따라선 DB와 상호작용 한다.
ex) Apache Tomcat / 제이보스 / IBM웹스피어 / Oracle 웹로직 등</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[도서] 객체지향의 사실과 오해 - Ch2. 이상한 나라의 객체]]></title>
            <link>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%9D%98-%EC%82%AC%EC%8B%A4%EA%B3%BC-%EC%98%A4%ED%95%B4-Ch-2.-%EC%9D%B4%EC%83%81%ED%95%9C-%EB%82%98%EB%9D%BC%EC%9D%98-%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%9D%98-%EC%82%AC%EC%8B%A4%EA%B3%BC-%EC%98%A4%ED%95%B4-Ch-2.-%EC%9D%B4%EC%83%81%ED%95%9C-%EB%82%98%EB%9D%BC%EC%9D%98-%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Fri, 08 Dec 2023 15:54:22 GMT</pubDate>
            <description><![CDATA[<h1 id="ch2-이상한-나라의-객체">Ch2. 이상한 나라의 객체</h1>
<blockquote>
</blockquote>
<p>💡 <strong>객체 지향의 패러다임은 지식을 추상화하고 추상화한 지식을 객체 안에 캡슐화함으로써 실세계 문제에 내재된 복잡성을 관리하려고 한다.</strong></p>
<h2 id="📃목차">📃목차</h2>
<blockquote>
</blockquote>
<ul>
<li>객체지향과 인지 능력</li>
<li>객체, 그리고 이상한 나라<ul>
<li>이상한 나라의 앨리스</li>
<li>앨리스 객체</li>
</ul>
</li>
<li>객체, 그리고 소프트웨어 나라<ul>
<li>상태</li>
<li>행동</li>
<li>식별자</li>
</ul>
</li>
<li>기계로서의 객체</li>
<li>행동이 상태를 결정한다</li>
<li>은유와 객체<ul>
<li>두 번째 도시전설</li>
<li>의인화</li>
<li>은유</li>
<li>이상한 나라를 창조하라</li>
</ul>
</li>
</ul>
<br>

<hr>
<h3 id="📌-모든-객체는-상태를-가진다-앨리스가-이상한나라로-가기위한-일화중">📌 모든 객체는 상태를 가진다. (앨리스가 이상한나라로 가기위한 일화중..)</h3>
<blockquote>
</blockquote>
<ul>
<li>앨리스는 상태를 가지며 상태는 변경 가능하다.</li>
<li>앨리스의 상태를 변경시키는 것은 앨리스의 행동이다.<ul>
<li>행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.</li>
<li>행동의 순서가 결과에 영향을 미친다.</li>
</ul>
</li>
<li>앨리스는 어떤 상태에 있더라도 유일하게 식별 가능하다. (앨리스가 아무리 작아지고 커진다 한들, 앨리스는 그 누구도 아닌 앨리스다.)</li>
</ul>
<br>

<h3 id="📌-행동은-상태에-의존적이다">📌 행동은 상태에 의존적이다.</h3>
<blockquote>
</blockquote>
<p>❓ 처음에는 물음을 던졌다. “엥? 행동이 상태에 의존적이라고? 오히려 행동이 상태를 변화시키니까 상태가 행동에 의존적이 되는것이 아닌가?”</p>
<p>하지만 아무리 <code>행동</code>이 <code>상태</code>를 변화시킨다고 하더라도, 우리가 불을 끄고, 켤 때를 생각해보자.
불을 끄기위해서는 (행동) -&gt; 불이 켜져 있어야한다. (상태)
반대로 불을 키기 위해서는 (행동) -&gt; 불이 꺼져 있어야한다. (상태) </p>
<p>이렇듯, 모든 행동은 결국 주체가 되는 무언가의 상태에 따라 행동이 결정되기 때문에 행동이 상태에 의존한다라고 말한다.</p>
<h3 id="📌-행동과-상태-사이의-관계">📌 행동과 상태 사이의 관계</h3>
<blockquote>
</blockquote>
<ul>
<li>객체의 행동은 상태에 영향을 받는다.</li>
<li>객체의 행동으 상태를 변경시킨다.</li>
</ul>
<br>

<h3 id="🔍-왜-상태가-필요할까">🔍 왜 상태가 필요할까?</h3>
<p>일본으로 여행을 가기 위한 “Me” 가 객체로 되어있다고 해보자.
나는 <strong>일본을 가기위해 여권을 소지했는가</strong>가 Key Point 라고 말할 수 있을 것이다.
아무리 돈이 많고, 아무리 시간이 많다고 한들, 내가 항공권이 있는지 없는지 ( true, false ) 에 대한 상태가 결국 내가 일본으로 갈 수 있는지 없는지가 결정되는 것이다. </p>
<blockquote>
</blockquote>
<p>상태를 이용하면 내가 누구인지, 어떤사람 인지에 대한 과거에 얽매이지 않고, “이름” “나이” “여권의 여부” 로 일본을 갈 수 있는 행동의 결과를 쉽게 예측할 수 있다.</p>
<br>

<h3 id="📌-협력과-행동">📌 협력과 행동</h3>
<p>객체가 다른 객체와 <code>협력</code>하는 유일한 방법은 <code>메시지를 보내는 것</code>이다. (요청)
메시지를 보내는 방법은 결국 <code>행동</code>에 의해서 발생되지 않는가?</p>
<p>결국, 협력을 위해서 행동을 해야만 하는 것이다.
이에 따라 행동의 역할은 2가지로 정의할 수 있을 것 같다.</p>
<blockquote>
</blockquote>
<ul>
<li>행동을 통해, 본인의 상태를 변경시킬 수 있다.</li>
<li>행동을 통해, 다른 객체의 메시지를 보낼 수 있다. </li>
</ul>
<br>

<h3 id="📌-현실-세계의-객체-vs-객체지향-세계의-객체-차이점">📌 현실 세계의 객체 vs 객체지향 세계의 객체 (차이점)</h3>
<p>우리는 현실세계에서 남자가 음료수를 마신다. 라고 하였을 때, 남자는 능동적인 객체이며, 음료수는 수동적인 객체이기 때문에 음료의 양이 줄어들게 만드는 것은 오직 남자가 될 것이다.</p>
<p>하지만, 객체지향 세계에서는 조금 다르다. 객체의 주체는 모두 스스로가 가지고 있기 때문에 <code>메시지</code> <code>협력</code>과 같은 키워드가 추가될 것이다. 예를 들자면, &quot;남자가 음료수를 마신다.&quot; 라고 하였을 때, 남자 / 음료수 라는 2가지 객체가 만들어지는데, 능동과 수동의 개념이 사라진다,</p>
<p>남자는 오직 음료수에게 음료수를 마셨다. 라는 메시지 하나만 보낼 수 있으며, 음료의 양이 줄어들고 말고는(<strong>상태의 변화</strong>) 남자에게 메시지를 전달받은 음료수가 결정할 일이다. </p>
<h3 id="🔍-이것이-캡슐화">🔍 이것이 캡슐화!</h3>
<blockquote>
</blockquote>
<p>객체는 캡슐안에 본인의 정보를 감춰놓는 것 처럼, 본인의 상태를 숨긴 채 외부로 노출시키지 않는다.
외부로 노출시키는 것은 오직 행동뿐이며, 외부에서 접근할 수 있는 방법도 역시 오직 행동뿐이다.</p>
<p>송신자는 오직 &quot;~해주세요&quot; 라는 메시지만 보낼 수 있을 뿐, 수신자가 어떤 상태인지 그리고 수신자가 어떻게 상태를 변화시키는지는 전혀 알 수도, 알 필요가 없는 것이다.</p>
<p>위에 내용에 남자가 아무리 &quot;음료를 마셨다.&quot; 라고 음료수에게 메시지를 보내더라도 <strong>음료수가 스스로</strong> 본인의 음료수 상태를 줄이지 않는다면, 더이상 남자는 음료수를 어떠한 경우에서도 <strong>간섭할 수 없다.</strong></p>
<p>결론적으로 잘 정의된 행동 아래에서 캡슐화를 진행했다면, 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다. 이것이 상태를 캡슐화해야 하는 이유이다.</p>
<hr>
<h3 id="📌-책임-주도-설계-responsibility-driven-design-rdd">📌 책임-주도 설계 (Responsibility-Driven Design, RDD)</h3>
<blockquote>
</blockquote>
<p>객체지향에 갓 입문한 사람들이 가장 쉽게 빠지는 함정은, 상태를 중심으로 객체를 바라보는 것이다.
안타깝게도, 상태를 먼저 결정하고 행동을 결정하는 방법은 객체를 파멸로 이끈다.</p>
<h3 id="❗-행동이-상태를-결정한다">❗ 행동이 상태를 결정한다.</h3>
<p>객체의 주 역할 중 하나는 무엇일까? 바로 <code>협력</code>이다.
애플리케이션에 필요한 협력을 생각하고, 협력을 위해서 행동이 필요로 된다. 행동을 결정한 후에야 행동에 필요한 정보가 무엇인지 고려하여, 그 과정에서 상태가 결정되어야한다.</p>
<blockquote>
<p>협력 안에서 객체의 행동은 결국, 협력에 참여하기 위해 완수해야 하는 책임을 의미한다!</p>
</blockquote>
<h3 id="📌-의인화">📌 의인화</h3>
<p>객체지향은 현실세계를 모방하여 생겨났다기에는 다소 받아들이기 힘든 부분이 많다. 어떻게 현실세계와 소프트웨어를 똑같이 볼 수가 있겠는가? <strong>최대한 현실세계처럼 보이려 노력한다.</strong> 가 맞는 표현일 것 같다.</p>
<p>그렇다면 어떻게 현실세계처럼 보이려 노력하는걸까? 그것은 바로 객체를 <code>의인화</code>하여 보는 것이다.
다만 의인화를 현실세계와 가장 크게 다른점이라고 한다면, 모든 객체가 <code>능동적</code>이라는 것이다. 위 내용중, <strong>남자와 음료수</strong> 내용을 기억하겠는가? 여기서 보이듯이, 우리는 음료조차도 의인화하여 주도적으로 행동하는 의인화가 적용되었다는 것을 알 수 있다. </p>
<br>

<p>자, 이제 모든 객체가 살아 움직이는 <strong>“이상한 나라를 창조해보자”</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[도서] 객체지향의 사실과 오해 - Ch1. 협력하는 공동체]]></title>
            <link>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%9D%98-%EC%82%AC%EC%8B%A4%EA%B3%BC-%EC%98%A4%ED%95%B4-Ch1-%ED%98%91%EB%A0%A5%ED%95%98%EB%8A%94-%EA%B3%B5%EB%8F%99%EC%B2%B4-6994zzen</link>
            <guid>https://velog.io/@7_06com/%EB%8F%84%EC%84%9C-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%9D%98-%EC%82%AC%EC%8B%A4%EA%B3%BC-%EC%98%A4%ED%95%B4-Ch1-%ED%98%91%EB%A0%A5%ED%95%98%EB%8A%94-%EA%B3%B5%EB%8F%99%EC%B2%B4-6994zzen</guid>
            <pubDate>Fri, 08 Dec 2023 15:53:22 GMT</pubDate>
            <description><![CDATA[<h1 id="ch1-협력하는-객체들의-공동체">Ch1. 협력하는 객체들의 공동체</h1>
<p>왜 객체지향 프로그래밍은 실세계를 모방하기 이해하기 위해 만들어졌다고 설명하는가? 이해도 안되고, 괴리감이 드는데.. 그 이유는 <code>역할</code> <code>책임</code> <code>협력</code>을 설명하기 위함이지 않을까?</p>
<h3 id="👍-저자는-바리스타-캐시어-손님이라는-한-카페에서의-일화로-객체지향을-설명한다">👍 저자는 바리스타, 캐시어, 손님이라는 한 카페에서의 일화로 객체지향을 설명한다.</h3>
<blockquote>
</blockquote>
<p>손님 : 캐시어에게 커피를 주문하는 역할.
캐시어 : 손님에게 커피를 주문받고 바리스타에게 주문내역을 전달하는 역할.
바리스타 -&gt; 캐시어에게 받은 커피 주문서로 커피를 제조하고, 다시 캐시어에게 전달하는 역할.</p>
<p>이는 요청과 응답으로 표현하자면
손님 -&gt; 캐시어 -&gt; 바리스타 -&gt; 캐시어 -&gt; 손님이 될 것이다.</p>
<p>이처럼 바리스타, 손님, 캐시어 간의 <strong>협력</strong>은 <strong>요청과 응답 (메세지)</strong> 으로 인해 발생된다.
이때 각자의 <strong>역할</strong>이 중요한데, 역할을 가진다는 것은, 책임이 부여되는 것과도 같다. </p>
<p>ex) 경찰관 = 범인을 잡을 책임 , 소방관 = 불을 끌 책임</p>
<br>

<h3 id="📌-역할을-부여받고-책임을-수행한다는-것은-4가지를-내포한다">📌 역할을 부여받고, 책임을 수행한다는 것은 4가지를 내포한다.</h3>
<blockquote>
</blockquote>
<ul>
<li>여러 사람이 동일한 역할을 수행할 수 있다.</li>
<li>역할은 대체 가능성을 의미한다.</li>
<li>책임을 수행하는 방법은 자율적으로 선택할 수 있다.</li>
<li>한 사람이 동시에 여러 역할을 수행할 수 있다.</li>
</ul>
<p>객체 지향에서 객체가 결국 주체가 되는 이유는, 서로간의 협력을 하기 위한 주체가 객체이기 때문이다.
단, 주체가 만일 전지전능한 기능으로 협력에 참여하지 않는다면, 내부복잡도로 자멸해버리고 말 것이다.
서로간의 메세지로 각자의 역할을 적절하게 위임받으며 협력하는 것이 좋은 사회, 즉 좋은 애플리케이션이 탄생하게 되는 것이다.</p>
<p>객체가 누군가에게 지배받지 않고, 자율적으로 행동하기 위해서 상태와 행동을 지닌다.
객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 것으로 나온다.
외부에선 객체가 무슨일을 하는지(what) 은 알고 있지만, 어떻게 (how) 하는지는 알 수 없다.</p>
<p>커피도 각자 무슨일을 하는지는 알고있지만 각 객체가 어떻게 처리하는지는 전혀 알 필요도 없고 자율적으로 행할수가 있다. 따라서 객체는 상태와 행위를 하나의 단위로 묶는 자율적인 존재이다.</p>
<br>

<h3 id="📌-객체지향의-본질">📌 객체지향의 본질</h3>
<blockquote>
</blockquote>
<ul>
<li>객체지향이란 시스템을 상호작용하는 <strong>자율적인 객체들의 공동체</strong>로 바라보고 객체를 이용해 시스템을 분할하는 방법이다.</li>
<li>자율적인 객체란 <strong>상태</strong>와 행위를 함께 지니며 스스로자기 자신을 책임지는 객체를 의미한다.</li>
<li>객체는 시스템의 행위를 구현하기 위해 다른 객체와 <strong>협력</strong>한다. 각 객체는 협력 내에서 정해진 <strong>역할</strong>을 수행하며 역할은 관련된 <strong>책임</strong>의 집합이다.</li>
<li>객체는 다른 객체와 협력하기 위해 메시지를 전송하고, <strong>메시지</strong>를 수신한 객체는 메시지를 처리하는 데 적합한 <strong>메서드</strong>를 자율적으로 선택한다.</li>
</ul>
<p>객체지향은 객체를 지향하는 것이지, 클래스를 지향하는것이 아니라는것에 명심하자!</p>
]]></description>
        </item>
    </channel>
</rss>