📘 10.1.2 finally
- 무슨 일이 있어도 마지막에 꼭 해야 할 일
안녕하세요, 여러분. 이전 시간에 우리는 try...catch
를 통해 예상치 못한 문제들을 현명하게 처리하는 방법을 배웠습니다. 마치 준비된 학생처럼 어떤 상황에도 대응할 수 있게 되었지요.
이번 시간에는 그 여행의 마지막 퍼즐 조각, finally
에 대해 알아보겠습니다. finally
는 "무슨 일이 있어도 마지막에는 꼭 이 일만은 해야 해!"라고 조용히 말해주는 특별한 친구랍니다. 마치 하루가 끝나면 항상 양치를 하는 것처럼, 변하지 않는 습관과도 같은 존재이지요.
🧠 새로운 단어들과 친해지기
finally
와 함께 사용되는 중요한 용어들을 자연스럽게 익혀보겠습니다.
단어 | 쉬운 설명 |
---|---|
finally | try...catch 뒤에 붙여서 성공하든 실패하든 항상 실행되는 코드 부분입니다. |
마무리 작업 | 프로그램이 끝나기 전에 반드시 처리해야 하는 중요한 마무리 일들을 말합니다. |
무조건 실행 | 어떤 상황이 벌어져도 반드시 실행되는 것을 의미합니다. |
finally
는 "마지막에"라는 의미의 영어 단어에서 왔습니다. 이름 그대로, 코드의 마지막에 꼭 해야 할 일들을 담당하는 믿음직한 도우미입니다.
✨ finally
가 뭔지 알아보기
finally
는 자바스크립트에서 가장 믿을 수 있는 약속과 같습니다. 다른 코드들은 때로 예상과 다르게 동작하거나 중간에 문제를 만날 수 있지만, finally
만큼은 "나는 무슨 일이 있어도 실행될 거야!"라고 당당하게 말할 수 있어요.
try
부분에서 모든 일이 순조롭게 진행되든, catch
부분에서 문제를 해결하든, finally
는 그 모든 과정을 조용히 지켜보다가 마지막에 꼭 필요한 일들을 처리합니다. 마치 모든 수업이 끝난 후 교실을 정리하는 것처럼, 어떤 수업이었든 상관없이 항상 해야 하는 일이 있는 것과 같아요.
이런 특별한 성질 덕분에 finally
는 중요한 마무리 작업들을 맡게 됩니다. 상태를 업데이트하거나, 완료 메시지를 보여주거나, 사용했던 것들을 정리하는 등의 일들이지요.
따뜻한 비유: 하루를 마무리하는 저녁 시간
finally
를 더 쉽게 이해하기 위해 '하루를 마무리하는 저녁 시간'에 비유해볼게요.
여러분이 하루 종일 여러 가지 활동을 한다고 생각해보세요. 학교에서 공부를 열심히 했든(try
성공), 중간에 어려운 문제를 만나 선생님께 도움을 요청했든(catch
실행), 하루가 끝나면 항상 해야 하는 일들이 있습니다.
양치를 하고, 내일 준비물을 챙기고, 일기를 쓰고, 가족에게 "오늘 하루 잘 보냈어요"라고 인사하는 것들이지요. 이런 일들은 그날 무슨 일이 있었는지와 상관없이 항상 해야 하는 일들입니다.
finally
도 바로 이런 '하루 마무리 시간'과 같습니다. 코드에서 무슨 일이 벌어졌든, 마지막에는 꼭 해야 할 정리 작업들을 차근차근 처리해주는 거지요.
🎯 왜 finally
를 사용할까요?
프로그래머들이 finally
를 사용하는 이유는 여러 가지가 있습니다.
가장 중요한 이유는 중요한 작업을 절대 빠뜨리지 않기 위해서입니다. 프로그램에서는 실행 결과와 상관없이 꼭 처리해야 하는 일들이 있어요. 예를 들어, 작업이 완료되었다는 메시지를 보여주거나, 사용한 것들을 정리하는 것들이지요.
또한 코드를 더 안전하게 만들기 위해서도 사용합니다. try
부분에서 문제가 생겨 catch
로 넘어가더라도, 반드시 실행되어야 할 코드가 있을 때 finally
에 넣어두면 안전해요.
무엇보다 사용자에게 명확한 알림을 주기 위해서도 중요합니다. 작업이 성공했든 실패했든, 사용자는 "지금 무슨 일이 일어났는지" 알고 싶어 하거든요. finally
를 통해 일관된 마무리 메시지를 전달할 수 있어요.
⚙️ 기본 사용법 배우기
finally
의 기본 구조는 기존의 try...catch
뒤에 하나의 부분을 더 추가하는 형태입니다.
try {
// 도전해볼 코드
} catch (error) {
// 문제 해결 코드
} finally {
// 무조건 실행되는 마무리 코드
}
예시:
try {
console.log("작업을 시작합니다");
let result = 5 + 3;
console.log("결과: " + result);
} catch (error) {
console.log("문제가 발생했습니다");
} finally {
console.log("작업을 마무리합니다");
}
이 구조에서 가장 중요한 점은 finally
부분은 무슨 일이 있어도 실행된다는 것입니다. try
가 성공해도, catch
가 실행되어도, finally
는 반드시 마지막에 실행됩니다.
🧪 직접 해보면서 배우기
이제 실제 예시를 통해서 finally
가 어떻게 동작하는지 자세히 살펴보겠습니다.
🔹 Ex1) finally
가 항상 실행되는지 확인하기
첫 번째 예시에서는 정상적인 상황에서 finally
가 어떻게 동작하는지 관찰해보겠습니다.
// 성공적인 계산에서 finally 확인하기
function simpleCalculation() {
try {
console.log("1. 계산을 시작해요"); // 계산 시작 알림
let answer = 7 + 3; // 간단한 덧셈 계산
console.log("2. 답은 " + answer + "입니다"); // 계산 결과 출력
} catch (error) {
console.log("3. 계산에 문제가 생겼어요"); // 문제 발생 시 실행될 코드 (실행되지 않음)
} finally {
console.log("4. 계산기를 정리했어요"); // 항상 실행되는 마무리 작업
}
}
simpleCalculation(); // 함수 실행
이 과정을 단계별로 살펴보면, 먼저 try
부분에서 간단한 계산을 수행하고 결과를 출력합니다. 계산이 성공적으로 이루어졌으므로 catch
부분은 건너뛰게 되지요. 그다음 finally
부분이 실행되어 마무리 메시지를 출력합니다. 이를 통해 문제가 없어도 finally
가 실행된다는 것을 확인할 수 있어요.
🔹 Ex2) 친구에게 메시지 보내기
두 번째 예시에서는 일상적인 상황에서 finally
를 어떻게 활용하는지 알아보겠습니다.
// 친구에게 메시지를 보내는 상황
function sendMessageToFriend(friendName) {
try {
console.log(friendName + "에게 메시지를 보내고 있어요"); // 메시지 전송 시작 알림
console.log("안녕! 오늘 날씨가 정말 좋네!"); // 실제 메시지 내용
} catch (error) {
console.log("메시지 전송에 문제가 생겼어요"); // 문제 발생 시 실행될 코드 (실행되지 않음)
} finally {
console.log("메시지 전송 작업이 끝났어요"); // 항상 실행되는 완료 알림
}
}
sendMessageToFriend("수지"); // 수지에게 메시지 보내기
이 예시에서는 친구에게 메시지를 보내는 과정을 단계별로 관찰합니다. 먼저 메시지 전송을 시작한다는 알림을 보여주고, 실제 메시지 내용을 전송해요. 이 과정에서 문제가 없었으므로 catch
는 실행되지 않고, 마지막에 finally
에서 작업 완료 메시지를 보여주지요. 이렇게 사용자는 작업이 끝났다는 것을 명확히 알 수 있어요.
🔹 Ex3) 점수 계산하기
세 번째 예시에서는 학교 성적을 계산하는 상황에서 finally
를 활용해보겠습니다.
// 학교 점수를 계산하는 기능
function calculateGrade(mathScore, englishScore) {
try {
console.log("성적 계산을 시작합니다"); // 성적 계산 시작 알림
let totalScore = mathScore + englishScore; // 두 과목 점수 합계
let average = totalScore / 2; // 평균 점수 계산
console.log("평균 점수: " + average + "점"); // 평균 점수 출력
} catch (error) {
console.log("점수 계산에 오류가 발생했습니다"); // 문제 발생 시 실행될 코드 (실행되지 않음)
} finally {
console.log("성적표 처리를 완료했습니다"); // 항상 실행되는 완료 알림
}
}
calculateGrade(85, 92); // 수학 85점, 영어 92점으로 계산
이 과정을 분석해보면, 먼저 성적 계산 시작을 알리고, 두 과목의 점수를 더한 후 평균을 구합니다. 계산이 정상적으로 완료되었으므로 결과를 출력하고, finally
에서 전체 작업이 완료되었음을 알려줍니다. 이는 학생이나 학부모에게 성적 처리가 끝났다는 확실한 신호를 주는 역할을 해요.
🧚♀️ 이야기로 다시 배우기: 도서관에서의 하루
지금까지 배운 내용을 하나의 이야기로 다시 정리해볼까요?
여러분이 도서관에서 공부하는 하루를 상상해보세요.
도서관에 도착해서 조용히 공부를 시작합니다(try
부분). 때로는 모든 것이 순조롭게 진행되어 계획했던 공부를 모두 마칠 수 있어요. 하지만 가끔은 어려운 문제를 만나거나 책을 찾지 못해서 사서 선생님께 도움을 요청해야 할 때도 있지요(catch
부분).
그런데 공부가 잘 되었든, 중간에 어려움이 있었든, 도서관을 떠나기 전에는 항상 해야 하는 일들이 있습니다. 빌린 책을 제자리에 돌려놓고, 사용한 책상을 깨끗하게 정리하고, 도서관 출입증을 반납하는 것들이지요.
이런 마무리 작업들은 그날 공부가 성공적이었는지와는 전혀 상관없이 무조건 해야 하는 일들입니다. 바로 이것이 finally
의 역할입니다.
도서관의 자동 안내 시스템이 여러분이 떠나기 전에 "책 정리 완료, 책상 정리 완료, 출입증 반납 완료"라고 체크해주는 것처럼, finally
도 코드에서 꼭 필요한 마무리 작업들을 하나씩 체크해가며 처리해줍니다.
🔄 finally
실행하는 순서 정리하기
지금까지 학습한 finally
의 동작 과정을 자연스럽게 정리해보겠습니다.
첫 번째 단계는 try 부분 실행입니다. 평소처럼 계획했던 코드들이 차례대로 실행되는 과정이지요.
두 번째 단계로는 문제 발생 여부 확인 단계가 있습니다. 자바스크립트가 try 부분 실행 중에 어떤 문제가 생겼는지 자동으로 점검해요.
세 번째 단계는 catch 부분 실행(필요시) 단계입니다. 만약 문제가 발생했다면 catch 부분이 실행되어 문제를 해결하지요. 문제가 없었다면 이 단계는 건너뛰게 됩니다.
가장 중요한 네 번째 단계는 finally 부분 무조건 실행입니다. 앞의 과정이 어떻게 진행되었든 상관없이 반드시 실행되는 단계입니다.
마지막으로 가장 중요한 것은 다음 코드 계속 실행 단계에서 try...catch...finally가 모두 끝난 후 그다음 코드들이 이어서 실행됩니다.
🧠 자주 하는 실수와 주의할 점
finally
를 사용할 때 초보자들이 자주 하는 실수들을 미리 알아두면 더 안전한 코딩을 할 수 있어요.
❌ 실수 1: finally
가 선택사항이라고 생각하기
try {
console.log("중요한 작업 시작"); // 중요한 작업 시작
// 중요한 작업들...
} catch (error) {
console.log("문제 해결 중"); // 문제가 생겼을 때 해결
}
// 마무리 작업을 깜빡했어요!
이런 실수가 발생하는 이유는 finally
의 중요성을 제대로 인식하지 못했기 때문입니다. 만약 꼭 해야 하는 마무리 작업이 있다면, finally
를 사용해서 확실하게 처리해야 해요. 그렇지 않으면 중요한 정리 작업을 빠뜨릴 수 있어요.
❌ 실수 2: finally
에 너무 복잡한 코드 넣기
try {
console.log("간단한 작업"); // 간단한 작업 수행
} catch (error) {
console.log("문제 해결"); // 문제 해결
} finally {
// 이런 복잡한 코드는 finally에 적합하지 않아요!
for (let i = 0; i < 100; i++) { // 복잡한 반복 작업
console.log("복잡한 작업 " + i);
}
}
finally
는 간단하고 확실한 마무리 작업을 위한 곳입니다. 복잡한 로직이나 시간이 오래 걸리는 작업은 피하는 것이 좋아요. 마치 하루를 마무리할 때 양치는 하지만 새로운 숙제를 시작하지는 않는 것과 같아요.
❌ 실수 3: finally
에서 또 다른 문제 발생시키기
try {
console.log("작업 진행"); // 원래 작업 진행
} catch (error) {
console.log("문제 해결"); // 문제 해결
} finally {
// finally에서 새로운 문제를 만들면 안 돼요!
let problematicCode = someUndefinedFunction(); // 존재하지 않는 함수 호출 - 문제 발생!
}
finally
는 모든 것을 마무리하는 안전한 공간이어야 합니다. 여기서 새로운 문제가 발생하면 원래 처리하려던 문제까지 가려질 수 있어요. 마치 집 정리를 하다가 다른 물건을 망가뜨리는 것과 같지요.
✏️ 직접 해보기 - 연습이 필요한 순간
이제 배운 내용을 연습 문제를 통해서 확실히 익혀보겠습니다.
시간이 흘러 여러분의 손끝에서 코드가 춤을 추기 시작합니다. 한 글자 한 글자 입력할 때마다 작은 기적이 일어나는 것을 느끼실 거예요. 그 기적을 직접 만들어보세요.
Ex1) 간단한 덧셈을 하고 finally
로 마무리하는 기능을 만들어보기
// 두 숫자를 더하고 마무리 메시지를 보여주는 기능
function addTwoNumbers(first, second) {
try {
console.log("계산을 시작합니다"); // 계산 시작 알림
let result = first + second; // 두 숫자 더하기
console.log("결과: " + result); // 계산 결과 출력
} catch (error) {
console.log("계산에 문제가 생겼습니다"); // 문제 발생 시 메시지 (실행되지 않음)
} finally {
console.log("계산기를 정리했습니다"); // 항상 실행되는 마무리 메시지
}
}
addTwoNumbers(15, 25); // 15 + 25 계산하기
이 연습을 통해 finally
의 기본적인 사용법과 구조를 익힐 수 있어요.
Ex2) 친구의 이름을 출력하고 finally
로 인사를 마무리하는 기능을 만들어보기
// 친구 이름을 부르고 인사를 마무리하는 기능
function callFriend(friendName) {
try {
console.log("안녕하세요, " + friendName + "님!"); // 친구에게 인사
console.log("오늘 하루 어떠셨나요?"); // 안부 인사
} catch (error) {
console.log("인사에 문제가 생겼습니다"); // 문제 발생 시 메시지 (실행되지 않음)
} finally {
console.log("인사를 마쳤습니다"); // 항상 실행되는 인사 마무리 메시지
}
}
callFriend("민수"); // 민수에게 인사하기
이 문제는 finally
를 일상적인 상황에서 어떻게 활용하는지 연습하는 데 도움이 됩니다.
Ex3) 좋아하는 과목의 점수를 출력하고 finally
로 마무리하는 기능을 만들어보기
// 과목 점수를 확인하고 마무리하는 기능
function checkSubjectScore(subject, score) {
try {
console.log(subject + " 과목 점수: " + score + "점"); // 과목과 점수 출력
console.log("좋은 성적이네요!"); // 격려 메시지
} catch (error) {
console.log("점수 확인에 문제가 생겼습니다"); // 문제 발생 시 메시지 (실행되지 않음)
} finally {
console.log("성적 확인을 완료했습니다"); // 항상 실행되는 완료 메시지
}
}
checkSubjectScore("수학", 95); // 수학 과목 95점 확인하기
이 연습문제를 통해 finally
를 학교 생활과 연관된 상황에서 사용하는 방법을 익힐 수 있어요.
🤔 조금 더 어려운 문제로 실력 확인하기
기본 연습을 마쳤다면, 이제 조금 더 깊이 있는 문제들을 통해 finally
에 대한 이해를 확인해보겠습니다.
Q1. 다음 코드의 실행 순서를 예상하고 그 이유를 설명해 보세요.
try {
console.log("A");
console.log("B");
} catch (error) {
console.log("C");
} finally {
console.log("D");
}
console.log("E");
정답: "A", "B", "D", "E" 순서로 출력됩니다.
해설: try 부분이 성공적으로 실행되므로 "A"와 "B"가 먼저 출력됩니다. 문제가 발생하지 않았으므로 catch 부분("C")은 건너뛰게 되지요. 하지만 finally 부분은 무조건 실행되므로 "D"가 출력되고, 마지막으로 try...catch...finally 구문 다음의 코드인 "E"가 실행됩니다.
Q2. finally
를 사용하는 가장 좋은 이유는 무엇일까요?
정답: 문제 발생 여부와 상관없이 꼭 실행되어야 하는 중요한 마무리 작업을 확실히 하기 위해서입니다.
해설: finally
의 가장 큰 장점은 "무조건 실행"입니다. 프로그램에서는 성공했든 실패했든 반드시 처리해야 하는 작업들이 있어요. 예를 들어, 사용한 것들을 정리하거나, 완료 메시지를 보여주거나, 상태를 업데이트하는 것들이지요. 이런 중요한 작업들을 finally
에 넣어두면 절대 빠뜨리지 않고 처리할 수 있어요.
🔄 9단원 복습 - this와 친해지기
잠깐! 이전에 배운 내용을 다시 한번 복습해볼까요? 9단원에서 배운 this
에 대해 간단한 문제로 기억을 되살려보겠습니다.
복습 문제 1: 객체에서 this 사용하기
// 학생 정보를 담은 객체를 만들어보세요
let student = {
name: "철수",
age: 10,
introduce: function() {
console.log("안녕하세요, 저는 " + this.name + "이고 " + this.age + "살입니다.");
}
};
student.introduce(); // 실행해보세요!
해답과 설명:
this.name
은student.name
인 "철수"를 가리켜요this.age
는student.age
인 10을 가리켜요- 객체의 메서드에서
this
는 그 객체 자신을 뜻해요 - 결과: "안녕하세요, 저는 철수이고 10살입니다."가 출력됩니다
복습 문제 2: this가 가리키는 것 맞추기
// 다음 코드의 결과를 예상해보세요
let car = {
brand: "현대",
model: "아반떼",
showInfo: function() {
console.log("이 차는 " + this.brand + " " + this.model + "입니다.");
}
};
car.showInfo(); // 이 결과는 무엇일까요?
해답과 설명:
car
객체의showInfo
메서드에서this
는car
객체를 가리켜요this.brand
는 "현대",this.model
은 "아반떼"가 됩니다- 결과: "이 차는 현대 아반떼입니다."가 출력됩니다
지금까지 finally
의 모든 특성과 활용법을 따뜻한 이야기와 함께 알아보았습니다. finally
는 우리의 코드에 마지막 안전장치를 제공하는 믿음직한 친구입니다. 다음 시간에는 이런 문제 처리 기법들을 실제 상황에서 어떻게 활용하는지 더 자세히 배워보겠습니다!
✅ 학습 완료 체크리스트
이번 시간에 배운 내용들을 모두 이해했는지 확인해보세요!
학습 내용 | 이해했나요? |
---|---|
finally의 기본 개념 | ✅ |
기본 사용법과 문법 | ✅ |
주요 특징과 차이점 | ✅ |
자주 하는 실수들 | ✅ |
실전 예제 이해 | ✅ |
🎯 추가 연습 문제들
조금 더 연습하고 싶은 분들을 위한 추가 문제들입니다!
추가 문제 1. try, catch, finally가 모두 포함된 함수를 만들어보세요.
// 답:
function testAllBlocks() {
try {
console.log("작업 시작");
let result = 10 + 5;
console.log("결과: " + result);
} catch (error) {
console.log("에러 발생");
} finally {
console.log("정리 작업 완료");
}
}
testAllBlocks();
추가 문제 2. 간단한 인사말 함수에 finally를 추가해보세요.
// 답:
function greetUser(name) {
try {
console.log("안녕하세요 " + name + "님!");
} catch (error) {
console.log("인사 실패");
} finally {
console.log("인사 완료");
}
}
greetUser("영희");
추가 문제 3. 숫자 더하기 함수에 finally를 추가해보세요.
// 답:
function addNumbers(a, b) {
try {
let sum = a + b;
console.log("합계: " + sum);
} catch (error) {
console.log("계산 실패");
} finally {
console.log("계산 종료");
}
}
addNumbers(3, 7);
추가 문제 4. 다음 코드의 실행 순서를 예상해보고, 그 이유를 설명해보세요.
try {
console.log("A");
console.log("B");
} catch (error) {
console.log("C");
} finally {
console.log("D");
}
console.log("E");
답: "A", "B", "D", "E"가 순서대로 출력됩니다. try 블록이 성공적으로 실행되므로 catch는 건너뛰고, finally는 항상 실행되며, 마지막에 try...catch...finally 다음 코드가 실행됩니다.
추가 문제 5. 다음 중 finally의 올바른 사용 목적은 무엇일까요?
// A - 에러 처리
finally { console.log("에러가 발생했습니다"); }
// B - 정리 작업
finally { console.log("작업을 마쳤습니다"); }
답: B번이 올바른 사용 목적입니다. finally는 에러 처리가 아니라 에러 발생 여부와 관계없이 꼭 해야 할 정리 작업을 위한 것입니다.
📂 마무리 정보
오늘 배운 10.1.2
내용이 여러분의 자바스크립트 지식 상자에 잘 저장되었나요? 다음 시간에는 더 흥미로운 내용으로 만나요!
기억할 점: 오늘 배운 내용을 꼭 연습해보시고, 궁금한 점이 있으면 언제든 다시 돌아와서 읽어보세요.
무료 JavaScript 학습 플랫폼에서 단계별 학습과 실시간 코드 실행을 통해
더욱 효과적이고 재미있게 학습하실 수 있습니다.
'10. 오류와 친구하기 (에러 처리와 디버깅) > 10.1 에러 처리하기' 카테고리의 다른 글
10.1.3 에러 정보 - 문제를 자세히 알려주는 친절한 안내서 (0) | 2025.07.14 |
---|---|
10.1.1 try...catch로 문제 잡기 - 안전망이 있는 코딩 모험 (0) | 2025.07.13 |