함수형 프로그래밍

Taesoo Kim·2024년 10월 14일
Arrays.sort(angel, 
	(o1, o2) -> { 
		return o2[1] - o1[1]; 
	});

처음보면 참 어색한 문법, 람다식

프로그래밍의 난이도를 급격히 줄였지만 처음보면 참으로 어색하다. 이런게 어떻게 등장하게 되었을까?

함수형 프로그래밍의 시작

거대해진 프로그램을 아토믹하게 나눠서(순수함수 단위) 가독성과 유지보수를 높이자!

순수함수

외부 또는 내부의 인자나 환경에 의해 변수가 변하지 않고, 순수히 기능만을 갖는 함수

function square(x) { 
	return x * x; 
} 

console.log(square(2)); // 4 
console.log(square(2)); // 4 (항상 같은 입력에 같은 출력)

이건 순수함수

let counter = -10; 
function increment() { 
	counter += 1; // 외부 상태를 변경 
	return counter; 
} 
console.log(increment()); // 1 
console.log(increment()); // 2 (출력이 달라짐)

이건 비순수함수

zero side effect

순수함수의 가장 중요한 포인트는 side effect가 없다는것!
-> 외부 환경을 바꾸지도, 또 내부 환경을 바꿔 결과값이 바뀌지도 않는다는 것.
-> 어떤 컨택스트에서도 동일한 값을 보장!
-> 순수함수를 알기만하면 누구든 유지보수 삽가능

그렇다고 다 좋은걸까?

const keyAPI = process.env.TOSS_VALIDATION_KEY

function validate(@Ctx user) {
	const uid = user.userData.id;
	return keyAPI + uid;
}

의존해야하는 경우도 있기에 흠없는 패러다임은 절대 아니다..

Thread Safe

당연하게도, 외부의 변수를 변화시킬수 없으니 tread safe하기도 하다. 이는 비동기 처리에서도 독립적으로 작용한다 생각할 수도 있다!

function processNumber(num) {
  return num * 2; // 순수 함수
}

const numbers = [1, 2, 3, 4];

// 병렬로 실행되더라도 동기화가 필요 없음
Promise.all(numbers.map(num => new Promise(resolve => {
  resolve(processNumber(num));
}))).then(results => {
  console.log(results); // [2, 4, 6, 8]
});

고차함수와 일급 객체

함수형 프로그래밍을 한 차원 도약시킨 개념. 자바와 자바스크립트의 차이를 생각하면 더 이해하기 쉬운 개념이다.

일급 객체의 조건(특성, 정의)

  • 변수에 할당할 수 있다.
public class Main {
    public static void hello(){
        System.out.println("Hello World");
    }
    public static void main(String[] args) {
		Object a = hello; // !! 메서드를 변수에 할당 불가능
    }
}
const hello = function() {
	console.log("Hello World");
}
  • 함수의 패러미터로 활용 할 수 있다.
public class Main {

    public static void hello(){
        System.out.println("Hello World");
    }
    
    public static void print(Object func) {
    	func();
    }

    public static void main(String[] args) {
		print((Object) hello) // !! static 메서드를 함수 매개변수로 전달 불가능
    }
}
const hello = function() {
	console.log("Hello World");
}

function print(func) {
	func();
}

print(hello);
  • 함수의 리턴값으로 쓸 수 있다.
const hello = function() {
	console.log("Hello World");
    return function() {
    	console.log("Hello World 22");
    }
}

const hello2 = hello();
hello2();

하지만, 요즘 자바도 람다식과 익명 클래스를 통해서 함수형 프로그래밍을 지원한다고 한다!

public class WordProcessTest {

    private final List<String> words = Arrays.asList("TONY", "a", "hULK", "B", "america", "X", "nebula", "Korea");

    @Test
    void wordProcessTest() {
        String result = words.stream()
                .filter(w -> w.length() > 1)
                .map(String::toUpperCase)
                .map(w -> w.substring(0, 1))
                .collect(Collectors.joining(" "));

        assertThat(result).isEqualTo("T H A N K");
    }
}

고차함수

이런 일급객체의 특성을 이용한 함수로, 인자나 리턴값을 함수로 갖는 함수를 일컫는다. 대표적으로 js에 map, reduce, filter같은게 있다!

profile
뭔 생각을 해. 그냥 하는 거지 뭐

0개의 댓글