본문 바로가기

웹 개발/Java

[Web_JAVA] 24

● 함수형 인터페이스(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;
		}
	}
   
}

 

결과(실행 시 출력되는 팝업)

 

결과(1 &gt; 2 &gt; 2 클릭)

 

결과(1&nbsp;&gt; 2 &gt; 2 클릭 후 팝업 닫음)

 

 

 

 

 

 

 

'웹 개발 > 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