본문 바로가기

Java/문법

18 - 1장 람다식

람다식(Lambda expression)
- 기존의 객체 지향 프로그램 체계 안에서 함수형 프로그래밍을 가능하게 하는 기법
 
함수(function)
- 기능 또는 동작을 정의한 일련의 명령 모음

void abc() {
	//기능 및 동작
}

 
메서드(method)
-클래스 또는 인터페이스 내에 정의된 함수 

class A {
	void abc() {
    	//기능 및 동작
    }
}

 
- 자바에서 메서드를 사용하려면 항상 클래스 객체를 먼저 생성한 후 생성한 객체로 메서드를 호출해야함
-자바는 객체 지향 언어이므로 모든 함수는 클래스 또는 인터페이스 내부에만 존재 
 
- 객체 지향형 프로그래밍에서 함수는 항상 클래스 내부에 메서드로 존재해야 하고, 메서드를 사용하기 위해서는 클래스의 객체를 먼저 생성한 후에 메서드를 호출해야함
 
step 1. 메서드 정의 및 구현

class A {
	void abc() {
    	//메서드(함수) 정의 및 구현
    }
}

step 2. 객체 생성

A a = new A();

 
step 3. 객체 내부 메서드 호출

a.abc();

 
함수형 인터페이스 
 - 단 하나의 추상 메서드만을 포함하는 인터페이스 
 - 함수형 인터페으스이 호출 및 기능을 구현하는 방법을 새롭게 정의한 문법이 람다식
 
1. 객체 지향 구조 내에서 람다식 적용 과정
 
- 함수형 인터페이스를 상속받아 추상 메서드를 구현한 객체를 생성한 후 메서드를 호출하는 과정 
- 인터페이스 A는 추상 메서드인 abc()를 포함

interface A {
	void abc();
}

 
case 1)
 - 인터페이스 A를 구현한 클래스 B를 생성
 - 클래스의 생성자 (B())를 이용해 객체를 생성한 후 객체의 참조 변수로 abc() 메서드 호출

class B implements A {
	public void abc() {
    	//메서드 내용
     }
}

a.abc();

 
case 2)
 - 추가 클래스 정의 없이 익명 이너 클래스를 사용해 객체 생성 후 이 객체로 메서드 호출

A a = new A() {
	void abc() {
    	//메서드 내용
    }
};

a.abc();

 
case 3)
 - 람다식 활용
 - 익명 이너 클래스의 메서드 정의 부분만 가져와 메서드 정의하고 호출

A a () -> {
	//메서드 내용
    };
    
a.abc();

 - 람다식은 익명 이너 클래스의 축약된 형태 
 

package OOP;

interface A {
	void abc();
}

class B implements A {
	//override
	public void abc() {
		System.out.println("메서드 내용 1");
	}
}
 class OOP {
	 public static void main(String[] args) {
		 //1.객체 지향 프로그래밍 문법 1
		 A a1 = new B();
		 a1.abc(); //메서드 내용
		 
		 //2.객체 지향 프로그래밍 문법 2 (익명 이너 클래스 사용)
		 A a2 = new A() {
			 //override
			 public void abc() {
				 System.out.println("메서드 내용2");
			 }
		 };
		 a2.abc(); //메서드 내용
		 
		 //3.함수형 프로그래밍 문법 (람다식)
		 A a3 = () -> {System.out.println("메서드 내용 3");};
		 a3.abc();
	 }
}

 
2. 람다식의 기본 문법 및 약식 표현
 
1) 람다식의 기본 문법
 
- 입력매개변수에 따른 메서드의 기능만을 정의 
- '(소괄호) -> {중괄호}'

리턴 타입 메서드명(입력매개변수) {
	//메서드 내용
}
(입력매개변수) -> {
	//메서드 내용
}

 
2) 람다식의 약식 표현
 
- 중괄호 안의 실행문이 1개 일때 중괄호 생략 가능

A a1 = () -> {System.out.println("테스트");
A a2 = () -> System.out.println("테스트");

 
- 입력매개변수의 자료형 생략 가능
 <-함수형 인터페이스에 포함된 추상 메서드의 입력매개변수 타입으로 쉽게 유추 가능
- 입력매개변수가 1개일때는 소괄호도 생략 가능 
 -> 소괄호를 생략할때는 매개변수의 자료형을 반드시 생략 해야함 

A a1 = (int a) -> {...}
A a2 = (a) -> {...} //자료형 생략
A a3 = a-> {...}; // 소괄호 생략
A a4 = int a -> {...}; //불가능

 
- 메서드가 return문 하나만으로 이뤄져 있을 때는 return문도 생략 가능
 -> return을 생략할 때 중괄호를 반드시 함께 생략

A a1 = (int a, int b) -> {return a+b;};
A a2 = (int a, int b) -> a+b;
A a3 = (int a, int b) -> {a+b}; //불가능