열정 실천

[Java] 람다함수, 이걸 안 써? - 내림차순 정렬, 2차원 배열 정렬, 가장 큰 수 만들기 본문

개발 공부/JAVA

[Java] 람다함수, 이걸 안 써? - 내림차순 정렬, 2차원 배열 정렬, 가장 큰 수 만들기

구운오니 2024. 10. 23. 00:20
728x90

람다 함수란? 

이름이 없는 함수(익명함수)이다. 

 

자바 8 이후로 함수형 인터페이스를 지원하고 있다. 

 

<기본 구조>

람다 하수는 다음과 같은 형태로 표현된다. 

( 매개변수 ) -> { 함수 몸체 } 

 

예시 

( int x, int y ) -> { return x + y }

 

 

  • 매개변수 목록: (int x, int y) — 함수에 전달되는 매개변수
  • 화살표 연산자 (->)
  • 함수 몸체: { return x + y; } — 함수가 수행할 작업

 

 

람다함수의 장점

1. 간결함 : 익명 클래스봐다 훨씬 적은 코드로 표현할 수 있다. 

 

기존의 익명 클래스 방식 

// 익명 클래스로 Runnable 구현
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello, World!");
    }
};

 

⬇⬇⬇⬇⬇⬇

람다 함수로 변환

// 람다 표현식으로 Runnable 구현
Runnable runnable = () -> System.out.println("Hello, World!");

 

2. 함수형 프로그래밍 : 코드의 가독성과 유지보수가 쉬워진다. 

3. 매개변수로 전달 가능 : 람다 함수를 메소드의 인자로 간편하게 전달할 수 있다. (함수를 매개변수로!😮)

 

 

 

 

람다 함수 활용법 

 

1. 내림차순 정렬

 

자바의 Array.sort() 함수는 기본적으로 오름차순 정렬을 해준다.

내림차순으로 바꾸기 위해서는 아래코드와 같이 

Arrays.sort(citationsInteger, Collections.reverseOrder());

 

두 번째 인자로 Collections 클래스의 reverseOrder() 메서드 리턴값을 전달인자로 주면 된다. 

하지만 이 Collections에선 객체만 다룰 수 있기 때문에 int로 선언한 배열을 Integer로 바꿔주어야한다

Integer[] citationsInteger = Arrays.stream(citations).boxed().toArray(Integer[]::new);

 

때문에 코드가 너무 길고 복잡해진다......

 

 

하지만 람다 함수를 이용하면?!

 

Arrays.sort(jobs, (a, b) -> a - b); //오름차순
Arrays.sort(jobs, (a, b) -> b - a); //내림차순

 

오름차순, 내림차순 모두 이렇게 간단하게 표현할 수 있다.

(a, b) -> a - b ==>  a가 b보다 작을 경우 음수 반환, 같으면 0, 클 경우 양수 반환

(a, b) -> b - a ==> 반대로 b가 a보다 작으면 음수, 크면 양수 반환

 

우선순위 큐에서도 오름차순으로 하려면 ..!

PriorityQueue<int[]> pQ = new PriorityQueue<>((a, b) -> a - b);

 

 

2. 2차원 배열 정렬

 

만약 
 2  100         1  91

 4  56           2 100

 1  91    ->    3  74

 5  12           4  56

 3  74           5  12

 

이러한 이차원 배열에서 0 번째 요소로 정렬을 하고 싶을 때도 람다함수를 사용하면 굉장히 간단하게 작성할 수 있다. 

Arrays.sort(arr, (a,b) -> a[0] - b[0]); 0번째 요소를 기준으로 오름차순 정렬
Arrays.sort(arr, (a,b) -> b[0] - a[0]); 0번째 요소를 기준으로 내림차순 정렬

 

이게 끝이지롱!!!!!

 

3. 숫자를 조합해서 가장 큰 수를 만들 때!

[6, 10, 2] -> 6210

[3, 30, 34, 5, 9] -> 9534330

이렇게 주어진 수로 가장 큰 숫자를 만들어야할 때!! 

Arrays.sort(arr, (o1, o2) -> (o2+o1).compareTo(o1+o2));

 

이렇게 간단할 수가 업땨...😲

 

3과 30을 비교하면 330 > 303 이기때문에 3이 앞에 오고 

30과 34를 비교하면 3034 < 3430 이기때문에 34가 앞에 온다. 

최종적으로 가장 큰 수를 만드는 순서인 9, 5, 34, 3, 30 으로 정렬이 되게 된다. 

 

 

 

 

 

728x90