트랙
/
Elm
Elm
/
학습 과정
/
불투명 타입
불투

불투명 타입 에서 Elm

2개의 연습 문제

불투명 타입 소개

소개

불투명 타입은 Elm에서의 캡슐화 기법이에요. 이걸 정보 은닉, 또는 구현 세부 사항 숨기기라고 부르기도 해요. Parse, dont validate 패턴을 사용해 검증을 강제할 때도 흔히 쓰여요. 예를 들어, 유효한 이메일 주소만 담을 수 있는 EmailAddress 불투명 타입을 만들 수 있어요. 무엇이든 담을 수 있는 String과는 달라요.

불투명 타입 만들기

커스텀 타입에는 하나 이상의 변형이 있고, 컴파일러는 변형 이름을 사용해 각 변형을 만드는 함수를 자동으로 생성해요. 커스텀 타입은 이 방법으로만 만들 수 있어요. 컴파일러는 이런 변형에 대한 구조 분해도 허용해요.

type Maybe a
    = Nothing --> Variant implies a 'Nothing' function, with type 'Maybe a', and destructuring of 'Nothing'
    | Just a  --> Variant implies a 'Just' function, with type 'a -> Maybe a', and destructuring of 'Just _'

기본적으로 이 모든 것은 파일, 즉 모듈 내부에만 있고, exposing 키워드로 무엇을 노출할지 선택해요. Maybe 모듈은 Maybe 타입을 노출해서 다른 모듈이 이미 있는 Maybe 값을 사용할 수 있게 하고, Nothing과 Just 변형도 노출해서 다른 모듈이 Maybe 값을 만들고 구조 분해할 수 있게 해요. 이때 다음과 같은 문법을 사용해요. Maybe(..) 부분은 커스텀 타입 정의와 함께 모든 변형을 노출하라고 Elm에 알려줘요.

module Maybe exposing
  ( Maybe(..)
  -- ...
  )

불투명 타입을 만들려면 변형을 노출하지 않기로 선택하기만 하면 돼요. Maybe 타입에 이렇게 하려면 다음 문법을 사용해요.

module Maybe exposing
  ( Maybe
  -- ...
  )

이렇게 할 때는 거의 항상 커스텀 함수를 노출해서 변형을 만들고 꺼내는 다른 방법을 함께 제공해야 해요. 이 커스텀 함수들을 사용하면 변형을 만들고 꺼낼 때 몇 가지 로직을 적용할 수 있어요. 이렇게 하면 모듈의 내부 구현 세부 사항이 숨겨지고, 노출된 함수가 그대로인 한 구현 세부 사항을 얼마든지 바꿀 수 있어요. 타입을 만들고 사용할 때 불변식을 지킬 수도 있어요.

Parse, don't validate

아마도 불투명 타입의 가장 흔한 쓰임새는 Parse, dont validate 패턴을 사용해 검증을 강제하는 거예요. 이 패턴에서는 원하는 것보다 구조나 타입 안전성이 덜한 입력, 예를 들어 String을 받아서 EmailAddress처럼 더 구조화된 타입으로 파싱해요. 그런 다음 타입을 반환하거나 오류(보통 Maybe나 Result)를 반환해요.

예를 들어, 아래 코드에서는 외부 모듈이 parseEmailAddress 함수를 통해서만 EmailAddress 타입을 만들 수 있어요. 그래서 EmailAddress 타입을 다룰 때는 그 값이 유효하다고 확신할 수 있어요.

module EmailAddress exposing ( EmailAddress, parseEmailAddress, getEmailAddress )

-- The `EmailAddress` custom type has one variant, also called `EmailAddress`
-- When a custom type has one variant, it is idiomatic to use the same name for both.
type EmailAddress = 
  EmailAddress String

-- create an EmailAddress variant
parseEmailAddress: String -> Maybe EmailAddress
parseEmailAddress candidateEmailAddress =   
  if isValidEmailAddress candidateEmailAddress then
    Just (EmailAddress candidateEmailAddress)
  else
    Nothing

-- get an EmailAddress variant
getEmailAddress: EmailAddress -> String
getEmailAddress ( EmailAddress  emailAdress ) =
  emailAdress

isValidEmailAddress: String -> bool
-- ... 
GitHub에서 편집 링크가 새 창이나 탭에서 열려요

불투명 타입 배우기

연습이 잠겨 있어요

불투명 타입 개념을 연습하려면 연습 문제 1개를 더 잠금 해제해요