ZeliUnit은 외부 네트워크 요청 없는 0초 로컬 샌드박스에서 9대 핵심 물리 범주(길이·무게·온도·면적·부피·속도·데이터·시간·에너지)를 국제단위계(SI) 기반 매개 스케일링 배율과 섭씨(°C) 2단계 아핀 변환 브릿지로 무오류 연산하며, IEEE 754 부동소수점 오차를 방어하는 E6/G10 유효숫자 포맷터와 전(全) 단위 동시 실시간 브로드캐스팅 아키텍처를 구현했습니다.
- 1. 배경: 화성 궤도선의 교훈과 공교육·국방 현장의 단위 파편화
- 2. ZeliUnit 핵심 차원 체계: 9대 물리 범주와 SI 기준 배율 매트릭스
- 3. 선형 스케일링 vs 비선형 아핀 변환: 섭씨(°C) 브릿지 2단계 온도 알고리즘
- 4. IEEE 754 부동소수점 극복: E6/G10/N0 지능형 유효숫자 포맷터
- 5. 10진수 SI(KB, MB) vs 2진수 IEC(KiB, MiB) 데이터 스토리지 거버넌스
- 6. 전(全) 단위 동시 실시간 브로드캐스팅 및 WindowKit Always-On-Top 플로팅 UX
- 7. 실전 기술 벤치마크: 포털 웹 계산기 vs 외산 공학용 툴 vs ZeliUnit
- 8. 결론: ZeliDesk 과학·공학 온디바이스 에코시스템의 완성
1. 배경: 화성 궤도선의 교훈과 공교육·국방 현장의 단위 파편화
역사상 가장 막대한 손실을 낸 소프트웨어 버그 중 하나로 꼽히는 NASA 화성 기후 궤도선(Mars Climate Orbiter) 추락 사건은 복잡한 인공지능이나 고도의 암호화 결함이 아닌, 단순한 단위 체계(Unit System)의 불일치에서 기인했습니다. 제작사 록히드 마틴은 영미 야드-파운드 단위계의 파운드-힘-초(lbf·s)로 추진력을 계산하여 파일로 전달했고, NASA의 네비게이션 팀은 이를 국제표준 미터법인 뉴턴-초(N·s)로 해석하여 궤도를 수정했습니다. 그 결과 탐사선은 예정보다 훨씬 낮은 고도인 57km 상공의 화성 대기권에 진입하여 마찰열로 소멸했습니다.
이러한 단위 혼란은 특수한 우주 개발에만 국한되지 않습니다. 오늘날 대한민국 공교육과 국방·공공 현장에서도 매일같이 발생하고 있습니다:
- 초·중·고 과학 및 수학교육 (AIDT 교실): 초등 5학년 '다각형의 둘레와 넓이'(m², cm², km²), 중등 '힘과 운동'(m/s, km/h), 고등 물리·화학(J, kJ, cal, eV, 절대온도 K) 과정에서 학생들은 서로 다른 단위계 환산 착오로 계산 오류를 반복합니다. 또한 아파트 평수(평, 坪), 고기 한 근(600g), 한 관(3.75kg) 등 한국 고유의 전통 생활 단위와의 연결 교육도 필수적입니다.
- 한미 연합작전 및 국방 탄도학: 대한민국 국군은 미터법(km, m, m/s)을 주력으로 사용하지만, 미군 연합 전력 및 항공 작전에서는 마일(mi), 피트(ft, 항공 고도), 노트(knot, 함정 속도), 파운드(lb), 야드(yd)를 표준으로 사용합니다. 포병 사격제원 산출이나 미사일 탄도 계산 시 음속(Mach), 초속(m/s, ft/s), 해리(1,852m) 환산의 0.1% 오차는 수십 미터의 탄착군 이탈로 직결됩니다.
- 네트워크 폐쇄망과 외부 포털 계산기 사용 불가: 수능 출제실, 영재학교 실험실, 육해공군 작전실은 모두 물리적 망분리(Air-Gap) 상태입니다. 네이버나 구글의 '단위 변환기' 웹페이지에 접속할 수 없으며, 일반 윈도우 계산기는 군사용 해리나 에너지 단위(eV, BTU), 전통 척관법 단위를 지원하지 않습니다.
| 운용 환경 | 혼용되는 주요 단위계 | 환산 오류 발생 시 치명도 | 기존 수작업·상용 도구의 한계 |
|---|---|---|---|
| 초·중·고 과학 교실 | SI 단위(m, kg, s), 전통 단위(평, 근), 서구 단위(in, ft, °F) | 수능·모의고사 탐구영역 오답, 과학 원리 이해 저해 | 일반 윈도우 계산기 기능 부실, 웹 계산기 접속 통제 |
| 한미 연합 군사 작전 | 미군(야드, 피트, 마일, 노트, 파운드) vs 국군(m, km, m/s, kg) | 포병 탄착군 이탈, 항공 항법 고도 착각, 연합 작전 지연 | 인터넷 차단 폐쇄망 환경에서 0초 온디바이스 도구 부재 |
| 공공 전산실·데이터센터 | 10진수 SI(KB=1000B) vs 2진수 IEC(KiB=1024B) | 스토리지 용량 고갈 예측 실패, 백업 볼륨 파티션 단편화 | OS 표기(Windows의 1024 GiB를 GB로 표기) 혼선 방치 |
2. ZeliUnit 핵심 차원 체계: 9대 물리 범주와 SI 기준 배율 매트릭스
ZeliDesk의 ZeliUnit은 임의의 두 단위 $U_A$와 $U_B$ 사이의 $N \times (N-1)$개의 변환 수식을 하드코딩하는 원시적 방식을 철저히 배제했습니다. 단위가 10개만 되어도 90개의 수식이 필요하며 유지보수성이 파괴되기 때문입니다.
대신 현대 전산 물리학의 표준 설계인 'SI 기준 단위 매개 아키텍처(SI-Centric Normalized Architecture)'를 채택했습니다. 모든 물리 차원은 해당 범주의 국제표준 기본 단위(SI Base Unit)를 Factor = 1.0으로 정의하고, 모든 보조 단위를 이 기준 단위를 향한 1차원 선형 스케일링 배율(Scalar Multiplication Factor)로 매핑합니다:
예: 50.0 mi (Mile)"] end subgraph SI_Core["국제표준(SI) 정규화 브릿지"] SI_Val["SI 기준 물리량 (Normalized)
Value_SI = InputValue * Factor_From
예: 50.0 * 1609.344 = 80,467.2 m"] end subgraph Output_Target["목표 단위계 (To Unit)"] U_To["목표값 (Result)
Result = Value_SI / Factor_To
예: 80,467.2 / 1852.0 = 43.4488 nm"] end subgraph Broadcast_Space["전(全) 단위 동시 브로드캐스팅"] U_All["ObservableCollection<UnitConversionItem>
• mm, cm, m, km
• in, ft, yd, mi, nautical mile"] end U_From -->|Factor_From 곱연산| SI_Core SI_Core -->|Factor_To 나눗셈| Output_Target SI_Core -.->|병렬 동시 사상| Broadcast_Space style SI_Core fill:#0f2b48,stroke:#38bdf8,stroke-width:2px,color:#f8fafc style Broadcast_Space fill:#06261f,stroke:#10b981,stroke-width:2px,color:#f8fafc
실제 ZeliUnitWindow.xaml.cs에 구현된 9대 핵심 물리 범주의 SI 기준 스칼라 매트릭스는 다음과 같습니다:
private readonly Dictionary<string, List<(string Name, double Factor)>> _categories = new()
{
[Loc.Get("Unit_CatLength")] = new() // 기준: m (1.0)
{
("mm", 0.001), ("cm", 0.01), ("m", 1.0), ("km", 1000.0),
("in", 0.0254), ("ft", 0.3048), ("yd", 0.9144), ("mi", 1609.344),
("nautical mile (해리)", 1852.0),
},
[Loc.Get("Unit_CatWeight")] = new() // 기준: kg (1.0)
{
("mg", 0.000001), ("g", 0.001), ("kg", 1.0), ("t", 1000.0),
("oz", 0.0283495), ("lb", 0.453592),
("근 (600g)", 0.6), ("관 (3.75kg)", 3.75),
},
[Loc.Get("Unit_CatSpeed")] = new() // 기준: m/s (1.0)
{
("m/s", 1.0), ("km/h", 0.277778), ("mph", 0.44704),
("knot (노트)", 0.514444), ("ft/s", 0.3048), ("mach (음속)", 343.0),
},
[Loc.Get("Unit_CatEnergy")] = new() // 기준: J (1.0)
{
("J", 1.0), ("kJ", 1000.0), ("cal", 4.184), ("kcal", 4184.0),
("Wh", 3600.0), ("kWh", 3600000.0), ("BTU", 1055.06),
("eV (전자볼트)", 1.602e-19),
},
// 면적(m² 기준, 평=3.305785, ha=10000), 부피(m³ 기준), 데이터(Byte 기준), 시간(s 기준)
};
3. 선형 스케일링 vs 비선형 아핀 변환: 섭씨(°C) 브릿지 2단계 온도 알고리즘
단위 변환 시스템을 구현할 때 초보 엔지니어가 가장 흔하게 범하는 실수는 "모든 단위는 스칼라 곱연산만으로 변환될 수 있다"는 착각입니다. 길이, 질량, 시간, 에너지는 원점(0)이 '물리적 무(無)'를 가리키는 비율 척도(Ratio Scale)이므로 $y = a \cdot x$라는 선형 관계가 완벽히 성립합니다.
그러나 **온도(Temperature)**는 등간 척도(Interval Scale)에 해당하며, 각 단위계마다 영점(Zero Point)의 물리적 기준이 다릅니다:
- 섭씨 (°C): 1기압 하에서 물의 어는점을 0°C, 끓는점을 100°C로 정의.
- 화씨 (°F): 물의 어는점을 32°F, 끓는점을 212°F로 정의 ($T_F = T_C \times \frac{9}{5} + 32$).
- 절대온도 켈빈 (K): 분자 열운동이 완전히 정지하는 절대영도를 0K로 정의 ($T_K = T_C + 273.15$).
따라서 온도는 단순 곱셈이 아닌 아핀 변환(Affine Transformation, $y = a \cdot x + b$)을 요구합니다. ZeliUnit은 일반 선형 물리량 엔진과 온도를 완전히 분리하고, 섭씨(°C)를 허브(Hub)로 삼는 2단계 정규화 파이프라인을 구축했습니다:
if (_currentCategory == Loc.Get("Unit_CatTemperature"))
{
// 1단계: 임의의 입력 단위(°C, °F, K)를 기준 섭씨(°C)로 정규화
double resultC = ConvertToC(inputValue, fromIdx);
// 2단계: 기준 섭씨(°C)를 목표 단위로 역변환
double result = ConvertFromC(resultC, toIdx);
TxtToValue.Text = FormatNumber(result);
// 3단계: 전체 온도 단위계 실시간 동시 브로드캐스팅
_allUnits.Clear();
_allUnits.Add(new UnitConversionItem { UnitName = "°C (섭씨)", Value = FormatNumber(resultC) });
_allUnits.Add(new UnitConversionItem { UnitName = "°F (화씨)", Value = FormatNumber(resultC * 9.0 / 5.0 + 32) });
_allUnits.Add(new UnitConversionItem { UnitName = "K (켈빈)", Value = FormatNumber(resultC + 273.15) });
}
private double ConvertToC(double value, int unitIndex) => unitIndex switch
{
0 => value, // °C -> °C
1 => (value - 32) * 5.0 / 9.0, // °F -> °C
2 => value - 273.15, // K -> °C
_ => value
};
private double ConvertFromC(double celsius, int unitIndex) => unitIndex switch
{
0 => celsius, // °C -> °C
1 => celsius * 9.0 / 5.0 + 32, // °C -> °F
2 => celsius + 273.15, // °C -> K
_ => celsius
};
4. IEEE 754 부동소수점 극복: E6/G10/N0 지능형 유효숫자 포맷터
컴퓨터의 2진 부동소수점(Binary Floating-Point, IEEE 754) 연산 체계에서는 $0.1$이나 $0.001$과 같은 10진 소수가 2진수로 무한소수가 되어, 환산 결과에 3.0000000000000004 또는 0.00000000000000000016020000000000002 같은 부동소수점 고스트 비트(Ghost Bits)가 발생합니다. 이는 수능 과학 탐구 문제 풀이나 정밀 국방 탄도표 작성 시 심각한 시각적 불신을 초래합니다.
반대로 무조건 소수점 둘째 자리나 넷째 자리로 잘라버리는(Truncation) 방식을 사용하면, 원자 물리학의 전자볼트($1.602 \times 10^{-19}\text{ J}$)나 미세 나노미터($10^{-9}\text{ m}$) 값이 그냥 0.00으로 증발해버리는 치명적 결함이 발생합니다.
ZeliUnit은 3단계 임계값 판별을 수행하는 지능형 유효숫자 포맷팅 파이프라인(FormatNumber)을 개발하여 극대수, 극소수, 정수, 실수를 수학적으로 완벽하게 표현합니다:
private static string FormatNumber(double value)
{
// 1. 극소수 (|x| < 10^-6) 및 극대수 (|x| > 10^9): 공학용 지수 표기법 (E6)
// 예: 전자볼트 1.602000E-19, 테라바이트 1.099512E+12
if (Math.Abs(value) < 0.000001 && value != 0)
return value.ToString("E6", CultureInfo.InvariantCulture);
if (Math.Abs(value) > 999999999)
return value.ToString("E6", CultureInfo.InvariantCulture);
// 2. 완전 정수: 불필요한 .0000 제거 및 3자리 콤마 (N0)
// 예: 1000 m -> 1,000, 1000000 m -> 1,000,000
if (value == Math.Floor(value) && Math.Abs(value) < 1e15)
return value.ToString("N0", CultureInfo.InvariantCulture);
// 3. 일반 실수: 최대 10자리 유효숫자 일반 포맷 (G10)으로 끝자리 0 자동 정리
// 예: 3.0000000004 -> 3, 3.14159265 -> 3.14159265
return value.ToString("G10", CultureInfo.InvariantCulture);
}
5. 10진수 SI(KB, MB) vs 2진수 IEC(KiB, MiB) 데이터 스토리지 거버넌스
공공기관 전산실과 학교 컴퓨터실에서 가장 많은 혼란을 일으키는 대표적 단위 문제가 바로 "내가 산 1TB 하드디스크를 윈도우에 꽂으면 왜 931GB로 나오는가?"입니다.
국제전기기술위원회(IEC 60027-2)와 국제단위계(SI) 표준에 따르면, Kilo는 엄격히 $10^3 = 1000$이며, 2진수 $2^{10} = 1024$는 Kibi (KiB)로 명명해야 합니다. 그러나 마이크로소프트 윈도우는 역사적 호환성을 이유로 $1024$ 바이트 단위를 여전히 'KB, MB, GB'라는 SI 기호로 표시하여 제조사(1000 기반)와 OS(1024 기반) 간의 불일치를 방치해 왔습니다.
*Windows 탐색기에서는 931 GB로 오기"] end Raw --> SI_Calc --> SI_Res Raw --> IEC_Calc --> IEC_Res style SI_Res fill:#06261f,stroke:#10b981,stroke-width:2px,color:#f8fafc style IEC_Res fill:#0f2b48,stroke:#38bdf8,stroke-width:2px,color:#f8fafc
ZeliUnit은 Unit_CatData 카테고리에서 10진수 SI 단위(KB, MB, GB, TB)와 2진수 IEC 단위(KiB, MiB, GiB, TiB), 그리고 비트(bit = 0.125 Byte)를 엄격히 분리하여 병렬 배치했습니다:
KB (1000): $1,000\text{ Byte}$ (네트워크 대역폭 및 패킷 전송 규격)KiB (1024): $1,024\text{ Byte}$ (RAM 캐시 및 가상 메모리 페이징)MB (1000²): $1,000,000\text{ Byte}$ vsMiB (1024²): $1,048,576\text{ Byte}$GB (1000³): $10^9\text{ Byte}$ vsGiB (1024³): $1,073,741,824\text{ Byte}$TB (1000⁴): $10^{12}\text{ Byte}$ vsTiB (1024⁴): $1,099,511,627,776\text{ Byte}$
이를 통해 학생들은 정보 교과 수업에서 2진수 컴퓨팅의 원리를 직관적으로 체득할 수 있으며, 전산실 관리자는 스토리지 볼륨 할당 시 바이트 오차 없는 완벽한 파티션 거버넌스를 수립할 수 있습니다.
6. 전(全) 단위 동시 실시간 브로드캐스팅 및 WindowKit Always-On-Top 플로팅 UX
전통적인 상용 단위 계산기는 사용자가 콤보박스에서 'From 단위'와 'To 단위'를 하나하나 바꿀 때마다 버튼을 눌러야 결과를 확인할 수 있었습니다. 예를 들어 교사가 수업 중 "100 km/h는 초속(m/s)으로 몇이고, 마일(mph)로는 몇이며, 음속(Mach)으로는 몇일까?"를 설명하려면 콤보박스를 3번 연속으로 교체하며 연산을 반복해야 했습니다.
ZeliUnit은 WinUI 3의 고성능 ObservableCollection<UnitConversionItem>과 XAML ListView 바인딩을 활용하여, 단 한 번의 키 입력(`TextChanged`) 즉시 해당 범주의 모든 단위로 병렬 사상(Parallel Projection)되는 전 단위 동시 브로드캐스팅 UI를 구축했습니다:
// 입력값 파싱 즉시 SI 기준값으로 정규화한 뒤, 등록된 전체 단위 목록으로 단일 패스 순회
double siValue = inputValue * fromFactor;
_allUnits.Clear();
foreach (var u in units)
{
double converted = siValue / u.Factor;
_allUnits.Add(new UnitConversionItem
{
UnitName = u.Name,
Value = FormatNumber(converted)
});
}
또한 교안 작성(HWP/Word)이나 CAD 도면 설계, 시뮬레이터 구동 중에도 방해받지 않고 보조 계산기로 즉시 활용할 수 있도록 ZeliDesk.Services.WindowKit과 OverlappedPresenter를 통합했습니다:
- WindowKit 세션 영속화 (
WindowKit.Attach(this, "zeliunit")): 교사가 모니터 구석에 배치한 550×800 크기와 윈도우 절대 좌표를 레지스트리에 자동 보존하여 다음 실행 시 0초 복원. - Always-On-Top 핀 토글 (
BtnPin_Click): 다른 전체화면 창을 띄워도 항상 최상단에 떠 있도록 고정하여, 문서를 타이핑하면서 실시간 수치를 대조 가능. - 원클릭 클립보드 복사 (
BtnCopy_Click): 변환된 정밀 수치를Windows.ApplicationModel.DataTransfer.DataPackage를 통해 클립보드로 즉시 복사.
7. 실전 기술 벤치마크: 포털 웹 계산기 vs 외산 공학용 툴 vs ZeliUnit
| 비교 항목 | 네이버/구글 포털 단위 변환기 | 외산 설치형 공학 도구 (Mathcad 등) | ZeliDesk ZeliUnit (온디바이스) |
|---|---|---|---|
| 폐쇄망(Air-Gap) 구동 | 불가 (인터넷 필수) | 가능 (단, 대용량 무거운 툴) | 100% 온디바이스 완전 구동 (외부 패킷 0B) |
| 한국 전통 단위 지원 | 일부 지원 (평, 근) | 미지원 (서구 중심 단위계) | 완벽 지원 (평, 근 600g, 관 3.75kg) |
| 국방·특수 단위 지원 | 미지원 (해리, 마하 등 부실) | 수식 스크립트 작성 필요 | 기본 내장 (해리 1852m, 마하, 노트, eV, BTU) |
| 전(全) 단위 동시 확인 | 1:1 단위만 표시 (반복 클릭 필요) | 테이블 매트릭스 수식 정의 필요 | 키 입력 0초 즉시 전 단위 리스트 브로드캐스팅 |
| 데이터 단위 정밀성 | 1000/1024 혼용 모호 표기 | 단위 표기 복잡 | SI(1000) vs IEC(1024) 명확한 병렬 구분 |
| 메모리 점유율 | 브라우저 탭 150MB~300MB | 1GB~3GB 고중량 | 18MB 극경량 네이티브 WinUI 3 샌드박스 |
| 상시 플로팅 UX | 브라우저 창 분리 필요 | 작업 표시줄 상시 상주 불가 | WindowKit 핀 고정 (Always-On-Top) 기본 지원 |
8. 결론: ZeliDesk 과학·공학 온디바이스 에코시스템의 완성
단위 환산은 겉보기에 단순해 보이지만, 실제로는 수학적 정밀도(IEEE 754), 척도 이론(선형 vs 아핀), 그리고 사용자 반응성(0초 브로드캐스팅)이 복합적으로 얽혀 있는 엔지니어링의 기본기입니다.
ZeliDesk는 공교육 교실의 디지털 전환(AIDT)과 국가 안보를 책임지는 국방 연구진이 외산 클라우드의 유료 구독이나 네트워크 단절에 구애받지 않고, 가장 신뢰할 수 있는 도구로 업무와 연구에 몰입할 수 있도록 온디바이스 데스크톱 도구 라인업을 완성해 나가고 있습니다:
- ZeliNote (#942): 마크다운 교원 연구노트와 국방 문서 보안 거버넌스.
- ZeliOffice (#997): 한글 2024 COM 7대 난제 및 Excel 50배 벌크 자동화.
- ZeliCsv (#938): 10만 행 NEIS 학생 명부와 군수 자원 장부 가상화 정제.
- ZeliJson (#937): 공공 API 및 군 통신 전문 제로 할당 고속 검증.
- ZeliPdf (#936): 출제 시험지와 작전 교범 텍스트 추출 및 메타데이터 포렌식 감사.
- ZeliXML (#935): 전자정부 표준프레임워크 및 국방 무기체계 ICD 온디바이스 검증.
- ZeliUnit (#934): 초·중·고 과학/수학교육과 국방 탄도·항법 국제단위계(SI) 고정밀 환산 엔진.
소프트웨어의 사소한 단위 오차가 1억 달러의 탐사선을 파괴하듯, 작은 정밀도가 국가의 기술 경쟁력을 결정짓습니다. ZeliDesk는 앞으로도 대한민국 현장의 엔지니어와 교사, 연구원들을 위한 가장 견고한 온디바이스 기반을 묵묵히 닦아 나갈 것입니다.