
람다(Lambda) 표현식은 익명 함수 (Anonymous Function) 이라고도 일컫는다.
(매개변수1, 매개변수2, ...) -> 표현식
(매개변수1, 매개변수2, ...) -> {
// 명령문
}
abstract static class A {
abstract void m();
}
A a = new A() {
@Override
void m() {
}
}; // 이것을 익명 클래스라고 부른다.
람다 표현식은 함수형 인터페이스 (Functional Interface)를 구현하는 데 자주 사용된다. 함수형 인터페이스란 하나의 추상 메서드만을 가지는 인터페이스를 의미한다. 예로,
Runnable,Consumer,Function,Supplier,Comparator등이 있다.
입력된 값을 쓰기만하고 값을 반환하지는 않는다.
사용하는 메소드 이름은accept()
Consumer<String> consumer = new Consumer<>() {
@Override
public void accept(String o) {
System.out.println("o = " + o);
}
};
Consumer<String> consumer2 = (s) -> {
// s 메서드의 첫 번째 매개변수가 오게 된다.
System.out.println("s = " + s);
};
Consumer<String> consumer4 = s -> System.out.println("s = " + s);
Comsumer<String> consumer5 = consumer4.andThen(s -> System.out.println("hello" + s);
consumer4.accept("!"); // s = !만 출력된다.
consumer5.accept("world"); //andThen 메소드 때문에 s = world 이후, "helloworld"도 출력된다.
다음과 같이 람다 표현식으로 간결하게 메소드를 표현할 수 있다.
interface Hello<T> {
void accept(T value);
}
static void sayHello(List<String> list, Hello<String> hello) {
for (String s : list) { // iter
hello.accept(s); // hello 의 accept라는 함수를 아직 정의해주지 않았다.
}
}
private static void test2() {
List<String> germanFriends = Arrays.asList("David", "Jacob", "Paul", "Christopher", "Geza");
sayHello(germanFriends, new Hello<String>() {
@Override
public void accept(String value) {
System.out.println(value);
}
});
sayHello(germanFriends, (s) -> {
System.out.println(s);
});
sayHello(germanFriends, (s) -> System.out.println(s));
}
입력값없이 반환값을 반환해준다.
사용하는 메소드 이름은get()
Supplier<String> stringSupplier1 = () -> {
return "Hello World!";
};
Supplier<String> stringSupplier2 = () -> "Hello World!";
// () -> return "Hello World!"; 라고 해두면 클래스의 return 인지, 메소드의 return인지 모호하게 된다.
String secretValue2 = stringSupplier2.get();
제네릭이 2개 (매개변수, 반환) 존재한다.
Function<String, String> convertUpper1 = s -> {
System.out.println("s = " + s);
return s.toUpperCase();
};
String applied = convertUpper1.apply(helloWorld);
Function<String, String> convertUpper2 = s -> s.toUpperCase();
String mango = convertUpper2.apply("mango");
메소드 바디를 실행시키는 인터페이스
사용하는 메소드 이름은run()
Runnable runner = () -> {
System.out.println("Hello World!");
};
runner.run();
Thread thread = new Thread(
() -> {
System.out.println("Hello World!");
}
);
thread.start();
가변 인자(vararg)를 사용하면 매개변수의 개수를 동적으로 설정할 수 있다. 가변 인자는 메서드가 호출될 때 인자의 수를 유동적으로 받을 수 있게 해주며, 이를 통해 다양한 수의 인자를 처리할 수 있다. 가변 인자는 매개 변수 목록의 마지막에
...를 사용하여 정의한다.
public class A {
public void a(int... numbers) {
for (int number : numbers) {
System.out.println(number);
}
}
}
컴퓨터가 데이터를 효율적으로 저장하고 관리하도록 돕는 형식
연속적인 공간에 차례대로 데이터를 저장한다.
배열 선언
int[] a;
int a[];
배열 생성(길이지정)
a = new int[5];
배열 초기화
int[] b = new int[5]; // 모두 0이 들어가있다.
배열 선언과 동시에 생성 및 초기화
int[] numbers = {10,20,30,40,50};
// 요소 (Element) : 10, 20, 30, 40 , 50
// 인덱스 (Index) : 0, 1, 2, 3, 4
// 접근: numbers[0], numbers[1], ...
동적 배열 기반의 리스트로, 크기가 자동으로 조절된다.
ArrayList<Integer> arr = new ArrayList<>();
값 추가
arr.add(2);
값 접근
arr.get(2) // 해당 index의 요소를 반환
값 제거
arr.remove(1); // 해당 index의 요소를 삭제 한다.
이중 연결 리스트 (Doubly Linked List) 기반의 리스트로, 요소가 노드에 저장된다.
LinkedList<Integer> arr = new LinkedList<>();
후입선출 (Last-In-First-Out, LIFO) 방식의 자료구조
Stack<Integer> S = new Stack<>();
push()와 pop()으로 요소를 추가 및 제거할 수 있다.
- 데이터가 순차적으로 처리되는 선형 자료 구조
- 선입선출 (First-In-First-Out, FIFO) 방식의 자료구조
오늘 마지막 예제 HttpSecurity, SecurityConfig 할 때.. 사실은 점심 배부르게 먹고 초반에 사알짝 딴 생각했는데 와우 놓쳤다 ! ㅎ :) 이러지 말자 ㅠㅠ 넌 그러면 안된다잉 ? 잘하자? 암튼 예제가 이해하기 어려웠는데 복습하고 지금은 이해가 된다. 그래도 수업 때 강사님이 스토리를 넣어서 해주시는데 그 스토리를 잘 들어야 이해가 더 잘 되고 필요성? 이런 게 더 와닿는데 그걸 놓친 것 같아서 질문을 드렸다.
오늘 강사님이 누군가의 블로그에 가변인자가 신기하다고 적어놓은 걸 봤다고 언급하셨는데.. 와.. 진짜 신기하잖아? 강의 자료 보고 기록한 게 함수 이후라 함수는 강의자료를 쭉 안 봤더니 가변 인자는 나도 놓쳤던 건데 오늘 보고 굉장히 신기했다. 누군지 모르겠지만 저도 신기합니다 ! 혼자 신기한 게 아닐 거예요 ! ㅋㅎㅋㅎㅎ
오늘은 더 스무스~하게 진행이 되었다. 딱 인사 나누고 스크럼 ~~ 근데 정말 감동이었다. 점심을 많이 먹어서 배부르다.. 이렇게 말씀드렸는데 팀원 분 중 한 분이 점심 뭐 먹었냐고 물어봐줘서.. 하 감동이다. 그냥 그 노력조차 감사했다. 아싸 ~ 그리고 오늘도 HttpSecurity 예제 놓쳐서 어려웠다라고 말씀드렸더니 팀원분들께서 다양하게 조언(?)처럼 알려주셔서 감사했다 ! 내일은 RBF하는 날인데... 또 처음이니 어찌 해야 할지 모르겠다 흑 하지만, 내일도 잘 해내겠지 ! :)
그리고 알고리즘 문제 풀 때마다 남들이 풀어놓은 람다식 보면.. 이게 뭔 말이야 ㅠ 이랬는데 오늘 람다 수업을 들어서 유익했다 ! 근데 또 알고리즘 문제 풀면서 마주하는 람다들은 막 또 복잡하고 그런 거 아닌가 모르겠다.. 에효 !
오늘 어려웠던 예제도 스프링이랑 관련되어있는 개념인 것 같은데.. 이렇게 스프링 관련 개념만 나오면 어려워하는데, 스프링 때는 더 정신 빡!!! 차리고 열심히 들어야겠다.
아 맞다, 강사님께서 과제를 주셨는데 일단... 단계들의 설명만 봐도 진짜 어려워보이는데.. 이게 맞나? 나만 어려워보이는 거 아니지? 아직 구현을 시작하진 않았지만,, 일단 보기엔 어려워보인다. 하..ㅎㅎㅎㅎㅎ 파이팅
목요일.. 드디어 목요일 내일은 금요일이다 신난다 !!!
오늘도 수고했고, 내일 한 주 마무리도 잘해보자 :)