여덟째 날: Perl 내부 구조 #1 : 스칼라 변수

저자

@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

암호같이 주르륵 나왔지만 약자들의 의미를 풀어보면 이해하기 어렵지는 않습니다.

대충 이런 의미들입니다. 쉽죠?

정수형 상수

제목을 정해보려니 "정수형 상수"라는 어려운 말이 나왔습니다만, 그냥 "숫자를 쓰면 내부에서 어떻게 처리할까?"라는 궁금증을 해결해 보겠습니다.

#!/usr/bin/perl 

use Devel::Peek;

Dump(101);

실행결과는 다음과 같습니다.

SV = IV(0x968269c) at 0x9667690
  REFCNT = 1
  FLAGS = (PADBUSY,PADTMP,IOK,READONLY,pIOK)
  IV = 101

앞에서는 안보이던 몇가지 플래그가 보입니다.

스칼라 부동소숫점 숫자 변수

정수가 아닌 숫자는 어떻게 표시하는지 살펴보죠.

#!/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가 쓰였네요.

스칼라 문자열 변수

그럼 문자열은 어떻게 될까요?

#!/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

조금 더 복잡해졌습니다만 이해하기 어렵진 않습니다.

스칼라 NULL 변수

스칼라 변수가 다 끝난줄 아셨겠지만 하나 더 있습니다. NULL 변수라는것이 있습니다. 선언만 해놓고 아무런 값이 들어있지 않은 경우에 사용합니다. 사실 이것을 가장 먼저 소개해야되는데 존재 자체를 잠시 잊고 있었네요.

#!/usr/bin/perl 

use Devel::Peek;

Dump($str);

실행결과는 다음과 같습니다.

SV = NULL(0x0) at 0x884469c
  REFCNT = 1
  FLAGS = ()

명시적 변수 선언

위에서는 간단한 결과를 위해서 strictwarning 프라그마도 없이 샘플코드를 작성했습니다만 이렇게 코딩하는 것은 안좋은 버릇인 만큼 꼭 strictwarning 프라그마를 삽입하고 변수도 명시적으로 선언하는 것이 좋습니다.

#!/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

다음회 예고

기본적은 스칼라 타입들이 펄 내부에서 어떻게 표현되는지를 간단히 살펴보았습니다. 다음회에서는 문자열로 표시된 "101" 에 숫자인 101을 더하면 어떻게 산술 연산이 되는지 혹은 반대로 . 연산자를 통해 문자열을 연결하면 어떻게 숫자가 다시 문자열로 바뀌는지 등등을 살펴보도록 하겠습니다. 여러분의 호기심으로 미리 해보지는 말아주세요! :-)

EOT

blog comments powered by Disqus