ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 변수와 애텀(Atom)
    Elixir 프로그래밍 2019. 7. 28. 01:05

    Elixir를 배우기 시작하면서 가장 혼동이 오는 부분이 변수와 애텀이었습니다.  

     

    애텀은 ?

     

    거의 모든 언어에서 부울린값으로 true, false 를 사용합니다.    

    그냥 0, 1 을  true, false의 의미로 사용할 수도 있는데, 왜 'true'와 'false'라는 단어를 사용할 가요..?

    코드의 의미가 더 분명해지기 때문이지요.. 

     

    그럼 true, false 외에   ok, not_good, invalid 등은 사용할 수 없나요 ?   c 에서는 define 으로 사용할 수 있습니다. 

    그런데, 이런 워드를 굳이 define을 하고 사용해야 할가요.?  define 없이 그냥 사용하면 안될까요..? 

     

    Elixir에서 애텀이 이런 용도입니다.  define 하지 않고, 그냥 내가 정의해서 사용할 수 있는 워드.. 그게 애텀입니다. 

    그냥 정의하고 사용할수 있는 워드 그게 애텀입니다. 

     

    사실. Elixir 에서는 true, false 도 그저 애텀입니다. 

     

     

    애텀과 변수 

    :a 는 애텀이고,  a 는 변수 입니다.  좀 헷갈리수 있습니다. 어떤 건 애텀이며, 어떤 게 변수인지 많이 헷갈리고, 

    거기다, Elixir 는 기본적으로 유니코드를 지원하므로, 한글을 사용하면 또 어떤 게 애텀인지 몹시도 혼동스러웠습니다. 

     

    이글에 그에 대한 설명을 적으려 합니다. 

     

    변수와 Atom 에 대해서 확실히 집고 넘어가야, Elixir의 중요 개념인 패턴 매칭의 이해가 빠르게 됩니다.

     

    우선, 서두에 적고 싶은 말은

    • 애텀이나 변수를 영문자가 아닌 다른 언어단어를 사용 가능 하지만, 되도록 이면 영어 단어를 이용하자.  

    입니다.   저만 그런지 변수명이나 애텀을 한글로 사용하면 코드가 눈에 잘 안 들어오고, 혼동이 올 수 있어서 그렇습니다. 

     

    지금 이글을 읽으시는 분들은, Elixir를 설치하셨을 거고,  Elixir의 Interactive Shell 인 iex를 써보셨을 거라 생각하고 글을 쓰겠습니다.  혹시 설치를 하지 않으셨다면, 

    https://elixirschool.com/ko/lessons/basics/basics/#elixir-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0 를 참고하세요.

     

    Elixir School

    프로그래밍 언어 Elixir 배우기

    elixirschool.com

    iex는 굉장히 강력한 도구입니다.  Elixir code를 실행해 볼 수 있으며, 기본 함수에 대한 사용법 보기,  함수 호출도 가능하며 프로젝트 관리 도구인 mix와 연계해서 사용하면, 코드의 재 컴파일과 재 실행을 통해서 수정된 코드의 확인이 가능합니다. 

     

    그리고, 디버깅, 시스템 상태등을 볼 수도 있습니다.  시험적으로 iex에서 :observer.start라고 입력을 해보세요..

    다음과 같은 화면이 나타날겁니다. 이를 통해서 여러 가지 환경 정보를 확인할 수 있습니다. 나중에 적겠지만, 이는 사실 Elixir의 도구가 아닌 Elixir의 기본이 되는 Erlang의 기능을 실행시킨 것입니다.   iex의 기능에 대한 내용은 기회 될 때마다 적도록 하겠습니다. 

     

     

     

    다시, 원래의 이야기인 변수와 애텀에 대해서 적겠습니다.  iex 에서  a = :a라고 적으면 어떤 의미 일가요.? 

    이는 a라는 변수에 :a라는 애텀값을 저장하라는 것입니다.  이 문장 a = :a의 결과는 :a라는 애텀입니다. 

     

    이전 장에 적은 것에서 처럼, Elixir의 모든 함수는 반환값이 있다고 했고,  대입문(좀 더 정확히는 패턴 매팅입니다만 , 지금은 대입문으로 적겠습니다.) = 도 일종의 함수며, = 는 할당된 값을 반환합니다.  파란색으로 결과 값인 애텀 :a를 표시한 것입니다. 

     

    그럼  a = A 라고 하면 어떤 의미 일가요.?   이는 a라는 변수에 A라는 애텀을 할당한 것입니다. 

    ":"로 시작한면 애텀이라고 했지요? 

    그럼. 애텀 :a 와 애텀 A는 다른 것인가요?  또 애텀 A는 애텀 :A 와도 다른 것인가요..?  확인을 해보지요.. 비교 함수 == 이를 사용해 보겠습니다. 

    위에서 보는 것 처럼 , :a와 A와 :A는 모두 애텀이지만 모두 다른 애텀 값입니다. 

     

    헷갈려 보이지만, 아주 간단히 정리할 수 있습니다.  

    • : 로 시작하는 것은 모두 애텀이다. 영문자 이외의 다른 언어 문자도 포함됨.  (다만 : 바로 다음에 숫자나 특수기호는 올 수 없다. )
    • 영어 대문자로 시작하는 단어는 애텀이다.  이경우 애텀의 문자들의 중간에  "."을 사용할 수 있다.  "."은 그냥 하나의 영문자처럼 인식한다. 
    • 영소 문자로 또는 다른 언어의 문자로 시작하는 단어는 변수이다. (다른 언어처럼 _ 와 숫자를 함께 사용 가능한다.  그리고 변수 명의 끝 문자로 문자 중? 를 사용할 수 있다.  => istrue? 는 변수명이 됩니다. 

    변수명의 마지막 문자로 ? 를 사용할 수 있습니다. 

    이에 대한 예를 들어보면, 

    :abc 애텀
    ABC 또는 Abc 애텀
    :ABC 애텀
    abc 또는 aBC 변수
    가나다 또는 가나다abc 변수
    :가나다 애텀

    헷갈려 보이지만,,  보통 다음의 룰을 가지고 사용하므로 개발 시 혼동이 오지는 않습니다. 

    • 변수명은 영소문자로 시작하도록 한다. 
    • 애텀이 필요하면, :abc와 같으 ":"뒤에 소문자를 넣거나 Abc와 같이 대문자로 시작하도록 한다. 

    거의 위의 룰 대로 사용하시면 되며, 혼동이 올일은 적습니다.   다만 위에 적은 것럼  File.Name 은 애텀입니다. "." 문자를 애텀의 중간에 일반 영문자처럼 인식할 수 있기 때문입니다. 

     

    그럼, ABC 와 :ABC는 왜 다른가 하는 의문이 남았습니다. 이를 확인해보겠습니다. 

     

    iex 에는 i/1 라는 아주 훌륭한 함수가 있습니다. (함수의 이름이 i이며, 파라미터를 하나 받는 함수라는 의미입니다.)  이 함수는 파라미터로 준 값이 어떤 데이터 형인지를 알려줍니다. 

    i(1) 하면 1은 Integer 형이라고 알려 줍니다. 
    i(1.1) 은  Float 형이라고 알려줍니다. 

    여기서,, 한가지...  Elixir에서는 사실 함수를 호출할 때 파라미터를 감싸는 ()를 생략해도 됩니다.  다만, 함수 이름과 파라미터 사이에 공백 문자는 주어야 합니다. 

    즉,  i(1)은 i 1 로 호출할 수도 있습니다. 

     다른 데이터 형에 대해서도 조사해 볼 수 있습니다. 이전 장에 기술한 맵과 리스트에 대해서도 해보겠습니다. 

     

    그럼,, 이를 이용해서,, ABC와 :ABC가 어떻게 다른지 확인해 보겠습니다. 

     

    확인이 되셨는지요..?   위의 이지미에서 처럼.. 

    그냥 대문자 ABC는 내부적으로는  :"Elixir.ABC"로 자동적으로 표현되며,  :ABC는 그냥 :ABC입니다. 

    그러므로 :ABC와 ABC는 다른 것 입니다. 

     

    그리고, 위에 나온것 처럼 사실 애텀은 : 문자 뒤에 문자열을 붙여서도 만들 수 있습니다. 

     

    영어 대문자를 자동으로 :"Elixir.ABC"로 변환하는 것은,, 사실 개발의 편의성을 높여주는 이유도 있지만,,, 좀 더 깊은 의미는 함수들의 모임인 모듈에 대한 관리측면이 있습니다. 그리고, Elixir는 Erlang 위에서 수행이 되며, Elixir 코드가 Erlang code를 호출할 수도 있습니다. 그렇다 보니 Elixir 코드 부분과 Erlang 코드 부분을 구분할 필요가 있어지게 되고 이를 위해 위와 같은 변환을 하는 것으로 알고 있습니다. 

     

    지금으로서는 

    • 변수는 영소문자로 시작한다.  (대신 끝에? 기호를 사용할 수 있다.)
    • 애텀은 : 로 시작한다. 
    • 영대문자로 시작하는 것은 애텀이며, 주로 모듈의 이름에 사용한다. 

    로 사용하시면 됩니다.   

     

    한글로 애텀이나 변수명을 만드시는 것도 확인해 보시기 바랍니다. 

     

     

    추가적으로 iex에서 변수에 대해서 한 가지 적으면 , 

    abc = 1 이라 입력을 하면,,   abc라는 변수를 만들고   그 변수에 1이라는 값을 할당하는 것입니다. 

    Elixir는 변수에 데이터 타입을 정해주지 않는 Dynaimc Binding 이므로  변수에 할당되는 값을 보고 바로 abc라는 변수를 만들면서 정수 값을 저장하게 됩니다. 

    와 같이 이미 생성된 변수에 다른 타입의 값을 할당하면, 할당되는 새로운 타입의 값으로 설정됩니다. 

     

     

    그리고,  binding() 이라는 함수를 이용하면, binding()함수가 호출되는 시잠에 생성되어 있는  변수들과 각 변수에 할당된 값을 볼 수 있습니다. 

    iex에서는 거의 쓸 일이 없지만,  실제 프로그래밍에서는 특정 함수 내에서 binding()을 호출하여, 그 지점에서 각 변수들의 상태 값을 확인하는 용도로 사용합니다. 

     

Designed by Tistory.