미션2. 로또 학습LOG

hyunji·2023년 2월 27일

이번 로또 미션을 진행하면서 받았던 피드백을 기반으로 학습로그를 작성해본다.

우선 이번 피드백을 통해 새로 배웠던 것들을 중심으로 삼는다.
1. stream 함수 활용
2. associateWith 사용
이렇게 2가지가 있다.

1. 컬렉션 함수 사용

  • 코틀린에서는 스트림 대신 이와 유사한 역할을 하는 함수들을 표준 라이브러리에서 제공한다. 이를 활용하면 컬렉션에 포함된 자료들을 손쉽게 다룰 수 있다.

컬렉션 함수 예시

  1. map() : 컬렉션 내 인자를 다른 값 or 타입으로 변환할 때 사용
    • mapIndexed() : 컬렉션 내 포함된 인자의 인덱스 값을 변환 함수 내에서 사용할 떄 사용
  2. groupBy() : 컬렉션 내 인자들을 지정한 기준에 따라 분류하여 맵 형태로 결과 반환
  3. filter() : 컬렉션 내 인자들 중 주어진 조건과 일치하는 인자만 걸러주는 역할
  4. take() : 컬렉션 내 인자들 중 앞에서 take() 함수의 인자로 받은 개수만큼만을 인자로 갖는 리스트 반환
    • takeLast() : take() 함수와 반대로 뒤에서부터 적용해 반환
    • takeWhile() : 첫 번째 인자부터 시작하여 주어진 조건을 만족하는 인자까지를 포함하는 리스트를 반환
  5. drop() : take() 함수의 반대 역할. 조건을 만족하는 항목을 컬렉션에서 제외한 결과를 반환
  6. distinct() : 컬렉션 내에 포함된 항목 중 중복된 항목을 걸러낸 결과 반환 (equlas로 판단)
  7. zip() : 컬렉션 내의 자료들을 조합해 새로운 자료를 만들 때 사용. 기본 값으로는 조합된 결과를 Pair로 만듦.
  8. count() : 컬렉션 내 포함된 자료의 개수 반환
    이 외에도 다양한 함수가 존재한다...

이번 미션에서 배운 점

  • 이번 로또에서는 count와 take를 사용했다.
  • 피드백 받기 이전에는 subList()를 사용해 원하는 개수만큼의 컬렉션을 가져왔다. 하지만 코틀린에서 컬렉션을 쉽게 다룰 수 있게 해주는 함수가 있다는 피드백을 받고 해당 함수들을 찾아 처음 써봤다.

이랬던 코드가

val randomNumbers = (LottoNumber.getMinNumber()..LottoNumber.getMaxNumber()).shuffled().subList(LOTTO_MIN_SIZE, LOTTO_LIMIT_SIZE).sorted()

이렇게 변했다.

val randomNumbers = (LottoNumber.getMinNumber()..LottoNumber.getMaxNumber()).shuffled().take(LOTTO_SIZE).sorted()

  • take() 함수는 처음 써봤는데 확실히 간편했다.
  • 앞으로 코틀린에서 제공해주는 컬렉션 함수들을 더 공부하고 활용해야겠다는 생각을 했다.

2. AssociateWith() 활용

associate()란?

  • List를 Map 형태로 변형시킬 수 있음
  • associateWhth() : List를 전체 탐색하면서 List의 인자를 key로, 매개변수로 받은 valueSelector를 value로 설정해 Map<key, value>로 리턴함.

이번 미션에서 배운 점

  • associateWith를 배우기 전에는 직접 Map 리스트를 손수 하드코딩해 제작했다. 당연히 코드가 매우매우 너무너무 더러웠다.
  • 이를 해결하기 위해 enum class인 Rank의 값들을 불러온 후 associateWith를 통해 얘네를 키값으로 설정했다.
  • 매우 간편히 내가 원하는 Map 컬렉션을 생성할 수 있었다.

이랬던 내 코드가

var result = mutableMapOf(
        Rank.FIFTH to 0,
        Rank.FOURTH to 0,
        Rank.THIRD to 0,
        Rank.SECOND to 0,
        Rank.FIRST to 0
    )

이렇게 이쁘게 바뀌었다.

val winningResult = Rank.values().associateWith {
            rank ->
            lottos.count { rank == it.matchLotto(winningNumber.lotto, winningNumber.bonusNumber) }
        }

  • 위의 배운 점과 마찬가지로 코틀린에서 제공하는 여러 함수들의 활용성을 높여야겠다는 생각을 했다.

Log 마무리

  • 코틀린에 대해 친숙해져 가고 있는 중이지만 아직 갈길이 멀다는 것을 느낀다.
  • 그 전에는 수많은 for문과 while문 그리고 if문을 통해 코딩을 했다면 이제는 거기서 벗어나 다양한 코틀린 제공 함수들을 활용할 시간이다.
  • 이번주 미션에서 활용한 함수들뿐만 아니라 다른 다양한 함수들도 미리미리 친숙해져있어야 다음 블랙잭, 오목 미션 때 자유롭게 활용가능 할 것이다.
  • 앞으로 꾸준한 언어 공부를 생활화하자.

0개의 댓글