함수가 호출될때 그 함수들을 모아두는 자료구조
공통점 : 반복해서 값을 추출한다.
차이점
함수 | 접근방식 | 우위 | 예시 |
---|---|---|---|
재귀함수 | 상향식 / 하향식 | 하향식 접근 | 팩토리얼 구현 |
반복문 | 상향식 | 상향식 접근 | 일반적인 상황 |
상향식 / 하향식?
호출될 때마다 메모리에 스택이 쌓이고, 한계치 이상으로 호출이 되어 스택이 넘쳐버리면 메모리 부족으로 에러가 발생한다.
반복문에 비해 시간이 오래 걸린다.
함수 호출과 복귀를 하기 위한 context switching 비용이 발생하기 때문에, 속도가 상대적으로 느립니다. 즉, 오버헤드가 발생하여 속도가 느리게 됩니다.
재귀호출이 끈난 후 현재 함수에서 추가연산을 요구하지 않도록 구현하는 재귀의 형태이다.
이를 이용하면 함수 호출이 반복되어 스택이 깊어지는 문제를 컴파일러가 선형으로 처리하도록 알고리즘을 바꿔 스택을 재사용할수 있게 된다.
nullish 병합 연산자(nullish coalescing operator) ??를 사용하면 짧은 문법으로 여러 피연산자 중 그 값이 ‘확정되어있는’ 변수를 찾을 수 있습다.
let height = 0;
alert(height || 100); // 100
alert(height ?? 100); // 0
||는 height
에 0ㅇ을 할당했지만 0을 falsy 한 값으로 취급했기 때문에 null
이나 undefined
를 할당한 것과 동일하게 처리한다. 따라서 결과가 100이 나온다.
반면 ?? 는 height 가 정확하게 null 이나 undefined일 경우에만 100이 된다. 예시에서는 height에 0이라는 값을 할당했으므로 0이 출력된다.
그냥 일반 메소드 처럼 만들면 될거 아닌가? 이거 뭐하러 만듦?
만약 속성 중에서 메소드가 존재한다면, 일반 메소드처럼 만들어서 변수에 선언을 하면, 속성에 존재하는 메소드가 내용이 같지만 따로따로 변수마다 생성이 된다.
만약 클래스로 작성하게 된다면 메소드는 하나만 생성되면 각각의 변수들은 그 메소드를 가져다 사용하는 것이다.
기존 부모 클래스(비교적 추상적)를 상속받아 새로운 자식 클래스(비교적 구체적)를 추가할 수 있다. 부모 생성자의 기능을 물려 받으면서, 새로운 기능을 추가.
인스턴스를 사용해서 서로 다른 값으로 같은 메소드를 호출해야할 때