본문 바로가기
AppSheet

구글 앱스크립트 4차시 - 함수와 매개변수

by 에버리치60 2025. 12. 20.

구글 앱스크립트 4차시 - 함수와 매개변수

4차시: 함수와 매개변수 활용하기

재사용 가능한 코드 만들기 - 함수의 모든 것

📚 학습 목표
  • 함수의 개념과 필요성 이해하기
  • 매개변수(파라미터)와 반환값(return) 활용하기
  • 여러 개의 함수를 조합하여 프로그램 만들기
  • 실전 예제: 성적 관리 시스템 함수로 구조화하기

📖 함수란 무엇인가?

1 함수의 개념 이해하기
함수는 특정 작업을 수행하는 코드 블록입니다. 마치 "레시피"처럼 한 번 만들어두면 필요할 때마다 불러서 사용할 수 있습니다.
함수의 장점:
재사용성: 같은 코드를 반복해서 작성할 필요 없음
유지보수: 한 곳만 수정하면 전체에 적용됨
가독성: 코드의 의도가 명확해짐
모듈화: 큰 프로그램을 작은 단위로 나눌 수 있음

🚀 실습 1: 기본 함수 만들기

2 매개변수가 없는 함수
가장 기본적인 형태의 함수부터 시작해봅시다:
function 인사하기() {
  Logger.log("안녕하세요!");
  Logger.log("구글 앱스크립트를 공부하고 있습니다.");
}

function 현재시간알림() {
  let 지금 = new Date();
  let 시간문자열 = Utilities.formatDate(지금, "Asia/Seoul", "yyyy-MM-dd HH:mm:ss");
  
  Logger.log("현재 시간: " + 시간문자열);
  SpreadsheetApp.getActiveSpreadsheet().toast(시간문자열, "현재 시간", 3);
}

// 함수 호출
function 테스트() {
  인사하기();
  현재시간알림();
}
테스트() 함수를 실행해보세요. 다른 함수들이 차례로 실행됩니다.
3 매개변수가 있는 함수
함수에 값을 전달하여 다양한 결과를 만들 수 있습니다:
function 개인화된인사(이름) {
  Logger.log("안녕하세요, " + 이름 + "님!");
}

function 제곱계산(숫자) {
  let 결과 = 숫자 * 숫자;
  Logger.log(숫자 + "의 제곱은 " + 결과 + "입니다.");
}

function 원의넓이(반지름) {
  let 넓이 = 3.14 * 반지름 * 반지름;
  Logger.log("반지름 " + 반지름 + "인 원의 넓이: " + 넓이);
}

// 여러 값으로 함수 호출
function 매개변수테스트() {
  개인화된인사("홍길동");
  개인화된인사("김철수");
  
  제곱계산(5);
  제곱계산(10);
  
  원의넓이(3);
  원의넓이(7);
}
매개변수테스트() 함수를 실행하고 결과를 확인하세요.
4 여러 개의 매개변수 사용하기
함수는 여러 개의 매개변수를 받을 수 있습니다:
function 덧셈(a, b) {
  let 합 = a + b;
  Logger.log(a + " + " + b + " = " + 합);
}

function 직사각형넓이(가로, 세로) {
  let 넓이 = 가로 * 세로;
  Logger.log("가로 " + 가로 + ", 세로 " + 세로 + " → 넓이: " + 넓이);
}

function BMI계산(이름, 키, 몸무게) {
  let 키미터 = 키 / 100;
  let bmi = 몸무게 / (키미터 * 키미터);
  let bmi반올림 = Math.round(bmi * 10) / 10;
  
  Logger.log(이름 + "님의 BMI: " + bmi반올림);
  
  if (bmi < 18.5) {
    Logger.log("저체중입니다.");
  } else if (bmi < 23) {
    Logger.log("정상입니다.");
  } else if (bmi < 25) {
    Logger.log("과체중입니다.");
  } else {
    Logger.log("비만입니다.");
  }
}

function 여러매개변수테스트() {
  덧셈(10, 20);
  덧셈(100, 250);
  
  직사각형넓이(5, 8);
  직사각형넓이(12, 15);
  
  BMI계산("홍길동", 175, 70);
  BMI계산("김철수", 168, 75);
}
실행하고 다양한 결과를 확인하세요.

↩️ 반환값(return) 활용하기

5 return으로 값 돌려주기
함수는 계산 결과를 반환(return)할 수 있습니다:
function 더하기(a, b) {
  return a + b;
}

function 곱하기(a, b) {
  return a * b;
}

function 평균구하기(숫자배열) {
  let 합계 = 0;
  for (let i = 0; i < 숫자배열.length; i++) {
    합계 += 숫자배열[i];
  }
  return 합계 / 숫자배열.length;
}

function 등급계산(점수) {
  if (점수 >= 90) return "A";
  else if (점수 >= 80) return "B";
  else if (점수 >= 70) return "C";
  else if (점수 >= 60) return "D";
  else return "F";
}

// 반환값을 활용한 계산
function 반환값테스트() {
  let 결과1 = 더하기(10, 20);
  Logger.log("10 + 20 = " + 결과1);
  
  let 결과2 = 곱하기(5, 8);
  Logger.log("5 × 8 = " + 결과2);
  
  // 함수 결과를 바로 다른 함수에 전달
  let 최종결과 = 더하기(곱하기(3, 4), 더하기(5, 6));
  Logger.log("(3×4) + (5+6) = " + 최종결과);
  
  let 점수들 = [85, 90, 78, 92, 88];
  let 평균 = 평균구하기(점수들);
  Logger.log("평균: " + 평균);
  Logger.log("등급: " + 등급계산(평균));
}
실행하고 반환값이 어떻게 활용되는지 확인하세요.

🎯 실습 2: 성적 관리 시스템 함수로 구조화하기

6 성적 데이터 준비 함수
각 기능을 함수로 분리하여 체계적으로 관리합니다:
// 1. 시트 초기화 함수
function 시트초기화() {
  let sheet = SpreadsheetApp.getActiveSheet();
  sheet.clear();
  return sheet;
}

// 2. 제목 행 작성 함수
function 제목행작성(sheet) {
  let 제목들 = ["번호", "이름", "국어", "영어", "수학", "총점", "평균", "등급"];
  for (let i = 0; i < 제목들.length; i++) {
    sheet.getRange(1, i + 1).setValue(제목들[i]);
    sheet.getRange(1, i + 1).setBackground("#4285f4");
    sheet.getRange(1, i + 1).setFontColor("#ffffff");
    sheet.getRange(1, i + 1).setFontWeight("bold");
  }
}

// 3. 학생 데이터 입력 함수
function 학생데이터입력(sheet) {
  let 학생들 = [
    [1, "김민수", 85, 90, 88],
    [2, "이지은", 92, 87, 95],
    [3, "박준호", 78, 82, 80],
    [4, "최유진", 95, 93, 91],
    [5, "정하늘", 88, 85, 89]
  ];
  
  for (let i = 0; i < 학생들.length; i++) {
    let 행 = i + 2;
    let 학생 = 학생들[i];
    
    for (let j = 0; j < 5; j++) {
      sheet.getRange(행, j + 1).setValue(학생[j]);
    }
  }
  
  return 학생들.length; // 학생 수 반환
}

// 메인 함수
function 성적표생성() {
  let sheet = 시트초기화();
  제목행작성(sheet);
  let 학생수 = 학생데이터입력(sheet);
  
  SpreadsheetApp.getActiveSpreadsheet().toast(
    학생수 + "명의 학생 데이터 입력 완료!", 
    "완료", 
    3
  );
}
성적표생성() 함수를 실행하여 기본 데이터를 입력하세요.
7 성적 계산 함수들
총점, 평균, 등급을 계산하는 함수를 만듭니다:
// 총점 계산 함수
function 총점계산(국어, 영어, 수학) {
  return 국어 + 영어 + 수학;
}

// 평균 계산 함수
function 평균계산(총점, 과목수) {
  return Math.round((총점 / 과목수) * 10) / 10;
}

// 등급 계산 함수
function 등급계산(평균) {
  if (평균 >= 90) return "A";
  else if (평균 >= 80) return "B";
  else if (평균 >= 70) return "C";
  else if (평균 >= 60) return "D";
  else return "F";
}

// 배경색 설정 함수
function 등급배경색(sheet, 행, 등급) {
  if (등급 === "A") {
    sheet.getRange(행, 8).setBackground("#c8e6c9"); // 녹색
  } else if (등급 === "B") {
    sheet.getRange(행, 8).setBackground("#b3e5fc"); // 파란색
  } else if (등급 === "C") {
    sheet.getRange(행, 8).setBackground("#fff9c4"); // 노란색
  } else {
    sheet.getRange(행, 8).setBackground("#ffcdd2"); // 빨간색
  }
}

// 전체 성적 계산 함수
function 성적계산하기() {
  let sheet = SpreadsheetApp.getActiveSheet();
  
  // 2행부터 6행까지 (학생 5명)
  for (let row = 2; row <= 6; row++) {
    let 국어 = sheet.getRange(row, 3).getValue();
    let 영어 = sheet.getRange(row, 4).getValue();
    let 수학 = sheet.getRange(row, 5).getValue();
    
    // 함수 호출로 계산
    let 총점 = 총점계산(국어, 영어, 수학);
    let 평균 = 평균계산(총점, 3);
    let 등급 = 등급계산(평균);
    
    // 결과 입력
    sheet.getRange(row, 6).setValue(총점);
    sheet.getRange(row, 7).setValue(평균);
    sheet.getRange(row, 8).setValue(등급);
    
    // 등급별 배경색
    등급배경색(sheet, row, 등급);
  }
  
  SpreadsheetApp.getActiveSpreadsheet().toast("성적 계산 완료!", "완료", 3);
}
성적계산하기() 함수를 실행하여 총점, 평균, 등급을 계산하세요.
8 통계 분석 함수
전체 학생의 통계를 계산하는 함수를 만듭니다:
// 최고점 찾기 함수
function 최고점찾기(점수배열) {
  let 최고점 = 점수배열[0];
  for (let i = 1; i < 점수배열.length; i++) {
    if (점수배열[i] > 최고점) {
      최고점 = 점수배열[i];
    }
  }
  return 최고점;
}

// 최저점 찾기 함수
function 최저점찾기(점수배열) {
  let 최저점 = 점수배열[0];
  for (let i = 1; i < 점수배열.length; i++) {
    if (점수배열[i] < 최저점) {
      최저점 = 점수배열[i];
    }
  }
  return 최저점;
}

// 통계 분석 함수
function 통계분석() {
  let sheet = SpreadsheetApp.getActiveSheet();
  let 평균들 = [];
  let 총점들 = [];
  
  // 데이터 수집
  for (let row = 2; row <= 6; row++) {
    let 평균 = sheet.getRange(row, 7).getValue();
    let 총점 = sheet.getRange(row, 6).getValue();
    평균들.push(평균);
    총점들.push(총점);
  }
  
  // 통계 계산
  let 전체평균 = 평균계산(평균들.reduce((a, b) => a + b, 0), 평균들.length);
  let 최고평균 = 최고점찾기(평균들);
  let 최저평균 = 최저점찾기(평균들);
  let 최고총점 = 최고점찾기(총점들);
  let 최저총점 = 최저점찾기(총점들);
  
  // 통계 표시
  let 통계메시지 = "=== 반 전체 통계 ===\n";
  통계메시지 += "전체 평균: " + 전체평균 + "점\n";
  통계메시지 += "최고 평균: " + 최고평균 + "점\n";
  통계메시지 += "최저 평균: " + 최저평균 + "점\n";
  통계메시지 += "최고 총점: " + 최고총점 + "점\n";
  통계메시지 += "최저 총점: " + 최저총점 + "점";
  
  Logger.log(통계메시지);
  SpreadsheetApp.getUi().alert("통계 분석", 통계메시지, SpreadsheetApp.getUi().ButtonSet.OK);
}
통계분석() 함수를 실행하여 반 전체의 통계를 확인하세요.
💡 함수 작성 팁
  • 한 가지 일만: 각 함수는 하나의 명확한 역할만 수행하도록 작성
  • 의미있는 이름: 함수명만 봐도 무엇을 하는지 알 수 있게 작성
  • 매개변수 최소화: 너무 많은 매개변수는 사용하기 어려움 (3~4개 이하 권장)
  • 반환값 활용: 계산 결과는 return으로 돌려주어 재사용성 높이기
⚠️ 주의사항
  • 함수명은 동사로 시작하면 이해하기 쉽습니다 (계산하기, 입력하기, 찾기 등)
  • return 문 이후의 코드는 실행되지 않습니다
  • 매개변수 개수와 순서를 정확히 맞춰서 함수를 호출하세요
  • 함수 안에서 선언한 변수(지역 변수)는 함수 밖에서 사용할 수 없습니다
🎯 4차시 정리
이번 시간에는 함수의 개념과 매개변수, 반환값을 배우고, 성적 관리 시스템을 함수로 구조화했습니다.
함수를 잘 활용하면 코드의 재사용성과 가독성이 크게 향상됩니다.
다음 차시에서는 스프레드시트의 범위(Range)를 다루는 고급 기능을 배워보겠습니다.