숫자가 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개만 있다면?"
✅ "다른 방법은 없을까?"
자기 점검 질문
- 9 다음이 왜 10인지 설명할 수 있는가?
- 받아올림/받아내림의 원리를 아는가?
- 8진법에서 7 다음이 무엇인지 아는가?
- 자릿값을 실제 계산에 활용할 수 있는가?
- 다른 진법으로 확장할 수 있는가?
개발자를 위한 연습
// 실습 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:
수학은 편법이 통하지 않는다
한 단계씩 제대로 이해하며 올라가야 한다
당연한 것에 대한 이해가 실력을 결정한다
📝 학습 체크리스트
기초 개념:
- 숫자와 수의 차이를 설명할 수 있다
- 자릿값의 의미를 이해한다
- 9 다음이 왜 10인지 설명할 수 있다
진법 이해:
- 8진법에서 숫자를 셀 수 있다
- 11진법에서 숫자를 셀 수 있다
- N진법의 원리를 이해한다
실전 활용:
- 자릿값을 계산에 활용할 수 있다
- 진법 변환을 할 수 있다
- 다른 상황에 확장할 수 있다
개발자 추가:
- 2진법, 16진법을 이해한다
- 비트 연산과 진법의 관계를 안다
- 진법 변환 알고리즘을 구현할 수 있다