개발새발 로그

[2023-09-21] TIL - 함수형 프로그래밍 본문

TIL

[2023-09-21] TIL - 함수형 프로그래밍

이즈흐 2023. 9. 21. 22:40

함수형 프로그래밍

함수형패러다임

 

- 패러다임은 무엇을 해야할지를 말하기보다 무엇을 해서는 안되는지 말해준다.

 

패러다임, paradigm

한 시대의 사람들의 견해나 사고를 근본적으로 규정하고 있는 인식의 체계. 또는, 사물에 대한 이론적인 틀이나 체계. 순화어는 `틀'.

 

 

프로그램은 순차, 분기, 반복, 참조로 구성

패러다임은 위 4가지 요소를 어떻게 이용할 것인가를 다룬다.

 

 

함수형 패러다임

- 객체지향 추상화의 최소단위가 객체인 것처럼 함수형은 함수가 최소 단위이다.

- 재사용성이 높다.

- 불변성을 지향하기에 동작을 예측하기 쉽고, 사이드 이펙트를 방지한다.

 -> 사이드 이펙트를 방지한다는 것은 동시성 문제도 해결된다는 의미

 

정리

- 객체 지향은 [순차, 분기, 반복, 참조] 이 4가지 제어흐름의 전환을 객체를 통해 간접으로 통제한다.

- 함수형은 [순차, 분기, 반복, 참조] 이 4가지 제어흐름을 변수 할당으로 통제한다.

 

 

 

 

함수형 프로그래밍의 장점

- 상태가 없기 떄문에 사이드 이펙트가 없다.

- 재사용성이 높다.

- 코드가 짧고 간결하다.

 

함수형 프로그래밍의 단점

- 상태가 없기 때문에 변수조작이 안된다.

 -> 게임에서의 캐릭터 상태에 관련된 변수를 조정하면 되지만

     함수형에서는 캐릭터 상태를 조정한 데이터를 복사해서 기존 캐릭터와 교체한다.

     이 방법은 쓸데없이 메모리와 성능을 사용하게된다.

- 재사용성이 높기 때문에 함수가 잘게 쪼개져 쪼개진 함수가 너무 많아지고 오히려 더 복잡해진다.

- 코드가 짧고 간결하다는 것은 많은 숙련도를 요구한다.

 -> 상대적으로 접근하기 쉬운 객체지향에 비해 함수형적으로 사고하는 것은 어렵다.

 

 

 

선언형 프로그래밍

- 기존 명령형 프로그래밍은 문제를 어떻게 해결해야 하는지 컴퓨터에게 명령을 내리는 방법

- 선언형 프로그래밍은 무엇을 해결해야 할지에 집중하고 해결방법은 컴퓨터에게 위임하는 방법

 

1. 선언형(declarative) : 결과를 바로 도출

function sapceToHeart(text) { 
	return text.replaceAll(" ", "♥")
}

2. 명령형(imperative) : ’어떻게’가 드러남

function sapceToHeart(text) {
	let result = "";
	for(let i = 0 ; i < text.length ; i++) {
		if(text[i] === " ") {
			result += "♥"
		} else {
			result += text[i]
		}
	}
	return result
}

https://velog.io/@outclassstudio/%EC%84%A0%EC%96%B8%ED%98%95-vs-%EB%AA%85%EB%A0%B9%ED%98%95-%EC%BD%94%EB%93%9C

 

선언형 vs 명령형 코드

함수형 프로그래밍을 이해하기 위해서 먼저 선언형 코드와 명령형 코드에 대한 이해가 필요하다(고한다^^..)ex) CSS선언형 코드는 명령형 코드 위에 쓰여진다고 볼 수 있음선언형 코드 예시)요구

velog.io

 

 

 

 

 

[참고]

Side Effect

- 함수 내에서 어떤 구현이 함수 외부에 영향을 끼치는 경우 해당 함수는 Side Effect가 있다고 이야기 합니다.

- 즉 Side Effect라는 말을 할 때는 "의도하지 않은 결과"를 의미합니다.

- 의도하지 않게 외부변수를 참조하거나 외부변수를 변경하는 모든 종류의 코드를 의미합니다. 

 

동시성 문제

동시성 문제란 동일한 자원에 대해 여러 스레드가 동시에 접근 하면서 발생하는 문제입니다

.
대부분의 웹 서버는 여러 개의 요청(클라이언트)을 동시에 수행할 수 있고, 이는 작성한 코드가 동시에 수행될 수 있다는 의미와 동일한 맥락입니다.

 

이러한 동시성 문제를 살펴보기 위해 게시글에서 클라이언트가 동시에 좋아요를 했을 때 발생할 수 있는 문제에 대해 살펴보겠습니다.

위 그림에 대한 설명은 다음과 같습니다.

  • User A가 게시글 1에 좋아요를 클릭했을 때 likeCount 조회 (likeCount = 0)
  • User B도 게시글 1에 좋아요를 클릭했을 때 likeCount 조회 (likeCount = 0)
    • B는 A가 클릭한 작업이 처리되기 전의 값을 조회했으므로 카운트는 0
  • User A가 클릭에 대해 commit을 하고, 조회 수 + 1 증가 (likeCount = 1)
  • User B도 클릭을 통해 commit을 하고, 조회 수 + 1 증가 (likeCount = 1)

두 명의 사용자가 좋아요를 클릭했기 때문에 최종 count는 2가 되어야 하지만, 각 유저가 count를 +1 하기 위해 조회했을 때의 값은 모두 0이기 때문에 2가 아닌 1이 증가되고, 최종 결과는 +1이 증가하여 1이 되는 동시성 문제가 발생합니다.

728x90
반응형
LIST