람다식을 이용한 함수형 프로그래밍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

[ITWILL : JSP]홈페이지만들기3 : 로그인/로그아웃 기능 구현

ITWILL학원 : 34강 JSP기초 BY 정규태강사

1. loginForm.jsp 생성

  • header include하기 : jsp:include page="../inc/top.jsp"
  • footer include하기 : jsp:include page="../inc/bottom.jsp"
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
<body>
<div id="wrap">
<!-- 헤더들어가는 곳 -->
<jsp:include page="../inc/top.jsp"></jsp:include>
<!-- 헤더들어가는 곳 -->

<!-- 본문들어가는 곳 -->
<!-- 본문메인이미지 -->
<div id="sub_img_member"></div>
<!-- 본문메인이미지 -->
<!-- 왼쪽메뉴 -->
<nav id="sub_menu">
<ul>
<li><a href="#">Join us</a></li>
<li><a href="#">Privacy policy</a></li>
</ul>
</nav>
<!-- 왼쪽메뉴 -->
<!-- 본문내용 -->
<article>
<h1>로그인</h1>
<form action="loginPro.jsp" id="join" method="post">
<fieldset>
<legend>로그인정보</legend>
<label>아이디</label> <input type="text" name="id"><br>
<label>비밀번호</label> <input type="password" name="pw"><br>
</fieldset>
<div class="clear"></div>
<div id="buttons">
<input type="submit" value="Submit" class="submit">
<input type="reset" value="Cancel" class="cancel">
</div>
</form>
</article>
<!-- 본문내용 -->
<!-- 본문들어가는 곳 -->

<div class="clear"></div>
<!-- 푸터들어가는 곳 -->
<jsp:include page="../inc/bottom.jsp"></jsp:include>
<!-- 푸터들어가는 곳 -->
</div>
</body>

2. loginPro.jsp생성

  • int데이터타입으로 변수받아서 데이터처리.
  • 아이디와 비밀번호가 DB와 일치시 main.jsp페이지로 이동.
  • 아이디와 비밀번호가 DB와 불일치시 뒤로가기.
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
<% //1. 한글처리 및 변수가져오기
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String pw = request.getParameter("pw");

//2. MemberDAO객체생성 -> idcheck(id, pw) 메서드생성
MemberDAO mdao = new MemberDAO();
int result = mdao.idCheck(id, pw);

//3.데이터처리
if(result == 1){
//아이값을 세션객체에 저장
session.setAttribute("id", id); //두번째파라미터에서 업캐스팅발생 object->String
System.out.println("아디일치비번일치->로그인성공");
response.sendRedirect("../main/main.jsp");
}else if(result == 0){
System.out.println("아디일치,비번불일치->로그인실패");
%>
<script type="text/javascript">
alert("비밀번호가 일치하지 않습니다");
history.back();
</script>
<%
}else{
System.out.println("아디불일치,비번불일치->로그인실패");
%>
<script type="text/javascript">
alert("존재하지않는 아이디입니다");
history.back();
</script>
<%
}
%>

3. memberDAO.java에 idCheck()메서드 생성

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
public int idCheck(String id, String pw){
int result = -1;

try {
//1.DB여결
con = getCon();
//2.SQL & PSTMT
sql = "select pw from fun_member where id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
//3.실행 -> rs -> 데이터처리
rs = pstmt.executeQuery();
if(rs.next()){
if(pw.equals(rs.getString("pw"))){
result = 1;
}else{
result = 0;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally { //4.자원해제
closeDB();
}
return result;
}//idCheck메서드 닫음

4. top.jsp 추가

  • 로그인한 경우 id님 환영합니다와 함께 로그인 버튼을 로그아웃으로 변경
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
<% //화면상단에 위치하는 메뉴바 처리페이지
String id = (String)session.getAttribute("id"); //다운캐스팅 Object -> String
%>
<header>
<div id="login">
<%if(id == null){
%>
<div id="login"><a href="../member/loginForm.jsp">로그인</a> | <a href="../member/joinForm.jsp">회원가입</a></div>
<%
}else if(id != null){
%>
<div id="login"><%=id %>님 환영합니다 | <a href="../member/logout.jsp">로그아웃</a></div>
<%
}
%>
</div>
<div class="clear"></div>
<!-- 로고들어가는 곳 -->
<div id="logo"><img src="../images/logo.gif" width="265" height="62" alt="Fun Web"></div>
<!-- 로고들어가는 곳 -->
<nav id="top_menu">
<ul>
<li><a href="../index.jsp">홈</a></li>
<li><a href="../company/welcome.html">회사소개</a></li>
<li><a href="#">솔루션</a></li>
<li><a href="../center/notice.jsp">고객센터</a></li>
<li><a href="#">무엇이든 물어보세요</a></li>
</ul>
</nav>
</header>

5. logout.jsp 생성

1
2
3
4
5
6
7
8
<%
session.invalidate();
System.out.println("로그아웃성공");
%>
<script type="text/javascript">
alert("정상적으로 로그아웃 되었습니다");
location.href="../main/main.jsp";
</script>