이 글에서는 기본 키워드인 ?, !, 냥, 냐, ., ,, ~, -, 뀨에 대해서 알아볼 거다냥.
이외의 키워드들은 모두 이해하기에는 아직 이른 키워드이므로, 나중으로 미뤄두는거다냥.
우선, 냥랭 파일이 처음 실행될 때 메모리의 상태는 다음과 같다냥.
포인터 | 주소 | 값 |
---|---|---|
포인터 -> | 0 | 0 |
1 | 0 | |
... | ... |
포인터는 메모리의 주소를 가리키고 있고, 그 주소의 초기값은 0이다냥.
또한 특별히 값이 담기지 않은 메모리의 주소는 항상 값 0을 기본으로 가지고 있다냥.
만약 포인터를 아래로 넘기고 싶다면, ? 키워드를 사용해서 포인터가 가리키는 메모리 주소를 증가시킬 수 있다냥.
포인터 | 주소 | 값 |
---|---|---|
0 | 0 | |
포인터 -> | 1 | 0 |
... | ... |
마찬가지로, 포인터를 위로 넘기고 싶다면 ! 키워드를 사용해서 포인터가 가리키는 메모리 주소를 감소시킬 수 있다냥.
포인터 | 주소 | 값 |
---|---|---|
포인터 -> | 0 | 0 |
1 | 0 | |
... | ... |
포인터가 가리키고 있는 주소의 값을 변경할 수도 있다냥.
포인터가 가리키고 있는 주소의 값을 1 늘리고 싶다면, 냥 키워드를 사용해서 늘릴 수 있다냥.
포인터 | 주소 | 값 |
---|---|---|
포인터 -> | 0 | 1 |
1 | 0 | |
... | ... |
포인터가 가리키고 있는 주소의 값을 1 줄이고 싶다면, 냐 키워드를 사용해서 줄일 수 있다냥.
포인터 | 주소 | 값 |
---|---|---|
포인터 -> | 0 | 0 |
1 | 0 | |
... | ... |
외부로 입력과 출력을 할 수도 있다냥.
포인터가 가리키고 있는 주소의 값을 외부로 출력하고 싶다면 . 키워드 혹은 뀨 키워드를 사용하면 된다냥.
. 키워드와 뀨 키워드는 모두 출력이라는 점에서는 똑같지만, . 키워드는 값을 유니코드로 변환해 문자로 출력하는 반면, 뀨 키워드는 값을 숫자 그대로 출력한다는 점을 유의해야 한다냥.
예시를 하나 들어보면,
포인터 | 주소 | 값 |
---|---|---|
포인터 -> | 0 | 65 |
1 | 0 | |
... | ... |
만약 위와 같은 메모리가 있는 상태에서, . 키워드를 쓴다면 A가 출력될 것이고냥, 뀨 키워드를 쓴다면 {65}가 출력될 것이다냥.
따라서 뀨 키워드는 디버깅 용도로만 사용하는 걸 권장한다냥.
포인터가 가리키고 있는 주소의 값을 외부로 입력받은 값으로 설정하고 싶다면 , 키워드를 사용하면 된다냥.
단, 주의할 점은 이 , 키워드가 한 번에 한 문자만을 입력받는다냥.
만약 , 키워드를 두 번 쓴 상태(,,)에서 Hello를 입력했다면,
냥랭은 첫번째로 입력받은 H의 유니코드 값인 72를 메모리에 저장한 다음, 두번째로 입력받은 e의 유니코드 값인 101을 메모리에 저장한다냥.
그리고 입력이 더 이상 없을 경우, 0을 가져간다냥.
예를 들어 , 키워드를 두 번 쓴 상태에서 H 문자를 입력받는다면,
두번째 , 키워드에서는 0이 메모리에 저장된다냥.
냥랭에서는 ~ 키워드와 - 키워드를 사용해 특정한 키워드를 반복해서 실행할 수도 있다냥.
우선 ~ 키워드는 현재 포인터가 가리키고 있는 주소의 값이 0이라면 짝이 되는 - 키워드로 점프한다냥.
반대로, - 키워드는 현재 포인터가 가리키고 있는 주소의 값이 0이 아니라면 짝이 되는 ~ 키워드로 점프한다냥.
이걸 활용해 반복문을 만들 수 있다냥.
예를 들어 메모리의 주소 1번에 값 65를 넣고 싶다고 해보자냥.
물론 냥 키워드를 65번 써서 할 수도 있다냥. 하지만 너무 비효율적이지 않냥?
이 때 위의 키워드들을 활용해서 반복을 하면 쉽게 65를 저장할 수 있는거다냥.
처음, 포인터가 가리키는 주소가 0인 시점에서 냥 키워드가 13번 쓰였으므로, 메모리의 주소 0에는 값 13이 들어간다냥.
포인터 | 주소 | 값 |
---|---|---|
포인터 -> | 0 | 13 |
1 | 0 | |
... | ... |
이후 ~ 키워드가 있는데, 포인터가 기리키고 있는 주소인 0에 있는 값은 13, 즉 0이 아니므로 그냥 지나치게 된다냥.
그 다음 ? 키워드로 주소를 1 증가시켜 포인터가 가리키는 주소를 1로 만들고, 주소 1에 5를 더한다냥.
포인터 | 주소 | 값 |
---|---|---|
0 | 13 | |
포인터 -> | 1 | 5 |
... | ... |
그 뒤 ! 키워드로 주소를 1 감소시키면 포인터가 가리키는 주소는 다시 0이 된다냥.
포인터 | 주소 | 값 |
---|---|---|
포인터 -> | 0 | 13 |
1 | 5 | |
... | ... |
그리고 포인터가 가리키고 있는 주소인 0의 값은 13인 상태에서, 냐 키워드를 써 값을 1 감소시킨 뒤 - 키워드를 써서 0인지 아닌지를 검사한다냥.
포인터 | 주소 | 값 |
---|---|---|
포인터 -> | 0 | 12 |
1 | 5 | |
... | ... |
만약 주소 0의 값이 0이 아니라면 다시 ~ 키워드로 돌아갈 것이고, 한 번 반복할 때마다 주소 1의 값은 5씩 증가, 그리고 주소 0의 값은 1씩 감소하므로
총 13번 반복해서 주소 1의 값은 5 * 13인 65를 갖게 된다냥.
길이가 정해지지 않은 입력을 받을 수도 있다냥.
입력은 항상 끝이 있는데, 이 끝을 EOF(End-Of-File)이라고 한다냥.
그리고 이 EOF는 항상 값이 0이다냥.
따라서, 만약 들어오는 모든 입력을 순서대로 메모리에 저장하고 싶다면 다음과 같이 할 수 있다냥.
하지만 이렇게만 해서는 메모리가 제대로 바뀌는 지 볼 수 없으므로, 디버깅용인 뀨 키워드를 쓸거다냥.
먼저 ~의 0 검사를 피하기 위해 메모리 0에 1을 더하고, 반복에 들어간다냥.
그리고 포인터의 주소를 하나 더한 뒤, 입력을 받는다냥. 따라서 입력된 문자가 있다면 - 키워드가 작동해 짝이 되는 ~로 이동하면서 반복을 하게 될 것이고,
입력이 있는 한 계속해서 다음 주소에 입력된 문자의 유니코드 값을 저장할 거다냥.
만약 입력이 끝나면, EOF 즉 0이 메모리에 저장되므로 - 키워드를 지나치면서 프로그램이 끝나게 되는 거다냥.
""로 감싸는 모든 문자는 주석으로 처리된다냥.
만약 키워드가 아닌 이상한 문자가 주석 밖에 있다면, 냥랭은 그 문자를 오류로 처리한다냥.
냥랭의 Hello World 예제는 다음과 같다냥.
이 예제를 실행하면 다음과 같은 결과가 나온다냥.
이제 이 예제를 스스로 분석해보라냥. 지금까지 배운 것들로 충분히 이해할 수 있는 코드다냥!