홈페이지만들기4 : 게시판글쓰기구현

람다식을 이용한 함수형 프로그래밍2 : 메서드

표준 함수형 인터페이스 메서드

  • java.util.function패키지의 인터페이스들은 모두 하나 이상의 default 또는 static 메서드를 포함하고 있는데 이들 메서드를 이용해서 동일한 계열의 여러 동작을 연결해서 사용할 수 있다.
Read More

[ITWILL : JAVA] 람다식을 이용한 함수형 프로그래밍1 : 계열

ITWILL학원 : 22강 JAVA BY 윤미영강사

  • 자바 8에서는 빈번히 사용되는 함수형 인터페이스들을 java.util.function패키지를 통해 제공한다.

https://altongmon.tistory.com/245

https://brunch.co.kr/@oemilk/205

1. Consumer 계열

  • 소비자계열은 무엇을 소비할까? 바로 파라미터이다.
  • 전달받은 파라미터를 받아서 소비하는 소비자이며 리턴값은 없다
  • Consumer 계열의 인터페이스 :
    • biConsumer는 bi가 두 개라는 의미로 두 개의 파라미터를 받는다.
    • 객체를 처리하지않고 기본형을 처리하는 경우 double, long, int 값을 처리할 수 있다.
      https://altongmon.tistory.com/245

2. Supplier 계열

  • 공급자계열은 무엇을 공급할까? 바로 리턴값이다.
  • 파라미터를 받지 않고 자체적으로 리턴할 값을 생성한다
  • 파라미터가 없기때문에 bi가 붙는 형태는 없다.
인터페이스명 메서드 설명
Supplier T get() T타입 객체 리턴
pSupplier p getAsp() p타입의 값 리턴
참고 p는 boolean, int, long, double를 의미한다

3. Function 계열

  • 파라미터도 받고, 리턴도 존재한다.

https://altongmon.tistory.com/245

4. Operator 계열

  • function계열과 유사하게 파라미터와 리턴 타입을 모두 갖는다.
  • 차이점 :
    • function계열 : 파라미터와 리턴 타입이 무관
    • operator계열 : 파라미터를 이용해 어떤 연산을 수행한 후 파라미터와 같은 타입이 리턴된다.

https://altongmon.tistory.com/246

5. Predicate 계열

  • 파라미터와 리턴타입을 갖는데 리턴타입이 boolean으로 고정.

https://altongmon.tistory.com/246

[ITWILL : JAVA]람다식개념, 인터페이스 Comparator

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 {
//1. 멤버변수생성
String name;
int age;

//3. 생성자만들기
public Person(int age, String name) {
this.age = age;
this.name = name;
}

//2. getter와 setter만들기
public String getName() {
return name;
}

(생략)

//5. toString생성
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}

public static void main(String[] args) {

//4. 배열만들기
Person[] people = new Person[3];
people[0] = new Person(22, "홍");
people[1] = new Person(20, "길");
people[2] = new Person(24, "동");

//4-1. 배열출력하기 - toString사용
System.out.println("배열의 인덱스출력 : "+people[0]);
System.out.println("toString이용 배열출력(입력순) : "+Arrays.toString(people));

//6. sort하기 :
//Arrays.sort(people); //에러발생
//왜 에러날까? sort하기위해서는 정렬의 기준이 필요하다. 멤버변수 두개중에 어떤걸 기준잡을지 말해야한다 = Comparator
//7-2. comparator이용해서 나이순으로 sort하기
Arrays.sort(people, new Comp());
System.out.println("sort+외부클래스사용 배열출력(나이오름차순) : "+Arrays.toString(people));
//7-3. 익명클래스를 사용해서 나이순으로 sort하기
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));

//7-4. 이름순으로 정렬하기
//String은 부등호로 비교가 안됨 => compareTo()메서드사용해서 비교해야함
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));

}//main매서드닫음


}//Person클래스닫음


//7. comparaor생성(내부클래스말고 독립적인 클래스로 생성)
class Comp implements Comparator<Person>{
//7-1. 추상메서드 오버라이딩
@Override
public int compare(Person arg0, Person arg1) {
if(arg0.age < arg1.age){
return -1; //오름차순(arg0보다 arg1이 더 큰 경우)
}else{
return 1;
}
}
}//Comp클래스닫음
  • Comparator 객체는 메서드가 하나 뿐인 함수형 인터페이스를 구현하기 때문에 람다 함수로 대체가 가능.
  • 기존에 있던 new Comparator<Person>() { @Override public int compare를 화살표로 대체해주면 람다식완성.
  • 데이터 타입도 지울 수 있다 : (Person o1, Person o2) -> (o1, o2)로 가능.
1
2
3
4
5
6
7
//7-4. 이름순으로 정렬하기(람다식 사용)
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