반응형

요즘 AI공부를 시작하다보니, AI공부를 쉬고싶을 때 백엔드 공부로 치유하는 느낌이다,, 원래는 백엔드도 점점 공부라고 느껴지던 참이였는데,, 치료된건가..? 싶다 일단 AI 끝나면 멀티스레드를 마무리하고, 람다를 제대로 다시 공부해볼 예정이다.
효율적인 코드?
역시 영한 강사님이다,, 아직 시작 부분이지만, 람다가 왜 필요한지 설명해주신다.
머리속 코드로 작성해보자면
public void ex1(){
String ex1 = "행복"
System.out.println("오늘은 "+ ex1+ "해요");
}
public void ex2(){
String ex2 = "우울"
System.out.println("오늘은 "+ ex2+ "해요");
}
public class Main {
public static void main(String[] args) {
ex1();
//ex2();
}
}
오늘은 행복해요, 오늘은 우울해요 둘중 하나를 사용하고 싶으면 ex1(); or ex2(); 둘 메서드 중 하나를 호출하면 된다.
문제
하지만 두 메서드에는 중복된 코드가 보인다는 것이 문제이다.
영한강사님: 가장 중요한 부분은 중복된 코드를 제거하는 것 입니다.
해결방안
바뀌는 부분을 매개변수를 통해서 해결하자.
public void ex1(String ex1){
System.out.println("오늘은 "+ ex1+ "해요");
}
public class Main {
public static void main(String[] args) {
ex1("행복");
}
}
변수는 이렇게 해결 할 수 있다, 하지만 동작이 중복된다면 이는 어떻게 해야하는 가?
// 1. 변하는 부분을 인터페이스로 추출
interface Process {
void execute();
}
// 2. 중복되는 부분을 하나의 메서드로 묶음
public void run(Process process) {
System.out.println("프로그램 시작");
process.execute();
System.out.println("프로그램 종료");
}
// 3. 익명 클래스를 매개변수로 전달하여 중복 제거
public static void main(String[] args) {
Ex0RefMain main = new Ex0RefMain();
main.run(new Process() {
@Override
public void execute() {
System.out.println("Hello Java");
}
});
main.run(new Process() {
@Override
public void execute() {
System.out.println("Hello Spring");
}
});
}
다음과 같이 익명클래스를 선언하고, 매개변수로 넘겨주면된다.
public class Main {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("익명 클래스의 run() 메서드 실행!");
}
};
runnable.run();
}
}
문제
너무 가독성이 떨어진다. 그렇기 때문에 람다를 쓰는 것이다.
// 1. 함수형 인터페이스 선언 (이미 선언되어 있음)
@FunctionalInterface
interface Process {
void execute();
}
// 2. 중복되는 부분을 하나의 메서드로 묶음
public void run(Process process) {
System.out.println("프로그램 시작");
process.execute();
System.out.println("프로그램 종료");
}
// 3. 람다식으로 중복 제거
public static void main(String[] args) {
Ex0RefMain main = new Ex0RefMain();
main.run(() -> System.out.println("Hello Java"));
main.run(() -> System.out.println("Hello Spring"));
}
이렇게 하면 아주 가독성이 좋아진다.
그리고
@FunctionalInterface
에 대해서 잠깐 설명하자면,
람다는 축약식이기 때문에 interface에 선언된 메서드가 2개 이상이면 뭘 선택해야 할 지 모르기 때문에 에러가난다.
그렇기 때문에 @FunctionalInterface 미리 이 어너테이션으로 2개이상 못하게 방어하는 것이다.

반응형
'JAVA' 카테고리의 다른 글
태태개발일지 - JAVA 고급편(3) 김영한 람다 (1) | 2025.05.05 |
---|---|
태태개발일지 - JAVA 고급편(3) 김영한 람다 (1) | 2025.05.02 |
태태개발일지 - 고급 java (김영한) 컬랙션 동시성 (1) | 2025.03.19 |
태태개발일지 - 자바 고급 (김영한) CAS 연산 (1) | 2025.03.17 |
태태개발일지 - java 고급 멀티스레드(김영한) (1) | 2025.03.08 |