📘 5.3.3 중첩 함수 만들기 - 함수 안의 함수
지난 시간의 기억이 아직 선명하게 남아있나요? 우리는 함께 호이스팅이라는 신기한 현상을 탐험했어요. 오늘은 정말 유용하고 아름다운 새로운 기능을 만나볼 거예요. 바로 중첩 함수라는 특별한 개념입니다.
마치 서랍장 안에 작은 서랍들이 차례로 들어있는 것처럼, 함수 안에 또 다른 함수를 넣을 수 있다는 사실을 알게 되면, 여러분도 "와, 정말 편리해!"라고 감탄하게 될 거예요.
🧠 새로운 단어들과 친해지기
중첩 함수를 배우기 전에, 그 언어들과 먼저 친숙해져보겠어요.
| 단어 | 쉬운 설명 |
|---|---|
| 중첩 함수 | 함수 안에 또 다른 함수를 넣어서 만드는 특별한 구조예요. |
| 바깥쪽 함수 | 다른 함수를 품고 있는 큰 함수를 말해요. |
| 안쪽 함수 | 바깥쪽 함수 안에 들어있는 작은 함수를 말해요. |
| 사용 범위 | 변수나 함수가 사용될 수 있는 구역을 말해요. |
'중첩(nested)'이라는 말은 "포개어 넣다"라는 뜻이에요. 마치 그릇을 포개어 보관하는 것처럼, 큰 함수 안에 작은 함수를 포개어 만든다고 해서 이런 이름이 붙었답니다.
✨ 중첩 함수가 뭔지 알아보기
중첩 함수는 자바스크립트의 매우 강력하고 유용한 특별한 기능 중 하나예요. 이 기능을 사용하면 우리 코드를 더욱 깔끔하게 정리할 수 있고, 소중한 정보들을 안전하게 보호할 수도 있어요.
중첨 함수의 가장 놀라운 특징은 안쪽 함수가 바깥쪽 함수의 변수들을 자유롭게 사용할 수 있다는 점이에요. 마치 집에 사는 아이가 거실의 TV나 냉장고의 음식을 자유롭게 사용할 수 있는 것처럼요. 하지만 반대로 바깥쪽 함수는 안쪽 함수의 개인 물건을 함부로 사용할 수 없어요.
또한 중첩 함수는 정보 보호라는 정말 중요한 역할도 해요. 밖에서는 안쪽 함수에 직접 접근할 수 없기 때문에, 중요한 정보나 기능을 안전하게 숨겨둘 수 있어요.
일상 속의 비유: 우리 집 이야기
중첩 함수를 더 친근하게 이해하기 위해 '우리 집' 이야기를 들려드릴게요.
우리 집에는 큰 거실이 하나 있고, 그 안에 여러 개의 방들이 있다고 생각해보세요. 거실에는 온 가족이 함께 사용하는 TV, 냉장고, 소파 같은 공용 물건들이 있어요. 이것들이 바로 바깥쪽 함수의 변수들과 같아요.
각각의 개인 방에서는 거실의 모든 물건을 자유롭게 사용할 수 있어요. 배가 고프면 냉장고에서 우유를 꺼내 마실 수 있고, 심심하면 거실 TV를 볼 수도 있죠. 이것이 바로 안쪽 함수가 바깥쪽 함수의 변수를 사용하는 모습이에요.
하지만 거실에 있는 가족들은 각 방 안의 개인 물건들을 함부로 가져갈 수 없어요. 그리고 집 밖의 사람들은 우리 집 안으로 직접 들어올 수 없어요. 반드시 현관문을 통해서만 들어올 수 있죠.
⚙️ 기본 사용법 배우기
중첩 함수의 기본적인 사용법은 생각보다 간단해요. 그냥 함수 안에 또 다른 함수를 만들어주기만 하면 돼요.
🔹 기본 중첩 함수 구조
function 바깥쪽함수이름() {
// 바깥쪽 함수의 변수들
let 공용물건 = "모두가 사용할 수 있어요";
// 안쪽 함수 만들기
function 안쪽함수이름() {
// 안쪽 함수는 바깥쪽 변수를 자유롭게 사용할 수 있어요!
console.log(공용물건);
}
// 안쪽 함수 부르기
안쪽함수이름();
}
// 바깥쪽 함수 부르기
바깥쪽함수이름();
🔹 중첩 함수의 특별한 규칙들
중첩 함수에는 몇 가지 중요한 규칙이 있어요.
변수 사용 규칙: 안쪽 함수는 바깥쪽 함수의 변수를 사용할 수 있지만, 바깥쪽 함수는 안쪽 함수의 변수를 사용할 수 없어요.
함수 부르기 규칙: 안쪽 함수는 밖에서 직접 부를 수 없고, 반드시 바깥쪽 함수 안에서만 부를 수 있어요.
정보 보호 규칙: 안쪽 함수의 정보는 밖으로부터 완전히 보호되어 함부로 접근할 수 없어요.
🧪 직접 해보면서 배우기
이제 재미있는 예제들을 통해 중첩 함수가 실제로 어떻게 동작하는지 차근차근 살펴보겠어요.
🔹 예제 1: 학교 체육용품실 관리하기
첫 번째 예제에서는 학교 체육용품실을 중첩 함수로 관리해보겠어요.
function sportsEquipmentRoom() {
console.log("🏫 체육용품실이 열렸습니다!");
// 용품실 안에 있는 운동용품들
let basketballs = 10; // 농구공 개수
let volleyballs = 8; // 배구공 개수
let recordBook = "체육용품 대장"; // 대장부
// 안쪽 함수 1: 용품 개수 확인하는 기능
function checkEquipment() {
console.log("📋 " + recordBook + "을 확인합니다...");
console.log("🏀 농구공: " + basketballs + "개");
console.log("🏐 배구공: " + volleyballs + "개");
}
// 안쪽 함수 2: 용품 빌려주는 기능
function lendEquipment(itemType, quantity) {
console.log("📝 " + recordBook + "에 기록합니다...");
if (itemType === "농구공" && basketballs >= quantity) {
basketballs = basketballs - quantity;
console.log("🏀 농구공 " + quantity + "개를 빌려드렸습니다!");
} else if (itemType === "배구공" && volleyballs >= quantity) {
volleyballs = volleyballs - quantity;
console.log("🏐 배구공 " + quantity + "개를 빌려드렸습니다!");
} else {
console.log("😔 죄송합니다. 요청하신 용품이 부족합니다.");
}
}
// 체육용품실 운영해보기
console.log("--- 오늘의 용품 현황 ---");
checkEquipment();
console.log("--- 3학년 1반 용품 대여 ---");
lendEquipment("농구공", 3);
console.log("--- 현재 남은 용품 확인 ---");
checkEquipment();
console.log("🏫 체육용품실을 닫습니다.");
}
// 체육용품실 운영하기
sportsEquipmentRoom();
// 밖에서 용품 개수에 직접 접근하려고 하면?
// console.log(basketballs); // 오류! 용품 정보는 용품실 안에서만 관리해요!
이 예제는 학교 체육용품실과 같아요. 용품실 안에는 소중한 운동용품들이 있고, 각각의 기능은 이 용품들을 사용해서 대여와 반납을 관리해요. 하지만 용품실 밖에서는 이 용품들에 직접 손댈 수 없답니다.
🔹 예제 2: 간단한 게임 캐릭터
두 번째 예제에서는 게임 캐릭터의 정보를 관리하는 시스템을 만들어보겠어요.
function gameCharacter() {
console.log("🎮 새로운 게임 캐릭터가 생성되었습니다!");
// 캐릭터의 기본 정보들
let characterName = "용감한 모험가";
let level = 1;
let health = 100;
let coins = 50;
// 안쪽 함수 1: 캐릭터 정보 확인하는 기능
function checkStatus() {
console.log("--- " + characterName + "의 상태 ---");
console.log("🏆 레벨: " + level);
console.log("❤️ 체력: " + health + "/100");
console.log("💰 코인: " + coins + "개");
}
// 안쪽 함수 2: 체력 회복하는 기능
function restoreHealth(amount) {
health = health + amount;
if (health > 100) health = 100; // 최대 체력 제한
console.log("❤️ 체력이 " + amount + " 회복되었습니다!");
}
// 안쪽 함수 3: 코인 획득하는 기능
function earnCoins(amount) {
coins = coins + amount;
console.log("💰 코인 " + amount + "개를 획득했습니다!");
}
// 게임 캐릭터 시스템 사용해보기
console.log("--- 초기 상태 확인 ---");
checkStatus();
console.log("--- 퀘스트 완료! ---");
earnCoins(20);
restoreHealth(10);
console.log("--- 최종 상태 확인 ---");
checkStatus();
console.log("🎮 게임 캐릭터 시스템을 종료합니다.");
}
// 게임 캐릭터 시스템 실행하기
gameCharacter();
// 밖에서 캐릭터 정보를 직접 바꾸려고 하면?
// level = 999; // 오류! 레벨은 게임 안에서만 관리되어요!
이 예제는 게임 캐릭터 시스템과 같아요. 캐릭터의 중요한 정보들은 모두 게임 시스템 안에서만 관리되고, 밖에서는 함부로 바꿀 수 없어요.
🧠 자주 하는 실수와 주의할 점
중첩 함수를 배우면서 많은 친구들이 실수하는 부분들을 미리 알아두면 더 부드러운 코딩을 할 수 있어요.
첫 번째 실수는 밖에서 안쪽 함수를 직접 부르려고 하는 것이에요.
function outerFunction() {
function innerFunction() {
console.log("안쪽 함수입니다!");
}
innerFunction(); // 여기서는 부를 수 있어요
}
outerFunction();
// innerFunction(); // 오류! 밖에서는 안쪽 함수를 직접 부를 수 없어요
두 번째 실수는 바깥쪽 함수에서 안쪽 함수의 변수를 사용하려고 하는 것이에요.
function outerFunction() {
function innerFunction() {
let innerSecret = "안쪽 비밀"; // 안쪽 함수만의 변수
console.log(innerSecret);
}
innerFunction(); // 안쪽 함수 부르기는 가능
// console.log(innerSecret); // 오류! 바깥쪽 함수는 안쪽 변수를 볼 수 없어요
}
✏️ 연습문제로 개념 다지기
이제 여러분이 직접 배운 내용을 체험해볼 시간이에요. 중첩 함수라는 아름다운 구조를 손끝으로 만들어보며, 그 깊이와 활용 가능성을 느껴보겠습니다.
Ex1) 간단한 동물원 관리 시스템
function animalZoo() {
let animals = ["사자", "코끼리", "원숭이"];
let visitorCount = 0;
function welcomeVisitor() {
visitorCount = visitorCount + 1;
console.log("환영합니다! 오늘 " + visitorCount + "번째 방문자입니다!");
}
function showAnimals() {
console.log("우리 동물원의 동물들:");
for (let i = 0; i < animals.length; i++) {
console.log("- " + animals[i]);
}
}
// 동물원 운영하기
welcomeVisitor();
showAnimals();
}
animalZoo();
Ex2) 학교 도서관 시스템
function schoolLibrary() {
let books = ["해리포터", "어린왕자", "과학교과서"];
let borrowedBooks = [];
function showBooks() {
console.log("도서관에 있는 책들:");
for (let i = 0; i < books.length; i++) {
console.log("- " + books[i]);
}
}
function borrowBook(bookName) {
borrowedBooks.push(bookName);
console.log(bookName + "을(를) 빌렸습니다!");
}
// 도서관 이용하기
showBooks();
borrowBook("해리포터");
}
schoolLibrary();
🔄 4단원 복습하기 - 반복문을 기억하고 있나요?
중첩 함수를 배웠는데, 지난 시간에 배운 반복문과 함께 사용해볼까요?
복습 문제) for문과 중첩 함수 조합하기
중첩 함수 안에서 for문을 사용해서 여러 학생의 점수를 관리해보세요.
// 해답:
function classGrades() {
let students = ["철수", "영희", "민수"];
let scores = [85, 92, 78];
function printAllGrades() {
console.log("=== 학급 성적표 ===");
for (let i = 0; i < students.length; i++) {
console.log(students[i] + ": " + scores[i] + "점");
}
}
function calculateAverage() {
let total = 0;
for (let i = 0; i < scores.length; i++) {
total = total + scores[i];
}
let average = total / scores.length;
console.log("학급 평균: " + average + "점");
}
printAllGrades();
calculateAverage();
}
classGrades();
💫 마무리하며
오늘 배운 중첩 함수는 정말 멋지고 유용한 기능이에요. 함수 안에 또 다른 함수를 넣어서 코드를 더 깔끔하게 정리하고, 중요한 정보를 안전하게 보호할 수 있어요.
가장 중요한 포인트는 안쪽 함수가 바깥쪽 함수의 변수를 사용할 수 있다는 것과, 밖에서는 안쪽 함수에 직접 접근할 수 없다는 것이에요.
중첩 함수는 마치 우리 집의 구조처럼, 각각의 공간이 자신의 역할을 하면서도 필요한 것들은 공유할 수 있게 해줘요. 여러분도 중첩 함수를 활용해서 더욱 멋진 프로그램을 만들어보세요.
다음 시간에는 더 고급 함수 기법들을 배워볼 예정이에요. 여러분의 프로그래밍 실력이 하루하루 자라나는 모습을 보며 저도 함께 기뻐하고 있어요! 계속 함께해주세요! ✨
✅ 학습 완료 체크리스트
이번 시간에 배운 내용들을 차근차근 확인해보세요!
| 학습 내용 | 이해했나요? |
|---|---|
| 중첩 함수의 기본 개념 | ✅ |
| 기본 사용법과 문법 | ✅ |
| 주요 특징과 규칙들 | ✅ |
| 자주 하는 실수들 | ✅ |
| 실전 예제 이해 | ✅ |
| 4단원 반복문 복습 | ✅ |
📂 마무리 정보
오늘 배운 5.3.3 내용이 여러분의 마음 속에 잘 자리잡았나요? 다음 시간에는 더 재미있는 내용으로 만나요!
기억할 점: 오늘 배운 내용을 꼭 연습해보시고, 궁금한 점이 있으면 언제든 다시 돌아와서 읽어보세요.
무료 JavaScript 학습 플랫폼에서 단계별 학습과 실시간 코드 실행을 통해
더욱 효과적이고 재미있게 학습하실 수 있습니다.
'5. 일을 대신해주는 도우미 (함수) > 5.3 함수의 생활공간 (함수 스코프)' 카테고리의 다른 글
| 5.3.2 호이스팅 현상 이해하기 - 미리 사용할 수 있는 신기한 특징 (0) | 2025.07.04 |
|---|---|
| 5.3.1 지역변수와 전역변수 - 우리 집과 내 방 (0) | 2025.07.04 |