관리 메뉴

흰둥씨의 개발장

[함수형 코딩#10~#11] 일급함수 본문

함수형 프로그래밍/쏙쏙 들어오는 함수형 코딩

[함수형 코딩#10~#11] 일급함수

돈워리비해삐 2023. 7. 7. 01:23

 

일급함수(first-class function) ?  함수를 "일급객체"로 여긴다는 의미 

일급 객체 ? 아래 조건 만족하는 객체 

1. 무명의 리터럴로 생성할 수 있음. (런타임에 생성가능하다)
2. 변수나 자료구조(객체, 배열등)에 저장 가능. 
3. 함수의 매개변수에 전달 할 수 있음 
4. 함수의 반환값으로 사용가능

자바스크립트의 함수는 위 조건을 모두 만족하기 때문에 일급객체 임
ㄴ 함수를 객체와 동일하게 쓸 수 있다는 뜻 
ㄴ 객체는 값이기 때문에 함수도 값과 동일하게 취급 
ㄴ 함수는 값을 사용할 수 있는 곳은 어디든 리터럴로 정의가능하고, 런타임에 함수 객체로 평가됨 
ㄴ 일급객체 함수의 특징 : 일반 객체처럼 함수의 매개변수로 전달 가능 / 함수의 반환값으로 사용가능 (고차-콜백함수생김)
     => 함수형 프로그래밍이 가능해짐

일급인 것과 일급이 아닌 것 구별하기

- 자바스크립트에서 일급이 아닌 것   => 일급이 아닌 기능은 함수로 감싸면 일급으로 만들수 있음 
  1. 수식연산자
  2. 반복문
  3. 조건문
  4. try/ catch문 

- 일급으로 할 수 있는 것
  1. 변수에 할당
  2. 함수의 인자로 넘기기
  3. 함수의 리턴값으로 받기
  4. 배열이나 객체에 담기

- 데이터 지향(data orientation)
ㄴ> 자바스크립트에서는 객체가 해시맵과 같은 역할을 해 줌
ㄴ> 데이터 그대로 사용하는 것 
ㄴ> 이벤트와 엔티티에대한 사실을 표현하기위해 일반 데이터 구조를 사용하는 프로그래밍 형식
  

동적타입 언어 vs 정적타입 언어 

 - 정적타입 : 컴파일 할때 타입을 검사함 (ex. JAVA) 
 - 동적타입 : 컴파일할 때 타입검사 안하고, 런타임에 타입을 확인함 (ex. Javascript) 
ㄴ> 다만, 타입시스템 자체가 언어마다 다른점을 생각해 볼 필요 있음 

 

고차함수(higher-order function) 

매개변수를 통해 함수 외부에서 콜백함수를 전달 받은 함수 , 함수를 리턴하는 함수
콜백함수는 고차함수에 의해 호출되고, 고차함수는 필요에 따라 콜백함수에 인수 전달하기도 함

//리팩토링 전 

fucntion arraySet (arr, idx, value){  //카피온라이트 적용된 상태 
    let copy = arr.slice(); //앞부분
    copy[idx] = value;
    return copy;            //뒷부분
  }
  
//앞부분과 뒷부분이 다른 함수에서도 똑같이 쓰이는 경우(중복) 발견 해서 리팩토링 시도!
//리팩토링 후 
//공통의 로직은 미리 정의해 두고,
//경우에 따라 변경되는 로직은 추상화 해서 외부에서 내부로 전달하기

function arraySet(arr, idx, value){  
	return withArrayCopy(arr, function(copy){ 
    	copy[idx] = value;  //콜백함수 
        })
 }
    
function withArrayCopy (arr, modify){ //고차함수              
    let copy = arr.slice();
    modify(copy);
    return copy;
 }

 

콜백함수

함수의 매개변수를 통해 다른 함수 내부로 전달되는 함수 
비동기처리 뿐 아니라 배열 고차함수에서도 사용 

setTimeout(()=>{  //콜백함수를 사용한 비동기처리(이벤트 처리, ajax통신,타이머함수...)
	console.log('1초지남');
    },1000);

let arr = [1,2,3,4,5];
let res = arr.map(function(item){   //콜백함수를 사용하는 고차함수 map(reduce, filter...etc)
	return item + 1;
    })
    
console.log(res);  //[2,3,4,5,6]



MDN의 일급함수설명