-
#JavaScript Grammar_일급 객체로서의 함수Javascript 2023. 10. 19. 10:53
# 일급 객체(First-Class Object)란?
다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리키며, 함수는 일급 객체로 취급되기 때문에 매우 유연하게 사용할 수 있음.
1) 변수에 함수를 할당
함수는 변수에 할당할 수 있음. 함수는 값으로 취급되기 때문에, 다른 변수와 마찬가지로 변수에 할당할 수 있음.
변수에 할당된 함수는 나중에 사용할 수 있음.
const sayHello = function() { console.log('Hello!'); }; sayHello(); // "Hello!" 출력
2) 함수를 인자로 다른 함수에 전달
함수는 다른 함수에 인자로 전달될 수 있음. 함수가 값으로 취급되기 떄문에, 다른 함수의 인자로 전달할 수 있음.
이것은 콜백(callback)이나 고차 함수(higher-order fuction)를 작성하는데 사용됨.
***콜백 함수와 고차함수란?
- 콜백 함수는 어떠한 함수의 매개변수로 쓰이는 함수를 말함..
- 고차 함수는 함수를 인자로 받거나 함수를 출력으로 반환하는 함수를 말하며 함수를 다루는 함수라고도 칭함.
- 콜백함수는 고차함수라고도 할 수 있음.
function callFunction(func) { func(); } const sayHello = function() { console.log('Hello!'); }; callFunction(sayHello); // "Hello!" 출력
3) 함수를 반환
함수는 다른 함수에서 반환될 수 있음. 함수는 값으로 취급되기 때문에, 다른 함수에서 반환할 수 있음.
함수 팩토리(factory)나 클로저(closure)를 작성하는데 사용.
function createAdder(num) { return function(x) { return x + num; } } const addFive = createAdder(5); console.log(addFive(10)); // 15 출력
4) 객체의 프로퍼티로 함수를 할당
함수를 객체의 프로퍼티 할당될 수 있음. 객체의 메소드로 함수를 호출할 수 있음.
const person = { name: 'John', sayHello: function() { console.log(`Hello, my name is ${this.name}`); } }; person.sayHello(); // "Hello, my name is John" 출력
5) 배열의 요소로 함수를 할당
함수는 배열의 요소로 할당될 수 있음. 이것은 함수를 배열에서 사용할 수 있게 함.
const myArray = [ function(a, b) { return a + b; }, function(a, b) { return a - b; } ]; console.log(myArray[0](5, 10)); // 15 출력 console.log(myArray[1](10, 5)); // 5 출력
함수를 일급 객체로 다룰 수 있다는 것은, 코드를 더 간결하고 모듈화된 형태로 작성할 수 있게 해줌. 또한 함수를 다양하게 조합 할 수 있다는 것을 의미함. 이를 통해 더 복잡한 기능을 구현할 수 있고 유지 보수에도 용이해짐.
function multiplyBy(num) { return function(x) { return x * num; } } function add(x, y) { return x + y; } const multiplyByTwo = multiplyBy(2); const multiplyByThree = multiplyBy(3); const result = add(multiplyByTwo(5), multiplyByThree(10)); // 35 출력
# 일급객체로서의 함수 장단점
1. 장점
1) 유연한 함수 다루기: 함수를 일급 객체로 다루면 다른 변수와 마찬가지로 함수를 할당하고 전달할 수 있음.
2) 고차함수 및 클로저: 코드를 더 추상적으로 만들고 모듈화할 수 있으며, 데이터 은닉 및 보호를 구현할 수 있음.
3) 콜백 함수: 비동기 작업 처리, 이벤트 처리 및 배열 처리와 같은 다양한 상황에서 유용함.
4) 모듈화와 재사용성: 코드의 가독성과 유지보수성이 향상.
2. 단점
1) 과도한 복잡성: 함수형 프로그램의 고급 개념을 남용하면 코드가 복잡해질 수 있음.
2) 학습 곡선: 함수형 프로그램밍 패러다임은 다소 낯설 수 있으며, 새로운 개념을 배우는데 시간이 걸림.
3) 성능 문제: 일부 함수형 프로그래밍 언어나 라이브러리는 성능에 영향을 미칠 수 있음.
4) 상태 관리의 어려움: 부작용(side effect)을 최소화하고 상태를 불변하게 유지하는 것을 강조하지만, 이로 인해 일부 작업에서는 상태 관리가 어려울 수 있음.
5) 문제 도메인에 부합하지 않는 경우: 모든 문제에 적합한 해결책이 아닌 경우도 있음. 오히려 명령형 프로그래밍이나 객체 지향프로그램이 더 적합할 수 있음.
'Javascript' 카테고리의 다른 글
#JavaScript Grammar_Map과 Set (1) 2023.10.19 #JavaScript Grammar_ES6문법 (1) 2023.10.19 #JavaScript Grammar_반복문(for/while/break/continue) (0) 2023.10.17 #JavaScript Grammar_배열 (2) 2023.10.17 #JavaScript Grammar_객체 (1) 2023.10.16