우테코 프리코스에 그야말로 '몰입'하고 있는 요즘이다.
합격하고 싶은 마음이야 두말할 것도 없지만,
합격 여부를 떠나 이 시간을 통해 올바르게 성장할 수 있다는 확신이 있다.
그래서 아주 마음 편히 몰입하고 있다.
많은 지식을 머릿 속에 집어 넣고 있고, 많은 영감을 얻고 있다.
하지만 아쉽게도, 사유할 시간이 길지 않아 많은 것들을 흘려보내고 있다.
이번 우테코 프리코스는, 주차 별로 미션을 제출하면서 '소감'도 적어야 한다.
코치님들께서 설계하신 의도대로 운영되는지를 확인하기 위함도 있겠지만,
머릿 속에 들어온 지식, 과정에서 느낀 여러가지 것들을 한 번 씩 되짚어보라는 의미도 있을 것이라고 생각한다.
어쨌든 소감을 적어서 제출한 김에,
살을 조금 붙여서 미래의 나를 위한 회고를 적어보고자 한다.
아주 편~한 마음으로..
(사실 합격해서 이런 실력의 사람도 붙었구나.. 라는 메시지도 주고 싶은 마음이 간절하다.)
여태 자바를 공부했던 경험은
- 위키독스 '점프 투 자바' 1회독
- 인프런 스프링 무료 강의 따라하기
두 가지가 전부였다.
객체지향 개념도 아티클 몇 개를 찾아보고 타입스크립트, Nest.js 코드에서 임의로 적용해본 경험이 다였다.
완벽하게는 아니지만, 타입스크립트로 메서드를 분리하려고 노력해봤던 경험도 있었다.
그런 배경으로 시작해, 일주일간 어떤 것을 공부하고 어떤 것을 느꼈는지 적어보겠다!
자바 복습
그마저도 다 까먹은 자바 문법을 떠올리기 위해 점프 투 자바를 다시 1회독했다.
내용이 풍부하진 않지만, 빠르게 문법을 익히고 객체지향 개념을 겉핥기하기에 아주 좋았다.
다만 오래 함께할 기본서 한 개의 필요성도 느꼈다.
객체지향 공부
전공자라면 으레 듣는 객체지향 프로그래밍과 같은 과목을 수강하거나, 따로 공부해본 경험이 없었다.
구글링으로 아티클 몇 개 읽어본 어설픈 지식이 전부였다.
1주차 미션에는 객체지향 관련 규칙이 없었지만,
자바가 워낙 객체지향에 초점을 맞춘 언어이고, 앞으로의 미션에서 필요할 것이라고 생각해 객체지향을 공부했다.
객체지향의 사실과 오해 라는 책을 읽으면서 인터넷 아티클로 객체지향 개념(상속, 캡슐화, 추상화), SOLID 원칙 등을 찾아보는 식으로 공부했다.
객체지향의 사실과 오해 라는 책은 정말 좋았다.. 객체지향의 필요성, 각 개념에 대한 이해에 진짜 많은 도움이 되었다.
아직 책을 읽는 중이고, 각 개념에 대해 코드로 설명하지는 못할 것 같다.
프리코스를 진행하면서 꾸준히 공부해, 4주 후에는 객체지향을 마스터하겠다는 각오를 다진다.
프리코스 문제
1주차 프리코스는 7개의 문제를 해결하는 형식이었다.
각 문제들은 코딩테스트 형식을 띄고 있었다.
나는 코딩테스트 경험은 없고, 유튜브 강의로 공부하고 문제 조금 풀어본 경험만 있었다. (백준 실버4 수준)
알고리즘 지식이 부족해서 정확하지는 않을텐데,
아마 어려운 알고리즘을 사용하는 문제는 없었던 것 같다. (브루트 포스 정도..?)
다만 구현 로직 자체가 (나에게는) 엄청나게 까다로웠다.
특히 6, 7번을 처음 훑어봤을 때는, 일주일 안에 풀 수 있을까하는 걱정이 마음에 툭 얹혀버렸다 ㅋㅋ
하지만.. 하루종일 붙잡고 씨름하다보니
문제가 풀리긴 풀렸다!
자료구조에 대해서 지식이 부족하다 보니, 비효율적인 코드를 짠 것 같았다.
(사실 비효율적인지 판단하기도 쉽지 않았다.)
그래도 자바로 처음 '프로그래밍'을 해보았고,
내가 정말 어렵다고 생각한 기능을 어찌저찌 잘 구현해냈다는 것이 너무 기뻤다.
그리고 정말 신기했던 것이, 객체지향을 이론으로 공부하던 것들이 머리에 남아
코드를 짜는 내내 그것을 고려하게 만들었다는 것이다.
다만 이것이 객체지향의 여러 원칙들을 만족하는지 확인하기가 어렵다.
다가올 2주차부터, 1주차의 코드에 대해 토론하는 커뮤니티가 열린다.
그곳에서 다른 사람들은 코드를 어떻게 객체지향적으로 구현했는지 확인하고 싶은 마음이 크다!
기술적으로 배운 것들
1) 객체지향을 이론이 아닌 코드로 처음 적용
자바 문법만 공부할 때는, private, public이 어떤 의미인지 하나도 이해가 안 됐었다.
그런데 객체지향을 공부하면서 코드를 구현하다보니, 자연스럽게 그 의미가 파악이 되었다.
변하지 않는 멤버 변수에 private final static을 사용하면서 은닉화, 캡슐화 개념도 이해할 수 있었다.
2) 정규식 처음 사용
제한 사항을 예외 처리할 때, 정규식을 사용해서 간단한 로직으로 구현했다.
정규식을 처음 사용해봤는데,
글자수 제한, 한글만 가능, 영어 대소문자, 일부 특수문자 허용, 이메일 도메인 필수 등
다양한 제한 사항들을 하나의 문자열로 검증할 수 있는 강력함이 너무 신기했다.
3) List, Set, Map 객체에 대한 이해
List, Set, Map이 어떤 용도로 사용되는지는 알고 있었지만,
List와 ArrayList의 차이,
좌변에 상위 타입으로서 선언해야 의존관계 역전이 일어나지 않는다는 것 등을 처음 알게 되었다.
관련해서 공부한 내용을 아티클 시리즈로 작성했다. (링크👇👇)
인터페이스와 구현체 - 무조건 이해되는 List와 ArrayList의 차이(1)
10분만 이 글에 투자해주시면 List, ArrayList, 인터페이스, 구현체 이해시켜드리겠습니다.. (지적은 언제나 대환영입니다.) 본 아티클 시리즈를 정독하면, 아래 의문에 답을 얻을 수 있습니다. 1. 인
woojin.tistory.com
ArrayList를 List로 선언하는 이유(업캐스팅) - 무조건 이해되는 List와 ArrayList의 차이(2)
10분만 이 글에 투자해주세요. ArrayList를 List로 선언하는 이유를 이해시켜드리겠습니다. 본 아티클 시리즈를 정독하면, 아래 의문에 답을 얻을 수 있다. 1. 인터페이스와 구현체가 무엇인가? (List
woojin.tistory.com
Set과 HashSet, Map과 HashMap의 차이 - 무조건 이해되는 List와 ArrayList의 차이(3)
(지적은 언제나 대환영입니다.) 본 아티클 시리즈를 정독하면, 아래 의문에 답을 얻을 수 있습니다. 1. 인터페이스와 구현체가 무엇인가? (List와 ArrayList의 차이) (클릭🔗) 2. ArrayList가 아닌 List 타
woojin.tistory.com
추상클래스란? 아니, 추상이란? - 무조건 이해되는 List와 ArrayList의 차이(4)
추상이 도대체 뭔 소린지 모르겠는 코린이 && 자린이 && 비전공자(== 나) 여러분께 바칩니다.. (지적은 언제나 대환영입니다.) 본 아티클 시리즈를 정독하면, 아래 의문에 답을 얻을 수 있습니다. 1.
woojin.tistory.com
4) 가변 문자열을 StringBuilder 타입으로 처리
문자열을 수정해야 되는 문제가 있었다.
처음에는 String → List<String> → String 의 순서로 변환해서 가변 문자열을 처리했는데,
List<String>에서 너무 많은 String 객체를 생성해야 하는 문제가 있었다.
후에 StringBuilder 타입을 활용할 수 있다는 것을 알게 되면서,
해당 문제 코드를 리팩토링하며 적용해 보았다.
전보다 훨씬 짧고 간결한 코드로 구현이 가능했다.
형변환 과정을 거치지 않아도 되고, 많은 String 객체를 구현할 필요도 없었다.
5. 이름과 점수를 가지고 있는 객체의 리스트 구현
이번 주차 미션을 진행하면서, 가장 뿌듯했던 순간이었다.
대략 [(이름, 점수), (이름, 점수)] 형식의 리스트가 필요했다.
처음에는 List<List<Object>> 타입으로 구현했는데, 값을 꺼낼 때마다 int나 String으로 캐스팅해 주어야 하는 문제가 있었다.
정렬할 때 sorted(Comparator.comparing()) 을 사용했는데, 그 안에 들어가는 코드도 무척 복잡했다.
관련 내용을 검색하면서, (이름, 점수)를 하나의 클래스로 묶는 방법에 대해 알게 되었다.
정확히는 이름, 점수를 클래스 변수로 갖는 새로운 클래스를 구현했다.
형변환의 문제는 당연히 사라졌고, 값을 꺼내거나 변경할 때 해당 클래스의 메서드를 사용하여 객체지향적으로 구현할 수 있었다.
6) 깃 + 코드 설계
기존에는 주로 혼자서 보는 용도로 커밋을 기록했는데,
이번 프리코스 1주차에는 협업 상황을 가정하고, 기능 단위 별로 커밋을 나눠보았다.
확실히 스스로 PR로 코드를 리뷰할 때 보기가 수월해졌다.
다음 주차에 커뮤니티를 통해 1주차 코드에 대해 리뷰를 받아볼 예정인데, 그때 빛을 발하지 않을까 생각하고 있다.
(근데 커밋을 너무 상세하게 나눠서, 다른 사람들은 어떻게 나눴는지 너무 궁금하다.)
또 기존에는 다짜고짜 개발부터 시작했었는데, 기능 설계를 먼저 하고 개발을 진행하는 방식을 연습해보았다.
처음에는 까다롭고 감을 잡기가 어려웠지만, 구현을 하면 할수록 설계도가 있어 올바른 방향으로 계속 구현할 수 있었다.
아쉬웠던 점, 부족한 부분
1) 자료구조와 자바 언어에 대한 깊은 지식
여러 언어를 돌면서 공부하다가, 자바를 처음 깊게 공부하고 있다. 공부할수록 자바에 대한 편견(꼰대같은 언어 등..)이 깨지고 그 매력을 알아가고 있다. 자바 생태계에 일원으로 안전하게 정착하고 싶다.
2) 객체지향에 대한 이해
객체지향의 개념에 대해서 하나하나 깨달아가는 과정이었다. 하지만 확실하게 이것이 객체지향적인 구현이다! 라고 정의하고 구현하지는 못하고 있다. 프리코스 기간 내내 객체지향을 열심히 공부해야겠다고 다시 다짐한다.
커뮤니티
이번 우테코 프리코스는 슬랙과 깃허브를 통해 커뮤니티를 운영한다. 깃허브 커뮤니티는 2주차부터, 1주차 미션 코드에 대해서 진행되기 때문에, 1주차에는 슬랙만 운영되었다.
그런데, 정말 많은 사람들이 자발적으로 정보를 공유하고 서로의 성장을 응원하고 있었다.
어느 필드에서 이렇게 경쟁자끼리 서로의 성장을 응원하고 도움을 나눌 수 있을까 싶었다
정확히는 경쟁보다는 상생, 같이 성장한다는 생각이 더 지배적인 것 같다.
지식 공유의 가치를 아는 사람들과 잘 설계된 미션을 함께 공부하는 시간이 너무 소중하게 다가왔다.
우테코 너무 가고 싶다..
입에 발린 소리일까봐 미션 소감에는 적지 않았는데,
정말 내가 꿈꾸던 교육 방식이 그대로 현실이 된 느낌이었다..
어려서부터 고민 없이, 소통 없이 암기하는 교육 방식이 너무 맞지 않았다.
때문에, 중고등학교 시절에는 책과 인터넷 강의로 독학을 했다.
대학에 와서도 이어지는 주입식 교육이 버거웠고,
다양한 분야를 돌면서 혼자서 공부해왔다.
주도적으로 공부하는 것은 늘 즐거웠으나,
치명적인 문제가 있었다.
좋은 환경을 조성하기가 어렵다는 것이다.
스스로 동기를 부여할 수 있고,
스스로 찾아보고 이해할 수 있어도,
가끔 잘못된 방향으로 나아갈 때 잡아줄 존재가 없고
과정을 함께 이겨낼 든든한 동료도 없다는 것이 늘 힘들었다.
하지만 고작 프리코스 1주차만 경험했음에도,
많은 고민이 해소되는 기분이 들었다.
학습의 방향, 목적지가 주어진다.
하지만 두 발로 걸어갈 지, 네 발로 기어갈 지, 자전거를 타고 갈 지는 스스로 정해야 한다.
과정에서 어느 방법이 효율적일지 같이 고민하고, 힘들 때 서로에게 기댈 동료가 있다.
만약 우테코 본 과정에 합격해서
크루원들과 대면하고 가까워져서 의지할 수 있는 관계가 된다면,
20년을 공부하면서 느꼈던 갈증이 해소될 수 있겠다는 생각을 했다.
마지막으로, 많은 사람들이 이런 좋은 경험을 할 수 있게 힘써주신
많은 코치님들께 진심으로 경의를 표합니다..
남은 주차도 많이 배우고 성장하겠습니다.
다음 주도, 더도 말고 덜도 말고 이번 주차만 같이
많은 것을 배우고 느끼는 한 주로 만들 것이다.
회고 끝~!
'우아한테크코스 5기 백엔드' 카테고리의 다른 글
합격하고 적는 우아한테크코스 5기 최종 코딩테스트 #준비방법 #시험후기 #백엔드과정 (5) | 2022.12.29 |
---|---|
프리코스 4주차 회고 - 곧은 철학의 개발자가 되리라 다짐하며.. (우아한테크코스 5기 백엔드 프리코스) (2) | 2022.11.23 |
프리코스 3주차 회고 - 돌아보는 것의 중요성 (우아한테크코스 5기 백엔드 프리코스) (1) | 2022.11.17 |
프리코스 2주차 회고 - 나만의 페이스를 유지하자 (우아한테크코스 5기 백엔드 프리코스) (2) | 2022.11.11 |