5주차(CS08~CS09): 23-01-30 ~ 23-02-03
코드스쿼드에 참여한지 이제 한달이 되었다.
그리고 회고를 처음 쓴지도 한달이 되었다.
그런데 여전히 어떤 방식으로 회고를 써야할지 아직 잘 모르겠다.
그 주에 학습한 내용을 정리하는 것이 좋을지,
아니면 그 주에 느낀점을 써야할지 모르겠는 것이다. 😇
MBTI ST
로서(변명 변명) 내 감정이나 느낀점을 글로 옮기는 것이 매우 어려운 것이다,,
(한달 동안 느낀 점도 있는데 그거는 따로 월간 회고에 적어보도록 하겠다.)
일단 이번주는 인프런에서 김영한님의 스프링 입문 강의를 듣기 시작했다.
필자는 어렸을 때부터 공부 스타일이 한번에 깊이 공부하는 것보다 "여러번 가볍게 반복"하는 것이다.
새로운 것을 처음 배울 때 모든 걸 다 알려고 하면 금방 지치기도 하고,
일단 이런 개념이 있구나 하고 첨에 가볍게 훑고 두번 세번 보면 머리에 더 잘 들어온다.
(그래서 항상 공부할 때 남들보다 시간이 몇배 든다. 남들 한 번 볼때 나는 세 번 볼 각오로 공부하기에...)
이번주 미션은 주어진 미션 내용을 함수형 프로그래밍으로 작성하는 것이었다.
함수형 프로그래밍 들어는 봤지만 어떤 개념인지 알지를 못해 우선 관련해서 공부를 했다.
(자세한 내용은 밑에 링크 참조하시라.)
그런데 막상 이렇게 공부를 하고 프로그램 구현을 하려는데
어떻게 코드를 작성해야 함수형 프로그래밍인건지 잘 모르겠었다.
계속 코딩을 하면서
Stream API를 활용하고 람다를 쓴다고 해서 함수형 프로그래밍인 것 같지가 않다는 생각이 들었다.
그리고 함수형 프로그래밍을 위해 모든 객체를 불변 객체로 작성하면서
필드 변수를 직접 건들이지 않고 copy해서 사용하는 방식으로 진행했는데도 객체가 변경되는 불상사가 있었다.
public class NumbersCount {
private final List<NumberCount> numbers;
public NumbersCount(List<NumberCount> numbers) {
this.numbers = Collections.unmodifiableList(numbers); // 이런식으로 컬렉션을 불변으로 만들고
}
public NumbersCount append(NumberCount number) {
List<NumberCount> numbers = new ArrayList<>(this.numbers); // numbers를 바로 쓰지 않고 카피해서 썼다...고 생각했다.
// 로직 수행
return new NumbersCount(numbers);
}
이런 고민과 어려움이 계속되었는데 그룹 코드 리뷰 시간에 어느정도 해소가 되었다.
그룹원의 코드를 보면서 Java로 함수형 프로그래밍을 하기 위해서는 Stream과 람다뿐만이 아니라
Fuctional Interface에 대해 알아야겠다고 생각이 들었다.
(Fuctional Interface에 대해 이때 처음 알게되었다.)
(아직 잘은 모르지만 그룹원이 작성한 코드를 보니)
Fuctional Interface를 사용하게 되면 메서드 선언부와 구현부 모두 함수형으로 작성해야 했기 때문이다.
그리고 코드 리뷰때 그룹원이 피드백을 주었는데
객체의 필드 변수를 불변으로 작성했는데도 데이터가 변한 불상사가 일어난 이유는 "shallow copy" 때문이었다.
shallow copy, deep copy의 개념에 대해 알고는 있었지만 정확히 어떤 상황(primitive type 복사시? 객체 복사시?)에서 발생하는지는 몰랐는데
설명을 듣자마자 바로 아!했다.
이게 바로 여러번 가볍게 반복의 효과라고 생각한다.
이런한 개념이 있다는 걸 알고 있는 상태에서 다시 한번 반복하면 머리에 잘 들어온다.
아무튼 매우 알찬 코드 리뷰 시간이었다.