오늘 한일

로또 3단계 피드백 반영

Collectors.toMap(keyMapper, valueMapper, mergeFunction, mapFactory)

통계를 구하는 부분에서 toMap 메소드를 사용해봤다. map을 생성하고 조건에 따라 값을 설정하는 코드는 대게 길게 늘어지기 마련인데, toMap을 사용하니까 많이 간소화됐다. EnumMap이랑 EnumSet이 무엇인지도 알게 되었다.

캡슐화

나는 보통 final은 public으로 선언하고 외부에서 직접 접근했다. 피드백에서는 값을 래핑하는 객체의 멤버변수가 final로 선언되었더라도, 캡슐화를 지키는 것이 좋다고 한다. 어쨋든 객체지향을 추구하는 입장이니 캡슐화를 지키지 않을 이유는 없을 듯.

일급 콜렉션

콜렉션을 감싸는 일급 콜렉션은 콜렉션을 제외하고는 멤버변수가 없어야 한다. 이 원칙을 따르다 보면 자연스레 클래스가 분리된다.

로또 4단계 구현 선진행

4단계는 웹 UI 적용인데, 자동차 경주에서 했던 것과는 달리 기존 코드를 거의 수정하지 않고 구현할 수 있었다.

백준 DP: 2n 타일링, 2n 타일링2

백준 dp관련 문제를 2개 풀었다. 2n 타일링은 그림을 그리면서 점화식을 구하다보니 피보나치가 보였고, 2n 타일링2도 점화식을 찾기가 힘들어서 그림을 그려보면서 찾았다. 아직 dp는 그림을 그려보지 않고는 도저히 점화식을 못찾겠다.

함수형 프로그래밍과 Javascript ES6+: 지연평가 테스트

22일날 공부했던 Lazy Evaluation와 Eager Evaluation의 성능 차이에 대한 목차를 수강했다.

// 지연평가 효율성은 얼마나 있을까? -> 사실 그렇게 크게 차이나지 않음
function test(name, time, f) {
  console.time(name);
  while (time--) f();
  console.timeEnd(name);
}

// 약 480ms ~ 520ms
test('range', 10, () => reduce(add, range(1000000)));
// 약 350ms ~ 370ms
test('L.range', 10, () => reduce(add, L.range(1000000)));

오늘 느낀점

로또 3단계 피드백을 반영하면서 객체지향 생활체조에 등장하는 원칙들을 지키다보면 SOLID 원칙에 일치하는 코드를 작성하게 되는 것인가가 궁금해졌다. 뭐 당연히 아니겠지만, 자료가 있을라나.. 한번 찾아봐야지.

dp 문제를 풀면서 그림을 그릴 때 SmoothDraw라는 프로그램을 사용했는데, 쓸만한 것 같다.

내일 할일

  • 백준 DP 관련 문제풀이
  • 로또 3단계 merge (아마도?) & 로또 4단계 피드백 요청
  • 인프런: 함수형 프로그래밍과 JavaScript ES6+
  • 1/4/7/14 앱 구상