본문 바로가기
프로그래밍 공부/Java

[lesson] Java 프로그래밍 언어 - 내부 클래스, 람다식

by Luna_lua 2021. 7. 29.
반응형

클래스에 추상클래스 인터페이스 다음에 다시 클래스인데 이번에는 내부라는 단어가 붙었습니다. 무슨 클래스가 이리 많은지... 내부클래스가 뭔지 알아보러 가볼까요?

 

<내부클래스>

하나의 클래스에서 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번방법과 헷깔린다면, 괄호를 그냥 사용하는것도 좋을것 같아요!

반응형