[Erlang Study] 둘째주 : 실수, 애텀, 튜플 그(it) 얘기

1. 부동 소수점 연산

1> 5/3.
1.6666666666666667
2> 5 div 3.
1
3> 5 rem 3.
2
4> 5.0 * 3.141592.
15.70796
5>

  / 나눗셈 연산자의 결과는 항상 부동소수점 형태로 나온다. 따라서 정수형 나눗셈을 하고자 하면 div 연산자를 이용해야 한다. 이것은 정수형 나눗셈의 몫을 구한다. 한편 rem 연산자는 정수형 나눗셈의 나머지를 구한다.

  부동 소수점을 표현하기 위해서는 반드시 소수점을 찍어줘야 한다. 이때 5.0 같은 수를 표현할 때는 반드시 .0까지 확실히 써줄 것. 문장의 마직막을 뜻하는 마침표(.)와 소수점 표현을 혼동하지 않도록 하자.


2. 애텀(Atom)

  애텀은 일종의 기호 상수이다. C의 #define 상수나 C++에서의 enum 같은 걸 떠올리면 된다. 하지만 얼랭에서 애텀의 값은 그냥 애텀일 뿐. 애텀이 어떤 수치나 다른 상수값을 대신하지는 않는다.

  애텀은 전역(global)으로 선언되며, 반드시 소문자로 시작하고, 그 뒤에는 _ 나 @ 기호가 올 수 있다. 이런 제약이 부담스럽다면 그냥 따옴표(' ')로 묶어도 된다. 따옴표 안에서는 어떤 문자라도 쓸 수 있다. (혹시라도 따옴표 안의 있는 것을 문자열 상수로 착각하지는 말자.)

1> Color = blue.
blue
2> Today = monday.
monday
3> Blog = 'Sizuha.egloos.com'.
Sizuha.egloos.com
4> CV = rei_kugimiya.
rei_kugimiya
5> Shana = melonpan.
melonpan
6>


3. 튜플(Tuple)
  튜플은 여러개의 데이터를 하나로 그룹핑한 것으로, C의 구조체(struct)와 비슷하다고 할 수 있다. 단 구조체와는 달리 타입 선언도 없고 변수명도 없이, 단지 중관호 { } 안에 값을 열거하기만 하면 된다.
예를들어. 다음과 같은 구조체를...

struct Point { int x, y; };

Point P;
P.x = 16; P.y = 32;

얼랭에서 표현한다고 하면,

P = {16, 32}.

이것을 좀 더 읽기 쉽게 표현하기 위해, 튜플의 첫번째 값에 애텀(Atom)을 넣을 수 있다.

P = {point, 16, 32}.

이때의 point 애텀은 값으로써의 의미는 없지만, 단지 알아보기 쉽게 해주는 장식(태깅)이다.
  튜플 내에서는 다시 튜플을 중첩해서 가질 수도 있다. 또한 변수도 튜플의 값이 될 수 있지만, 반드시 값이 정의된 변수여야만 함.

1> Honoka = {profile,                 
1>               {name, shiga_honoka},
1>               {age, 16},
1>               {blood, 'A'},
1>               {height, 150}}.
{profile,{name,shiga_honoka},
         {age,16},
         {blood,'A'},
         {height,150}}
2> ZeroFrameStaff = {staff,          
2>                             {person, Honoka},
2>                             {level, 1},
2>                             {class, 'Character Designer'}}.
{staff,{person,{profile,{name,shiga_honoka},
                        {age,16},
                        {blood,'A'},
                        {height,150}}},
       {level,1},
       {class,'Character Designer'}}
3>

  자, 그럼 이번에는 튜플에서 값을 꺼내와 보기로 하자. 이것도 생각외로 간단하게 할 수 있다.

3> {profile, {name, Name}, {_, Age}, _, _} = Honoka.    
{profile,{name,shiga_honoka},
         {age,16},
         {blood,'A'},
         {height,150}}
4> Name.
shiga_honoka
5> Age.
16
6>

  지난 시간의 패턴 매칭을 기억해 보자. 우변에 있는 것은 튜플이 담긴 변수인데, 이 변수가 튜플 형식이므로 좌변에 오는 형식도 마찬가지로 튜플 형식을 취하면 된다. 좌변에 있는 밑줄(_) 기호는 익명 변수를 뜻한다. 우변의 패턴에 일일이 맞춰서 네이밍을 할 필요없이, 원하는 부분의 데이터만 가져오고자 할 경우에 유용하게 쓸 수 있다. 간단히 생각하면, 그냥 자리만 채워주는 녀석이라고 보면 되겠다.

덧글

  • akachan 2008/09/15 21:57 # 답글

    tuple 안의 tuple은 결국 foreign key로 묶여진 reference 관계인 겁니까?
    RDB에서 카디널리티의 한 행을 tuple이라고 부르는 것도 비슷한 개념인 건가요.^_^
  • 시즈하 2008/09/15 22:04 #

    DB에서 말하는 tuple 보다는 좀더 단순한 개념입니다. 그냥 단순히 데이터의 묶은 정도로 쓰이는 거고, 만들어진 튜플을 가지고 어떻게 해석하느냐는 작성하는 쪽의 의도에 따르면 되겠죠.
  • 死海文書 2008/09/15 22:11 # 답글

    rem연산자보단 mod로 표기했으면 더 알아보기 쉬웠을 것 같은데.. mod는 따로 없나요?
  • 시즈하 2008/09/15 22:15 #

    제가 알기론 mod라는 연산자는 없습니다. 연산자로서는 rem이 유일한 것 같은데, 어디서 따온 말인지른 모르겠군요...
    다만 굳이 mod라는 표현이 필요하다면, 함수로 구현할 수는 있겠죠.
  • eoh 2009/03/18 22:20 #

    rem 은 remainder : 나눗셈에서의 나머지 라는 단어로부터,

    mod 는 modulo : 법(modulus)을 이용하다는 의미로서,
    mod n 의 경우 "n 을 법으로 하는 합동"을 의미하는 표현으로부터 파생된것 같습니다.
    따라서, 엄밀하게는 나눗셈의 나머지가 아니라, 대수구조 자체가 다른 상황이 되죠..

    수학에서의 정의를 엄밀히 따르자면 mod 보다는 rem 이 당연하게 여겨지네요.
  • akachan 2008/09/16 16:27 # 답글

    매우 공교롭게도...오늘 학원에서 수업시간에 JSON을 배웠다는...-_-;;
    이 무슨 우연의 일치입니까...
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.