일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- HTML5
- 백준
- 백준nodejs
- css기초
- HTML
- 백준알고리즘
- CSS
- 안드로이드 스튜디오
- 코테
- 코딩테스트
- 익스프레스
- 알고리즘
- JS
- 프로그래머스코테
- 리액트댓글기능
- 다이나믹프로그래밍
- 리액트커뮤니티
- 포이마웹
- dp알고리즘
- JS프로그래머스
- 프로그래머스
- 백준구현문제
- 프로그래머스JS
- 리액트
- 백준구현
- 백준골드
- 몽고DB
- js코테
- 백준js
- 자바스크립트
- Today
- Total
개발새발 로그
[2023-09-21] TIL - 함수형 프로그래밍 본문
함수형 프로그래밍
함수형패러다임
- 패러다임은 무엇을 해야할지를 말하기보다 무엇을 해서는 안되는지 말해준다.
패러다임, 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
}
[참고]
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이 되는 동시성 문제가 발생합니다.
'TIL' 카테고리의 다른 글
[2023-09-21] TIL - Event Loop(Microtask Queue, Animation Frame) (0) | 2023.09.21 |
---|---|
[2023-09-21] TIL - 객체지향과 프로토타입 (0) | 2023.09.21 |
[2023-09-21] TIL - 암호화 (0) | 2023.09.21 |
[2023-09-21] TIL - 컴퓨터 시간 원리 (0) | 2023.09.21 |
[2023-09-21] TIL - 네트워크 기초 (0) | 2023.09.21 |