<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>호기심 많은 솔이의 개발 노트</title>
    <link>https://curiousjung1997.tistory.com/</link>
    <description>백엔드 웹 개발 공부(JAVA, Spring Boot 등)를 하면서 새롭게 알게 된 내용들을 기록하는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 16 Jun 2026 01:45:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>호기심 많은 솔이</managingEditor>
    <image>
      <title>호기심 많은 솔이의 개발 노트</title>
      <url>https://tistory1.daumcdn.net/tistory/7717405/attach/550801dd2572421c9b0f00d98926e5c3</url>
      <link>https://curiousjung1997.tistory.com</link>
    </image>
    <item>
      <title>OUTBOX 패턴이란?</title>
      <link>https://curiousjung1997.tistory.com/57</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;OUTBOX 패턴이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OUTBOX 패턴은 &lt;b&gt;외부 시스템&lt;/b&gt;으로 처리해야 할 작업을 바로 실행하지 않고, 먼저 DB 테이블에 &quot;해야 할 작업&quot;으로 저장해두고, &lt;b&gt;별도 워커&lt;/b&gt;가 그 테이블 또는 큐를 기준으로 처리하는 방식이다. 특히, &lt;b&gt;이벤트 기반 아키텍처&lt;/b&gt;에서 메시지 유실을 방지하고, &lt;b&gt;데이터 정합성을 보장&lt;/b&gt;하는 데 활용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면, 특정 이벤트에 대한 알림톡을 보내야 하는 경우, 바로 알림톡 API를 호출하는 게 아니라, 먼저 DB에 데이터를 남기고, 프로듀서가 SQS에 메시지를 넣고, 워커가 SQS 메시지를 받아서 해당 outboxId를 기준으로 OUTBOX를 선점한 뒤 알림톡을 발송할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;사용하는 이유?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[중복 처리 방지, 장애 복구, 처리 상태 추적]&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알림톡 같은 외부 API 호출은 언제든 실패할 수 있는데, 이런 상황에서 OUTBOX가 없으면 보냈는지 안 보냈는지, 다시 보내도 되는지, 누가 처리 중인지 추적이 어려워진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면, OUTBOX가 있다면, DB에 상태가 남기 때문에 안전하게 제어할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, OUTBOX 패턴을 사용했을 때, 아웃박스 테이블을 따로 둬야 하므로 DB 사용량이 증가하고, 아웃박스를 다루는 로직이 추가로 필요하다는 단점도 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;OUTBOX 처리 흐름 예시&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. OUTBOX로 특정 이벤트를 선점(CLAIM)하여 다른 워커 등이 같은 이벤트를 중복 처리하지 않도록 방지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 해당 이벤트 처리 성공 시 선점 상태를 풀고 성공 처리로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 처리 실패 시 선점 상태를 풀고 실패 처리로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DB</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/57</guid>
      <comments>https://curiousjung1997.tistory.com/57#entry57comment</comments>
      <pubDate>Thu, 21 May 2026 00:03:56 +0900</pubDate>
    </item>
    <item>
      <title>SQS 기반 알림톡 워커 구현</title>
      <link>https://curiousjung1997.tistory.com/56</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;문제 상황&lt;/b&gt; : 특정 비즈니스 이벤트가 발생했을 때, 담당자에게 정해진 시간 안에 알림 전달 필요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;해결 방향&lt;/b&gt;&amp;nbsp;: 이벤트와 관련된 사용자에게 외부 알림톡 API를 통해 안내 메시지를 발송하도록 설계 및 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;설계&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[흐름 정리]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 비즈니스 이벤트 발생 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Producer가 알림 발송 작업을 Outbox에 저장 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Producer가 메시지 큐에 작업 ID 전송 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Worker가 큐 메시지 수신 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. Worker가 Outbox 작업을 선점 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. Worker가 알림 템플릿 조회 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7. Worker가 발송에 필요한 데이터를 조회하는 SP 실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 테이블들을 상황에 맞게 조회, 조인하여, 필요한 데이터들을 가져옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8. Worker가 템플릿 파라미터 구성 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 위에서 가져온 필드들을 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Java에서&amp;nbsp;&lt;/span&gt;파싱하여 템플릿에 맞게 templateParam을 구성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;9. 구성한 templateParam으로 외부 알림톡 API 호출&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;10. 발송 성공 시 OUTBOX 성공 처리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;11. 발송 실패 시 OUTBOX 실패 처리&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[링크] &lt;a href=&quot;https://curiousjung1997.tistory.com/57&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OUTBOX 패턴이란?&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[링크] &lt;a href=&quot;https://curiousjung1997.tistory.com/52&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AWS SQS란?&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[테이블 및 SP]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. OUTBOX 테이블 : 발송 작업 단위 저장, 선점 및 성공/실패 결과 저장용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;(**워커가 죽었을 때 PROCESSING 상태가 너무 오래 묶이지 않도록 하기 위해 LOCK_UNTIL 컬럼을 두고, LOCK 만료 시간을&lt;/span&gt;&lt;span style=&quot;color: #009a87;&quot;&gt; 설정)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 알림톡 발송 이력 테이블 : 실제 알림톡 발송 결과 저장용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 알림톡 템플릿 관리 테이블 : 케이스 별 템플릿 관리용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a. OUTBOX 선점 SP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b. OUTBOX 성공 처리 SP&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c. OUTBOX 실패 처리 SP&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d. 첫 번째 템플릿(특정 이벤트 발생 알림)발송 데이터 조회 SP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[템플릿 구성]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전제 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 추후 여러 템플릿이 추가될 수 있어 확장성 고려&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 템플릿 별로 필요한 데이터가 달라 templateId 기준으로 조회 로직 분리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Worker가 templateId에 맞는 조회 로직 실행 후 templateParam 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 템플릿 코드는 고정값 (템플릿 별로 정해져 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 플랫폼 별로 서로 다른 큐 사용 예정 -&amp;gt; 플랫폼 별 코드로 구분할 필요 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알림톡 모듈 (AWS SQS)</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/56</guid>
      <comments>https://curiousjung1997.tistory.com/56#entry56comment</comments>
      <pubDate>Wed, 20 May 2026 22:48:30 +0900</pubDate>
    </item>
    <item>
      <title>공통 모듈 분리(모듈화) 정리 (+간단 예시, 핵심 요약)</title>
      <link>https://curiousjung1997.tistory.com/55</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 &lt;b&gt;공통 모듈 분리&lt;/b&gt;에 대한 설명을 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용을 요약하면, 어떤 프로젝트에서는 쓰이고, 또 어떤 프로젝트에서는 쓰이지 않는 것들이 아니라, 대부분의 프로젝트에서 쓰이는 것들, 예를 들면 &lt;b&gt;db 설정, 해싱, jwt 관련 로직, 전역 예외처리, 공통 응답/에러 포맷, 검증(Validation), 로깅&lt;/b&gt;과 같은 것들은 따로 분리해서 뽑아 놓으면 새로운 프로젝트에서도 그대로 쓸 수 있고, 이를 잘 활용하면 개발 효율이 많이 올라간다는 것이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 나오는 것들 외에도 알림톡 모듈을 개발한 후에 메일 전송 모듈을 만든다고 하면 공통되는 로직이 많을 것이다. 알림톡 모듈을 개발할 때, 그런 공통 로직들을 잘 뽑아서 정리해 놓으면 메일 전송 모듈을 개발할 때에는 개발 시간이 많이 단축될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위의 내용들을 바탕으로 실습을 해보면서 감을 익혀보자는 생각으로 간단한 CRUD를 만들고, 공통된 부분을 분리해보기로 했다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표 : 2개의 테이블(학교, 학생)을 만들고, 학교, 학생 CRUD를 간단하게 구현한 후, 공통된 로직 추출해보기.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 학교 CRUD : 학교 생성, 학교 목록 조회, 학교 단건 조회, 학교 수정, 학교 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 학생 CRUD : 학생 생성, 학생 목록 조회, 학생 단건 조회, 학생 이름 수정, 학생 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 실습을 하면서 뽑아낸 공통된 로직들 중 학습하기 좋은 예시를 하나 가져와서 설명해보겠다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;공통 부분 추출 전 StudentRepository&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;3000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvoBOR/dJMcadm9dBE/UbmhgHuci9nzPH3HdeY6lk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvoBOR/dJMcadm9dBE/UbmhgHuci9nzPH3HdeY6lk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvoBOR/dJMcadm9dBE/UbmhgHuci9nzPH3HdeY6lk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvoBOR%2FdJMcadm9dBE%2FUbmhgHuci9nzPH3HdeY6lk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;3000&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;공통 부분 추출 전 SchoolRepository&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;3000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zXpVr/dJMcafrMTVF/C8Ynbt0oaA9HPzcbqYsm40/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zXpVr/dJMcafrMTVF/C8Ynbt0oaA9HPzcbqYsm40/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zXpVr/dJMcafrMTVF/C8Ynbt0oaA9HPzcbqYsm40/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzXpVr%2FdJMcafrMTVF%2FC8Ynbt0oaA9HPzcbqYsm40%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;3000&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 두 코드를 보면, &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;공통된 부분&lt;/b&gt;&lt;/span&gt;을 찾을 수 있다. 초록색으로 표시된 부분들이 두 레포지토리의 공통된 부분이고, 노란색으로 표시된 부분이 &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;차이가 나는 부분&lt;/b&gt;&lt;/span&gt;이다. 사진에서 보이는 것처럼 파라미터의 개수만 다른 경우도 차이가 나는 부분임에 주의해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;초록색 부분(공통 부분) 요약&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. GeneratedKeyHolder()로 PK 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. jdbcTemplate.update(...) 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. con.prepareStatement(...)로 생성된 PK 반환 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. keyHolder.getKey()로 방금 INSERT 된 id 꺼내서 Long으로 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;노란색 부분(차이 부분) 요약&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A. INSERT INTO ... (파라미터 다름)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B. ps.setString(...) ... (null 유무 다름)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;공통 부분 추출 후&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이렇게 &lt;/span&gt;&lt;b&gt;공통된 부분&lt;/b&gt;&lt;/span&gt;을 추출한 후 이제 이를 &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;하나의 메서드&lt;/span&gt;&lt;/b&gt;로 만들었다. -&amp;gt; &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;JdbcHelpers.insertAndReturnId(...)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;2344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nDZoz/dJMcabCUUF1/AacgEd2kapgjsuDFK2ll20/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nDZoz/dJMcabCUUF1/AacgEd2kapgjsuDFK2ll20/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nDZoz/dJMcabCUUF1/AacgEd2kapgjsuDFK2ll20/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnDZoz%2FdJMcabCUUF1%2FAacgEd2kapgjsuDFK2ll20%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;2344&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;2344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사진의 코드를 보면, 공통된 부분은 JdbcHelper라는 클래스에 insertAndReturnId(...)라는 메서드로 만든 후, StudentRepository에서 메서드 호출만으로 사용하고 있는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이런 식으로 공통 부분을 뽑아내서 코드를 작성하면 얻을 수 있는 장점은 많기 때문에, 직관적으로 가장 이해하기 쉬운 예시를 들자면,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 구조에서는 &lt;b&gt;StudentRepo 내용이 1,2,3,4,A,B&lt;/b&gt;이고, &lt;b&gt;SchoolRepo 내용이 1,2,3,4,a,b&lt;/b&gt; 였다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공통 부분을 뽑아낸 후의 &lt;b&gt;StudentRepo 내용은 @,A,B&lt;/b&gt;가 됐고, &lt;b&gt;SchoolRepo 내용은 @,a,b&lt;/b&gt;가 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이렇게 공통 부분을 뽑아냄으로써 &lt;span style=&quot;color: #ee2323;&quot;&gt;중복을 제거&lt;/span&gt;하고, &lt;span style=&quot;color: #ee2323;&quot;&gt;코드의 가독성도 향상&lt;/span&gt;시킬 수 있었다. 또한, 이후 프로젝트에서 이 로직을 &lt;span style=&quot;color: #ee2323;&quot;&gt;재사용&lt;/span&gt;하는 경우가 생긴다면 &lt;span style=&quot;color: #ee2323;&quot;&gt;개발 시간도 단축&lt;/span&gt;할 수 있다는 효과가 있는 것이다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>개인 공부/Spring Boot</category>
      <category>jdbchelper</category>
      <category>Modularization</category>
      <category>module</category>
      <category>가독성 향상</category>
      <category>개발 시간 단축</category>
      <category>공통 모듈 분리</category>
      <category>모듈화</category>
      <category>재사용</category>
      <category>중복 제거</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/55</guid>
      <comments>https://curiousjung1997.tistory.com/55#entry55comment</comments>
      <pubDate>Fri, 16 Jan 2026 01:18:06 +0900</pubDate>
    </item>
    <item>
      <title>저장 프로시저(SP: Stored Procedure)란?</title>
      <link>https://curiousjung1997.tistory.com/54</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;프로시저란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로시저(Procedure)는&lt;span&gt;&amp;nbsp;&lt;/span&gt;특정 작업을 수행하기 위해 미리 정의된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;일련의 명령어 집합&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;으로, 데이터베이스에서 데이터의 추가, 수정, 삭제, 조회 등 복잡한 작업을 자동화하고 효율적으로 처리하기 위해 사용된다. 프로시저는 함수와 달리 값을 반환하지 않고 여러 동작을 묶어 하나의 논리적 단위로 실행한다는 특징을 가지고 있다. 프로시저를 사용하면 반복적인 업무를 줄이고 데이터베이스 성능을 향상시킬 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;미리 만들어서 DB에 저장해두고, 필요할 때 이름으로 호출하면, 프로시저 내에 들어있는 여러 SQL(조회/수정/삽입/삭제, 계산, 조건문 등)이 한 번에 실행된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;프로시저를 사용하는 이유&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 같은 로직을 여러 시스템에서 재사용 할 수 있다. &lt;span style=&quot;color: #009a87;&quot;&gt;ㅡ&amp;gt; 추후 비슷한 시스템 개발 시 시간 단축 가능&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 예를 들어, 쇼핑몰에서 주문이 완료되면 주문 금액의 1%만큼 포인트를 적립하고, 적립 후 히스토리를 남긴다는 규칙이 있다고 할 때, 이를 프로시저로 DB에 만들어두면 웹, 앱, 관리자 등 여러 곳에서 같은 프로시저만 호출하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 로직을 DB에 모아 일관성을 유지할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 적립 규칙이 바뀌면 프로시저만 수정하면 전 채널에 동일하게 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 네트워크 왕복을 줄여 성능 개선이 가능하다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 앱이 회원조회 -&amp;gt; 포인트 계산 -&amp;gt; 포인트 업데이트 -&amp;gt; 히스토리 INSERT를 각각 따로 보내면 DB를 여러 번 왕복해야 하지만, 프로시저는 한 번의 호출로 DB 안에서 전부 처리가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 소스 코드에서 SQL을 길게 직접 쓰는 대신 DB에 만들어둔 프로시저를 호출하면 소스 코드가 단순해질 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;프로시저를 사용하는 경우와 SQL로 앱에서 처리하는 경우 비교 예시&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efsOcm/dJMcaacWMGp/oE0voG7crAte1pkEHiNsqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efsOcm/dJMcaacWMGp/oE0voG7crAte1pkEHiNsqK/img.png&quot; data-alt=&quot;SQL 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efsOcm/dJMcaacWMGp/oE0voG7crAte1pkEHiNsqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefsOcm%2FdJMcaacWMGp%2FoE0voG7crAte1pkEHiNsqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;418&quot; height=&quot;316&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SQL 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결제 시 DB에서 해야 할 일은 일반적으로 여러 단계로 구성되어 있다.&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 사용자 잔액이 충분한지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 잔액 차감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 주문(결제) 기록 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 실패하면 전체 롤백&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우에 프로시저를 사용하지 않고 SQL로 앱에서 처리한다면 위 사진에 나오는 것과 같이 DB 왕복이 3번이나 필요하다. 또한, 중간에 장애/예외가 생기면 잔액을 줄었는데 주문이 없는 경우도 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하지만 프로시저를 사용하면 아래 사진의 내용과 같이 앱에서 그냥 한 번의 호출만 하면 위의 로직이 모두 실행된다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;244&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZBcoa/dJMcadILvXo/R886K7dc56CVsNa9kGlkk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZBcoa/dJMcadILvXo/R886K7dc56CVsNa9kGlkk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZBcoa/dJMcadILvXo/R886K7dc56CVsNa9kGlkk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZBcoa%2FdJMcadILvXo%2FR886K7dc56CVsNa9kGlkk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;244&quot; height=&quot;85&quot; data-origin-width=&quot;244&quot; data-origin-height=&quot;85&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이렇게 프로시저를 이용했을 때, 체감되는 장점을 정리해 보면&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 네트워크 왕복이 3번에서 1번으로 줄었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 잔액 차감, 주문 생성이 항상 같이 성공/실패한다.(원자성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 규칙이 DB에 고정돼서 모든 곳에서 동일하게 동작한다.(일관성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;이외에도, 복잡한 SQL을 자바 코드에서 분리할 수 있어서 애플리케이션 단의 역할 및 책임의 일부를 DB쪽으로 이전한다는 느낌이 들었다. 이렇게 하면 DB를 잘 다루는 사람의 경우, 애플리케이션 코드에서 SQL 처리 복잡도를 줄일 수 있을 것 같다는 생각이 들었다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;하지만 외부 시스템 연동 흐름까지 DB에서 처리하는 것은 좋지 않을 것 같다는 생각이 들었다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;관련 내용을 찾아보니,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 조회, 변경, 상태관리, 트랜잭션, 동시성 제어와 같은 작업들은 DB에 맡기기 적합하지만,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;외부 API 호출, SQS 처리, JSON 파싱, 예외 분기, 비즈니스 흐름 제어와 같은 작업들은 DB가 아니라 애플리케이션에서 맡아서 처리하는 것이 좋은 것 같다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;프로시저를 사용하면 좋은 케이스&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 여러 테이블을 한 번에 처리해야 하는 작업 ex) 회원가입(여러 테이블 insert), 주문 생성(주문/결제/재고 테이블 update)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 트랜잭션(원자성)이 중요한 작업 ex) 중간에 실패하면 안 되는 한 덩어리 업무를 DB에서 묶어두는 게 안정적일 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 여러 서비스에서 동일하게 재사용되는 핵심 쿼리&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;프로시저를 사용하면 나쁜 케이스&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 단순 CRUD 한두 줄인데 자주 바뀌는 비즈니스 로직&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. DB 벤더 종속을 피하고 싶을 때(이식성)&lt;/p&gt;</description>
      <category>DB</category>
      <category>Procedure</category>
      <category>Stored Procedure</category>
      <category>저장 프로시저</category>
      <category>프로시저</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/54</guid>
      <comments>https://curiousjung1997.tistory.com/54#entry54comment</comments>
      <pubDate>Wed, 14 Jan 2026 22:39:05 +0900</pubDate>
    </item>
    <item>
      <title>AWS SQS를 이용한 알림톡 모듈 - Enqueue/Dequeue 구현 및 로직 정리</title>
      <link>https://curiousjung1997.tistory.com/53</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;기본 흐름 구성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리 서비스에서는 &lt;b&gt;특정 이벤트 발생 -&amp;gt; Producer가 SQS에 메시지를 Enqueue -&amp;gt; Consumer가 Polling으로 Dequeue 후 알림톡 발송 -&amp;gt; 성공 시 메시지 삭제&lt;/b&gt; 흐름으로 알림톡 모듈을 구성하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;과금 방식&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 과금(잔액 차감)은 &quot;큐에 들어간 순간 바로 차감&quot;이 아니라, Enqueue 시점에는 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;예약 차감&lt;/span&gt;&lt;/b&gt; &amp;amp; 임시 과금 상태를 저장하고 Dequeue 후 발송 성공 시점에 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;확정 차감&lt;/span&gt;&lt;/b&gt; &amp;amp; 실제 잔액을 차감하는 식으로 구성하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Enqueue 단계에서 잔액을 바로 차감하지 않는 이유&lt;/b&gt;를 설명하자면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQS는 기본적으로 적어도 한 번 전달될 수 있고, 네트워크/타임아웃/컨슈머 장애로 인해 같은 메시지가 중복 처리될 가능성이 있다. 또한, 외부 알림톡 벤더 API는 언제든 일시 장애가 날 수 있고, 그러면 발송은 지연되거나 재시도될 수 있다. 만약 Enqueue 순간에 바로 잔액을 차감해 버리면 발송 실패/지연이 발생했을 때, 차감은 됐는데 발송은 안 되는 불일치가 생길 수 있고, 중복 메시지 처리 시, 동일 요청에 대해 잔액이 2번 차감될 위험이 있다. 이때 실패 케이스를 복구하려면 이미 차감된 돈을 다시 돌려주는 복잡한 보상 트랜잭션이 필요해진다. 그래서 우리는 Enqueue에서는 예약 차감만 하고, Consumer가 실제 발송을 끝낸 뒤에만 확정 차감 하도록 분리하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로, &lt;b&gt;상태 전이(RESERVED -&amp;gt; CONFIRMED)를 둔 이유&lt;/b&gt;를 설명하자면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 멱등성(idempotency)을 확보하기 위해&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SQS 메시지는 같은 요청이 중복으로 들어오거나(프로듀서 재전송), 컨슈머가 처리 중 장애가 나서 다시 처리될 수 있다. 이때,&amp;nbsp; 임시 과금 테이블의 STATUS가 이미 CONFIRMED라면, 이 요청은 이미 확정 처리된 것으로 간주하고 성공 처리(재차감 방지) 하도록 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 장애 복구 시 재처리 기준점을 확보하기 위해&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- RESERVED 상태와 CONFIRMED 상태의 구분이 있으면 장애가 났을 때에도 판단이 명확해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- RESERVED만 남아있으면 발송 실패 or 미처리된 상황이므로 재시도 or 보상(예약 해제) 대상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CONFIRMED면 이미 끝났으므로 중복 처리 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 운영 관점에서 추적/감사(Audit) 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자의 &quot;돈은 차감됐는데 왜 알림톡이 안 왔나요?&quot;와 같은 질문에 답하려면 상태 전이가 있어야 추적이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;가용 잔액 체크&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Enqueue 시에는 &lt;b&gt;가용 잔액을 체크&lt;/b&gt;하는데, 이때 &lt;b&gt;예약 차감이 있는 경우까지 고려하기 위해,&lt;/b&gt; 예약 차감액을 위한 컬럼을 두었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이렇게 계산하는 이유&lt;/b&gt;를 간단한 예시로 설명하자면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고객 A에게 잔액이 1000원이 있고, 알림톡 1건당 100원이 차감된다고 하자. 이때, 고객 A에게 알림톡을 발송해야 하는 이벤트가 5번 발생했고, 해당 알림톡이 Enqueue까지만 된 상황이라면, 예약 차감액(HOLD)이 500원이고, 잔액은 아직 차감되지 않았기 때문에 1000원이 그대로 남아있다. 하지만, 예약 차감액 500원이 있기 때문에, 추가 알림톡 발송은 최대 5건만 가능하다. 즉, 잔액은 1000원이지만 실제로 사용 가능한 금액은 500원인 것이다. 이 상황에서 알림톡을 추가로 6건 발송하려고 한다면 그 6번째 요청은 처리되지 않아야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알림톡 모듈 (AWS SQS)</category>
      <category>DEQUEUE</category>
      <category>Enqueue</category>
      <category>idempotency</category>
      <category>SQS</category>
      <category>멱등성</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/53</guid>
      <comments>https://curiousjung1997.tistory.com/53#entry53comment</comments>
      <pubDate>Tue, 13 Jan 2026 23:56:15 +0900</pubDate>
    </item>
    <item>
      <title>AWS SQS를 이용한 알림톡 모듈 개발 - SQS의 개념 및 작동 방식 (+SQS를 선택한 이유)</title>
      <link>https://curiousjung1997.tistory.com/52</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;SQS란?&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QGvYj/dJMcahwmL6Z/G2hEMbGZ5BC9XEbu7ZWuF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QGvYj/dJMcahwmL6Z/G2hEMbGZ5BC9XEbu7ZWuF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QGvYj/dJMcahwmL6Z/G2hEMbGZ5BC9XEbu7ZWuF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQGvYj%2FdJMcahwmL6Z%2FG2hEMbGZ5BC9XEbu7ZWuF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;283&quot; height=&quot;156&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SQS(Simple Queue Service)&lt;/b&gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;AWS에서 제공하는 완전 관리형 메시지 큐 서비스&lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;로, 분산 시스템과 애플리케이션 간의 메시지(작업)를 안정적으로 주고받도록 하여 서비스들을 분리(Decoupling)하고 확장성을 높여주는 역할을 한다. SQS는 생산자(Producer)가 보낸 메시지를 Enqueue를 통해 큐에 저장하고, 소비자(Consumer)가 필요할 때 큐에서 그 메시지를 가져가(Dequeue) 처리하는 비동기 방식으로 작업이 이루어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #0a0a0a;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;SQS의 작동 방식&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1602&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KIRCh/dJMcahXssFM/9LD3ZX7ojyAbPBxyhEfNw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KIRCh/dJMcahXssFM/9LD3ZX7ojyAbPBxyhEfNw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KIRCh/dJMcahXssFM/9LD3ZX7ojyAbPBxyhEfNw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKIRCh%2FdJMcahXssFM%2F9LD3ZX7ojyAbPBxyhEfNw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1602&quot; height=&quot;511&quot; data-origin-width=&quot;1602&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;위 그림은 AWS SQS의 작동 방식이다. 맨 왼쪽의 Producer는 메시지를 제공하는 쪽이다. 즉, 메시지를 큐에 넣는 쪽을 producer라고 한다. 이렇게 큐에 들어간 메시지는 설정에 따라 서버사이드 암호화(SSE-SQS 또는 SSE-KMS)로 안전하게 저장되며, Consumer가 폴링(Polling)을 통해 메시지를 가져가는 방식으로 처리된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Consumer가 메시지를 가져가면 SQS는 일정 시간 동안 해당 메시지를 다른 Consumer에게 보이지 않게 숨기는데, 이를 &lt;b&gt;Visibility Timeout&lt;/b&gt;이라고 한다. Consumer가 Visibility Timeout 안에 처리를 끝내고 DeleteMessage를 호출하면 메시지는 큐에서 제거되어 &amp;lsquo;처리 완료&amp;rsquo;로 확정된다. 반대로 시간 안에 삭제되지 않으면 메시지는 다시 보이게 되어 재시도 흐름으로 들어가며, 이 특성 때문에 컨슈머는 중복 처리 가능성을 전제로 설계해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;SQS의 특징과 장단점&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;&amp;lt;특징&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- DLQ(Dead Letter Queue)&lt;/b&gt;: 여러 번 실패한 메시지를 별도로 모아 원인 분석 및 재처리에 활용할 수 있다.&lt;br /&gt;- Long Polling 및 Batch 처리를 지원하여 비용/성능 최적화에 유리하다.&lt;br /&gt;- 메시지 보관 기간(retention)은 기본 4일이며, 최대 14일까지 설정할 수 있다.&lt;br /&gt;- 요청-응답을 분리하는 비동기 처리 구조에 적합하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;장점&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 내구성/신뢰성 : &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;메시지는 높은 내구성으로 저장되어 유실 위험이 낮고, 처리 실패 메시지는 DLQ로 분리할 수 있다. 다만(Standard Queue 기준) 중복 수신이 발생할 수 있어 &lt;b&gt;멱등성(Idempotency)&lt;/b&gt; 처리가 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;- 보안성 : &lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;SQS는 서버사이드 암호화(SSE)를 지원하며, 옵션에 따라 SSE-SQS 또는 SSE-KMS를 선택할 수 있다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;또한 IAM 정책으로 생산자/소비자 권한을 세밀하게 제어할 수 있어 접근 통제가 용이하다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;&amp;lt;단점&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메시지의 &lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;최대 크기가 256KB로 제한되어 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;- &lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;메시지의 보관 기한은 최대 14일로 제한이 있다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;- &lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;폴링 기반이라 비용/지연 튜닝이 필요하다.&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;- ReceiveMessage(롱폴링), 배치 사이즈/주기, Visibility Timeout을 잘못 잡으면 불필요한 비용이 증가하고, 지연이 생길 수 있다. 특히, Visibility Timeout을 너무 짧게 잡으면 처리 중인 메시지가 다시 나타나 중복 처리/재시도가 늘고, 너무 길게 잡으면 장애 시 복구가 늦어져 지연이 커질 수 있다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1923&quot; data-start=&quot;1865&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1923&quot; data-start=&quot;1865&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1923&quot; data-start=&quot;1865&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;그럼 언제 sqs가 잘 맞나?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이메일/알림/배치 작업/로그 처리/비동기 결제 후처리/크롤링 작업 등에 적합하다. 이 중에서 &lt;span style=&quot;color: #000000;&quot;&gt;우리 서비스에서는&lt;/span&gt; 알림톡을 구현하는 데에 sqs를 이용하기로 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;왜 알림톡에 sqs가 좋은가?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 알림톡은 &quot;요청-응답&quot; 흐름이 아니라 이벤트가 생긴 후에 전달되어도 되는 작업이고, 외부 알림 시스템이 불안정하더라도 우리 서비스에 문제가 생기는 경우가 적기 때문이다. 예시로 쉽게 설명하자면, 이메일 smtp나 카카오 알림톡 벤더 api 등에 문제가 있더라도, sqs와 외부 알림 시스템은 비동기적으로 처리되기 때문에 메시지는 안전하게 큐에 저장되어 있고, 컨슈머가 재시도하면서 외부 알림 시스템이 회복될 때 정상적으로 처리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;트래픽 스파이크&lt;/b&gt;를 흡수하기 좋다. &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;우리 서비스는 특정 시간에 알림이 몰릴 것으로 예상&lt;/b&gt;&lt;b&gt;되기때문에&lt;/b&gt;&lt;/span&gt; sqs의 이런 특징과 잘 맞다. 동기 구조에서는 피크 때 요청이 다 같이 몰려서 서버/DB/외부 API가 터지기 쉬운데, SQS는 일단 큐에 쌓아두고 컨슈머 수를 늘려서 처리량을 맞출 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 재시도/실패 분리(DLQ)가 알림이랑 잘 맞다. 알림 하나가 실패했다고 해서 전체 서비스를 실패로 만들 필요 없이 실패한 것들은 DLQ로 분리해 두고 추후에 원인 분석 및 재처리가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;이런 이유들로 우리 서비스에서는 특정 이벤트 발생 시에 고객들에게 해당 내용을 알림톡으로 발송해 주기 위한 모듈을 개발하는 데에 AWS SQS를 사용하기로 하였다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;sqs를 안 쓰면 뭘 쓸 수 있나? 그중에서 sqs를 선택한 이유?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- sqs를 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;대체할만한 방법&lt;/b&gt;&lt;/span&gt;으로는 DB Outbox 패턴, Amazon MQ, Redis 기반 큐&amp;nbsp;등이 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 중 대표적인 예시인 DB Outbox 패턴과 sqs를 비교해 보자면, DB Outbox 패턴은 인프라 추가 없이 DB만으로 &quot;큐/보관/재시도&quot;를 구현할 수 있지만, 이는 큐를 직접 운영하는 것과 같기 때문에 락/폴링/성능 설계를 직접 해야 한다는 단점이 있다. 따라서 우리 서비스에서는 구현 및 운영 비용을 절감할 수 있고 안정성이 높은 SQS를 선택하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;SMS가 아니라 알림톡을 선택한 이유 : 알림톡 / SMS 비용 차이&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;b&gt;※ 단가는 대행사, 월 발송량 구간, 부가세 포함 여부에 따라 달라질 수 있으며 아래는 일반적인 경향을 설명하기 위한 예시이다.&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대행사마다 다르지만 일반적으로 알림톡은 건당 약 7원 정도, SMS(단문)은 10원 이상이고, 긴 내용을 보내기 위해 LMS를 이용해야 한다면 건당 30원 이상 드는 경우가 많다. 따라서 우리 서비스에서는 SMS가 아니라 알림톡을 이용하면 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;비용 절감&lt;/b&gt;&lt;/span&gt;을 이룰 수 있다고 판단하여 AWS SQS를 이용한 알림톡 모듈을 개발하기로 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알림톡 모듈 (AWS SQS)</category>
      <category>Consumer</category>
      <category>dlq</category>
      <category>idempotency</category>
      <category>Producer</category>
      <category>SQS</category>
      <category>Visibility timeout</category>
      <category>멱등성</category>
      <category>비동기</category>
      <category>트래픽 스파이크</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/52</guid>
      <comments>https://curiousjung1997.tistory.com/52#entry52comment</comments>
      <pubDate>Mon, 12 Jan 2026 18:36:36 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 26주차 회고</title>
      <link>https://curiousjung1997.tistory.com/51</link>
      <description>&lt;p data-end=&quot;232&quot; data-start=&quot;83&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이번 주에는 JWT 기반 로그인/회원가입을 구현하기 위해 관련 개념을 학습하고 실제 적용을 준비하였다. JWT는 토큰 기반 인증 방식으로, 세션을 서버에서 관리하지 않아도 되기 때문에 확장성과 유지보수 측면에서 장점이 많았다.&lt;/p&gt;
&lt;p data-end=&quot;232&quot; data-start=&quot;83&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;444&quot; data-start=&quot;234&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 학습 과정에서 Access Token과 Refresh Token의 역할을 명확히 구분하는 것이 중요하다는 점을 알게 되었고, 특히 보안성을 높이기 위해 Refresh Token을 Redis에 저장하고 관리하는 방식을 적용하려고 했다. 이를 통해 토큰 만료 시점과 블랙리스트 처리, 강제 로그아웃 같은 시나리오를 더 유연하게 처리할 수 있다는 점을 이해할 수 있었다.&lt;/p&gt;
&lt;p data-end=&quot;444&quot; data-start=&quot;234&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;615&quot; data-start=&quot;446&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 또한 Redis를 단순 캐시로만 생각했었는데, 이번 학습을 통해 분산 환경에서의 세션 관리 대체재로 활용할 수 있다는 점이 인상 깊었다. JWT와 Redis를 결합하면 서버 확장이 용이하고, 중앙 집중적으로 토큰 상태를 관리할 수 있어 운영 환경에서도 안정성을 보장할 수 있다는 점을 배웠다.&lt;/p&gt;
&lt;p data-end=&quot;615&quot; data-start=&quot;446&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;834&quot; data-start=&quot;617&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이번 경험을 통해 단순한 로그인/회원가입 기능도 실제 서비스 환경에서는 보안, 확장성, 안정성을 모두 고려해야 함을 체감할 수 있었다. 특히 토큰 저장소로서 Redis를 활용하는 방식은 앞으로 다른 기능을 설계할 때도 큰 도움이 될 것 같다.&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/51</guid>
      <comments>https://curiousjung1997.tistory.com/51#entry51comment</comments>
      <pubDate>Mon, 22 Sep 2025 01:02:48 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 25주차 회고</title>
      <link>https://curiousjung1997.tistory.com/50</link>
      <description>&lt;p data-end=&quot;151&quot; data-start=&quot;38&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이번 주에는 파이널 프로젝트에서 공통 기능인 로깅과 예외 처리를 직접 구현해 보았다. 실제 서비스에 필수적인 기능이지만 처음으로 구조를 잡고 적용하다 보니 생각보다 신경 써야 할 부분이 많았다.&lt;/p&gt;
&lt;p data-end=&quot;151&quot; data-start=&quot;38&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;327&quot; data-start=&quot;153&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 로깅에서는 에러 상황뿐만 아니라 정상적인 흐름도 잘 기록될 수 있도록 로그 레벨을 분리하고, 운영 환경에서의 모니터링을 고려한 구조를 학습할 수 있었다. 예외 처리에서는 전역 예외 처리기를 통해 서비스 전반에서 일관된 응답을 제공하는 방법을 적용하면서, 에러 코드 관리와 응답 DTO 설계의 중요성을 느꼈다.&lt;/p&gt;
&lt;p data-end=&quot;327&quot; data-start=&quot;153&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;456&quot; data-start=&quot;329&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이번 작업을 통해 단순히 코드를 작성하는 것 이상의, 서비스의 안정성과 유지보수성에 직결되는 공통 기능이 얼마나 중요한지 체감할 수 있었다. 커스텀 예외 같은 것들은 처음 해보는 내용이라 생소해서 어렵긴 했지만 새로운 내용을 배울 수 있다는 점에서 의미 있었다. 앞으로도 새로운 것들을 계속 도전해보면서 경험을 쌓아 가야겠다.&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/50</guid>
      <comments>https://curiousjung1997.tistory.com/50#entry50comment</comments>
      <pubDate>Mon, 15 Sep 2025 11:09:48 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 24주차 회고</title>
      <link>https://curiousjung1997.tistory.com/49</link>
      <description>&lt;p data-end=&quot;283&quot; data-start=&quot;111&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이번 주에는 팀 프로젝트에서 처음으로 &lt;b&gt;CI/CD &lt;/b&gt;환경을 직접 구성해보았다. 처음 해보는 작업이라 생소한 개념도 많았고, 설정 과정에서 예상치 못한 오류도 자주 발생했지만, 그만큼 배우는 것도 많았다.&lt;/p&gt;
&lt;p data-end=&quot;283&quot; data-start=&quot;111&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;479&quot; data-start=&quot;285&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; CI/CD를 구성하는 과정에서 &lt;b&gt;GitHub Actions, Docker, AWS ECR, EC2, Nginx&lt;/b&gt; 등 다양한 기술 스택을 다뤄보았고, 코드를 작성하는 건 별로 없지만 과정을 이해해 보면서 알게 된 게 많은 것 같다.&lt;/p&gt;
&lt;p data-end=&quot;479&quot; data-start=&quot;285&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;665&quot; data-start=&quot;481&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 특히, &lt;b&gt;React, Spring Boot, FastAPI&lt;/b&gt;를 모두 포함한 멀티 모듈 환경을 배포하면서 서비스 간 연동 구조를 이해하는 데 많은 도움이 됐다. 처음에는 Nginx 설정 문제와 ECR 푸시 과정에서 어려움을 겪었지만, 로그를 보면서 원인을 분석하고 해결책을 찾는 과정을 통해 문제 해결 능력도 향상됐다.&lt;/p&gt;
&lt;p data-end=&quot;996&quot; data-start=&quot;836&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;996&quot; data-start=&quot;836&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이제 남은 기간 동안은 파이널 프로젝트에서 코드를 많이 써볼 수 있도록 열심히 해야겠다.&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/49</guid>
      <comments>https://curiousjung1997.tistory.com/49#entry49comment</comments>
      <pubDate>Mon, 8 Sep 2025 04:32:49 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 23주차 회고 - 블레이버스 해커톤 대상</title>
      <link>https://curiousjung1997.tistory.com/48</link>
      <description>&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;178&quot; data-end=&quot;314&quot;&gt;처음 참가한 해커톤에서 대상이라는 예상치 못한 결과를 받았다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;178&quot; data-end=&quot;314&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;178&quot; data-end=&quot;314&quot;&gt;사실 해커톤을 준비하면서도 부족한 점을 많이 느꼈고, 대회 도중에도 문제 해결 과정에서 어려움을 겪을 때가 많았다. 그래서 상을 받겠다는 생각은 못했었는데, 막상 대상을 받게 되니 놀랍고 감사하다는 생각을 했던 것 같다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;178&quot; data-end=&quot;314&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;178&quot; data-end=&quot;314&quot;&gt;이번 해커톤에서 배운 점이 많은데,&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;178&quot; data-end=&quot;314&quot;&gt;우선, 해커톤을 준비하고 진행하는 과정에서 단순한 개발 실력뿐만 아니라 팀워크와 문제 해결 능력의 중요성을 크게 체감했다. 짧은 시간 안에 아이디어를 구체화하고, 팀원들과 역할을 분담하며 빠르게 개발을 진행하는 과정에서 애자일 프로세스의 중요성에 대해서도 배울 수 있었다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;178&quot; data-end=&quot;314&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;178&quot; data-end=&quot;314&quot;&gt;우리팀에 PM이 없어서 얼떨결에 PM 역할 까지 맡게 됐는데, 이 과정에서 우선순위를 설정하고, 논의 사항에 대해 결정하는 능력이 얼마나 중요한지도 깨달을 수 있었고, 발표를 준비하면서 일주일간 진행했던 프로젝트에 대한 이해도도 높일 수 있어서 좋았다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;178&quot; data-end=&quot;314&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;178&quot; data-end=&quot;314&quot;&gt;처음에는 완성도 높은 결과물을 내는 것보다 배움과 다양한 경험에 초점을 두고 참가했다. &quot;상을 못 받아도 경험만으로 충분히 의미가 있다&amp;rdquo;라고 생각했는데, 큰 상을 받게 되어 더 의미가 있는 시간이었다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;178&quot; data-end=&quot;314&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;936&quot; data-start=&quot;838&quot; data-ke-size=&quot;size16&quot;&gt;이번 주부터 파이널 프로젝트가 시작됐는데, 해커톤에서의 경험을 밑거름 삼아, 파이널 프로젝트에서도&amp;nbsp;좋은 결과를 낼 수 있도록 열심히 해야겠다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hackathon_award.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6Si2c/dJMcagqEpMM/VSq1IyXp55LmdKKgQKSIL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6Si2c/dJMcagqEpMM/VSq1IyXp55LmdKKgQKSIL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6Si2c/dJMcagqEpMM/VSq1IyXp55LmdKKgQKSIL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6Si2c%2FdJMcagqEpMM%2FVSq1IyXp55LmdKKgQKSIL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;1339&quot; data-filename=&quot;hackathon_award.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1339&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>대상</category>
      <category>블레이버스 해커톤</category>
      <category>해커톤</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/48</guid>
      <comments>https://curiousjung1997.tistory.com/48#entry48comment</comments>
      <pubDate>Mon, 1 Sep 2025 02:29:37 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 22주차 회고</title>
      <link>https://curiousjung1997.tistory.com/47</link>
      <description>&lt;p data-end=&quot;314&quot; data-start=&quot;178&quot; data-ke-size=&quot;size16&quot;&gt;이번 주는 해커톤을 준비하고 진행하느라 정신없이 지나갔다.&lt;/p&gt;
&lt;p data-end=&quot;314&quot; data-start=&quot;178&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;짧은 시간 안에 MVP를 구현해야 해서 쉽지 않았지만, 그 과정에서 내가 부족한 점을 알 수 있었고, 앞으로 보완해야 할 점들을 정리할 수 있었다.&lt;/p&gt;
&lt;p data-end=&quot;314&quot; data-start=&quot;178&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;449&quot; data-start=&quot;316&quot; data-ke-size=&quot;size16&quot;&gt;이번 해커톤에서 다양한 직군과의 협업을 통해 개발 과정 전반에 대한 프로세스 이해도를 높일 수 있었던 것이 가장 큰 수확이었다. 디자이너, 기획자, 개발자 각자의 관점을 배울 수 있었고, 커뮤니케이션의 중요성을 확실하게 체감할 수 있었다.&lt;/p&gt;
&lt;p data-end=&quot;449&quot; data-start=&quot;316&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;596&quot; data-start=&quot;451&quot; data-ke-size=&quot;size16&quot;&gt;이번 해커톤을 통해 아직 많이 부족하다는 걸 깨달았지만, 동시에 새로운 기술을 빠르게 익히고 적용하는 능력을 키울 수 있었던 값진 시간이었다.&lt;/p&gt;
&lt;p data-end=&quot;596&quot; data-start=&quot;451&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이 경험을 바탕으로 앞으로 어떤 프로젝트를 진행하든 더 효율적이고 체계적으로 접근할 수 있을 것 같다.&lt;/p&gt;
&lt;p data-end=&quot;703&quot; data-start=&quot;598&quot; data-ke-size=&quot;size16&quot;&gt;해커톤이 끝나면 파이널 프로젝트를 본격적으로 시작하게 될 텐데, 이번 경험에서 배운 점을 최대한 활용해서, 더 큰 성장을 이루기 위해 열심히 해야겠다.&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/47</guid>
      <comments>https://curiousjung1997.tistory.com/47#entry47comment</comments>
      <pubDate>Mon, 25 Aug 2025 02:49:31 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 21주차 회고 - 2025 블레이버스 MVP 개발 해커톤 시즌2 참여</title>
      <link>https://curiousjung1997.tistory.com/46</link>
      <description>&lt;p data-end=&quot;150&quot; data-start=&quot;95&quot; data-ke-size=&quot;size16&quot;&gt;이번 주 수요일에는 블레이버스 해커톤 킥오프가 있었고, 이후 본격적으로 협업을 시작했다.&lt;/p&gt;
&lt;p data-end=&quot;150&quot; data-start=&quot;95&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;325&quot; data-start=&quot;152&quot; data-ke-size=&quot;size16&quot;&gt;해커톤 규칙에 따라 디자이너, PM, 개발자가 반드시 팀에 포함되어야 하는데, 우리 팀은 PM을 구하지 못한 상황이었다. 처음에는 경험이 많고 프론트 개발도 가능한 팀원이 PM을 맡아주면 좋겠다고 생각해 부탁드렸지만, 본인은 자신이 없다고 하셔서 결국 PM을 맡을 팀원이 없는 상태가 되었다.&lt;/p&gt;
&lt;p data-end=&quot;325&quot; data-start=&quot;152&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;474&quot; data-start=&quot;327&quot; data-ke-size=&quot;size16&quot;&gt;그때 팀장인 내가 PM을 맡아볼까 라는 생각도 했지만, 한편으로는 디자인이나 프론트에 대한 지식이 거의 없었기 때문에 부담스러운 자리였다. 하지만, 오히려 이번 기회를 통해 다른 직군들과 협업할 때 필요한 프로세스에 대한 이해도를 높일 수 있지 않을까 하는 생각이 들었고 결국 내가 PM을 맡기로 결정했다.&lt;/p&gt;
&lt;p data-end=&quot;474&quot; data-start=&quot;327&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;686&quot; data-start=&quot;476&quot; data-ke-size=&quot;size16&quot;&gt;협업이 시작된 후, 다른 팀원분들이 많이 도와주고 계시지만, 전반적인 기획, 일정 관리, 의사 결정은 내가 주도적으로 맡아 진행하게 되었다. 단순히 백엔드만 고려하는 것이 아니라 디자인과 프론트까지 종합적으로 조율해야 해서 쉽지는 않았다. 하지만 새로운 도전을 통해 배울 점이 많을 것이라는 생각에 동기부여가 되었다.&lt;/p&gt;
&lt;p data-end=&quot;686&quot; data-start=&quot;476&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;864&quot; data-start=&quot;688&quot; data-ke-size=&quot;size16&quot;&gt;아직은 부족한 점이 많지만, 이번 경험을 통해 개발 과정의 전체적인 프로세스에 대한 이해와 협업 능력을 크게 키울 수 있을 것 같다. 단순히 개발자의 시각에서만 머무르지 않고, 프로젝트 전체를 바라보는 경험을 할 수 있다는 점에서 의미가 크다고 생각한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;255&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BTHA0/dJMcaiosJKq/kVGiQhKtr4I6TLKR2kmms0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BTHA0/dJMcaiosJKq/kVGiQhKtr4I6TLKR2kmms0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BTHA0/dJMcaiosJKq/kVGiQhKtr4I6TLKR2kmms0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBTHA0%2FdJMcaiosJKq%2FkVGiQhKtr4I6TLKR2kmms0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;255&quot; height=&quot;356&quot; data-origin-width=&quot;255&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/46</guid>
      <comments>https://curiousjung1997.tistory.com/46#entry46comment</comments>
      <pubDate>Sun, 17 Aug 2025 19:55:36 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 20주차 회고</title>
      <link>https://curiousjung1997.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지난주에 토이프로젝트 4가 끝나고 첫 주를 보냈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 1주 뒤면 기업 연계 파이널 프로젝트가 시작된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이널 프로젝트를 시작하기 전까지 주어진 2주라는 시간을 어떻게 활용할지 고민해 봤는데, 자바 복습을 해야겠다는 생각이 들었다. 그래서 이번 주에는 자바 복습에 집중했고, 자바의 정석 4판 기준으로 7장까지 내용을 정리하고 복습을 완료했다. 이를 통해 자바의 기본 문법과 객체지향 개념을 다시 한번 점검할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 주부터는 학원 내에서는 수업이 진행될 예정이고, 학원 외부에서는 따로 해커톤을 진행할 예정이라서 자바 복습까지 병행하려면 일정이 상당히 빠듯할 것 같다. 주어진 시간을 밀도 있게 활용하여 세 가지 모두에서 성과를 낼 수 있도록 계획을 세우고 집중력을 높여야 할 것 같다. 이번 기간을 통해 한 단계 더 성장할 수 있도록 열심히 해야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/45</guid>
      <comments>https://curiousjung1997.tistory.com/45#entry45comment</comments>
      <pubDate>Mon, 11 Aug 2025 12:25:30 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 19주차 회고 - Langchain을 이용한 비트코인 정보 제공 챗봇 구현</title>
      <link>https://curiousjung1997.tistory.com/44</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;토이프로젝트4가 마무리되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;프로젝트 개요&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 프로젝트에서 우리 7팀은 SpringBoot, Langchain, RAG, PostgreSQL, Redis를 이용하여 암호화폐 정보를 제공하는 챗봇을 구현하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;주제 선정 배경 : 문제 인식&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리 팀에서 주제를 선정하기 위해 가장 먼저 생각했던 부분은 ChatGPT와 같은 범용 LLM 모델들의 한계점이 무엇인지였다. 이번 프로젝트에 주어진 기간이 3주였는데, 이 기간과 팀원들의 지식을 고려했을 때, ChatGPT보다 어느 한 부분이라도 강점을 보일 수 있다 성공이라고 생각했기 때문이다. 이 생각에 따라 우리 팀은 ChatGPT의 한계점이 무엇일까에 대해 분석하기 시작했고, ChatGPT는 과거의 데이터를 기반으로 사용자에게 답변을 하기 때문에 실시간성이 다소 부족하다는 점을 발견하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2689&quot; data-origin-height=&quot;1534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzpu3m/btsPExnM7b0/l8rgDrEK9VeqP2CBV4hGhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzpu3m/btsPExnM7b0/l8rgDrEK9VeqP2CBV4hGhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzpu3m/btsPExnM7b0/l8rgDrEK9VeqP2CBV4hGhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzpu3m%2FbtsPExnM7b0%2Fl8rgDrEK9VeqP2CBV4hGhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;471&quot; height=&quot;269&quot; data-origin-width=&quot;2689&quot; data-origin-height=&quot;1534&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 위 사진을 보면 ChatGPT 4o 모델은 유료 모델임에도 불구하고, 현재 시각(UTC) 기준, 8분 이상 뒤쳐진 정보를 바탕으로 사용자에게 답변을 해주고 있음을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이 결과에 따라 실시간성을 보완했을 때, 강점이 있을 만한 주제에 대해 생각해 보았고, 비트코인이라는 주제를 선정하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;주요 기능 소개 : 해결 방안&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ChatGPT에 대한 분석을 통해 알게 된 문제점인 실시간성을 개선하여 '비트코인'이라는 주제에 적용시킬 방법에 대해 우리 팀이 떠올린 방법은 Upbit에서 제공하는 비트코인의 실시간 가격 정보를 Websocket을 통해 실시간으로 받아오고, 해당 데이터를 Redis에 캐싱하여 사용자의 질문이 들어왔을 때, 해당 데이터를 바탕으로 답변을 해주는 것이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 위 정보를 바탕으로 사용자에게 답변을 해줄 때, 비트코인 현재 가격, 기본 차트, RSI, MACD와 같은 차트 등을 plotly 라이브러리를 통해 시각화하여 사용자에게 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 하지만, 이 기능 하나만으로는 RAG를 구성하기에 부족하다는 생각이 들었고, 추가 기능으로는 비트코인 관련 뉴스 기사를 바탕으로 사용자의 질문에 적합한 답변을 해주는 것을 생각하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;기능 구현&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 비트코인 관련 뉴스 기사 정보는 Newdata.io의 API를 통해 받아왔고, 이 데이터에 포함된 기사의 URL 정보로 Newspaper3k라는 라이브러리를 이용하여 크롤링을 진행하였다. Newsdata.io에서 기사 정보를 받아올 수 있는데도 Newspaper3k 라이브러리를 이용한 이유는 API를 통해 받아온 데이터에는 기사 본문의 일부만 포함되어 있었기 때문이다. 또한, newspaper3k 라이브러리는 beautifulsoup, selenium이 광고, 해시태그 등의 불필요한 정보까지 받아오는 것과 달리, HTML을 분석하여 기사의 본문 내용만 받아오기 때문에 해당 라이브러리를 사용하기로 결정하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 위 과정을 통해 수집한 뉴스 기사 데이터는 ada-002 모델을 통해 임베딩한 후 pgvector라는 벡터DB에 저장하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;시스템 동작 흐름&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 사용자가 챗봇에 질문을 하면, 사용자의 질문이 임베딩되고, 이 질문 벡터와 유사한 벡터값을 가지는 기사를 pgvector에서 찾는다. 이후 해당 기사의 내용과 DB, Redis에 저장된 코인 정보들을 바탕으로 사용자에게 답변을 해주는 방식으로 시스템을 구현하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;회고&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 프로젝트를 진행하면서 아직 배울 게 많다는 것을 느꼈다. 특히, RAG 구성에 대한 이해가 부족해 초기 설계 단계에서 많은 시행착오를 겪었고, 제한된 기간 때문에 검색 정확도 개선 등 아직 해결하지 못한 문제들을 남겨둔 채로 프로젝트를 마무리해야 했던 점이 아쉬웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 팀원들과 협업하여 실시간 데이터 수집, 캐싱, 임베딩 기반 검색 구조를 직접 구현해 보는 등 좋은 경험이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 프로젝트에서 가장 의미 있다고 생각하는 부분 중 하나는, 실제로 존재하는 문제점을 발견하고, 그 문제점을 해결하기 위한 방안에 대해 많은 생각을 해봤다는 점이다. 내 아이디어를 통해 세상에 존재하는 문제를 해결할 수 있다는 점이 개발자라는 직업의 가장 매력적인 부분이라고 생각한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로도 많이 배우고, 많이 생각하며, 세상의 문제들을 해결하는 개발자로 성장하고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/44</guid>
      <comments>https://curiousjung1997.tistory.com/44#entry44comment</comments>
      <pubDate>Sun, 3 Aug 2025 19:47:22 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 18주차 회고</title>
      <link>https://curiousjung1997.tistory.com/43</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;토이 프로젝트4 2주차가 끝났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적인 아이디어와 구현 방향, 사용 기술에 대한 설계는 구체화되었지만, 설계한 대로 실제로 구현하는 과정은 쉽지 않았다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 마감까지 약 일주일 정도 남은 상황에서, 현재 발생한 문제들을 해결하고 설계한 기능들을 구현하기 위해 시간을 효율적으로 활용해야겠다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 구상했던 모든 기능을 완벽하게 구현하지는 못하더라도, 과제 요구사항에서 제시된 기본 요건은 충족할 수 있도록 남은 기간 동안 팀원들과 함께 집중하여 마무리를 잘할 수 있도록 열심히 해봐야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/43</guid>
      <comments>https://curiousjung1997.tistory.com/43#entry43comment</comments>
      <pubDate>Sun, 27 Jul 2025 22:09:54 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 17주차 회고</title>
      <link>https://curiousjung1997.tistory.com/42</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;이번 주부터 토이프로젝트4가 시작 됐다.&lt;br&gt;&lt;br&gt;우리 팀에서는 저번 주까지 강의해주신 랭체인을 바탕으로 rag를 구성하여 비트코인과 관련된 질문에 답변, 요약을 해주고 차트를 띄워주는 챗봇을 만드는 것을 목표로 하고 있다.&lt;br&gt;&lt;br&gt;과거의 정보만을 바탕으로 답변을 해주는 chat gpt와 달리, 우리 팀의 챗봇에서는 Upbit에서 실시간 코인 정보를 받아오고, 크립토 뉴스에서 최근 기사를 받아와서, 실시간성이 있는 답변을 해준다는 것이다.&lt;br&gt;&lt;br&gt;아직 시작 단계이고, 생각한 기능들을 모두 구현할 수 있을지는 모르겠지만 목표를 최대한 달성할 수 있도록 열심히 해봐야겠다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/42</guid>
      <comments>https://curiousjung1997.tistory.com/42#entry42comment</comments>
      <pubDate>Sun, 20 Jul 2025 19:23:50 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 16주차 회고 - Langchain 학습</title>
      <link>https://curiousjung1997.tistory.com/41</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주에는 황후순 강사님께서 AI 기본 지식과 랭체인(LangChain)에 대해 강의를 해주셨다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;랭체인은 LLM(Large Language Model) 기반 애플리케이션을 쉽게 개발할 수 있도록 도와주는 오픈소스 프레임워크이다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;강사님이 공유해 주신 예제 코드를 바탕으로, 함수나 툴을 만들고 수정해 보면서 입력에 따라 출력이 어떻게 달라지는지 간단하게 실습을 해보았다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;&amp;lt;실습 사진&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2073&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r01Fy/btsPf3GSy57/72sd4JehdqqOo0ZNrSgur0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r01Fy/btsPf3GSy57/72sd4JehdqqOo0ZNrSgur0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r01Fy/btsPf3GSy57/72sd4JehdqqOo0ZNrSgur0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr01Fy%2FbtsPf3GSy57%2F72sd4JehdqqOo0ZNrSgur0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2073&quot; height=&quot;912&quot; data-origin-width=&quot;2073&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2035&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8OvZ9/btsPf0XDbLD/WK7Q0L2Uovb3Y8gNKN3qUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8OvZ9/btsPf0XDbLD/WK7Q0L2Uovb3Y8gNKN3qUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8OvZ9/btsPf0XDbLD/WK7Q0L2Uovb3Y8gNKN3qUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8OvZ9%2FbtsPf0XDbLD%2FWK7Q0L2Uovb3Y8gNKN3qUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2035&quot; height=&quot;334&quot; data-origin-width=&quot;2035&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2025&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4LO3O/btsPgftq4Si/KATXUT4YRPdPATxyxD4vk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4LO3O/btsPgftq4Si/KATXUT4YRPdPATxyxD4vk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4LO3O/btsPgftq4Si/KATXUT4YRPdPATxyxD4vk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4LO3O%2FbtsPgftq4Si%2FKATXUT4YRPdPATxyxD4vk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2025&quot; height=&quot;334&quot; data-origin-width=&quot;2025&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;재밌는 결과가 나왔다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;다음 주부터는 이 LangChain을 활용한 프로젝트를 본격적으로 진행하게 되는데, 아직은 AI나 랭체인에 대해 모르는 게 많아서 조금 걱정이 된다.&lt;br /&gt;하지만 실습과 강사님의 피드백을 통해 차근차근 배워가며 이해도를 높일 계획이다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;이번 프로젝트를 통해 AI 기반 애플리케이션 개발에 대한 감각을 익히고, 랭체인을 어떻게 실무에 적용할 수 있을지 구체적으로 탐색해보고 싶다.&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/41</guid>
      <comments>https://curiousjung1997.tistory.com/41#entry41comment</comments>
      <pubDate>Sat, 12 Jul 2025 21:10:57 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 15주차 회고</title>
      <link>https://curiousjung1997.tistory.com/40</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주에는 파이썬 기본 문법과 AI에 대한 기초적인 내용을 학습했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 파이썬을 사용해 본 적이 있어서 조금 익숙하긴 했지만, 기억이 나지 않거나 헷갈리는 내용이 많았고, 목요일에 봤던 시험에서도 쓰지 못한 문제가 꽤 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 주에는 본격적으로 AI 실습을 진행하게 될텐데, 실습을 진행하면서 파이썬이 나올 때마다 부족한 부분을 찾아서 채워가는 식으로 해야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 주는 해야할 일이 지금까지 중에 가장 많은 것 같다. 다 끝낼 수 있도록 집중해 보자 화이팅!&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/40</guid>
      <comments>https://curiousjung1997.tistory.com/40#entry40comment</comments>
      <pubDate>Sun, 6 Jul 2025 22:45:31 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 14주차 회고</title>
      <link>https://curiousjung1997.tistory.com/39</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;토이 프로젝트가 마무리 됐다.&lt;br&gt;&lt;br&gt;토이 프로젝트를 진행하면서 많은 것을 배웠다.&lt;br&gt;특히, 협업 시 팀원들과 소통하는 법, 의사 표현 및 의사 결정 방법에 대해 많이 배웠다.&lt;br&gt;&lt;br&gt;아쉬웠던 점은 피그마, 지라와 같은 협업 툴들을 적극적으로 활용해보지 못했다는 것이다. 또다른 아쉬운 점은 더 많은 연습과 경험을 해보지 못했다는 것이다.&lt;br&gt;&lt;br&gt;다음 프로젝트 진행 시에는 다양한 협업 툴들을 활용하여 효율적으로 협업을 진행할 수 있도록 미리 협업 툴들을 다뤄봐야겠다. 또, 다음 프로젝트 진행 시에는 내가 맡은 부분이 일찍 끝나더라도 다른 부분을 더 시도해보거나, 추가 기능, 개선 방향 등에 대해서도 고민해보는 시간을 가져봐야겠다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/39</guid>
      <comments>https://curiousjung1997.tistory.com/39#entry39comment</comments>
      <pubDate>Mon, 30 Jun 2025 15:31:01 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 13주차 회고 - 토이프로젝트2</title>
      <link>https://curiousjung1997.tistory.com/38</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;토이 프로젝트2 진행 후 팀 회고&amp;gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- github 이슈 관리&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LocHN/btsOM3zqmi5/pHDQAKRE3GhRrImP3m2PF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LocHN/btsOM3zqmi5/pHDQAKRE3GhRrImP3m2PF1/img.png&quot; data-alt=&quot;앞으로 진행해야 할 이슈들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LocHN/btsOM3zqmi5/pHDQAKRE3GhRrImP3m2PF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLocHN%2FbtsOM3zqmi5%2FpHDQAKRE3GhRrImP3m2PF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1312&quot; height=&quot;597&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;597&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앞으로 진행해야 할 이슈들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;918&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k9bV1/btsOLuyhUWB/QDTmVKrMNcR5oMRmIaX3T0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k9bV1/btsOLuyhUWB/QDTmVKrMNcR5oMRmIaX3T0/img.png&quot; data-alt=&quot;현재까지 완료한 이슈들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k9bV1/btsOLuyhUWB/QDTmVKrMNcR5oMRmIaX3T0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk9bV1%2FbtsOLuyhUWB%2FQDTmVKrMNcR5oMRmIaX3T0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1248&quot; height=&quot;918&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;918&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;현재까지 완료한 이슈들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Pull Requests&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mL2qU/btsOMaF46Dl/0T94UUiUkJ4HBUwr4ZtgVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mL2qU/btsOMaF46Dl/0T94UUiUkJ4HBUwr4ZtgVk/img.png&quot; data-alt=&quot;팀 PR 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mL2qU/btsOMaF46Dl/0T94UUiUkJ4HBUwr4ZtgVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmL2qU%2FbtsOMaF46Dl%2F0T94UUiUkJ4HBUwr4ZtgVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1308&quot; height=&quot;942&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;942&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;팀 PR 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- PR 예시&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;745&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oOfoL/btsOK8WzPkn/Jh0v7G9l1mbD0S0qIz9KP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oOfoL/btsOK8WzPkn/Jh0v7G9l1mbD0S0qIz9KP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oOfoL/btsOK8WzPkn/Jh0v7G9l1mbD0S0qIz9KP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoOfoL%2FbtsOK8WzPkn%2FJh0v7G9l1mbD0S0qIz9KP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;937&quot; height=&quot;745&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;745&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;889&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chgTV7/btsOMk2KwqF/okKPf3xxk5B50ra22adROk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chgTV7/btsOMk2KwqF/okKPf3xxk5B50ra22adROk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chgTV7/btsOMk2KwqF/okKPf3xxk5B50ra22adROk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchgTV7%2FbtsOMk2KwqF%2FokKPf3xxk5B50ra22adROk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;889&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;889&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- github 프로젝트 관리&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1905&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgC8p2/btsOKATDPH1/lTtyBBRq8CIYjMG49pxobK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgC8p2/btsOKATDPH1/lTtyBBRq8CIYjMG49pxobK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgC8p2/btsOKATDPH1/lTtyBBRq8CIYjMG49pxobK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgC8p2%2FbtsOKATDPH1%2FlTtyBBRq8CIYjMG49pxobK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1905&quot; height=&quot;868&quot; data-origin-width=&quot;1905&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 팀 회고 표&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1341&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uyLXI/btsOKI5api4/7mePzWudFRWe0k4ClKPPBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uyLXI/btsOKI5api4/7mePzWudFRWe0k4ClKPPBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uyLXI/btsOKI5api4/7mePzWudFRWe0k4ClKPPBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuyLXI%2FbtsOKI5api4%2F7mePzWudFRWe0k4ClKPPBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1341&quot; height=&quot;784&quot; data-origin-width=&quot;1341&quot; data-origin-height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;토이 프로젝트2 진행 후 개인 회고&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 구현 내용 정리&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;687&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sfNo7/btsOMcxigZn/PwLYP81wsJ59LkScQPT150/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sfNo7/btsOMcxigZn/PwLYP81wsJ59LkScQPT150/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sfNo7/btsOMcxigZn/PwLYP81wsJ59LkScQPT150/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsfNo7%2FbtsOMcxigZn%2FPwLYP81wsJ59LkScQPT150%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1116&quot; height=&quot;687&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;687&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;1246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bfwqx/btsOLevXELr/AUIKTMxPe1o66RS65fzAF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bfwqx/btsOLevXELr/AUIKTMxPe1o66RS65fzAF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bfwqx/btsOLevXELr/AUIKTMxPe1o66RS65fzAF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBfwqx%2FbtsOLevXELr%2FAUIKTMxPe1o66RS65fzAF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1188&quot; height=&quot;1246&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;1246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;1258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNXmyw/btsOLeo9hmq/tbk71kBfkpsrKtYmm0vfT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNXmyw/btsOLeo9hmq/tbk71kBfkpsrKtYmm0vfT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNXmyw/btsOLeo9hmq/tbk71kBfkpsrKtYmm0vfT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNXmyw%2FbtsOLeo9hmq%2Ftbk71kBfkpsrKtYmm0vfT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1150&quot; height=&quot;1258&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;1258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;915&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UwbXb/btsOLE8UTWR/h2mcwfQgruB5yMG9LA2wf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UwbXb/btsOLE8UTWR/h2mcwfQgruB5yMG9LA2wf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UwbXb/btsOLE8UTWR/h2mcwfQgruB5yMG9LA2wf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUwbXb%2FbtsOLE8UTWR%2Fh2mcwfQgruB5yMG9LA2wf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1171&quot; height=&quot;915&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;915&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmgLy5/btsOLxoqqLd/FAxSr4hbHLQ3FlX2gkNBvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmgLy5/btsOLxoqqLd/FAxSr4hbHLQ3FlX2gkNBvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmgLy5/btsOLxoqqLd/FAxSr4hbHLQ3FlX2gkNBvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmgLy5%2FbtsOLxoqqLd%2FFAxSr4hbHLQ3FlX2gkNBvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1327&quot; height=&quot;862&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;862&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;973&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HMAFf/btsOLoZhIkF/jBaSin9QMtG0i4ITosU5yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HMAFf/btsOLoZhIkF/jBaSin9QMtG0i4ITosU5yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HMAFf/btsOLoZhIkF/jBaSin9QMtG0i4ITosU5yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHMAFf%2FbtsOLoZhIkF%2FjBaSin9QMtG0i4ITosU5yk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1192&quot; height=&quot;973&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;973&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bssVmy/btsOMRMTGUa/cwTMh9SFVQKNoPKbuxxuaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bssVmy/btsOMRMTGUa/cwTMh9SFVQKNoPKbuxxuaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bssVmy/btsOMRMTGUa/cwTMh9SFVQKNoPKbuxxuaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbssVmy%2FbtsOMRMTGUa%2FcwTMh9SFVQKNoPKbuxxuaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1132&quot; height=&quot;597&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;597&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;1093&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KlIFi/btsONd911Om/vXmBzmc36Lmq5pP82PJkk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KlIFi/btsONd911Om/vXmBzmc36Lmq5pP82PJkk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KlIFi/btsONd911Om/vXmBzmc36Lmq5pP82PJkk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKlIFi%2FbtsONd911Om%2FvXmBzmc36Lmq5pP82PJkk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1159&quot; height=&quot;1093&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;1093&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1137&quot; data-origin-height=&quot;1258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nyLeS/btsOL8n6eyW/MQR2kLMP8bFQ9stFDRYFoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nyLeS/btsOL8n6eyW/MQR2kLMP8bFQ9stFDRYFoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nyLeS/btsOL8n6eyW/MQR2kLMP8bFQ9stFDRYFoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnyLeS%2FbtsOL8n6eyW%2FMQR2kLMP8bFQ9stFDRYFoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1137&quot; height=&quot;1258&quot; data-origin-width=&quot;1137&quot; data-origin-height=&quot;1258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;1063&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkOZJW/btsOLwbXPqC/4zOT13zsYKVswEVGu8XR61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkOZJW/btsOLwbXPqC/4zOT13zsYKVswEVGu8XR61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkOZJW/btsOLwbXPqC/4zOT13zsYKVswEVGu8XR61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkOZJW%2FbtsOLwbXPqC%2F4zOT13zsYKVswEVGu8XR61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1204&quot; height=&quot;1063&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;1063&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1165&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVq6Tj/btsOLebCPQX/5ni32xVE7uKoKaQdxj2z30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVq6Tj/btsOLebCPQX/5ni32xVE7uKoKaQdxj2z30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVq6Tj/btsOLebCPQX/5ni32xVE7uKoKaQdxj2z30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVq6Tj%2FbtsOLebCPQX%2F5ni32xVE7uKoKaQdxj2z30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1165&quot; height=&quot;844&quot; data-origin-width=&quot;1165&quot; data-origin-height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;898&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CGOES/btsOMkhx92h/tZjVIOskigPe2DIdDSDSkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CGOES/btsOMkhx92h/tZjVIOskigPe2DIdDSDSkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CGOES/btsOMkhx92h/tZjVIOskigPe2DIdDSDSkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCGOES%2FbtsOMkhx92h%2FtZjVIOskigPe2DIdDSDSkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1153&quot; height=&quot;898&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;898&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;1230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q3xOb/btsOKE9uFAm/ne9dRdVUzIJ89e5aiKoyIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q3xOb/btsOKE9uFAm/ne9dRdVUzIJ89e5aiKoyIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q3xOb/btsOKE9uFAm/ne9dRdVUzIJ89e5aiKoyIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq3xOb%2FbtsOKE9uFAm%2Fne9dRdVUzIJ89e5aiKoyIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1156&quot; height=&quot;1230&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;1230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;967&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdrEJZ/btsONaS0mIj/RQgRycVKAkdVNjnS5gfZh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdrEJZ/btsONaS0mIj/RQgRycVKAkdVNjnS5gfZh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdrEJZ/btsONaS0mIj/RQgRycVKAkdVNjnS5gfZh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdrEJZ%2FbtsONaS0mIj%2FRQgRycVKAkdVNjnS5gfZh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1147&quot; height=&quot;967&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;967&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;1251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GDOOj/btsOMU3XiRB/Zf7IWGx1EFwGZkYEekYQCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GDOOj/btsOMU3XiRB/Zf7IWGx1EFwGZkYEekYQCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GDOOj/btsOMU3XiRB/Zf7IWGx1EFwGZkYEekYQCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGDOOj%2FbtsOMU3XiRB%2FZf7IWGx1EFwGZkYEekYQCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1164&quot; height=&quot;1251&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;1251&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;1330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvFPaL/btsOM4rJ5oR/3TKZ71YRttztGE4F4WDbgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvFPaL/btsOM4rJ5oR/3TKZ71YRttztGE4F4WDbgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvFPaL/btsOM4rJ5oR/3TKZ71YRttztGE4F4WDbgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvFPaL%2FbtsOM4rJ5oR%2F3TKZ71YRttztGE4F4WDbgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1150&quot; height=&quot;1330&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;1330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;931&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqE4Gq/btsOKIYqCb6/k9JfKeymyX48wStxVWE8m0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqE4Gq/btsOKIYqCb6/k9JfKeymyX48wStxVWE8m0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqE4Gq/btsOKIYqCb6/k9JfKeymyX48wStxVWE8m0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqE4Gq%2FbtsOKIYqCb6%2Fk9JfKeymyX48wStxVWE8m0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1162&quot; height=&quot;931&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;931&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RSTr7/btsOK7wLBwu/MmcOrg6THEp61Hx3oOcuH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RSTr7/btsOK7wLBwu/MmcOrg6THEp61Hx3oOcuH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RSTr7/btsOK7wLBwu/MmcOrg6THEp61Hx3oOcuH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRSTr7%2FbtsOK7wLBwu%2FMmcOrg6THEp61Hx3oOcuH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1171&quot; height=&quot;486&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deLMTf/btsOLvjPFBL/MZGvHJQMEIMOx2uWgwCuV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deLMTf/btsOLvjPFBL/MZGvHJQMEIMOx2uWgwCuV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deLMTf/btsOLvjPFBL/MZGvHJQMEIMOx2uWgwCuV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeLMTf%2FbtsOLvjPFBL%2FMZGvHJQMEIMOx2uWgwCuV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1159&quot; height=&quot;640&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Keep&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 적극적으로 의견 제시하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 효율적인 스케줄 관리&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 구체적인 역할 분배 및 본인이 맡은 도메인에 대해 책임 다하기&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Problem&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 구현한 기능들에 대해 이해가 덜 된 부분이 있음&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- git, vim 사용에 익숙하지 않음&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 협업 시 발생 가능한 이슈들(머지 시 충돌, 코드 스타일 불일치, 패키지 충돌 등)에 대해 익숙하지 않음&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Try&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 보충 학습을 통해 이해도 높이기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 브랜치, 명령어 등에서 실수가 난 경우 노션에 정리해 두기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 프로젝트를 진행하면서 발생했던 이슈들과 해결 방법들을 기록해 두기&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/38</guid>
      <comments>https://curiousjung1997.tistory.com/38#entry38comment</comments>
      <pubDate>Sun, 22 Jun 2025 20:05:29 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 12주차 회고 - 토이 프로젝트1 : 쇼핑몰 ERD 설계</title>
      <link>https://curiousjung1997.tistory.com/37</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;토이 프로젝트1 진행 후 팀 회고&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;토이 프로젝트1, 9팀 ERD&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1864&quot; data-origin-height=&quot;1288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mgUOC/btsOBgz79o4/9eE8kEL6nan8hbQYRC7ts1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mgUOC/btsOBgz79o4/9eE8kEL6nan8hbQYRC7ts1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mgUOC/btsOBgz79o4/9eE8kEL6nan8hbQYRC7ts1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmgUOC%2FbtsOBgz79o4%2F9eE8kEL6nan8hbQYRC7ts1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1864&quot; height=&quot;1288&quot; data-origin-width=&quot;1864&quot; data-origin-height=&quot;1288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;팀 회고 내용&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;852&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVxy7r/btsOMUbAwod/plMDJEJGku4Q0LxPEV80OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVxy7r/btsOMUbAwod/plMDJEJGku4Q0LxPEV80OK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVxy7r/btsOMUbAwod/plMDJEJGku4Q0LxPEV80OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVxy7r%2FbtsOMUbAwod%2FplMDJEJGku4Q0LxPEV80OK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;852&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;852&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;토이 프로젝트1 진행 후 개인 회고&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Keep&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 적극적으로 의견 제시하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 효율적인 스케줄 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 구체적인 역할 분배 및 본인이 맡은 도메인에 대해 책임 다하기&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Problem&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단호한 말투로 말하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 업무 우선 순위 기준 불명확&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일별 시간 분배에서의 아쉬움&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Try&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 부드러운 말투로 말하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 업무 우선 순위 구체적으로 정하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 제출 기한에 대한 여유를 가질 수 있도록 미리 더 해두기&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/37</guid>
      <comments>https://curiousjung1997.tistory.com/37#entry37comment</comments>
      <pubDate>Sun, 15 Jun 2025 18:11:44 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 11주차 회고 - ERD 스터디</title>
      <link>https://curiousjung1997.tistory.com/36</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이번 주는 스프링 부트를 공부하고, 프로젝트의 방향성과 시도해 볼 기술들에 대해 많은 생각을 했던 한 주였다. 게다가 이번 주에는 그룹 스터디로 진행하고 있었던 쇼핑몰 ERD 설계도 거의 완성했다. ERD 스터디를 진행하면서 어려운 것들이 많았지만 서로 도와가며 열심히 해 준 덕분에 ERD 설계에 대해 많이 배웠고, 기대 이상의 결과도 나온 것 같다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;우리 그룹 스터디의 쇼핑몰 ERD&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2365&quot; data-origin-height=&quot;1120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rnl42/btsOryn8EBy/hVbMm19qZ2pOcZevdrgE7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rnl42/btsOryn8EBy/hVbMm19qZ2pOcZevdrgE7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rnl42/btsOryn8EBy/hVbMm19qZ2pOcZevdrgE7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRnl42%2FbtsOryn8EBy%2FhVbMm19qZ2pOcZevdrgE7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2365&quot; height=&quot;1120&quot; data-origin-width=&quot;2365&quot; data-origin-height=&quot;1120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;목요일에는 앞으로 3주간 토이 프로젝트를 함께할 팀원들이 정해졌다. 대부분 처음 뵙는 분들이었지만, 실무에서도 익숙한 환경이 아닌 상황에서 협업하는 경우가 많을 것이기에 오히려 좋다고 생각했다. 정해진 팀원 분들과 모여서 이야기를 나눠보니 다들 성실하고 실력도 있으신 것 같아서 같이 열심히 하면 좋은 결과를 낼 수 있겠다는 생각이 들었다. 나도 열심히 참여해서 팀원들에게 도움이 되고 자극이 되는 사람이 되어야겠다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp; 교육을 다니면서 배운 것들을 바탕으로 실제로 뭔가를 만들어 보고 싶다는 생각을 항상 하고 있었는데, 드디어 월요일이 오면 진짜 시작이다. 아직 지식적으로도 부족하고 경험이 적어서 걱정도 되지만 팀원들과 서로 도와가며 열심히 한다면 많이 성장할 수 있을 것이라 생각한다. 처음부터 너무 많은 것을 하려고 하기보다는 하나하나 정확하고 깊게 이해하고 배우는 것이 이번 프로젝트에서의 가장 큰 목표이다.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/36</guid>
      <comments>https://curiousjung1997.tistory.com/36#entry36comment</comments>
      <pubDate>Sat, 7 Jun 2025 18:29:08 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 10주차 회고</title>
      <link>https://curiousjung1997.tistory.com/35</link>
      <description>&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이번 주부터는 스프링을 본격적으로 배우기 시작했다. 예전에 스프링부트를 사용해 본 적은 있지만, 제대로 된 이해 없이 기능 구현에만 집중했었기 때문에 머릿속에 남아있는 게 별로 없었다. 이번에 수업을 들으면서 처음 접하는 개념들도 있었고, 이전에는 알았던 개념들도 새롭게 느껴지는 것들이 많았다. 그래도 수업을 듣다 보면 중요했던 개념들이나, 관련된 개념들이 조금씩 떠올라서 검색도 해보고 GPT에게 물어보는 식으로 학습을 진행하고 있다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 6월 9일부터는 토이 프로젝트를 시작하게 되어 기대가 되지만, 이번에 스프링을 공부하면서 부족한 점이 많이 보여서 걱정도 된다. 특히, 아직 자바가 부족하다는 생각이 들었다. 자바 복습을 일주일 만에 끝낼 수는 없기때문에 다음 주에는 자바의 핵심 개념과 이전에 공부하면서 어려웠던 개념들만이라도 다시 보는 것을 목표로 해야겠다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이번 프로젝트에서는 이전처럼 기능 구현에만 급급하지 않고, 내부 동작 원리와 구조를 제대로 이해해보고 싶다. 단순히 작동하도록 만드는 것에 그치는 것이 아니라, 왜 이렇게 동작하는지, 이 방식이 어떤 장단점을 가지는지, 어떤 방식이 더 효율적 일지와 같은 고민들을 하며 진행하고 싶다. 이를 통해 나중에 문제가 발생했을 때 스스로 원인을 분석하고 개선 방향을 제시할 수 있는 실력을 키우는 것이 가장 큰 목표이다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[이번 주에 공부한 것]&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJMRnH/btsOlgOgVm1/mai9sFtA1ypjikNmGlqtU0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJMRnH/btsOlgOgVm1/mai9sFtA1ypjikNmGlqtU0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJMRnH/btsOlgOgVm1/mai9sFtA1ypjikNmGlqtU0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJMRnH%2FbtsOlgOgVm1%2Fmai9sFtA1ypjikNmGlqtU0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;657&quot; height=&quot;876&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wqdJq/btsOmqvAe5C/Gx6RZwKc5cKD3mWPcyqkk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wqdJq/btsOmqvAe5C/Gx6RZwKc5cKD3mWPcyqkk0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wqdJq/btsOmqvAe5C/Gx6RZwKc5cKD3mWPcyqkk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwqdJq%2FbtsOmqvAe5C%2FGx6RZwKc5cKD3mWPcyqkk0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;685&quot; height=&quot;913&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0GBdc/btsOlgtXQVu/DMsrLfZwQx3yqX881d9AK1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0GBdc/btsOlgtXQVu/DMsrLfZwQx3yqX881d9AK1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0GBdc/btsOlgtXQVu/DMsrLfZwQx3yqX881d9AK1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0GBdc%2FbtsOlgtXQVu%2FDMsrLfZwQx3yqX881d9AK1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;693&quot; height=&quot;924&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wh523/btsOlPvQ4EP/FzVwyikCKIgi3Fh5hYZDo0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wh523/btsOlPvQ4EP/FzVwyikCKIgi3Fh5hYZDo0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wh523/btsOlPvQ4EP/FzVwyikCKIgi3Fh5hYZDo0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWh523%2FbtsOlPvQ4EP%2FFzVwyikCKIgi3Fh5hYZDo0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;713&quot; height=&quot;951&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMQxA0/btsOmtshQ5e/kG1Vlkk7lEjTFBVWtNlKG1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMQxA0/btsOmtshQ5e/kG1Vlkk7lEjTFBVWtNlKG1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMQxA0/btsOmtshQ5e/kG1Vlkk7lEjTFBVWtNlKG1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMQxA0%2FbtsOmtshQ5e%2FkG1Vlkk7lEjTFBVWtNlKG1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;728&quot; height=&quot;971&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pU8hd/btsOnaFNLp9/2IfaU6cD9O7kuV1RJwq2XK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pU8hd/btsOnaFNLp9/2IfaU6cD9O7kuV1RJwq2XK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pU8hd/btsOnaFNLp9/2IfaU6cD9O7kuV1RJwq2XK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpU8hd%2FbtsOnaFNLp9%2F2IfaU6cD9O7kuV1RJwq2XK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;716&quot; height=&quot;955&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N9ILz/btsOmsz7F2N/JgUMAhdbExczEFMprhdcv0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N9ILz/btsOmsz7F2N/JgUMAhdbExczEFMprhdcv0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N9ILz/btsOmsz7F2N/JgUMAhdbExczEFMprhdcv0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN9ILz%2FbtsOmsz7F2N%2FJgUMAhdbExczEFMprhdcv0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;712&quot; height=&quot;949&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KW46D/btsOmVoytdx/YjPqsAoRcu0uW8XuSMwPn0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KW46D/btsOmVoytdx/YjPqsAoRcu0uW8XuSMwPn0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KW46D/btsOmVoytdx/YjPqsAoRcu0uW8XuSMwPn0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKW46D%2FbtsOmVoytdx%2FYjPqsAoRcu0uW8XuSMwPn0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;715&quot; height=&quot;953&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbPrIX/btsOl8u9KjF/2rAHJ3UuUJG3XaK1uwod11/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbPrIX/btsOl8u9KjF/2rAHJ3UuUJG3XaK1uwod11/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbPrIX/btsOl8u9KjF/2rAHJ3UuUJG3XaK1uwod11/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbPrIX%2FbtsOl8u9KjF%2F2rAHJ3UuUJG3XaK1uwod11%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;734&quot; height=&quot;979&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvpTMX/btsOmwWPuhh/0mdpsWyrAMjFydIUgffisk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvpTMX/btsOmwWPuhh/0mdpsWyrAMjFydIUgffisk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvpTMX/btsOmwWPuhh/0mdpsWyrAMjFydIUgffisk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvpTMX%2FbtsOmwWPuhh%2F0mdpsWyrAMjFydIUgffisk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;751&quot; height=&quot;1001&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pKddn/btsOl04ZAjT/RK9WRxk59QKAqRAa5fOql0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pKddn/btsOl04ZAjT/RK9WRxk59QKAqRAa5fOql0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pKddn/btsOl04ZAjT/RK9WRxk59QKAqRAa5fOql0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpKddn%2FbtsOl04ZAjT%2FRK9WRxk59QKAqRAa5fOql0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;1000&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OHp7h/btsOkNFLa5r/x2Vob6j8kdjPzGi8Dk2A6k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OHp7h/btsOkNFLa5r/x2Vob6j8kdjPzGi8Dk2A6k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OHp7h/btsOkNFLa5r/x2Vob6j8kdjPzGi8Dk2A6k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOHp7h%2FbtsOkNFLa5r%2Fx2Vob6j8kdjPzGi8Dk2A6k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;732&quot; height=&quot;976&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgDCzQ/btsOlcLP3qe/MJGzhX2KlxpQyvkrXUwdCK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgDCzQ/btsOlcLP3qe/MJGzhX2KlxpQyvkrXUwdCK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgDCzQ/btsOlcLP3qe/MJGzhX2KlxpQyvkrXUwdCK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgDCzQ%2FbtsOlcLP3qe%2FMJGzhX2KlxpQyvkrXUwdCK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;745&quot; height=&quot;993&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NzHpy/btsOldRvk8m/krrW99NHQsT3BkUhQ5YBr1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NzHpy/btsOldRvk8m/krrW99NHQsT3BkUhQ5YBr1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NzHpy/btsOldRvk8m/krrW99NHQsT3BkUhQ5YBr1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNzHpy%2FbtsOldRvk8m%2FkrrW99NHQsT3BkUhQ5YBr1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;759&quot; height=&quot;1012&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[다음 주 목표]&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 자바 핵심 개념 및 어려웠던 개념들 복습&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 스프링(부트) 주요 개념 및 큰 틀을 이해할 수 있도록 학습&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 프로젝트 진행 시 뭘 해보고 싶은지 미리 생각해두기&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/35</guid>
      <comments>https://curiousjung1997.tistory.com/35#entry35comment</comments>
      <pubDate>Sun, 1 Jun 2025 18:53:33 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 9주차 회고</title>
      <link>https://curiousjung1997.tistory.com/34</link>
      <description>&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[저번 주 회고 때 작성한 이번 주 목표 및 달성 여부]&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;- 평일 4일 이상 남아서 공부하기&lt;/s&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 블로그 꾸준히 작성하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;- 주말에 나와서 공부하기&lt;/s&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 매일 12시 취침&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 꾸준히 운동하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이번 주는 계획대로 해낸 것도 있지만, 예상치 못한 변수가 생기면서 완전히 만족스러운 한 주는 아니었다. 특히, 손목 부상을 당하면서 매일 하던 운동 루틴을 갑작스럽게 중단하게 된 것이 가장 아쉬운 부분이었다. 운동은 내 일상의 활력소 같은 존재였기에 하루가 조금 허전하게 느껴졌다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 하지만, '어쩔 수 없다면 그 시간을 더 의미 있게 쓰자'는 생각이 들었다. 이왕 이렇게 된 김에 다음 주에 있을 진로 상담에 대한 준비도 좀 하고, 그동안 밀려 있던 할 일들도 조금씩 따라잡고, 6월 초에 시작될 프로젝트에 대한 준비도 미리 해둬야겠다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이번 주에는 스프링을 배우기 시작했다. 생각보다 어려웠다. 예전에 스프링 부트를 사용해본 적이 있어서 기억이 나는 부분도 조금 있긴 했지만 아직 갈 길이 멀고, 더 열심히 해야겠다는 생각이 들었다. 다음 주에는 원래 운동을 하던 시간을 공부 시간으로 바꾸고 집중력 더 끌어올려야겠다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[다음 주 목표]&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 평일 4일 이상 남아서 공부하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 블로그 꾸준히 작성하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 주말에 나와서 공부하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 매일 12시 취침&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/34</guid>
      <comments>https://curiousjung1997.tistory.com/34#entry34comment</comments>
      <pubDate>Sat, 24 May 2025 16:30:27 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 8주차 회고 - 내 페이스대로 살기</title>
      <link>https://curiousjung1997.tistory.com/33</link>
      <description>&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[저번 주 회고 때 작성한 이번 주 목표 및 달성 여부]&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;- 평일 4일 이상 남아서 공부하기&lt;/s&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 블로그 꾸준히 작성하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;- 주말에 나와서 공부하기&lt;/s&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 플래너 작성&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 매일 12시 취침&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 매일 아침 일찍 운동하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이번 주부터는 플랜을 바꿨다. 저번주까지는 매일 아침 등원 전에 운동을 하려고 했었는데, 시도해 보니 운동을 못 하는 날이 많아져서 마치고 운동을 하는 게 맞다고 생각했다. 마침 학원과 같은 건물에 짐박스가 생겨서 당분간 여기서 운동을 하기로 결정했다. 운동을 마치고는 다시 학원으로 와서 10시까지 부족한 공부를 보충하고 일과를 마쳤다. 이 루틴으로 바꾸고 나서 공부 시간은 조금 줄었지만 매일 활력이 생겨서 공부를 할 때 집중이 더 잘 됐던 것 같다. 다음 주에도 해야 할 일이 많으니까 이번 주보다 조금만 더 열심히 해보자!&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;뭘 하든, 다른 사람들이 뭐가 좋다고 하든 나한테 맞는 방식을 찾는 것이 가장 좋은 것 같다. &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[다음 주 목표]&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 평일 4일 이상 남아서 공부하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 블로그 꾸준히 작성하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 주말에 나와서 공부하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 매일 12시 취침&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 꾸준히 운동하기&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/33</guid>
      <comments>https://curiousjung1997.tistory.com/33#entry33comment</comments>
      <pubDate>Sun, 18 May 2025 17:47:51 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 7주차 회고 - 매일 1%씩 발전하는 사람 되기</title>
      <link>https://curiousjung1997.tistory.com/32</link>
      <description>&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[저번 주 회고 때 작성한 이번 주 목표 및 달성 여부]&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 평일 4일 이상 남아서 공부하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 블로그 꾸준히 작성하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;- 주말에도 하루 이상 나와서 공부하기&lt;/s&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 플래너 작성&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 매일 12시 취침&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 매일 아침 일찍 일어나서 운동하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이번 주는 연휴가 포함되어 있어서 첫 번째 목표는 지키지 못했고, 블로그도 쓰지 못했다. 학원에 나오기 전날에는 피로가 쌓여서 그런지 딱 12시는 아니더라도 평소보다는 일찍 잠에 들었다. 하지만 플래너를 쓰지 못했고 아침 운동도 빠진 날이 많았다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 매주 회고를 쓰고 &quot;다음주는 더 잘해야지&quot;라고 마음을 먹어도, 바로 실천하기가 쉽지는 않은 것 같다. '&quot;사람은 쉽게 바뀌지 않는다.'&quot;라는 말이 떠올랐다. 매일 아침 일찍 나오시고 주말에도 빠짐없이 나오시는 분들이 새삼 대단해 보인다. 그렇다고 해서 '나는 원래 잠이 많으니까'라고 나를 한정 짓고 싶지는 않다. 습관을 하루아침에 고치기는 쉽지 않겠지만 나의 나쁜 습관을 인지하고 있는 한 적어도 노력은 해보는 게 맞다고 생각한다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;완벽한 사람이 될 순 없겠지만 매일, 매주 조금씩이라도 내 단점들을 개선하며 발전하는 사람이 되기 위해 노력해야겠다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[다음 주 목표]&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 평일 4일 이상 남아서 공부하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 블로그 꾸준히 작성하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 주말에 나와서 공부하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 플래너 작성&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 매일 12시 취침&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 매일 아침 일찍 운동하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;목표를 전부 지키진 못하더라도 이번 주보다는 나은 사람이 되자.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;reaction-31&quot; data-tistory-react-app=&quot;Reaction&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/32</guid>
      <comments>https://curiousjung1997.tistory.com/32#entry32comment</comments>
      <pubDate>Sat, 10 May 2025 16:14:53 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 6주차 회고 - 하고 싶은 것보다 해야 하는 것이 먼저</title>
      <link>https://curiousjung1997.tistory.com/31</link>
      <description>&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[저번 주 회고 때 작성한 이번 주 목표 및 달성 여부]&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;- 평일 4일 이상 남아서 공부하기&lt;/s&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;- 블로그 꾸준히 작성하기&lt;/s&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 주말에도 하루 이상 나와서 공부하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;- 플래너 작성&lt;/s&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;- 매일 12시 전에 잠들기&amp;nbsp;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;- 매일 아침 일찍 일어나서 운동하기&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 주를 한 문장으로 정리하면,&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;좋게 말하면 &quot;놀 땐 놀고 할 땐 하자&quot;였지만 객관적으로 보면 만족스러운 한 주는 아니었다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;딴짓, 잡생각을 평소보다 많이 했던 것 같다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[이번 주 문제점]&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;딴짓, 잡생각을 평소보다 많이 했다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;플래너를 써보고 이번 주를 돌아보며 낭비한 시간을 생각해 보니 평소보다 조금 더 많았던 것 같다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;매일 갇혀서 공부만 하다 보면 쉬고 싶기도 하고 놀고 싶기도 한 건 당연한 것이겠지만, 지금은 조금 자제할 필요가 있다는 생각이 들었다. 저절로 드는 생각까지 제어할 수는 없지만, 그 생각이 항상 행동으로 가는 건 내 잘못이다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;매일 루틴을 지키지 못하고 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;2주 전 회고에서 공부, 운동을 다 잡겠다고 자신 있게 썼던 것과 달리, 계획했던 기상 시간도 못 지킬 때가 많았다. 다음 주에는 매일 루틴 지키기에 더 신경을 써서 말만 앞서는 사람이 되지 않도록 하자. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[어떻게 해결할까?]&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하고 싶은 것보다 해야 하는 것이 먼저이다. 본분을 잊지 말자.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;현재의 내 상황과 목표를 항상 생각하고, 지금 나에게 가장 중요한 게 무엇인지 생각하고 행동하자. &quot;너무 급해지지 말자&quot;, &quot;너무 집착하지 말자&quot;는 핑계로 나를 너무 풀어놓았던 것 같다. 틀린 말은 아니지만, 여유 부릴 때는 아니다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[다음 주 목표]&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 평일 4일 이상 남아서 공부하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 블로그 꾸준히 작성하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 주말에도 하루 이상 나와서 공부하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 플래너 작성&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 매일 12시 취침&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 매일 아침 일찍 일어나서 운동하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;-&amp;gt; 이번 주는 지난주보다는 일찍 잠에 들었던 것 같다. 아침에 운동도 세 번은 갔으니 저번 주보다는 나아졌다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;매주 목표를 세우고 실행해 보니 다음 주 목표를 완벽하게 지키기는 어렵지만 조금씩은 나아지고 있는 것 같다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;다음 주에는 이번 주보다 조금 더 나아지는 것을 목표로 해보자.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/31</guid>
      <comments>https://curiousjung1997.tistory.com/31#entry31comment</comments>
      <pubDate>Mon, 5 May 2025 18:04:31 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 최종 과제</title>
      <link>https://curiousjung1997.tistory.com/30</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;807&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cA8Xiu/btsNHs8iw0Y/EJceMrPw0BK92uc1TYkmrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cA8Xiu/btsNHs8iw0Y/EJceMrPw0BK92uc1TYkmrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cA8Xiu/btsNHs8iw0Y/EJceMrPw0BK92uc1TYkmrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcA8Xiu%2FbtsNHs8iw0Y%2FEJceMrPw0BK92uc1TYkmrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1404&quot; height=&quot;807&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;807&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&amp;lt;설계&amp;gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tWKVR/btsNF06zxZT/NKsIISfNdTOqbR8i1op2Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tWKVR/btsNF06zxZT/NKsIISfNdTOqbR8i1op2Vk/img.png&quot; data-alt=&quot;순서도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tWKVR/btsNF06zxZT/NKsIISfNdTOqbR8i1op2Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtWKVR%2FbtsNF06zxZT%2FNKsIISfNdTOqbR8i1op2Vk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3000&quot; height=&quot;4000&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;순서도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;-&amp;gt; 검토하면서 발견했는데 &quot;Score 같은가?&quot;에서 &quot;예&quot;일 때 &quot;special비교&quot;로 가야 하고 &quot;아니오&quot;일 때 1등에게 승+1, 돈+100, 나머지 패+1로 가야 함!&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;709&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mETqe/btsNGvecD2e/5FEi7hqGgBMWMQKYwQdHk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mETqe/btsNGvecD2e/5FEi7hqGgBMWMQKYwQdHk1/img.png&quot; data-alt=&quot;Game 클래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mETqe/btsNGvecD2e/5FEi7hqGgBMWMQKYwQdHk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmETqe%2FbtsNGvecD2e%2F5FEi7hqGgBMWMQKYwQdHk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1020&quot; height=&quot;709&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;709&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Game 클래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KcqqU/btsNHTxObu0/mJCzjeDYfFhnz1da7VMwbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KcqqU/btsNHTxObu0/mJCzjeDYfFhnz1da7VMwbK/img.png&quot; data-alt=&quot;Card 클래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KcqqU/btsNHTxObu0/mJCzjeDYfFhnz1da7VMwbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKcqqU%2FbtsNHTxObu0%2FmJCzjeDYfFhnz1da7VMwbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;859&quot; height=&quot;238&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Card 클래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ez978I/btsNFS8DjvI/6SW57ydmKOqVJ5ilsWata1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ez978I/btsNFS8DjvI/6SW57ydmKOqVJ5ilsWata1/img.png&quot; data-alt=&quot;CardDeck 클래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ez978I/btsNFS8DjvI/6SW57ydmKOqVJ5ilsWata1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fez978I%2FbtsNFS8DjvI%2F6SW57ydmKOqVJ5ilsWata1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;946&quot; height=&quot;226&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CardDeck 클래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1309&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpVu66/btsNFqqUMDG/GNNQVk5bfYbkuhRhaY1Ks0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpVu66/btsNFqqUMDG/GNNQVk5bfYbkuhRhaY1Ks0/img.png&quot; data-alt=&quot;Dealer 클래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpVu66/btsNFqqUMDG/GNNQVk5bfYbkuhRhaY1Ks0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpVu66%2FbtsNFqqUMDG%2FGNNQVk5bfYbkuhRhaY1Ks0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1309&quot; height=&quot;307&quot; data-origin-width=&quot;1309&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Dealer 클래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDkKer/btsNGHSXBr1/4Qew78Cl5OpPexMhXcNxqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDkKer/btsNGHSXBr1/4Qew78Cl5OpPexMhXcNxqk/img.png&quot; data-alt=&quot;HandRankEvaluator 클래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDkKer/btsNGHSXBr1/4Qew78Cl5OpPexMhXcNxqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDkKer%2FbtsNGHSXBr1%2F4Qew78Cl5OpPexMhXcNxqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;871&quot; height=&quot;292&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HandRankEvaluator 클래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1HhXP/btsNGHFpX4h/fdpqB4XA1sFgU5zaTUWXKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1HhXP/btsNGHFpX4h/fdpqB4XA1sFgU5zaTUWXKK/img.png&quot; data-alt=&quot;Player 클래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1HhXP/btsNGHFpX4h/fdpqB4XA1sFgU5zaTUWXKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1HhXP%2FbtsNGHFpX4h%2FfdpqB4XA1sFgU5zaTUWXKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;985&quot; height=&quot;250&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Player 클래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2025-05-05 18:27 1차 완성&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;Card 클래스&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Card1.png&quot; data-origin-width=&quot;1812&quot; data-origin-height=&quot;1018&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OWtS3/btsNKgnSxCh/LNcwXx4K58Logdqqv5Izak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OWtS3/btsNKgnSxCh/LNcwXx4K58Logdqqv5Izak/img.png&quot; data-alt=&quot;Card 클래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OWtS3/btsNKgnSxCh/LNcwXx4K58Logdqqv5Izak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOWtS3%2FbtsNKgnSxCh%2FLNcwXx4K58Logdqqv5Izak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1812&quot; height=&quot;1018&quot; data-filename=&quot;Card1.png&quot; data-origin-width=&quot;1812&quot; data-origin-height=&quot;1018&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Card 클래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;CardDeck 클래스&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;CardDeck.png&quot; data-origin-width=&quot;1792&quot; data-origin-height=&quot;1156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biYBzY/btsNMvXWRH4/mAwA6JUCFNKKjMIP62l8Y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biYBzY/btsNMvXWRH4/mAwA6JUCFNKKjMIP62l8Y1/img.png&quot; data-alt=&quot;CardDeck 클래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biYBzY/btsNMvXWRH4/mAwA6JUCFNKKjMIP62l8Y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiYBzY%2FbtsNMvXWRH4%2FmAwA6JUCFNKKjMIP62l8Y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1792&quot; height=&quot;1156&quot; data-filename=&quot;CardDeck.png&quot; data-origin-width=&quot;1792&quot; data-origin-height=&quot;1156&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CardDeck 클래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;Dealer 클래스&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Dealer1.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;1129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ux7pl/btsNMASrFiv/bO6yPcCiatCRUKkTKLZSQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ux7pl/btsNMASrFiv/bO6yPcCiatCRUKkTKLZSQ1/img.png&quot; data-alt=&quot;Dealer1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ux7pl/btsNMASrFiv/bO6yPcCiatCRUKkTKLZSQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUx7pl%2FbtsNMASrFiv%2FbO6yPcCiatCRUKkTKLZSQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1800&quot; height=&quot;1129&quot; data-filename=&quot;Dealer1.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;1129&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Dealer1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Dealer2.png&quot; data-origin-width=&quot;1813&quot; data-origin-height=&quot;1114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxj1iq/btsNKqKvQ8c/okJok6TDlIa5nUuexoqUCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxj1iq/btsNKqKvQ8c/okJok6TDlIa5nUuexoqUCK/img.png&quot; data-alt=&quot;Dealer2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxj1iq/btsNKqKvQ8c/okJok6TDlIa5nUuexoqUCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxj1iq%2FbtsNKqKvQ8c%2FokJok6TDlIa5nUuexoqUCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1813&quot; height=&quot;1114&quot; data-filename=&quot;Dealer2.png&quot; data-origin-width=&quot;1813&quot; data-origin-height=&quot;1114&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Dealer2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;HandRankEvaluator 클래스&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;HandRankEvaluator1.png&quot; data-origin-width=&quot;1816&quot; data-origin-height=&quot;1150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XA2pe/btsNK2iiqwM/JUZuslIZb92qXHBw5ZvbR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XA2pe/btsNK2iiqwM/JUZuslIZb92qXHBw5ZvbR0/img.png&quot; data-alt=&quot;HandRankEvaluator1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XA2pe/btsNK2iiqwM/JUZuslIZb92qXHBw5ZvbR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXA2pe%2FbtsNK2iiqwM%2FJUZuslIZb92qXHBw5ZvbR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1816&quot; height=&quot;1150&quot; data-filename=&quot;HandRankEvaluator1.png&quot; data-origin-width=&quot;1816&quot; data-origin-height=&quot;1150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HandRankEvaluator1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;HandRankEvaluator2.png&quot; data-origin-width=&quot;1828&quot; data-origin-height=&quot;1096&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTjxox/btsNL1CZe3T/QbKatTk3rQQhTpuCt5qkMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTjxox/btsNL1CZe3T/QbKatTk3rQQhTpuCt5qkMK/img.png&quot; data-alt=&quot;HandRankEvaluator 2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTjxox/btsNL1CZe3T/QbKatTk3rQQhTpuCt5qkMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTjxox%2FbtsNL1CZe3T%2FQbKatTk3rQQhTpuCt5qkMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1828&quot; height=&quot;1096&quot; data-filename=&quot;HandRankEvaluator2.png&quot; data-origin-width=&quot;1828&quot; data-origin-height=&quot;1096&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HandRankEvaluator 2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;HandRankEvaluator3.png&quot; data-origin-width=&quot;1813&quot; data-origin-height=&quot;1113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs8Bt1/btsNK1KthKw/pLz1wUulj3I9UseziDKk01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs8Bt1/btsNK1KthKw/pLz1wUulj3I9UseziDKk01/img.png&quot; data-alt=&quot;HandRankEvaluator 3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs8Bt1/btsNK1KthKw/pLz1wUulj3I9UseziDKk01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs8Bt1%2FbtsNK1KthKw%2FpLz1wUulj3I9UseziDKk01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1813&quot; height=&quot;1113&quot; data-filename=&quot;HandRankEvaluator3.png&quot; data-origin-width=&quot;1813&quot; data-origin-height=&quot;1113&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HandRankEvaluator 3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;HandRankEvaluator4.png&quot; data-origin-width=&quot;1821&quot; data-origin-height=&quot;1114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UgUfG/btsNJVRKSaL/8NHp6CfmAB6zxfFSqHaX70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UgUfG/btsNJVRKSaL/8NHp6CfmAB6zxfFSqHaX70/img.png&quot; data-alt=&quot;HandRankEvaluator 4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UgUfG/btsNJVRKSaL/8NHp6CfmAB6zxfFSqHaX70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUgUfG%2FbtsNJVRKSaL%2F8NHp6CfmAB6zxfFSqHaX70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1821&quot; height=&quot;1114&quot; data-filename=&quot;HandRankEvaluator4.png&quot; data-origin-width=&quot;1821&quot; data-origin-height=&quot;1114&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HandRankEvaluator 4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;HandRankEvaluator5.png&quot; data-origin-width=&quot;1818&quot; data-origin-height=&quot;1107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8bt0M/btsNJDKDKE0/MMSV4usymZJItHEA7baJx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8bt0M/btsNJDKDKE0/MMSV4usymZJItHEA7baJx1/img.png&quot; data-alt=&quot;HandRankEvaluator 5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8bt0M/btsNJDKDKE0/MMSV4usymZJItHEA7baJx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8bt0M%2FbtsNJDKDKE0%2FMMSV4usymZJItHEA7baJx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1818&quot; height=&quot;1107&quot; data-filename=&quot;HandRankEvaluator5.png&quot; data-origin-width=&quot;1818&quot; data-origin-height=&quot;1107&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HandRankEvaluator 5&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;HandRankEvaluator6.png&quot; data-origin-width=&quot;1809&quot; data-origin-height=&quot;1074&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MjJy7/btsNJ51cuXD/XaiCvYTVLVYn3GpTTuCqLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MjJy7/btsNJ51cuXD/XaiCvYTVLVYn3GpTTuCqLK/img.png&quot; data-alt=&quot;HandRankEvaluator 6&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MjJy7/btsNJ51cuXD/XaiCvYTVLVYn3GpTTuCqLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMjJy7%2FbtsNJ51cuXD%2FXaiCvYTVLVYn3GpTTuCqLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1809&quot; height=&quot;1074&quot; data-filename=&quot;HandRankEvaluator6.png&quot; data-origin-width=&quot;1809&quot; data-origin-height=&quot;1074&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HandRankEvaluator 6&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;HandRankEvaluator7.png&quot; data-origin-width=&quot;1804&quot; data-origin-height=&quot;1108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GtCMA/btsNJ2Dnwh6/jDegkEwwTuxkoEFeukqamK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GtCMA/btsNJ2Dnwh6/jDegkEwwTuxkoEFeukqamK/img.png&quot; data-alt=&quot;HandRankEvaluator 7&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GtCMA/btsNJ2Dnwh6/jDegkEwwTuxkoEFeukqamK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGtCMA%2FbtsNJ2Dnwh6%2FjDegkEwwTuxkoEFeukqamK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1804&quot; height=&quot;1108&quot; data-filename=&quot;HandRankEvaluator7.png&quot; data-origin-width=&quot;1804&quot; data-origin-height=&quot;1108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HandRankEvaluator 7&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;Player 클래스&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Player1.png&quot; data-origin-width=&quot;1816&quot; data-origin-height=&quot;1153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xE5Ub/btsNK39jtDf/hsIjeve8NwNh5Ys3gNwJGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xE5Ub/btsNK39jtDf/hsIjeve8NwNh5Ys3gNwJGk/img.png&quot; data-alt=&quot;Player 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xE5Ub/btsNK39jtDf/hsIjeve8NwNh5Ys3gNwJGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxE5Ub%2FbtsNK39jtDf%2FhsIjeve8NwNh5Ys3gNwJGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1816&quot; height=&quot;1153&quot; data-filename=&quot;Player1.png&quot; data-origin-width=&quot;1816&quot; data-origin-height=&quot;1153&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Player 1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Player2.png&quot; data-origin-width=&quot;1734&quot; data-origin-height=&quot;991&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2hTWl/btsNL3t1Ea6/qCnkQ1lb95Ey9sNQVuAQrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2hTWl/btsNL3t1Ea6/qCnkQ1lb95Ey9sNQVuAQrK/img.png&quot; data-alt=&quot;Player2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2hTWl/btsNL3t1Ea6/qCnkQ1lb95Ey9sNQVuAQrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2hTWl%2FbtsNL3t1Ea6%2FqCnkQ1lb95Ey9sNQVuAQrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1734&quot; height=&quot;991&quot; data-filename=&quot;Player2.png&quot; data-origin-width=&quot;1734&quot; data-origin-height=&quot;991&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Player2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Player3.png&quot; data-origin-width=&quot;1761&quot; data-origin-height=&quot;1068&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boq8tF/btsNLamSQ0L/FZqGfRvyrrKko7j71cIwbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boq8tF/btsNLamSQ0L/FZqGfRvyrrKko7j71cIwbK/img.png&quot; data-alt=&quot;Player3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boq8tF/btsNLamSQ0L/FZqGfRvyrrKko7j71cIwbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fboq8tF%2FbtsNLamSQ0L%2FFZqGfRvyrrKko7j71cIwbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1761&quot; height=&quot;1068&quot; data-filename=&quot;Player3.png&quot; data-origin-width=&quot;1761&quot; data-origin-height=&quot;1068&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Player3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Player4.png&quot; data-origin-width=&quot;1797&quot; data-origin-height=&quot;1108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AnPAx/btsNLpxwVbz/mjHOaPZrEJXpJKQ2bknYt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AnPAx/btsNLpxwVbz/mjHOaPZrEJXpJKQ2bknYt0/img.png&quot; data-alt=&quot;Player4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AnPAx/btsNLpxwVbz/mjHOaPZrEJXpJKQ2bknYt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAnPAx%2FbtsNLpxwVbz%2FmjHOaPZrEJXpJKQ2bknYt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1797&quot; height=&quot;1108&quot; data-filename=&quot;Player4.png&quot; data-origin-width=&quot;1797&quot; data-origin-height=&quot;1108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Player4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;Game 클래스&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Game1.png&quot; data-origin-width=&quot;1816&quot; data-origin-height=&quot;1063&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ecPBDP/btsNK0Y3wkc/dEbsmb7zCCRAIsPfNtISEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ecPBDP/btsNK0Y3wkc/dEbsmb7zCCRAIsPfNtISEk/img.png&quot; data-alt=&quot;Game 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ecPBDP/btsNK0Y3wkc/dEbsmb7zCCRAIsPfNtISEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FecPBDP%2FbtsNK0Y3wkc%2FdEbsmb7zCCRAIsPfNtISEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1816&quot; height=&quot;1063&quot; data-filename=&quot;Game1.png&quot; data-origin-width=&quot;1816&quot; data-origin-height=&quot;1063&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Game 1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Game2.png&quot; data-origin-width=&quot;1819&quot; data-origin-height=&quot;1084&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbmHgp/btsNLU4XTOl/40ScFWynmjMDZYfWqxjT70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbmHgp/btsNLU4XTOl/40ScFWynmjMDZYfWqxjT70/img.png&quot; data-alt=&quot;Game2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbmHgp/btsNLU4XTOl/40ScFWynmjMDZYfWqxjT70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbmHgp%2FbtsNLU4XTOl%2F40ScFWynmjMDZYfWqxjT70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1819&quot; height=&quot;1084&quot; data-filename=&quot;Game2.png&quot; data-origin-width=&quot;1819&quot; data-origin-height=&quot;1084&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Game2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Game3.png&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;979&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wTXxG/btsNKztUV0U/KLVj1l3y0Gy9LTGk53HOBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wTXxG/btsNKztUV0U/KLVj1l3y0Gy9LTGk53HOBk/img.png&quot; data-alt=&quot;Game3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wTXxG/btsNKztUV0U/KLVj1l3y0Gy9LTGk53HOBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwTXxG%2FbtsNKztUV0U%2FKLVj1l3y0Gy9LTGk53HOBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1782&quot; height=&quot;979&quot; data-filename=&quot;Game3.png&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;979&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Game3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Game4.png&quot; data-origin-width=&quot;1767&quot; data-origin-height=&quot;1008&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lG0fL/btsNMAdP0iY/PwS7DK0Y6W6WL2jyOaAgEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lG0fL/btsNMAdP0iY/PwS7DK0Y6W6WL2jyOaAgEK/img.png&quot; data-alt=&quot;Game4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lG0fL/btsNMAdP0iY/PwS7DK0Y6W6WL2jyOaAgEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlG0fL%2FbtsNMAdP0iY%2FPwS7DK0Y6W6WL2jyOaAgEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1767&quot; height=&quot;1008&quot; data-filename=&quot;Game4.png&quot; data-origin-width=&quot;1767&quot; data-origin-height=&quot;1008&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Game4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;출력 결과&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;첫출력결과.png&quot; data-origin-width=&quot;1759&quot; data-origin-height=&quot;1081&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG3YYC/btsNJTNbNhm/evOuvhUn02UV6aKUsxWfA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG3YYC/btsNJTNbNhm/evOuvhUn02UV6aKUsxWfA1/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG3YYC/btsNJTNbNhm/evOuvhUn02UV6aKUsxWfA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG3YYC%2FbtsNJTNbNhm%2FevOuvhUn02UV6aKUsxWfA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1759&quot; height=&quot;1081&quot; data-filename=&quot;첫출력결과.png&quot; data-origin-width=&quot;1759&quot; data-origin-height=&quot;1081&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;-&amp;gt; 출력 결과를 보면, 플레이어 수를 입력받는 부분은 의도했던 방향대로 출력되고 있음을 볼 수 있고, 플레이어 닉네임을 입력 받는 경우, 나머지는 잘 됐지만, 1, 2번 플레이어 닉네임의 입력을 한 번에 받고 있음을 볼 수 있다. 또한, 플레이어 닉네임 목록을 출력할 때, 닉네임이 출력되지 않고 해시값이 출력되는 것을 볼 수 있다. 마지막으로 최종 결과 출력부를 보면, 100번의 게임을 모두 출력하고 있는 것을 볼 수 있다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;-&amp;gt; 수정해야 하는 부분&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;1. 1,2번 플레이어의 닉네임을 나눠서 받도록 수정해야 함.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;2. 닉네임 목록을 출력할 때 해시값이 아니라 닉네임이 출력되도록 해야 함 -&amp;gt; Player클래스에 toString을 오버라이드 해야 할 듯.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;3. 최종 결과가 매 게임마다 총 100번 출력됨 -&amp;gt; 매 게임마다 승자만 출력하고, 100게임 이후 최종 결과는 한 번만 출력하도록 해야 함.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>문제 풀이/해결중</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/30</guid>
      <comments>https://curiousjung1997.tistory.com/30#entry30comment</comments>
      <pubDate>Wed, 30 Apr 2025 18:59:16 +0900</pubDate>
    </item>
    <item>
      <title>[디자인 패턴] 전략 패턴 (Strategy Pattern)</title>
      <link>https://curiousjung1997.tistory.com/28</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;전략 패턴이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전략패턴은 &quot;변하지 않는 부분&quot;과 &quot;변하는 부분&quot;을 분리해서, &quot;변하는 부분(전략)&quot;을 객체로 캡슐화하여 따로 분리하고, 필요할 때 &quot;전략&quot;을 갈아 끼울 수 있도록 만드는 디자인 패턴이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 게임 캐릭터가 공격할 때, 어떤 캐릭터는 칼로 공격하고, 어떤 캐릭터는 활을 쏴서 공격한다. 하지만, &quot;공격&quot;이라는 행동 자체는 공통이다. 이때 &quot;공격 방법&quot;만 다르게 하고 싶어서 사용하는 것이 Strategy Pattern이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우, 각각의 공격 방식들이 전략에 해당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 전략1 : 칼을 이용하여 공격, 전략2 : 활을 쏴서 공격, 전략3 : 표창을 던져서 공격&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예시를 코드로 작성하려면, &quot;공격&quot;은 인터페이스로 만들고, 각 공격 방법(전략)을 클래스로 만든 후, 각 클래스에서 &quot;공격&quot; 인터페이스를 구현하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;전략 패턴의 기본 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;832&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz8v4Z/btsNDLUNF66/NrzSkIXg6YyxkbnVw7fow1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz8v4Z/btsNDLUNF66/NrzSkIXg6YyxkbnVw7fow1/img.png&quot; data-alt=&quot;Strategy Pattern 기본 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz8v4Z/btsNDLUNF66/NrzSkIXg6YyxkbnVw7fow1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz8v4Z%2FbtsNDLUNF66%2FNrzSkIXg6YyxkbnVw7fow1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1380&quot; height=&quot;832&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;832&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Strategy Pattern 기본 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Context :&lt;/b&gt; Strategy 인터페이스를 참조하여 실제 전략 객체와 통신한다. Context는 구체적인 전략이 어떤 것인지 알 필요 없이, 전략 인터페이스만을 통해 행동을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Strategy 인터페이스 :&lt;/b&gt; 모든 구체 전략(Concrete Strategy)들이 반드시 구현해야 할 공통 메서드를 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- ConcreteStrategies :&lt;/b&gt; 다양한 전략(알고리즘/로직)의 구체적인 구현체이다. 각 클래스는 Strategy 인터페이스를 구현하여 서로 다른 동작을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Client :&lt;/b&gt; 필요한 구체 전략 객체를 생성한 후, Context에 주입한다. 이 과정을 통해 Context는 런타임에 동적으로 전략을 변경할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;전략 패턴을 사용하지 않은 경우와 사용한 경우의 코드 예시 및 비교&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;전략 패턴을 사용하지 않은 경우&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEJFJT/btsNCbAFYTn/HQq9zaq1bbkFcGqMbMPXHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEJFJT/btsNCbAFYTn/HQq9zaq1bbkFcGqMbMPXHk/img.png&quot; data-alt=&quot;전략 패턴을 사용하지 않은 경우 예시 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEJFJT/btsNCbAFYTn/HQq9zaq1bbkFcGqMbMPXHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEJFJT%2FbtsNCbAFYTn%2FHQq9zaq1bbkFcGqMbMPXHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;706&quot; height=&quot;460&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;전략 패턴을 사용하지 않은 경우 예시 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;전략 패턴을 사용한 경우&amp;gt;&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;위의 전략 패턴 기본 구조에서 Context, Strategy, ConcreteStrategy, Client에 대응하는 인터페이스와 클래스들&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btQM8p/btsND4T4wGJ/E3O2HbnlTlePBKv4UWWFiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btQM8p/btsND4T4wGJ/E3O2HbnlTlePBKv4UWWFiK/img.png&quot; data-alt=&quot;Context : 전략을 사용하는 캐릭터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btQM8p/btsND4T4wGJ/E3O2HbnlTlePBKv4UWWFiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtQM8p%2FbtsND4T4wGJ%2FE3O2HbnlTlePBKv4UWWFiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;724&quot; height=&quot;400&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Context : 전략을 사용하는 캐릭터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBYKFB/btsNBzn0F42/dKsZgN00KusDJF5jXtdypk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBYKFB/btsNBzn0F42/dKsZgN00KusDJF5jXtdypk/img.png&quot; data-alt=&quot;Strategy : 공격 전략&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBYKFB/btsNBzn0F42/dKsZgN00KusDJF5jXtdypk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBYKFB%2FbtsNBzn0F42%2FdKsZgN00KusDJF5jXtdypk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;645&quot; height=&quot;112&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Strategy : 공격 전략&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SgFK4/btsNB5mFNTS/zjiL9kjQtEootEMEVjpkMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SgFK4/btsNB5mFNTS/zjiL9kjQtEootEMEVjpkMK/img.png&quot; data-alt=&quot;ConcreteStrategy 1 : 칼로 공격하는 전략&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SgFK4/btsNB5mFNTS/zjiL9kjQtEootEMEVjpkMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSgFK4%2FbtsNB5mFNTS%2FzjiL9kjQtEootEMEVjpkMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;180&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ConcreteStrategy 1 : 칼로 공격하는 전략&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo91BK/btsNDosfMGv/L2l1kcI4Qham75eZI1Juo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo91BK/btsNDosfMGv/L2l1kcI4Qham75eZI1Juo1/img.png&quot; data-alt=&quot;Concrete Starategy 2 : 마법으로 공격하는 전략&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo91BK/btsNDosfMGv/L2l1kcI4Qham75eZI1Juo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo91BK%2FbtsNDosfMGv%2FL2l1kcI4Qham75eZI1Juo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;615&quot; height=&quot;180&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Concrete Starategy 2 : 마법으로 공격하는 전략&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nOmql/btsNDDpcpRT/mPEhUxKQFkbNZvHDSny1nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nOmql/btsNDDpcpRT/mPEhUxKQFkbNZvHDSny1nk/img.png&quot; data-alt=&quot;Concrete Strategy 3 : 주먹으로 공격하는 전략&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nOmql/btsNDDpcpRT/mPEhUxKQFkbNZvHDSny1nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnOmql%2FbtsNDDpcpRT%2FmPEhUxKQFkbNZvHDSny1nk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;652&quot; height=&quot;175&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Concrete Strategy 3 : 주먹으로 공격하는 전략&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQ4qX4/btsNC1jMXAg/RZkBHxmuscNo0m21JUsr71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQ4qX4/btsNC1jMXAg/RZkBHxmuscNo0m21JUsr71/img.png&quot; data-alt=&quot;Client : 전략 패턴 메인 메서드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQ4qX4/btsNC1jMXAg/RZkBHxmuscNo0m21JUsr71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQ4qX4%2FbtsNC1jMXAg%2FRZkBHxmuscNo0m21JUsr71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;775&quot; height=&quot;310&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Client : 전략 패턴 메인 메서드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;비교&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 위의 예시 코드를 바탕으로 전략 패턴을 사용하지 않은 경우와 전략 패턴을 사용한 경우를 비교해 보자면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전략 패턴을 사용하지 않은 경우&lt;/b&gt;는 하드 코딩 방식으로 되어 있어 공격 방법이 코드 내부에 고정되어 있으며, 공격 방식을 변경하거나 새로운 공격 방식을 추가하려면 attack() 메서드를 직접 수정해야 한다. 따라서 유연성이 낮고, 전략이 하나씩 추가될 때마다 else-if 문을 추가해야 하기 때문에 유지보수가 어렵다. 또한, 기존 코드를 수정해야만 기능을 확장할 수 있기 때문에 SOLID 원칙 중 OCP를 위반하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;반면, 전략 패턴을 사용한 경우&lt;/b&gt;에는 변경/확장 시 새로운 전략 클래스를 추가하기만 하면 되기 때문에, 유연성이 높고, 유지보수가 쉬우며, OCP를 준수할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;*OCP (Open-Closed Principle, 개방-폐쇄 원칙)&lt;/b&gt; : 소프트웨어 요소는 확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 한다는 원칙이다. 즉, 기존 코드를 변경하지 않고 기능을 추가할 수 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;전략 패턴을 사용했을 때의 장단점&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 장점&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. OCP 원칙 준수&lt;/b&gt; : 새로운 공격 방법(전략)을 추가할 때, 기존 코드를 전혀 고칠 필요 없이 새 클래스만 추가하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 코드 유연성 증가&lt;/b&gt; : 실행 도중에(런타임에) 다른 전략으로 쉽게 바꿀 수 있다. setAttackStrategy()만 호출하면 다른 공격 전략을 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 중복 제거, 코드 정리&lt;/b&gt; : attack() 메서드 안에 복잡한 if-else 문이 없어지고, 전략별로 코드가 깔끔하게 분리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 테스트 용이성&lt;/b&gt; : &quot;칼로 공격&quot;과 같은 특정 전략만 따로 테스트할 수 있다. (Unit Test 용이)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 유지보수 편리&lt;/b&gt; : 전략 클래스 별로 수정할 수 있어, 다른 코드에 영향 없이 수정이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. 클래스 재사용성 향상&lt;/b&gt; : &quot;칼로 공격&quot;과 같은 하나의 전략을 여러 다른 객체가 공유할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 단점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 클래스 수 증가&lt;/b&gt; : 전략마다 별도 클래스를 만들어야 하므로 프로젝트가 크면 클래스가 너무 많아져서 복잡해질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 조립 복잡성&lt;/b&gt; : 전략이 많아지면 전략 객체를 생성하고 주입하는 과정이 번거로울 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 오버스펙&lt;/b&gt; : 간단한 로직인데도 억지로 전략 패턴을 쓰면 오히려 코드가 복잡하고 불편해질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;-&amp;gt; 위의 예시 코드도 사실 이 경우에 해당한다. 위의 예시는 단지 전략 패턴을 쉽게 이해하기 위한 것. 위의 예시처럼 전략이 2~3개밖에 안 되고 절대 바뀌지 않는 경우에는 전략 패턴을 쓰면 오히려 오버스펙이 될 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. 의존성 관리 필요&lt;/b&gt; : 위의 예시로 치면 캐릭터가 공격 전략에 의존하게 되므로, 객체를 잘 관리해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;-&amp;gt;전략 패턴을 사용하면 복잡한 if-else 문을 없애고 유연성과 확장성을 얻을 수 있지만, 클래스가 많아져서 복잡해질 수 있으니 상황에 따라 적절히 사용하자!&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;lt;위의 예시 코드 클래스 다이어그램&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;3000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oJmG2/btsNCzOCXgP/j9s3Q4bQgG5kCaTwq8L6Ik/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oJmG2/btsNCzOCXgP/j9s3Q4bQgG5kCaTwq8L6Ik/img.jpg&quot; data-alt=&quot;클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oJmG2/btsNCzOCXgP/j9s3Q4bQgG5kCaTwq8L6Ik/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoJmG2%2FbtsNCzOCXgP%2Fj9s3Q4bQgG5kCaTwq8L6Ik%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;3000&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클래스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*참고) 디자인 패턴을 이해하기 위한 클래스 다이어그램 기본 개념 - &lt;a href=&quot;https://curiousjung1997.tistory.com/26&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://curiousjung1997.tistory.com/26&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1745842893577&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;디자인 패턴을 이해하기 위한 클래스 다이어그램 기본 개념&quot; data-og-description=&quot;*본 게시글은 추후 디자인 패턴에 대한 글을 작성할 때 도입할 클래스 다이어그램과, 클래스 다이어그램에서의 연관 관계에 대한 이해를 돕기 위해 작성하였습니다. 클래스 다이어그램이란?시&quot; data-og-host=&quot;curiousjung1997.tistory.com&quot; data-og-source-url=&quot;https://curiousjung1997.tistory.com/26&quot; data-og-url=&quot;https://curiousjung1997.tistory.com/26&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bvQdi5/hyYFG3KP6c/f0w2iJAteMXQE5KQYXphsK/img.jpg?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/qTboN/hyYMc7M3Lx/QviKUm2WbrKAKS2pH8GMwk/img.jpg?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/bJjStK/hyYMavmNpy/wPTxC76qwPXT1rGoNdvTA0/img.jpg?width=4000&amp;amp;height=3000&amp;amp;face=0_0_4000_3000&quot;&gt;&lt;a href=&quot;https://curiousjung1997.tistory.com/26&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://curiousjung1997.tistory.com/26&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bvQdi5/hyYFG3KP6c/f0w2iJAteMXQE5KQYXphsK/img.jpg?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/qTboN/hyYMc7M3Lx/QviKUm2WbrKAKS2pH8GMwk/img.jpg?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/bJjStK/hyYMavmNpy/wPTxC76qwPXT1rGoNdvTA0/img.jpg?width=4000&amp;amp;height=3000&amp;amp;face=0_0_4000_3000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;디자인 패턴을 이해하기 위한 클래스 다이어그램 기본 개념&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;*본 게시글은 추후 디자인 패턴에 대한 글을 작성할 때 도입할 클래스 다이어그램과, 클래스 다이어그램에서의 연관 관계에 대한 이해를 돕기 위해 작성하였습니다. 클래스 다이어그램이란?시&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;curiousjung1997.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;실무 사례&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 결제 방식 선택 시스템 (카카오페이, 카드결제, 계좌결제, 휴대폰결제 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 로그인 인증 방식 선택 시스템 (소셜 로그인, 토큰 기반 로그인, 세션 기반 로그인 등)&lt;/p&gt;
&lt;h2 style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;디자인 패턴을 이해하기 위한 클래스 다이어그램 기본 개념&lt;/h2&gt;
&lt;h2 style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;디자인 패턴을 이해하기 위한 클래스 다이어그램 기본 개념&lt;/h2&gt;
&lt;h2 style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;디자인 패턴을 이해하기 위한 클래스 다이어그램 기본 개념&lt;/h2&gt;
&lt;h2 style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;디자인 패턴을 이해하기 위한 클래스 다이어그램 기본 개념&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;*본 게시물은 refactoring.guru 사이트를 참고하여 작성하였음을 밝힙니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;일부 사진 출처 : &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://refactoring.guru/design-patterns/behavioral-patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://refactoring.guru/design-patterns/behavioral-patterns&lt;/a&gt;&lt;/p&gt;</description>
      <category>디자인 패턴/행위 패턴</category>
      <category>strategy pattern</category>
      <category>디자인 패턴</category>
      <category>전략 패턴</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/28</guid>
      <comments>https://curiousjung1997.tistory.com/28#entry28comment</comments>
      <pubDate>Mon, 28 Apr 2025 21:25:06 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 5주차 회고 - 규칙적으로 생활하기</title>
      <link>https://curiousjung1997.tistory.com/27</link>
      <description>&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[저번 주 회고 때 작성한 이번 주 목표 및 달성 여부]&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;- 평일 4일 이상 남아서 공부하기&lt;/s&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;- 블로그 꾸준히 작성하기&lt;/s&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;- 주말에도 하루 이상 나와서 공부하기&lt;/s&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 플래너 작성&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 매일 12시 전에 잠들기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 매일 아침 일찍 일어나서 운동하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 주에도 나름 열심히 공부했지만, 저번 주에 설정했던 목표들 중 절반밖에 달성하지 못했다. 그래도 주말에도 나와서 공부하는 습관을 조금씩 들여가고 있다는 점은 긍정적이었다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[이번 주 문제점]&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;첫 번째 문제는 플래너를 준비해놓고도 제대로 활용하지 못했다는 점이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저번 주 회고 때, 시간을 효율적으로 쓰지 못하고 있는 것 같다는 생각이 들어서 플래너를 써보려고 가져왔지만 사물함에 넣어둔 채 까맣게 잊고 있었다. 하루하루 흐름에 맡기는 식으로 시간을 쓰게 되었고, 결국 이번 주도 시간을 효율적으로 관리하지 못했던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;두 번째 문제는 수면 패턴이 불규칙했다는 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래는 11시에 잠자리에 들고, 12시에 취침하는 것을 목표로 했지만, 매일 10시까지 학원에 남아 공부하다 보니 계획한 시간에 잠에 들기가 어려웠다. 이런 패턴이 계속되면서 빨래, 설거지도 밀리게 되고 생활 전반에 여유가 사라진 느낌이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;세 번째 문제는 아침 운동을 꾸준히 이어가지 못했다는 점이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매일 아침 운동하는 루틴을 짜고 시도했지만, 매일 아침 6시에 일어나는 게 생각보다 어려웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[어떻게 해결할까?]&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다음 주에는 플래너를 적극적으로 활용해서 하루를 더 구체적으로 계획하고 관리해보려고 한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;매일 아침마다 그날 해야 할 일과 목표를 정리하고, 하루가 끝날 때는 어떤 시간대에 시간을 낭비했는지를 체크해서 시간을 효율적으로 관리할 수 있도록 노력해 봐야겠다. 특히 주 단위로 해야 할 공부량을 미리 구체적으로 정해놓고, 이를 일별로 나누어 매일 해야 할 분량을 채워가는 식으로 관리해 보면 좋을 것 같다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;또한, 공부 시간에만 너무 집착하기보다는, 학원에 있는 동안은 최대한 집중하되, 생활 패턴을 지키는 데에도 더 신경을 써야겠다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아침 운동 루틴은 다음 주까지 다시 도전해볼 예정이다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 다음 주에도 잘 안 된다면, 무리하게 아침 운동을 고집하지 않고 이전처럼 저녁에 하는 것도 좋을 것 같다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;취준은 결국 장거리 달리기라는 말도 있듯이, 지금 당장의 성과에 집착하기보다는, 작은 습관을 꾸준히 이어가는 것이 더 중요하지 않을까?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[다음 주 목표]&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 평일 4일 이상 남아서 공부하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 블로그 꾸준히 작성하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 주말에도 하루 이상 나와서 공부하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;-&amp;gt; 이 3개는 그대로 가져가고,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 플래너 작성&amp;nbsp; -&amp;gt; 이번 주에는 까먹지 말고 꼭 써서 다음 주 회고 때 업로드 하자!&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 매일 12시 취침&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 매일 아침 일찍 일어나서 운동하기 -&amp;gt; 다음 주에도 잘 안되면 그냥 저녁에 해야겠다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;-&amp;gt; 이 3개는 이번 주에는 더 신경써서 꼭 지켜보자.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/27</guid>
      <comments>https://curiousjung1997.tistory.com/27#entry27comment</comments>
      <pubDate>Sun, 27 Apr 2025 15:49:49 +0900</pubDate>
    </item>
    <item>
      <title>디자인 패턴을 이해하기 위한 클래스 다이어그램 기본 개념</title>
      <link>https://curiousjung1997.tistory.com/26</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;*본 게시글은 추후 디자인 패턴에 대한 글을 작성할 때 도입할 클래스 다이어그램과, 클래스 다이어그램에서의 연관 관계에 대한 이해를 돕기 위해 작성하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;클래스 다이어그램이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템의 구조를 클래스 단위로 표현한 UML(Unified Modeling Language)으로, 클래스들 간의 속성, 메서드, 그리고 관계(상속, 연관 등)를 시각적으로 보여주는 다이어그램이다. 클래스 다이어그램에서 클래스는 클래스명, 변수, 메서드 순으로 나열한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;예시&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;3000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwSUlk/btsNyTL8iO8/9x0Q1OMg1OgoLTK81u9BTK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwSUlk/btsNyTL8iO8/9x0Q1OMg1OgoLTK81u9BTK/img.jpg&quot; data-alt=&quot;클래스 다이어그램 예시1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwSUlk/btsNyTL8iO8/9x0Q1OMg1OgoLTK81u9BTK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwSUlk%2FbtsNyTL8iO8%2F9x0Q1OMg1OgoLTK81u9BTK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;3000&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클래스 다이어그램 예시1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예시를 통해 클래스 다이어그램에 대해 간단히 설명하자면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 사각형의 맨 윗부분에 적혀있는 &quot;ChessPiece&quot;와 같은 것들은 &lt;b&gt;클래스명&lt;/b&gt;, 그 아랫 부분에 &quot;- color :&amp;nbsp; String&quot;, &quot;+ get_color&quot;와 같은 것들은 각 클래스의 &lt;b&gt;멤버(변수 및 메서드)&lt;/b&gt;이다. 각 멤버의 맨 앞에 붙어있는 +, - 와 같은 것들은 &lt;b&gt;접근 제어자&lt;/b&gt;를 의미하고, +는 public, -는 private, #은 protected를 의미한다. 마지막으로, 형광펜으로 표시한 1, 2, 3번과 같은 화살표들은 각 클래스들 간의 &lt;b&gt;연관 관계&lt;/b&gt;를 나타내는 기호인데, 이 기호들은 아래에 간단히 정리해 보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ao9tE/btsNyO5CpWO/wf76gRYNclD4tGlNGLFv41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ao9tE/btsNyO5CpWO/wf76gRYNclD4tGlNGLFv41/img.png&quot; data-alt=&quot;클래스 간의 연관 관계를 나타내는 기호&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ao9tE/btsNyO5CpWO/wf76gRYNclD4tGlNGLFv41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAo9tE%2FbtsNyO5CpWO%2Fwf76gRYNclD4tGlNGLFv41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;703&quot; height=&quot;598&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클래스 간의 연관 관계를 나타내는 기호&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Association (연관)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 클래스 간에 어떤 관계가 있다는 것을 나타낸다. 한 객체가 다른 객체를 참조하거나 사용하는 관계이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, &quot;학생-강의&quot;는 학생은 강의를 듣고, 강의는 여러 학생과 관련이 있다는 것을 나타낸다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Inheritance (상속)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 클래스가 다른 클래스의 속성과 기능을 물려받는 관계이다. 자식 클래스가 부모 클래스의 기능을 재사용하면서 확장이 가능하다. 예를 들어, &quot;동물 &amp;lt;- 강아지&quot;는 강아지가 동물의 속성과 행동을 물려받는다는 것을 의미한다. 표기는 빈 삼각형 화살표로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Realization / Implementation (구현)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스가 인터페이스의 기능을 실제로 구현하는 관계임을 나타낸다. 인터페이슨느 &quot;무엇을 해야 하는지&quot;, 클래스는 &quot;어떻게 할지&quot;를 정의한다. 예를 들어, &quot;Bird &amp;lt; - - Flyable&quot;은 Bird가 Flyable 인터페이스를 구현한다는 것을 의미한다. 표기는 빈 삼각형 화살표와 점선으로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Dependency (의존)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 클래스가 다른 클래스의 기능을 일시적으로 사용하는 관계이다. 이 연관 관계는 메서드 파라미터나 지역 변수로 다른 클래스를 참조할 때 생긴다. 예를 들어, &quot;주문&quot; 클래스가 &quot;결제&quot; 클래스를 사용하는 경우에 의존 관계가 생긴다. 표기는 점선 화살표로 하고 일시적인 관계를 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. Aggregation (집합)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체와 부분의 관계를 나타내지만, 독립적으로 존재할 수 있다. 즉, 전체가 사라져도 부분은 살아있을 수 있다. 예를 들어, 팀-선수의 관계에서 팀이 사라져도 선수는 존재할 수 있다. 표기는 빈 마름모로 하고 마름모가 있는 쪽이 전체, 나머지 한쪽이 부분을 나타낸다. 화살표가 있는 경우 전체 -&amp;gt; 부분 방향으로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. Composition (합성)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체와 부분의 관계를 나타내지만, 강한 소유관계로, Aggregation(집합) 관계와 달리, 전체가 사라지면 부분도 같이 사라진다. 즉, 생명주기를 함께하는 강한 결합을 나타낸다. 예를 들어, &quot;집-방&quot;에서 집이 사라지면 방도 사라진다. 표기는 채워진 마름모로 하고, Aggregation과 동일하게 마름모 쪽이 전체, 반대쪽이 부분을 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;클래스 다이어그램 예시&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;1180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3FbBX/btsNxyWZ14U/rUYMp2p92qNFHeufdX811k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3FbBX/btsNxyWZ14U/rUYMp2p92qNFHeufdX811k/img.png&quot; data-alt=&quot;클래스 다이어그램 예시2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3FbBX/btsNxyWZ14U/rUYMp2p92qNFHeufdX811k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3FbBX%2FbtsNxyWZ14U%2FrUYMp2p92qNFHeufdX811k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1135&quot; height=&quot;1180&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;1180&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클래스 다이어그램 예시2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 클래스다이어그램 예시를 보면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Person클래스는 Creature인터페이스를 &lt;b&gt;Implementation(구현)&lt;/b&gt; 하고 있고, Address클래스를 &lt;b&gt;참조&lt;/b&gt;하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Student클래스와 Professor클래스는 이 Person클래스를 &lt;b&gt;Extends(상속) 받고&lt;/b&gt; 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 중 Student클래스와 Transcript는 &lt;b&gt;Composition(합성) 관계이므로&lt;/b&gt; Transcript클래스는 Student클래스가 사라지면 함께 사라진다.&amp;nbsp; 또한, SoonInJung이라는 학생은 Student클래스를 &lt;b&gt;Extends(상속) 받고&lt;/b&gt; 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SeongNamKung클래스는 Professor클래스를 &lt;b&gt;Extends(상속) 받고&lt;/b&gt; 있고, Professor클래스와 Course클래스는 &lt;b&gt;Aggregation(집합) 관계이다.&lt;/b&gt; &lt;b&gt;&lt;u&gt;집합 관계는 합성 관계와 달리 전체가 사라지더라도 부분이 사라지지는 않는다.&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;**참고한 사이트**&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://adacomputerscience.org/questions/oop_04_v2&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://adacomputerscience.org/questions/oop_04_v2&lt;/a&gt;&lt;/p&gt;</description>
      <category>디자인 패턴/디자인 패턴 이해를 위한 클래스 다이어그램</category>
      <category>Aggregation</category>
      <category>class diagram associations</category>
      <category>composition</category>
      <category>UML</category>
      <category>클래스 다이어그램</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/26</guid>
      <comments>https://curiousjung1997.tistory.com/26#entry26comment</comments>
      <pubDate>Fri, 25 Apr 2025 12:36:57 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 인터페이스에도 완성된 메서드를 쓴다고?</title>
      <link>https://curiousjung1997.tistory.com/25</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;*본&amp;nbsp;게시물은&amp;nbsp;개인&amp;nbsp;공부를&amp;nbsp;기록하기&amp;nbsp;위해&amp;nbsp;작성하였으며,&amp;nbsp;내용에&amp;nbsp;오류가&amp;nbsp;있을&amp;nbsp;수&amp;nbsp;있음을&amp;nbsp;밝힙니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;지금까지 인터페이스는 상수와 추상 메서드만 선언할 수 있는, 말 그대로 '껍데기'라고만 알고 있었다. 그런데 오늘 &lt;u&gt;&lt;b&gt;인터페이스에도 구현된 메서드, 즉 static과 default 메서드를 정의할 수 있다&lt;/b&gt;&lt;/u&gt;는 사실을 처음 알게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oANbe/btsNw7pK4gc/KpzTT2CrT8naNmTZZ5qNK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oANbe/btsNw7pK4gc/KpzTT2CrT8naNmTZZ5qNK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oANbe/btsNw7pK4gc/KpzTT2CrT8naNmTZZ5qNK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoANbe%2FbtsNw7pK4gc%2FKpzTT2CrT8naNmTZZ5qNK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;655&quot; height=&quot;220&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;처음 알게 된 개념이어서 궁금한 점이 많았고, 여러 자료를 찾아보며 공부한 내용을 이 글에 정리해 보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;결과부터 말하자면, 이전에는 내가 알던 대로 인터페이스에는 무조건 추상 메서드만 쓸 수 있었다. 하지만, 자바 8부터는 완성된 default 메서드와 static 메서드를 쓸 수 있게 된 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;우선 인터페이스에서의 default 메서드와 static 메서드에 대해&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;1. 호출 방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;2. 오버라이딩 가능 여부&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;3. 사용하는 이유&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;에 대해 간단히 설명한 후,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt; 인터페이스에서 default 메서드와 static 메서드를 어떻게 사용하고 있는지 예시 코드를 보면서 설명해 보겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;1. 호출 방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;- default 메서드의 경우 car.turnOnLights()와 같이 인스턴스로 메서드를 호출한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;- static 메서드의 경우 Car.companyInfo()와 같이 인터페이스명으로 메서드를 호출한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;2. 오버라이딩 가능 여부&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;- default 메서드는 오버라이딩이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;- static 메서드는 오버라이딩이 불가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;--&amp;gt; 아래 예시 코드 설명할 때 자세히 설명 예정.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;3. 사용하는 이유&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;- 인터페이스 구현 클래스에 기본 동작 제공&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;- 도구성, 유틸리티 메서드 제공&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;예시 코드&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ci69G3/btsNwLnFySO/6nh6BcbguY2qsMzA84VC0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ci69G3/btsNwLnFySO/6nh6BcbguY2qsMzA84VC0k/img.png&quot; data-alt=&quot;Car Interface&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ci69G3/btsNwLnFySO/6nh6BcbguY2qsMzA84VC0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fci69G3%2FbtsNwLnFySO%2F6nh6BcbguY2qsMzA84VC0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;712&quot; height=&quot;343&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Car Interface&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 Car 인터페이스를 보면 추상 메서드, default 메서드, static 메서드가 정의되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 &lt;b&gt;추상 메서드&lt;/b&gt;는 상속받은 클래스에서 반드시 구현해야 하는 메서드이고, &lt;b&gt;default 메서드&lt;/b&gt;는 이미 구현이 되어 있어 Car의 공통 동작을 제공하지만, 원한다면 Override 하여 구현 내용을 바꿀 수 있다. 마지막으로, &lt;b&gt;static 메서드&lt;/b&gt;는 클래스처럼 공통으로 사용하는 유틸성 메서드로써, 모든 Car의 기본 틀 정도로 이해할 수 있고, default 메서드와 달리 오버라이딩을 할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 Car 인터페이스를 구현한 HyundaeCar클래스와 KiaCar클래스를 보면서 추가 설명을 해보겠다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddlP5h/btsNwtOli3j/nRmap7qMgcaZdPs5gTICTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddlP5h/btsNwtOli3j/nRmap7qMgcaZdPs5gTICTK/img.png&quot; data-alt=&quot;Car Interface를 구현한 HyundaeCar 클래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddlP5h/btsNwtOli3j/nRmap7qMgcaZdPs5gTICTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddlP5h%2FbtsNwtOli3j%2FnRmap7qMgcaZdPs5gTICTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;718&quot; height=&quot;315&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Car Interface를 구현한 HyundaeCar 클래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Car 인터페이스를 구현한 HyundaeCar 클래스를 보면, 추상 메서드인 drive의 내용을 구현한 것을 볼 수 있고, Car 인터페이스의 default 메서드 turnOnLights를 오버라이딩하여 구현 내용을 바꾼 것을 볼 수 있다. 하지만, 이 클래스에는 Car 인터페이스에는 있었던 static 메서드인 companyInfo()는 없는 것을 확인할 수 있는데, 이는 인터페이스에서 만든 static 메서드는 그 인터페이스 자체에 귀속되기 때문이다. 호출 시에도 HyundaeCar의 객체가 아닌 인터페이스 이름(Car)으로만 호출이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 Car 인터페이스를 구현한 KiaCar 클래스를 보면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lp0tC/btsNwtHAhGt/9OYcW7pawREdg3jcBl0IQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lp0tC/btsNwtHAhGt/9OYcW7pawREdg3jcBl0IQK/img.png&quot; data-alt=&quot;Car Interface를 구현한 KiaCar 클래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lp0tC/btsNwtHAhGt/9OYcW7pawREdg3jcBl0IQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLp0tC%2FbtsNwtHAhGt%2F9OYcW7pawREdg3jcBl0IQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;718&quot; height=&quot;205&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;205&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Car Interface를 구현한 KiaCar 클래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추상 메서드인 drive()는 직접 구현하였고, HyundaeCar클래스와 달리, default 메서드는 보이지 않는다. default 메서드는 직접 오버라이딩 하지 않아도 기본적으로 제공되기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 CarMain클래스를 보면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V90B6/btsNwO5b5yO/SjWKf38X9suln625k3GusK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V90B6/btsNwO5b5yO/SjWKf38X9suln625k3GusK/img.png&quot; data-alt=&quot;CarMain 클래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V90B6/btsNwO5b5yO/SjWKf38X9suln625k3GusK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV90B6%2FbtsNwO5b5yO%2FSjWKf38X9suln625k3GusK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;355&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CarMain 클래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvWCwT/btsNwStk54R/Qs7gGjOOIkervZ357e8m7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvWCwT/btsNwStk54R/Qs7gGjOOIkervZ357e8m7K/img.png&quot; data-alt=&quot;출력값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvWCwT/btsNwStk54R/Qs7gGjOOIkervZ357e8m7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvWCwT%2FbtsNwStk54R%2FQs7gGjOOIkervZ357e8m7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;187&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력값&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 메서드에 구현된 내용이 출력되는 것을 볼 수 있다. 여기서 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;주의할 점&lt;/span&gt;&lt;/b&gt;은 static 메서드인 companyInfo()는 인터페이스의 추상 메서드 drive, default 메서드 turnOnLights()를 객체를 통해 호출하는 것과 달리, 인터페이스명으로 호출한다는 것이다.&lt;/p&gt;</description>
      <category>뭐지?</category>
      <category>default 메서드</category>
      <category>Java</category>
      <category>static 메서드</category>
      <category>인터페이스</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/25</guid>
      <comments>https://curiousjung1997.tistory.com/25#entry25comment</comments>
      <pubDate>Wed, 23 Apr 2025 17:32:51 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 컬렉션 프레임워크와 Big O 표기법을 통한 간단한 성능 비교 : 개발자는 소프트웨어의 성능을 향상시키기 위해 존재한다.</title>
      <link>https://curiousjung1997.tistory.com/24</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;*본&amp;nbsp;게시물은&amp;nbsp;개인&amp;nbsp;공부를&amp;nbsp;기록하기&amp;nbsp;위해&amp;nbsp;작성하였으며,&amp;nbsp;내용에&amp;nbsp;오류가&amp;nbsp;있을&amp;nbsp;수&amp;nbsp;있음을&amp;nbsp;밝힙니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;컬렉션 프레임워크란?&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;컬렉션 : 여러 객체를 모아 놓은 것.&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프레임워크 : 표준화, 정형화된 체계적인 프로그래밍 방식&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;-&amp;gt; 컬렉션 프레임워크 : 데이터를 효율적으로 저장하고 처리하기 위한 자료구조와 알고리즘을 제공하는 Java의 표준 라이브러리.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;Collection 인터페이스 상속 계층도&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;3093&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LZIqM/btsNvgHMpDa/TiS2DiEycYSWpjXY0DrzeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LZIqM/btsNvgHMpDa/TiS2DiEycYSWpjXY0DrzeK/img.png&quot; data-alt=&quot;Collection 인터페이스 상속 계층도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LZIqM/btsNvgHMpDa/TiS2DiEycYSWpjXY0DrzeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLZIqM%2FbtsNvgHMpDa%2FTiS2DiEycYSWpjXY0DrzeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3000&quot; height=&quot;3093&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;3093&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Collection 인터페이스 상속 계층도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림은 Collection 인터페이스 상속 계층도이고, 여기서 검은색 박스는 인터페이스, 파란색 박스는 각 인터페이스를 상속받아 구현한 클래스들이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 인터페이스들에 대해 간단하게 설명하자면,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;List는 순서 O, 중복 O&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set은 순서 X, 중복 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Map은 Key, Value쌍으로 데이터를 저장하는 자료구조이며, key는 중복 X, value는 중복O&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Q) 돌발 퀴즈&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;아래의 3문장 중 어떤 문장이 틀린 문장일까요? 이유는? - 정답은 맨 아래에&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. Stack st = new Stack();&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. Queue q = new Queue();&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. Queue q = new LinkedList();&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;lt;Collection 인터페이스들을 구현한 클래스들 간단한 설명&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ArrayList&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 배열 기반 리스트&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 접근(탐색)이 빠르다.(인덱스)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 삽입/삭제는 느리다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Vector와 달리 동기화X -&amp;gt; 락(lock)을 걸 필요가 없어서 빠르게 작동하고, 코드가 가벼워짐. But 멀티스레드 환경에서 위험할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;LinkedList&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 접근(탐색)이 느리다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 삽입/삭제는 빠르다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Stack&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- LIFO 자료구조&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PriorityQueue&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 일반적인 Queue가 먼저 들어온 순서대로 나가는 것과 달리, 정해진 우선순위가 높은 값이 먼저 나가는 큐, 우선순위 큐에 저장할 객체는 필수적으로 Comparable 인터페이스를 구현해야함.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-&amp;gt; 최단거리를 구할 경우, 작업 스케줄링 등에 사용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Deque&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 양쪽 끝에서 삽입과 삭제가 가능한 자료구조.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;HashSet&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 데이터의 중복X 순서X, null값도 하나만 저장 가능.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 가장 빠르고 기본적인 Set.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 내부적으로 HashMap 사용.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 삽입/삭제/탐색 속도 빠름 : O(1) //대신 순서를 전혀 예측할 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; text-align: start;&quot;&gt; --&amp;gt; 빠른 중복 제거 필요시 사용 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Linked HashSet&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 입력한 순서를 유지하는 Set.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 속도는 HashSet보다 느림 (O(1)이지만 링크 관리 비용 존재)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; text-align: start;&quot;&gt; --&amp;gt; 순서를 유지하면서 중복 제거 할 때 사용 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;TreeSet&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 정렬된 상태를 유지하는 Set. (자동 정렬)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Comparable, Comparator 필요&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 속도는 O(log n)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; text-align: start;&quot;&gt; --&amp;gt; 정렬된 상태로 데이터를 저장하고 싶을 때 사용&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;HashMap&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 일반적인 Map 구현체.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 순서 X, key중복 X, value중복 O-&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; null key 1개, null value 여러 개 가능.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 동기화 X -&amp;gt; 스레드 안전 X&amp;nbsp; but 빠름. (여러 스레드가 동시에 접근하면 문제가 생길 수 있으나 단일 스레드 환경에서는 불필요한 lock이 없어서 훨씬 빠르다.)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Linked HashMap&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 입력 순서를 유지하는 HashMap (입력 순서 그대로 키가 유지됨)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 성능은 HashMap보다 약간 떨어짐.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; text-align: start;&quot;&gt; --&amp;gt; 입력 순서를 기억해야 할 때 사용 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;TreeMap&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Key를 기준으로 정렬된 Map (기본은 오름차순) ex)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 입력 순서에 관계없이 {1=A, 2=B, 3=C...}-&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 속도는 O(log n)으로 Map 중 가장 느림.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- null key 불가, null value는 가능.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt; &lt;span style=&quot;text-align: start;&quot;&gt;--&amp;gt; 정렬이 필요할 때 사용&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;간단한 성능 비교&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컬렉션 프레임워크의 대표적인 자료 구조인 ArrayList와 LinkedList를 &lt;b&gt;성능(실행시간) 측면&lt;/b&gt;에서 비교해 보겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(사실 성능은 시간복잡도+공간복잡도를 모두 고려해야 하지만 여기서는 시간적인 측면만 고려해서 작성하겠다.)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Big O Notation&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그전에 성능을 객관적인 수치로 비교하기 위해 필요한 개념인 &lt;b&gt;Big O Notation&lt;/b&gt;에 대해 간단히 설명하자면,&lt;b&gt; Big&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; O Notation&lt;/b&gt;은 알고리즘이나 연산이 입력 크기 n에 따라 실행시간이 얼마나 빠른지를 표현하는 수학적 도구이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를 들어, for문으로 i=1~10까지 반복한다면 10번의 연산이 필요하다. 이때 입력값의 크기 n=10이고, 연산도 총 10번이 필요하다. 즉, 입력값 n번만큼의 연산이 필요하므로 이를 Big O Notation으로 O(n)으로 표기한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그럼 for문 안에 for문이 중첩되어 있는 경우에는 어떨까? 위의&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 예시와 동일하게 입력값의 크기를 n=10이라고 하자. 즉, i가 1~10인 for문을 중첩하여 쓴 경우를 생각해 보자. 첫&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 번째 for문의 각 i마다 두 번째 for문의 i는 1~10까지 순회한다. 첫 번째 for문도 i값이 10개이므로 총 연산 수는 10의 제곱인 100이 된다. 즉, 입력값이 n일 때, n^2번만큼의 연산이 필요하므로 Big O Notation으로 O(n^2)으로 표기한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Big O Notation&lt;/b&gt;에는 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;주의해야 할 점&lt;/span&gt;&lt;/b&gt;이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;첫 번째로는 O(?)의 ?에 들어갈 식은 &lt;b&gt;최고차항만 표기하고, 계수는 항상 1&lt;/b&gt;로 한다는 것이다. 예를&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 들어, 어떤 알고리즘의 입력값의 크기가 n일 때, 연산 수가 2n^2 + 3n + 1이라고 하면, 최고차항인 2차항의 계수가 1이라는 점만 ?에 쓴다는 것이다. 따라서 이 경우에 Big O Notation은 O(2n^2)이 아닌 O(n^2)이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;두 번째는 Big O Notation에서는 &lt;b&gt;&quot;최악의 경우 시간복잡도&quot;&lt;/b&gt;를 기준으로 쓴다는 것이다. 예를&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 들어, ArrayList에 데이터를 삽입할 때, 최선의 경우는 마지막 인덱스에 데이터를 삽입하는 경우이고, 이때 단 한 번의 연산만이 필요하다. 평균적인 경우는 정중앙에 데이터를 삽입하는 경우인데, 이 경우 오른쪽 절반의 데이터들을 모두 한 칸씩 오른쪽으로 옮겨야 하므로 ArrayList의 크기가 n인 경우, (1/2)n번의 연산이 필요하다. 최악의 경우는 인덱스 0번에 데이터를 삽입하는 경우이고, 모든 데이터를 오른쪽으로 옮겨야 한다. 즉, ArrayList의 크기가 n인 경우, n번의 연산이 필요하다. 따라서 ArrayList에서 데이터를 삽입하는 경우의 시간 복잡도를 Big O Notation으로 표기하면 O(n)이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;u&gt;&lt;b&gt;Big O Notation을 왜 알아야 하는가?&lt;/b&gt;&lt;/u&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; &lt;b&gt;개발자는 소프트웨어의 성능을 향상하기 위해 존재한다&lt;/b&gt;. 여기서 말하는 SW의 성능 향상이란 프로그램의 실행시간 즉, 시간복잡도를 의미하고 이를 수학적으로 표현하는 방법이 바로 Big O Notation이다. 컬렉션 프레임워크의 존재 이유는 데이터를 얼마나 효율적으로 관리하고 처리하느냐에 있는데, 이를 Big O Notation을 통해 객관적으로 파악할 수 있기 때문이다. 컬렉션 프레임워크의 다양한 클래스들을 상황에 맞게 사용하면 SW의 성능을 향상시켜 비용을 줄일 수 있다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;따라서 우리는 주어진 문제 상황에서 어떤 자료구조를 사용하는 것이 효율적 일지에 대해 반드시 이해하고 있어야 한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;이제 이 Big O Notation을 도입하여 ArrayList와 LinkedList에서 상황 별로 어떤 자료구조가 왜 효율적인지에 대해 설명해 보겠다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;lt;ArrayList&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;1242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDCDUG/btsNu2J0RYO/ToLdZawk6jYGH8RH0YaB21/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDCDUG/btsNu2J0RYO/ToLdZawk6jYGH8RH0YaB21/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDCDUG/btsNu2J0RYO/ToLdZawk6jYGH8RH0YaB21/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDCDUG%2FbtsNu2J0RYO%2FToLdZawk6jYGH8RH0YaB21%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;1242&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;1242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;크기가 n인 ArrayList에서 데이터를 탐색하는 경우는 인덱스를 통해 단 한 번의 연산으로 가능하다. &lt;b&gt;-&amp;gt; &lt;span style=&quot;color: #009a87;&quot;&gt;O(1)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;같은 ArrayList에서 데이터를 2번 인덱스에 삽입하려는 경우, 그림의 파란색 화살표와 같이 2번부터 n번까지의 모든 데이터를 오른쪽으로 한 칸씩 밀어야 한다. 따라서 (n-2)+1번의 연산이 필요하다. 인덱스 0번에 데이터를 삽입해야 하는 최악의 경우에는 총 n+1번의 연산이 필요하다.&lt;b&gt;-&amp;gt; &lt;span style=&quot;color: #009a87;&quot;&gt;O(n)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;lt;LinkedList&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;1499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w5FmR/btsNvhtpBT5/727fBiX5w85K3UwowUixsk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w5FmR/btsNvhtpBT5/727fBiX5w85K3UwowUixsk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w5FmR/btsNvhtpBT5/727fBiX5w85K3UwowUixsk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw5FmR%2FbtsNvhtpBT5%2F727fBiX5w85K3UwowUixsk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;1499&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;1499&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;크기가 n인 LinkedList에서 데이터를 탐색하는 경우는 순차적으로 모든 노드를 순회해야 하므로 마지막 인덱스에 있는 데이터를 찾아야 하는 최악의 경우 총 n번의 연산이 필요하다.&lt;b&gt; -&amp;gt; &lt;span style=&quot;color: #009a87;&quot;&gt;O(n)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;같은 LinkedList에서 데이터를 0번과 1번 인덱스에 삽입하려는 경우, 그림의 빨간색 화살표와 같이 노드 0번의 next를 Data로 바꾸고, 노드 1번의 prev를 Data로 바꾸면 된다. 따라서 총 2번의 연산만이 필요하고, 어떤 위치에 삽입하든 항상 동일하다. &lt;b&gt;-&amp;gt; &lt;span style=&quot;color: #009a87;&quot;&gt;O(1)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;결과를 정리하면, 데이터를 탐색하는 경우는 ArrayList가 유리하고, 데이터를 삽입, 삭제하는 경우는 LinkedList가 유리하다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이처럼 어떤 자료구조를 쓰느냐에 따라 상황에 따른 효율이 크게 달라질 수 있다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;돌발퀴즈 정답 : 2번 - 인터페이스는 객체를 생성할 수 없다. 3번은 타입은 Queue이지만 LinkedList 클래스의 객체.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개인 공부/JAVA</category>
      <category>ArrayList</category>
      <category>bigO</category>
      <category>collection</category>
      <category>Java</category>
      <category>LinkedList</category>
      <category>list</category>
      <category>map</category>
      <category>Queue</category>
      <category>Set</category>
      <category>컬렉션 프레임워크</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/24</guid>
      <comments>https://curiousjung1997.tistory.com/24#entry24comment</comments>
      <pubDate>Tue, 22 Apr 2025 21:56:25 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 두 변수가 같은 값을 가지는데 왜 다르다고 나올까?</title>
      <link>https://curiousjung1997.tistory.com/23</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;*본&amp;nbsp;게시물은&amp;nbsp;개인&amp;nbsp;공부를&amp;nbsp;기록하기&amp;nbsp;위해&amp;nbsp;작성하였으며,&amp;nbsp;내용에&amp;nbsp;오류가&amp;nbsp;있을&amp;nbsp;수&amp;nbsp;있음을&amp;nbsp;밝힙니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;제목에 대한 답을 얻기 위해서는 우선, 자바에서의 &quot;동등성&quot;과 &quot;동일성&quot;에 대해 이해해야 한다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 자바를 공부하면서 &quot;동등성&quot;과 &quot;동일성&quot;, 그리고 &quot;equals 메서드&quot;와 &quot;==&quot;에 대해 들어본 적이 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서 동등하다는 것은 &quot;값&quot;이 같다는 것을 의미하고, 동일하다는 것은 &quot;주소&quot;가 같다 즉, 같은 객체를 가리킨다는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, equals 메서드는 기본적으로는 주소비교지만, 오버라이딩 시 내용 비교가 가능하고, String, Integer, List, Set, Map 등은 기본적으로 내용 비교로 오버라이딩 되어 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면, 연산자 &quot;==&quot;은 기본형인 경우에만 &quot;값&quot;을 비교하고, 이외에는 항상 &quot;주소&quot;를 비교하여 결과값을 반환한다. 기본형은 변수에 값 자체가 저장되고, 객체이면 참조형 변수에 주소가 저장되기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 코드 예시를 통해 위 내용을 자세히 설명해볼텐데, 그전에 위의 내용을 잘 이해했는지 돌발 퀴즈! (답변은 제일 아래에)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Q) int a = 10, int b = 10일 때, a.equals(b)를 하면 어떻게 될까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-----------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;lt;equals() 메서드&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, 본문에서 equals 메서드는 기본적으로 주소비교(동일 비교)라고 했었는데, 그와 관련된 예시 코드를 먼저 보여주자면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRuFQ5/btsNu48qMrj/4fb3yw09TRTM1WP7yyKRl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRuFQ5/btsNu48qMrj/4fb3yw09TRTM1WP7yyKRl1/img.png&quot; data-alt=&quot;equals 메서드는 기본적으로 동일성을 따진다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRuFQ5/btsNu48qMrj/4fb3yw09TRTM1WP7yyKRl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRuFQ5%2FbtsNu48qMrj%2F4fb3yw09TRTM1WP7yyKRl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;571&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;equals 메서드는 기본적으로 동일성을 따진다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blXJLj/btsNrsh8CZ9/MaW3KvX3NbfEqCKFAt1oT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blXJLj/btsNrsh8CZ9/MaW3KvX3NbfEqCKFAt1oT0/img.png&quot; data-alt=&quot;위 코드의 출력값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blXJLj/btsNrsh8CZ9/MaW3KvX3NbfEqCKFAt1oT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblXJLj%2FbtsNrsh8CZ9%2FMaW3KvX3NbfEqCKFAt1oT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;465&quot; height=&quot;193&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 코드의 출력값&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드와 출력값을 보면, 직접 생성한 Val 클래스의 객체 v1, v2의 값을 동일하게 10으로 초기화하였음에도 불구하고 &lt;b&gt;v1.equals(v2)&lt;/b&gt;의 값은 false가 나온다. 이는 equals 메서드가 기본적으로 &quot;값&quot;이 아닌 &quot;객체가 가리키는 주소&quot;를 의미한다는 것이다. 하지만, 코드의 11번째 줄에서 v2 = v1을 실행하고 나면 &lt;b&gt;v1.equals(v2)&lt;/b&gt;의 값이 true로 바뀐다. 이 11번째 줄에서 v2가 가리키는 객체가 v1이 가리키는 객체와 같아졌기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;하지만, equals 메서드가 항상 주소 비교(동일 비교)만 하는 것은 아니다!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;본문에서 언급했듯이 오버라이딩 시에는 내용 비교(동등 비교)도 가능하고, String, Integer, List, Set, Map과 같이 기본적으로 내용 비교(동등 비교)를 하도록 오버라이딩 된 경우도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그와 관련된 예시 코드를 보여주자면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IU2Zt/btsNvoZGCRV/HdAfagjEVKUDMBwVCrXiFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IU2Zt/btsNvoZGCRV/HdAfagjEVKUDMBwVCrXiFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IU2Zt/btsNvoZGCRV/HdAfagjEVKUDMBwVCrXiFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIU2Zt%2FbtsNvoZGCRV%2FHdAfagjEVKUDMBwVCrXiFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;685&quot; height=&quot;385&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;385&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AiIzr/btsNu2JAmih/KGHkLZpRuLGfF8b4P14Mmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AiIzr/btsNu2JAmih/KGHkLZpRuLGfF8b4P14Mmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AiIzr/btsNu2JAmih/KGHkLZpRuLGfF8b4P14Mmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAiIzr%2FbtsNu2JAmih%2FKGHkLZpRuLGfF8b4P14Mmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;472&quot; height=&quot;94&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드에서 s1과 s2는 별개의 객체이다. 즉, s1과 s2이 가리키고 있는 주소는 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;그런데도&amp;nbsp; 왜 s1.equals(s2)는 true일까?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;-&amp;gt; String 클래스는 equals 메서드를 내용 비교로 오버라이딩 해놓았기 때문!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&amp;lt;연산자 &quot;==&quot;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이번에는 연산자 &quot;==&quot;에 대한 예시 코드를 보여주면서 상황에 따른 차이를 비교해 보겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;본문에서 &quot;연산자 &quot;==&quot;은 기본형인 경우에만 &quot;값&quot;을 비교하고, 이외에는 항상 &quot;주소&quot;를 비교하여 결과값을 반환한다.&quot;라고 하였는데 이 설명에 대한 예시 코드를 보여주자면&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fgac7/btsNuCknXnP/iwkevOWsLjFbym9XWbGMDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fgac7/btsNuCknXnP/iwkevOWsLjFbym9XWbGMDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fgac7/btsNuCknXnP/iwkevOWsLjFbym9XWbGMDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFgac7%2FbtsNuCknXnP%2FiwkevOWsLjFbym9XWbGMDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;756&quot; height=&quot;402&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xkqht/btsNumvAhED/M1NmqTJShBnS57l0Wzzp41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xkqht/btsNumvAhED/M1NmqTJShBnS57l0Wzzp41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xkqht/btsNumvAhED/M1NmqTJShBnS57l0Wzzp41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXkqht%2FbtsNumvAhED%2FM1NmqTJShBnS57l0Wzzp41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;481&quot; height=&quot;163&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;163&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 코드를 보면 기본형 int형으로 초기화한 변수 a와 b는 &quot;값&quot;이 10으로 같으므로 &quot;a==b&quot;의 결과값이 true가 나왔다. 반면, Val클래스의 객체로 생성한 변수 v1과 v2는 &quot;v1==v2&quot;의 결과값이 false가 나왔다. 이 결과를 보면 본문에서 언급한 내용과 같다는 것을 알 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;정리하자면, equals() 메서드와 연산자 &quot;==&quot;은 모두 상황에 따라 &quot;값&quot;을 비교하는지, &quot;주소&quot;를 비교하는지가 달라지므로 어떤 상황에 어떤 식으로 비교하는지를 정확하게 알고 사용하는 것이 필수적이다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-----------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;돌발퀴즈 정답&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컴파일 오류가 나온다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;gt;기본형 변수는 객체의 참조형 변수와 달리 메서드를 사용할 수 없기 때문.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;+추가)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsPxsP/btsNuu1iuO1/zRqk08FLKRb2wt10Gcz4gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsPxsP/btsNuu1iuO1/zRqk08FLKRb2wt10Gcz4gK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsPxsP/btsNuu1iuO1/zRqk08FLKRb2wt10Gcz4gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsPxsP%2FbtsNuu1iuO1%2FzRqk08FLKRb2wt10Gcz4gK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1005&quot; height=&quot;168&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 경우 참조형 변수 s1과 s2가 가리키는 주소가 다를까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;gt; 같다. (String Constant Pool 때문)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;s1, s2는 new로 각각의 새로운 객체를 생성한 것이 아니다. 따라서 참조형 변수 s1이 선언될 때, 문자열 리터럴 &quot;Hello&quot;는 힙의 객체가 있는 공간이 아니라, 힙 내부의 String Pool이라는 특별한 메모리 공간에 저장된다. 이후, String s2 = &quot;Hello&quot;와 같이 같은 리터럴이 다시 등장하는 경우, &quot;Hello&quot;라는 리터럴을 String Pool에 새로 추가하는 것이 아니라 기존 풀에 있던 객체를 재사용한다. 즉, s2도 원래 있던 &quot;Hello&quot;를 가리키게 되는 것이다. 결국 s1과 s2는 같은 주소를 갖게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 int i1 = 10. int i2 = 10인 경우와는 다른 경우임에 주의해야한다. 기본형인 int는 주소가 아니라 값을 저장하기 때문에 i1, i2는 주소 자체가 존재하지 않는다.&lt;/p&gt;</description>
      <category>뭐지?</category>
      <category>==</category>
      <category>equals</category>
      <category>Java</category>
      <category>값 비교</category>
      <category>동등성</category>
      <category>동일성</category>
      <category>주소 비교</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/23</guid>
      <comments>https://curiousjung1997.tistory.com/23#entry23comment</comments>
      <pubDate>Tue, 22 Apr 2025 17:25:02 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 메서드에 값을 넘겼는데 값이 왜 안 바뀔까?</title>
      <link>https://curiousjung1997.tistory.com/22</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;*본&amp;nbsp;게시물은&amp;nbsp;개인&amp;nbsp;공부를&amp;nbsp;기록하기&amp;nbsp;위해&amp;nbsp;작성하였으며,&amp;nbsp;내용에&amp;nbsp;오류가&amp;nbsp;있을&amp;nbsp;수&amp;nbsp;있음을&amp;nbsp;밝힙니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;*본 게시물은 남궁성 강사님의 자바의 정석 교재를 참고하여 작성하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Q) 첫 번째 코드와 두 번째 코드의 출력값이 &lt;span style=&quot;color: #000000;&quot;&gt;각각 어떻게 나올까? 이유는 뭘까?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: #006dd7; text-align: start;&quot;&gt;스크롤을 내려 글을 읽으시기 전에 먼저 스스로 답을 생각해 보시길 바랍니다. &lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boIFvP/btsNsmgAYlt/cZLG9r8ZotG3yJQCe8qDRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boIFvP/btsNsmgAYlt/cZLG9r8ZotG3yJQCe8qDRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boIFvP/btsNsmgAYlt/cZLG9r8ZotG3yJQCe8qDRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboIFvP%2FbtsNsmgAYlt%2FcZLG9r8ZotG3yJQCe8qDRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;796&quot; height=&quot;583&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9wTqQ/btsNtc5p8hG/rxyBjvKEdB2fmJ7GB7lq2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9wTqQ/btsNtc5p8hG/rxyBjvKEdB2fmJ7GB7lq2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9wTqQ/btsNtc5p8hG/rxyBjvKEdB2fmJ7GB7lq2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9wTqQ%2FbtsNtc5p8hG%2FrxyBjvKEdB2fmJ7GB7lq2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;805&quot; height=&quot;466&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;첫 번째 코드의 출력값&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8b0TA/btsNtcEmiH2/a1SzjSuLeBtlBkI9NjoWR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8b0TA/btsNtcEmiH2/a1SzjSuLeBtlBkI9NjoWR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8b0TA/btsNtcEmiH2/a1SzjSuLeBtlBkI9NjoWR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8b0TA%2FbtsNtcEmiH2%2Fa1SzjSuLeBtlBkI9NjoWR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;820&quot; height=&quot;129&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;두 번째 코드의 출력값&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6NnxE/btsNrnnzfIm/Q87mKKnguJ1UKH4fy14oXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6NnxE/btsNrnnzfIm/Q87mKKnguJ1UKH4fy14oXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6NnxE/btsNrnnzfIm/Q87mKKnguJ1UKH4fy14oXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6NnxE%2FbtsNrnnzfIm%2FQ87mKKnguJ1UKH4fy14oXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1030&quot; height=&quot;124&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;두 코드의 출력값이 다르게 나오는 이유는 &lt;u&gt;change 메서드의 매개변수 타입&lt;/u&gt;이 다르기 때문이다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;-&amp;gt; 매개변수의 타입이 기본형일 때와 참조형일 때의 차이를 이해해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자바에서는 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사하여 전달한다. 매개변수가 기본형이면 값 자체가 복사되어 전달되므로, 메서드 내에서 변경해도 원본 변수(인스턴스 변수 'd.x')에는 영향이 없다. 반면, 참조형의 경우에는 '값'이 아니라 '객체의 주소'가 복사되어 전달되기 때문에, 메서드 내에서 객체의 상태를 변경하면 원본 객체에도 반영된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본형 매개변수를 가지는 change메서드가 포함된 첫 번째 예시 코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 우선 코드를 실행하면 main 메서드를 읽는다. main 메서드 내에서 Data 타입의 Data 객체를 생성하고 참조변수 d가 그 객체를 가리키게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. d.x = 10에서는 위에서 생성한 객체의 x값을 10으로 초기화한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. change(d.x)에서 change메서드가 호출되면 d.x가 change메서드의 매개변수 x에 복사된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. change메서드 내에서 x=1000을 읽으면 change메서드 내에서 x의 값을 1000으로 변경한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. 다음 메서드인 println이 실행되면, change메서드가 종료되면서 매개변수 x(로컬 변수)는 스택에서 제거된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt; 이 경우에 인스턴스 변수 d.x의 값이 변경된 것이 아니라, change메서드 내에서만 존재하는 로컬 변수 x값이 변경된 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6. 따라서 d.x값을 출력하면 변경 전과 동일한 10이 나오게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;참조형 매개변수를 가지는 change메서드가 포함된 두 번째 예시 코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. main 메서드를 읽고, Data 타입의 Data 객체 d를 생성한 후 인스턴스 변수 d.x를 10으로 초기화한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. change(d)를 호출한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 이 코드에서의 change메서드는 매개변수가 기본형이 아니라 참조형이기 때문에 '값'이 아니라 '값이 저장된 주소'를 change메서드에 넘겨준 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; -&amp;gt; 매개변수 d에 저장된 주소값으로 인스턴스 변수인 x에 접근이 가능해졌다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. change메서드 내에서 d.x=1000을 읽어서 인스턴스 변수 값을 10에서 1000으로 변경하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. 첫 번째 예시에서 change메서드 내의 로컬 변수만 변경한 것과 달리, 인스턴스 변수값을 변경하였으므로 change메서드가 종료되어 매개변수 d의 값이 스택에서 제거된 후에도 change메서드에서 변경한 값이 유효하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt; 첫 번째 예시 코드에서는 change메서드의 매개변수가 기본형이었기 때문에 변수 x에 '값 자체'를 복사만 해왔던 것과 달리, 이 두 번째 예시 코드에서는 change메서드의 매개변수가 참조형이기 때문에 변수 d에 '객체의 주소'가 저장되어 있다. 즉, main메서드의 참조변수 d와 change메서드의 참조변수 d는 같은 객체를 가리키게 된다. 따라서 change메서드의 매개변수 d로 그 객체를 참조하여 객체의 인스턴스 변수값을 변경할 수 있는 것이다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>뭐지?</category>
      <category>call by value</category>
      <category>Java</category>
      <category>기본형 매개변수</category>
      <category>변수 전달 방식</category>
      <category>참조형 매개변수</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/22</guid>
      <comments>https://curiousjung1997.tistory.com/22#entry22comment</comments>
      <pubDate>Sat, 19 Apr 2025 18:33:29 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 4주차 회고</title>
      <link>https://curiousjung1997.tistory.com/21</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;저번 주 회고 때 작성한 이번 주 목표 및 달성 여부&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;- 평일 3일 이상 남아서 공부하기&amp;nbsp;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;- 블로그 꾸준히 작성하기&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자바의 정석 배운 데까지 1회독&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 주말 중 하루 이상 나와서 공부하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 목표 구체화 시키기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;4월 18일 금요일 20:41 기준 2개는 달성했고 3개는 아직 달성하지 못했다.&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저번 주까지는 강사님 설명이 이해는 됐었는데 이번 주부터는 이해가 안 되는 부분이 생기기 시작했고 1주일 동안 꽤 많이 쌓인 것 같다. 특히, 지네릭스 부분은 너무 어려웠다. 저번 주 회고 때는 이번 주말에 일단 하루는 나와보자고 생각했었는데 나와야만 하는 상황이 돼 버렸다. 일단 내일은 꼭 학원에 나와서 지금까지 나간 진도에서 이해가 잘 안 됐던 부분들을 중점으로 책을 쭉 읽어보면서 어느 정도는 이해를 해놔야 다음 주가 있을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주를 돌아보면 저번 주보다는 낫지만 아직 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;문제점&lt;/b&gt;&lt;/span&gt;이 많이 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 우선, 시간을 효율적으로 못 쓰는 것 같다. 다음 주부터는 플래너를 작성하면서 시간을 효율적으로 쓸 수 있도록 해봐야겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또, 이번 주부터는 원래 저녁에 마치고 했던 운동을 아침 일찍 일어나서 하고, 저녁에는 남아서 공부를 하려고 했었는데 아침 일찍 일어나는 게 힘들어서 운동을 이틀밖에 하지 못 했다. 늦어도 6시 30분에는 일어나야 운동을 하고 올 수 있는데 자기 전에 딴짓도 좀 하고 폰도 좀 보고 하다 보면 보통 1시쯤은 돼서야 잠에 들었던 것 같다. 다음 주부터는 늦어도 12시 전에는 잠에 들 수 있도록 해봐야겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다음 주 목표&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 평일 4일 이상 남아서 공부하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 블로그 꾸준히 작성하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 주말에도 하루 이상 나와서 공부하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 플래너 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 매일 12시 전에 잠들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 매일 아침 일찍 일어나서 운동하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/21</guid>
      <comments>https://curiousjung1997.tistory.com/21#entry21comment</comments>
      <pubDate>Fri, 18 Apr 2025 21:02:49 +0900</pubDate>
    </item>
    <item>
      <title>[Java] p는 Child 객체인데, 왜 p.x는 Child의 변수가 아닐까?</title>
      <link>https://curiousjung1997.tistory.com/20</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오늘 아래의 연습 문제를 풀다가 이해가 되지 않는 부분이 생겨서 그 부분에 대해 공부한 후 이 글을 쓰게 되었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Q) 다음의 코드를 실행한 결과를 적으시오.&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;613&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qeBVo/btsNmHL75pO/WpYPucqRGbP9ylIHMRUJZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qeBVo/btsNmHL75pO/WpYPucqRGbP9ylIHMRUJZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qeBVo/btsNmHL75pO/WpYPucqRGbP9ylIHMRUJZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqeBVo%2FbtsNmHL75pO%2FWpYPucqRGbP9ylIHMRUJZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1027&quot; height=&quot;613&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;613&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;u&gt;내가 했던 생각&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;을 적어보자면, Parent p = new Child();에서 p가 가리키는 객체는 Parent타입이지만 Child의 객체이다. 따라서 p.x는 Child 객체의 x값이 출력돼야 하고, p.method()를 호출하면 Child 클래스의 메서드 내용이 출력돼야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;따라서 이 코드를 실행한 결과는&lt;/span&gt;&lt;/b&gt;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;p.x = 200&lt;/span&gt;&lt;/b&gt;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;child Method&lt;/span&gt;&lt;/b&gt;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;c.x = 200&lt;/span&gt;&lt;/b&gt;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;child Method&lt;/span&gt;&lt;/b&gt;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;이다.&lt;/span&gt;&lt;/b&gt;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;하지만 실제 출력 결과는 달랐다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n86a8/btsNnH7dbiA/rK22piJEWXpzroBgCKRVN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n86a8/btsNnH7dbiA/rK22piJEWXpzroBgCKRVN0/img.png&quot; data-alt=&quot;실제 출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n86a8/btsNnH7dbiA/rK22piJEWXpzroBgCKRVN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn86a8%2FbtsNnH7dbiA%2FrK22piJEWXpzroBgCKRVN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1048&quot; height=&quot;187&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실제 출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;출력의 첫 줄에서 p.x = 200이 아니라 p.x = 100이 출력되었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 출력 결과를 보고 이해가 가지 않아서 내가 뭘 모르고 있었는지, 올바른 개념은 무엇인지 궁금해져서 검색을 통해 찾아보고 GPT한테도 물어보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;여기서 얻은 결과를 정리해 보자면,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;p.method()는 내가 생각했던 대로 실제 객체가 Child이므로 child Method가 출력되는데, 그 이유는 메서드는 기본적으로 &lt;span style=&quot;color: #ef6f53;&quot;&gt;동적 바인딩(Dynamic Binding)&lt;/span&gt; 대상이므로 &lt;span style=&quot;color: #ef6f53;&quot;&gt;런타임 시점&lt;/span&gt;에 어떤 메서드를 호출할지가 결정된다. 즉, 참조 변수가 가리키고 있는 메모리 주소를 통해 실행되는 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;이와 달리, p.x에서 x는 변수(필드)인데, 변수(필드)는 항상 &lt;span style=&quot;color: #409d00;&quot;&gt;정적 바인딩(Static Binding)&lt;/span&gt; 대상이다. 즉, &lt;span style=&quot;color: #409d00;&quot;&gt;컴파일 시점&lt;/span&gt;에 어떤 멤버를 사용할지가 결정되므로 Parent 타입을 기준으로 결정되는 것이다. 따라서 p.x의 값은 Child 객체의 x값인 200이 아니라, Parent 객체의 x값인 100이 출력된 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; &lt;b&gt;Q) 여기서 컴파일 시점에 결정되면 왜 Parent타입 기준으로 결정되는 거고, 런타임 시점에 결정되면 왜 Child타입 기준으로 결정되는 거지?&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;(일반) 메서드는&lt;/b&gt;&lt;/span&gt; 자식 클래스에서 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;오버라이딩이 가능하기 때문에,&lt;/span&gt;&lt;/b&gt; 자바는 method()를 실행할 때까지 기다렸다가 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;실제 객체가 누구인지 보고 결정&lt;/span&gt;&lt;/b&gt;한다. 이것이 동적 바인딩이고, 동적 바인딩은 다형성의 핵심 개념이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;변수&lt;/b&gt;&lt;/span&gt;는 바뀌지 않기 때문에 &lt;span style=&quot;color: #8a3db6;&quot;&gt;★&lt;b&gt;타입만 보고 결정★ &lt;/b&gt;&lt;/span&gt;해도 된다. 이것이 정적 바인딩이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 컴파일 시점, 런타임 시점이라는 용어의 의미와 정적 바인딩, 동적 바인딩이라는 용어의 의미를 간단히 설명해 보자면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컴파일 시점이란?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자바 코드를 .java로 작성하고 컴파일러가 .class 파일로 바꾸는 시점.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 오타, 타입 오류 등을 잡아내는 시점.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;gt; 예를 들어, 인텔리제이에서 우리가 코드를 작성 중인 시점. 실행시키기 전에 느낌표나 빨간 줄이 뜨는 그 시점으로 이해하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;런타임 시점이란?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 코드를 실제로 실행한 다음, JVM이 돌아가는 시점.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 예외가 발생하거나 실제 객체가 메서드를 실행하는 시점.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- main() 실행 후 코드들이 동작하는 그 순간 정도로 이해하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;바인딩이란?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 어떤 메서드나 변수에 연결되는 것. 쉽게 말해, 어떤 메서드나 변수를 쓸 건지 결정하는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정적 바인딩이란?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 바인딩이 컴파일 시점에 일어나는 것. 컴파일러가 &quot;이 변수는 얘 거다!&quot; 하고 고정해버림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 적용 대상 : 필드(변수), static 메서드, final 메서드, private 메서드.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;동적 바인딩이란?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 바인딩이 런타임 시점에 일어나는 것. 즉, 코드 실행 중에 &quot;이 메서드는 실제로 어떤 객체의 것을 호출해야 하지?&quot;를 판단함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 적용 대상 : 인스턴스 메서드(일반 메서드)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>뭐지?</category>
      <category>dynamic binding</category>
      <category>Java</category>
      <category>static binding</category>
      <category>동적 바인딩</category>
      <category>런타임 시점</category>
      <category>정적 바인딩</category>
      <category>컴파일 시점</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/20</guid>
      <comments>https://curiousjung1997.tistory.com/20#entry20comment</comments>
      <pubDate>Wed, 16 Apr 2025 21:19:57 +0900</pubDate>
    </item>
    <item>
      <title>2025-04-15 Java 문제풀이</title>
      <link>https://curiousjung1997.tistory.com/19</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;*코드 개선을 위한 훈수 언제든 환영입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;3000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drU5SA/btsNlMtMFty/Lz4waWXTmqDkckgh0wewJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drU5SA/btsNlMtMFty/Lz4waWXTmqDkckgh0wewJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drU5SA/btsNlMtMFty/Lz4waWXTmqDkckgh0wewJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrU5SA%2FbtsNlMtMFty%2FLz4waWXTmqDkckgh0wewJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;3000&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 작성한 클래스에서 이전 채널의 값을 저장할 멤버변수 prevChannel을 정의하고, setChannel 메서드에서 입력받은 매개변수로 채널을 변경하기 전에 현재 채널을 prevChannel에 저장하도록 하면 gotoPrevChannel 메서드를 실행하였을 때, 이전 채널로 돌아갈 것이라 생각해서 아래와 같이 코드를 작성하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzC5Xj/btsNml90M67/1yXt54kVFpoy2EPh6vY6rK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzC5Xj/btsNml90M67/1yXt54kVFpoy2EPh6vY6rK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzC5Xj/btsNml90M67/1yXt54kVFpoy2EPh6vY6rK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzC5Xj%2FbtsNml90M67%2F1yXt54kVFpoy2EPh6vY6rK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1158&quot; height=&quot;762&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CxnbG/btsNmIQWEc2/fzq5EkKp0dklwKzFX4Oaa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CxnbG/btsNmIQWEc2/fzq5EkKp0dklwKzFX4Oaa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CxnbG/btsNmIQWEc2/fzq5EkKp0dklwKzFX4Oaa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCxnbG%2FbtsNmIQWEc2%2Ffzq5EkKp0dklwKzFX4Oaa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1236&quot; height=&quot;700&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;이렇게 코드를 작성하고 아래의 main문을 실행해 보니 원하는 출력이 나오지 않았다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGa3o2/btsNmsA0R14/nv4oWWWK2UkFoogx0cTHH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGa3o2/btsNmsA0R14/nv4oWWWK2UkFoogx0cTHH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGa3o2/btsNmsA0R14/nv4oWWWK2UkFoogx0cTHH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGa3o2%2FbtsNmsA0R14%2Fnv4oWWWK2UkFoogx0cTHH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1123&quot; height=&quot;598&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbIA6k/btsNmL084T3/4pRX9MytWjNSIMDC2kFc51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbIA6k/btsNmL084T3/4pRX9MytWjNSIMDC2kFc51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbIA6k/btsNmL084T3/4pRX9MytWjNSIMDC2kFc51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbIA6k%2FbtsNmL084T3%2F4pRX9MytWjNSIMDC2kFc51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1381&quot; height=&quot;294&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 보면 처음에 gotoPrevChannel()을 실행했을 때는 이전 채널인 Ch10으로 잘 돌아갔지만, 한 번 더 gotoPrevChannel() 메서드를 실행하니 이전 채널로 돌아가지 않고 현재 채널이 그대로 출력되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로직이 어디서 잘못됐는지 고민해보고 해결한 후 본 게시물 하단에 추가로 업로드하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;추가&amp;gt; 해결 완료. 25-04-15 16:20&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;- 기존 gotoPrevChannel() 메서드 (오류)&lt;/u&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciB3Q8/btsNmu6Gx1E/MRnek4Itv8CKx5QXxW2IZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciB3Q8/btsNmu6Gx1E/MRnek4Itv8CKx5QXxW2IZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciB3Q8/btsNmu6Gx1E/MRnek4Itv8CKx5QXxW2IZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciB3Q8%2FbtsNmu6Gx1E%2FMRnek4Itv8CKx5QXxW2IZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;772&quot; height=&quot;112&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;- 수정 후 gotoPrevChannel() 메서드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kNRAk/btsNlXaKPt3/iPahOjWSmaGEodpcdPONv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kNRAk/btsNlXaKPt3/iPahOjWSmaGEodpcdPONv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kNRAk/btsNlXaKPt3/iPahOjWSmaGEodpcdPONv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkNRAk%2FbtsNlXaKPt3%2FiPahOjWSmaGEodpcdPONv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;715&quot; height=&quot;172&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 원하는 값이 출력되지 않았을 때의 gotoPrevChannel() 메서드를 보면, 메서드를 호출하는 순간 채널 값이 prevChannel에 저장되어 있던 이전 채널값으로 업데이트는 되지만, 다음에 또 이 메서드를 실행했을 때 돌아갈 채널값을 저장하는 로직이 빠져있었다. 따라서 임시로 저장할 변수 temp를 정의하여 현재 채널과 이 메서드를 실행한 후의 채널을 모두 저장할 수 있도록 코드를 수정하였다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;특정 메서드를 한 번만 실행했을 때의 상황만 생각하면 안 된다. 연속으로 실행하거나 다른 메서드들과 이어서 사용하는 경우 등 가능한 모든 케이스를 고려해서 메서드를 작성하자!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>문제 풀이/해결 완료</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/19</guid>
      <comments>https://curiousjung1997.tistory.com/19#entry19comment</comments>
      <pubDate>Tue, 15 Apr 2025 15:39:25 +0900</pubDate>
    </item>
    <item>
      <title>2025-04-14 Java 문제 풀이</title>
      <link>https://curiousjung1997.tistory.com/18</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;*코드 개선을 위한 훈수 언제나 환영입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dltdVc/btsNjAncrEu/6UW5KQGKOQKG1IabuZwUek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dltdVc/btsNjAncrEu/6UW5KQGKOQKG1IabuZwUek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dltdVc/btsNjAncrEu/6UW5KQGKOQKG1IabuZwUek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdltdVc%2FbtsNjAncrEu%2F6UW5KQGKOQKG1IabuZwUek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3000&quot; height=&quot;4000&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;우선 문제를 읽고 CARD_NUM만큼 for문을 돌면서 cards배열에 차례대로 카드 번호와 광 여부를 넣어야겠다. 1~10이 두 번 반복되는데 그중 한 번만 num이 1, 3, 8일 때 광이여야 한다고 생각했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt; 따라서 i &amp;lt; 10인 동안 num이 1, 3, 8이면 isKwang = true가 되도록 while문을 작성했고, 그 이후에는 i가 10~19일 때, num이 1~10이 돼야 하고 isKwang은 false가 되도록 코드를 작성하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;위의 내용을 바탕으로 작성한 코드는 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;733&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tRhOt/btsNjyQu8B1/kAQkIS6ttDvHNUPSMtCbOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tRhOt/btsNjyQu8B1/kAQkIS6ttDvHNUPSMtCbOk/img.png&quot; data-alt=&quot;SutdaDeck 클래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tRhOt/btsNjyQu8B1/kAQkIS6ttDvHNUPSMtCbOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtRhOt%2FbtsNjyQu8B1%2FkAQkIS6ttDvHNUPSMtCbOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;877&quot; height=&quot;733&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;733&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SutdaDeck 클래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcijMQ/btsNkH6JuTU/v2xWGdvAbsYLXuVhGLJK1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcijMQ/btsNkH6JuTU/v2xWGdvAbsYLXuVhGLJK1k/img.png&quot; data-alt=&quot;SutdaCard 클래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcijMQ/btsNkH6JuTU/v2xWGdvAbsYLXuVhGLJK1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcijMQ%2FbtsNkH6JuTU%2Fv2xWGdvAbsYLXuVhGLJK1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;868&quot; height=&quot;598&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SutdaCard 클래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mKMtk/btsNjB0KEfi/lTW17exKKL4SJTdUdqFw1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mKMtk/btsNjB0KEfi/lTW17exKKL4SJTdUdqFw1K/img.png&quot; data-alt=&quot;SutdaMain 클래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mKMtk/btsNjB0KEfi/lTW17exKKL4SJTdUdqFw1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmKMtk%2FbtsNjB0KEfi%2FlTW17exKKL4SJTdUdqFw1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;946&quot; height=&quot;337&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SutdaMain 클래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buqFVU/btsNlm1EVh2/Y78Cu8rKgv9XUBhLD1sMz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buqFVU/btsNlm1EVh2/Y78Cu8rKgv9XUBhLD1sMz0/img.png&quot; data-alt=&quot;출력창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buqFVU/btsNlm1EVh2/Y78Cu8rKgv9XUBhLD1sMz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuqFVU%2FbtsNlm1EVh2%2FY78Cu8rKgv9XUBhLD1sMz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1381&quot; height=&quot;337&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력창&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;u&gt;**실행 순서 : SutdaDeck deck = new SutdaDeck();으로 객체를 생성하려고 할 때, 생성자 SutdaDeck()이 호출되고, 메서드를 사용하려고 하면 이때 생성된 객체 deck을 바탕으로 메서드가 호출된다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;ex) deck.shuffle();&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;이렇게 작성했더니 출력창에 아무것도 출력되지 않았습니다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드에 뭔가 오류가 있는 것 같은데 고민해 보고 해결해서 해당 게시물에 추가로 업로드하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;추가&amp;gt; 해결 완료 25-04-14 16:45&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;잘못 생각했었던 부분&lt;/u&gt;&lt;/span&gt; : SutdaDeck클래스의 SutdaDeck() 생성자 부분에서 for문을 반복해서 돌면서 i값이 하나씩 증가한다고 생각하고 while문을 작성했는데, while문 안에 i++가 없어서 i가 0에서 증가할 수 없고, 따라서 while문을 빠져나올 수 없는 상황이 발생했었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;수정한 SutdaDeck 클래스&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rHo4L/btsNlCXr6Lu/xQmFrJnFe8xCIcFX6KC7GK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rHo4L/btsNlCXr6Lu/xQmFrJnFe8xCIcFX6KC7GK/img.png&quot; data-alt=&quot;생성자 SutdaDeck() 수정 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rHo4L/btsNlCXr6Lu/xQmFrJnFe8xCIcFX6KC7GK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrHo4L%2FbtsNlCXr6Lu%2FxQmFrJnFe8xCIcFX6KC7GK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1083&quot; height=&quot;576&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;생성자 SutdaDeck() 수정 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;for문이 있다고 해서 무작정 한 바퀴 돌고 i값이 증가하겠지라고 생각하면 안된다. for문 내부에서 한 바퀴를 돌 수 있는지, 즉, for문의 종료시점까지 도달할 수 있는지를 따져보고 판단하자!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>문제 풀이/해결 완료</category>
      <category>Java</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/18</guid>
      <comments>https://curiousjung1997.tistory.com/18#entry18comment</comments>
      <pubDate>Mon, 14 Apr 2025 15:29:07 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 3주차 회고 - 무심(無心)하듯 성의(誠意)있게</title>
      <link>https://curiousjung1997.tistory.com/17</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/simlC/btsNjBlcMYG/Ed4XcHx8xGiDK8LmeDwZk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/simlC/btsNjBlcMYG/Ed4XcHx8xGiDK8LmeDwZk1/img.png&quot; data-alt=&quot;다낭 바나힐 프랑스 마을&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/simlC/btsNjBlcMYG/Ed4XcHx8xGiDK8LmeDwZk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsimlC%2FbtsNjBlcMYG%2FEd4XcHx8xGiDK8LmeDwZk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;411&quot; height=&quot;548&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다낭 바나힐 프랑스 마을&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 주말부터 이번주 화요일까지 여행을 다녀왔다. 일상으로 돌아와서는 나름 열심히 했기도 하고, 처음으로 야간에 남아서 공부도 해봤다. 이번 주부터는 그룹 스터디를 시작해서 발표 주제를 정해서 발표도 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;651&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK4D2a/btsNjL2a0Vr/drmRnTKxb4ny3hqboewiJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK4D2a/btsNjL2a0Vr/drmRnTKxb4ny3hqboewiJ1/img.png&quot; data-alt=&quot;그룹 스터디 발표&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK4D2a/btsNjL2a0Vr/drmRnTKxb4ny3hqboewiJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK4D2a%2FbtsNjL2a0Vr%2FdrmRnTKxb4ny3hqboewiJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;644&quot; height=&quot;388&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;651&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그룹 스터디 발표&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학원에 있는 시간에는 나름 열심히 했는데도 공부 시간이 아직은 조금 부족하다는 게 느껴졌고, 이번 주에 내가 뭘 했는지 돌아보니, 한 게 별로 없는 것 같다는 느낌이 들었다. 왜 그런지 생각해보니, 목표가 너무 막연해서 동기부여가 덜 됐었고 내가 뭘 하고 있는지도 모른 채 무작정 공부만 하고 있었던 것 같다. 그래서 &lt;b&gt;&lt;u&gt;구체적인 목표를 설정해야겠다&lt;/u&gt;&lt;/b&gt;고 생각했다. 우선, 장기 목표를 세우고 이를 중기(월간), 단기(주간) 목표로 나눠서 매 주 달성해나가려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 최종 목표 : 매 순간을 즐기며 재미있게, 행복하게 살기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 장기 목표 : 내년 상반기 안에 취업하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 중기 목표 : 가고 싶은 기업 구체적으로 정하고 미리 준비 하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 단기 목표(이번 주) : 자바의 정석 배운 데까지 1회독 하기, 3일 이상 남아서 공부하기, 주말 중 하루 이상 나와서 공부하기, 블로그 꾸준히 작성하기, 여기 쓴 목표들 더 구체화 시키기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;내일 학원에 가서 이번 주 자바의 정석 1회독을 위해 매일 얼마나 해야하는지 구체적으로 나누고 매일 꼭 지킬 수 있도록 하자.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 주에는 동기부여가 되도록 목표를 좀 더 구체적으로 생각해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회고를 작성하면서 지금 내 상황을 생각하다보니 영화 &amp;lt;승부&amp;gt;의 마지막 장면이 떠올랐다. 그 장면에 나오는 &lt;b&gt;무심(無心)과 성의(誠意)&lt;/b&gt;가 지금 취준생인 내가 가져야할 자세를 말해주는 것 같다. &lt;b&gt;너무 집착하지 말되, 진심을 다해 준비하자&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/17</guid>
      <comments>https://curiousjung1997.tistory.com/17#entry17comment</comments>
      <pubDate>Sun, 13 Apr 2025 22:13:05 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 2주차 회고</title>
      <link>https://curiousjung1997.tistory.com/16</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 오늘 남궁성 강사님과 과제 피드백을 진행했다. 강사님께서는 내가 제출했던 과제 프린트를 바탕으로 피드백을 해주셨고, 쓴소리도 많이 들었다. 정신이 번쩍 들었다. 아직 기초 개념 암기가 부족하고, 공부 시간 자체도 충분하지 않았던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp; 피어 세션에서도 많은 걸 느꼈다. 이미 실력이 뛰어난 학우들도 있었고, 정규 시간 이후에도 늦게까지 남아서 공부하는 분들이 생각보다 많았다. 나는 그동안 수업이 끝나면 항상 운동을 하러 가느라 남아서 공부한 적이 한 번도 없었다. 지금 생각해 보면 조금 안일했던 것 같다. 다음 주부터는 아침 시간에 운동을 하고, 야간에는 남아서 공부 시간을 더 확보할 수 있도록 노력해 봐야겠다. &lt;br /&gt;&lt;br /&gt;살면서 '그 시기에만 할 수 있는 것'들이 있었고, 그걸 하지 못 해서 후회했던 적이 많았는데 지금이 딱 그 시기인 것 같다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;이번에는&amp;nbsp;후회&amp;nbsp;없이&amp;nbsp;해보자.&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;다음 주 목표 : 이틀 이상 아침에 운동하고, 야간에 남아서 공부하기 &lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/16</guid>
      <comments>https://curiousjung1997.tistory.com/16#entry16comment</comments>
      <pubDate>Fri, 4 Apr 2025 16:32:57 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 멤버 변수(클래스 변수, 인스턴스 변수)와 지역 변수</title>
      <link>https://curiousjung1997.tistory.com/15</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;*본&amp;nbsp;게시물은&amp;nbsp;개인&amp;nbsp;공부를&amp;nbsp;기록하기&amp;nbsp;위해&amp;nbsp;작성하였으며,&amp;nbsp;내용에&amp;nbsp;오류가&amp;nbsp;있을&amp;nbsp;수&amp;nbsp;있음을&amp;nbsp;밝힙니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;변수(Variable)의 분류&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;&amp;nbsp; 변수는 선언하는 위치에 따라 멤버 변수와 지역 변수로 나뉜다. 멤버 변수는 선언 위치가 클래스 영역이고, 지역 변수는 선언 위치가 메서드나 생성자 내부이다. 멤버 변수는 다시 클래스 변수와 인스턴스 변수로 나눌 수 있는데, 클래스 변수는 모든 객체가 공통적으로 같은 속성을 가질 때 사용한다. 또한, 클래스 변수는 static 키워드를 사용하고, 객체를 생성하지 않아도 사용할 수 있다. 인스턴스 변수는 각각의 객체마다 개별적인 속성을 가질 때 사용하고, 클래스 변수와 달리 객체를 생성해야 사용할 수 있다. 지역 변수는 메서드 내에 선언되어 메서드 내에서만 사용할 수 있는 변수이며, 메서드가 종료될 때 자동으로 소멸된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;위 내용을 표로 정리하면 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qhgJI/btsM6imvuP2/DoJOMnVyv8M1FlJlysXmE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qhgJI/btsM6imvuP2/DoJOMnVyv8M1FlJlysXmE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qhgJI/btsM6imvuP2/DoJOMnVyv8M1FlJlysXmE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqhgJI%2FbtsM6imvuP2%2FDoJOMnVyv8M1FlJlysXmE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1273&quot; height=&quot;367&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;인스턴스 변수 (Instance Variable) 코드 예제&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1tvoR/btsM6ZT1wl5/o9KKkwFV9YivIfk2uBC1S1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1tvoR/btsM6ZT1wl5/o9KKkwFV9YivIfk2uBC1S1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1tvoR/btsM6ZT1wl5/o9KKkwFV9YivIfk2uBC1S1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1tvoR%2FbtsM6ZT1wl5%2Fo9KKkwFV9YivIfk2uBC1S1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;913&quot; height=&quot;600&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPmEQp/btsM8id3NWz/JK9tRQJsRQFRALZyaQe2kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPmEQp/btsM8id3NWz/JK9tRQJsRQFRALZyaQe2kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPmEQp/btsM8id3NWz/JK9tRQJsRQFRALZyaQe2kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPmEQp%2FbtsM8id3NWz%2FJK9tRQJsRQFRALZyaQe2kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;991&quot; height=&quot;199&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에 나오는 것처럼 인스턴스 변수 각 객체(인스턴스)마다 각각의 값을 가지는 변수이고, 인스턴스마다 따로 저장되므로, 하나의 객체에서 값을 바꿔도 다른 객체에는 영향을 주지 않는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;클래스 변수 (Class Variable) 코드 예제&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wsc79/btsM8EupBfj/c91W3AwfAB3DMEYknEKjo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wsc79/btsM8EupBfj/c91W3AwfAB3DMEYknEKjo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wsc79/btsM8EupBfj/c91W3AwfAB3DMEYknEKjo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWsc79%2FbtsM8EupBfj%2Fc91W3AwfAB3DMEYknEKjo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1086&quot; height=&quot;568&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSfnrj/btsM5Y2RGv8/szKBdMQYh5hzUSmdq4XaF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSfnrj/btsM5Y2RGv8/szKBdMQYh5hzUSmdq4XaF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSfnrj/btsM5Y2RGv8/szKBdMQYh5hzUSmdq4XaF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSfnrj%2FbtsM5Y2RGv8%2FszKBdMQYh5hzUSmdq4XaF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1201&quot; height=&quot;130&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드와 출력값을 보면 알 수 있듯이, 클래스 변수인 count 앞에는 static 키워드가 붙어있고, 이 변수는 모든 인스턴스가 공유한다. 위 코드에서는 생성자가 실행될 때마다 count 값이 1씩 증가하므로 출력값은 2가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;※&lt;/span&gt;이 코드를 보다가 갑자기 &lt;b&gt;궁금한 점&lt;/b&gt;이 생겼다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q) count++ 같은 실행문은 main 메서드 안에 써야하는거 아닌가? 메인 메서드 밖에서는 선언만 가능한 거 아닌가? 왜 main문 밖에 써도 오류 없이 실행이 되는 거지?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 실행문 count++는 현재 생성자 안에 쓰여있다. &lt;u&gt;생성자도 메서드의 한 종류&lt;/u&gt;이므로, 그 안에서는 실행문을 자유롭게 쓸 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;지역 변수 (Local Variable) 코드 예제&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YX1XX/btsM6bAINK3/GYBPTI8r4p5PI8wFstN1K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YX1XX/btsM6bAINK3/GYBPTI8r4p5PI8wFstN1K0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YX1XX/btsM6bAINK3/GYBPTI8r4p5PI8wFstN1K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYX1XX%2FbtsM6bAINK3%2FGYBPTI8r4p5PI8wFstN1K0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;937&quot; height=&quot;565&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PPlEI/btsM6o0Sbw0/GX7hw705MeEzO0DqlqOz10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PPlEI/btsM6o0Sbw0/GX7hw705MeEzO0DqlqOz10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PPlEI/btsM6o0Sbw0/GX7hw705MeEzO0DqlqOz10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPPlEI%2FbtsM6o0Sbw0%2FGX7hw705MeEzO0DqlqOz10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;994&quot; height=&quot;181&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;308&quot; data-start=&quot;271&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;308&quot; data-start=&quot;271&quot; data-ke-size=&quot;size16&quot;&gt;위 코드와 출력값을 보면 add라는 메서드 내에서 사용되는 result라는 지역 변수가 있다. 이 메서드를 main문 내에서 실행시키면 add 메서드 내에서 계산된 결과인 8이 출력된다는 것을 알 수 있다. 이 지역 변수는 메서드나 블록 내부에서 선언되는 변수이므로 해당 블록을 벗어나면 소멸된다. 위 코드를 보면 add 메서드를 호출한 이후의 result값은 add 메서드의 result와 별개라는 것을 알 수 있다. 이러한 특징들 때문에 지역 변수는 보통 일시적인 계산, 임시 저장, 반복 변수 등에 사용된다.&amp;nbsp;&lt;/p&gt;</description>
      <category>개인 공부/JAVA</category>
      <category>CV</category>
      <category>IV</category>
      <category>Java</category>
      <category>LV</category>
      <category>static</category>
      <category>멤버 변수</category>
      <category>변수</category>
      <category>인스턴스 변수</category>
      <category>지역 변수</category>
      <category>클래스 변수</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/15</guid>
      <comments>https://curiousjung1997.tistory.com/15#entry15comment</comments>
      <pubDate>Thu, 3 Apr 2025 15:37:17 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 자바 메서드 선언 (접근자, static, 반환 타입)</title>
      <link>https://curiousjung1997.tistory.com/14</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;*본&amp;nbsp;게시물은&amp;nbsp;개인&amp;nbsp;공부를&amp;nbsp;기록하기&amp;nbsp;위해&amp;nbsp;작성하였으며,&amp;nbsp;내용에&amp;nbsp;오류가&amp;nbsp;있을&amp;nbsp;수&amp;nbsp;있음을&amp;nbsp;밝힙니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;메서드 (Method)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드는 객체의 기능을 구현하기 위해 클래스 내부에 작성하는 함수이다. 즉, 특정한 기능을 수행하는 코드들을 하나로 묶은 것이라고 할 수 있다. 메서드는 크게 선언부(Head)와 구현부(Body)로 나뉘고, 호출하여 사용한다. 메서드는 입력값, 출력값이 있을 수도 있고 없을 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서는 메서드를 선언할 때, public static void 메서드 명 { 메서드 내용 }, void 메서드 명 { 메서드 내용 }과 같이 선언한다. 여기서 선언부의 메서드 명 앞에 붙어 있는 public, static, void와 같은 것들이 무엇인지 대충은 알고 있었지만, 이 개념에 대해 누가 물어봤을 때 설명할 수 있을 정도로 정확히 아는 정도는 아니었기에, 지금부터라 정확히 알고 써야겠다는 생각으로 메서드에 대해 학습한 후 정리하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;메서드 형식&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;(접근자) + (static 여부) + 반환 타입 + 메서드 명(매개 변수) { 메서드 내용 }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, protected static void volumeUp() { ~ } 과 같은 메서드가 있다면 접근자는 protected, static여부 (O), 아무것도 반환하지 않음, 메서드 명 : volumeUp, 매개 변수 없음.으로 이해할 수 있다. 이어지는 내용에서는 접근자, static, 반환 타입에 대해 자세히 정리해 보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;접근자&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접근자에는 접근 가능 범위가 넓은 순으로 public, protected, (default), private이 있고, 접근자 생략하면 default에 해당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 접근자의 접근 가능 범위를 표로 정리하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcupc1/btsM4dTfJrd/42BAIQ85mTCz3w3RQWHSF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcupc1/btsM4dTfJrd/42BAIQ85mTCz3w3RQWHSF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcupc1/btsM4dTfJrd/42BAIQ85mTCz3w3RQWHSF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcupc1%2FbtsM4dTfJrd%2F42BAIQ85mTCz3w3RQWHSF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;883&quot; height=&quot;420&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 나타낼 수 있다. 예를 들어, 접근자를 쓰지 않은 경우, 다른 패키지에 있는 클래스에서는 메서드가 정의된 클래스를 상속받았더라도 해당 메서드에 접근할 수 없다는 의미이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;static 여부&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, &lt;u&gt;static이 있는 경우&lt;/u&gt;에는 해당 메서드를 호출할 때, 객체 생성 없이 호출이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;예시 코드&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class Utils {
    public static void printHello() {
        System.out.println(&quot;Hello!&quot;);
    }
}

// 호출
Utils.printHello(); // O (객체 생성 없이 호출 가능)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면, &lt;u&gt;static이 없는 경우&lt;/u&gt;에는 해당 메서드를 호출할 때, 객체를 생성해야만 호출이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;예시 코드&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class Person {
    public void sayName() {
        System.out.println(&quot;My name is Jung.&quot;);
    }
}

// 호출
Person p = new Person();
p.sayName(); // O (객체 생성 필요)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;**참고) main 메서드는 객체가 생성되기도 전에 먼저 실행돼야하므로 main 메서드 내에서는 static 메서드만 호출 가능하다!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;반환 타입&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반환 타입으로는 아무것도 반환하지 않는 void, int, String, boolean와 같은 기본형도 있고, &lt;span style=&quot;color: #ee2323;&quot;&gt;배열이나 객체도 반환이 가능&lt;/span&gt;하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;예시 코드&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. void&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public void printHello() {
    System.out.println(&quot;Hello&quot;);
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. int&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;public int add(int a, int b) {
    return a + b;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우처럼 반환값이 있는 경우에는 그 반환값을 담을 변수를 선언하여 변수 안에 반환값을 담거나 바로 써도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 반환값을 담을 변수를 선언한 경우&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;// add 메서드가 static이 아닌 경우 (인스턴스 생성 후 호출)
Calculator calculator = new Calculator();
int result = calculator.add(3, 5);
System.out.println(&quot;결과: &quot; + result);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 바로 쓴 경우&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;System.out.println(calculator.add(3, 5));
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개인 공부/JAVA</category>
      <category>Java</category>
      <category>public static void</category>
      <category>메서드 선언</category>
      <category>접근자</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/14</guid>
      <comments>https://curiousjung1997.tistory.com/14#entry14comment</comments>
      <pubDate>Wed, 2 Apr 2025 17:10:02 +0900</pubDate>
    </item>
    <item>
      <title>2025-04-01 Java 문제 풀이</title>
      <link>https://curiousjung1997.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;*코드 개선을 위한 훈수 언제나 환영 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mJFJI/btsM3GHsCTs/KJ8GlnWCY9fJOYRJT8kjrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mJFJI/btsM3GHsCTs/KJ8GlnWCY9fJOYRJT8kjrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mJFJI/btsM3GHsCTs/KJ8GlnWCY9fJOYRJT8kjrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmJFJI%2FbtsM3GHsCTs%2FKJ8GlnWCY9fJOYRJT8kjrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4032&quot; height=&quot;3024&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1471&quot; data-origin-height=&quot;1030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HPsX1/btsM3plnX4x/mcwCHWERaKEGeBT5hF6Rs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HPsX1/btsM3plnX4x/mcwCHWERaKEGeBT5hF6Rs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HPsX1/btsM3plnX4x/mcwCHWERaKEGeBT5hF6Rs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHPsX1%2FbtsM3plnX4x%2FmcwCHWERaKEGeBT5hF6Rs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1471&quot; height=&quot;1030&quot; data-origin-width=&quot;1471&quot; data-origin-height=&quot;1030&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGrqBO/btsM21yzjAY/DkugzCVkS8TKUi9MzYmtg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGrqBO/btsM21yzjAY/DkugzCVkS8TKUi9MzYmtg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGrqBO/btsM21yzjAY/DkugzCVkS8TKUi9MzYmtg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGrqBO%2FbtsM21yzjAY%2FDkugzCVkS8TKUi9MzYmtg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1372&quot; height=&quot;456&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmn5zt/btsM5l9TNOX/MaZFdkhvVsMMdBCP2NOx1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmn5zt/btsM5l9TNOX/MaZFdkhvVsMMdBCP2NOx1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmn5zt/btsM5l9TNOX/MaZFdkhvVsMMdBCP2NOx1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmn5zt%2FbtsM5l9TNOX%2FMaZFdkhvVsMMdBCP2NOx1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;849&quot; height=&quot;187&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열이 주어진 상황에서 배열 내의 값들을 정렬하고, 중복까지 제거해 보는 문제를 풀어보았습니다.&lt;/p&gt;</description>
      <category>문제 풀이/해결 완료</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/13</guid>
      <comments>https://curiousjung1997.tistory.com/13#entry13comment</comments>
      <pubDate>Tue, 1 Apr 2025 17:02:11 +0900</pubDate>
    </item>
    <item>
      <title>2025-04-01 Java 문제 풀이</title>
      <link>https://curiousjung1997.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;*코드 개선을 위한 훈수 언제나 환영입니다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddjRNO/btsM4eKneHl/k9O2J5kzSJqfYKb6Ue1r2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddjRNO/btsM4eKneHl/k9O2J5kzSJqfYKb6Ue1r2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddjRNO/btsM4eKneHl/k9O2J5kzSJqfYKb6Ue1r2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddjRNO%2FbtsM4eKneHl%2Fk9O2J5kzSJqfYKb6Ue1r2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4032&quot; height=&quot;3024&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;1228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bihWvO/btsM2WwZtv6/qmydsN1KEttNiAeyqSusr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bihWvO/btsM2WwZtv6/qmydsN1KEttNiAeyqSusr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bihWvO/btsM2WwZtv6/qmydsN1KEttNiAeyqSusr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbihWvO%2FbtsM2WwZtv6%2FqmydsN1KEttNiAeyqSusr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1252&quot; height=&quot;1228&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;1228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NK54z/btsM3Z7QrGj/eRJ1S0Cy3e3k6IYZTv5phk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NK54z/btsM3Z7QrGj/eRJ1S0Cy3e3k6IYZTv5phk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NK54z/btsM3Z7QrGj/eRJ1S0Cy3e3k6IYZTv5phk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNK54z%2FbtsM3Z7QrGj%2FeRJ1S0Cy3e3k6IYZTv5phk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1003&quot; height=&quot;196&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 우선 이렇게 코드를 짰는데 이 코드는 랜덤으로 수를 뽑을 때, 두 번 이상 같은 수가 나오는 경우를 처리하지 못하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 첫 번째로 2를 뽑고 두 번째로 2를 뽑았다면 if문에 걸려서 랜덤한 수를 다시 뽑게 되지만, 여기서 한 번 더 2를 뽑았다면 어쩔 수 없이 중복이 생기게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 오류는 고민해보고 늦어도 내일까지는 해결해서 아래에 추가하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;lt;추가&amp;gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sXTnm/btsM4TFQPpa/Xr1NNsshhCyfuK4iRzbU0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sXTnm/btsM4TFQPpa/Xr1NNsshhCyfuK4iRzbU0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sXTnm/btsM4TFQPpa/Xr1NNsshhCyfuK4iRzbU0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsXTnm%2FbtsM4TFQPpa%2FXr1NNsshhCyfuK4iRzbU0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3000&quot; height=&quot;4000&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c66Y1q/btsM3EJKZt2/rtoBZnYaQlQktZV3rp5YK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c66Y1q/btsM3EJKZt2/rtoBZnYaQlQktZV3rp5YK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c66Y1q/btsM3EJKZt2/rtoBZnYaQlQktZV3rp5YK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc66Y1q%2FbtsM3EJKZt2%2FrtoBZnYaQlQktZV3rp5YK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1021&quot; height=&quot;661&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;661&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0qDFm/btsM4rivhaI/SUF2ziurtdUX4cH5ZJpcx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0qDFm/btsM4rivhaI/SUF2ziurtdUX4cH5ZJpcx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0qDFm/btsM4rivhaI/SUF2ziurtdUX4cH5ZJpcx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0qDFm%2FbtsM4rivhaI%2FSUF2ziurtdUX4cH5ZJpcx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;541&quot; height=&quot;190&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 코드를 수정했는데 아까 발생한 바로 이전 요소와 중복되는 문제는 해결됐지만, 여러 번 돌려보니 모든 요소에서의 중복은 해결되지 않았다. -&amp;gt; 바로 이전 요소와의 비교만 할 게 아니라 모든 요소와 비교해서 중복 체크를 해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;lt;추가&amp;gt; (해결 완료) 25-04-01 18:47&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1519&quot; data-origin-height=&quot;1158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d283Kx/btsM5PQloLF/ks9rMwJJS1YKTvra472B51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d283Kx/btsM5PQloLF/ks9rMwJJS1YKTvra472B51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d283Kx/btsM5PQloLF/ks9rMwJJS1YKTvra472B51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd283Kx%2FbtsM5PQloLF%2Fks9rMwJJS1YKTvra472B51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1519&quot; height=&quot;1158&quot; data-origin-width=&quot;1519&quot; data-origin-height=&quot;1158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1332&quot; data-origin-height=&quot;1087&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUuIms/btsM2xj2tM6/4F5rJdabMk1tFWCNrAiDTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUuIms/btsM2xj2tM6/4F5rJdabMk1tFWCNrAiDTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUuIms/btsM2xj2tM6/4F5rJdabMk1tFWCNrAiDTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUuIms%2FbtsM2xj2tM6%2F4F5rJdabMk1tFWCNrAiDTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1332&quot; height=&quot;1087&quot; data-origin-width=&quot;1332&quot; data-origin-height=&quot;1087&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mr3Lz/btsM5Uc2Nmz/IXCQCIyqb2ld95KkNQi1s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mr3Lz/btsM5Uc2Nmz/IXCQCIyqb2ld95KkNQi1s0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mr3Lz/btsM5Uc2Nmz/IXCQCIyqb2ld95KkNQi1s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMr3Lz%2FbtsM5Uc2Nmz%2FIXCQCIyqb2ld95KkNQi1s0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1207&quot; height=&quot;328&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/emochQ/btsM2xRRT4K/g53yT7WtGVEA0IwfZPbzr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/emochQ/btsM2xRRT4K/g53yT7WtGVEA0IwfZPbzr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/emochQ/btsM2xRRT4K/g53yT7WtGVEA0IwfZPbzr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FemochQ%2FbtsM2xRRT4K%2Fg53yT7WtGVEA0IwfZPbzr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1342&quot; height=&quot;208&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for문을 이용하여 랜덤으로 뽑은 수가 배열 내의 모든 수와 같은지를 비교하는 로직을 추가하여 이전에 발생한 중복 문제를 해결하였습니다.&lt;/p&gt;</description>
      <category>문제 풀이/해결 완료</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/12</guid>
      <comments>https://curiousjung1997.tistory.com/12#entry12comment</comments>
      <pubDate>Tue, 1 Apr 2025 16:51:23 +0900</pubDate>
    </item>
    <item>
      <title>부트캠프 1주차 회고</title>
      <link>https://curiousjung1997.tistory.com/11</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 수능을 준비 할 때는 매일 플래너를 작성하고 하루하루를 돌아보며 공부했던 적이 있지만, 개발 관련해서는 회고를 처음 작성해 보는 거라 어떤 내용을 어떤 식으로 작성하는 것이 좋을지 아직은 잘 모르겠다. 하지만 회고의 목적이 '나의 발전'이라는 것은 분명 알고 있다. 수능 공부를 했을 때도 무작정 공부만 했을 때보다 나의 부족한 점을 파악하고, 어떻게 해야 그 부분을 보완할 수 있을까에 대해 고민하는 시간을 가졌을 때가 성적이 훨씬 많이 올랐었고 이때 회고의 중요성을 깨달았었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이전에 과외를 하면서도 학생들에게 무작정 문제를 많이 풀기만 한다고 되는 것이 아니다. 문제를 풀었으면 반드시 피드백을 해야한다고 지도를 했었는데 이제는 내가 학생의 입장이 되어 배우고 익히고 돌아봐야 하는 상황이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 회고를 어떤 식으로 작성할지는 아직 고민중이지만 학생들에게 효율적이라 생각해서 시켰던 방식을 사용해 보면 어떨까 하는 생각이 든다. 적을 알고 나를 알면 백 번 싸워도 위태롭지 않다는 말이 있듯이, 내가 그 주에 해결하지 못 한 문제나 이해하지 못 한 개념이 생길 때마다&amp;nbsp; 회고에 써놓고, 그 문제나 개념을 이해하기 위해 앞으로 내가 어떤 부분을 보충해야 하는지, 해결했다면 어떻게 했고 그 문제나 개념이 왜 어려웠는지에 대해 한 주를 마무리하며 쓰는 방식이다. 정리하자면, 각 주마다 공부를 하면서 겪은 어려움과 내가 부족했던 점에 대해 분석하고, 어떻게 하면 내가 발전할 수 있을까에 대해 고민해서 글로 써본다 정도로 생각하면 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 교육 첫 주라 매일 일찍 일어나고 일찍 자는 게 조금 힘들긴 했지만 나름 재미도 있고 보람찬 한 주 였다. 다음 주에는 공부도 운동도 이번 주보다 더 발전할 수 있도록 더 열심히 해야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+ 다음 주에는 더 정량적이고 구체적인 목표를 써보면 좋을 것 같다.&lt;/p&gt;</description>
      <category>부트캠프 회고/주간 회고</category>
      <category>회고</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/11</guid>
      <comments>https://curiousjung1997.tistory.com/11#entry11comment</comments>
      <pubDate>Sun, 30 Mar 2025 23:58:16 +0900</pubDate>
    </item>
    <item>
      <title>Git 헷갈리는 명령어 (reset, revert, rebase)</title>
      <link>https://curiousjung1997.tistory.com/10</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;*본&amp;nbsp;게시물은&amp;nbsp;개인&amp;nbsp;공부를&amp;nbsp;기록하기&amp;nbsp;위해&amp;nbsp;작성하였으며,&amp;nbsp;내용에&amp;nbsp;오류가&amp;nbsp;있을&amp;nbsp;수&amp;nbsp;있음을&amp;nbsp;밝힙니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;git reset&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- git reset은 변경 사항을 취소하는 데 사용한다. 즉, 이전 커밋으로 되돌릴 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용 형식 : git reset --(모드) (돌아갈 커밋)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모드 인자로는 soft, mixed, hard를 사용한다. (디폴트로 mixed를 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 차이 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--soft : 커밋은 취소되지만, 스테이징 상태는 유지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--mixed : 커밋과 스테이징이 모두 취소되지만, 로컬 변경 상태는 유지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--hard :&amp;nbsp; 커밋, 스테이징, 로컬 변경 상태를 모두 취소한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용 예시 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git reset --hard HEAD~1 (최근 커밋 하나를 삭제하고 변경 내용도 함께 제거)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git reset --hard HEAD~2 (최근 커밋 2개를 삭제하고 변경 내용도 함께 제거)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;git revert&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- git revert도 변경을 되돌릴 때 사용한다. reset 명령어와의 차이점은 revert 명령어는 특정 커밋으로 돌아가는 역할을 수행한다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용 형식 : git revert (돌아갈 커밋)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용 예시 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git revert HEAD (가장 최근 커밋을 무효화하는 새 커밋을 만든다. 원본 커밋은 그대로 남고, 변경사항만 되돌려진다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git revert a1b2c3d (a1b2c3d는 되돌리고 싶은 커밋의 해시값. 해당 커밋 내용만 취소하는 새 커밋이 만들어진다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git revert HEAD~3..HEAD (최근 3개의 커밋 HEAD~3부터 HEAD까지)을 한 번에 revert 하고 커밋마다 되돌리는 커밋이 따로 만들어진다. (reset 명령어와 달리 HEAD~2..HEAD처럼 범위 지정을 지원한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;git rebase&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 명령어는 단어 뜻 그대로 base를 재설정하는 명령어이다. 이 명령어는 이해하기 조금 어려웠기에 예시를 들어 충돌이 일어나는 경우까지 설명해보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, sports라는 브랜치에서 s1, s2, s3이라는 커밋을 한 후, 이 s3 커밋을 base로 하여 football이라는 브랜치로 작업을 진행한다고 할 때, football 브랜치에서 f1, f2, f3 커밋을 하였고, sports 브랜치에서는 s3에 이어서 s4, s5, s6 커밋을 한 상황을 생각해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커밋 f1~f3은 커밋 s3을 base로 하여 자신의 브랜치에서만 작업을 한 것이므로 충돌이 일어나지 않지만, 만약 football 브랜치에서 rebase를 사용하여 커밋 s6을 base로 재설정하는 경우, 커밋 f1~f3과 s4~s6에서 같은 줄을 수정하면 충돌이 일어날 수 있다. 이 경우에는 우선 충돌 파일을 열고 원하는 코드로 수정하여 충돌을 해결한 후,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; git add &amp;lt;해결한 파일&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; git rebase --continue&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 명령어를 실행하면 football 브랜치의 커밋들이 s6 위에 재배치된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이해하기 쉽도록 모식도를 그려보면 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;rebase 전&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KN2mh/btsMYl4yVbP/SDhPL5jw8g9Jaj6scPlY3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KN2mh/btsMYl4yVbP/SDhPL5jw8g9Jaj6scPlY3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KN2mh/btsMYl4yVbP/SDhPL5jw8g9Jaj6scPlY3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKN2mh%2FbtsMYl4yVbP%2FSDhPL5jw8g9Jaj6scPlY3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;412&quot; height=&quot;178&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;rebase 후&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image (1).png&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxdjSR/btsMYH69uHb/RTbWEwjAk7GGK7vP8CnayK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxdjSR/btsMYH69uHb/RTbWEwjAk7GGK7vP8CnayK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxdjSR/btsMYH69uHb/RTbWEwjAk7GGK7vP8CnayK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxdjSR%2FbtsMYH69uHb%2FRTbWEwjAk7GGK7vP8CnayK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;595&quot; height=&quot;145&quot; data-filename=&quot;image (1).png&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;rebase 실행 순서 및 명령어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;sports 브랜치에서 s1~s3커밋 작성&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;football 브랜치에서 s3 커밋을 base로 하여 f1~f3 커밋 작성&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;sports 브랜치에서는 s3에 이어서 s4~s6 커밋 작성&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; git checkout sports (sports 브랜치로 이동)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; git pull origin sports (최신 sports 받기)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; git checkout football (football 브랜치로 이동)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; git rebase sports (sports를 base로 rebase 명령어 실행)&lt;/p&gt;</description>
      <category>개인 공부</category>
      <category>git 명령어</category>
      <category>rebase</category>
      <category>Reset</category>
      <category>revert</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/10</guid>
      <comments>https://curiousjung1997.tistory.com/10#entry10comment</comments>
      <pubDate>Sat, 29 Mar 2025 14:47:18 +0900</pubDate>
    </item>
    <item>
      <title>자주 쓰는 GitHub 명령어 및 리눅스 명령어</title>
      <link>https://curiousjung1997.tistory.com/9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;*본&amp;nbsp;게시물은&amp;nbsp;개인&amp;nbsp;공부를&amp;nbsp;기록하기&amp;nbsp;위해&amp;nbsp;작성하였으며,&amp;nbsp;내용에&amp;nbsp;오류가&amp;nbsp;있을&amp;nbsp;수&amp;nbsp;있음을&amp;nbsp;밝힙니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;GitHub 명령어&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git status : 현재 브랜치의 변경사항 확인.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git log : 현재 브랜치의 버전 내역을 확인.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git clone [URL] : 원격 저장소 복제.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git diff : 아직 스테이징 되지 않은 변경 내용을 비교해서 보여줌. 어떤 라인을 바꿨는지 확인할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git add . : 모든 파일 추적 및 스테이징.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git commit -m &quot;메시지 내용&quot; : 커밋 및 커밋 메시지 생성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git push origin [브랜치명] : 로컬 저장소의 '브랜치명'에 해당하는 브랜치의 커밋 내용을 원격 저장소(origin)로 푸시.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git pull : 원격 저장소에서 브랜치 가져오기.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git init : 새로운 Git 저장소를 초기화하는 명령어 &amp;rarr; 현재 디렉터리에&amp;nbsp; .git/ 폴더가 생기고, 이 폴더 안에 Git이 관리할 모든 정보가 담김. 이제부터 이 폴더는 Git으로 버전 관리가 가능해짐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git remote add origin [URL] : 원격 저장소의 위치를 내 로컬 저장소에 연결해 주는 명령어 &amp;rarr; origin은 원격 저장소의 별명. 이후에 git push origin main 같은 식으로 이 별명을 사용해 푸시할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git fetch : 원격 저장소(origin)에서 최신 브랜치와 커밋 기록을 가져오는 것(코드를 바로 병합하거나 변경하지는 않음). fetch는 가져오기만 하고 내 현재 작업 디렉터리는 그대로 유지됨. 원격 저장소에 어떤 브랜치가 있는지, 최신 상태는 어떤지 확인할 때 유용함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git branch : 현재 로컬 브랜치 목록을 보여줌.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git branch [브랜치명] : 새로운 로컬 브랜치 생성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git checkout -b [브랜치명] : 새 브랜치를 만들고 동시에 그 브랜치로 이동.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git checkout [브랜치명] : 기존에 있던 브랜치로 이동.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git branch -d [브랜치명] : 로컬 브랜치 삭제.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리눅스 명령어&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mkdir 폴더명 : 새 폴더 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cd 경로 : 폴더 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cd .. : 상위 폴더로 이동. 현재 위치에서 한 단계 위로 감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cd ~ : 홈 디렉터리로 이동. 내 계정의 기본 위치.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ls : 현재 폴더 안에 뭐가 있는지 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ls -l : 파일/폴더 리스트를 자세히 보여줌 (권한, 날짜, 용량 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ls -a : 숨겨진 파일도 포함해서 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pwd : 현재 내가 있는 경로를 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;touch 파일명 : 새 빈 파일 만들기 ex) touch aaa.txt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rm 파일명 : 파일 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rm -r 폴더명 : 폴더와 그 안의 내용까지 삭&lt;/p&gt;</description>
      <category>개인 공부</category>
      <category>GIT</category>
      <category>git 명령어</category>
      <category>리눅스 명령어</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/9</guid>
      <comments>https://curiousjung1997.tistory.com/9#entry9comment</comments>
      <pubDate>Fri, 28 Mar 2025 15:20:51 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 추상 클래스와 인터페이스</title>
      <link>https://curiousjung1997.tistory.com/8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;*본 게시물은 마이자몽님의 블로그를 참고하여 작성하였으며, 글 하단에 출처를 기록해 두었음을 밝힙니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;*본&amp;nbsp;게시물은&amp;nbsp;개인&amp;nbsp;공부를&amp;nbsp;기록하기&amp;nbsp;위해&amp;nbsp;작성하였으며,&amp;nbsp;내용에&amp;nbsp;오류가&amp;nbsp;있을&amp;nbsp;수&amp;nbsp;있음을&amp;nbsp;밝힙니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;본인은 지금까지 추상 클래스와 인터페이스에 대해 대충은 알고있었지만 정확히 언제, 왜 사용하는지를 알지 못했었다. 오늘 공부를 하다가 관련 내용이 나왔는데, 이제라도 정확히 공부해 두자라는 생각으로 GPT와 구글 검색을 통해 공부를 한 후 이 글을 작성하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;추상 클래스란?&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;추상 클래스는 클래스 선언 시 앞에 예약어 'abstract'를 붙여 선언한다. 또한, 클래스 내에 추상 메서드를 선언하여 상속을 통해 자손 클래스에서 완성하도록 유도하는 클래스이다. 추상 클래스 내의 일반 메서드는 그대로 상속받아서 사용해도 되지만, 내용이 없는 추상 메서드는 자식 클래스에서 반드시 구현을 직접 해줘야 한다. 클래스 내에 추상 메서드가 하나라도 있으면 추상 클래스이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;인터페이스란?&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;인터페이스도 추상 클래스와 유사하게 일반 클래스를 작성하는데 도움을 주는 목적으로 작성한다. 다만, 추상 클래스와 달리 다중상속이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;추상 클래스와 인터페이스의 차이&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 추상 클래스는 단일 상속만 가능하지만, 인터페이스는 다중 구현이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 추상 클래스는 생성자가 있지만 인터페이스는 생성자가 없다. (객체는 추상 클래스와 인터페이스 모두 생성할 수 없다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 추상 클래스에서는 private, protected 등의 접근 제어자를 자유롭게 사용 가능하지만 인터페이스에서는 모든 메서드는 기본적으로 public을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;추상 클래스를 사용하는 이유&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;추상 클래스는 공통 기능을 구현해놓고 하위 클래스에서 재사용하고 싶을 때 사용하여 중복 코드를 줄일 수 있다. 예를 들어 Vehicle이라는 추상 클래스에서 가속 기능과 감속 기능을 구현해 놓고 하위 클래스인 Car 클래스, Ship 클래스에서 Vehicle 클래스를 상속받아 재사용하면 Car 클래스, Ship 클래스 각각에서 가속 기능, 감속 기능을 구현하지 않아도 되므로 중복 코드를 줄일 수 있다. 또한, 상위 클래스에서는 어떻게 동작할지 알 수 없는 부분을 추상 메서드로 남겨두고, 자식 클래스가 구체적으로 구현하게 할 때 사용한다. 즉, 상위 클래스는 공통된 전체 로직의 틀만 제공하고 구체적인 동작은 하위 클래스에게 맡기는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;인터페이스를 사용하는 이유&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터페이스는 &lt;u&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;추상 클래스와 달리&lt;/span&gt; &lt;/u&gt;다중상속이 가능하다. 따라서 다중 기능을 조합하고 싶을 때는 추상 클래스가 아니라 인터페이스를 사용한다. 예를 들어 Bmw라는 클래스는 SportMode라는 기능과 Movable이라는 기능을 모두 필요하므로&amp;nbsp;public class Bmw extends Car implements SportMode, Movable { ... }에서 처럼 Car라는 추상 클래스를 상속받고, SportMode, Movable라는 2개의 인터페이스를 콤마(,)로 연결하여 다중 상속한 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 서로 다른 클래스에 공통 기능을 강제하고 싶을 때에도 인터페이스를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;**참고한 블로그**&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;마이자몽, 2020년 2월 8일,&lt;span&gt; &lt;a href=&quot;https://myjamong.tistory.com/150&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://myjamong.tistory.com/150&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>개인 공부/JAVA</category>
      <category>Java</category>
      <category>구현</category>
      <category>상속</category>
      <category>인터페이스</category>
      <category>추상클래스</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/8</guid>
      <comments>https://curiousjung1997.tistory.com/8#entry8comment</comments>
      <pubDate>Thu, 27 Mar 2025 12:28:53 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 절차지향과 객체지향의 비교</title>
      <link>https://curiousjung1997.tistory.com/7</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;*본&amp;nbsp;게시물은&amp;nbsp;인프런&amp;nbsp;김영한&amp;nbsp;강사님의&amp;nbsp;자바&amp;nbsp;강의를&amp;nbsp;참고하여&amp;nbsp;작성하였습니다. &lt;br /&gt;*본 게시물은 불곰님의 블로그를 참고하여 작성하였으며, 글 하단에 출처를 기록해두었음을 밝힙니다.&lt;br /&gt;*본&amp;nbsp;게시물은&amp;nbsp;개인&amp;nbsp;공부를&amp;nbsp;기록하기&amp;nbsp;위해&amp;nbsp;작성하였으며,&amp;nbsp;내용에&amp;nbsp;오류가&amp;nbsp;있을&amp;nbsp;수&amp;nbsp;있음을&amp;nbsp;밝힙니다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;절차지향 프로그래밍(Procedural Programming)이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;절차지향 프로그래밍이란 프로그램이 위에서부터 아래로 순차적으로 실행되도록 하는 프로그래밍 기법이다. 절차 지향 프로그래밍에서는 데이터와 기능(함수)이 따로 존재하고, 함수가 데이터를 처리하는 방식이다. 절차지향 프로그래밍은 코드가 직관적이므로 초보자가 이해하기 쉽고, 일반적으로 실행 속도가 빠른 편이다. 하지만 코드가 커지면 유지보수가 어려워질 수 있다. 정리하자면, 절차지향 프로그래밍은 &quot;어떻게&quot;를 중심으로 프로그래밍을 했다고 볼 수 있다. 대표적인 절차지향 언어로는 C언어가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향이 왜 유지보수 하기에 유리한지를 보여주기 위해, 속성과 데이터가 각각의 클래스로 존재하는 경우를 보여주자면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k434N/btsMDGGQJr9/C6qgv3Clb07mnh5o3x9GpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k434N/btsMDGGQJr9/C6qgv3Clb07mnh5o3x9GpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k434N/btsMDGGQJr9/C6qgv3Clb07mnh5o3x9GpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk434N%2FbtsMDGGQJr9%2FC6qgv3Clb07mnh5o3x9GpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;328&quot; height=&quot;154&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;808&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lI8i5/btsMCu1Jk0R/oHkKaazE3uIfAkZM3Z6Vf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lI8i5/btsMCu1Jk0R/oHkKaazE3uIfAkZM3Z6Vf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lI8i5/btsMCu1Jk0R/oHkKaazE3uIfAkZM3Z6Vf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlI8i5%2FbtsMCu1Jk0R%2FoHkKaazE3uIfAkZM3Z6Vf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;658&quot; height=&quot;808&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음악 플레이어의 데이터는 첫 번째 사진의 MusicPlayerData에 있는데, 그 데이터를 사용하는 기능은 MusicPlayerMain3 클래스에 있는 각각의 메서드에 분리되어 있다. 따라서 음악 플레이어와 관련된 데이터는 MusicPlayerData를 사용해야 하고, 음악 플레이어와 관련된 기능은 MusicPlayerMain3의 각 메서드를 사용해야 한다. 데이터와 그 데이터를 사용하는 기능은 매우 밀접하게 연관되어 있다. 이후에 MusicPlayerData에서 관련 데이터가 변경되면 MusicPlayerMain3 부분의 메서드들도 함께 변경해야 한다. 즉, 이렇게 데이터와 기능이 분리되어 있으면 유지보수 시에 관리 포인트가 2곳으로 늘어나게 되므로 유지보수가 어려워진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;객체지향 프로그래밍(Object Oriented Programming)이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향 프로그래밍이란 데이터와 기능을 하나로 묶어서 하나의 객체에 대한 개념을 온전히 하나의 클래스에 담아, 객체 단위로 프로그래밍하는 기법이다. 객체지향 프로그래밍에서는 프로그램의 실행 순서보다는 객체 클래스를 만드는 것 자체에 집중해야 한다. 객체가 어떤 속성(데이터)을 가지고 어떤 기능(메서드)을 제공하는지에 초점을 맞추어야 한다는 것이다. 객체지향 프로그래밍은 절차지향 프로그래밍에 비해 유지보수가 쉽고 코드의 재활용성이 높지만, 처리 속도가 느리고 설계에 많은 시간이 들어간다. 절차지향 프로그래밍이 &quot;어떻게&quot;를 중심으로 프로그래밍을 한 것이라면, 객체지향 프로그래밍은 &quot;무엇을&quot;을 중심으로 프로그래밍을 했다고 볼 수 있다. 대표적인 객체지향 언어로는 Java가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;절차지향 프로그래밍은 데이터와 기능이 따로 존재한다는 것을 위에서 보여주었는데, 객체지향 프로그래밍은 데이터와 기능이 하나의 객체 안에 함께 존재한다는 것을 예시 코드로 보여주자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;798&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6WD2C/btsMC58e4cS/dGDT7ksL0t8AG6fPdekb80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6WD2C/btsMC58e4cS/dGDT7ksL0t8AG6fPdekb80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6WD2C/btsMC58e4cS/dGDT7ksL0t8AG6fPdekb80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6WD2C%2FbtsMC58e4cS%2FdGDT7ksL0t8AG6fPdekb80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;748&quot; height=&quot;798&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;798&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 MusicPlayer라는 하나의 클래스 안에 음악 플레이어에 필요한 속성과 기능을 모두 정의하였다. 속성은 이 MusicPlayer클래스의 멤버 변수인 volume, isOn으로 정의하였고, 기능은 MusicPlayer를 사용하기 위한 기능을 구현한 메서드 on, off, volumeUp, volumeDown, showStatus로 정의하였다. 이제 음악 플레이어가 필요한 곳에서 이 클래스만 있으면 온전한 음악 플레이어를 생성하여 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 MusicPlayer라는 하나의 객체 내에 구현된 기능들을 직접 사용한 코드를 보여주자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUGIFu/btsMDYtLnMo/ihGtFRSs2AU8ixKmsQGtW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUGIFu/btsMDYtLnMo/ihGtFRSs2AU8ixKmsQGtW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUGIFu/btsMDYtLnMo/ihGtFRSs2AU8ixKmsQGtW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUGIFu%2FbtsMDYtLnMo%2FihGtFRSs2AU8ixKmsQGtW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;486&quot; height=&quot;526&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드를 보면 실세계와 유사하게 이미 만들어져있는 음악 플레이어를 사용자가 기능만 호출해서 사용하고 있다는 것을 알 수 있다. 즉, 뮤직 플레이어를 사용하는 입장에서는 뮤직 플레이어 안의 내용이 어떤지는 알 필요가 없고 단순히 기능을 호출하여 사용하면 된다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;이해를 돕기 위해 비유를 통해 몇 가지 예시를 더 들어보겠다.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비유 : 세상의 모든 사물을 단순하게 추상화해보면 속성(데이터)과 기능(메서드)으로 설명할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 자동차&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 속성 : 색상, 현재 속도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기능 : 액셀, 브레이크, 문 열기, 문 닫기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 동물&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 속성 : 색상, 키, 온도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기능 : 먹는다, 걷는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 게임 캐릭터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 속성 : 레벨, 경험치, 소유한 아이템&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기능 : 이동, 공격, 아이템 획득&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;gt; 여기서 속성은 멤버 변수, 기능은 메서드로 각각의 '객체' 내에 포함되어 있는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 내용들을 통해 절차지향과 객체지향의 개념에 대해 이해했다면, 이제 마지막으로 객체지향 프로그래밍의 주요 특징에 대해서 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;1. 캡슐화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캡슐화(Encapsulation)는 데이터와 이를 처리하는 기능을 하나의 객체로 묶고, 외부에서 직접 접근하지 못하도록 제한하는 객체지향 프로래밍(OOP)의 핵심 개념이다. 즉, 데이터를 감추고 외부 세계와의 상호작용은 메서드를 통해 하는 방법이다. 위의 MusicPlayer를 보면 음악 플레이어를 구성하기 위한 속성과 기능이 마치 하나의 캡슐에 쌓여있는 것 같다. 이렇게 속성과 기능을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는 것을 캡슐화라 한다. 캡슐화의 장점으로는 데이터 보호, 코드의 유지보수성 향상, 객체 간 결합도 감소, 보안 강화 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;2.상속&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속(Inheritance)은 기존 클래스(부모 클래스)의 속성(필드)과 기능(메서드)을 새로운 클래스(자식 클래스)가 물려받아 확장하는 객체지향 프로그래밍(OOP) 개념이다. 상속을 통해 중복 코드를 제거하여 코드의 재사용성을 증가시킬 수 있고, 기존 기능을 쉽게 추가 및 수정할 수 있도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;3.다형성&lt;/b&gt; &lt;br /&gt;다형성(Polymorphism)은 같은 메서드나 객체가 다른 형태로 동작할 수 있도록 하는 객체지향 프로그래밍(OOP)의 개념이다. 즉, 하나의 인터페이스로 여러 개의 구현을 가질 수 있는 것을 의미한다. 이를 통해 코드를 유연하게 작성하고, 유지보수를 쉽게 할 수 있도록 한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4.추상화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추상화(Abstraction)는 클래스들 사이에서 공통된 속성과 기능을 도출해내는 것을 말한다. 공통된 부분을 포함하는 클래스라고 해서 꼭 상위 클래스로 만들어야 하는 것은 아니고, 상황에 따라 공통 요소를 가진 하위 클래스를 정의할 수도 있다. 추상화를 활용하면 코드 중복을 줄이고, 클래스 간의 관계를 명확하게 만들며, 유지보수도 수월해진다. 자바에서는 추상 클래스나 인터페이스를 통해 추상화를 구현할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**참고한 블로그**&lt;br /&gt;불곰, 2018년 12월 22일, &lt;a href=&quot;https://brownbears.tistory.com/407&quot;&gt;https://brownbears.tistory.com/407&lt;/a&gt;&lt;/p&gt;</description>
      <category>개인 공부/JAVA</category>
      <category>Java</category>
      <category>Object Oriented Programming</category>
      <category>OOP</category>
      <category>객체지향</category>
      <category>다형성</category>
      <category>상속</category>
      <category>절차지향</category>
      <category>캡슐화</category>
      <author>호기심 많은 솔이</author>
      <guid isPermaLink="true">https://curiousjung1997.tistory.com/7</guid>
      <comments>https://curiousjung1997.tistory.com/7#entry7comment</comments>
      <pubDate>Thu, 6 Mar 2025 18:43:17 +0900</pubDate>
    </item>
  </channel>
</rss>