클래스에 추상클래스 인터페이스 다음에 다시 클래스인데 이번에는 내부라는 단어가 붙었습니다. 무슨 클래스가 이리 많은지... 내부클래스가 뭔지 알아보러 가볼까요?
<내부클래스>
하나의 클래스에서 a작업과 b작업이 있을 때에는 따로 분리하여 클래스로 만들지 않고, 클래스 안에 클래스를 선언하여 설계한다.
이 때 밖에 있는 클래스를 외부 클래스라고 하며, 안에 선언된 클래스를 내부 클래스라고 한다. 외부 클래스가 메모리에 할당 되어야 내부 클래스를 객체화 할 수 있기 때문에 클래스를 숨기기 위해서 내부 클래스를 사용하기도 하며, 이를 캡슐화 또는 은닉화라고 부른다. 내부 클래스는 외부 클래스의 필드이기 때문에 외부 클래스의 필드를 자신의 필드처럼 가져다 사용할 수 있게 된다.
※ 메소드 안에서 클래스를 선언할 수도 있다.
class Out {
int outData = 100;
public Out() {
System.out.println("외부 클래스 생성자 호출");
}
private void printOutData() {
// TODO Auto-generated method stub
System.out.println(outData);
}
class In {
int inData = 1000;
public In() {
System.out.println("내부 클래스 생성자 호출");
}
public void printData() {
// TODO Auto-generated method stub
printOutData();
System.out.println(inData);
}
}
}
public class InnerTest {
public static void main(String[] args) {
// class A{}
Out out = new Out();
Out.In in = out.new In();
in.printData();
}
}
/*
*출력결과 (console)
*
*외부 클래스 생성자 호출
*내부 클래스 생성자 호출
*100
*1000
*/
<익명 클래스 - Anonymous inner class>
이름이 없는 클래스이며 구현되지 않은 필드를 구현하기 위해 일회성으로 생성되는 클래스이다.
<함수형 인터페이스(Functional interface)
인터페이스 중 추상 메소드를 하나만 가지고 있는 인터페이스를 함수형 인터페이스라고 한다.
이 때 @FunctionalInterface를 인터페이스 위에 작성하여 단 하나의 추상메소드만 선언할 수 있도록 제한해야 한다.
@FunctionalInterface
public interface LambdaInter {
boolean checkMultipleOf10(int number);
}
<람다식 Lambda Expression>
이름이 없는 메소드로서 변수처럼 사용이 가능하며, 매개변수로도 전달이 가능합니다.
함수형 인터페이스는 추상 메소드가 한 개만 선언되기 때문에 메소드 이름이 필요 없습니다.
따라서 람다식을 익명 메소드(Anonymous Method)라고 부릅니다.
<람다식 문법>
1. (매개변수 형식 나열, . . . . ) -> 리턴값;
2. (매개변수 형식 나열, . . . . ) -> {2개 이상의 문장 작성, return 리턴값;}
★Point! 메소드 == 이름(); 양식으로 사용한다 그러면 ();는? 익명 메소드!!!
// Type 1
// 함수형 인터페이스
@FunctionalInterface
public interface LambdaInter {
boolean checkMultipleOf10(int number);
}
public class LambdaTest {
public static void main(String[] args) {
// 람다식
LambdaInter lambda2 = (int number) -> {
System.out.println("10의 배수검사");
return number % 10 == 0;
};
System.out.println(lambda2.checkMultipleOf10(20));
}
}
// Type 2
// 함수형 인터페이스
@FunctionalInterface
public interface PrintName {
public String getName(String firstName, String lastName);
}
public class PrintNameTest {
public static void print(PrintName names) {
String name = names.getName("바다", "자");
System.out.println(name);
}
public static void main(String[] args) {
// 람다식
print((firstName, lastName)-> lastName + firstName);
}
}
+) 람다식 작성방법
1. 메소드의 이름과 반환타입을 제거하고 '->' 를 바디 앞에 추가한다.
2. 반환값이 있는경우 식이나 값만 적고 return은 생략가능 (return 문장의 ;은 생략이 가능하다.)
3. 매개변수의 타입이 추론이 가능하다면 타입 생략가능 (대부분 생략이 가능하다)
+) 람다식 주의사항
1. 매개변수가 하나인 경우, 괄호 생략가능
( 예: (a) -> a * a 일때 a -> a * a로 작성가능 단, 타입이 없을때만 가능 => doublue b -> b * 10은 오류!)
2. 블록 안의 문장이 하나뿐이라면 바디와 ;은 생략이 가능하다.
단, 하나의 문장이 리턴이면 대괄호가 불가능! 그러나 바디와 return, ;을 모두 생략해주면 가능하다.
-> 람다식 작성방법의 2번방법과 헷깔린다면, 괄호를 그냥 사용하는것도 좋을것 같아요!
'프로그래밍 공부 > Java' 카테고리의 다른 글
[lesson] Java 프로그래밍 언어 - API (0) | 2021.07.30 |
---|---|
[lesson] Java 프로그래밍 언어 - 예외 처리 (0) | 2021.07.29 |
[lesson] Java 프로그래밍 언어 - 추상 클래스 (0) | 2021.07.28 |
[lesson] Java 프로그래밍 언어 - 접근 권한 제어자 (접근자) (0) | 2021.07.28 |
[lesson] Java 프로그래밍 언어 - 캐스팅(Casting) (0) | 2021.07.28 |