● 함수형 인터페이스(Functional interface)
- 인터페이스 중 추상 메소드를 하나만 가지고 있는 인터페이스
- @FunctionalInterface를 인터페이스 위에 작성하여 단 하나의 추상메소드만 선언할 수 있도록 제한해야한다.
● 람다식(Lambda Expression)
- 이름이 없는 메소드로서 변수처럼 사용이 가능하며, 매개변수로 전달이 가능하다.
- 함수형 인터페이스는 추상 메소드가 한 개만 선언되기 때문에 메소드 이름이 필요없다.
- 따라서 람다식을 익명 메소드(Anonymous Method)라고도 부른다.
● 람다식 문법
1. (매개변수 형식 나열, ...) -> 리턴값;
(ex) (a, b)
2. (매개변수 형식 나열, ...) -> {2개 이상의 문장 작성; return 리턴값;}
● split()
- ()안에 입력하는 값을 기준으로 각 문자를 분리해준다.
(ex)
1. temp = "+-"; → temp.split(",") : {"+", "-"}
2. temp = "+,-"; → temp.split(",") : {"+", "-"}
3. temp = "+:-"; → temp.split(",") : {"+", "-"}
(ex)
1. expression = "+7+8+9"; → expression.split("\\+") : {"", "7", "8", "9"}
2. expression = "7+8+9"; → expression.split("\\+") : {"7", "8", "9"}
3. expression = "-7+8+9"; → expression.split("\\+|\\-") : {"", "7", "8", "9"}
실습(익명클래스)
※ 문제
// 잠실점 오픈
// 잠실점은 판매하지 않고 무료 나눔행사 지점이다.
// 본사에 등록 시 판매할 상품 목록만 구현한다.
// 본사에서는 무료나눔 지점인지 검사를 한 뒤
// 무료나눔 지점이라면 sell()을 테스트 하지 않고,
//"무료나눔 지점입니다" 출력
1. 인터페이스(Form.java) 생성
public interface Form {
public String[] getMenu();
public void sell(String order);
}
2. 강제성을 제거해주는 추상클래스(FormAdapter.java) 생성
public abstract class FormAdapter implements Form{
@Override
public String[] getMenu() {
return null;
}
@Override
public void sell(String order) {
}
}
3. Nike.java에 실행할 메소드 생성
public class Nike {
public void register(Form form) {
String[] menus = form.getMenu();
System.out.println("=====상품 목록=====");
for (int i = 0; i < menus.length; i++) {
System.out.println(i + 1 + ". " + menus[i]);
}
if(form instanceof FormAdapter) {
System.out.println("무료나눔 지점입니다");
} else {
form.sell("티셔츠");
}
}
}
4. DepartmentStore.java에서 익명클래스를 이용하여 실행
public class DepartmentStore{
public static void main(String[] args) {
Nike jamsil = new Nike();
jamsil.register(new FormAdapter() {
@Override
public String[] getMenu() {
String[] menus = {"티셔츠", "신발", "바지", "가방"};
return menus;
}
});
}
}
실습(람다식(1))
1. 함수형 인터페이스(LambdaInter.java) 선언
@FunctionalInterface
public interface LambdaInter {
boolean checkMultipleOf10(int number);
}
2. main 메소드에서 실행(LambdaTest.java)
- 10의 배수 O
public class LambdaTest {
public static void main(String[] args) {
LambdaInter inter = new LambdaInter() {
@Override
public boolean checkMultipleOf10(int number) {
return number % 10 == 0;
}
};
System.out.println(inter.checkMultipleOf10(10));
}
}
※ 다른 방법
public class LambdaTest {
public static void main(String[] args) {
// 위의 new LambdaInter() { ... }; 와 같다.
LambdaInter inter = (number) -> number % 10 == 0; // 선언
System.out.println(inter.checkMultipleOf10(10));
}
}
- 10의 배수 X
public class LambdaTest {
public static void main(String[] args) {
LambdaInter lambda = (number) -> {
System.out.println("10의 배수 검사");
return number % 10 == 0;
};
System.out.println(lambda.checkMultipleOf10(15));
}
}
실습(람다식(2))
※ 문제
1. 함수형 인터페이스(PrintName) 선언
2. 외부에서 이름(길동)과 성(홍)을 전달받는 추상 메소드 선언(리턴타입 : 문자열)
3. 클래스 선언(PrintNameTest) 후 static 메소드 선언(printFullName)
4. 외부에서 람다식으로 구현한 값을 매개변수 name으로 전달받기
5. static 메소드 사용 시, 이름과 성을 연결하여 full name을 println으로 출력
1. 문제 1 ~ 문제 2
@FunctionalInterface
public interface PrintName {
public String getName(String f, String l);
}
2. 문제 3 ~ 5
public class PrintNameTest {
public static void printFullName(PrintName name) {
System.out.println(name.getName("길동", "홍"));
}
public static void main(String[] args) {
PrintNameTest.printFullName((f, l) -> l + f); // l + f : 길동홍
}
}
실습(GUI)
※ 훑어보는 정도로만 확인
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
public class ButtonTest extends Frame implements ActionListener{
public ButtonTest() {
super("버튼 테스트");
int x = 0;
int y = 0;
JButton btn1 = new JButton("눌러줘1!");
JButton btn2 = new JButton("눌러줘2!");
setLayout(new FlowLayout());
btn1.setFont(new Font("", Font.BOLD, 50));
btn2.setFont(new Font("", Font.BOLD, 50));
btn1.addActionListener(this);
btn2.addActionListener(this);
add(btn1);
add(btn2);
setSize(500, 700);
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
x = (screen.width - this.getWidth()) / 2;
y = (screen.height - this.getHeight()) / 2;
setLocation(x, y);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("앗 닫힐거같아");
System.exit(0);
}
});
setVisible(true);
}
public static void main(String[] args) {
new ButtonTest();
}
@Override
public void actionPerformed(ActionEvent e) {
switch(e.getActionCommand()) {
case "눌러줘1!":
System.out.println("첫 번째 버튼 클릭됨!");
break;
case "눌러줘2!":
System.out.println("두 번째 버튼 클릭됨!");
break;
}
}
}
'웹 개발 > Java' 카테고리의 다른 글
[Web_JAVA] 26 (0) | 2022.03.12 |
---|---|
[Web_JAVA] 25 (0) | 2022.03.11 |
[Web_JAVA] 23 (0) | 2022.03.09 |
[Web_JAVA] 22 (0) | 2022.03.08 |
[Web_JAVA] 21 (0) | 2022.03.07 |