0Pricing
Scala for Backend Engineering & Functional Programming · 강의

스마트 생성자

검증된 생성

스마트 생성자은(는) CoddyKit의 무료 Scala for Backend Engineering & Functional Programming 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Scala for Backend Engineering & Functional Programming 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.

유효성이 검증된 생성

스마트 생성자는 값을 만들기 전에 입력을 검증하는 팩토리입니다. 보유한 모든 인스턴스가 해당 타입의 불변 조건을 만족하도록 보장합니다.

  • 원시 생성자는 숨깁니다.
  • 검증된 생성만 공개합니다.
class Age private (val value: Int)
object Age:
  def of(v: Int): Option[Age] =
    if v >= 0 then Some(new Age(v)) else None

object Main:
  def main(args: Array[String]): Unit =
    println(Age.of(30).map(_.value))

비공개 생성자

기본 생성자를 private로 지정하면 호출자가 검증을 우회할 수 없습니다. 컴패니언 객체가 단일 진입점이 됩니다.

class Percentage private (val value: Int)
object Percentage:
  def of(v: Int): Option[Percentage] =
    if v >= 0 && v <= 100 then Some(new Percentage(v)) else None

object Main:
  def main(args: Array[String]): Unit =
    println(Percentage.of(50).map(_.value))
    println(Percentage.of(150))

Option 반환

Option을 반환하면 생성이 실패할 수 있음을 나타냅니다. 호출자는 None을 처리해야 하므로 잘못된 데이터가 조용히 전달되지 않습니다.

class NonEmpty private (val value: String)
object NonEmpty:
  def of(s: String): Option[NonEmpty] =
    if s.nonEmpty then Some(new NonEmpty(s)) else None

object Main:
  def main(args: Array[String]): Unit =
    println(NonEmpty.of("").map(_.value))
    println(NonEmpty.of("hi").map(_.value))

오류 세부 정보를 위한 Either 반환

검증이 실패한 이유를 설명하려면 Either[Error, T]를 반환합니다. Left에 설명 메시지를 담습니다.

class Username private (val value: String)
object Username:
  def of(s: String): Either[String, Username] =
    if s.isEmpty then Left("empty")
    else if s.length > 10 then Left("too long")
    else Right(new Username(s))

object Main:
  def main(args: Array[String]): Unit =
    println(Username.of(""))
    println(Username.of("ada").map(_.value))

case class를 사용한 스마트 생성자

case class도 비공개 생성자와 함께 사용할 수 있습니다. 자동 생성되는 apply와 copy도 제어해야 하므로 사용자 정의 팩토리를 정의하고 생성자를 비공개로 유지해야 합니다.

case class Email private (value: String)
object Email:
  def of(s: String): Option[Email] =
    if s.contains("@") then Some(Email(s)) else None

object Main:
  def main(args: Array[String]): Unit =
    println(Email.of("a@b.com"))
    println(Email.of("bad"))

검증된 값 연결

스마트 생성자는 Option이나 Either를 반환하므로 for 컴프리헨션으로 조합해 더 큰 검증된 객체를 만들 수 있습니다.

case class Name private (value: String)
object Name:
  def of(s: String): Option[Name] =
    if s.nonEmpty then Some(Name(s)) else None

case class Person(name: Name, age: Int)

object Main:
  def make(n: String): Option[Person] =
    for nm <- Name.of(n) yield Person(nm, 20)

  def main(args: Array[String]): Unit =
    println(Main.make("Bob"))

입력 정규화

스마트 생성자는 데이터를 정규화할 수도 있습니다. 예를 들어 공백을 제거하거나 소문자로 바꾸어 모든 인스턴스가 표준 형식을 공유하게 할 수 있습니다.

case class Tag private (value: String)
object Tag:
  def of(s: String): Option[Tag] =
    val clean = s.trim.toLowerCase
    if clean.nonEmpty then Some(Tag(clean)) else None

object Main:
  def main(args: Array[String]): Unit =
    println(Tag.of("  Scala  "))

불변 조건은 영원히 유지됨

값이 스마트 생성자를 통과하면 전체 수명 동안 불변 조건이 보장됩니다. 이후의 코드는 다시 확인하지 않아도 해당 값을 신뢰할 수 있습니다.

case class PositiveInt private (value: Int)
object PositiveInt:
  def of(n: Int): Option[PositiveInt] =
    if n > 0 then Some(PositiveInt(n)) else None

object Main:
  def doubleIt(p: PositiveInt): Int = p.value * 2 // always positive

  def main(args: Array[String]): Unit =
    PositiveInt.of(5).foreach(p => println(Main.doubleIt(p)))

불투명 타입과 결합

비용 없이 검증된 값을 만들려면 스마트 생성자를 불투명 타입과 함께 사용합니다. 래퍼 객체를 할당하지 않으면서도 검증을 통해 생성을 제어할 수 있습니다.

object Domain:
  opaque type Score = Int
  def of(n: Int): Option[Score] =
    if n >= 0 && n <= 100 then Some(n) else None
  extension (s: Score) def value: Int = s

object Main:
  def main(args: Array[String]): Unit =
    println(Domain.of(88).map(_.value))

여러 검증 규칙

여러 검사를 순서대로 적용합니다. 처음 실패한 규칙에서 중단하고 명확한 오류를 반환합니다.

object Password:
  def of(s: String): Either[String, String] =
    if s.length < 8 then Left("too short")
    else if !s.exists(_.isDigit) then Left("need a digit")
    else Right(s)

object Main:
  def main(args: Array[String]): Unit =
    println(Password.of("abc"))
    println(Password.of("abcdef12"))

스마트 생성자를 사용하는 경우

원시 생성자가 위반할 수 있는 불변 조건을 타입이 가질 때마다 스마트 생성자를 사용합니다.

  • 범위가 제한된 숫자, 비어 있지 않은 문자열, 형식이 지정된 식별자에 사용합니다.
  • 간단한 참·거짓 결과에는 Option을, 이유가 필요한 경우에는 Either를 반환합니다.
  • 원시 생성자를 비공개로 유지합니다.
case class Port private (value: Int)
object Port:
  def of(n: Int): Option[Port] =
    if n >= 1 && n <= 65535 then Some(Port(n)) else None

object Main:
  def main(args: Array[String]): Unit =
    println(Port.of(8080))
    println(Port.of(70000))

빠른 확인

스마트 생성자에 대한 이해도를 확인해 보세요.

복습

스마트 생성자를 배웠습니다.

  • 컴패니언 팩토리에서 입력을 검증합니다.
  • 원시 생성자를 비공개로 만듭니다.
  • 실패 처리를 강제하려면 Option이나 Either를 반환합니다.
  • 선택적으로 입력을 표준 형식으로 정규화합니다.
  • 그러면 값의 전체 수명 동안 불변 조건이 유지됩니다.
case class Even private (value: Int)
object Even:
  def of(n: Int): Option[Even] =
    if n % 2 == 0 then Some(Even(n)) else None

object Main:
  def main(args: Array[String]): Unit =
    println(Even.of(4))
    println(Even.of(5))

자주 묻는 질문

“스마트 생성자” 강의는 무료인가요?

네 — “스마트 생성자” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Scala for Backend Engineering & Functional Programming 강의 전체를 잠금 해제할 수 있습니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.

“스마트 생성자”에서 뭘 배우나요?

검증된 생성 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Scala for Backend Engineering & Functional Programming을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Scala for Backend Engineering & Functional Programming은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“스마트 생성자” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Scala for Backend Engineering & Functional Programming 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Scala for Backend Engineering & Functional Programming 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. ADT로 모델링하기
  2. 스마트 생성자
  3. 새 타입
  4. 도메인 조합하기
← Scala for Backend Engineering & Functional Programming(으)로 돌아가기