출처: https://www.educba.com/functional-interface-in-java/
인터페이스 중 추상 메소드를 하나만 가지고 있는 인터페이스를 함수형 인터페이스라고 한다.
이 때 @FunctionalInterface를 인터페이스 위에 작성하여 단 하나의 추상 메소드만
선언할 수 있도록 제한해야 한다.
이름이 없는 메소드로서 변수처럼 사용이 가능하며, 매개변수로도 전달이 가능하다.
함수형 인터페이스는 추상 메소드가 한 개만 선언되기 때문에 메소드 이름이 필요 없다.
따라서 람다식을 익명 메소드(Anonymous Method)라고도 부른다.
1. (매개변수 형식 나열, ...) -> 리턴값;
2. (매개변수 형식 나열, ...) -> {2개 이상의 문장 작성; return 리턴값;}
LambdaInter.java 인터페이스
package lambda;
@FunctionalInterface
public interface LambdaInter {
boolean checkMultipleOf10(int number);
}
LambdaTest.java 클래스
package lambda;
public class LambdaTest {
public static void main(String[] args) {
LambdaInter lambdaInter1 = (number) -> number % 10 == 0;
boolean result1 = lambdaInter1.checkMultipleOf10(59);
System.out.println(result1);
LambdaInter lambdaInter2 = (n) -> {
System.out.println("10의 배수 검사");
return n % 10 == 0;
};
boolean result2 = lambdaInter2.checkMultipleOf10(70);
System.out.println(result2);
}
}
printName.java 인터페이스
package lambda;
// 함수형 인터페이스로 선언
@FunctionalInterface
public interface PrintName {
// 성과 이름을 전달받은 후 String으로 리턴하는 추상메소드 선언
public String getFullName(String firstName, String lastName);
}
PrintNameTest.java 클래스
package lambda;
public class PrintNameTest {
// 외부에서 람다식으로 구현한 값을 name으로 전달받기
public static void printFullName(PrintName name) {
System.out.println(name.getFullName("April", "Choi"));
}
public static void main(String[] args) {
// 매개변수 2개를 설정하고, 두 문자열을 연결하도록 구현!
printFullName((firstName, lastName) -> firstName + lastName);
}
}
에러 : 심각한 오류
예외 : 덜 심각한 오류(개발자가 잡을 수 있는 오류)
try {
예외가 발생할 수 있는 문장
} catch(예외이름 객체명) {
예외 발생 시 실행할 문장
} catch(예외이름 객체명) {
예외 발생 시 실행할 문장
} ...
} finally {
예외 발생 여부에 상관없이 무조건 실행할 문장
* 외부 장치와 연결했을 경우 다시 닫을 때 주로 사용한다.
}
ExceptionTask.java 클래스
package exceptionTest;
import java.util.Scanner;
public class ExceptionTask {
public static void main(String[] args) {
// 5개의 정수만 입력받기
// - 무한 입력 상태로 구현
// - q 입력 시 나가기
// - 5개의 정수는 배열에 담기
// - if문은 딱 한 번만 사용하기 (q 를 입력 시 나갈 때만 사용!)
// - 단, 입력 받을 때는 무조건 next() 만 사용하기.
Scanner sc = new Scanner(System.in);
int[] arData = new int[5];
String msg = "번째 정수 : ", temp = null;
int i = 0;
while (true) {
System.out.print(++i + msg);
temp = sc.next();
if (temp.equals("q")) {
for (int j = 0; j < arData.length; j++) {
System.out.print(arData[j] + " ");
}
break;
}
try {
arData[i-1] = Integer.parseInt(temp);
} catch (NumberFormatException e) {
System.out.println("정수만 입력해야겠죠~??");
i--;
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("이미 5개의 정수를 입력하셨네요!?!?\n프로그램을 종료합니다.");
for (int j = 0; j < arData.length; j++) {
System.out.print(arData[j] + " ");
}
break;
} catch (Exception e) {
System.out.println("무슨 에러인지 특정이 안되네요!");
System.out.println(e);
i--;
}
}
}
}
ExceptionTest.java 클래스
package exceptionTest;
public class ExceptionTest {
public static void main(String[] args) {
try {
System.out.println(10/0);
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다.");
} catch (Exception e) { // 모든 예외 클래스의 부모는 Exception, upCasting 해서 들어온다.
System.out.println("알 수 없는 오류가 발생했어요!");
System.out.println(e);
}
System.out.println("오늘은 비 안오겠죠? 우산 안들고 왔는뎅");
}
}
개발에 필요한 라이브러리들의 집합
선배 개발자들이 만들어 놓은 소스코드
- 내부 API
JDK 설치 시 제공해주는 기본 API
docs.oracle.com/javase
- 외부 API(회사에서 많이 쓴다)
선배 개발자들이 개발한 패키지 및 클래스들을 의미한다.
보통 JAR파일로 배포하며 자바 프로젝트의 buildPath에 추가하여 사용할 수 있다.