함수(콜백 함수)

김동현·2024년 4월 11일

Study

목록 보기
2/8
post-thumbnail

함수

函 지닐 함 數 셈 수

프로그래밍에서 함수는 일련의 작업이나 계산을 수행하는 코드 블록을 의미한다.
주어진 입력(매개변수)을 받아 작업과 계산을 마친 결과를 출력을 생성하는 데 사용된다.

// a와 b를 전달 받아 두 수를 더한 값을 반환한다.
function add(a, b) {
	return a + b;
}

매개 변수

함수의 매개 변수로 될 수 있는 것은 데이터코드 블럭(함수)이다.

  1. 데이터: 숫자, 문자, 객체
  2. 코드 블럭: 함수, 익명 함수, 클래스(?)

📝 우리는 매개 변수 넘겨진 함수를 콜백(왜 이렇게 지어 졌는 지 알 수 없는 이름 생성의 이해 불가능의 법칙) 이라고 부른다.

함수 매개변수(콜백 함수)

🧐 콜백 함수가 왜 필요할까? 즉, 매개 변수로 함수를 넘기는 것이 왜 필요할까?

  1. 외부 라이브러리 및 모듈 사용
  2. 재사용성 증진
  3. 효율적인 프로그램 구성

콜백 함수는 무엇인가를 하고 싶지만 그게 언제 호출될 지는 모를 때 자주 사용 된다.

  1. 데이터 베이스에서 데이터를 가져온 후 특정 함수를 실행 시킬 때가 있다.

    🔥 이 예시는 async/await으로 동기적으로 처리하는 경우가 더 많다.
    -> user를 가져와야 이후 프로세스를 처리할 수 있기 때문이다.

// 데이터베이스에서 사용자 정보를 조회하고, 이메일을 보내거나 파일에 저장하는 작업
const userQuery = userRepository.findOne({ where: { id: 1 } });

console.log("춤추기 👯👯👯👯👯"); // 춤추기
add(100, 20000); // 더하기 계산하기
const callback = (user) => {
	// 사용자 정보를 이메일로 보내는 작업
    if (user) sendEmail(user.email, `안녕하세요, 여기는 회원 정보입니다: ${JSON.stringify(user)}`);
}

userQuery.then(callback);
  1. 파일을 읽어와 줄 단위로 콘솔을 찍는 함수
const fs = require('fs');
// 예시 파일 경로
const filePath = 'example.txt';

// 콜백 함수를 사용하여 파일을 읽어오는 함수
function readFileWithCallback(filePath, callback) <{
	// 3번째 함수도 콜백 함수이다 :)
    fs.readFile(filePath, 'utf8', (err, data) => {
		// 언제 파일이 다 읽어와 질지 모르겠지만,
        // 파일이 다 읽어와지면 callback을 실행시켜 줄게
        if (err) {
            callback(err, null);
        } else {
            callback(null, data);
        }
    });
}

// 파일을 읽어와서 처리하는 콜백 함수
function processFile(err, fileData) {
    if (err) {
        console.error('파일 읽기 에러:', err);
    } else {
        // 파일 데이터를 줄 단위로 나누고 각 줄을 대문자로 변환하여 출력
        const lines = fileData.split('\n');
        lines.forEach((line, index) => {
            console.log(`${index + 1}: ${line.toUpperCase()}`);
        });
    }
}

// 파일 읽기 함수 호출
readFileWithCallback(filePath, processFile);
// example.txt
예시 텍스트 파일입니다.
줄바꿈으로 구분된 파일입니다.
코딩은 재미있습니다 :)

함수를 매개변수로 넘기는 자의 관점

📌 내가 하고 싶은 일은 유저에게 이메일을 보내는 것이다.
📌 즉, 함수 매개변수가 어떤 일(내가 하고 싶은 일)을 하는 지 알지만, 언제 실행되는 지는 알지 못한다!

유저 조회에 언제 끝날지 모른다. + 나는 유저가 조회될 때까지 기다리고 싶지 않다. 그저 이메일을 보내고 싶을 뿐이다.
파일을 읽어오는 행위가 언제 끝날지 모른다. + 그저 읽어온 파일을 줄 별로 출력하고 싶을 뿐이다.

함수를 매개변수로 넘겨받는 자의 관점

📌 내가 하고 싶은 일은 유저를 조회해 온 뒤 넘겨 받은 함수에 유저를 넣어 실행하는 것이다.
📌 즉, 함수 매개변수가 언제 실행될지는 알지만, 그것이 무슨 일인지는 알지 못한다!

유저 조회가 언제 끝날지는 안다. 하지만 함수가 호출되기 전에는 무슨 일을 할지 모른다. <- 호출부에서 어떤 일을 할 지 결정해 주어야 한다.(이메일 보내기)
파일 읽어오기가 언제 끝나는 지 안아. 하지만 함수가 호출 되기 전에는 무슨 일을 할지 모른다. <- 호출부에서 어떤 일을 할 지 결정해 주어야 한다.(줄별로 출력하기)

동기(호출)/비동기(호출)

동기는 요청한 작업에 완료 여부를 기다려 순차적으로 처리하는 것이고
비동기는 요청한 작업의 완료 여부와 상관없이 자신의 작업을 이어하는 것이다.

함수를 호출하고 난 결과에 관심이 있는가? 또는 한 작업이 다음 작업에 영향을 미치는 지의 여부가 중요한 것이다.

즉, 동기/비동기는 함수를 호출 할때 결정된다고 볼 수도 있다. <- 스레드로 호출? Promise를 반환하는 함수 호출?
기다릴 것이냐, 기다리지 않을 것이냐를 표현하여 주는 것이다.

프로그램은 목적을 달성하기 위해 더 이상 쪼갤 수 없는 단위의 작업시간 순서대로 나열한 것이다.

위 정의에서 더 이상 쪼갤 수 없는 단위의 작업은 함수로 표현되며 시간 순서로 나열된 함수들이 프로그램이 되는 것이다.

즉, 모든 실행되는 프로그램은 동기적으로 처리되고,
중간 중간에 다른 실행중인 프로그램에 이벤트를 보내거나 데이터를 저장하는 등의 프로그램이 기다릴 필요가 없는 일련의 행위(함수)들은 비동기 호출을 통해 더 효율적인 프로그램을 만들어 갈 수 있는 것이다.

profile
달려보자

0개의 댓글