💡 이번에 배운 내용
- Section3. 사용자 친화적이고 안전한 Web App을 만들 수 있다.
- Unit 1. [자료구조/알고리즘] 재귀: 재귀를 학습하고 연습하면서, 이를 활용할 수 있다.
내용 자체는 많지도 않고 블로깅 하는데도 큰 시간이 걸리지 않았지만, 연습 문제를 풀거나 과제를 할 때 꽤나 난이도가 있었던 유닛이었다. 특히 레퍼런스를 보며 아직 공부가 부족함을 느꼈다. 최대한 익숙해지자!
특히 stringify를 직접 구현해보는 과제는 정말 이번 유닛의 꽃이라 할 만 했다.
코딩테스트 실력 향상을 위해서라도 재귀는 잘 연습해두어야 겠다.
재귀함수, recursive case, base case, JSON, JSON.stringify, JSON.parse, 직렬화(serialize), 역직렬화(deserialize)
재귀란 원래의 자리로 되돌아온다는 의미로,
자바스크립트에서 재귀함수는 다음과 같이 자기자신을 호출하는 함수이다.
function replay(){
replay();
}
재귀함수를 잘 이용하면 반복작업을 좀 더 효율적으로 처리할 수 있다.
말이야 쉽지... 일단은 여러 번 해봐야 익숙해지는데 어느 정도 문제푸는 규칙이 있다.
- 재귀함수의 입력값, 출력값 정의하기
- 문제를 작개 쪼개기
- 경우의 수 구분하기 - 가장 쉬운 경우, 그렇지 않은 경우
- 가장 쉬운 경우 해결하기 - 재귀의 기초(base)이자 탈출 조건
- 그렇지 않은 경우 해결하기 - 재귀의 recursive
...일단 제쳐두고
만약 팩토리얼(factorial. n!)을 구하는 함수 fact가 있다고 가정하자.
함수를 구하기 전, 팩토리얼은 무엇인가? 생각해본다.
팩토리얼은 1부터 n까지의 곱으로 만약 n!이라고도 표현한다.
식을 풀어보면 다음과 같다.
4!=1*2*3*4
이 식을 활용해서 잘게 쪼개보자. 나같은 수알못에게는 가장 쉬운 것 - 무조건 0이나 1부터 다 써보는 것이 이해에 좋다.
1!=1
2!=1*2
3!=1*2*3
4!=1*2*3*4
음 이렇게 나열해보니 어느 정도 패턴이 보인다.
이 패턴으로 정리해보면
1!=1
2!=1*2
-> 2!=1!*2
3!=1*2*3
-> 3!=2!*3
4!=1*2*3*4
-> 4!=3!*4
이렇게 문제가 쪼개지는 것을 알 수 있다.
그럼 이 사실을 안 채로, 팩토리얼 함수 fact를 만드는 과정을 위의 규칙에 적용해보자.
1!=1
2!=1*2
-> 2!=1!*2
3!=1*2*3
-> 3!=2!*3
4!=1*2*3*4
-> 4!=3!*4
1!=1
을 제외하고 나머지의 패턴은 비슷해 보인다.1!=1
이 해결할 게 뭐가 있는가??if(n===1) return 1;
2!=1*2
-> 2!=1!*2
3!=1*2*3
-> 3!=2!*3
4!=1*2*3*4
-> 4!=3!*4
n!=(n-1)!*n
이다.return fact(n-1)!*n
위 내용을 정리하여 fact함수를 최종 정리하자면 다음과 같다.
function fact(n) {
// base : 가장 쉬운 경우
if (n===1) {
return 1;
}
// recursive : 그렇지 않은 경우
return fact(n-1)!*n;
}
위의 예시를 토대로, 앞으로 문제풀 때 재귀함수를 다음 template처럼 놓고 연습하면 편하다.
function 재귀함수(input1, input2, ...) { // base case : 가장 쉬운 경우. if (가장 쉬운 경우의 조건) { return 가장 쉬운 경우의 값; } // recursive case : 그렇지 않은 나머지 경우 return 나머지 경우의 값을 구하기 위한 패턴; }
JSON(JavaScript Object Notation)은 데이터 통신을 위한 객체 형태의 데이터 포맷이다. 주로 네트워크 통신에 사용되며 형변환이 가능하며 문자열처럼 읽을 수 있다.
이 JSON이 뜬금없이 왜 재귀함수와 함께 나오냐면, JSON.stringify(), 즉 직렬화 메서드가 인자가 다차원 객체여도 모두 탐색하여 문자열로 변환해야 하는데 이 때 재귀함수가 사용되기 때문이다.
(그리고 타이밍이 요상할 뿐 사실 JSON은 중요한 개념이다.)
자바스크립트의 객체는 JSON으로 변환이 가능하며 JSON은 객체로 변환이 가능하다.
이 때 사용하는 메서드는 다음과 같다.
만약 자바스크립트의 객체를 발신할 때는 객체를 JSON으로,
수신할 때는 JSON을 객체로 변환해야 한다.
객체를 그냥 문자열로 변환하면 타입은 string
이지만 값은[obejct Object]
로 변한다.
때문에 내용을 유지한채 문자열로 바꾸려면 형태는 좀 다르지만 JSON 형태로 변환시켜야 한다.
string
이며 값은 JSON형태로 변한 객체의 내용이 담겨있다.'{"name":"jean","age":22,"hasMoney":false}'
object
이며 값은 무사히 객체로 변환된다.JSON은 자바스크립트의 객체와 비슷해 보이지만 다른 규칙을 가지고 있다.
'{"key":"value"}'
'{"key":234}'
1. JSON 공식문서
빡빡한 영어와 말이 필요없는 디자인, 숨막히는 이미지들로 구성되어 있어
쉽게 학습하라고 강력하게 추천할 수는 없지만 자세한 내용은 확인할 수 있다.
🔗 JSON
2. JSON viewer (chrome 확장프로그램)
json 데이터를 보기 쉽게 보여주는 확장프로그램이다. 네트워크 통신으로 받은 데이터를 볼 때 편하다.
🔗 JSON viewer 추가 페이지
3. 재귀 심화학습
아직 복습이 더 필요해 도전하지는 못했지만 심화학습으로 알아봐야할 목록을 아래와 같이 적어놓았다. 추후 레벨이 오르면 작성할 예정이다.