후기/강의 후기

[4주 차 회고] <완강> 코드스쿼드 2022 프리코스 (feat. 코드스쿼드)

ImKDM 2022. 11. 28. 15:59
728x90

- 총 4주 과정 (22.10.30 ~ 22.11.25)

- 100% 온라인 진행

- 수강료 20만 원

4주 차 학습일지 (22.11.20  ~ 11.26)


-  자바 컬렉션 프레임워크 / 미션#1 (고객관리 프로그램, 힙 자료구조, 제네릭)

-  4주 차 알고리즘 문제

-  여러 JDK 클래스 활용해 보기 / 미션 #2 (Thread 프로그래밍, 소켓 프로그래밍, 채팅 프로그램 구현하기)

-  추가 미션 #4-1문제

 

 

4주 차의 경우 가장 인상 깊었던 미션은 'Heap 알고리즘' 구현이었다. 그동안 Heap 에 대해서 많이 보았지만 어떤 특징이 있는지는 알지 못했다. 괜히 벌집을 건드려 샛길로 빠지는 게 아닌가 싶어 해당 주제에 대해 파고들 생각이 없었다. 하지만 이번 미션에 Heap 알고리즘 구현 미션이 떡 하니 버티고 있어 더 이상 피할 수 없었다. 내가 가진 알고리즘 책과 어플, 그리고 구글링을 통해 Heap 알고리즘을 파훼하고자 노력했다. 처음엔 당연히 어려웠다. 일단 개념적인 이해가 우선되었다. 이진트리의 완전성을 이용해서 가장 작은(혹은 가장 큰) 수를 꺼내는 특징이 핵심이었다.

 

시간을 들여 동작 원리를 알고 나자 다음 난관이 기다리고 있었다. 바로 Java 코드로 구현하는 것! 처음에는 LinkedList로 구현해야 하나 고민이 됐다. 하지만 도무지 해법이 생각나지 않았는데 조금 더 찾아보니 정답은 '배열'이었다. 어? 선형 자료구조인 배열로 어떻게 트리 구조를 구현하지?? 마음속엔 의아함이 가득했다. 그리곤 부모 노드와 자식 노드의 위치를 찾는 공식을 보고선 이 규칙을 찾아낸 선지자의 천재성에 감탄이 나왔다. 어떻게 이런 발상을 했을까...

 

당연히 Heap 구조를 뚝딱 만들지 못했다. 이미 만들어진 코드를 보고 따라 작성하며 그 원리를 깨우치려고 노력했다. 여기서 왜 해당 코드로 작성했는지 이해가 먼저 필요했다. 한 발짝 앞으로 나갈 때마다 경의로움에 소름이 돋았다. 이런 알고리즘을 만든 사람들은 인물일까.. 신기하면서 재미있었다.

 

많은 미션 중 뜬금없이 존재한 Heap 알고리즘 문제에 하루 넘게 마음이 뺏겼다. Heap 뿐만 아니라 이후 자주 사용하는 ArrayList, Set, LinkedList 등의 자료구조도 직접 구현해보고 싶었다. 그 과정에서 많은 공부가 될 것 같았기 때문이다. 자료구조에 대한 특징과 작동 원리를 이해한다면 추후 큰 도움이 되리라 확신이 생겼다.

 

 

Heap 알고리즘과 더불어 첫 번째 미션은 고객 관리 프로그램을 만드는 것이었다. 지난 미션에서 미리 구현해 논 멤버십 클래스를 이용해 다양한 자료구조로 변형해보는 연습이었다. ArrayList와 HashSet, 그리고 HashMap, TreeSet에 대해 대충 알고 있어서 크게 어렵진 않았지만, 중간중간에 헷갈리는 부분이 많았다. equals( )hashCode( ) 메서드를 오버라이딩 하는 것부터, Comparable 또는 Comparator 클래스를 구현하는 것까지 복습할 수 있었던 좋은 기회였다. 특히 그동안 취약하다고 느낀 정렬 기능에 대해 정리할 수 있어서 너무 좋았다. 또한 Heap 알고리즘 구현은 최고였다!

 

알고리즘 문제는 LeetCode 라는 사이트였다. 한 주씩 새로운 코딩 테스트 사이트를 소개해줘서 4주 차에 알게 된 LeetCode는 초면이었다. 낯설고 영어여서 거부감이 있었지만 easy 난이도 문제라 한 번 시도해봤다. 하지만 예상과 다르게 고민해야 할 부분들이 새롭게 등장했다. 바로 '효율성'이었다. LeetCode 홈페이지는 내 코드의 동작 속도와 메모리 사용량 등을 그래프로 보여준다. 다른 사람들에 비해 얼마나 효율적으로 작성했는지 바로 비교가 가능하다. 그동안 작성했던 패턴으로 제출하니 효율적인 측면에서 최악이었다. 충격이었다. 그래서 다른 사람들의 코드를 보니 두 번 충격을 받았다. for 문으로 탐색하도록 작성한 O(n²) 코드를 HashSet 을 통해 O(n) 까지 만드는 모습을 보곤 감탄했다. 그들의 발상의 전환 방식과 알고리즘 문제에서의 효율 측면을 앞으로 고민해야겠다고 생각했다. 좋은 경험이었다.

 

두 번째 미션은 채팅 프로그램을 만드는 것이었다. 지난주 실버 멘토가 언급했어서 예상은 했었지만 막상 미션을 보니 본능적으로 현재 건드릴 수준이 아님을 알아챘다. 일단 Thread는 독학으로 배우긴 했어도 수박 겉핡기 수준이라 어디 적용하긴 이르고, 소켓 프로그래밍의 개념조차 모르는 상태라 채팅 프로그램은 무리라 판단했다. 대신 새로운 목표가 생겼다. 남궁성 저자의 자바의 정석 교재를 보면 가장 마지막 챕터가 '네트워크'다. 그 영역은 금단의 장소처럼 들어갈 생각조차 안 했는데 이번 기회로 탐색해보고 싶어졌다. 도전 정신이 생긴 것이다. 처음엔 당연히 이해가 안 될 텐데 지금까지 모든 공부가 그래 왔듯 한 번 보고, 두 번 보고, 반복하다가 이해와 숙달이 되는 것이겠지. 그렇다면 지금은 모르겠지만 일단 시작해보는 것이 중요할 것이다. 좋은 자극이 됐다.

멘토와의 대화


제네릭은 JDK 1.5 부터 시작되어 '클래스 내부에서 사용할 데이터 타입을 외부에서 지정한다'.

 

-  인텔리제이로 Collection 을 타고 들어가는 것도 좋은 공부가 된다.

 

-  Iterator은 자바 1.2에 나왔고, Iterable은 자바 1.5에 나왔다. 이들은 forEach를 사용할 수 있게 만들어준다.

 

-  Map이 Collection에 속하지 않는 이유는 Collection의 기본 특징인 요소들의 집합, 즉 선형적으로 다음 값이 존재하고 iterate 하지 않기 때문이다.

 

-  제네릭은 "타입을 모르나, 임의의 타입을 런타임 때 정해지게 되며, 그 타입의 특성에 맞게 사용할 수 있다".

-  와일드카드는 "타입을 컴파일 시점에서 모른다. 또한 런타임 때도 타입의 특성을 신경 쓰지 않는다".

 

-  프로세스란 메모리에 올라간 프로그램 Code, Data, Stack, Heap 이다.

 

-  스레드란 프로세스가 가지고 있는 메모리 용량을 내부적으로 할당을 다시 해서 실행하는 단위이다. 카카오톡의 경우 '알림을 처리하는 기능', '메시지를 전송하는 기능', '다른 채팅방에서의 메시지를 받는 기능 등 여러 기능들이 있다. 이처럼 하나의 프로그램은 여러 스레드를 가진다.

 

-  public static void main( ) 가 하나의 스레드다.

 

-  자바에서 스레드를 만드는 방법은 2가지다.

(1) 이미 존재하는 Thread 클래스를 상속하는 방법.

(2) 이미 Thread화 되어 있는 클래스는 Runnable 인터페이스를 구현하는 방법.

 

-  Runnable을 구현한 클래스는 Thread( ) 생성자의 매개변수로 들어갈 수 있다.

새롭게 고민한 것


-  '일급 컬렉션'의 개념. 일급 컬렉션에 대해 처음 봤는데 평소에 코드를 작성하다가 어떻게 해결할지 몰라 애매했던 부분이었다. 그리고 일급 컬렉션의 불변성이 필수 요건이 아닌 선택사항이라는 점도 배웠다.

 

-   콜백 함수란 무엇인가?

 

-  정렬할 때 Comparator 과 Comparable 클래스의 차이

 

-  HeapSort 의 원리와 장단점

 

-  Scanner 의 nextInt( ) 메서드 다음으로 nextLine( ) 을 사용할 경우 개행 문자가 포함되는 상황과 해결책

느낀 점


4주 차는 열심히 했지만 성과는 많지 않았다고 평가한다. 열심히 했다는 뜻은 주어진 시간에 집중해서 문제를 풀었다는 의미고, 부족한 성과는 계획보다 덜 풀었다는 말이다. 4주 차가 끝나는 시점엔 지금까지 주어진 모든 미션의 95% 푸는 것이 목표였다. 그리고 12월 9일, 추가 미션 포함 총 77개의 미션 중 74개를 풀어서 96% 목표 달성했다. 물론 4주 차가 끝나는 시점의 통계일 뿐 목표했던 수치에 도달하도록 계속 풀 것이다. 이건 나와의 약속이기 때문이다.

 

[ 미션 진행도  :  12/09 기준  (74 / 77) ]

더보기

◆   [1주차] 오리엔테이션 / 미션#1

        조건문 연습 

        반복문 연습 

        구구단 

        별찍기 

 

◆  [1주차] 알고리즘 <백준>

       문제#1000 

        문제#1008 

        문제#2438 

        문제#2920 

        문제#8958 

        문제#11654 

 

◆  [1주차] 추가문제 1-1

        중간 숫자 구하기 

        369게임 

        if 논리 연습하기 

        조건문과 함수 연습 

        Scanner, Switch, 분기문 익히기 

 

◆  [1주차] 체지향 프로그래밍1 / 미션#2

        사칙연산 출력 

        사람 정보 출력 

        카페에서 커피 마시는 문제 

        달력 출력 문제 

 

[1주차]  추가문제 1-2

        성적 평균 내기! 

        직사각형 놀이 

        Circle 클래스 만들어보기 

        CircleManager로 가장 큰 원 찾기 

        전화번호부 

 

◇  [2주차] 배열과 객체 / 미션#1

        문자 배열 A-Z 저장 및 출력 

        도서관 책 목록 만들기 

        미로 찾기 문제 

 

◆  [2주차] 알고리즘 <프로그래머스>

        문제#12910 

        문제#68644 

        문제#42840 

        문제#12901 

        문제#12928 

        문제#64061 

 

◆  [2주차] 추가문제 2-1

        끝말잇기 

        스케쥴 관리 

        콘서트 예약 

 

◇  [2주차] 객체지향 프로그래밍2 / 미션#2

        현대자동차 공장 문제 

        학생 성적 처리 프로그램

        주사위 게임 

 

  [2주차] 추가문제 2-2

        멤버 함수의 사용이 잘못된 것 고르기 

        코드에서 잘못된 문장 찾기 

        ArrayUtil 클래스 만들기 

        사전 만들기 

        up&down game 구현하기

 

◆  [3주차] 상속과 다형성 / 미션#1

        백화점 멤버십 관리 프로그램 문제 

        커피 매장 메뉴 문제 

 

  [3주차] 추가문제 3-1

        ColorPoint 만들기 

        Default Point 

        3D Point 

        양수 Point 

 

◆  [3주차] 알고리즘 <Hacker Rank>

        solve-me-first 

        grading 

        compare-the-triplets 

        a-very-big-sum 

        time-conversion 

 

◆  [3주차] 추상 클래스와 인터페이스 / 미션 #2

        플레이어 레벨업 리팩토링 문제 

        학생 성적 처리 프로그램 버전2 

 

◆  [3주차] 추가문제 3-2

        스택 만들기! 

        Key : Value 저장소! 

        Shape 완성하기! 

        Shape 완성하기 - 추가문제 

 

◆  [4주차] 자바 컬렉션 프레임워크 / 미션 #1

        고객 관리 프로그램 만들기 (ArrayList) 

        고객 관리 프로그램 만들기 (HashSet) 

        고객 관리 프로그램 만들기 (HashMap) 

        고객 관리 프로그램 만들기 (TreeSet) 

        고객 관리 프로그램 만들기 (HeapSort 구현하기) 

        고객 관리 프로그램 만들기 (제네릭 클래스의 상속관계 구현하기) 

 

◆  [4주차] 알고리즘 <leetcode>

        two-sum

        reverse-integer

        palindrome-number

        roman-to-integer

        longest-common-prefix

 

  [4주차] 추가문제 4-1

        학점 계산기 

        인구 출력하기 

        학생 정보 관리 

        장학생 선발하기! 

 

  [4주차] 여러 JDK 클래스 활용해 보기 / 미션 #2

        채팅 프로그램 구현하기

 

이렇게 코드스쿼드 프리코스가 끝났다.

 

솔직히 지금까지 내가 받았던 학습 프로그램 중에서 가장 유익하고 알찬 시간이었다. 패스트캠퍼스의 과정은 질 낮은 수업에 완전 방치였고, POCU 교육 과정은 내가 감당할 수 없는 높은 수준에서 방치됐다. 두 과정 모두 끝까지 열정을 이어나가기 힘들었다. 하지만 코드스쿼드 프리코스는 달랐다.

 

일단 대부분의 미션을 처리할 수 있을 정도로 실력이 쌓였다. 독학으로 여기까지 온 것만으로도 스스로 대견할 정도다. 덕분에 마스터즈 코스에 대한 자신감을 얻었다. 또 코드 설계와 클린 코드에 대해 많이 고민할 수 있었다. 프리코스 자체에서 전문적인 코드 리뷰가 제공되진 않았다. 하지만 미션 수행 과정에서 어떤 모델이 좋을지, 어떤 구조가 객체지향적 일지 스스로 고민할 수 있었다. 물론 정답은 듣지 못했지만 고민한 과정 자체가 의미 있다고 평가한다. 더불어 짧았지만 동료들과 함께 코드를 공유하고 의견을 나눈 시간들도 좋았다. 오랜 기간 혼자 공부하면서 '같이' 학습한다는 경험이 전무했다. 이번 기회가 낯섦과 두려움이란 벽을 깨부수는 계기가 된 것 같다.

 

다음 목표는 코드스쿼드 마스터즈 코스를 도전하는 것이다. 미래에 어떤 길로 나아갈지 모르겠다. 하루하루 시간이 흐를 때마다 초조함이 쌓인다. 그러나 현실은 감정이 아닌 행동에 의해 영향을 받으리라 생각한다. 내 앞에 놓인 부족한 점을 극복하면서 꾸준히 나아가면 그 길의 끝엔 달달한 열매가 있다고 믿는다.

 

4주간 모두에게 감사하다. 그리고 내 자신에게 고생했다고 전한다.