dev-course day8

2rlokr·2025년 3월 13일

dev-course

목록 보기
8/43

오늘 배운 것

실습

람다 (Lambda Expression)

람다(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 등이 있다.

Consumer Interface

입력된 값을 쓰기만하고 값을 반환하지는 않는다.
사용하는 메소드 이름은 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));
    
}

Supplier

입력값없이 반환값을 반환해준다.
사용하는 메소드 이름은 get()

Supplier<String> stringSupplier1 = () -> {
	return "Hello World!";
};

Supplier<String> stringSupplier2 = () -> "Hello World!"; 
// () -> return "Hello World!"; 라고 해두면 클래스의 return 인지, 메소드의 return인지 모호하게 된다.
String secretValue2 = stringSupplier2.get();

Function

제네릭이 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");

Runnable

메소드 바디를 실행시키는 인터페이스
사용하는 메소드 이름은 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)

동적 배열 기반의 리스트로, 크기가 자동으로 조절된다.

ArrayList<Integer> arr = new ArrayList<>();

값 추가

arr.add(2);

값 접근

arr.get(2) // 해당 index의 요소를 반환

값 제거

arr.remove(1); // 해당 index의 요소를 삭제 한다. 

연결 리스트 (LinkedList)

이중 연결 리스트 (Doubly Linked List) 기반의 리스트로, 요소가 노드에 저장된다.

LinkedList<Integer> arr = new LinkedList<>();

  • previous, next로 이전, 이후의 노드를 알 수 있다.
  • 특정 Node가 빠지면, 이전 노드에게 next 노드를 알려주고, 자신은 NULL로 해주면 된다.

스택 (Stack)

후입선출 (Last-In-First-Out, LIFO) 방식의 자료구조

Stack<Integer> S = new Stack<>();

  • push()pop()으로 요소를 추가 및 제거할 수 있다.

큐 (Queue)

  • 데이터가 순차적으로 처리되는 선형 자료 구조
  • 선입선출 (First-In-First-Out, FIFO) 방식의 자료구조

오늘 어려웠던 것

오늘 마지막 예제 HttpSecurity, SecurityConfig 할 때.. 사실은 점심 배부르게 먹고 초반에 사알짝 딴 생각했는데 와우 놓쳤다 ! ㅎ :) 이러지 말자 ㅠㅠ 넌 그러면 안된다잉 ? 잘하자? 암튼 예제가 이해하기 어려웠는데 복습하고 지금은 이해가 된다. 그래도 수업 때 강사님이 스토리를 넣어서 해주시는데 그 스토리를 잘 들어야 이해가 더 잘 되고 필요성? 이런 게 더 와닿는데 그걸 놓친 것 같아서 질문을 드렸다.

오늘 신기했던 것

오늘 강사님이 누군가의 블로그에 가변인자가 신기하다고 적어놓은 걸 봤다고 언급하셨는데.. 와.. 진짜 신기하잖아? 강의 자료 보고 기록한 게 함수 이후라 함수는 강의자료를 쭉 안 봤더니 가변 인자는 나도 놓쳤던 건데 오늘 보고 굉장히 신기했다. 누군지 모르겠지만 저도 신기합니다 ! 혼자 신기한 게 아닐 거예요 ! ㅋㅎㅋㅎㅎ

팀 활동 후기

오늘은 더 스무스~하게 진행이 되었다. 딱 인사 나누고 스크럼 ~~ 근데 정말 감동이었다. 점심을 많이 먹어서 배부르다.. 이렇게 말씀드렸는데 팀원 분 중 한 분이 점심 뭐 먹었냐고 물어봐줘서.. 하 감동이다. 그냥 그 노력조차 감사했다. 아싸 ~ 그리고 오늘도 HttpSecurity 예제 놓쳐서 어려웠다라고 말씀드렸더니 팀원분들께서 다양하게 조언(?)처럼 알려주셔서 감사했다 ! 내일은 RBF하는 날인데... 또 처음이니 어찌 해야 할지 모르겠다 흑 하지만, 내일도 잘 해내겠지 ! :)

느낀 점

그리고 알고리즘 문제 풀 때마다 남들이 풀어놓은 람다식 보면.. 이게 뭔 말이야 ㅠ 이랬는데 오늘 람다 수업을 들어서 유익했다 ! 근데 또 알고리즘 문제 풀면서 마주하는 람다들은 막 또 복잡하고 그런 거 아닌가 모르겠다.. 에효 !

오늘 어려웠던 예제도 스프링이랑 관련되어있는 개념인 것 같은데.. 이렇게 스프링 관련 개념만 나오면 어려워하는데, 스프링 때는 더 정신 빡!!! 차리고 열심히 들어야겠다.

아 맞다, 강사님께서 과제를 주셨는데 일단... 단계들의 설명만 봐도 진짜 어려워보이는데.. 이게 맞나? 나만 어려워보이는 거 아니지? 아직 구현을 시작하진 않았지만,, 일단 보기엔 어려워보인다. 하..ㅎㅎㅎㅎㅎ 파이팅

목요일.. 드디어 목요일 내일은 금요일이다 신난다 !!!
오늘도 수고했고, 내일 한 주 마무리도 잘해보자 :)

0개의 댓글