BE Study
[BE Study] Day 3 - 익명 클래스/ 람다/ 스트림 API
고고잉93
2024. 2. 23. 21:31
728x90
◈ BE스터디 3일차 과제
JdbcTemplate을 이용해 SQL을 MySQL로 날릴수 있다.
익명 클래스
- 프로그램에서 일시적으로 한번만 사용되고 버려지는 객체. → 재사용이 되지 않음(일회성)
// 익명 클래스를 사용한 ActionListener의 구현
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Button clicked");
}
});
// 같은 ActionListener를 다시 사용하려고 하면 불가능
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Another button clicked");
}
});
람다( 람다식은 왜 등장했을까)
- 람다 사용시 불필요한 반목문의 삭제가 가능 + 복잡식을 단순하게 표현이 가능
- 멀티 쓰레드를 활용한 병렬처리 가능
- 대신, 과도하게 사용시 가독성 ↓
// 익명 클래스를 사용한 Runnable 인터페이스의 구현
Runnable runnable1 = new Runnable() {
@Override
public void run() {
System.out.println("Thread is running");
}
};
// 람다 표현식을 사용한 Runnable 인터페이스의 구현
Runnable runnable2 = () -> System.out.println("Thread is running");
@FunctionalInterface
@FunctionalInterface
interface MyFunctionalInterface {
void myMethod(); // 추상 메서드
// 다른 메서드 추가(2개 이상)하면 컴파일 오류 발생
// void anotherMethod();
}
public class Main {
public static void main(String[] args) {
// 람다 표현식을 사용하여 함수형 인터페이스의 인스턴스 생성
MyFunctionalInterface myFunction = () -> System.out.println("Hello, World!");
// 함수형 인터페이스의 추상 메서드 호출
myFunction.myMethod();
}
}
함수형 프로그래밍이란?
컴퓨터 프로그램을 수학적인 함수로 간주하고, 상태 변경 및 가변데이터를 피하려는 프로그래밍
- 일급 함수 (First-class functions): 함수를 변수에 할당하고, 함수의 인자로 다른 함수를 전달하고, 함수를 다른 함수의 반환값으로 사용할 수 있습니다.
- 불변성 (Immutability): 데이터의 불변성을 강조하며, 한 번 생성된 데이터를 변경할 수 없도록 합니다. 변경 대신 새로운 데이터를 생성하고 반환합니다.
- 순수 함수 (Pure functions): 부작용이 없는 함수를 작성하여 같은 입력에 대해 항상 같은 출력을 반환하도록 합니다. 이로써 예측 가능하고 테스트하기 쉬운 코드를 작성할 수 있습니다.
- 선언형 프로그래밍 (Declarative programming): 코드가 어떻게 수행되는지보다 무엇을 수행해야 하는지를 강조합니다. 명령형 프로그래밍의 상태 변경 대신 함수 호출과 표현식을 사용합니다.
- 재귀 (Recursion): 반복문 대신 재귀를 사용하여 작업을 수행합니다.
- 필터링과 맵핑 (Filtering and Mapping): 컬렉션을 다룰 때 필터링과 맵핑을 통해 데이터를 변환하거나 추출합니다.
- 고차 함수 (Higher-order functions): 함수를 다루는 함수를 작성하거나, 함수를 반환하거나, 함수를 인자로 받는 함수를 작성할 수 있습니다.
- 람다 표현식 (Lambda expressions): 익명 함수를 간결하게 표현할 수 있는 람다 표현식을 지원합니다.
스트림API
java에서는 JDK8부터 Stream API 와 함수형 인터페이스를 지원하게 되었다.
Stream API는 원본의 데이터를 유지하고, 일회성이며, 내부에 반복 문법 메서드를 가지고 있어 for , while의 사용을 감소시켜 간결한 코드의 작성을 가능하게 한다.
// Stream 사용 전
String[] nameArr = {"IronMan", "Captain", "Hulk", "Thor"}
List<String> nameList = Arrays.asList(nameArr);
// 원본의 데이터가 직접 정렬됨
Arrays.sort(nameArr);
Collections.sort(nameList);
for (String str: nameArr) {
System.out.println(str);
}
for (String str : nameList) {
System.out.println(str);
}
====================================================================================
// Stream 사용 후
String[] nameArr = {"IronMan", "Captain", "Hulk", "Thor"}
List<String> nameList = Arrays.asList(nameArr);
// 원본의 데이터가 아닌 별도의 Stream을 생성함
Stream<String> nameStream = nameList.stream();
Stream<String> arrayStream = Arrays.stream(nameArr);
// 복사된 데이터를 정렬하여 출력함
nameStream.sorted().forEach(System.out::println); //메소드 참조(Method Reference )
arrayStream.sorted().forEach(System.out::println);
출처: https://mangkyu.tistory.com/112
728x90