ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Elixir 의 데이터 형(Type)
    Elixir 프로그래밍 2019. 7. 26. 15:31

    사족일 수 있지만, 컴퓨터는 사실 모든 정보를 숫자로 저장, 연산 처리를 합니다. 

    MP3, JPG 이미지, 워드 문서 등등 컴퓨터가 처리하는 모든 정보 내용은 컴퓨터 내에서 수치화되어서 처리가 됩니다. 

     

    이는, 컴퓨터로 처리할 수 있기 위해서는 수치화를 해야한다는 것을 의미합니다. 

     

    인터넷 뱅킹을 하는 것도, 내가 가진 자산을 은행의 시스템에서 수치화한 거고, 송금을 하는 것은 내 자산의 수치를 감소하고 입금을 받는 사람의 자산에 수치를 증가시키는 것으로 볼 수 있습니다.  

     

    냄새를 아직 컴퓨터로 처리하지 못하는 것은 (어떤 물질을 컴퓨터로 분석하는 것과는 다른 - 어떤 냄새를 한 인터넷으로 다른 사람에게 보내지 못하는 것은) 냄새를 수치화하지 못하기 때문입니다. 

     

    결국은 컴퓨터는 현실의 어떤 개념이나 물질을 디지털 수치화 해서 이를 처리하거나, 원격으로 전송하거나 하는 장치인 것이지요. 

     

     

    그렇기 때문에, 프로그래밍 언어는 현실의 어떤 개념, 물질을 수치화 (또는 데이터화) 할 수 있어야 합니다. 

    이를 언어에서 지원하는 데이터 형이라고 하며, 사실 OOP의 class도 이런 데이터 형을 정의하는 것으로 볼 수 있습니다. 

     

    함수형 언어인 Elixir는 다른 언어에 비하여 아주 간단한 데이터 형만을 지원합니다. 

     

    • 기본형 : 정수, 실수 , 부울값(참, 거짓), 문자열, 애텀(아래에 추가 설명), 
    • 집합형 : 리스트, 튜플,맵 

    사실 이들 데이터 형의 조합 만으로 컴퓨터에서 처리할 수 있는 모든 종료의 정보를 디지털화할 수 있습니다. 

     

    기본형에 대해서는 설명할 필요가 없을 듯 합니다. 

    https://elixirschool.com/ko/lessons/basics/basics/#%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85  의 내용만을 보시면 충분히 이해가 되실 겁니다. 

    (애텀에 대한 설명은 글의 아래에 적었습니다.)

     

     

     

    집합형은, 기본형들의 집합이라고 생각할 수 있습니다. 

    한 사람의 정보를 예로 든다면, {나이(정수), 이름(문자), 결혼 여부(부울 값)}으로 생각할 수 있겠지요. 

     

    말 그대로 단순형의 집합으로 이루어진 데이터 형이며,  한 덩어리로 가지고 다니기 편하게 여러 물건을 하나의 가방에 넣은 것이라고 생각할 수도 있을 것입니다. 

     

    Elixir 에도 C 의 structure와 같은 개념이 있기는 하지만, 사실 사용을 하지 않아도 되며, 실은 structure도 집합형중의 한가지인 맵입니다. 

     

    Elixir 에의 모든 집합형의 모든 항목은 모든 데이터 형(집합형을 포함)이 될 수 있습니다

     

    아래의 C source code 예를 보시죠.

    i_array는 정수형의 배열이며, f_array는 실수형의 배열입니다. 

    Java, C 또는 C++에서 정수 또는 실수형을 가지는 배열을 만들려면 어떻게 해야 할까요.? 

     

    정수 또는 실수형을 가질수 있는 객체(또는 struct)를 만들고 그 객체의 배열을 만들어야 합니다. 

    이렇게 만드는 경우 각 항목이 정수형인지, 실수형인지를 구분하고 그에 맞는 처리를 하는 등의 코드 작성이 필요합니다. 

     

    늘 그래왔으니 당연하게 받아들일 수 있지만, 사실은 상당히 번거로운 일입니다. 

     

    Elixir의 예를  들어 보겠습니다. 

    배열에 해당 하는 list는 어떤 형이라도 항목을 가질 수 있습니다. 

    4번째 라인을 보시면, 심지어는 리스트도 항목으로 리스트 내에 위치합니다. 

     

    이는 다른 집합형인 튜플과 맵에도 동일하게 적용됩니다. 

     

    튜플의 항목내에 튜플이나 , 맵이나, 리스트를 가질 수 있고, 이는 맵에도 동일합니다. 

    그래서, 아래와 같은 데이터 형의 사용이 가능 합니다. 

     

     

    JSON으로 데이터를 표현하는 방식과 거의 같다고 보시면 됩니다. 

     

    작은 부분 같지만,, 이는 엄청난 변화를 가져옵니다. 

    이를 이용하면, 프로그래밍 언어에서 사용하는 모든 데이터 구조를 아주 간단히 구성할 수 있습니다. 

     

    Elixir에서는 이런 집합형을 컬렉션(Collection)이라 부릅니다. 

     

    집합형에 대해서 조금서 부연 설명을 하면, 

     

    맵은 각 항목에 고유 식별 이름이 부여된 집합형입니다.  즉, 맵은 집합체에 여러 항목 중 특정 항목을 이름으로 찾을 수 있습니다. 

    다른 언어의 Dictionary와 같다고 보시면 됩니다. 

    맵은 내부적으로 해쉬맵을 구현하여, 검색을 빠르게 합니다.  

    해쉬 맵을 이용하다 보니, 항목의 순서는 검색이 빠를 수 있도록 그 순서가 바뀌게 됩니다.  바뀌게 되어도 항목의 이름으로 찾으니 문제가 될 것은 없습니다. 

     

    이에 반해서 리스트나 튜플은 항목의 순서가 절대 바뀌지 않습니다. 

    대신 특정 항목을 사용하고자 할때는 위치를 지정해서 원하는 항목을 참조하게 됩니다.  다른 언어의 Array와 같다고 보시면 됩니다. 사실 Elixir에서는 리스트나 튜플을 특정 번째로 위치를 지정해서 참조하는 경우는 거의 없습니다. 함수형 언어이다 보니.. 대신 뒤에 나올 Enum이라는 것을 이용하여 사용하게 됩니다. 

     

    리스트나 튜플은 사실 거의 같습니다. 리스트를 쓰는 곳에 튜플을 사용해도 되고, 튜플을 사용하는 곳에 리스트를 사용해도 됩니다. 

     

    리스트와 튜플의 차이점은 다음과 같습니다. 

    • 리스트는 내부적으로 Linked List로 구현된다. 
    • 튜플은 단일 메모리 블록으로 구현된다. 

     

    리스트는 Linked List로 구현되니 항목을 추가하거나 항목을 삭제하는 것이 용이하기는 하지만, 하지만 항목전체를 traverse 하는 것은 비효율적일 수 있습니다.  그리고, Linked List로 구현이 되므로, 어떤 항목을 head에 추가하는 것이 tail에 추가하는 것보다 훨씬 빠릅니다. (tail에 추가하는 것은 tail까지 traverser를 해야 하므로.. 그래서 elixir code 들을 보면, 여러 항목을 list에 넣어야 하는 경우 역순으로 head에 계속 항목을 추가한 후, 나중에 reverse를 시켜서 결과를 반환합니다. 이 편이 더 효율적입니다.  ) 

     

    반면, 튜플은 단일 메모리 블록으로 구성되므로, 항목을 추가하거나 빼는 것은 좀 느리지만 전체를 traverse 하는 것은 빠릅니다. 

     

    그러므로,  튜플을 사용할 것이냐, 리스트를 사용할 것이냐는  

    • 항목이 추가 되거나 삭제되어야 할 경우는 리스트를 사용
    • 항목의 개수가 변동이 안될 경우는 튜플을 사용

    한다고 보시면 됩니다. 

     

    아주 많은 항목을 다루지 않는 경우에는 튜플이나 리스트나 별 차이가 없을 수도 있습니다. 튜플과 리스트가 있는 것은 효율성의 측면에서 있는 것입니다. 

     

    이런 배경 설명을 가지시고..

    https://elixirschool.com/ko/lessons/basics/collections/

     

    Elixir School

    프로그래밍 언어 Elixir 배우기

    elixirschool.com

    를 보시기 바랍니다. 

     

     

    그리고, 추가로 애텀(Atom)에 대해서 설명을 적겠습니다.  사실 애텀이 다른 언어에서는 없는 독특하고 좀 설명이 어려운 항목인데.. 

    아주 간단하게는 

     

         "애텀은 무언가를 구분하기 위해 내가 지정하는 워드이다." 정도로 적을 수 있습니다. 

     

    애텀은 무언가를 구분짓기 위해 내가 정의하는 단어입니다.  가령 사람에 대한 정보를  이름과 나이의 집합체로 정의한다면, 

    로 할수도 있고,, 

    애텀을 사용해서 위와 같이 할 수도 있습니다.   :name 이 애텀입니다.

     

     

    위의 예에서는 이름을 "name"이라는 문자열로 지정한 것이고,  아래의 예는 :name이라는 애텀을 사용한 경우 입니다.( ":" 문자 다음의 숫자나 특수문자가 아닌 문자 - 한글도 가능합니다.  - Elixir는 기본적으로 유니코드를 지원하므로 변수명과 애텀에 영문자 이외의 언어문자를 사용하는 것이 가능합니다.  뒤에 설명이 나오겠지만,  우선은  영소 문자로 시작되는 애텀을 만들고 싶을 때는 영소 문자 앞에 ":"를 붙인다고 생각하시면 됩니다.   )

     

    애텀은 왜 있을가요 ?   말 그대로 무엇인가를 "구분"할 필요가 있을 때 사용합니다. 위의 예에서 사람 집합체에서 이름 항목과 나이 항목을 구분하는 용도로 사용되었습니다. 

     

    위의 예에서는 문자열을 사용해도 됩니다.  하지만 애텀을 사용하면 더 효율성이 높아집니다. 

     

    Elixir 에서는 애텀을 내부 해쉬 테이블로 관리한다고 합니다. 그러므로 문자열을 사용하는 것보다는 검색이 더 빠른 애텀을 사용하는 것이 효율성이 더 높아지게 된다고 생각하시면 됩니다.   

     

    뒤에도 나오게 되겠지만,  Elixir에서는 모든 함수의 이름도 애텀입니다.  여러개의 함수를 하나로 묶는 모듈의 이름도 애텀입니다.  어떤 모듈의 어떤 함수를 구분해서 호출을 해야 하기 때문에, 함수 이름과 모듈 이름에 애텀을 사용합니다. 

     

    대신 , 애텀은 사용할 수 있는 갯수가 정해져 있습니다.  지금은 아주~ 아주 넉넉히 개수가 많고, 원하면 늘릴 수도 있으니 개수의 한계는 걱정하지 않으셔도 됩니다. 

Designed by Tistory.