본문 바로가기

개념정리

8/29[TIL]고차함수 복습..

4주간의 길고도(?) 짧았던(?) Pre 코스 과정이 끝이 났다. 그리고 곧바로 있었던 HA...
pre 코스 과정에서 배웠던 것을 시험해보고 이머시브 과정으로 내가 나아갈 수 있는지에 대한 잣대를 제공 해줄 문제들이었다. 이전에 풀었던 코플릿이나 과제들보다 느끼는 체감으로는 긴장 을 해서 그런지는 모르나 어렵게 느껴졌다. 거기에 편도선염까지 겹쳐 컨디션은 정말 최악이었다. 시험 첫날, 둘째 날은 정말 거의 문제를 손을 대지를 못했다. 이러다가 기수 이동은 커녕 아예 코스를 나가게 될 까 봐 조마조마하였지만 슬랙으로도 끝까지 풀어 달라는 요청을 보았고, 목요일이 되어서야 몸 컨디션이 그나마 괜찮아져서 문제를 다시 풀기 시작했다. 어려웠었던 문제들인 만큼 시간도 많이 들었고 내가 4주 동안 배웠던 기본 개념이라던지 코딩 방법에 관해서도 많은 반성을 느끼게 되었다. 주말 동안 미처 이해하지 못한 부분이나 미흡한 부분을 채워 나가야 다음 단계로 나아가는 나로서는 편하겠다는 마음으로 주말 동안에 열심히 공부해야 했다고 생각했다.

다른 여타 기본 개념들 중에 제일 아직 이해가 상대적(?)으로 안되는 개념들은 고차 함수와 재귀인 것 같다. 기본적인 개념인 고차 함수는 다른 함수를 인자로 받거나 리턴하는 함수라던지 주어진 문제가 더 작은 문제로 이루어질 수 있거나 중첩된 루프가 많거나 정도를 알 수 없는 정도 일 때 사용할 수 있는 재귀... 이러한 기본적인 개념이나 이럴 때 사용해야 한다라는 것은 알고 있지만 내가 막상 사용하려고 하면 아직 익숙하지 않아서 그런지 모르겠지만 내 것(?)이 완벽하게 아닌 느낌이 든다. 처음이라 그런 감이 없잖아 존재하겠지만 사용을 많이 하게 될 개념이라서 그런지 확실하게 잡고 가야겠다는 생각이 들었다.

높은 수준에서 생각하면 높은 수준의 결과물이 나온다는 말 처럼 고차 함수를 사용하면 한결 효율적인 코딩과 클린 코딩이 가능해진다. 고차 함수를 배우기 예전 하드 코딩을 보고 있노라면 나 자신이 부끄러워진다. 다른 함수를 인자로도 받을 수도 있고, 함수 자체를 리턴할 수도 있다. 그리고 물론 이 두 가지를 같이 진행할 수도 있다.

고차 함수 중에는 여러가지 메소드들인 존재하는데 filter메소드는 배열의 요소 중에 특정 조건을 만족하는 요소들만 걸러내는 메소드이다. if과 마치 비슷하다고 생각하면 된다고 생각한다. 하지만 특정 조건은 함수 형태로 filter메소드에 전달되어야 한다는 점을 유의해야 한다.


물론 filter 메소드 말고도 주어진 함수를 배열 요소 각각 실행하는 forEach(),

주어진 판별 함수를 만족하는 첫 번째 요소의 값을 반환하는 find(),

배열 내의 모든 요소 각각에 대해 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환하는 map(),

그림 짤(?)로도 유명하지만 똥(?)을 만든다는... 배열의 각 요소에 대해 주어진 reducer함수를 실행해 하나의 결과의 값을 반환하는 reduce(),

배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환하는 sort() 솔직히 sort() 메소드 같은 경우 이 메소드를 배우면서도 ASCII 문자 순서대로 정렬되어 숫자의 크기대로 나오지 않거나 여러 애로 사항이 내가 처음 보았을 때 많아서 이 걸 사용해야 할 일이 있을까? 하는 의구심을 가졌던 메소드이다. 다른 메소드로도 얼마든지 대체할 수 있다고 해야 할까... 그런데 곧장 이 메소드를 사용하고 있는 나 자신을 발견했다. 아래에 있는 그림처럼 오름차순/내림차순의 사용 예시를 보니 사용 안 할 수가 없을 정도로 정말 유용했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
let score = [1,33,24,22,4];
score.sort(); //[1,22,24,33,4] ASCII문자 순서대로 정렬되어 숫자의 크기대로 안나옴 ㅠㅠ
 
score1.sort(function(a,b) {
return a-b; //[1,4,22,24,33] 오름차순.. b-a는 내림차순 
});
 
let user = [
    { name : "시목" , age : 40 },
    { name : "여진" , age : 36 },
    { name : "태하" , age : 50 },
    { name : "동재" , age : 42 }
]
 
user.sort(function(a,b) {
return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
}); // 동재, 시목, 여진, 태하 <오름차순> 리턴 문 부등호를 반대로 할 시 <내림차순>
 
 
let sorting = "age";
user.sort(function(a,b) {
return a[sorting]-b[sorting];
}); //age를 sorting에 할당해 진행도 가능 이와 같은 경우 
36, 40, 42, 50 <오름차순> b[sorting]-a[sorting]시에 <내림차순>
cs

그리고 배열 안의 어떤 요소라도 주어진 판별 함수를 통과하는 some()... 이와 반대인 every() 
some() 같은 경우 어느 하나의 요소라도 조건을 만족하면 true 아니면 false로 반환되고 every()는 모든요소가 다 만족해야 true이고 하나라도 만족 안 한다면 false 였기에 or와 and의 개념의 비슷하다고 이해하면 쉬울 것이다. 훨씬 더 많은 메소드 들도 존재하지만 오늘은 여기까지...

시간이 자치하는 비중이 중요해진 현재사회의 모습을 보면 고차 함수를 사용하는 것이 거의 필연적으로 이루어져야 한다는 생각이다. 이전에 내가 더 익숙해져야겠지...  

내가 어떠한 코딩을 해야할 때 해결하여야 할 문제를 파악하고 의사 코드를 작성할 때 이러한 메소드를 써야지 이런 식으로 단박에 나온다면 얼마나 좋을까? 아직은 이리저리 헤매고 있는 내 모습이 한동안은 아른거린다. 하지만 처음부터 잘하는 사람이 어디 있겠는가 익숙해지면 나도 할 수 있겠지 하는 생각을 하며 오늘 til를 마친다.