선언형 프로그래밍을 처음 들어보는 개발자들도 있을 것이다. 뭐 물론 그들이 모르는 것은 뭐 딱히 신기할 만한 일도 아니다. 하지만 SQL을 사용해본 개발자는 대부분일 것이다. 그나마 들어보았다면, 학생 때나, 정보처리 기사등 자격증을 따려고 공부 할 때 SQL의 특징 중 선언형 프로그래밍 언어이다. 라는 문장을 본 정도 일 것이다.
하지만 함수형 프로그래밍에 관심 있는 혹은 사용중이 개발자라면, 함수형 프로그래밍이 선언형 프로그래밍 방식 중의 하나라고 알고 있거나 함수형 프로그래밍이 선언형 프로그래밍이라고 알고 있는 개발자들도 있을 것이다.
우리가 알고있는 프로그래밍 방식은 크게 두 분류로 나뉜다.
- 명령형 프로그래밍
- 절차적 프로그래밍
- 객체지향형 프로그래밍
- 선언형 프로그래밍
- 논리형 프로그래밍
- 함수형 프로그래밍
논리형 프로그래밍이라고 하면, 아마 못 들어본 사람이 많을 것이다. 뭐 프로그래밍 언어론을 배웠다면 PROLOG언어의 특징을 보면서 들어보았을 법하다.
명령형 프로그래밍은 HOW에, 선언형 프로그래밍은 WHAT에 중점을 두는 지에 대한 차이라고 한다. 뭐 물론 시험을 볼 것이 아니라면 아 그렇구나 정도면 된다. 선언형 프로그래밍 대표인 SQL로 어떤 차이인지 맛만 보도록 하자.
SELECT *
FROM users
WHERE user_id = 1;
DELETE
FROM users
WHERE user_id = 1;
첫 문장은 user_id가 1인 유저의 데이터를 가져오는 문장이고,
두번째 문장은 user_id가 1인 유저의 데이터를 삭제하는 문장이다.
위 처럼 무엇을 할 지에 대한 구분이 전체를 보지 않아도 된다. SELECT, DELETE 여부에 따라 검색이냐 삭제이냐 결정이 된다.
자 그러면 자바스크립트 코드로 userList에서 userId가 1인 데이터를 찾고자 해보자.
명령형 프로그래밍
let res = []
for( const user of userList ) {
if( user.userId === 1 ) {
res.push(user)
}
}
선언형 프로그래밍
let res = userList.filter( user => user.userId === 1 )
뭐 물론 선언형 프로그래밍 방식이 명령형 프로그래밍 방식보다 추상화 되어있어서, 선언형 프로그래밍 방식이 더욱 마음에 들 것이다. 하지만 지금 말하고자 하는 것은 그 부분이 아니다.
자 그러면 userId가 1이라면 true 아니라면 false로 담도록 해보자.
명령형 프로그래밍
let res = []
for( const user of userList ) {
res.push(user.userId === 1)
}
선언형 프로그래밍
let res = userList.map( user => user.userId === 1 )
선언형 프로그래밍 방식으로 하게되면, 무엇을 할지에 대해서만 고민하면 된다. filter는 데이터를 찾는 함수이고, map은 데이터를 바꾸는 함수이다. 제거를 하고자 한다면 remove라는 함수만 호출 하면 될 것이다. (뭐 기본 함수로 제공하지 않지만)
하지만 명령형 프로그래밍 방식에서는 삭제는 어떻게 하는 것인지, 검색은 어떻게 하는 것인지, 데이터는 어떻게 변경 하는 것인지 전부 기술해줘야 한다.
하지만 명령형 프로그래밍 방식에서는 삭제는 어떻게 하는 것인지, 검색은 어떻게 하는 것인지, 데이터는 어떻게 변경 하는 것인지 전부 기술해줘야 한다.
선언형 프로그래밍은 일부만 보더라도 무엇을 할 것인지 판단이 가능하다. filter면 검색이고 remove면 삭제 map이면 변경 이런식으로 말이다.
주의할 점
선언형 프로그래밍을 하면서 꼭 주의할 점이 있다! 다른 사람이 코드를 익더라도 무엇을 하는지 알 수 있게 해야 한다는 것이다. 아래는 극단적인 예이다.
주의할 점 1
let res = userList.filter( user => {
if( user.userId === 1 ) {
user.name = 'sejiWork'
}
return true
} )
우리는 위의 실행이 filter이기 때문에 "userList에서 검색을 하는구나" 라고 생각 할 수 있다. 하지만 return이 항상 true 여서 모든 데이터가 검색 될 것이며, 실제로는 userId가 1인 사용자의 이름을 sejiWork으로 바꾸는 코드이다. 이럴 때는 map을 사용 하여야 한다.
주의할 점 2
let res = userList.filter( user => {
if( user.userId === 1 ) {
user.name = 'sejiWork'
}
return user.userId === 2
} )
위의 함수는 userId가 2인 사용자를 검색하지만 중간에 userId가 1인 사람의 이름을 변경하고 있다. 검색을 할 것이면 검색을 데이터를 변경 할 것이라면 변경을 해야 한다.
댓글
댓글 쓰기