9월, 2019의 게시물 표시

[Kotlin] while문 안에서 변수에 대입하기

최근, 코틀린을 사용해 프로젝트를 진행하게 됐습니다. 그러던 중, 파일 I/O 작업이 필요하게 됐죠. 그래서, 평소 자바나 C#에서 하던대로 while문을 작성해봤으나 제대로 작동하지 않았습니다. 아래는 Java 코드입니다. while ((i = zipStream.read(buf)) != - 1 ) { // Do something... } 그리고 아래는 작성했던 코틀린 코드입니다. while ((i = zipStream.read(buf)) != -1) { // Do something... } 같은 것 같다고요? 맞습니다. 동일하게 작성했더니 안 되더라고요. 그래서 방법을 찾아봤습니다. 생각해보니, 람다 가 있었습니다. 익명 함수를 사용한 while문 내에서의 변수 할당 while ({i = zipStream.read(buf); i}() != -1) { // Do something... } 간단히 설명하면, zipStream.read(buf) 의 값을 변수 i 에 할당하고 그 값을 반환하는 익명 함수를 즉시 호출하고, 그 결과를 대조해 while문을 돌리면 되는 것이었죠! 이 과정에서 코틀린의 새로운 문법을 알게 됐습니다. 바로 익명 함수( { ... } )에서 return statement가 없으면 ; (세미콜론)을 대신 사용할 수 있다는 것입니다. 모두 유용하셨길 바라며, 오늘도 즐거운 하루 되시길 바랍니다. ​

[LUA] pairs, ipairs의 차이

루아의 반복문 루아에서 테이블 속 내용을 돌아가며 빼와서 작업할 때는 아래와 같은 식으로 쓰게 됩니다. -- 1. for i, v in pairs (t) do -- Do something... end -- 2. for i, v in ipairs (t) do -- Do something... end 간단한 작업을 할 때는 둘 중 어느 걸 사용하더라도 잘 작동할 것입니다. 하지만, 만약 특정 테이블에 대해 반복문을 실행할 때, 이터레이션을 ipairs 로 돌게 된다면 심각한 로직 에러가 발생할 수 있습니다. 지금부터 이 글에서 그 원인을 설명하고, 어떤 때에 pairs를 사용해야 하며 어떤 때에 ipairs를 사용하면 좋은지 알려드리도록 하겠습니다. 루아의 테이블 반복문 얘기하다가 갑자기 테이블 얘기를 꺼낸 이유가 있습니다. pairs와 ipairs가 굳이 나누어져있는 이유를 알고자 한다면, 반드시 테이블에 대한 이해가 우선시되어야 하기 때문이죠. 루아의 테이블(table)이란 데이터 타입은, 타 언어의 array와 map 데이터 타입의 특징을 둘 다 가지는 특이한 녀석입니다. 즉 아래의 모든 것이 테이블이라는 하나의 형식으로 사용된다는 의미입니다. local tblA = { 1 , 2 , 3 } local tblB = { "A" , "B" , "C" } local tblC = { nil , nil , nil } local tblD = { tblA, tblB, tblC, { 1 , 2 , 3 } } -- local tblA = { [1] = 1, [2] = 2, [3] = 3 } -- local tblB = { [1] = "A", [2] = "B", [3] = "C" } -- ... local tblE = { HP = 100 , MP = 100 , ATK = 1.5 }