2. 계산하고 비교하기 (연산자)/2.3 논리적으로 생각하기 (논리 연산자)

2.3.3 `!` - 참을 거짓으로, 거짓을 참으로 바꾸는 거울 검사관

thejavascript4kids 2025. 6. 29. 07:27

📘 2.3.3 ! - 참을 거짓으로, 거짓을 참으로 바꾸는 거울 검사관

안녕하세요, 여러분. 지금까지 && 까다로운 검사관과 || 친절한 검사관을 만났었죠? 오늘은 정말 신기한 친구를 만나러 갈 거예요. 바로 ! 거울 검사관이랍니다.

이 친구는 마치 거울처럼 모든 것을 정반대로 바꿔주는 신기한 능력을 가지고 있어요. 참을 거짓으로, 거짓을 참으로 만드는 특별한 일을 해요. 정말 신기하죠?

여러분, 놀이공원에서 거울의 집에 가본 적 있나요? 키가 크게 보이기도 하고 작게 보이기도 하는 신기한 거울들이 있잖아요? ! 검사관이 바로 그런 거울을 가지고 있는데, 이 거울은 "참/거짓"을 반대로 보여준답니다.

🧠 새로운 단어들과 친해지기

우리가 만날 새로운 친구에 대해 쉽게 알아보아요. 마치 새로운 놀이 친구의 특별한 능력을 소개받는 것처럼요.

단어 쉬운 설명
거울 검사관 (!) 참을 거짓으로, 거짓을 참으로 바꿔주는 신기한 검사관이에요
뒤바뀜 기능 논리값을 완전히 정반대로 바꿔주는 기능이에요
참/거짓 변환 다른 종류의 값들을 참 또는 거짓으로 바꿔주는 기능이에요
두 번 거울 기능 (!!) 거울을 두 번 사용해서 "진짜로 있는지 없는지"를 명확하게 알아내는 특별한 기능이에요

이런 단어들은 우리가 컴퓨터와 "반대 상황"에 대해 대화할 때 정말 유용한 도구들이에요.

! 거울 검사관을 만나보기

자, 이제 우리의 주인공 ! 거울 검사관을 제대로 만나볼까요? 이 친구는 자바스크립트에서 "아니야", "반대야", "~하지 않아"를 표현하는 특별한 검사관이에요.

이 검사관의 가장 큰 특징은 혼자서도 일할 수 있다는 거예요. &&|| 친구들은 두 개의 조건이 필요했지만, ! 검사관은 하나의 값만 받아서 그것의 반대를 만들어내요.

일상생활에서 우리가 "가 아니야", "하지 않아" 같은 말을 하는 것과 정확히 같은 일을 해요. 예를 들어 "오늘은 비가 오지 않아"는 !isRaining으로, "로그인하지 않았어"는 !isLoggedIn으로 표현할 수 있어요.

! 거울 검사관은 단순히 참/거짓만 바꾸는 게 아니에요. 모든 값을 참/거짓으로 바꾼 후에 거꾸로 뒤집어주는 똑똑한 기능을 가지고 있어요. 예를 들어 !"안녕"은 먼저 "안녕"을 으로 바꾸고, 그 다음에 거짓으로 뒤집어줘요.

특히 두 번 거울 기능 (!!)은 정말 신기한 기술이에요. 어떤 값이든 명확한 또는 거짓으로 바꿀 수 있어서, 애매한 것들을 확실하게 만들어줘요.

재미있는 비유: 거울을 가진 반대말 검사관

! 거울 검사관을 더 쉽게 이해하기 위해 '거울을 가진 반대말 검사관' 이야기를 들려드릴게요.

우리 학교에는 정말 특별한 검사관이 있었어요. 이 검사관은 신기한 거울을 가지고 있는데, 이 거울에 어떤 것을 비춰도 정반대의 모습이 나타나요.

"참"을 거울에 비추면 "거짓"이 나오고, "거짓"을 비추면 "참"이 나와요. "밝음"을 비추면 "어둠"이, "켜짐"을 비추면 "꺼짐"이 나타나죠.

더 신기한 건 이 거울이 모든 것을 이해한다는 점이에요. "안녕하세요"같은 글자를 비춰도 "이건 뭔가 있는 거니까 '참'이야"라고 판단한 후 '거짓'으로 바꿔주고, 빈 공간 ""을 비춰도 "이건 아무것도 없으니까 '거짓'이야"라고 판단한 후 '참'으로 바꿔줘요.

특히 이 검사관은 "진실 확인 기능"이라는 특별한 기술을 가지고 있어요. 거울을 두 번 연속으로 사용하는 거예요 (!!).

첫 번째 거울: "이게 뭐지?" → 반대로 변환
두 번째 거울: "그럼 원래는?" → 다시 반대로 변환
결과: "진짜 있는 건지 없는 건지"가 명확해져요!

이 검사관 덕분에 학생들은 애매한 것들을 명확하게 구분할 수 있게 되었어요. 0점짜리 시험지도 "진짜 있는 시험지"인지 "없는 시험지"인지 확실히 알 수 있었죠.

🎯 왜 거울 검사관이 좋을까요?

그럼 왜 많은 프로그래머들이 거울 검사관 !을 좋아할까요? 여러 가지 좋은 이유들이 있어요.

첫 번째는 자연스러운 말하기예요. "~가 아니면"이라는 자연스러운 말을 코드로 그대로 옮길 수 있어요. "로그인하지 않았으면 로그인 페이지로 가라"는 if (!isLoggedIn)으로 간단히 표현할 수 있거든요.

두 번째는 문제 상황 처리하기예요. 정상적이지 않은 상황, 실패한 상황, 원하지 않는 상황들을 깔끔하게 처리할 수 있어요. 예를 들어 정보가 없거나, 권한이 없거나, 문제가 발생한 경우들을 효율적으로 다룰 수 있어요.

세 번째는 켜고 끄기 기능이에요. 스위치를 켜고 끄거나, 메뉴를 열고 닫거나, 화면을 보이고 숨기는 등의 상태를 바꾸는 걸 state = !state 한 줄로 만들 수 있어요.

마지막으로 확실하게 만들기예요. !! 기능을 사용하면 어떤 값이든 확실한 참/거짓 값으로 바꿀 수 있어서, 조건문의 결과를 더 예상하기 쉽게 만들 수 있어요.

⚙️ 거울 검사관과 대화하는 방법 배우기

! 거울 검사관과 대화하는 방법은 정말 간단해요. 값 앞에 !를 붙이면 돼요!

// 기본적인 거울 기능
let result = !value;

// "만약에" 질문할 때 사용하기
if (!condition) {
    // condition이 거짓일 때 할 일
}

// 상태 바꾸기 (켜기/끄기)
let isOpen = false;
isOpen = !isOpen; // true가 돼요

// 두 번 거울 기능으로 확실하게 만들기
let clearValue = !!anyValue;

거울 검사관의 답변 패턴:

!참   // 거짓 (참의 반대)
!거짓 // 참 (거짓의 반대)

실제로 사용하는 예시:

let isLoggedIn = false;     // 로그인 안됨
let needsLogin = !isLoggedIn; // 로그인 필요함 (true)

if (needsLogin) {
    console.log("로그인이 필요해요");
}

🧪 직접 해보면서 배우기

이제 실제로 ! 거울 검사관이 어떻게 일하는지 함께 실험해볼게요!

🔹 첫 번째 실험: 거울 검사관의 기본 동작 확인하기

가장 기본적인 상황에서 ! 거울 검사관이 어떻게 일하는지 살펴보아요.

// 기본적인 참/거짓으로 거울 기능 실험해보기
console.log("=== 거울 검사관의 기본 기능 ===");

let isTrue = true;              // 참
let isFalse = false;            // 거짓

console.log("원래 값들:");
console.log("isTrue:", isTrue);         // true
console.log("isFalse:", isFalse);       // false

console.log("거울 기능 결과:");
console.log("!isTrue:", !isTrue);       // false (참의 반대는 거짓)
console.log("!isFalse:", !isFalse);     // true (거짓의 반대는 참)

// 실제 생활에서 반대말 만들기
console.log("\n=== 실제 생활의 반대말 만들기 ===");

let isWeekend = false;          // 주말인가요?
let isRaining = true;           // 비가 와요?
let hasUmbrella = false;        // 우산 있어요?
let isHungry = true;            // 배고파요?

console.log("원래 상태들:");
console.log("주말인가요?", isWeekend);
console.log("비가 와요?", isRaining);
console.log("우산 있어요?", hasUmbrella);
console.log("배고파요?", isHungry);

// 반대말들 만들어보기
let isWeekday = !isWeekend;             // 평일인가요?
let isSunny = !isRaining;               // 맑아요?
let noUmbrella = !hasUmbrella;          // 우산이 없어요?
let isNotHungry = !isHungry;            // 배고프지 않아요?

console.log("\n반대말들:");
console.log("평일인가요?", isWeekday);     // true (주말이 아니니까 평일)
console.log("맑아요?", isSunny);          // false (비가 오니까 맑지 않음)
console.log("우산 없어요?", noUmbrella);   // true (우산이 없으니까 맞음)
console.log("배고프지 않아요?", isNotHungry); // false (배고프니까 틀림)

// 다양한 종류의 값들로 거울 기능 실험하기
console.log("\n=== 다양한 값들로 거울 기능 실험 ===");

// 숫자들로 실험
console.log("!0:", !0);                 // true (0은 "없음"으로 생각해서 거짓, 그래서 반대는 참)
console.log("!1:", !1);                 // false (1은 "있음"으로 생각해서 참, 그래서 반대는 거짓)
console.log("!100:", !100);             // false (100도 "있음"으로 생각해서 참, 그래서 반대는 거짓)

// 글자들로 실험
console.log("!'':", !"");               // true (빈 글자는 "없음"으로 생각해서 거짓, 그래서 반대는 참)
console.log("!'안녕':", !"안녕");        // false (글자가 있으면 "있음"으로 생각해서 참, 그래서 반대는 거짓)
console.log("!'0':", !"0");             // false ("0"도 글자이므로 "있음"으로 생각해서 참, 그래서 반대는 거짓)

// 특별한 값들로 실험
console.log("!null:", !null);           // true (null은 "없음"으로 생각해서 거짓, 그래서 반대는 참)
console.log("!undefined:", !undefined); // true (undefined도 "없음"으로 생각해서 거짓, 그래서 반대는 참)

이 실험에서 우리는 ! 거울 검사관이 어떻게 다양한 종류의 값들을 처리하는지 알 수 있어요.

🔹 두 번째 실험: 두 번 거울 기능(!!)으로 "진짜로 있는지" 확인하기

!! 기능을 사용해서 값들이 진짜로 있는지 확인해보는 실험을 해보아요.

// 두 번 거울 기능(!!)으로 "진짜로 있는지" 확인하기
console.log("=== 두 번 거울 기능 (!!) 진실 확인 ===");

let userName = "철수";          // 사용자 이름
let userAge = 0;                // 나이 (0)
let userEmail = "";             // 이메일 (빈 글자)
let userPhone = null;           // 전화번호 (없음)
let userHobbies = ["독서"];     // 취미 (배열)

console.log("원래 정보들:");
console.log("이름:", userName);         // "철수"
console.log("나이:", userAge);           // 0
console.log("이메일:", userEmail);       // ""
console.log("전화번호:", userPhone);     // null
console.log("취미:", userHobbies);       // ["독서"]

console.log("\n!! 기능으로 '진짜 있는지' 확인:");
console.log("!!userName:", !!userName);     // true (이름이 있어요)
console.log("!!userAge:", !!userAge);       // false (0은 "없음"으로 판단)
console.log("!!userEmail:", !!userEmail);   // false (빈 글자는 "없음"으로 판단)
console.log("!!userPhone:", !!userPhone);   // false (null은 "없음"으로 판단)
console.log("!!userHobbies:", !!userHobbies); // true (배열이 있어요)

// 확인 결과를 변수에 저장해서 활용하기
let hasName = !!userName;               // true
let hasAge = !!userAge;                 // false
let hasEmail = !!userEmail;             // false
let hasPhone = !!userPhone;             // false
let hasHobbies = !!userHobbies;         // true

console.log("\n프로필 정보 확인:");
console.log("이름 있어요:", hasName);         // true
console.log("나이 있어요:", hasAge);           // false (0은 없는 것으로 판단)
console.log("이메일 있어요:", hasEmail);       // false
console.log("전화번호 있어요:", hasPhone);     // false
console.log("취미 있어요:", hasHobbies);       // true

🔹 세 번째 실험: 스위치 켜고 끄기 기능

! 거울 검사관의 가장 재미있는 활용법 중 하나인 스위치 켜고 끄기 기능을 알아보아요.

// 집안 전자제품 스위치 관리 시스템
console.log("=== 집안 전자제품 스위치 관리 ===");

// 처음 전자제품들의 상태
let light = false;            // 전등 (꺼져 있음)
let aircon = false;           // 에어컨 (꺼져 있음)
let tv = true;                // TV (켜져 있음)
let music = true;             // 음악 (켜져 있음)
let computer = false;         // 컴퓨터 (꺼져 있음)
let fan = true;               // 선풍기 (켜져 있음)

console.log("처음 전자제품 상태:");
console.log("전등:", light);
console.log("에어컨:", aircon);
console.log("TV:", tv);
console.log("음악:", music);
console.log("컴퓨터:", computer);
console.log("선풍기:", fan);

// 스위치 켜고 끄기 함수들
function toggleLight() {
    light = !light;     // 현재 상태의 반대로 바꾸기
    console.log("전등 스위치 → 현재:", light ? "켜짐" : "꺼짐");
    return light;
}

function toggleAircon() {
    aircon = !aircon;   // 현재 상태의 반대로 바꾸기
    console.log("에어컨 스위치 → 현재:", aircon ? "켜짐" : "꺼짐");
    return aircon;
}

function toggleTV() {
    tv = !tv;           // 현재 상태의 반대로 바꾸기
    console.log("TV 스위치 → 현재:", tv ? "켜짐" : "꺼짐");
    return tv;
}

// 사용자가 스위치를 누르는 상황 만들어보기
console.log("\n=== 사용자가 스위치를 누르는 중 ===");

toggleLight();      // 전등 켜기 (false → true)
toggleAircon();     // 에어컨 켜기 (false → true)
toggleTV();         // TV 끄기 (true → false)

// 몇 가지를 다시 눌러보기
console.log("\n=== 다시 몇 개 더 눌러보기 ===");
toggleLight();      // 전등 다시 끄기 (true → false)
toggleAircon();     // 에어컨 다시 끄기 (true → false)

console.log("\n=== 최종 전자제품 상태 ===");
console.log("전등:", light);
console.log("에어컨:", aircon);
console.log("TV:", tv);
console.log("음악:", music);
console.log("컴퓨터:", computer);
console.log("선풍기:", fan);

🔹 네 번째 실험: 게임 입장 문제 해결하기

실제 게임에서 발생할 수 있는 문제 상황들을 ! 거울 검사관으로 처리하는 시스템을 만들어보아요.

// 온라인 게임 입장 문제 해결 시스템
console.log("=== 온라인 게임 입장 문제 해결 ===");

// 플레이어 정보
let playerName = "박철수";
let isLoggedIn = false;          // 로그인했나요?
let hasTicket = true;            // 입장권 있나요?
let isEmailOK = false;           // 이메일 확인했나요?
let playerAge = 16;              // 나이
let coins = 0;                   // 가진 코인
let isBanned = false;            // 차단당했나요?

// 게임 정보
let gameIsOpen = true;           // 게임 열려있나요?
let minAge = 18;                 // 최소 나이
let isFixing = false;            // 수리 중인가요?

console.log("플레이어:", playerName);
console.log("로그인:", isLoggedIn);
console.log("입장권:", hasTicket);
console.log("이메일 확인:", isEmailOK);
console.log("나이:", playerAge);
console.log("코인:", coins);
console.log("차단 여부:", isBanned);

// 문제가 되는 조건들 (모두 "~하지 않음", "~가 없음" 상황들)
let notLoggedIn = !isLoggedIn;                          // 로그인 안함
let noTicket = !hasTicket;                             // 입장권 없음
let emailNotOK = !isEmailOK;                           // 이메일 미확인
let tooYoung = playerAge < minAge;                     // 나이 부족
let noCoins = coins <= 0;                              // 코인 없음
let gameNotOpen = !gameIsOpen;                         // 게임 닫힘
let gameFixing = isFixing;                             // 게임 수리 중

console.log("\n=== 문제 상황들 확인 ===");
console.log("로그인 안함:", notLoggedIn);           // true
console.log("입장권 없음:", noTicket);               // false (입장권 있어서)
console.log("이메일 미확인:", emailNotOK);           // true
console.log("나이 부족:", tooYoung);                 // true
console.log("코인 없음:", noCoins);                 // true
console.log("차단됨:", isBanned);                   // false
console.log("게임 닫힘:", gameNotOpen);             // false
console.log("게임 수리 중:", gameFixing);           // false

// 게임에 들어갈 수 없는지 확인 (하나라도 문제가 있으면 못 들어감)
let hasProblems = notLoggedIn || noTicket || emailNotOK || 
                  tooYoung || noCoins || isBanned || 
                  gameNotOpen || gameFixing;

let canEnterGame = !hasProblems;              // 문제 없으면 들어갈 수 있음

console.log("\n=== 게임 입장 결과 ===");
if (canEnterGame) {
    console.log("✅ 게임에 들어갈 수 있어요!");
} else {
    console.log("🚫 게임에 들어갈 수 없어요.");

    // 구체적인 문제들 알려주기
    if (notLoggedIn) {
        console.log("❌ 먼저 로그인해주세요.");
    }
    if (noTicket) {
        console.log("❌ 입장권이 필요해요.");
    }
    if (emailNotOK) {
        console.log("❌ 이메일 확인을 완료해주세요.");
    }
    if (tooYoung) {
        console.log("❌ 만 " + minAge + "세 이상만 플레이할 수 있어요.");
    }
    if (noCoins) {
        console.log("❌ 코인이 부족해요.");
    }
    if (isBanned) {
        console.log("❌ 차단된 계정이에요.");
    }
    if (gameNotOpen) {
        console.log("❌ 현재 게임이 닫혀있어요.");
    }
    if (gameFixing) {
        console.log("❌ 게임을 수리하고 있어요.");
    }
}

🧚‍♀️ 이야기로 다시 배우기: 학교의 거울을 가진 검사관

우리가 배운 내용을 조용한 이야기로 다시 정리해볼게요.

우리 학교에는 "거울의 방"이라는 신비로운 교실이 있었어요. 이 방의 담당 선생님은 ! 거울 검사관이었는데, 벽면 전체가 특별한 거울로 되어 있었어요.

이 거울들은 모든 것을 정반대로 보여주는 놀라운 능력을 가지고 있었어요. 학생이 "참"이라고 쓴 종이를 거울에 비추면 "거짓"으로 바뀌고, "켜짐"을 비추면 "꺼짐"으로 나타났죠.

가장 신기한 건 거울이 모든 언어를 이해한다는 점이었어요. "안녕하세요"라는 글자를 비춰도 거울은 "이건 뭔가 있는 거니까 참이야"라고 판단한 후 "거짓"으로 바꿔주었고, 빈 종이를 비춰도 "이건 아무것도 없으니까 거짓이야"라고 판단한 후 "참"으로 바꿔주었어요.

선생님은 학생들에게 "진실 확인 기능"이라는 특별한 기술을 가르쳐주었어요. 거울을 두 번 연속으로 사용하는 방법이었죠.

첫 번째 거울: "이게 뭐지?" → 반대로 변환
두 번째 거울: "그럼 원래는?" → 다시 반대로 변환
결과: "진짜 있는 건지 없는 건지"가 명확해져요!

학생들은 이 기능을 사용해서 애매한 것들을 명확하게 구분할 수 있게 되었어요. 0점짜리 시험지도 "진짜 있는 시험지"인지 "없는 시험지"인지 확실히 알 수 있었죠.

또한 선생님은 "상태 바꾸기 기능"도 가르쳐주었어요. 같은 물건에 계속 거울 기능을 사용하면 "켜짐 → 꺼짐 → 켜짐"을 반복할 수 있어서, 교실의 전등이나 음악을 자유자재로 조절할 수 있었어요.

결국 ! 검사관은 "반대 상황을 다루는 지혜"를 주는 도구인 거죠.

🧠 자주 하는 실수와 주의할 점

친구들이 ! 거울 검사관을 사용할 때 자주 하는 실수들을 살펴보고, 어떻게 피할 수 있는지 알아보아요.

❌ 실수 1: 두 번 거울 기능(!!)의 숨겨진 함정 이해하지 못하기

let userAge = 0;                    // 실제 나이가 0세
let userScore = "";                 // 빈 점수
let isCompleted = false;            // 실제로 완료되지 않음

// ❌ 예상과 다른 결과
let hasAge = !!userAge;             // false (0은 "없음"으로 판단)
let hasScore = !!userScore;         // false (빈 글자는 "없음"으로 판단)
let taskDone = !!isCompleted;       // false (의도한 결과)

console.log("나이 있어요:", hasAge);       // false (하지만 실제로는 0세!)
console.log("점수 있어요:", hasScore);     // false (맞음)
console.log("작업 완료:", taskDone);       // false (맞음)

// ✅ 올바른 확인 방법
let correctAgeCheck = userAge !== null && userAge !== undefined;   // null이나 undefined가 아닌지 확인
let correctScoreCheck = userScore !== null && userScore !== undefined; // null이나 undefined가 아닌지 확인

console.log("정확한 나이 확인:", correctAgeCheck);     // true (0이지만 존재함)
console.log("정확한 점수 확인:", correctScoreCheck);   // true (빈 글자지만 존재함)

0, false, 빈 글자 등도 실제로는 의미가 있는 값일 수 있으므로 단순히 !!로 존재 여부를 확인하면 안 돼요.

❌ 실수 2: ! 연산자를 너무 많이 중복해서 사용하기

let isLoggedIn = false;

// ❌ 헷갈리는 표현
let result = !!!isLoggedIn;    // 너무 많은 ! 사용

console.log("결과:", result);   // true (하지만 이해하기 어려움)

// ✅ 명확한 표현
let notLoggedIn = !isLoggedIn;  // 단계별로 명확하게
let result2 = !notLoggedIn;     // 한 번에 하나씩

console.log("로그인 안함:", notLoggedIn);    // true
console.log("최종 결과:", result2);          // false

!를 여러 번 연속으로 사용하면 헷갈리기 쉬우므로, 중간 단계 변수를 사용해서 명확하게 표현하는 게 좋아요.

마음을 담아 준비한 연습 문제들

여러분이 지금까지 배운 것들을 차분히 정리해볼 수 있는 시간을 마련했어요. 이 문제들은 마치 저녁 무렵의 고요한 시간처럼, 여러분의 이해를 조용히 깊게 해줄 거예요.

문제를 풀면서 서두르지 마세요. 컴퓨터 언어도 결국 우리가 일상에서 쓰는 말처럼, 차근차근 익혀가면 돼요. 여러분 각자의 속도에 맞춰 천천히 해보세요.

Ex1) 비 오는 날 외출 계획을 세워보자

// 오늘의 상황들을 담을 상자들을 만들어요
let isWeekend = true;       // 주말인가요?
let isRaining = false;      // 비가 와요?
let hasUmbrella = true;     // 우산 있어요?

// ! 거울 검사관에게 반대 상황들 물어보기
let isWeekday = !isWeekend;                     // 평일인가요?
let isSunny = !isRaining;                       // 맑아요?
let noUmbrella = !hasUmbrella;                  // 우산이 없어요?

// 결과 확인하기
console.log("평일인가요?", isWeekday);          // false (주말이어서)
console.log("맑아요?", isSunny);               // true (비가 안 와서)
console.log("우산이 없어요?", noUmbrella);      // false (우산이 있어서)

// 외출 가능한지 판단해보기
let canGoOut = isWeekend && isSunny;            // 주말이고 맑으면 외출 가능
let shouldStayHome = !canGoOut;                 // 외출 불가능하면 집에 있어야 함

console.log("외출 가능:", canGoOut);            // true
console.log("집에 있어야 함:", shouldStayHome); // false

Ex2) 전자제품 스위치 켜고 끄기 시스템을 만들어보자

// 전자제품들의 상태를 담을 상자들을 만들어요
let light = false;       // 전등 상태 (꺼져 있음)
let music = true;        // 음악 상태 (켜져 있음)
let fan = false;         // 선풍기 상태 (꺼져 있음)
let tv = true;           // TV 상태 (켜져 있음)

console.log("처음 상태:");
console.log("전등:", light);
console.log("음악:", music);
console.log("선풍기:", fan);
console.log("TV:", tv);

// 각 전자제품 스위치 눌러보기
light = !light;          // 전등 켜기 (false → true)
music = !music;          // 음악 끄기 (true → false)
fan = !fan;              // 선풍기 켜기 (false → true)
tv = !tv;                // TV 끄기 (true → false)

console.log("\n스위치를 누른 후:");
console.log("전등:", light);        // true
console.log("음악:", music);        // false
console.log("선풍기:", fan);        // true
console.log("TV:", tv);             // false

Ex3) 사용자 정보가 제대로 있는지 확인해보자

// 사용자 정보들
let userName = "김철수";        // 이름
let userAge = 0;               // 나이 (0세)
let userEmail = "";            // 이메일 (빈 값)
let userPhone = null;          // 전화번호 (없음)

// !! 기능으로 정보가 있는지 확인하기
let hasName = !!userName;      // true (이름이 있어요)
let hasAge = !!userAge;        // false (0은 "없음"으로 판단)
let hasEmail = !!userEmail;    // false (빈 글자는 "없음"으로 판단)
let hasPhone = !!userPhone;    // false (null은 "없음"으로 판단)

console.log("이름 있어요:", hasName);         // true
console.log("나이 있어요:", hasAge);           // false (주의!)
console.log("이메일 있어요:", hasEmail);       // false
console.log("전화번호 있어요:", hasPhone);     // false

// 더 정확한 확인 방법
let reallyHasAge = userAge !== null && userAge !== undefined;
console.log("진짜 나이 있어요:", reallyHasAge);   // true (0이지만 실제 값)

🔄 복습 문제: 이전 단원들과 2.3.1, 2.3.2 내용 복습하기

이전에 배운 내용들을 잊지 않도록 복습해볼게요!

복습 문제 1) 변수와 데이터 타입 (1단원 복습)

// 1단원에서 배운 변수 만들기와 데이터 타입을 복습해보세요!

// let과 const로 다양한 상자 만들기
let studentScore = 95;      // 학생 점수 (바뀔 수 있음)
const schoolName = "행복초등학교";  // 학교 이름 (바뀌지 않음)
let studentName = "박민수";  // 학생 이름
let isPassing = true;       // 합격했는지

console.log("학생 점수:", studentScore);
console.log("학교 이름:", schoolName);
console.log("학생 이름:", studentName);
console.log("합격 여부:", isPassing);

// 데이터 타입 확인하기
console.log("점수 타입:", typeof studentScore);     // number
console.log("이름 타입:", typeof studentName);      // string
console.log("합격여부 타입:", typeof isPassing);    // boolean

복습 문제 2) 계산과 비교 연산자 (2.1, 2.2단원 복습)

// 2.1단원: 계산하기 복습
let score1 = 88;
let score2 = 12;

console.log("=== 계산 연산자 복습 ===");
console.log("더하기:", score1 + score2);     // 100
console.log("빼기:", score1 - score2);       // 76
console.log("곱하기:", score1 * score2);     // 1056
console.log("나누기:", score1 / score2);     // 7.333...
console.log("나머지:", score1 % score2);     // 4

// 2.2단원: 비교 연산자 복습
let myScore = 85;
let passScore = 80;

console.log("\n=== 비교 연산자 복습 ===");
console.log("점수가 같은가:", myScore === passScore);     // false
console.log("점수가 다른가:", myScore !== passScore);     // true
console.log("내 점수가 더 높은가:", myScore > passScore);  // true
console.log("합격 기준보다 높거나 같은가:", myScore >= passScore); // true

복습 문제 3) && 와 || 연산자 (2.3.1, 2.3.2단원 복습)

// 방금 전에 배운 && 와 || 연산자 복습하기
let hasStudentCard = true;     // 학생증 있나요?
let hasPermission = false;     // 허락 받았나요?
let hasHomework = true;        // 숙제 했나요?

console.log("=== && 와 || 연산자 복습 ===");

// && 검사관: 모든 조건이 맞아야 성공
let canEnterLibrary = hasStudentCard && hasPermission;     // 도서관에 들어갈 수 있나요?
console.log("도서관 입장 가능:", canEnterLibrary);        // false (허락이 없어서)

// || 검사관: 하나라도 맞으면 성공
let canStayAfterSchool = hasPermission || hasHomework;     // 방과 후에 남을 수 있나요?
console.log("방과 후 가능:", canStayAfterSchool);          // true (숙제가 있어서)

// ! 검사관과 함께 사용하기
let needsPermission = !hasPermission;                      // 허락이 필요한가요?
let hasNoHomework = !hasHomework;                          // 숙제가 없나요?

console.log("허락 필요:", needsPermission);               // true
console.log("숙제 없음:", hasNoHomework);                 // false

// 복합 조건 만들기
let perfectStudent = hasStudentCard && hasPermission && hasHomework;    // 완벽한 학생?
let problemStudent = !hasStudentCard || !hasPermission || !hasHomework; // 문제 있는 학생?

console.log("완벽한 학생:", perfectStudent);              // false
console.log("문제 있는 학생:", problemStudent);           // true (허락이 없어서)

설명:

  • && 검사관은 모든 조건이 참이어야 true를 반환
  • || 검사관은 하나라도 참이면 true를 반환
  • ! 검사관은 조건을 반대로 바꿔줌
  • 이 세 친구들을 조합하면 복잡한 조건도 쉽게 표현할 수 있어요!

✅ 학습 완료 체크리스트

이번 시간에 배운 내용들을 모두 이해했는지 확인해보세요!

학습 내용 이해했나요?
! 연산자의 기본 개념
기본 사용법과 문법
두 번 거울 기능(!!) 이해
스위치 토글 기능
falsy/truthy 값 주의사항
실전 예제 이해
이전 단원들 복습 완료
&&, ||, ! 차이점 이해

📂 마무리 정보

오늘 배운 2.3.3 내용이 여러분의 자바스크립트 지식 상자에 잘 저장되었나요?

지금까지 ! 거울 검사관의 모든 특징을 자세히 살펴보았어요. 이 친구는 논리적인 반대를 통해 조건의 다른 상황을 표현하고, 상태를 바꾸며, 확실한 참/거짓 변환을 제공하는 정말 유용한 도우미예요. 앞으로 반대 조건이나 문제 처리가 필요한 상황에서 ! 거울 검사관을 똑똑하게 활용해보세요!

기억할 점: 오늘 배운 내용을 꼭 연습해보시고, 궁금한 점이 있으면 언제든 다시 돌아와서 읽어보세요.



🚀 더 체계적인 JavaScript 학습을 원하신다면?
이 포스팅에서 다룬 내용을 실제로 실습해보세요!
무료 JavaScript 학습 플랫폼에서 단계별 학습과 실시간 코드 실행을 통해
더욱 효과적이고 재미있게 학습하실 수 있습니다.
📝 실시간 코드 실행 📊 학습 진도 관리 👥 체계적 커리큘럼
📚 171개 체계적 학습레슨 · 📋 855개 4지선다 연습문제 · 🆓 완전 무료 · ⚡ 즉시 시작