Seize your moment! πŸ‘Ύ

μ•ˆλ…•ν•˜μ„Έμš”. Ericμž…λ‹ˆλ‹€. 제 λΈ”λ‘œκ·Έμ— λ°©λ¬Έν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

πŸ’» κ°œλ°œκ³΅λΆ€/Elixir

[Eric's Elixir] μ•„ν†°(Atom), νŠœν”Œ(tuple) 에 λŒ€ν•΄ μ•Œμ•„λ³΄κΈ° πŸ§ͺ

Eric_ko 2023. 11. 4. 22:38

Elixir와 μ•„ν†°(Atom)의 λ§Œλ‚¨

ElixirλŠ” Erlang VM μœ„μ— κ΅¬μΆ•λœ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ, 높은 λ™μ‹œμ„±(concurrency), 내결함성(fault-tolerance), λΆ„μ‚°(distribution)을 μœ„ν•΄ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이 멋진 μ–Έμ–΄μ˜ κΈ°λ³Έ ꡬ성 μš”μ†Œ 쀑 ν•˜λ‚˜λŠ” λ°”λ‘œ 'μ•„ν†°(atom)'μž…λ‹ˆλ‹€. 아톰은 Elixir의 λΆˆλ³€ν•˜λŠ” μƒμˆ˜μ΄λ©°, 이름 κ·ΈλŒ€λ‘œ κ³ μœ ν•œ κ°’μœΌλ‘œ μ‘΄μž¬ν•©λ‹ˆλ‹€. μ˜€λŠ˜μ€ μ΄λŸ¬ν•œ 아톰에 λŒ€ν•΄ 깊이 있게 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

μ•„ν†°(Atom)μ΄λž€?

아톰은 이름이 값을 λ‚˜νƒ€λ‚΄λŠ” κ°μ²΄μž…λ‹ˆλ‹€. 즉, 아톰은 자기 μžμ‹ μ΄ μ΅œμ’… κ°’μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, :ok 아톰은 "ok"λΌλŠ” μ΄λ¦„μ˜ μ•„ν†°μž…λ‹ˆλ‹€. 이 νŠΉμ„± λ•Œλ¬Έμ—, 아톰은 주둜 μƒνƒœ, μ‹λ³„μž λ˜λŠ” νŠΉμ • 값을 λ‚˜νƒ€λ‚΄λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

μ•„ν†°μ˜ νŠΉμ§•

  • μœ μΌμ„±: 아톰은 μ „μ—­μ μœΌλ‘œ μœ μΌν•©λ‹ˆλ‹€. :okλŠ” μ‹œμŠ€ν…œ μ–΄λ””μ—μ„œλ‚˜ μ •ν™•νžˆ 같은 :okμž…λ‹ˆλ‹€.
  • λΆˆλ³€μ„±: 아톰은 생성 후에 λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€. ν•œ 번 :error둜 μ •μ˜ν•˜λ©΄, 그것은 μ˜μ›νžˆ :error둜 λ‚¨μŠ΅λ‹ˆλ‹€.
  • λ©”λͺ¨λ¦¬ νš¨μœ¨μ„±: 아톰은 ν•œ 번 μ •μ˜λ˜λ©΄ μ‹œμŠ€ν…œμ˜ μ•„ν†° ν…Œμ΄λΈ”μ— μ €μž₯되고, 같은 아톰에 λŒ€ν•œ λͺ¨λ“  μ°Έμ‘°λŠ” λ©”λͺ¨λ¦¬ λ‚΄ 같은 μœ„μΉ˜λ₯Ό κ°€λ¦¬ν‚€κ²Œ λ©λ‹ˆλ‹€.

μ•„ν†°μ˜ μ‚¬μš© 사둀

defmodule Example do
  def show_status(status) do
    case status do
      :ok -> "λͺ¨λ“  것이 μ •μƒμž…λ‹ˆλ‹€!"
      :error -> "μ—λŸ¬κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€!"
    end
  end
end

IO.puts Example.show_status(:ok)
# "λͺ¨λ“  것이 μ •μƒμž…λ‹ˆλ‹€!" 좜λ ₯λ©λ‹ˆλ‹€.

μœ„ μ˜ˆμ œμ—μ„œ :ok와 :errorλŠ” κ°€λŠ₯ν•œ 두 μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ•„ν†°μž…λ‹ˆλ‹€. show_status ν•¨μˆ˜λŠ” 아톰을 λ§€κ°œλ³€μˆ˜λ‘œ λ°›μ•„, μƒνƒœμ— 따라 λ‹€λ₯Έ λ©”μ‹œμ§€λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

μ•„ν†°κ³Ό JavaScript μƒμˆ˜μ˜ 비ꡐ

JavaScriptμ—μ„œ μƒμˆ˜λŠ” const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έλ©λ‹ˆλ‹€. μƒμˆ˜λŠ” μž¬ν• λ‹Ήλ  수 μ—†λŠ” λ³€μˆ˜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄:

const greeting = "μ•ˆλ…•ν•˜μ„Έμš”";
console.log(greeting); // "μ•ˆλ…•ν•˜μ„Έμš”" 좜λ ₯λ©λ‹ˆλ‹€.

이 μƒμˆ˜ greeting은 "μ•ˆλ…•ν•˜μ„Έμš”"λΌλŠ” λ¬Έμžμ—΄μ— 이름을 λΆ€μ—¬ν•œ κ²ƒμž…λ‹ˆλ‹€. 이λ₯Ό Elixir의 μ•„ν†°κ³Ό 비ꡐ해보면, 두 κ°œλ… λͺ¨λ‘ λΆˆλ³€μ„±μ„ κ°€μ§„λ‹€λŠ” 곡톡점이 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ JavaScript의 constλŠ” λ³€μˆ˜μ— ν• λ‹Ήλœ 값을 λ³€κ²½ν•  수 μ—†λŠ” 반면, 아톰은 κ·Έ 자체둜 값이며, 이 값은 μœ μΌλ¬΄μ΄ν•˜κ³  μ „μ—­μ μœΌλ‘œ μΈμ‹λ©λ‹ˆλ‹€.

JavaScriptμ—λŠ” Elixir의 μ•„ν†°κ³Ό μ •ν™•νžˆ λ™μΌν•œ κ°œλ…μ€ μ—†μ§€λ§Œ, λΉ„μŠ·ν•œ λͺ©μ μœΌλ‘œ 객체의 ν”„λ‘œνΌν‹°λ‚˜ ν‚€λ₯Ό μ‚¬μš©ν•˜λŠ” 것을 예둜 λ“€ 수 μžˆμŠ΅λ‹ˆλ‹€:

const STATUS = {
  OK: 'ok',
  ERROR: 'error'
};
console.log(STATUS.OK); // "ok" 좜λ ₯λ©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ STATUS 객체의 ν”„λ‘œνΌν‹°λŠ” λ³€ν•˜μ§€ μ•ŠμœΌλ©°, μ „μ—­μ μœΌλ‘œ κ³ μœ ν•œ 값을 μ œκ³΅ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ•„ν†°κ³Ό μœ μ‚¬ν•˜κ²Œ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„ν†°μ˜ 주의점

아톰은 λΆˆλ³€ν•˜κ³  ν•œ 번 μƒμ„±λ˜λ©΄ μ‹œμŠ€ν…œ ν…Œμ΄λΈ”μ—μ„œ μ œκ±°λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, 아톰을 λ¬΄λΆ„λ³„ν•˜κ²Œ μƒμ„±ν•˜λŠ” 것은 쒋지 μ•ŠμŠ΅λ‹ˆλ‹€. μ‹œμŠ€ν…œ 내에 λ„ˆλ¬΄ λ§Žμ€ 아톰이 μ‘΄μž¬ν•˜λ©΄ λ©”λͺ¨λ¦¬λ₯Ό κ³Όλ„ν•˜κ²Œ μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. μ‹€μ œλ‘œ ElixirλŠ” μ•„ν†°μ˜ μˆ˜μ— ν•œκ³„λ₯Ό 두어, μ΄λŸ¬ν•œ 문제λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.

μ•„ν†° κ²°λ‘ 

아톰은 Elixir ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ€‘μš”ν•œ μš”μ†Œμž…λ‹ˆλ‹€. μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄κ±°λ‚˜, 쑰건을 λͺ…μ‹œν•  λ•Œ ꡉμž₯히 μœ μš©ν•˜κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ κ·Έ νŠΉμ„±μ„ μ΄ν•΄ν•˜κ³  μ μ ˆν•˜κ²Œ μ‚¬μš©ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

Elixirμ—μ„œμ˜ 아톰을 톡해 μš°λ¦¬λŠ” ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œμ˜ ν™•μ‹€ν•œ 의미λ₯Ό κ°–λŠ” μ‹λ³„μžλ₯Ό μ‚¬μš©ν•  수 있게 λ˜μ—ˆμœΌλ©°, μ΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ„ λ†’μ΄λŠ” 데 크게 κΈ°μ—¬ν•©λ‹ˆλ‹€.


νŠœν”Œ(Tuple)μ΄λž€?

Elixirμ—μ„œ νŠœν”Œμ€ κ³ μ •λœ 길이λ₯Ό 가진 μ—°μ†λœ 값을 λ‚˜νƒ€λ‚΄λŠ” 데이터 κ΅¬μ‘°μž…λ‹ˆλ‹€. κ°„λ‹¨νžˆ 말해, νŠœν”Œμ€ μ—¬λŸ¬ 값을 ν•˜λ‚˜μ˜ 묢음으둜 κ·Έλ£Ήν™”ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. νŠœν”Œμ€ {}둜 μ„ μ–Έλ˜λ©°, κ·Έ μ•ˆμ— λ‹€μ–‘ν•œ 데이터 νƒ€μž…μ˜ μš”μ†Œλ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.

νŠœν”Œμ˜ νŠΉμ§•

κ³ μ •λœ 크기: νŠœν”Œμ€ 생성될 λ•Œ μš”μ†Œμ˜ μˆ˜κ°€ 정해지며, μ΄ν›„μ—λŠ” 크기λ₯Ό λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
λΉ λ₯Έ μ ‘κ·Ό: νŠœν”Œμ˜ μš”μ†Œμ— μ ‘κ·Όν•˜λŠ” μ‹œκ°„μ€ μΌμ •ν•˜λ―€λ‘œ 데이터 접근이 맀우 λΉ λ¦…λ‹ˆλ‹€.
νŒ¨ν„΄ 맀칭: Elixir의 κ°•λ ₯ν•œ κΈ°λŠ₯ 쀑 ν•˜λ‚˜λ‘œ, νŠœν”Œμ˜ μš”μ†Œλ₯Ό μ‰½κ²Œ μΆ”μΆœν•˜κ³  ν• λ‹Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€.
νŠœν”Œμ˜ μ‚¬μš© μ˜ˆμ‹œ

# Elixirμ—μ„œ νŠœν”Œ 생성
person = {:name, "Alex", :age, 32}
# νŠœν”Œμ˜ μš”μ†Œμ— μ ‘κ·Ό
{name_atom, name, age_atom, age} = person

IO.puts("#{name_atom}은 #{name}, #{age_atom}λŠ” #{age}μ‚΄μž…λ‹ˆλ‹€.")
# 좜λ ₯: :name은 Alex, :ageλŠ” 32μ‚΄μž…λ‹ˆλ‹€.

μœ„ μ˜ˆμ‹œμ—μ„œλŠ” 이름과 λ‚˜μ΄λ₯Ό ν•˜λ‚˜μ˜ νŠœν”Œλ‘œ λ¬Άμ–΄ κ΄€λ¦¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. νŠœν”Œ λ‚΄ μš”μ†Œμ— μ ‘κ·Όν•˜λ €λ©΄ 각 μœ„μΉ˜μ— λ§žλŠ” λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ νŒ¨ν„΄ 맀칭을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

JavaScriptμ—μ„œμ˜ 비ꡐ λŒ€μƒ: λ°°μ—΄(Array)

JavaScriptμ—λŠ” νŠœν”Œκ³Ό λ™μΌν•œ 데이터 ꡬ쑰가 μ—†μ§€λ§Œ, κ°€μž₯ μœ μ‚¬ν•œ ν˜•νƒœλŠ” λ°°μ—΄μž…λ‹ˆλ‹€. 배열은 λ‹€μ–‘ν•œ 데이터 νƒ€μž…μ„ 포함할 수 있으며, λ™μ μœΌλ‘œ 크기가 λ³€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ°°μ—΄μ˜ νŠΉμ§•

동적 크기: 배열은 ν•„μš”μ— 따라 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
λ‹€μ–‘ν•œ λ©”μ†Œλ“œ: 배열을 닀루기 μœ„ν•œ λ‹€μ–‘ν•œ λ‚΄μž₯ λ©”μ†Œλ“œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
λ°°μ—΄μ˜ μ‚¬μš© μ˜ˆμ‹œ

let personArray = ["name", "Alex", "age", 32]; // JavaScriptμ—μ„œ λ°°μ—΄ 생성

let [nameLabel, nameValue, ageLabel, ageValue] = personArray; // λ°°μ—΄ ꡬ쑰 λΆ„ν•΄λ₯Ό ν†΅ν•œ μš”μ†Œ μ ‘κ·Ό

console.log(`${nameLabel} is ${nameValue}, ${ageLabel} is ${ageValue}`);
// 좜λ ₯: name is Alex, age is 32

JavaScript의 배열을 μ‚¬μš©ν•˜μ—¬ Elixir의 νŠœν”Œκ³Ό μœ μ‚¬ν•˜κ²Œ 데이터λ₯Ό κ·Έλ£Ήν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ꡬ쑰 λΆ„ν•΄ 할당을 톡해 λ°°μ—΄ λ‚΄ μš”μ†Œλ₯Ό μ‰½κ²Œ μΆ”μΆœν•  수 μžˆμ§€λ§Œ, Elixir의 νŒ¨ν„΄ 맀칭만큼 ν‘œν˜„λ ₯이 λ›°μ–΄λ‚˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

νŠœν”Œ κ²°λ‘ 

Elixir의 νŠœν”Œμ€ κ°„λ‹¨ν•˜κ³  효율적인 데이터 κ΅¬μ‘°λ‘œμ„œ, λΆˆλ³€μ„±μ„ μœ μ§€ν•˜λ©° μ—¬λŸ¬ 값을 ν•œλ²ˆμ— 닀루기에 μ ν•©ν•©λ‹ˆλ‹€. JavaScript의 λ°°μ—΄κ³Ό 비ꡐ해보면, νŠœν”Œμ€ 배열보닀 더 μ—„κ²©ν•œ ꡬ쑰λ₯Ό 가지고 있으며, νŒ¨ν„΄ 맀칭과 같은 κΈ°λŠ₯을 톡해 훨씬 κ°•λ ₯ν•œ 데이터 μ ‘κ·Όκ³Ό μ‘°μž‘μ΄ κ°€λŠ₯함을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

Elixirλ₯Ό μ‚¬μš©ν•˜λŠ” κ°œλ°œμžλ“€μ—κ²Œ νŠœν”Œμ€ κ°•λ ₯ν•œ λ„κ΅¬μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ νŠΉμ„±μ„ 잘 μ΄ν•΄ν•˜κ³  μ‚¬μš©ν•΄μ•Όλ§Œ μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.