21년 1월 19일

한 일

  • 자바8부터 함수형 프로그래밍을 지원하기 위해 나온 함수형 인터페이스에 대해 공부하였다.

    1. 자바의 정석 Chapter 14를 참고하였다.

    2. 클로저는 단순히 익명함수가 아니라, 익명함수가 선언될 당시의 외부스코프(lexical Envirionment)를 포함한 것이다.

      • 함수라고 할 수도 있고, 자료구조라고 할 수도 있다.
      • 자바에서 클로저에 담긴 외부스코프의 변수는 final취급이 된다.
    3. 사실 람다식은 익명 클래스이자 익명 객체의 생성자이고,

      이와 일치하는 인터페이스에 대입해줘야 컴파일러가 알아서 해당 인터페이스로 형변환을 해준다.

    4. Runnable, Supplier, Function, UnaryOperator 등 자바에서는 함수형 프로그래밍을 지원하기 위해

      다양한 Functional Interface를 준비해두었다.

    5. 준비된 Functional Interface외에 필요한 게 생긴다면 직접 구현해서 사용해도 된다.

    6. 특정 메소드를 참조하기만 하는 람다식은 메소드 참조 식으로 바꿀 수 있다.

      import java.util.function.Consumer;
           
      public class Test {
          public static void method(int i){
              System.out.println(i + " method");
          }
      }
           
      //두 식 모두 동일
      Consumer<Integer> con1 = (i) -> { Test.method(i); };
      Consumer<Integer> con2 = Test::method;
      
  • 프로그래머스의 체육복, 조이스틱, 큰수만들기를 풀었다.

    1. 체육복:
      • 앞에서부터 순회하며 당장 빌려줄 체육복이 있으면 빌려줄 사람이 있는지 확인하고 왼쪽, 오른쪽 순으로 빌려주면 된다.
      • 간단한 greedy 문제이다.
    2. 조이스틱:

      • 위 아래 버튼으로 인한 최소 입력개수는 정해져 있어서 어려울게 없다.
      • 왼쪽 오른쪽 버튼으로 인한 최소 입력개수를 구하기 위해서는 이동하는 범위를 그림적으로 생각해야 한다.
      • 0인덱스를 제외하고, 순회하며 ‘A’가 아닌 P1과 그 다음 ‘A’가 아닌 P2를 통해 수평 버튼이 눌릴 수 있는 경우의 수를 생각한다.
    3. 큰수만들기:

      • 이건 정말 어려워서 결국 못 풀고 답을 봤다.

      • 빼야하는 k개와 남아있어야 하는 n-k개를 나눈 후,

        k개의 뒤쪽 기준으로 n-k개의 앞쪽부터 하나하나 비교하며 swap 해줘야 기존의 숫자 순서를 오염시키지 않고 k개를 빼는게 가능하다.

      • 글로 설명이 힘들어서 코드를 봐야 이해할 수 있을 것이다.

            public String solution(String number, int k) {
                char[] charArr = number.toCharArray();
                for(int i = k - 1; i >=0; i--){
                    for(int j = k; j < charArr.length; j++) {
                        if(charArr[i] >= charArr[j]){
                            char temp = charArr[i];
                            charArr[i] = charArr[j];
                            charArr[j] = temp;
                        }
                        else
                            break;
                    }
                }
               
                return String.valueOf(Arrays.copyOfRange(charArr, k, charArr.length));
            }
        

잘못한 것

  • 알고리즘 문제를 또 오래 잡고있다보니 시간조절이 안되었다.
  • 이건 고질적인 문제라서 할말이없다. ㅠㅠ
  • 시간 조절하는 연습을 꼭 할것이다.

잘한 것

  • 너무 피곤해서 오늘은 쉴까 생각했었는데, 그래도 다시 정상 궤도로 돌아왔다.
  • 꾸준히 하는게 중요한데 꾸준히 하고 있어서 다행이다.

느낌

  • 함수형 프로그래밍은 함수를 객체처럼 사용할 수 있어야 하기 때문에, Functional Interface를 사용해야 한다고 생각한다.
  • 함수형 프로그래밍은 지금 내 수준으로 완벽히 이해하기 힘들고, 그런 식으로 구현하기도 힘들것 같다.
  • 그냥 그런 패러다임이 있구나 자바에선 이런걸 제공하는 구나 정도만 알고 넘어가야겠다.

할 일

  • 코드스쿼드 미션하기
  • 프로그래머스 문제 풀기
  • TCP/IP 쉽게 더쉽게 읽기