형 변환과 변환 함수
문자열과 숫자 사이의 자동 형 변환과 명시적인 tonumber/tostring 사용법을 배웁니다.
형 변환과 변환 함수은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
형 강제 변환이란 무엇인가요?
형 강제 변환은 문맥상 필요할 때 값을 한 유형에서 다른 유형으로 자동 변환하는 것입니다. Lua는 두 가지 특정 방향으로 형을 강제 변환합니다. 산술 문맥에서는 문자열에서 숫자로, 연결 문맥에서는 숫자에서 문자열로 변환합니다.
JavaScript와 달리 Lua의 형 강제 변환은 제한적이고 예측 가능합니다. 불리언을 숫자로, 테이블을 문자열로 자동 변환하지 않습니다.
-- String to number (arithmetic context)
print("10" + 5) -- 15 (coerced)
print("3.14" * 2) -- 6.28
-- Number to string (concatenation context)
print(10 .. "px") -- 10px
print(3.14 .. "!") -- 3.14!
-- No boolean coercion
-- print(true + 1) -- ERROR!문자열에서 숫자로 변환하는 규칙
산술 표현식에 문자열이 나타나면 Lua는 문자열을 숫자로 변환하려고 시도합니다. 문자열이 유효한 숫자를 나타내지 않으면 실행 중 오류가 발생합니다. 유효한 숫자 문자열에는 정수("42"), 부동 소수점 수("3.14"), 16진수("0xff"), 과학적 표기법("1e3")이 포함됩니다.
앞뒤에 공백이 있는 문자열도 허용됩니다. Lua가 형 강제 변환 중 공백을 제거합니다.
print("42" + 0) -- 42 (integer)
print("3.14" + 0) -- 3.14 (float)
print("0xff" + 0) -- 255 (hex)
print(" 10 " + 0) -- 10 (whitespace ok)
print("1e3" + 0) -- 1000.0
-- This will error:
-- print("hello" + 0) -- attempt to perform arithmetic on a string value숫자에서 문자열로 변환
숫자를 ..로 연결하면 Lua가 숫자를 문자열로 자동 변환합니다. 정수는 십진수 표현이 되고, 부동 소수점 수에는 소수 자릿수가 추가될 수 있습니다. 형식을 정확하게 제어하려면 암시적 형 강제 변환에 의존하지 말고 항상 tostring() 또는 string.format()을 사용하십시오.
print(10 .. "!") -- 10!
print(3.14 .. "!") -- 3.14!
print(1/3 .. "!") -- 0.33333333333333!
-- Explicit is better for precision
print(string.format("%.2f", 1/3)) -- 0.33
print(tostring(10)) -- 10
print(tostring(10.0)) -- 10.0tonumber(): 명시적 변환
tonumber(v)는 값을 숫자로 명시적으로 변환합니다. 변환에 성공하면 변환된 숫자를 반환하고, 실패하면 nil을 반환하며 오류를 발생시키지 않습니다. 정수 해석에 선택적 진법(2~36)을 지정할 수 있으므로 2진수, 8진수, 16진수로 변환할 수 있습니다.
사용자 입력을 처리할 때는 항상 tonumber()의 반환 값이 nil인지 확인하십시오.
print(tonumber("42")) -- 42
print(tonumber("3.14")) -- 3.14
print(tonumber("0xFF")) -- 255
print(tonumber("hello")) -- nil (no error!)
print(tonumber(true)) -- nil
-- Base conversion
print(tonumber("ff", 16)) -- 255
print(tonumber("11", 2)) -- 3 (binary)
print(tonumber("77", 8)) -- 63 (octal)tostring(): 명시적 변환
tostring(v)는 모든 값을 문자열로 변환합니다. 숫자는 십진수 또는 과학적 표기법 문자열로 변환됩니다. 불리언은 "true" 또는 "false"로 변환됩니다. nil은 "nil"을 반환합니다. 테이블과 함수는 __tostring 메타메서드가 정의되어 있지 않으면 "table: 0x..."와 같은 주소를 반환합니다.
print(tostring(42)) -- 42
print(tostring(3.14)) -- 3.14
print(tostring(true)) -- true
print(tostring(false)) -- false
print(tostring(nil)) -- nil
print(tostring({})) -- table: 0x...
-- Useful for safe concatenation
local val = nil
local msg = "Value: " .. tostring(val)
print(msg) -- Value: nilmath.tointeger()
math.tointeger(x)(Lua 5.3 이상)는 값이 정확한 정수 표현을 가질 때만 부동 소수점을 정수로 변환합니다. 변환으로 정밀도가 손실되면 nil을 반환합니다. 이는 항상 성공하지만 조용히 값을 잘라낼 수 있는 math.floor()보다 안전합니다.
정확한 정수가 필요한 API와 연동하는 경우처럼 엄격한 정수 검증이 필요할 때 사용하십시오.
print(math.tointeger(5.0)) -- 5 (exact)
print(math.tointeger(5.5)) -- nil (not exact)
print(math.tointeger(2^53)) -- 9007199254740992
-- Contrast with math.floor
print(math.floor(5.9)) -- 5 (truncates)
print(math.floor(5.0)) -- 5
-- Check before use
local n = math.tointeger(val) or error("need integer")비교에서의 형 강제 변환
Lua는 동등성 비교에서 형을 강제 변환하지 않습니다. 피연산자의 유형이 다르므로 1 == "1"은 항상 false입니다. 그러나 관계 연산자(<, > 등)는 문자열과 숫자 사이의 형 강제 변환을 일으키지만, 두 피연산자의 유형이 같을 때만 가능합니다. 순서 비교에서 유형을 섞으면 오류가 발생합니다.
print(1 == "1") -- false (no coercion)
print(1 == 1.0) -- true (int/float equal)
-- Ordering: same type only
print("abc" < "abd") -- true (string compare)
print(1 < 2) -- true (number compare)
-- This ERRORS: mixing string and number
-- print(1 < "2") -- attempt to compare number with string실습: 사용자 입력 해석
Lua 프로그램에서 매우 흔한 패턴은 사용자 입력에서 문자열을 읽은 다음(예: io.read() 사용) 숫자로 변환하는 것입니다. 잘못된 입력을 우아하게 처리하여 프로그램이 중단되지 않도록 항상 tonumber()를 사용하고 nil인지 확인하십시오.
-- Safe input parsing pattern
local function parseNumber(input)
local n = tonumber(input)
if n == nil then
return nil, "Invalid number: " .. tostring(input)
end
return n, nil
end
local val, err = parseNumber("42")
print(val, err) -- 42 nil
local val2, err2 = parseNumber("abc")
print(val2, err2) -- nil Invalid number: abc정수 및 부동 소수점 정밀도의 함정
부동 소수점 수의 정밀도에는 한계가 있습니다. 정수와 부동 소수점을 섞는 연산에서는 IEEE 754 표현으로 인해 예상하지 못한 결과가 나올 수 있습니다. double로 정확하게 표현할 수 있는 최대 정수는 2^53 = 9,007,199,254,740,992입니다. 이보다 큰 정수는 부동 소수점으로 저장할 때 정밀도를 잃습니다.
Lua 5.3 이상에서는 네이티브 64비트 정수가 최대 2^63-1까지의 정확한 값을 지원하므로 훨씬 더 큰 값을 다룰 수 있습니다. 정확성이 중요할 때는 항상 정수 산술을 사용하십시오.
-- Float precision limit
print(2^53) -- 9.007...e+15
print(2^53 + 1 == 2^53) -- true (precision lost!)
-- Integer stays exact
local big = math.maxinteger
print(big) -- 9223372036854775807
print(math.type(big)) -- integer
-- Mixing promotes to float
print(math.type(1 + 1.0)) -- float문자열 형식 변환
string.format()은 정밀도, 채우기, 표기법을 제어해야 할 때 숫자를 문자열로 변환하는 가장 강력한 도구입니다. C의 printf 형식 지정자를 따릅니다. 화면 표시, 파일 출력, 기본 tostring() 표현으로 충분하지 않은 모든 경우에 사용하십시오.
print(string.format("%d", 255)) -- 255
print(string.format("%x", 255)) -- ff
print(string.format("%05d", 42)) -- 00042
print(string.format("%.2f", 3.14159)) -- 3.14
print(string.format("%e", 12345.0)) -- 1.234500e+04
print(string.format("%s=%d", "x", 10)) -- x=10빠른 확인
Lua에서 tonumber("hello")는 무엇을 반환합니까?
복습: 형 강제 변환과 변환
배운 내용:
- Lua는 산술 연산에서 문자열을 숫자로, 연결에서 숫자를 문자열로 자동 변환합니다
tonumber()는 실패하면 nil을 반환하므로 항상 확인해야 합니다tostring()은 모든 값을 안전하게 문자열로 변환합니다- 동등성 비교(
==)는 형을 강제 변환하지 않으므로 유형이 다르면 절대 같지 않습니다 - 정밀한 숫자 형식 지정에는
string.format()을 사용합니다 - 부동 소수점 정밀도의 한계는 2^53이므로, 정확한 큰 값에는 네이티브 정수를 사용합니다
다음 주제: if/elseif/else와 반복문을 사용한 제어 흐름입니다.
자주 묻는 질문
“형 변환과 변환 함수” 강의는 무료인가요?
네 — “형 변환과 변환 함수” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“형 변환과 변환 함수”에서 뭘 배우나요?
문자열과 숫자 사이의 자동 형 변환과 명시적인 tonumber/tostring 사용법을 배웁니다. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Lua Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“형 변환과 변환 함수” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Lua 자료형 개요
- Lua에서 변수 선언
- 산술 및 관계 연산자
- 형 변환과 변환 함수