B 바이낸스 · 전 세계 1위 암호화폐 거래소바이낸스 가입 → AD OKX OKX · 글로벌 대형 암호화폐 거래소OKX 가입 → AD
💻 코딩 기초 · 5강 / 10

함수 — 이름 붙인 작은 기계로 나누기

함수는 입력을 받아 처리한 뒤 결과를 돌려주는 이름 붙은 코드 묶음입니다. 결과는 `console.log`로 찍는 것이 아니라 `return`으로 돌려주어야 다른 코드가 이어서 쓸 수 있고, 그래야 테스트하기도 쉬워집니다.

⏱ 약 22분 ✍️ 확인 문제 5개 🧪 코드 실습 4개 업데이트 2026-10-09
🎯 이 강의의 학습 목표
  • 매개변수와 반환값이 있는 함수를 만들고 불러 쓸 수 있다
  • return과 console.log의 차이를 설명하고 상황에 맞게 쓸 수 있다
  • 화살표 함수로 짧은 함수를 쓰고, 중괄호를 쓸 때의 return 함정을 피할 수 있다
  • 긴 계산을 작은 순수 함수로 나누고 입력·기대값으로 시험할 수 있다

1.함수란 무엇인가 — 입력을 받아 결과를 돌려주는 기계

1강에서 프로그램을 입력 → 처리 → 출력으로 보았습니다. 함수는 그 구조를 작게 떼어 내 이름을 붙인 것입니다. 자판기를 떠올리면 쉽습니다. 돈과 버튼(입력)을 넣으면 안에서 무슨 일이 일어나는지 몰라도 음료(결과)가 나옵니다. 한 번 만들어 두면 같은 자판기를 몇 번이고 다시 쓸 수 있습니다.

함수가 없으면 같은 계산을 쓸 때마다 코드를 복사해야 합니다. 그러다 계산 규칙이 바뀌면 복사한 곳을 전부 찾아 고쳐야 하고, 한 곳이라도 빠뜨리면 결과가 서로 달라집니다. 함수로 만들어 두면 규칙은 한 곳에만 있고, 고칠 때도 그곳만 고치면 됩니다. 또 vatOf(price)처럼 이름만 봐도 무슨 일을 하는지 알 수 있어 코드가 문장처럼 읽힙니다.

함수를 만드는 것을 '정의한다', 쓰는 것을 '호출한다(부른다)'고 합니다. 정의만 해서는 아무 일도 일어나지 않습니다. 이름 뒤에 괄호를 붙여 vatOf(10000)처럼 불러야 비로소 본문이 실행됩니다. 괄호 없이 vatOf라고만 쓰면 함수 자체를 가리킬 뿐 실행되지 않으니 주의하세요.

정의는 한 번, 호출은 여러 번 — 가상의 부가세 10% 계산
function vatOf(price) {
  return price * 0.1;
}
console.log(vatOf(10000));
console.log(vatOf(25000));
출력
1000
2500

2.매개변수와 반환값

함수 이름 뒤 괄호 안의 price를 매개변수라고 합니다. 함수 안에서 쓰는 '빈 칸의 이름'입니다. 호출할 때 넣는 실제 값 10000은 인자라고 부릅니다. 호출하면 인자가 매개변수에 담긴 채로 본문이 실행됩니다. 매개변수가 여러 개면 쉼표로 나누고, 인자는 적힌 순서대로 들어갑니다. 순서를 바꿔 넣으면 오류 없이 엉뚱한 결과가 나오니 순서가 중요합니다.

return은 결과를 호출한 곳으로 돌려주고 함수를 그 자리에서 끝냅니다. return 아래에 있는 줄은 실행되지 않습니다. return이 없거나 값 없이 return;만 쓰면 함수는 undefined를 돌려줍니다. 인자를 덜 넣으면 빠진 매개변수도 undefined가 되어, 계산에 쓰이면 2강에서 본 NaN이 나옵니다. JavaScript는 이런 경우에도 오류를 내지 않으므로 직접 확인해야 합니다.

인자가 없을 때 쓸 값을 미리 정해 둘 수도 있습니다. 매개변수 뒤에 = 값을 붙이면 기본값이 됩니다. 아래 코드에서 rate를 넣지 않으면 0.1이 쓰입니다. 기본값은 '보통은 이 값'인 설정에 잘 맞지만, 꼭 받아야 하는 값에 기본값을 붙이면 실수로 빠뜨려도 알아채지 못하니 가려 써야 합니다.

인자가 빠지면 undefined → NaN, 기본값이 있으면 그 값
function rectArea(w, h) {
  return w * h;
}
console.log(rectArea(3, 4));
console.log(rectArea(3));

function tax(price, rate = 0.1) {
  return price * rate;
}
console.log(tax(20000));
console.log(tax(20000, 0.05));
출력
12
NaN
2000
1000

3.`return`과 `console.log` — 가장 흔한 혼동

처음 함수를 배울 때 가장 많이 헷갈리는 것이 '돌려주기'와 '화면에 찍기'의 차이입니다. 둘 다 결과가 보이는 것 같지만 하는 일이 전혀 다릅니다. console.log는 사람이 보라고 값을 화면에 적는 것이고, 프로그램은 그 값을 이어서 쓸 수 없습니다. return은 값을 호출한 코드에게 건네주는 것이라, 받은 쪽에서 변수에 담거나 다른 계산에 넣을 수 있습니다.

아래 코드의 showDouble은 결과를 찍기만 하고 돌려주지 않습니다. 그래서 showDouble(4)를 변수에 담으면 화면에는 8이 찍히지만 변수에는 undefined가 들어가고, 거기에 1을 더하면 NaN이 됩니다. 계산기를 두드려 화면에 답을 띄운 것과, 그 답을 다음 계산에 넘겨준 것의 차이라고 생각하면 됩니다.

이 페이지의 실습 채점도 같은 원리입니다. 채점기는 함수를 불러 '돌려받은 값'을 기대값과 비교합니다. 함수 안에서 정답을 console.log로 찍기만 하면 화면에는 맞는 숫자가 보여도 채점은 실패합니다. 원칙은 간단합니다. 계산하는 함수는 return으로 돌려주고, 화면에 찍는 일은 함수를 부른 바깥에서 합니다.

찍기만 하는 함수와 돌려주는 함수
function showDouble(x) {
  console.log(x * 2);
}
function double(x) {
  return x * 2;
}
const a = showDouble(4);
console.log('a 에 든 값', a, a + 1);
const b = double(4);
console.log('b 에 든 값', b, b + 1);
출력
8
a 에 든 값 undefined NaN
b 에 든 값 8 9
`return`과 `console.log` 비교
`return``console.log`
누구에게함수를 부른 코드화면을 보는 사람
값을 이어서 쓸 수 있나있다(변수·계산에 사용)없다
함수가 끝나나그 자리에서 끝난다계속 다음 줄로 간다
실습 채점돌려준 값으로 채점채점에 쓰이지 않음
주로 쓰는 곳계산하는 함수 안확인·디버깅, 최종 출력

4.화살표 함수 — 짧게 쓰는 다른 문법

함수는 const 이름 = (매개변수) => 식 모양으로도 쓸 수 있습니다. 이것을 화살표 함수라고 합니다. 화살표 오른쪽이 식 하나뿐이면 그 식의 값이 자동으로 돌려지므로 return을 쓰지 않습니다. 6강에서 배울 map·filter처럼 함수를 다른 함수에 넘길 때 특히 많이 쓰이고, AI가 짜 준 코드에서도 자주 보게 됩니다.

주의할 함정이 하나 있습니다. 화살표 오른쪽에 중괄호를 쓰면 그때부터는 일반 함수 본문처럼 취급되어 return을 직접 써야 합니다. 아래 bad는 중괄호 안에 식만 적고 return을 빠뜨려 undefined를 돌려줍니다. 오류가 나지 않으니 결과를 찍어 보기 전에는 모르고 넘어가기 쉽습니다. 짧으면 중괄호 없이, 여러 줄이면 중괄호와 return을 함께 쓴다고 기억하세요.

function으로 쓴 함수와 화살표 함수는 이 과정에서 다루는 범위에서는 같은 일을 합니다. 세부적으로 다른 점(예: this를 다루는 방식)이 있지만 기초 단계에서 몰라도 됩니다. 어느 한쪽이 더 '좋은' 것은 아니므로, 함께 일하는 사람이나 프로젝트가 쓰는 방식을 따르면 됩니다.

중괄호를 쓰면 return을 직접 써야 한다
const add = (a, b) => a + b;
const square = (x) => x * x;
const bad = (x) => { x * x; };
const good = (x) => {
  const y = x * x;
  return y;
};
console.log(add(2, 3), square(4));
console.log(bad(4), good(4));
출력
5 16
undefined 16

5.함수 안의 변수는 함수 안에서만 — 유효 범위

함수 안에서 let이나 const로 만든 변수는 그 함수 안에서만 보입니다. 이것을 유효 범위(스코프)라고 합니다. 함수가 끝나면 그 안의 변수도 사라지므로, 바깥에서 그 이름을 쓰면 ReferenceError가 납니다. 오류 메시지 is not defined는 '그런 이름은 여기서 보이지 않는다'는 뜻입니다. 메시지의 정확한 문구는 브라우저마다 조금씩 다를 수 있습니다.

처음에는 불편해 보이지만 이 규칙 덕분에 함수끼리 서로 방해하지 않습니다. 여러 함수가 각자 안에서 total이라는 이름을 써도 섞이지 않습니다. 함수 안에서 계산한 값을 바깥에서 쓰고 싶다면 바깥 변수를 몰래 바꾸지 말고 return으로 돌려주세요. 반복문과 조건문의 중괄호 안에서 만든 let·const도 마찬가지로 그 중괄호 안에서만 보입니다(4강에서 누적 변수를 반복문 위에 둔 까닭입니다).

함수 밖에서는 안의 변수가 보이지 않는다
function makeTotal() {
  const inside = 100;
  return inside + 1;
}
console.log(makeTotal());
console.log(inside);
출력
101
ReferenceError: inside is not defined

6.작은 함수로 나누기

긴 계산을 한 덩어리로 짜면 어디서 틀렸는지 찾기 어렵습니다. 대신 '한 가지 일만 하는' 작은 함수 여러 개로 나누고 조립하면, 각 부품을 따로 시험할 수 있고 이름이 설명 역할을 합니다. 함수 이름은 getTotal, isAdult처럼 하는 일을 동사로 드러내고, 참·거짓을 돌려주는 함수는 is·has로 시작하는 관습이 있습니다.

나눌 곳을 찾는 질문은 '이 부분을 한 문장으로 설명할 수 있는가'입니다. '상품 가격을 모두 더한다', '합계에 따라 배송비를 정한다'처럼 한 문장이 되면 그것이 함수 하나입니다. 설명에 '그리고'가 여러 번 들어가면 더 나눌 수 있다는 신호입니다. 다만 한 줄짜리 계산을 지나치게 잘게 쪼개면 오히려 읽기 어려워지므로, 이름을 붙일 만한 의미가 있는 단위로 나눕니다.

예제가상의 쇼핑몰 규칙: 상품 가격을 모두 더하고, 합계가 50,000원 이상이면 배송비 0원, 아니면 3,000원을 더합니다. 이 계산을 함수로 어떻게 나눌까요?
function subtotal(prices) {
  let sum = 0;
  for (const p of prices) {
    sum += p;
  }
  return sum;
}
function shippingFee(sum) {
  return sum >= 50000 ? 0 : 3000;
}
function orderTotal(prices) {
  const sum = subtotal(prices);
  return sum + shippingFee(sum);
}
console.log(orderTotal([20000, 10000]));
console.log(orderTotal([30000, 20000]));
출력
33000
50000
  1. 1단계 문장으로 쪼개기: '가격을 모두 더한다' / '합계로 배송비를 정한다' / '둘을 더해 최종 금액을 낸다'.
  2. 2단계 부품 함수: subtotal(prices)는 4강의 누적 패턴, shippingFee(sum)은 3강의 조건문입니다.
  3. 3단계 조립: orderTotal(prices)는 두 부품을 부르기만 합니다. 규칙이 바뀌면(예: 기준 60,000원) shippingFee 한 곳만 고칩니다.
  4. 검산: [20000, 10000] → 합계 30,000 + 배송비 3,000 = 33,000. [30000, 20000] → 합계 50,000(경계값, 이상이므로 무료) = 50,000.
답합계·배송비·최종 금액을 각각의 함수로 나누고 조립한다: 33000, 50000
조건 ? 값1 : 값2는 조건이 참이면 값1, 거짓이면 값2가 되는 짧은 조건식(삼항 연산자)입니다. 3강의 if/else를 한 줄로 쓴 것이라고 보면 됩니다. 길어지면 if로 쓰는 편이 읽기 쉽습니다.

7.순수 함수와 테스트하기 쉬운 코드

같은 입력을 넣으면 언제나 같은 결과를 돌려주고, 바깥의 변수나 화면 같은 것을 바꾸지 않는 함수를 순수 함수라고 합니다. double(4)는 언제 불러도 8입니다. 반면 아래 addVisit은 바깥 변수 visits를 바꾸기 때문에 같은 호출이 부를 때마다 다른 값을 돌려줍니다. 이런 함수는 결과가 '지금까지 무슨 일이 있었는가'에 따라 달라져서 원인을 추적하기 어렵습니다.

순수 함수의 가장 큰 장점은 테스트가 쉽다는 것입니다. '이 입력이면 이 결과'라는 표만 있으면 되기 때문입니다. 함수를 만들면 보통 경우, 경계값(0, 빈 목록, 기준과 딱 같은 값), 이상한 입력을 몇 개 골라 기대값을 먼저 적고 결과와 비교해 보세요. 이 페이지 실습의 채점 방식이 바로 이것이고, 10강에서 AI가 짠 코드를 검증할 때도 같은 방법을 씁니다.

물론 모든 함수가 순수할 수는 없습니다. 화면에 찍고, 파일을 저장하고, 서버에 보내는 일은 바깥을 바꾸는 것이 목적입니다. 요령은 계산은 순수 함수로 따로 떼어 두고, 바깥을 바꾸는 일은 가장자리의 몇 군데에만 모으는 것입니다. 그러면 틀리기 쉬운 계산 부분은 표로 시험할 수 있고, 바깥을 바꾸는 부분은 짧아서 눈으로 확인하기 쉽습니다.

같은 호출, 다른 결과(순수하지 않음) vs 늘 같은 결과(순수)
let visits = 0;
function addVisit() {
  visits++;
  return visits;
}
console.log(addVisit(), addVisit());

const nextCount = (n) => n + 1;
console.log(nextCount(0), nextCount(0));
출력
1 2
1 1
입력·기대값 표로 직접 시험하기 — 경계값 19를 꼭 넣는다
const isAdult = (age) => age >= 19;
function check(input, want) {
  const got = isAdult(input);
  const ok = got === want;
  console.log(input, ok ? '통과' : '실패');
}
check(18, false);
check(19, true);
check(0, false);
출력
18 통과
19 통과
0 통과

📌 핵심 정리

  • 함수는 입력(매개변수)을 받아 처리한 뒤 결과를 return으로 돌려주는 이름 붙은 코드다
  • console.log는 사람에게 보여 줄 뿐이고, 다른 코드가 쓰려면 return해야 한다
  • 인자가 빠지면 undefined, return이 없으면 undefined — 오류 없이 NaN이 될 수 있다
  • 화살표 함수에 중괄호를 쓰면 return을 직접 써야 한다
  • 한 문장으로 설명되는 작은 순수 함수로 나누면 입력·기대값 표로 시험하기 쉽다

✍️ 확인 문제

먼저 풀어 본 뒤 '정답과 해설'을 펼치세요.

Q1. function f(x) { console.log(x + 1); }일 때 const r = f(2); 다음 r에 든 값은?

⭕ 정답입니다

❌ 다시 생각해 보세요

정답과 해설
정답 ② undefined

f는 3을 화면에 찍기만 하고 return이 없으므로 undefined를 돌려줍니다. 값을 이어서 쓰려면 return x + 1;로 고칩니다.

Q2. const g = (x) => { x * 2; };에서 g(5)의 결과는?

⭕ 정답입니다

❌ 다시 생각해 보세요

정답과 해설
정답 ② undefined

중괄호를 쓰면 본문으로 취급되어 return을 직접 써야 합니다. (x) => x * 2처럼 중괄호를 빼거나 { return x * 2; }로 고칩니다.

Q3. function area(w, h) { return w * h; }를 area(5)로 부르면?

⭕ 정답입니다

❌ 다시 생각해 보세요

정답과 해설
정답 ③ NaN

h에 인자가 들어오지 않아 undefined가 되고, 5 * undefined는 NaN입니다. JavaScript는 인자 개수가 달라도 오류를 내지 않습니다.

Q4. 다음 가운데 순수 함수는?

⭕ 정답입니다

❌ 다시 생각해 보세요

정답과 해설
정답 ② 받은 두 수의 큰 값을 돌려주는 함수

두 수의 큰 값은 같은 입력이면 늘 같은 결과이고 바깥을 바꾸지 않습니다. 바깥 변수를 바꾸거나, 시각처럼 입력 밖의 것에 기대거나, 화면에 찍는 일은 순수하지 않습니다.

Q5. 함수 안에서 const로 만든 변수를 함수 밖에서 쓰면 어떤 종류의 오류가 날까요? 오류 이름을 쓰세요.

정답과 해설
정답 ReferenceError (… is not defined)

함수 안의 변수는 그 함수 안에서만 보입니다. 바깥에서 그 값이 필요하면 return으로 돌려받아 변수에 담습니다.

🧪 코드 실습

계산하는 함수는 값을 돌려주어야 채점됩니다. 화면에 찍기만 하는 코드를 고치는 문제부터, 작은 함수를 조립하는 문제까지 차례로 풀어 보세요.

코드는 이 브라우저 안의 격리된 공간에서만 실행되고 서버로 보내지 않습니다. 네트워크에는 접속할 수 없고, 2초가 넘으면 멈춥니다. 고친 코드는 이 브라우저에만 저장됩니다. Ctrl+Enter(⌘+Enter)로 실행하고, Tab 키는 공백 두 칸입니다(Esc 다음 Tab 은 다음 칸으로 이동).

자바스크립트가 꺼져 있어 실행할 수는 없지만, 문제와 처음 코드, 자동 검사 내용, 예시 답안은 그대로 읽을 수 있습니다.

1섭씨를 화씨로

섭씨 온도 c를 받아 화씨 온도를 돌려주는 함수 cToF(c)를 만드세요. 공식은 화씨 = 섭씨 × 9 / 5 + 32 입니다. 예: cToF(100)은 212.

자동 검사
  • cToF(0)기대값 32
  • cToF(100)기대값 212
  • cToF(-40)기대값 -40
  • cToF(36.5)기대값 97.7
💡 힌트

return이 없으면 함수는 undefined를 돌려줍니다.

예시 답안 보기
function cToF(c) {
  return c * 9 / 5 + 32;
}

2찍기만 하는 함수 고치기

가상의 쇼핑몰 배송비 함수 shippingFee(sum)은 합계 sum이 50,000원 이상이면 0, 아니면 3000을 돌려주어야 합니다. 처음 코드는 값을 화면에 찍기만 해서 채점에 실패합니다. 돌려주도록 고치세요.

자동 검사
  • shippingFee(12000)기대값 3000
  • shippingFee(50000)기대값 0
  • shippingFee(49999)기대값 3000
  • shippingFee(80000)기대값 0
💡 힌트

console.log(값)을 return 값으로 바꾸면 됩니다. 50,000은 경계값이고 '이상'이라 무료입니다.

예시 답안 보기
function shippingFee(sum) {
  if (sum >= 50000) {
    return 0;
  }
  return 3000;
}

3작은 함수 조립하기

가격 배열 prices를 받아 최종 결제 금액을 돌려주는 orderTotal(prices)를 만드세요. 합계에 배송비(합계 50,000원 이상 0원, 아니면 3,000원)를 더합니다. 단, 빈 배열이면 주문이 없으므로 0을 돌려줍니다. 처음 코드의 subtotal·shippingFee를 활용하세요.

자동 검사
  • orderTotal([20000,10000])기대값 33000
  • orderTotal([30000,20000])기대값 50000
  • orderTotal([])기대값 0
  • orderTotal([49999])기대값 52999
  • orderTotal([60000,5000])기대값 65000
💡 힌트

빈 배열인지는 prices.length === 0으로 확인합니다. 그 검사를 맨 앞에 두고 바로 return하면 아래 계산은 실행되지 않습니다.

예시 답안 보기
function subtotal(prices) {
  let sum = 0;
  for (const p of prices) {
    sum += p;
  }
  return sum;
}
const shippingFee = (sum) => (sum >= 50000 ? 0 : 3000);

function orderTotal(prices) {
  if (prices.length === 0) {
    return 0;
  }
  const sum = subtotal(prices);
  return sum + shippingFee(sum);
}

4범위 안으로 가두기 (화살표 함수)

수 x를 min 이상 max 이하로 가두어 돌려주는 화살표 함수 clamp를 만드세요. x가 min보다 작으면 min, max보다 크면 max, 그 사이면 x 그대로입니다. 예: clamp(15, 0, 10)은 10. (min은 max보다 크지 않다고 가정합니다.)

자동 검사
  • clamp(15, 0, 10)기대값 10
  • clamp(-3, 0, 10)기대값 0
  • clamp(7, 0, 10)기대값 7
  • clamp(0, 0, 10)기대값 0
  • clamp(10, 0, 10)기대값 10
💡 힌트

중괄호를 쓴 화살표 함수이므로 모든 갈래에 return이 있어야 합니다. Math.min과 Math.max를 겹쳐 한 줄로 쓰는 방법도 있습니다.

예시 답안 보기
const clamp = (x, min, max) => {
  if (x < min) return min;
  if (x > max) return max;
  return x;
};

🤖 AI에게 이렇게 물어보세요

복사해서 [ ] 부분을 내 상황으로 바꿔 쓰세요. 답을 그대로 믿지 말고 본문과 비교해 확인하세요.

긴 코드를 함수로 나누고 싶을 때

아래 JavaScript 코드를 '한 가지 일만 하는' 작은 함수들로 나눠 줘. 각 함수의 이름·매개변수·반환값을 표로 정리하고, 계산하는 함수는 `console.log` 없이 `return`하도록 해 줘. 동작은 바꾸지 말고, 바뀐 점을 줄마다 설명해 줘. 코드: [붙여 넣기]

내가 만든 함수를 시험할 테스트 표가 필요할 때

다음 함수에 넣을 테스트 입력과 기대값 6개를 표로 만들어 줘. 보통 경우 2개, 경계값(0·빈 값·기준과 같은 값) 3개, 이상한 입력 1개로 하고, 각 기대값이 왜 그런지 한 줄씩 설명해 줘. 함수 설명: [무엇을 하는 함수인지] 코드: [붙여 넣기]

`return`과 `console.log`가 헷갈릴 때

JavaScript에서 `return`과 `console.log`의 차이를 보여 주는 아주 짧은 예제 3개를 만들어 줘. 각 예제마다 실행 결과를 미리 말하지 말고, 내가 결과를 예상해 답하면 맞는지와 이유를 알려 줘.

🧰 관련 도구

이 강의에서 다룬 JSON·정규식·텍스트를 바로 확인하고 다듬어 볼 수 있는 도구입니다. 실제 개인정보나 비밀번호는 붙여 넣지 마세요.

참고
  • MDN Web Docs — JavaScript 안내서(Guide): 함수(Functions)
  • MDN Web Docs — 화살표 함수 표현식, return 문, 기본 매개변수 참조
  • 프로그래밍 입문 교재에서 다루는 순수 함수와 단위 테스트의 일반적 개념

학습 목표를 모두 이뤘다면 완료를 눌러 진도에 기록하세요.

💻 코딩 기초

  1. 1프로그램이란 — 일을 순서·조건·반복으로 쪼개는 생각
  2. 2값·변수·자료형 — 이름표를 붙여 값을 다루기
  3. 3조건문 — 상황에 따라 다른 길로 가기
  4. 4반복문 — 같은 일을 정확히 여러 번 시키기
  5. 5함수 — 이름 붙인 작은 기계로 나누기
  6. 6배열과 객체 — 데이터를 담고 다루기
  7. 7문자열·텍스트 처리 — 글자를 자르고 찾고 바꾸기
  8. 8디버깅과 오류 읽기 — 빨간 글씨를 단서로 바꾸기
  9. 9간단한 자동화 예제 — 표 계산과 텍스트 정리를 코드로
  10. 10AI가 짠 코드 읽고 검증하기 — 테스트·보안·라이선스·개인정보
📚 함께 읽으면 좋은 글
📊인공지능으로 표 계산 작업 돕기, 수식은 반드시 검증→ 💻인공지능 코딩 도우미 쓰는 법과 위험, 보안과 라이선스→ 💬외국어 회화 연습 상대로 인공지능 쓰는 법→ ⚙️업무 자동화 아이디어 찾기, 인공지능에 맡길 일 고르는 법→
← AI 시대 기초 학력 강의