제주 탈출 일지

패스트캠퍼스 챌린지 29일차 본문

패스트캠퍼스 챌린지!

패스트캠퍼스 챌린지 29일차

귀건 2021. 10. 4. 23:57
728x90
반응형

챌린지 마무리가 다가온다..!

 

04. 함수형 인터페이스와 람다식 구현하여 사용하기

함수형 인터페이스

람다식을 선언하기 위한 인터페이스

익명 함수와 매개 변수만으로 구현되므로 인터페이스는 단 하나의 메서드만을 선언해야함

@FunctionalInterface 애노테이션

내부에 여러 개의 메서드를 선언하면 에러남

 

함수형 인터페이스 형태

package ch04;

@FunctionalInterface
public interface Add {

	public int add(int x, int y);
	
}

 

package ch04;

@FunctionalInterface
public interface MyNumber {

	int getMax(int num1, int num2);
}

람다식은 함수형 인터페이스 변수에 assign하여 사용할 수 있다.

package ch04;

public class MyNumberTest {

	public static void main(String[] args) {
		
		MyNumber myNumber = (x, y)-> x > y ? x : y;
		
		System.out.println(myNumber.getMax(10, 20));
	}

}

 

05. 스트림(Stream)

스트림 이란?

자료에 대상과 관계없이 동일한 연산을 수행

배열, 컬렉션을 대상으로 연산을 수행 함

일관성 있는 연산으로 자료의 처리를 쉽고 간단하게 함

자료 처리에 대한 추상화가 구현되었다고 함

한번 생성하고 사용한 스트림은 재사용 할 수 없음

다른 연산을 수행하기 위해서는 스트림을 다시 생성해야 함.

 

스트림 연산은 기존 자료를 변경하지 않음(스트림이 사용하는 메모리 공간은 별도로 생성됨)

스트림 연산은 중간 연산과 최종 연산으로 구분 됨.

최종 연산이 호출되어야 중간 연산에 대한 수행이 이루어지고 그 결과가 만들어짐.

 

package ch05;

import java.util.Arrays;
import java.util.stream.IntStream;

public class IntArrayStreamTest {

	public static void main(String[] args) {
		
		int[] arr = {1,2,3,4,5};
		
		for(int num : arr) {
			System.out.println(num);
		}
		
		System.out.println();
		Arrays.stream(arr).forEach(n->System.out.println(n)); // 람다식
		
		System.out.println();
		
		IntStream is = Arrays.stream(arr);
		is.forEach(n->System.out.println(n)); // 재사용 할수는 없다.
		
		long sum = Arrays.stream(arr).sum();
		System.out.println(sum);

		
	}

}

 

중간 연산과 최종 연산

중간 연산의 예 - filter(), map(), sorted() 등

조건에 맞는 요소를 추출하거나 요소를 변환함.

 

최종 연산의 예 - forEach(), count(), sum() 등

스트림이 관리하는 자료를 하나씩 소모해가며 연산이 수행 됨

 

람다식은 익명 클래스로 구성되어 진다.

package ch05;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class ArrayListStreamTest {

	public static void main(String[] args) {
		
		List<String> sList = new ArrayList<String>(); 
		sList.add("Tomas");
		sList.add("Edward");
		sList.add("Jack");
		
		Stream<String> stream = sList.stream();
		stream.forEach(s->System.out.println(s));
		
		sList.stream().sorted().forEach(s->System.out.print(s + "\t")); 
		System.out.println();
		// 기존 자료를 변환하지는 않음.
		sList.stream().map(s->s.length()).forEach(n->System.out.print(n + "\t"));
		
		System.out.println();
		sList.stream().filter(s->s.length() >= 5).forEach(s->System.out.println(s));
	
	}

}

Stream은 한번 사용하고 나면 없어지기 때문에 다시 생성해서 사용해야 한다.

 

05. 객체지향 프로그래밍 vs 람다식 구현

예제를 올려놓겠음.

package ch06;

@FunctionalInterface
public interface StringConcat {

	public void makeString(String s1, String s2);
}

기존 방식이라면 인터페이스를 구현한 클래스를 만들고, 그 클래스의 인스턴스를 생성하여 메서드를 호출하게 됨(객체 지향)

package ch06;

public class StringConcatImpl implements StringConcat {

	@Override
	public void makeString(String s1, String s2) {
		
		System.out.println(s1 + "," + s2);
	}
	

}

이런식으로 인터페이스를 클래스로 구현함

하지만 람다식은?

package ch06;

public class StringConcatTest {

	public static void main(String[] args) {
		
		String s1 = "Hello";
		String s2 = "World";
		
		//기존 방식
		StringConcatImpl strImpl = new StringConcatImpl();
		strImpl.makeString("Hello", "World");
		
		StringConcat concat = (s, v) -> System.out.println(s + "," + v);
		concat.makeString(s1, s2);
		
		//내부적으로 익명 클래스가 생성됨
		StringConcat concat2 = new StringConcat() {

			@Override
			public void makeString(String s1, String s2) {
				// TODO Auto-generated method stub
				
				System.out.println(s1 + "...." + s2);
			}			
		};
		
		concat2.makeString(s1, s2);
	}

}

이렇게 인터페이스에 간단히  assign하는 것으로 인터페이스를 구현함. 이게 expression을 전달하는 것처럼 보이나, 내부적으로 익명 클래스가 주석처럼 생성되고, 그 내부의 메소드를 사용하게 되는 것.

 

변수는 특정 자료형으로 변수를 선언 한 후 값을 대입하거나, 매개 변수로 전달하여 사용하거나, 메서드의 반환 값으로 반환을 할 수 있음

이 변수의 역할을 람다식도 모두 가능하다.(함수와 변수의 경계가 거의 없는 그런 형태)

함수형 프로그래밍에서 이 모든게 제공이 되는데, 람다식도 이 기능들을 제공한다.

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

728x90
반응형
Comments