안녕하세요, 코딩하는곰입니다! 오늘은 JavaScript 개발에서 가장 기본적이면서도 중요한 조건문에 대해 깊이 있게 알아보겠습니다. if문과 switch문은 프로그래밍의 핵심인 의사결정을 담당하는 요소로, 이들을 올바르게 이해하고 사용하는 것은 효율적인 코드 작성의 첫걸음입니다. 20년의 JavaScript 개발 경험을 바탕으로 두 조건문의细微한 차이점부터 실전 활용 팁까지 상세히 설명드리겠습니다.
if문은 JavaScript에서 가장 기본적이고 널리 사용되는 조건문입니다. 단순한 조건 검사부터 복잡한 논리 연산까지 다양한 상황에서 활용됩니다.
if문의 가장 기본적인 형태는 다음과 같습니다:
if (condition) {// 조건이 true일 때 실행할 코드}
조건(condition) 부분에는 Boolean 값으로 평가될 수 있는 어떤 표현식이든 사용할 수 있습니다. 이 표현식의 결과가 true이면 중괄호 안의 코드 블록이 실행됩니다.
let score = 85;let grade;if (score >= 90) {grade = 'A';} else {grade = 'B';}console.log(grade); // 'B'
let temperature = 25;let clothing;if (temperature > 30) {clothing = '반팔';} else if (temperature > 20) {clothing = '긴팔';} else if (temperature > 10) {clothing = '자켓';} else {clothing = '코트';}console.log(clothing); // '긴팔'
let age = 25;let hasLicense = true;if (age >= 18) {if (hasLicense) {console.log('운전 가능합니다');} else {console.log('면허증이 필요합니다');}} else {console.log('미성년자는 운전할 수 없습니다');}
조건문의 힘은 다양한 연산자를 활용할 때 발휘됩니다: 비교 연산자:
// 동등 연산자if (x == 5) { /* 코드 */ }// 일치 연산자 (타입까지 검사)if (x === 5) { /* 코드 */ }// 부등 연산자if (x != 5) { /* 코드 */ }// 불일치 연산자if (x !== 5) { /* 코드 */ }// 대소 비교if (x > 5) { /* 코드 */ }if (x < 5) { /* 코드 */ }if (x >= 5) { /* 코드 */ }if (x <= 5) { /* 코드 */ }
논리 연산자:
// AND 연산자if (age >= 18 && hasLicense) {console.log('운전 가능');}// OR 연산자if (age < 6 || age >= 65) {console.log('무료 입장');}// NOT 연산자if (!isLoggedIn) {console.log('로그인이 필요합니다');}
let name = '';if (name) {console.log('이름:', name);} else {console.log('이름을 입력해주세요');}let items = [];if (items.length) {console.log('아이템 개수:', items.length);} else {console.log('아이템이 없습니다');}
// 사용자 이름이 있으면 환영 메시지 출력let userName = '곰';userName && console.log(`환영합니다, ${userName}님!`);// 기본값 설정let config = null;let defaultConfig = { theme: 'dark' };let finalConfig = config || defaultConfig;
function divide(a, b) {if (b === 0) {throw new Error('0으로 나눌 수 없습니다');}if (typeof a !== 'number' || typeof b !== 'number') {throw new Error('숫자만 입력 가능합니다');}return a / b;}
📚 코딩 지식을 쌓고 싶다면, Vue.js v-bind 완벽 가이드 클래스, 스타일, id 속성 바인딩 마스터하기를 참고해보세요.
switch문은 하나의 표현식을 평가하고 그 결과에 따라 여러 경우(case) 중 하나를 실행하는 조건문입니다. 특히 동일한 변수를 여러 값과 비교해야 할 때 if-else 체인보다 훨씬 읽기 쉽고 구조화된 코드를 작성할 수 있습니다.
switch (expression) {case value1:// expression이 value1과 일치할 때 실행break;case value2:// expression이 value2와 일치할 때 실행break;default:// 어떤 case와도 일치하지 않을 때 실행}
요일별 다른 메시지 출력:
let day = '월요일';let message;switch (day) {case '월요일':message = '새로운 한주 시작! 화이팅!';break;case '화요일':case '수요일':case '목요일':message = '꾸준히 화이팅!';break;case '금요일':message = '불금! 주말이 코앞이에요!';break;case '토요일':case '일요일':message = '즐거운 주말 되세요!';break;default:message = '유효한 요일이 아닙니다';}console.log(message);
사용자 역할에 따른 권한 부여:
let userRole = 'editor';let permissions = [];switch (userRole) {case 'admin':permissions.push('delete', 'edit', 'create', 'view');break;case 'editor':permissions.push('edit', 'create', 'view');break;case 'author':permissions.push('create', 'view');break;case 'subscriber':permissions.push('view');break;default:permissions.push('view');}console.log('권한:', permissions);
폴스루는 break문을 생략하여 의도적으로 여러 case를 연속으로 실행하는 기법입니다:
let score = 85;let grade = '';switch (true) {case score >= 90:grade = 'A';break;case score >= 80:grade = 'B';break;case score >= 70:grade = 'C';break;case score >= 60:grade = 'D';break;default:grade = 'F';}console.log(`점수: ${score}, 등급: ${grade}`);
의도적인 폴스루 활용:
let month = 2;let season;switch (month) {case 12:case 1:case 2:season = '겨울';break;case 3:case 4:case 5:season = '봄';break;case 6:case 7:case 8:season = '여름';break;case 9:case 10:case 11:season = '가을';break;default:season = '알 수 없음';}console.log(`${month}월은 ${season}입니다`);
switch문은 일치 비교(===)를 사용한다는 점을 기억해야 합니다:
let value = '1';switch (value) {case 1: // 이 case는 실행되지 않음 ( '1' === 1 → false )console.log('숫자 1');break;case '1': // 이 case가 실행됨console.log('문자열 1');break;default:console.log('기타');}// 출력: "문자열 1"
let age = 25;let hasCar = true;// switch문으로는 이런 복합 조건을 처리하기 어려움if (age >= 18 && hasCar) {console.log('운전 가능');}// switch(true) 패턴으로 우회할 수는 있지만 가독성이 떨어짐switch (true) {case age >= 18 && hasCar:console.log('운전 가능');break;default:console.log('운전 불가');}
let action = 'create';switch (action) {case 'create':let result = '생성 완료'; // 같은 블록 스코프를 공유console.log(result);break;case 'update':// let result = '수정 완료'; // SyntaxError: 이미 선언됨let updateResult = '수정 완료'; // 이렇게 다른 이름 사용console.log(updateResult);break;}
로또 번호를 더 스마트하게 선택하고 싶다면, AI 분석 기반 번호 추천 앱 지니로또AI를 활용해보는 것이 좋습니다.
이제 두 조건문의 특징을 자세히 알아봤으니, 언제 어떤 것을 사용해야 하는지 구체적인 가이드라인을 제시해 드리겠습니다.
성능 측면에서는 일반적으로 switch문이 if-else 체인보다 약간 빠른 경우가 많습니다. 하지만 이 차이는 미미하며, 대부분의 경우 가독성과 유지보수성이 더 중요합니다.
// if-else 체인function getDayTypeIf(day) {if (day === '월요일') return '주중';else if (day === '화요일') return '주중';else if (day === '수요일') return '주중';else if (day === '목요일') return '주중';else if (day === '금요일') return '주중';else if (day === '토요일') return '주말';else if (day === '일요일') return '주말';else return '알 수 없음';}// switch문function getDayTypeSwitch(day) {switch (day) {case '월요일':case '화요일':case '수요일':case '목요일':case '금요일':return '주중';case '토요일':case '일요일':return '주말';default:return '알 수 없음';}}
if문을 선택해야 할 때:
// if문이 더 적합한 예시if (age >= 18 && hasLicense && !isDrunk) {console.log('운전 가능');}if (temperature > 30 || humidity > 80) {console.log('에어컨 켜기');}
switch문을 선택해야 할 때:
// switch문이 더 적합한 예시switch (userStatus) {case 'active':showActiveFeatures();break;case 'inactive':showReactivatePrompt();break;case 'suspended':showSuspensionInfo();break;case 'banned':showBanNotice();break;default:showError();}
1. 상태 관리 시스템
class OrderManager {processOrder(action, orderId) {switch (action) {case 'create':this.createOrder(orderId);break;case 'update':this.updateOrder(orderId);break;case 'cancel':this.cancelOrder(orderId);break;case 'refund':this.processRefund(orderId);break;default:console.error('Unknown action:', action);}}createOrder(id) {console.log(`주문 생성: ${id}`);// 주문 생성 로직}updateOrder(id) {console.log(`주문 수정: ${id}`);// 주문 수정 로직}cancelOrder(id) {console.log(`주문 취소: ${id}`);// 주문 취소 로직}processRefund(id) {console.log(`환불 처리: ${id}`);// 환불 처리 로직}}
2. UI 컴포넌트에서의 조건부 렌더링
function UserProfile({ user, isLoading, error }) {if (error) {return <ErrorScreen message={error.message} />;}if (isLoading) {return <LoadingSpinner />;}switch (user.role) {case 'admin':return <AdminProfile user={user} />;case 'moderator':return <ModeratorProfile user={user} />;case 'user':return <UserProfile user={user} />;default:return <GuestProfile />;}}
3. 입력 유효성 검사
function validateInput(field, value) {switch (field) {case 'email':if (!value.includes('@')) {return '유효한 이메일 주소를 입력해주세요';}break;case 'password':if (value.length < 8) {return '비밀번호는 8자 이상이어야 합니다';}if (!/(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/.test(value)) {return '비밀번호는 대문자, 소문자, 숫자를 포함해야 합니다';}break;case 'phone':if (!/^\d{10,11}$/.test(value)) {return '유효한 전화번호를 입력해주세요';}break;default:return '';}return '';}
1. 객체 리터럴을 이용한 조건문 대체
// switch문 대신 객체를 사용하는 패턴const statusActions = {pending: (order) => notifyPending(order),processing: (order) => processPayment(order),shipped: (order) => sendTracking(order),delivered: (order) => requestReview(order),cancelled: (order) => processRefund(order)};function handleOrderStatus(order) {const action = statusActions[order.status];if (action) {return action(order);}return handleUnknownStatus(order);}
2- 조건부 연산자 (삼항 연산자)
// 간단한 조건은 삼항 연산자가 깔끔함const message = isLoggedIn? `환영합니다, ${userName}님!`: '로그인이 필요합니다';const discount = isMember? orderTotal * 0.1: orderTotal * 0.05;// 중첩 삼항 연산자 (주의: 가독성이 떨어질 수 있음)const grade = score >= 90 ? 'A' :score >= 80 ? 'B' :score >= 70 ? 'C' :score >= 60 ? 'D' : 'F';
3. 조기 반환 패턴
// 나쁜 예: 중첩된 if문function processUser(user) {if (user) {if (user.isActive) {if (user.hasSubscription) {// 실제 로직return '프리미엄 서비스';} else {return '기본 서비스';}} else {return '비활성 유저';}} else {return '유저 없음';}}// 좋은 예: 조기 반환function processUser(user) {if (!user) return '유저 없음';if (!user.isActive) return '비활성 유저';if (!user.hasSubscription) return '기본 서비스';// 실제 로직return '프리미엄 서비스';}
로또 번호를 QR코드로 빠르게 확인하고 싶다면, AI 기반 로또 번호 추천 앱 지니로또AI를 다운로드해보세요.
조건문은 단순히 코드를 분기하는 도구를 넘어, 우리의 사고방식을 코드에 반영하는 중요한 수단입니다. 오늘 살펴본 내용을 바탕으로 여러분의 코드에서 조건문을 더 효과적으로 활용할 수 있는 몇 가지 핵심 원칙을 정리해 드립니다: 기억해야 할 핵심 포인트:
비밀번호를 직접 만들기 어렵다면, 웹 기반 비밀번호 생성 도구를 활용해보세요.
