0Pricing
Lua Academy · 강의

형 변환과 변환 함수

문자열과 숫자 사이의 자동 형 변환과 명시적인 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.0

tonumber(): 명시적 변환

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: nil

math.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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Lua 자료형 개요
  2. Lua에서 변수 선언
  3. 산술 및 관계 연산자
  4. 형 변환과 변환 함수
← Lua Academy(으)로 돌아가기