[TIL-41/231024] 우테코 프리코스, 빌더 패턴, 스트림, 정적 팩토리 메서드
우아한테크코스 - 프리코스 1주차
최근에 우아한테크코스의 프리코스를 진행하면서, 부족한 개념 보충과 리팩토링에 몰두하느라 TIL을 신경쓰지 못했다.
이럴 때 공부하는 내용이 많은 만큼 정리를 잘하여 TIL을 썼어야 했는데 반성 중이다. 프리코스를 참가하면서 정말 뛰어난 지원자들이 많다는 걸 새삼 느끼고 있다.
프리코스를 참여하는 인원들이 모인 디스코드 방이 있는데 서로 자유롭게 자료를 공유하고 토론을 하는 공간이다. 나도 공유를 해볼려 했는데 사람들이 올리는 양질의 자료를 보니 차마 내 블로그 글을 공유를 하지 못하였다. 이유는 나는 이제껏 공부하고 정리하여 블로그 포스팅을 하였지만, '내가 올린 내용들을 온전하게 이해했는가'를 스스로에게 질문했을 때, 답은 '아니오'이기 때문이다. 혼자서 공부하는 데 익숙해져 있던 나에게 프리코스는 새로운 자극을 주었다.
1주차 미션은 '구현'에는 성공하였지만 흔히들 말하는 돌아가는 쓰레기를 만든 것 같다. 오늘 PR을 올리고 제출하면서 다른 사람들이 올린PR을 몇 개 훑어봤는데 다들 스트림, 람다를 자유자재로 사용하고 구조도 내가 만든 것보다 훨씬 깔끔했다. 그래서 열정이 더 불타올랐다. 내가 잘하던 분야에서 떠나서 이 분야에서는 내가 거의 제일 밑바닥이라 생각한다. 그만큼 올라갈 곳만 남았고 얼만큼 올라갈 지는 나의 노력에 따라 달라질 것이다. 이번에 느낀 감정을 잊지 않고 프리코스의 합격/불합격과 상관없이 백엔드 개발자를 향해 가는 공부에 몰입해보려 한다.
빌더 패턴
[Effective Java 3/E] 2. 생성자에 매개변수가 많다면 빌더를 고려하라
요즘 도서관에서 이펙티브 자바를 빌려서 공부하고 있다. 프리코스를 진행하며 자바에 대한 개념이 많이 부족하다고 느꼈기 때문이다.
이 책의 타겟은 자바 입문자가 아닌 초중급자라고 했지만 그래도 읽어보고 싶어서 보는데 역시나 조금 어려웠다. 어려운 개념을 계속 파고들며 예시 코드를 따라 치고 내가 진행 중인 미션에도 적용시켜보면서 이해하려고 노력했다.
빌더 패턴이란, 점층적 생성자 패턴의 안정성과 자바빈즈 패턴의 가독성을 합친 패턴이다.
클라이언트가 필요한 객체를 직접 만들지 않고 매개변수만으로 생성자나 정적 팩토리를 호출해 빌더를 얻고, 빌더 객체가 제공하는 세터 메서드들로 원하는 선택 매개변수들을 설정하며 마지막에 매개변수가 없는 build 메서드를 호출해 필요한 객체를 얻는다.
빌더 패턴을 사용하면 메서드를 연쇄적으로 호출하는 메서드 체이닝을 사용하게 되는데,
나는 객체지향 생활체조 규칙의 4번인 한 줄에 점 하나만 찍는다를 위반하는 것이 아닌가 생각하여 찾아봤는데 메서드 체이닝과 스트림은 예외적으로 허용한다. 아직 완전한 이해를 못해서인지 계속 이런 의문이 든다.
빌더 패턴을 적용시키는 것이 과연 객체지향적일까? 데이터 체이닝에 익숙하지 않아서 그런지 명확한 답은 내리지 못했다. 계속해서 고민을 더 해볼 문제이다.
더 자세한 내용은 위 링크에 첨부해두었다.
스트림
스트림은 어제 포스팅한 테코톡을 복습하며 실제 프리코스 코드에 적용시키는 연습을 하였다.
스트림을 말 그대로 데이터를 흐르게 하는 것으로 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 값 요소를 뜻한다.
스트림은 스트림 생성(stream) / 중간 연산(filter, sorted, map ...) / 최종 연산(collect)로 이뤄져 있고 잘 사용하기만 한다면 식을 훨씬 간결하고 가독성 좋게 바꿀 수 있다.
예시로 오늘 내가 스트림을 사용하여 기존의 코드를 바꾼 것을 첨부한다.
기존의 코드
private List<Integer> seperate(final String input) {
List<Integer> numbers = new ArrayList<>();
for (char c : input.toCharArray()) {
numbers.add(Character.getNumericValue(c));
}
return numbers;
}
스트림 적용 코드
private List<Integer> generateList(String input) {
return Arrays.stream(input.split(""))
.map(Integer::valueOf)
.toList();
}
어떤가? 훨씬 깔끔해졌다. 이번 프리코스를 통해 스트림과 람다를 적극적으로 활용해보면서 익숙해지려 노력할 계획이다.
기타 상세한 내용은 역시 위 링크에 첨부하였다.
정적 팩토리 메서드
오늘 가장 많은 시간을 보낸 부분이 정적 팩토리 메서드이다. 기존의 숫자 야구 미션에 나는 매번 생성자를 통해서 코드를 구현하였다.
하지만 디스코드나 오픈 카톡방에서 다들 정적 팩토리 메서드를 적용하는 것에 대해서 이야기를 하길래 어제 이펙티브 자바를 읽고 공부하며 정적 팩토리 메서드를 공부하였고 오늘 기존의 코드는 놔두고(혹시 몰라서) 로컬에 내 코드를 클론하여 정적 팩토리 메서드를 통해 구현하는 연습을 진행하였다. 출력 부분에서 에러가 발생하여 아마 내일 오전 중으로 잡을 예정이고, 그 외에 정적 팩토리 메서드를 사용하니 확실히 이전에 Validator validator = new Validator(); 인스턴스를 선언 후 validator.checkValid(input);와 같이 사용하던 기존의 방식에서 Validator.checkValid(input)으로 사용하니 코드의 양이 훨씬 줄었고, 객체지향의 사실과 오해에서 배웠던 객체가 메시지를 전달하는 것처럼 가독성도 좋았다.
오늘의 회고
하지만 아직 어떤 것이 성능이 더 뛰어나고 더 객체지향적인지 판단을 내리지 못하고 있다.(관련 지식이 없기 때문이다.) 웬만하면 코드 리뷰를 받기 전까지 스스로 알아보려 노력하고 안된다면 다른 분들께 의견을 구해 답을 내리고자 한다.
프리코스는 아무런 제한이나 비용이 들지 않는 모두에게 열린 교육과정이다. 프리코스 시작 전에는 높은 경쟁률로 합격/불합격을 걱정하고만 있었는데 프리코스 시작 후에는 정말 잘 참여했다는 느낌과 함께 4주의 과정에 포비님이 항상 강조하시는 몰입한다면 우테코와 함께하지 못하더라도 스스로 한층 성장해있을 것이라는 게 1주차 과정에 참여하고나서 느낀 점이다. 그래도 합격을 하여 우테코와 10달을 함께하며 다양한 동료들과 함께 성장하고 싶기에 앞으로 남은 3주도 다른 모든 것을 제쳐두고 프리코스에 몰입하려 한다. 함께 프리코스를 진행하는 모든 지원자들도 몰입하여 힘냈으면 한다.