ITWILL학원 : 21강 JAVA BY 윤미영강사 1. 람다식
자바 8에서 추가된 가장 큰 특징으로 함수형 프로그래밍 형태를 받아들인 결과
메서드 vs 함수
객체지향 프로그래밍개념에서 : 메서드와 함수는 동일하다
함수형 프로그래밍개념에서 : 메서드(특정객체가 수행하는 기능) vs 함수(특정 객체에 속하지않는 기능)
람다식을 쓰는 이유 : 코드가 간결해짐.
람다식 사용가능한 곳 :
함수형 인터페이스 중 익명클래스를 사용한 부분만 람다식으로 대체해서 사용가능.
함수형 인터페이스 가 뭘까?
함수형 인터페이스 : 인터페이스 중에서 한 개의 abstract메서드를 가진 인터페이스
1 2 3 4 5 6 7 8 9 10 11 12 13 (파라미터타입) -> {실행문;} () -> System.out.println("Hi" ); (msg) -> System.out.println(msg); (msg) -> { System.out.println(msg); return msg; }
이클립스 단축키 : new연산자의 대괄호{} 전체 선택 후 ctrl + 1 -> convert to lambda expression 를 선택하면 자동으로 람다식을 생성해준다.
2. 인터페이스 Comparator
객체정렬방식 2가지
Comparable 인터페이스 : 정렬 대상 클래스를 자바에서 기본적으로 제공하고 있는 Comparable 인터페이스를 구현하도록 변경
만약 이미 존재하고 있는 정렬 기준과 다른 정렬 기준으로 정렬을 하고 싶을 때는 어떻게 해야할까?
Comparator 인터페이스 : 정렬 기준을 누락된 클래스의 객체나 기존 정렬 기준을 무시하고 새로운 정렬 기준으로 객체를 정렬가능.
데이터타입별 비교방법
int 데이터타입은 부등호로 서로 비교가능
String은 부등호로 비교가 안됨 => compareTo()메서드사용해서 비교해야함
int compare(T o1, T o2) : Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.
리턴값이 -1이면 위치가 앞으로 , 0이면 가만히, 1이면 뒤로
o1 > o2 : negative integer
o1 = o2 : zero
o1 < o2 : positive integer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 public class Person { String name; int age; public Person (int age, String name) { this .age = age; this .name = name; } public String getName () { return name; } (생략) @Override public String toString () { return "Person [name=" + name + ", age=" + age + "]" ; } public static void main (String[] args) { Person[] people = new Person[3 ]; people[0 ] = new Person(22 , "홍" ); people[1 ] = new Person(20 , "길" ); people[2 ] = new Person(24 , "동" ); System.out.println("배열의 인덱스출력 : " +people[0 ]); System.out.println("toString이용 배열출력(입력순) : " +Arrays.toString(people)); Arrays.sort(people, new Comp()); System.out.println("sort+외부클래스사용 배열출력(나이오름차순) : " +Arrays.toString(people)); Arrays.sort(people, new Comparator<Person>() { @Override public int compare (Person o1, Person o2) { if (o1.age > o2.age) return -1 ; else return 1 ; } }); System.out.println("sort+내부클래스사용+age(나이내림차순) 배열출력 : " +Arrays.toString(people)); Arrays.sort(people, new Comparator<Person>() { @Override public int compare (Person o1, Person o2) { if (o1.name.compareTo(o2.name) > 0 ) return 1 ; else return -1 ; } }); System.out.println("sort+내부클래스사용+name 배열출력(가나다순) : " +Arrays.toString(people)); } } class Comp implements Comparator <Person > { @Override public int compare (Person arg0, Person arg1) { if (arg0.age < arg1.age){ return -1 ; }else { return 1 ; } } }
Comparator 객체는 메서드가 하나 뿐인 함수형 인터페이스를 구현하기 때문에 람다 함수
로 대체가 가능.
기존에 있던 new Comparator<Person>() { @Override public int compare
를 화살표로 대체해주면 람다식완성.
데이터 타입도 지울 수 있다 : (Person o1, Person o2) -> (o1, o2)로 가능.
1 2 3 4 5 6 7 Arrays.sort(people, (o1, o2) -> if (o1.name.compareTo(o2.name) > 0 ) return 1 ; else return -1 ; } ); System.out.println(Arrays.toString(people));
참고링크 : Comparable과 Comparator 참고링크 : 객체 정렬하기 1부 - Comparable vs Comparator