재귀의 개념
- 자기자신을 호출하는 함수
- 재귀를 사용하는 경우
- 주어진 문제를 비슷한 구조의 더 작은 문제로 나눌 수 있는 경우
- 중첩된 반복문이 많거나 반복문의 중첩횟수를 예측하기 어려운 경우
- 재귀로 문제 해결하기
ex) 자연수 배열을 입력받고, 리스트의 합을 리턴하는 함수 arrSum을 작성하시오
- 문제를 좀더작게 쪼갭니다.
(1,2,3,4,5)합을 구한다 치자. arrSum(1,2,3,4,5) === 1+ arrSum(2,3,4,5)이다.
arrSum(2,3,4,5)=== 2+arrSum(3,4,5)이다.
2.문제를 가장 작은 단위로 쪼개기
...
arrSum(4,5) === 4+arrSum(5)
arrSum(5) === 5+ arrSum()
- 문제 해결하기
이제 가장 작은단위의 문제를 해결한다.
arrsum() === 0
arrsum(5) === 5+arrsum()
arrsum(4,5) === 4+arrsum(5)
...
위 단계를 반영해서 arrSum함수를 완성해보면
let arrSum (arr) => arr.shift()+arrSum(arr)
재귀의 활용
- 재귀적으로 사고하기
- 재귀함수의 입력값과 출력값 정의하기
- arrSum의 경우 number타입 배열을 입력으로받고, number타입을 리턴한다.
arrSum: [number] => number
- 문제를 쪼개고 경우의 수를 나누기
문제를 어떻게 쪼갤것인지 고민. 기준을 정하고 문제를 더 큰경우와 작은경우로 구분할수있는지 확인
입력값, 문제의 순서, 크기
- 단순한 문제 해결하기
- 복잡한 문제 해결하기
function recursive(input1, input2, ...) {
if (문제를 더 이상 쪼갤 수 없을 경우) {
return 단순한 문제의 해답;
}
return 더 작은 문제로 새롭게 정의된 문제
}
JSON
- 탄생배경
- 데이터 교환을 위해 만들어진 객체형태 포맷
- 객체 내용을 다른 프로그램에게 전송한다면 어떻게 할것인가?
- 메시지 객체가 전송가능하려면, 메시지를 보내는 발신자와 수신자가 같은 프로그램을 사용하거나, 문자열처럼 범용적으로 읽을수 있는 선택이어야 한다.
- 객체는 타입변환을 이용해 String으로 변환할 경우 객체 내용을 포함하지 않는다.
- 이문제를 해결하려면 객체를 JSON형태로 변환하거나 JSON을 객체형태로 변환하는 방법이다.
- 이를위한 메서드는 다음과 같다.
- JSON.stringify : 객체를 JSON으로 변환합니다.
- JSON.parse: JSON을 객체로 변환합니다.
let transferableMessage = JSON.stringify(message)
console.log(transferableMessage)
console.log(typeof(transferableMessage))
- stringfy하는 이 과정을 직렬화한다고 함
- json으로 변환된 객체의 타입은 문자열이다. 발신자는 직렬화한 문자열을 누군가에게 보낼수있다.
- 그럼 수신자는 문자열을 어떻게 다시 객체형태로 만들수있는가? > JSON.parse("{문자열}")
- JSON.parse하는 이 과정을 역직렬화라고 한다.
- 이처럼 JSON은 서로다른 프로그램사이에서 데이터를 교환하기위한 포맷임. 여러 언어에서 범용적으로 씀
- JSON의 객체는 반드시 키,값에 쌍따옴표 붙여야하고, {"key":"property"} ''도안되고 스페이스바도 안됨.
- 팁: 문자열만드는 세가지방법
- obj.toString()
- String(obj)
- 백틱 달러 중괄호 obj 중괄호 백틱
- 팁2. 배열내 for > let el of arr, 객체내 키 for > for(let key in obj) : key로 키 접근,
obj[key]
로 값에 접근