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

자주 사용하는 타입 클래스

Show, Ordering, Numeric을 알아봅니다

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

이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.

Standard Type Classes

Scala's standard library ships several type classes you use daily, sometimes without realizing it:

  • Ordering[A] — how to compare values.
  • Numeric[A] — arithmetic over numbers.
  • Show-style rendering (custom, or Cats' Show).

Ordering Powers sorted

List.sorted needs an implicit Ordering[A]. The standard library provides instances for numbers, strings, and more.

@main def run(): Unit = {
  println(List(3, 1, 2).sorted)
  println(List("pear", "apple", "fig").sorted)
}

Custom Ordering

Pass an explicit Ordering to sort differently, for example descending or by a derived key.

@main def run(): Unit = {
  val nums = List(3, 1, 2)
  println(nums.sorted(Ordering.Int.reverse))
  val words = List("bbb", "a", "cc")
  println(words.sortBy(_.length))
}

Ordering for Case Classes

Provide an Ordering instance for your own type so collections of it can be sorted. Ordering.by derives one from a key.

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

object Main {
  implicit val byAge: Ordering[Person] = Ordering.by(_.age)

  def main(args: Array[String]): Unit = {
    val people = List(Person("A", 30), Person("B", 20))
    println(people.sorted)
  }
}

Numeric Abstracts Arithmetic

Numeric[A] lets you write functions that work over any number type. sum on a list relies on it.

@main def run(): Unit = {
  println(List(1, 2, 3).sum)
  println(List(1.5, 2.5).sum)
}

Writing Generic Numeric Code

With a context bound [A: Numeric] you can add or multiply any number type generically. Use the instance's operations via Numeric[A].

object Main {
  def addAll[A: Numeric](xs: List[A]): A = {
    val num = implicitly[Numeric[A]]
    xs.foldLeft(num.zero)(num.plus)
  }

  def main(args: Array[String]): Unit = {
    println(addAll(List(1, 2, 3)))
    println(addAll(List(1.0, 2.0, 3.5)))
  }
}

Numeric Operators

Importing the instance's Implicits gives you the usual operators (+, *) on generic numeric types, making code read naturally.

object Main {
  def square[A](a: A)(implicit num: Numeric[A]): A = {
    import num._
    a * a
  }

  def main(args: Array[String]): Unit = {
    println(square(5))
    println(square(2.5))
  }
}

A Show Type Class

Show renders values as text in a type-safe way (unlike toString, which exists on everything). Cats provides it; here is a minimal version.

trait Show[A] { def show(a: A): String }

object Show {
  implicit val intShow: Show[Int] = n => s"Int($n)"
  def apply[A](implicit s: Show[A]): Show[A] = s
}

object Main {
  def main(args: Array[String]): Unit = {
    println(Show[Int].show(42))
  }
}

Ordering and max/min

Methods like max, min, and maxBy on collections all use Ordering under the hood.

@main def run(): Unit = {
  val xs = List(4, 9, 1, 7)
  println(xs.max)
  println(xs.min)
  println(List("a", "abc", "ab").maxBy(_.length))
}

Combining Orderings

You can build composite orderings with Ordering.by on a tuple, sorting by one field then another.

case class Rec(group: String, score: Int)

object Main {
  implicit val ord: Ordering[Rec] = Ordering.by(r => (r.group, -r.score))

  def main(args: Array[String]): Unit = {
    val data = List(Rec("b", 5), Rec("a", 1), Rec("a", 9))
    data.sorted.foreach(println)
  }
}

Why Type Classes Here

Because comparison and arithmetic are type classes, the same sorted or sum works for built-in types and your own, simply by supplying an instance. This is the standard library using ad-hoc polymorphism.

Quick Check

Test your knowledge of standard type classes.

Recap

You met common standard type classes:

  • Ordering[A] drives sorted, max, min; build with Ordering.by.
  • Numeric[A] enables generic arithmetic and powers sum.
  • Show-style classes render values type-safely.

자주 묻는 질문

“자주 사용하는 타입 클래스” 강의는 무료인가요?

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

“자주 사용하는 타입 클래스”에서 뭘 배우나요?

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

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

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

“자주 사용하는 타입 클래스” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. 타입 클래스 패턴
  2. 인스턴스 정의
  3. 자주 사용하는 타입 클래스
  4. 타입 클래스 파생
← Scala for Backend Engineering & Functional Programming(으)로 돌아가기