List.Chars 프로토콜
List.Chars 프로토콜
List.Chars 프로토콜은 구조체를 charlist(문자 리스트)로 바꿔주는 역할을 해요. 문자열로의 변환(String.Chars)과 짝을 이루는, '문자 리스트로의 변환'을 담당하는 프로토콜이에요.
반드시 구현해야 하는 함수는 변환을 수행하는 to_charlist/1 하나뿐이에요. 뒤에서 다시 말하겠지만, Kernel이 자동으로 가져오는 to_charlist/1은 사실 이 프로토콜을 호출하는 형태로 동작해요.
출처: List.Chars
본문
List.Chars 프로토콜은 구조를 charlist로 변환하는 책임을 집니다. charlist는 정수(코드 포인트)로 이루어진 리스트, 예를 들어 ~c"hello"처럼 생긴 값을 말해요.
t
@type t() :: term()
이 프로토콜을 구현하는 모든 타입이에요.
to_charlist
@spec to_charlist(t()) :: charlist()
term을 charlist로 변환합니다.
Kernel이 자동으로 가져오는 to_charlist/1 함수가 바로 이 프로토콜을 호출하기 때문에, 여러분이 직접 이 프로토콜을 구현해 두면 to_charlist(value) 한 번으로 사용자 정의 구조체를 charlist로 바꿀 수 있어요. String.Chars와 달리 여기서는 결과가 charlist, 즉 정수 리스트로 나온다는 점만 기억하면 쉬워요.
구조체를 만들 때 defimpl List.Chars로 구현하거나, 이미 만들어 둔 구조체라면 이 프로토콜을 직접 구현해서 파일 경로나 네트워크 버퍼처럼 charlist 기반 API에서 바로 쓸 수 있게 만들 수 있어요.
to_charlist/1은 문자열을 다루는 to_string/1과 헷갈리기 쉬워요. 둘 다 Kernel이 가져오는 변환 함수지만, to_string/1은 String.Chars를, to_charlist/1은 List.Chars를 호출해서 각자 바이너리 문자열 또는 charlist를 돌려줘요. 어떤 API가 charlist를 요구하는지에 따라 골라 쓰면 돼요.
더 알아보기
String.Chars프로토콜: 구조를 바이너리 문자열로 변환하는 짝 프로토콜to_charlist/1:Kernel이 가져오는, 이 프로토콜을 호출하는 함수charlist타입: 정수로 이루어진 문자 리스트