2026년 02월 12일

😀 숫자가 8개밖에 없다면?

Java Spring Boot
Cover Image

숫자가 8개밖에 없다면?

💡 핵심 질문: 9 다음이 왜 10인가?
당연하다고 생각한 것을 정확히 이해하는가, 암기만 하고 있는가의 차이가 수학 실력을 결정한다.


🎯 숫자 vs 수: 가장 중요한 개념

숫자는 단 10개

0, 1, 2, 3, 4, 5, 6, 7, 8, 9

이것이 전부다.

무한한 수의 표현

356 = 3(숫자) + 5(숫자) + 6(숫자)의 조합
1024 = 1 + 0 + 2 + 4의 조합
999,999 = 9를 여러 자리에 배치

→ 10개의 숫자로 무한한 수를 표현

핵심:

숫자(Digit) = 기호 (10개만 존재)
수(Number) = 값 (무한개 존재)
자릿값(Place Value) = 숫자의 위치가 결정하는 값

🔍 진짜 이해 vs 단순 암기

❌ 단순 암기

9 다음은 10
99 다음은 100
999 다음은 1000

→ 패턴만 외움
→ 왜 그런지 모름

✅ 진짜 이해

9 다음은?
→ 숫자 1개로 표현 불가능
→ 숫자 2개 필요
→ 십의 자리 1, 일의 자리 0
→ 10

99 다음은?
→ 숫자 2개로 표현 불가능
→ 숫자 3개 필요
→ 백의 자리 1, 나머지 0
→ 100

💡 자릿값 이해도 테스트: 연산 방식

문제: 829 - 37 = ?

방식 1: 자릿값 모르는 경우

9 - 7 = 2
2 - 3 = ? (안 되네)
앞에서 1 빌려오기
12 - 3 = 9
8은 1 빌려줬으니 7
답: 792

특징:

방식 2: 자릿값 이해하는 경우

37은 29보다 8 큼
829 = 800 + 29
800 - 8 = 792
답: 792

특징:

개발자 관점에서 보는 두 방식

// 방식 1: 절차적 알고리즘 (단순 암기)
public int subtract1(int a, int b) {
    // 자릿수별로 처리
    // 받아내림 처리
    // ... 복잡한 절차
    return result;
}

// 방식 2: 본질 이해 (자릿값 활용)
public int subtract2(int a, int b) {
    // 수의 구조 파악
    // 효율적 계산
    return a - b;  // 간단!
}

// 이해의 깊이가 코드의 품질을 결정한다

🚀 자릿값 완벽 이해: 진법 체험

실험 1: 8진법 세계 (숫자 8개)

상황: 8과 9가 사라진 세상

사용 가능한 숫자: 0, 1, 2, 3, 4, 5, 6, 7

숫자를 세어보자:

1, 2, 3, 4, 5, 6, 7, ?

8이 없다!
→ 숫자 1개로 표현 불가
→ 숫자 2개 사용: 10

10, 11, 12, 13, 14, 15, 16, 17, ?

18이 없다!
→ 십의 자리 +1: 20

20, 21, 22, 23, 24, 25, 26, 27, 30
...
70, 71, 72, 73, 74, 75, 76, 77, ?

78이 없다!
→ 숫자 2개로 표현 불가
→ 숫자 3개 사용: 100

8진법 카운팅:

10진법:  0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15
8진법:   0  1  2  3  4  5  6  7  10 11  12  13  14  15  16  17

개발자라면 익숙한 이야기

// 2진법 (컴퓨터의 언어)
0, 1, 10, 11, 100, 101, 110, 111, 1000, ...

// 16진법 (색상 코드)
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, ...
#FF5733 = RGB(255, 87, 51)

// 10진법 (우리가 사용)
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...

→ 모두 같은 원리!

실험 2: 11진법 세계 (숫자 11개)

상황: 9 다음에 ⭐️ 추가

사용 가능한 숫자: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ⭐️

숫자를 세어보자:

1, 2, 3, 4, 5, 6, 7, 8, 9, ⭐️, ?

⭐️ 다음은?
→ 숫자 1개로 표현 불가
→ 숫자 2개 사용: 10

10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1⭐️, ?

1⭐️ 다음은?
→ 십의 자리 +1: 20

...

97, 98, 99, 9⭐️, ?

9⭐️ 다음은?
→ 십의 자리 +1: ⭐️0

⭐️0, ⭐️1, ⭐️2, ⭐️3, ⭐️4, ⭐️5, ⭐️6, ⭐️7, ⭐️8, ⭐️9, ⭐️⭐️, ?

⭐️⭐️ 다음은?
→ 숫자 2개로 표현 불가
→ 숫자 3개 사용: 100

11진법 카운팅:

10진법:  0  1  2  3  4  5  6  7  8  9  10  11  12  13
11진법:  0  1  2  3  4  5  6  7  8  9  ⭐️  10  11  12

🔢 진법의 본질: 자릿값 시스템

10진법의 자릿값

356 (10진법)
    = 3 × 100 + 5 × 10 + 6 × 1
    = 3 × 10² + 5 × 10¹ + 6 × 10⁰

    ┌─────────┬─────────┬─────────┐
    │  백의자리 │  십의자리 │  일의자리 │
    │   3      │   5      │   6      │
    │  ×100    │  ×10     │  ×1      │
    └─────────┴─────────┴─────────┘

8진법의 자릿값

356 (8진법)
    = 3 × 64 + 5 × 8 + 6 × 1
    = 3 × 8² + 5 × 8¹ + 6 × 8⁰
    = 192 + 40 + 6
    = 238 (10진법)

    ┌─────────┬─────────┬─────────┐
    │ 64의자리 │ 8의자리  │ 1의자리  │
    │   3      │   5      │   6      │
    │  ×64     │  ×8      │  ×1      │
    └─────────┴─────────┴─────────┘

2진법의 자릿값 (컴퓨터)

1011 (2진법)
    = 1 × 8 + 0 × 4 + 1 × 2 + 1 × 1
    = 1 × 2³ + 0 × 2² + 1 × 2¹ + 1 × 2⁰
    = 8 + 0 + 2 + 1
    = 11 (10진법)

    ┌─────────┬─────────┬─────────┬─────────┐
    │ 8의자리  │ 4의자리  │ 2의자리  │ 1의자리  │
    │   1      │   0      │   1      │   1      │
    │  ×8      │  ×4      │  ×2      │  ×1      │
    └─────────┴─────────┴─────────┴─────────┘

💻 개발자 관점: 진법 변환 알고리즘

10진수 → N진수 변환

public class BaseConverter {

    /**
     * 10진수를 N진수로 변환
     * @param decimal 10진수
     * @param base 변환할 진법 (2-36)
     * @return N진수 문자열
     */
    public static String toBase(int decimal, int base) {
        if (decimal == 0) return "0";

        StringBuilder result = new StringBuilder();
        String digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        while (decimal > 0) {
            int remainder = decimal % base;  // 나머지
            result.insert(0, digits.charAt(remainder));
            decimal = decimal / base;  // 몫
        }

        return result.toString();
    }

    /**
     * N진수를 10진수로 변환
     * @param number N진수 문자열
     * @param base 현재 진법
     * @return 10진수
     */
    public static int toDecimal(String number, int base) {
        int result = 0;
        String digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        for (int i = 0; i < number.length(); i++) {
            int digit = digits.indexOf(number.charAt(i));
            int position = number.length() - 1 - i;
            result += digit * Math.pow(base, position);
        }

        return result;
    }
}

// 사용 예시
System.out.println(BaseConverter.toBase(255, 2));   // "11111111"
System.out.println(BaseConverter.toBase(255, 8));   // "377"
System.out.println(BaseConverter.toBase(255, 16));  // "FF"

System.out.println(BaseConverter.toDecimal("FF", 16));    // 255
System.out.println(BaseConverter.toDecimal("377", 8));    // 255
System.out.println(BaseConverter.toDecimal("11111111", 2)); // 255

🎮 진법 연습 문제

문제 1: 8진법 덧셈

8진법에서 15 + 6 = ?

풀이:
15 (8진법) = 1×8 + 5×1 = 13 (10진법)
6 (8진법) = 6 (10진법)
13 + 6 = 19 (10진법)

19를 8진법으로?
19 ÷ 8 = 2 나머지 3
2 ÷ 8 = 0 나머지 2

답: 23 (8진법)

검증:

  1 5
+   6
-----
  2 3

문제 2: 11진법 곱셈

11진법에서 ⭐️ × ⭐️ = ?
(⭐️를 A로 표기)

풀이:
A (11진법) = 10 (10진법)
10 × 10 = 100 (10진법)

100을 11진법으로?
100 ÷ 11 = 9 나머지 1
9 ÷ 11 = 0 나머지 9

답: 91 (11진법)

문제 3: 8진법 구구단 (칠칠단)

7 × 1 = 7
7 × 2 = 16   (14를 8진법으로)
7 × 3 = 25   (21을 8진법으로)
7 × 4 = 34   (28을 8진법으로)
7 × 5 = 43   (35을 8진법으로)
7 × 6 = 52   (42을 8진법으로)
7 × 7 = 61   (49를 8진법으로)

🔬 실전 활용: 왜 중요한가?

1. 수의 구조 이해

// 잘못된 이해
int number = 123;
// "그냥 123이야"

// 올바른 이해
int number = 123;
// = 1 × 100 + 2 × 10 + 3 × 1
// = 백의 자리 1, 십의 자리 2, 일의 자리 3

2. 알고리즘적 사고

// 각 자릿수의 합 구하기
public int sumOfDigits(int number) {
    int sum = 0;
    while (number > 0) {
        sum += number % 10;  // 일의 자리 추출
        number /= 10;        // 나머지 자릿수로 이동
    }
    return sum;
}

// 123 → 1 + 2 + 3 = 6
// 자릿값 개념 없이는 이해 불가능!

3. 진법 변환의 실용성

// IP 주소
192.168.1.1 (10진법)
= 11000000.10101000.00000001.00000001 (2진법)

// 색상 코드
#FF5733 (16진법)
= RGB(255, 87, 51) (10진법)

// 파일 권한 (8진법)
chmod 755 file.txt
= 111 101 101 (2진법)
= rwx r-x r-x

4. 효율적 계산

// 2의 거듭제곱 판별
public boolean isPowerOfTwo(int n) {
    // 자릿값 이해가 있으면 비트 연산 이해 가능
    return n > 0 && (n & (n - 1)) == 0;
}

// 8은 2의 거듭제곱
// 1000 (2진법) & 0111 (2진법) = 0000

📊 이해도 차이가 만드는 결과

초등학교: 작은 차이

암기형 학생:
8 + 7 = ?
"8부터 세기: 9, 10, 11, 12, 13, 14, 15"

이해형 학생:
8 + 7 = ?
"7에서 2 떼서 8에 더하면 10, 5 남음 → 15"

차이: 몇 초의 시간 차이

중학교: 차이 누적

암기형 학생:
음수, 분수, 지수 개념에서 혼란
→ 방정식 풀이 어려움

이해형 학생:
자릿값 → 음수 → 분수 → 지수
→ 자연스러운 확장

차이: 학습 속도와 이해도 격차

고등학교: 역전 불가능

암기형 학생:
미적분, 확률통계에서 완전 막힘
→ 2배, 3배 공부해도 따라잡기 어려움

이해형 학생:
탄탄한 기초 → 새로운 개념 빠른 습득
→ 효율적 학습

차이: 사고력 자체의 격차


🎯 핵심 요약

자릿값의 본질

10진법에서 9 다음이 10인 이유:
    ↓
숫자 1개로 표현 불가능
    ↓
자리를 하나 올림
    ↓
십의 자리 1, 일의 자리 0
    ↓
10

진법의 원리

진법사용 숫자 개수자릿값예시
2진법2개 (0, 1)2의 거듭제곱1011 = 11
8진법8개 (0-7)8의 거듭제곱377 = 255
10진법10개 (0-9)10의 거듭제곱255 = 255
16진법16개 (0-F)16의 거듭제곱FF = 255

이해 vs 암기

암기:
"9 다음은 10"
"99 다음은 100"
→ 패턴만 외움
→ 새로운 상황에 적용 불가

이해:
"자릿수가 부족하면 자리를 올린다"
→ 모든 진법에 적용 가능
→ 확장 가능한 사고

💭 실천 가이드

자녀 교육 시

나쁜 접근:

❌ "9 다음은 10이야, 외워"
❌ "이렇게 계산하는 거야, 따라해"
❌ "빨리 풀어"

좋은 접근:

✅ "9 다음에 뭘 써야 할까? 왜?"
✅ "숫자가 8개만 있다면?"
✅ "다른 방법은 없을까?"

자기 점검 질문

개발자를 위한 연습

// 실습 1: 진법 변환기 구현
public class BaseConverter {
    // 10진수 → N진수
    // N진수 → 10진수
}

// 실습 2: N진법 계산기
public class BaseCalculator {
    // N진법 덧셈
    // N진법 뺄셈
    // N진법 곱셈
}

// 실습 3: 비트 연산 이해
public class BitOperations {
    // 비트 연산이 2진법 연산임을 이해
}

🎁 보너스: 재미있는 진법 이야기

12진법 (Dozenal)

왜 12진법이 편할까?

12는 약수가 많다:
12 = 1, 2, 3, 4, 6, 12

반으로 나누기: 12 ÷ 2 = 6
3등분: 12 ÷ 3 = 4
4등분: 12 ÷ 4 = 3

→ 시간 (12시간, 60분 = 12×5)
→ 달 (12개월)
→ 각도 (360도 = 12×30)

60진법 (Babylonian)

고대 바빌로니아:

60진법 사용
→ 시간: 60초, 60분
→ 각도: 360도 (60×6)
→ 지금도 사용 중!

20진법 (Vigesimal)

마야 문명:

손가락 + 발가락 = 20
→ 20진법 사용
→ 달력 계산

🔚 마지막 메시지

당연하다고 생각한 것을 다시 생각하라

"9 다음은 10이야" (암기)
    ↓
"왜 9 다음이 10일까?" (질문)
    ↓
"숫자로 표현 불가능 → 자리 올림" (이해)
    ↓
"모든 진법에 적용 가능" (확장)

작은 차이가 큰 격차를 만든다

초등학교: 몇 초 차이
    ↓
중학교: 학습 속도 차이
    ↓
고등학교: 사고력 차이
    ↓
역전 불가능한 격차

Remember:

수학은 편법이 통하지 않는다
한 단계씩 제대로 이해하며 올라가야 한다
당연한 것에 대한 이해가 실력을 결정한다

📝 학습 체크리스트

기초 개념:

진법 이해:

실전 활용:

개발자 추가:

← 목록으로 돌아가기