21년 1월 19일
한 일
-
자바8부터 함수형 프로그래밍을 지원하기 위해 나온 함수형 인터페이스에 대해 공부하였다.
-
자바의 정석 Chapter 14를 참고하였다.
-
클로저는 단순히 익명함수가 아니라, 익명함수가 선언될 당시의 외부스코프(lexical Envirionment)를 포함한 것이다.
- 함수라고 할 수도 있고, 자료구조라고 할 수도 있다.
- 자바에서 클로저에 담긴 외부스코프의 변수는 final취급이 된다.
-
사실 람다식은 익명 클래스이자 익명 객체의 생성자이고,
이와 일치하는 인터페이스에 대입해줘야 컴파일러가 알아서 해당 인터페이스로 형변환을 해준다.
-
Runnable, Supplier, Function, UnaryOperator 등 자바에서는 함수형 프로그래밍을 지원하기 위해
다양한 Functional Interface를 준비해두었다.
-
준비된 Functional Interface외에 필요한 게 생긴다면 직접 구현해서 사용해도 된다.
-
특정 메소드를 참조하기만 하는 람다식은 메소드 참조 식으로 바꿀 수 있다.
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;
-
-
프로그래머스의 체육복, 조이스틱, 큰수만들기를 풀었다.
- 체육복:
- 앞에서부터 순회하며 당장 빌려줄 체육복이 있으면 빌려줄 사람이 있는지 확인하고 왼쪽, 오른쪽 순으로 빌려주면 된다.
- 간단한 greedy 문제이다.
-
조이스틱:
- 위 아래 버튼으로 인한 최소 입력개수는 정해져 있어서 어려울게 없다.
- 왼쪽 오른쪽 버튼으로 인한 최소 입력개수를 구하기 위해서는 이동하는 범위를 그림적으로 생각해야 한다.
- 0인덱스를 제외하고, 순회하며 ‘A’가 아닌 P1과 그 다음 ‘A’가 아닌 P2를 통해 수평 버튼이 눌릴 수 있는 경우의 수를 생각한다.
-
큰수만들기:
-
이건 정말 어려워서 결국 못 풀고 답을 봤다.
-
빼야하는 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 쉽게 더쉽게 읽기