
부트캠프에 들어온 지 약 한 달 반 정도 되는 날이다. 벌써 정도가 지났다. (현재까지 교육일수: 29일, 전체 교육일수: 120일)
이번 7주차를 돌아보며 회고를 작성한다.
List, Stack, Queue, Deque)와 그래프 계열 자료 구조(Tree, Heap, Graph) 중 트리와 힙의 작동 원리 및 사용법에 대해 학습하였다.필자는 이전에 정보처리기사 자격증 공부를 했는데, 총 23개의 디자인 패턴이 각각 생성, 구조, 행위 패턴 중 어디에 속하는지와 그 특징을 외워야 했다. 자격증에서 다루는 범위가 워낙 방대하다보니, 개념서에서 자세한 코드는 다루지 않고 줄글로 설명만 작성되어 있었다. 잘 와닿지도 않는 수많은 내용을 다 외워야 한다는 게 스트레스여서, 설명을 보고 패턴을 맞히는 문제는 틀릴 각오로 어느 패턴에 속하는 지 분류하는 법만 학습했다.
강의를 통해 실제로 디자인 패턴을 구현한 코드를 읽어보니 생성, 구조, 행위 패턴이 어떤 의미였는지, 어떤 점에서 유지보수성 좋게 잘 작성된 코드인지 잘 이해할 수 있었다. 단순히 자격증 취득이 목적이라면 개념서를 읽고 문제를 풀어보는 것으로 충분하지만, 개발 공부의 의미로 개념서에서 다루지 않는 내용도 찾아보며 공부했으면 더 좋았겠다 싶었다.
Java 수업이 끝난 후에는 보통 주어진 문제 상황을 해결하는 실습 문제가 주어졌는데, 이번 주에는 객체지향 설계 원칙을 고려하여 하나의 서비스를 만들어보는 일종의 개인 프로젝트 느낌의 종합 실습 과제가 주어졌다. 혼자 처음부터 작성하기 어려운 사람을 위한 샘플 코드도 주어졌다. 과제는 화요일 수업시간 중에 안내되었고 제출 기한은 금요일 점심시간이었다.
그동안의 실습 문제나 알고리즘 문제를 풀 때는 절차적인 코드를 작성한 경우가 대부분이다보니, 객체 지향적인 코드를 작성해본 경험이 많지 않은 필자에게 많은 공부가 되는 실습 과제였다.
실제 프로젝트에서는 DB 상에서 FK로 연결된 데이터를 다루어야 하는 경우가 많을테니 테이블 2개를 이용해볼 수 있게 회원 관리, 성적 처리 기능을 구현해보고 싶었으나, 경험치 부족으로 거기까지 수행하기에는 어려움이 있어 강사님 코드를 바탕으로 회원 관리 기능 부분만 완성하는 것으로 계획을 수정하였다.
회원의 속성을 인조식별자, 이름, 역할, 상태로 정하고 역할은 "학생", "조교", "강사"로, 상태는 "활성화", "비활성화", "탈퇴"로 나누었다. 실습 내용은 대부분 주어진 샘플 코드에서 유지보수성을 개선하는 리팩토링이었다. 자세한 내용은 깃허브 저장소에서 확인할 수 있다.
실습 첫 날에는 어떻게 진행해야 할 지 막막해서 뇌정지가 오기도 했는데, 2일차, 3일차를 지나면서 진행 방식이 좀 정리되기 시작하여 무사히 작업을 수행할 수 있었다. 혼자 많은 책임을 갖고 있던 Application 클래스의 기능을 다른 클래스로 보냈더니 기존에 작성한 import 문이 불필요해지는 것을 보며, 분리가 잘 되었음을 느낄 수 있었다.
이전 실습 문제들도 메서드를 분리하며 리팩토링 하고 싶지만 다른 작업을 하느라 못해봤는데, 이번 과제를 수행하며 리팩토링 요령을 배울 수 있었다. 기한이 하루만 더 있었다면 더 잘 할 수 있었겠다 싶어 좀 아쉽지만, 나름대로 잘 마무리한 듯하다.
실습 종료 이후에는 발표가 진행되었다. 예전 회고의 배운 점에서 본인이 맞게 풀었는지 검사받고 싶어서 발표를 지원하신 분의 일화를 언급했는데, 이번 실습에서 정확히 같은 생각이 들어 발표를 지원하게 되었다. 덕분에 강사님께서 커피 쿠폰을 보내주셨다. 받은 쿠폰은 다음주 수업 시작 전에 카페에 들러 사용할 생각이다.

사실 실습 내용에 대해 꼼꼼하게 피드백을 받아보고 싶어서 강사님께 커피 쿠폰 대신 자세한 피드백을 받는 것을 요청드리려 했다. 아래와 같이 피드백 요청사항이 많다보니 이 정도의 꼼꼼한 피드백을 받을 수 있다면 커피 쿠폰을 대신할 수 있을 것 같았다. 이 말씀을 드리기 전에 먼저 쿠폰을 보내주셔서 쿠폰을 받은 채로 피드백을 요청드리게 되었는데, 다음에 비슷한 상황이 오면 먼저 말씀 드려야겠다.

다른 분들의 발표를 들으며 같은 과제이지만 각자 중요하게 생각하고 고민한 부분도 다르고 다양한 것을 시도해본 점이 인상적이었다.
다음으로 이번주에 겪은 여러 문제 상황을 공유한다.
틀렸습니다.가 반복됨틀렸습니다.가 반복되었다.
이전에 작성한 파이썬 코드를 참고해봤는데, 오답으로 판정된 자바 코드와 로직이 정확하게 일치했다.
int로 설정하여 오버플로우가 발생한 것이 원인임을 파악할 수 있었다. long으로 수정하니 해결되었다. chatGPT가 이걸 찾아내지 못하고 계속 헛소리를 반복하는 바람에 2시간 정도를 날렸다.
영문자, 특수문자 언더바(_)만 사용하는 것이 좋다.기존에 코드를 돌릴 때는 별 문제가 없었는데 테스트 코드를 돌리려니 발생한 문제여서, 코드 관리 폴더를 옮기고 기존 폴더에는 코드 관리 폴더에 접근하는 바로가기를 추가하였다. 아래 사진은 폴더 위치를 옮긴 후에 빌드에 성공한 모습이다.

null로 테스트 실패null이어서 실패하였다.
작성된 코드를 봤을 때 아무리 봐도 null이 나올 수는 없었기에 좀 이상하다고 생각했다.
public String solution(int n, int k) {
Queue<Integer> queue = new LinkedList<>();
StringBuilder sb = new StringBuilder("<");
for (int i = 1; i <= n; i++) {
queue.offer(i);
}
while (!queue.isEmpty()) {
for (int i = 1; i < k; i++) {
queue.offer(queue.poll());
}
int out = queue.poll();
sb.append(out)
.append(" ");
}
return sb.toString()
.trim()
.replace(" ", ", ") + ">";
}
import 문을 수정하여 해결import 문을 추가하였다. 즉, 테스트 코드는 작성한 코드와 다른 곳을 바라보고 있었다. 아래 사진의 오른쪽과 같이 불필요한 부분을 삭제하여 해결했다.

혼자 저장소 목적으로 쓸 때는 크게 신경쓰지 않아도 되지만, 함께 사용하기 위한 저장소를 만들다보니 브랜치 보호 규칙, 코드 리뷰 진행 방식 등에 대해서도 고민해야 했다. 이를 위해 GitHub에서 ruleset 설정하는 방법도 찾아보고, 코드 리뷰를 위한 PR을 올리는 과정에서 로컬 저장소의 브랜치 관리에도 신경써야 했기에 공부가 많이 되었다. 앞으로 스터디 또는 프로젝트를 진행할 때 GitHub 저장소를 직접 만들거나, 혹은 관리 규칙 등을 개설자와 함께 고민해볼 생각이다.
회고 작성을 토요일에 시작하다보니 작성하려던 내용을 까먹어서 나중에 수정하는 일이 잦았다. 이번주에 임시저장 기능을 활용하여 회고에 작성할만한 내용이 생길때마다 키워드를 기록해두니 작성에 많이 도움이 되었다. 매일 회고를 작성하는 수준까지는 아니더라도, 이렇게 키워드를 임시저장해두는 습관을 계속 가져야겠다.
AI 를 내 팔처럼 다루시는 경지?!