14. 고급 배열 마법사 (고급 배열 메서드)/14.4 배열 검색과 정렬

14.4.2 `some`, `every` - 배열의 모든 것을 검사하는 똑똑한 도우미들

thejavascript4kids 2025. 7. 21. 03:26

📘 14.4.2 some, every - 배열의 모든 것을 검사하는 똑똑한 도우미들

안녕하세요, 여러분. 이전 시간에 findfindIndex로 특정한 것을 찾는 방법을 배웠어요. 오늘은 배열 전체의 상황을 살피는 두 명의 특별한 도우미를 만나볼 거예요. 바로 someevery입니다.

선생님이 우리 반 전체를 둘러보며 "숙제 안 한 학생이 있나요?"나 "모든 학생이 준비물을 다 가져왔나요?"라고 확인하시는 것처럼, 이 도우미들은 배열의 전체적인 상황을 빠르게 파악해줍니다.

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

배열의 전체 상황을 검사할 때 사용하는 중요한 단어들을 차근차근 알아볼게요.

단어 쉬운 설명
some 배열에서 조건을 만족하는 것이 하나라도 있는지 확인하는 도우미예요.
every 배열의 모든 것이 조건을 만족하는지 확인하는 도우미예요.
참/거짓 값 true(참) 또는 false(거짓) 값만 가지는 특별한 답변 방식이에요.
빠른 판단 결과가 확실해지면 나머지 검사를 생략하는 효율적인 방법이에요.

some은 "일부, 몇 개"라는 뜻이고, every는 "모든, 각각의"라는 의미예요.

someevery가 뭔지 알아보기

someevery는 배열의 전체적인 상황을 점검해서 true 또는 false로 답해주는 도우미들이에요. 이 둘의 가장 중요한 특징은 결과가 확실해지면 즉시 검사를 멈춘다는 거예요.

some은 "하나라도 조건에 맞는 것이 있나요?"라는 질문에 답해주고, every는 "모든 것이 조건에 맞나요?"라는 질문에 답해줍니다. some은 첫 번째 true를 만나면 바로 true를 반환하고, every는 첫 번째 false를 만나면 바로 false를 반환해요.

이런 빠르고 똑똑한 검사 방식 덕분에 큰 배열에서도 빠르게 전체 상황을 파악할 수 있습니다. 특히 정보를 확인하거나 조건을 점검이 필요한 상황에서 정말 유용해요.

재미있는 비유: 반 전체 검사하기

someevery를 더 쉽게 이해하기 위해 '선생님이 우리 반을 검사하는 상황'에 비유해볼게요.

선생님이 교실에 들어와서 "숙제 안 한 학생이 있나요?"라고 물어보셨다고 생각해보세요. 이때 some 도우미는 앞자리부터 차례대로 확인하기 시작해요. 첫 번째 학생... 숙제 했음, 두 번째 학생... 숙제 했음, 세 번째 학생... 숙제 안 함! 이 순간 some은 "네, 있어요!"라고 대답하고 검사를 끝내요.

다른 날, 선생님이 "모든 학생이 준비물을 다 가져왔나요?"라고 물어보셨어요. 이번에는 every 도우미가 나서서 차례대로 확인해요. 첫 번째 학생... 준비물 완벽, 두 번째 학생... 준비물 완벽, 세 번째 학생... 준비물 빼먹음! 이 순간 every는 "아니요, 모두 가져오지 않았어요!"라고 대답하고 검사를 끝내요.

이처럼 someevery전체를 다 확인하지 않아도 결과가 확실해지면 바로 답을 알려주는 똑똑한 도우미들이에요.

🎯 왜 someevery를 배워야 할까요?

우리는 왜 이 검사 도우미들을 배워야 할까요?

첫 번째로, 빠른 상황 판단이 가능해져요. 큰 정보 목록에서도 조건이 확실해지면 즉시 결과를 알 수 있어서 시간을 크게 절약할 수 있습니다.

두 번째로, 정보 확인에 정말 유용해요. 사용자가 입력한 정보가 모두 올바른지, 문제가 있는 정보가 하나라도 있는지 쉽게 확인할 수 있습니다.

세 번째로, 조건부 실행을 간단하게 만들어줘요. 복잡한 if문이나 반복문 없이도 "모든 조건이 맞으면 실행", "하나라도 문제가 있으면 중단" 같은 로직을 쉽게 만들 수 있어요.

마지막으로, 코드의 의도가 명확해져요. some을 보면 "특별한 경우를 찾고 있구나", every를 보면 "전체를 확인하고 있구나"라고 바로 이해할 수 있습니다.

⚙️ 기본 사용법 살펴보기

someevery의 기본적인 사용법을 알아보겠습니다.

// some - 하나라도 조건에 맞으면 true
let 하나라도있음 = 배열.some(function(각각의것) {
    return 조건식;
});

// every - 모든 것이 조건에 맞아야 true
let 모두만족 = 배열.every(function(각각의것) {
    return 조건식;
});

// 더 간단하게 쓰기
let 있음 = 배열.some(각각의것 => 조건식);
let 전부 = 배열.every(각각의것 => 조건식);

기본 예시:

let scores = [85, 90, 75, 95, 88];

// 90점 이상이 하나라도 있나요?
let hasHighScore = scores.some(function(score) {
    return score >= 90;
});

// 모든 점수가 60점 이상인가요?
let allPassed = scores.every(function(score) {
    return score >= 60;
});

console.log(hasHighScore); // true (90, 95가 있음)
console.log(allPassed);    // true (모든 점수가 60 이상)

🧪 직접 해보면서 배우기

이제 실제 상황에서 someevery를 사용하는 예시들을 살펴보겠습니다.

🔹 첫 번째 예시: 우리 반 시험 점수 검사

우리 반의 시험 점수를 가지고 다양한 검사를 해보겠습니다.

// 우리 반 수학 시험 점수
let mathScores = [85, 92, 78, 96, 88, 74];

console.log("수학 점수:", mathScores);

// 90점 이상인 학생이 있나요?
let hasExcellent = mathScores.some(function(score) {
    return score >= 90;
});

console.log("90점 이상 학생이 있나요?", hasExcellent); // true

// 모든 학생이 70점 이상인가요?
let allGood = mathScores.every(function(score) {
    return score >= 70;
});

console.log("모든 학생이 70점 이상인가요?", allGood); // true

// 낙제생(60점 미만)이 있나요?
let hasFailure = mathScores.some(score => score < 60);
console.log("낙제생이 있나요?", hasFailure); // false

// 모든 학생이 80점 이상인가요?
let allGreat = mathScores.every(score => score >= 80);
console.log("모든 학생이 80점 이상인가요?", allGreat); // false (74점 때문에)

이 예시에서는 다양한 조건으로 반 전체의 상황을 빠르게 파악할 수 있어요.

🔹 두 번째 예시: 친구들의 준비물 검사

소풍을 위한 친구들의 준비물 상황을 검사해보겠습니다.

// 친구들의 준비물 상황
let friends = [
    { name: "철수", hasLunch: true, hasWater: true, hasHat: false },
    { name: "영희", hasLunch: true, hasWater: true, hasHat: true },
    { name: "민수", hasLunch: false, hasWater: true, hasHat: true },
    { name: "지은", hasLunch: true, hasWater: false, hasHat: true }
];

// 도시락을 안 가져온 친구가 있나요?
let someoneNeedsLunch = friends.some(function(friend) {
    return friend.hasLunch === false;
});

console.log("도시락 안 가져온 친구 있나요?", someoneNeedsLunch); // true

// 모든 친구가 물을 가져왔나요?
let everyoneHasWater = friends.every(function(friend) {
    return friend.hasWater === true;
});

console.log("모든 친구가 물을 가져왔나요?", everyoneHasWater); // false

// 준비물을 완벽하게 챙긴 친구가 있나요?
let someoneReady = friends.some(friend => 
    friend.hasLunch && friend.hasWater && friend.hasHat
);

console.log("완벽하게 준비한 친구 있나요?", someoneReady); // true (영희)

// 모든 친구가 완벽하게 준비했나요?
let everyoneReady = friends.every(friend => 
    friend.hasLunch && friend.hasWater && friend.hasHat
);

console.log("모든 친구가 완벽하게 준비했나요?", everyoneReady); // false

이 예시에서는 복잡한 조건도 someevery로 쉽게 검사할 수 있음을 보여줍니다.

🔹 세 번째 예시: 게임 레벨 클리어 확인

게임에서 여러 레벨의 클리어 상황을 확인해보겠습니다.

// 게임 레벨들의 클리어 상황
let gameLevels = [
    { level: 1, cleared: true, stars: 3 },
    { level: 2, cleared: true, stars: 2 },
    { level: 3, cleared: false, stars: 0 },
    { level: 4, cleared: true, stars: 1 },
    { level: 5, cleared: false, stars: 0 }
];

// 게임 진행 상황 검사하는 기능
function checkGameProgress(levels) {
    console.log("=== 게임 진행 상황 ===");

    // 클리어하지 못한 레벨이 있나요?
    let hasUnclearedLevel = levels.some(function(level) {
        return level.cleared === false;
    });

    console.log("못 깬 레벨이 있나요?", hasUnclearedLevel);

    // 모든 레벨을 클리어했나요?
    let allCleared = levels.every(function(level) {
        return level.cleared === true;
    });

    console.log("모든 레벨을 클리어했나요?", allCleared);

    // 별 3개를 받은 레벨이 있나요?
    let hasPerfectLevel = levels.some(level => level.stars === 3);
    console.log("별 3개 받은 레벨이 있나요?", hasPerfectLevel);

    // 모든 클리어한 레벨이 별 2개 이상인가요?
    let allClearedHaveGoodStars = levels.every(level => 
        level.cleared ? level.stars >= 2 : true
    );

    console.log("클리어한 레벨 모두 별 2개 이상인가요?", allClearedHaveGoodStars);
}

checkGameProgress(gameLevels);

이 예시에서는 게임 진행 상황을 체계적으로 분석하는 방법을 보여줍니다.

🔄 검사 과정 정리하기

지금까지 배운 someevery의 사용 과정을 단계별로 정리해보겠습니다.

첫 번째 단계는 검사 목적 정하기입니다. "하나라도 있나?"인지 "모두 그런가?"인지 명확히 결정해야 해요.

두 번째는 적절한 도우미 선택 단계입니다. 특별한 경우를 찾으려면 some, 전체를 확인하려면 every를 선택합니다.

세 번째는 조건 함수 작성 단계입니다. 각각이 만족해야 하는 조건을 명확히 작성해야 해요.

마지막으로 결과 활용 단계입니다. 반환된 truefalse를 바탕으로 적절한 조치를 취할 수 있습니다.

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

someevery를 사용할 때 자주 하는 실수들을 알아보고 피하는 방법을 살펴보겠습니다.

❌ 실수 1: someevery의 의미를 혼동하기

let scores = [85, 75, 90, 65];

// 헷갈리기 쉬운 상황
console.log("80점 이상이 있나요?");
let hasGood = scores.some(score => score >= 80);
console.log(hasGood); // true (85, 90이 있음)

console.log("모두 80점 이상인가요?");
let allGood = scores.every(score => score >= 80);
console.log(allGood); // false (75, 65가 있음)

// 명확한 기억법
console.log("--- 기억하기 ---");
console.log("some: 하나라도 조건 만족하면 → true");
console.log("every: 모두 조건 만족해야 → true");

some은 "하나라도", every는 "모두"라는 의미를 항상 기억해야 해요.

❌ 실수 2: 빈 배열에서의 결과를 예상하지 못하기

let emptyArray = [];

let someResult = emptyArray.some(x => x > 0);
console.log("빈 배열 some:", someResult); // false

let everyResult = emptyArray.every(x => x > 0);
console.log("빈 배열 every:", everyResult); // true (!!)

// 왜 이런 결과가 나올까요?
// some: 하나도 없으니 조건 만족하는 것도 없음 → false
// every: 모든 것이 조건 만족 (반박할 것이 없음) → true

빈 배열에서 somefalse, everytrue를 반환한다는 점을 꼭 기억해야 해요.

❌ 실수 3: 조건 함수에서 return을 빼먹기

// 잘못된 예시 - return 없음
let numbers = [1, 2, 3, 4, 5];

let badResult = numbers.some(function(num) {
    num > 3; // return이 없어요!
});
console.log(badResult); // false (항상 undefined 반환)

// 올바른 예시
let goodResult = numbers.some(function(num) {
    return num > 3; // return 필수!
});
console.log(goodResult); // true

조건 함수는 반드시 true 또는 false를 반환해야 해요.

✏️ 연습문제로 개념 다지기

배우는 것과 익히는 것 사이에는 작은 강이 하나 흐르고 있어요. 그 강을 건너는 다리가 바로 연습이죠. 우리 함께 차근차근 건너가 볼까요?

Ex1) 나이 목록에서 미성년자가 있는지 확인하고 "미성년자 발견!" 또는 "모두 성인이에요!" 메시지를 띄워보자

// 친구들의 나이 목록
let ages = [25, 17, 30, 22, 19];

// 미성년자(18세 미만)가 있는지 확인
let hasMinor = ages.some(function(age) {
    return age < 18; // 각 나이가 18세 미만인지 확인
});

// 모든 사람이 성인(18세 이상)인지 확인
let allAdults = ages.every(function(age) {
    return age >= 18; // 각 나이가 18세 이상인지 확인
});

console.log("나이들:", ages);
if (hasMinor) { // 미성년자가 있는지 확인
    console.log("미성년자 발견!");
} else {
    console.log("모두 성인이에요!");
}
console.log("검사 결과 - 미성년자 있음:", hasMinor, "모두 성인:", allAdults);

Ex2) 동물 이름에서 특별한 글자로 시작하는 동물이 있는지 확인하고 결과를 재미있게 보여주자

// 동물 이름들 목록
let animals = ["고양이", "강아지", "토끼", "말", "고릴라"];

// "고"로 시작하는 동물이 있는지 확인
let hasAnimalStartsWithGo = animals.some(function(animal) {
    return animal.startsWith("고"); // 각 동물 이름이 "고"로 시작하는지 확인
});

// 모든 동물 이름이 2글자 이상인지 확인
let allLongNames = animals.every(function(animal) {
    return animal.length >= 2; // 각 동물 이름이 2글자 이상인지 확인
});

console.log("동물들:", animals);
if (hasAnimalStartsWithGo) { // "고"로 시작하는 동물이 있는지 확인
    console.log("'고'로 시작하는 동물을 발견했어요! 🐱");
} else {
    console.log("'고'로 시작하는 동물이 없어요");
}

if (allLongNames) { // 모든 동물 이름이 2글자 이상인지 확인
    console.log("모든 동물 이름이 2글자 이상이에요! 👍");
} else {
    console.log("1글자 동물 이름이 있어요");
}

Ex3) 학생들의 성적을 검사해서 "반 전체 합격!" 또는 "추가 공부가 필요해요" 메시지를 보여주자

// 학생들의 성적 정보
let students = [
    { name: "철수", score: 85, submitted: true },
    { name: "영희", score: 92, submitted: true },
    { name: "민수", score: 58, submitted: false },
    { name: "지은", score: 76, submitted: true }
];

// 성적 검사하는 기능
function checkClassResults(studentList) {
    console.log("=== 반 성적 검사 ===");

    // 과제를 제출하지 않은 학생이 있는지 확인
    let hasNotSubmitted = studentList.some(function(student) {
        return student.submitted === false; // 각 학생이 제출하지 않았는지 확인
    });

    // 모든 학생이 60점 이상인지 확인 (제출한 학생만)
    let allPassed = studentList.every(function(student) {
        if (student.submitted) { // 제출한 학생인지 확인
            return student.score >= 60; // 점수가 60점 이상인지 확인
        }
        return false; // 제출하지 않았으면 불합격 처리
    });

    // 결과 메시지 출력
    if (hasNotSubmitted) { // 미제출 학생이 있는지 확인
        console.log("⚠️ 과제 미제출 학생이 있어요!");
    }

    if (allPassed) { // 모든 학생이 합격했는지 확인
        console.log("🎉 반 전체 합격!");
    } else {
        console.log("📚 추가 공부가 필요해요");
    }

    return { hasNotSubmitted, allPassed }; // 결과 정보 묶음 반환
}

checkClassResults(students);

📚 13단원 복습 - 비동기 처리 되돌아보기

14단원을 배우기 전에 13단원에서 배운 비동기 처리를 복습해볼까요?

복습 문제 1: setTimeout으로 시간 지연 만들기

// 3초 후에 "안녕하세요!"라는 메시지를 출력하는 코드를 작성해보세요.
console.log("시작!");

setTimeout(function() {
    console.log("안녕하세요!");
}, 3000); // 3초 = 3000밀리초

console.log("끝!");

// 출력 순서: "시작!" → "끝!" → (3초 후) "안녕하세요!"

설명: setTimeout은 정해진 시간이 지난 후에 함수를 실행시켜주는 기능이에요. 시간을 기다리는 동안 다른 코드들이 먼저 실행됩니다.

복습 문제 2: Promise로 약속 만들기

// 성공하는 약속과 실패하는 약속을 만들어보세요.
let 성공약속 = new Promise(function(resolve, reject) {
    setTimeout(function() {
        resolve("약속을 지켰어요!");
    }, 1000);
});

let 실패약속 = new Promise(function(resolve, reject) {
    setTimeout(function() {
        reject("약속을 못 지켰어요...");
    }, 1000);
});

// 약속 결과 확인하기
성공약속.then(function(result) {
    console.log("성공:", result);
});

실패약속.catch(function(error) {
    console.log("실패:", error);
});

설명: Promise는 "지금은 결과가 없지만 나중에 알려줄게"라는 약속을 나타내는 방법이에요. 성공하면 then으로, 실패하면 catch로 처리합니다.

🤔 심화 문제로 실력 확인하기

더 깊이 있는 문제들을 통해 someevery에 대한 이해를 확인해보겠습니다.

Q1. someevery를 친구에게 설명한다면 어떻게 설명하겠나요?

정답: "someevery는 반 전체 검사와 같아요. some은 '한 명이라도 숙제 안 한 사람 있어?'처럼 하나라도 해당하면 '있어요!'라고 답하는 거고, every는 '모든 사람이 숙제 다 했어?'처럼 모든 사람이 다 해야만 '네!'라고 답할 수 있는 거예요."

Q2. 다음 코드의 결과를 예측해보세요.

let arr = [];
console.log(arr.some(x => x > 0));
console.log(arr.every(x => x > 0));

정답: 첫 번째는 false, 두 번째는 true가 출력됩니다. 빈 배열에서 some은 "하나도 없으니 조건 만족하는 것도 없다"라서 false이고, every는 "모든 것이 조건을 만족한다(반박할 것이 없다)"라서 true입니다.

🧚‍♀️ 이야기로 다시 배우기: 학교의 시험 감독관 대모험

마지막으로 someevery를 하나의 이야기로 정리해볼게요.

우리 학교에 썸(Some) 선생님에브리(Every) 선생님이라는 두 명의 시험 감독관이 있었어요. 이 두 선생님은 정말 특별한 능력을 가지고 있었답니다.

어느 날, 시험이 끝나고 교장선생님이 물어보셨어요. "혹시 연필을 깜빡한 학생이 있나요?"

썸 선생님은 번개처럼 빠르게 교실을 확인하기 시작했어요. 첫 번째 학생... 연필 있음, 두 번째 학생... 연필 있음, 세 번째 학생... 연필 없음! "네, 한 명 있어요!"라고 즉시 대답했죠. 나머지 학생들은 확인하지도 않았어요. 이미 답을 찾았으니까요.

다른 날, 교장선생님이 "모든 학생이 시험을 통과했나요?"라고 물어보셨어요.

에브리 선생님이 나서서 차근차근 확인하기 시작했어요. 첫 번째 학생... 통과, 두 번째 학생... 통과, 세 번째 학생... 불합격! "아니요, 모두 통과하지 못했어요!"라고 바로 대답했습니다. 이 경우에도 나머지는 확인할 필요가 없었죠.

어떤 날은 빈 교실을 확인해야 했어요. 썸 선생님에게 "문제가 있는 학생이 있나요?"라고 물으면 "아무도 없으니 문제도 없어요(false)"라고 답했고, 에브리 선생님에게 "모든 학생이 완벽한가요?"라고 물으면 "반박할 학생이 없으니 완벽해요(true)"라고 답했어요.

이처럼 someevery빠르고 정확하고 똑똑한 검사를 통해 우리가 배열의 상황을 빠르게 파악할 수 있도록 도와주는 훌륭한 도구들이에요. 여러분도 이제 이 기능을 배웠으니, 어떤 정보 목록이든 빠르고 정확하게 검사할 수 있게 되었답니다!

✅ 학습 완료 체크리스트

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

학습 내용 이해했나요?
some과 every의 기본 개념
기본 사용법과 문법
주요 특징과 차이점
자주 하는 실수들
실전 예제 이해
13단원 복습 완료

📂 마무리 정보

오늘 배운 14.4.2 내용이 여러분의 자바스크립트 지식에 잘 저장되었나요? 다음 시간에는 더 재미있는 내용으로 만나요!

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


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