@luzluna - C,Perl 엔지니어. 근래엔 Ops에 더 가까운 DevOps. PostgreSQL 성능 최적화의 공동 역자, luzluna at gmail.com
간단한 프로그램 작성 정도를 부담없이 하게 되고나면 프로그래머로써의 호기심은 그 내부를 항햐기 마련입니다. 그리하여 내부의 구조가 어떻게 되어있는지 어떻게 동작하는지를 이해하게 되다면 최적화를 더 잘하게 된다든지 그럴것같진 않고(T.T), 좀 더 안다는 자기만족 이외에 무엇을 얻을 수 있을진 모르지만 그냥 재미있습니다. OTL
일단 먼저 펄이 설치되어 있어야 합니다. 펄이 설치되어있지 않다면, 그냥 조용히 이번 기사를 넘어가주세요. (후... 여기까지 오셨는데 시스템에 펄이 없다면 눈물이 앞을...)
코어 모듈이기 때문에 펄이 설치되어있으면 따로 설치할 필요없이 바로 사용할 수 있습니다.
가장 기본이 되는 스칼라 타입부터 알아보죠.
$str
이라는 스칼라 변수에 숫자 101
을 넣어두고 내부 구조를 덤프합니다.
#!/usr/bin/env perl use Devel::Peek; $val = 101; Dump($val);
실행결과는 다음과 같습니다.
SV = IV(0x9a6f88c) at 0x9a546cc REFCNT = 1 FLAGS = (IOK,pIOK) IV = 101
암호같이 주르륵 나왔지만 약자들의 의미를 풀어보면 이해하기 어렵지는 않습니다.
SV
: Scalar Value (스칼라 값)IV
: Integer Value (정수 값)REFCNT
: Reference Count (레퍼런스 카운트)FLAGS
: Flags (상태 플래그)IOK
: Integer OK (정수형 숫자로 읽을 수 있음)대충 이런 의미들입니다. 쉽죠?
제목을 정해보려니 "정수형 상수"라는 어려운 말이 나왔습니다만, 그냥 "숫자를 쓰면 내부에서 어떻게 처리할까?"라는 궁금증을 해결해 보겠습니다.
#!/usr/bin/perl use Devel::Peek; Dump(101);
실행결과는 다음과 같습니다.
SV = IV(0x968269c) at 0x9667690 REFCNT = 1 FLAGS = (PADBUSY,PADTMP,IOK,READONLY,pIOK) IV = 101
앞에서는 안보이던 몇가지 플래그가 보입니다.
PADBUSY
: BUSY 아마도 바쁘다는 이야기겠죠? 사실 저도 잘 모릅니다(죄송).PADTMP
: TMP 임시로 쓴다는 의미겠죠?READONLY
: 읽기 전용정수가 아닌 숫자는 어떻게 표시하는지 살펴보죠.
#!/usr/bin/perl use Devel::Peek; $num = 1.01; Dump($num);
실행결과는 다음과 같습니다.
SV = NV(0x823d948) at 0x821e69c REFCNT = 1 FLAGS = (NOK,pNOK) NV = 1.01
정수형 숫자와 거의 비슷하지만 IV
대신 NV
가 쓰였네요.
NV
: Number Value(숫자 값)그럼 문자열은 어떻게 될까요?
#!/usr/bin/perl use Devel::Peek; $str = "hello perl!"; Dump($str);
실행결과는 다음과 같습니다.
SV = PV(0x8c44b00) at 0x8c4469c REFCNT = 1 FLAGS = (POK,pPOK) PV = 0x8c5a2b8 "hello perl!"\0 CUR = 11 LEN = 12
조금 더 복잡해졌습니다만 이해하기 어렵진 않습니다.
PV
: Pointer Value(포인터 값) 컴퓨터에서 문자열을 표시하는 방법은 역시나 포인터밖에 없습니다.POK
: Pointer OK 뒤의 값을 포인터로 읽을 수 있다는 의미입니다.PV
: 다시한번 포인터 값이 등장했는데 따라가보면 "hello perl!"\0
이런 내용이 들어있다고 표시됩니다.CUR
: Current Length of the String 문자열의 실제 길이는 11바이트라고 표시되어 있습니다.LEN
: Length 문자열 종료 케릭터인 \0
까지 총 12바이트를 사용한다라고 표시되어 있습니다.스칼라 변수가 다 끝난줄 아셨겠지만 하나 더 있습니다. NULL 변수라는것이 있습니다. 선언만 해놓고 아무런 값이 들어있지 않은 경우에 사용합니다. 사실 이것을 가장 먼저 소개해야되는데 존재 자체를 잠시 잊고 있었네요.
#!/usr/bin/perl use Devel::Peek; Dump($str);
실행결과는 다음과 같습니다.
SV = NULL(0x0) at 0x884469c REFCNT = 1 FLAGS = ()
NULL
: 말 그대로 그냥 null 입니다. 0(0x00)
의 값을 가진것을 볼 수 있습니다.위에서는 간단한 결과를 위해서 strict
와 warning
프라그마도 없이
샘플코드를 작성했습니다만 이렇게 코딩하는 것은 안좋은 버릇인 만큼
꼭 strict
와 warning
프라그마를 삽입하고 변수도 명시적으로 선언하는 것이 좋습니다.
#!/usr/bin/perl use strict; use warnings; use Devel::Peek; my $str = 101; Dump($str);
실행결과는 다음과 같습니다.
SV = IV(0x84d688c) at 0x84bb6cc REFCNT = 1 FLAGS = (PADBUSY,PADMY,IOK,pIOK) IV = 101
PADBUSY
: busy 바쁘다? 사용중이라는 의미인 것 같습니다. 사실 잘은 모르겠습니다(죄송).PADMY
: my
로 선언했다고 붙었습니다.기본적은 스칼라 타입들이 펄 내부에서 어떻게 표현되는지를 간단히 살펴보았습니다.
다음회에서는 문자열로 표시된 "101"
에 숫자인 101
을 더하면 어떻게 산술 연산이 되는지
혹은 반대로 .
연산자를 통해 문자열을 연결하면
어떻게 숫자가 다시 문자열로 바뀌는지 등등을 살펴보도록 하겠습니다.
여러분의 호기심으로 꼭 미리 해보지는 말아주세요! :-)
EOT
X-mas tree
& Llama
ASCII Art by ASCII Art Farts.
Computer ASCII Art by Chris.com.
Font ASCII Art by TAAG.
Artwork by
Inkyung Park
& Keedi Kim.
Designed by
Hojung Youn
& Keedi Kim.
Articles by
Seoul Perl Mongers.
Edited by
Luzluna Park
& Keedi Kim.
Hosting generously sponsored by
Yuni Kim.
Sponsored by
SILEX.
.-''' __ __ / \/ \/ \ =-_- | \. -____- / \ // /|| '' //| //|| == = == ==