함수형 인터페이스

O0·2022년 6월 21일
0

JAVA8

목록 보기
4/5
post-thumbnail

함수형 인터페이스


  1. 함수형 인터페이스
  • 단 하나의 추상 메서드를 갖는 인터페이스이다.
  • Java8 부터 함수형 인터페이스를 컴파일 시점에도 확인할 수 있도록 @FunctionalInterface 애노테이션도 제공한다. (없어도 문제는 되지 않는다.)
  • 람다는 함수형 인터페이스를 간단히 하기 위해서 만들어졌다.
  • 파라미터 a가 여러 함수형 인터페이스를 거쳐 최종적인 값 b의 형태로 변경할 수 있다.
  1. 함수형 인터페이스 예시
1. SearchOption.java

package functional;

public enum SearchOption {
	Location, Gender
}

2. Gender.java

package functional;

public enum Gender {
	Male, Female
}

3. SearchFilter.java

package functional;

public interface SearchFilter {
	boolean isMatched(Customer customer);
}

4. Customer.java

package functional;

public class Customer {
	private String id;
	private String location;
	private Gender gender;
	private int age;
	
	public Customer(String id, String location, Gender gender, int age) {
		super();
		this.id = id;
		this.location = location;
		this.gender = gender;
		this.age = age;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getLocation() {
		return location;
	}

	public void setLocation(String location) {
		this.location = location;
	}

	public Gender getGender() {
		return gender;
	}

	public void setGender(Gender gender) {
		this.gender = gender;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		StringBuilder builder = new StringBuilder();
		return builder.append(id).append(" : ").
				append(location).append(" : ").
				append(gender).append(" : ").
				append(age).toString();
	}
}


5.CustomerService

package functional;

import java.util.ArrayList;
import java.util.List;

public class CustomerService {
	private List<Customer> customers;
	
	public CustomerService() {
		this.customers = new ArrayList<>();
	}
	
	public void addCustomer(Customer newCustomer) {
		this.customers.add(newCustomer);
	}
	
	// 요구사항 1) 지역으로 검색
	public List<Customer> searchCustomerByLocation(String location) {
		List<Customer> foundCustomers = new ArrayList<>();
		for(Customer customer : customers) {
			if(customer.getLocation().equals(location)) {
				foundCustomers.add(customer);
			}
		}
		
		return foundCustomers;
	}
	
	// 요구사항 2) searchOption에 따라서 검색
	public List<Customer> searchCustomerBy(SearchOption searchOption, String searchValue){
		List<Customer> foundCustomers = new ArrayList<>();

		for(Customer customer : customers) {
			if(searchOption.equals(SearchOption.Location)) {
				if(customer.getLocation().equals(searchValue)) {
					foundCustomers.add(customer);
				}
			}else if(searchOption.equals(SearchOption.Gender)) {
				if(customer.getGender().equals(searchValue)) {
					foundCustomers.add(customer);
				}
			}
		}
		
		return foundCustomers;
	}
	
	// 인터페이스를 통한 검색 메소드
	public List<Customer> searchCustomers(SearchFilter filter){
		List<Customer> foundCustomers = new ArrayList<>();
		for(Customer customer : customers) {
			if(filter.isMatched(customer)) {
				foundCustomers.add(customer);
			}
		}
		
		return foundCustomers;
	}
}

6.FunctionalAssist

package functional;

import java.util.List;

public class FunctionalAssist {
	public static void main(String[] args) {
		CustomerService service = new CustomerService();
		initData(service);
		
		//요구사항 1)지역으로 검색
		List<Customer> list = service.searchCustomerByLocation("kangnam");
//		for(Customer cu : list) {
//			System.out.println(cu.toString());
//		}
		
		//추가 요구사항 2)성별로 검색
		/*
		 * 1. 기존에는 CustomerService에서 성별로 검색할 수 있도록 method 만든다.
		 * 2. 요구사항이 생길 때 마다 해당 클래스에서 생성하는 것이 좋은 방법인지?
		 *  -> 1)하나의 메소드로 해결한다. or 2)Interface에서 해결한다.
		 * */
		
		//2)하나의 메소드로 해결한다.
//		list = service.searchCustomerBy(SearchOption.Location, "Sungsu");
//		for(Customer cu : list) {
//			System.out.println(cu);
//		}
		
		list = service.searchCustomers(new SearchFilter() {
			/*
			 * searchFilter라는 Interface를 파라미터로 보내면서 정의를 한 익명클래스 
			 */
			@Override
			public boolean isMatched(Customer customer) {
				// TODO Auto-generated method stub
				if(customer.getLocation().equals("Sungsu")) {
					return true;
				}else {
					return false;
				}
			}		
		});
		
		for(Customer cu : list) {
			System.out.println(cu);
		}
		System.out.println();
		
		//위 코드를 람다로 적용 (어떤 조건으로 검색할지 파라미터를 보내주면 그 검색조건으로 코드를 작성할 수 있다.
		list = service.searchCustomers(customer -> customer.getGender().equals(Gender.Male));
		for(Customer cu : list) {
			System.out.println(cu);
		}
		System.out.println();
		
		list = service.searchCustomers(customer -> customer.getGender().equals(Gender.Female) && customer.getAge() > 25);
		for(Customer cu : list) {
			System.out.println(cu);
		}
		System.out.println();
	}
	
	private static void initData(CustomerService service) {
		service.addCustomer(new Customer("CUS01","Sungsu",Gender.Male,30));
		service.addCustomer(new Customer("CUS02","ddoksum",Gender.Female,55));
		service.addCustomer(new Customer("CUS03","hanyang",Gender.Female,13));
		service.addCustomer(new Customer("CUS04","Sungsu",Gender.Male,27));
		service.addCustomer(new Customer("CUS05","Sungsu",Gender.Female,61));
		service.addCustomer(new Customer("CUS06","kangnam",Gender.Male,28));
		service.addCustomer(new Customer("CUS07","hanyang",Gender.Male,25));
		service.addCustomer(new Customer("CUS08","kangnam",Gender.Female,45));
		service.addCustomer(new Customer("CUS09","suwon",Gender.Female,42));
		service.addCustomer(new Customer("CUS10","kangnam",Gender.Male,58));
	}
}

출처


  • 유튜버 : 나무소리
profile
O0

0개의 댓글